From 8face3e309ce42ed7528c766dbbc05bfad003917 Mon Sep 17 00:00:00 2001 From: pvvx Date: Sat, 18 Mar 2017 15:52:14 +0300 Subject: [PATCH] update --- .../common/api/network/include/util.h | 1 + .../common/api/platform/platform_stdlib.h | 128 +- .../component/common/api/wifi/wifi_conf.h | 6 +- RTL00_SDKV35a/component/common/api/wifi_api.c | 75 +- .../wlan/realtek/include/HalPwrSeqCmd.h | 136 + .../drivers/wlan/realtek/include/HalVerDef.h | 178 + .../drivers/wlan/realtek/include/autoconf.h | 75 +- .../wlan/realtek/include/byteorder/generic.h | 223 + .../realtek/include/byteorder/little_endian.h | 97 + .../wlan/realtek/include/byteorder/swab.h | 145 + .../drivers/wlan/realtek/include/drv_types.h | 863 ++++ .../drivers/wlan/realtek/include/ethernet.h | 42 + .../drivers/wlan/realtek/include/hal_com.h | 287 ++ .../wlan/realtek/include/hal_com_phycfg.h | 288 ++ .../wlan/realtek/include/hal_com_reg.h | 1152 +++-- .../drivers/wlan/realtek/include/hal_intf.h | 666 +++ .../drivers/wlan/realtek/include/hal_pg.h | 81 + .../drivers/wlan/realtek/include/hal_phy.h | 99 + .../wlan/realtek/include/hal_phy_reg.h | 31 + .../drivers/wlan/realtek/include/ieee80211.h | 1527 ++++++ .../drivers/wlan/realtek/include/if_ether.h | 115 + .../common/drivers/wlan/realtek/include/ip.h | 142 + .../drivers/wlan/realtek/include/lxbus_hal.h | 24 + .../drivers/wlan/realtek/include/lxbus_ops.h | 80 + .../wlan/realtek/include/lxbus_osintf.h | 29 + .../drivers/wlan/realtek/include/pack_begin.h | 33 + .../drivers/wlan/realtek/include/pack_end.h | 33 + .../drivers/wlan/realtek/include/rom_aes.h | 19 +- .../drivers/wlan/realtek/include/rom_arc4.h | 39 + .../wlan/realtek/include/rom_ieee80211.h | 127 + .../drivers/wlan/realtek/include/rom_md5.h | 45 + .../drivers/wlan/realtek/include/rom_rc4.h | 89 + .../wlan/realtek/include/rom_rtw_message.h | 48 + .../wlan/realtek/include/rom_rtw_message_e.h | 174 + .../wlan/realtek/include/rom_rtw_psk.h | 44 + .../wlan/realtek/include/rom_rtw_security.h | 104 + .../drivers/wlan/realtek/include/rom_sha1.h | 71 + .../wlan/realtek/include/rtl8195a_hal.h | 618 +++ .../wlan/realtek/include/rtl8711b_hal.h | 595 +++ .../drivers/wlan/realtek/include/rtw_ap.h | 65 + .../wlan/realtek/include/rtw_byteorder.h | 53 + .../drivers/wlan/realtek/include/rtw_cmd.h | 1184 +++++ .../drivers/wlan/realtek/include/rtw_debug.h | 54 +- .../drivers/wlan/realtek/include/rtw_eeprom.h | 158 + .../drivers/wlan/realtek/include/rtw_efuse.h | 163 + .../drivers/wlan/realtek/include/rtw_event.h | 151 + .../drivers/wlan/realtek/include/rtw_ht.h | 66 + .../drivers/wlan/realtek/include/rtw_intfs.h | 39 + .../drivers/wlan/realtek/include/rtw_io.h | 140 + .../wlan/realtek/include/rtw_ioctl_set.h | 75 + .../drivers/wlan/realtek/include/rtw_led.h | 250 + .../drivers/wlan/realtek/include/rtw_mlme.h | 795 +++ .../wlan/realtek/include/rtw_mlme_ext.h | 1014 ++++ .../drivers/wlan/realtek/include/rtw_mp.h | 722 +++ .../drivers/wlan/realtek/include/rtw_p2p.h | 58 + .../wlan/realtek/include/rtw_promisc.h | 38 + .../drivers/wlan/realtek/include/rtw_psk.h | 341 ++ .../wlan/realtek/include/rtw_pwrctrl.h | 386 ++ .../drivers/wlan/realtek/include/rtw_qos.h | 33 + .../drivers/wlan/realtek/include/rtw_recv.h | 918 ++++ .../drivers/wlan/realtek/include/rtw_rf.h | 175 + .../wlan/realtek/include/rtw_security.h | 446 ++ .../drivers/wlan/realtek/include/rtw_xmit.h | 839 +++ .../drivers/wlan/realtek/include/sta_info.h | 400 ++ .../drivers/wlan/realtek/include/wifi.h | 1369 +++++ .../wlan/realtek/include/wifi_constants.h | 102 +- .../wlan/realtek/include/wifi_structures.h | 106 +- .../wlan/realtek/include/wlan_basic_types.h | 610 +++ .../wlan/realtek/include/wlan_bssdef.h | 756 +++ .../drivers/wlan/realtek/include/wlan_lib.h | 2 +- .../wlan/realtek/src/hal/OUTSRC/HalPhyRf.h | 102 + .../realtek/src/hal/OUTSRC/PhyDM_Adaptivity.h | 162 + .../wlan/realtek/src/hal/OUTSRC/mp_precomp.h | 24 + .../wlan/realtek/src/hal/OUTSRC/phydm.h | 2088 ++++++++ .../wlan/realtek/src/hal/OUTSRC/phydm_ACS.h | 97 + .../realtek/src/hal/OUTSRC/phydm_AntDect.h | 76 + .../realtek/src/hal/OUTSRC/phydm_AntDiv.h | 144 + .../src/hal/OUTSRC/phydm_CfoTracking.h | 73 + .../wlan/realtek/src/hal/OUTSRC/phydm_DIG.h | 476 ++ .../hal/OUTSRC/phydm_DynamicBBPowerSaving.h | 63 + .../src/hal/OUTSRC/phydm_DynamicTxPower.h | 89 + .../src/hal/OUTSRC/phydm_EdcaTurboCheck.h | 152 + .../realtek/src/hal/OUTSRC/phydm_HWConfig.h | 508 ++ .../src/hal/OUTSRC/phydm_NoiseMonitor.h | 49 + .../realtek/src/hal/OUTSRC/phydm_PathDiv.h | 193 + .../src/hal/OUTSRC/phydm_PowerTracking.h | 306 ++ .../wlan/realtek/src/hal/OUTSRC/phydm_RXHP.h | 105 + .../realtek/src/hal/OUTSRC/phydm_RaInfo.h | 210 + .../src/hal/OUTSRC/phydm_RegDefine11AC.h | 81 + .../src/hal/OUTSRC/phydm_RegDefine11N.h | 186 + .../wlan/realtek/src/hal/OUTSRC/phydm_debug.h | 900 ++++ .../realtek/src/hal/OUTSRC/phydm_interface.h | 413 ++ .../realtek/src/hal/OUTSRC/phydm_precomp.h | 349 ++ .../wlan/realtek/src/hal/OUTSRC/phydm_reg.h | 208 + .../wlan/realtek/src/hal/OUTSRC/phydm_types.h | 442 ++ .../src/hal/OUTSRC/rom_odm_interface.h | 59 + .../OUTSRC/rtl8195a/Hal8195ARateAdaptive.h | 289 ++ .../src/hal/OUTSRC/rtl8195a/Hal8195AReg.h | 1371 +++++ .../src/hal/OUTSRC/rtl8195a/HalPhyRf_8195A.h | 127 + .../hal/OUTSRC/rtl8195a/ROM_RTL8195A_PHYDM.h | 128 + .../hal/OUTSRC/rtl8195a/halhwimg8195a_bb.h | 59 + .../hal/OUTSRC/rtl8195a/halhwimg8195a_mac.h | 39 + .../hal/OUTSRC/rtl8195a/halhwimg8195a_rf.h | 104 + .../src/hal/OUTSRC/rtl8195a/phydm_RTL8195A.h | 69 + .../OUTSRC/rtl8195a/phydm_RegConfig8195A.h | 89 + .../drivers/wlan/realtek/src/hal/hal_data.h | 498 ++ .../realtek/src/hal/rtl8195a/Hal8192CPhyReg.h | 1125 ++++ .../realtek/src/hal/rtl8195a/Hal8195APhyCfg.h | 186 + .../realtek/src/hal/rtl8195a/Hal8195APhyReg.h | 272 + .../realtek/src/hal/rtl8195a/Hal8195APwrSeq.h | 397 ++ .../src/hal/rtl8195a/rom_Hal8195APhyCfg.h | 56 + .../realtek/src/hal/rtl8195a/rtl8195a_cmd.h | 337 ++ .../realtek/src/hal/rtl8195a/rtl8195a_dm.h | 81 + .../realtek/src/hal/rtl8195a/rtl8195a_led.h | 35 + .../src/hal/rtl8195a/rtl8195a_pmu_cmd.h | 130 + .../src/hal/rtl8195a/rtl8195a_pmu_task.h | 491 ++ .../realtek/src/hal/rtl8195a/rtl8195a_recv.h | 232 + .../realtek/src/hal/rtl8195a/rtl8195a_rf.h | 32 + .../realtek/src/hal/rtl8195a/rtl8195a_spec.h | 345 ++ .../src/hal/rtl8195a/rtl8195a_sreset.h | 30 + .../realtek/src/hal/rtl8195a/rtl8195a_xmit.h | 473 ++ .../wlan/realtek/src/hci/gspi/gspi_intf.c | 493 ++ .../wlan/realtek/src/hci/gspi/gspi_io.c | 566 ++ .../wlan/realtek/src/hci/gspi/gspi_isr.c | 236 + .../wlan/realtek/src/hci/gspi/gspi_spec.h | 257 + .../drivers/wlan/realtek/src/hci/hci_intfs.h | 68 + .../drivers/wlan/realtek/src/hci/hci_spec.h | 433 ++ .../wlan/realtek/src/hci/lxbus/lxbus_spec.h | 55 + .../wlan/realtek/src/hci/sdio/sdio_drvio.c | 818 +++ .../wlan/realtek/src/hci/sdio/sdio_intf.c | 264 + .../wlan/realtek/src/hci/sdio/sdio_isr.c | 223 + .../wlan/realtek/src/hci/sdio/sdio_spec.h | 193 + .../src/osdep/freertos/freertos_intfs.h | 161 + .../src/osdep/freertos/freertos_recv.h | 55 + .../src/osdep/freertos/freertos_skbuff.h | 72 + .../src/osdep/freertos/freertos_xmit.h | 62 + .../wlan/realtek/src/osdep/freertos/wrapper.h | 68 +- .../wlan/realtek/src/osdep/lwip_intf.c | 164 +- .../wlan/realtek/src/osdep/lwip_intf.h | 37 +- .../drivers/wlan/realtek/src/osdep/netdev.h | 113 + .../wlan/realtek/src/osdep/osdep_intf.h | 116 + .../drivers/wlan/realtek/src/osdep/skbuff.h | 19 +- .../drivers/wlan/realtek/src/osdep/wireless.h | 154 +- .../wlan/realtek/src/osdep/wlan_intf.h | 22 +- RTL00_SDKV35a/component/os/rtx/rtx_service.c | 1109 ++++ RTL00_SDKV35a/component/os/rtx/rtx_service.h | 309 ++ .../8195a/misc/rtl_std_lib/include/rtl_lib.h | 5 +- .../misc/rtl_std_lib/include/rtl_rr_libc.h | 166 + .../misc/rtl_std_lib/lib_rtlstd/c_stdio.c | 1093 ++++ .../misc/rtl_std_lib/lib_rtlstd/ram_libc.c | 57 +- .../rtl_std_lib/lib_rtlstd/ram_pvvx_libc.c | 280 +- build/bin/ota.bin | Bin 297904 -> 297972 bytes build/bin/ram_2.bin | Bin 297868 -> 297936 bytes build/bin/ram_2.ns.bin | Bin 297884 -> 297952 bytes build/bin/ram_2.p.bin | Bin 297884 -> 297952 bytes build/bin/ram_all.bin | Bin 342956 -> 343024 bytes build/obj/build.nmap | 4564 ++++++++--------- sdkset.mk | 35 +- 158 files changed, 43738 insertions(+), 3116 deletions(-) create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/HalPwrSeqCmd.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/HalVerDef.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/generic.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/little_endian.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/swab.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/drv_types.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ethernet.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com_phycfg.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_intf.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_pg.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_phy.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_phy_reg.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ieee80211.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/if_ether.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ip.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_hal.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_ops.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_osintf.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/pack_begin.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/pack_end.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_arc4.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_ieee80211.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_md5.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rc4.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_message.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_message_e.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_psk.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_security.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_sha1.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtl8195a_hal.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtl8711b_hal.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ap.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_byteorder.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_cmd.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_eeprom.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_efuse.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_event.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ht.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_intfs.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_io.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ioctl_set.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_led.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mlme.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mlme_ext.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mp.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_p2p.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_promisc.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_psk.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_pwrctrl.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_qos.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_recv.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_rf.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_security.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_xmit.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/sta_info.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_basic_types.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_bssdef.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/HalPhyRf.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/PhyDM_Adaptivity.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/mp_precomp.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_ACS.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_AntDect.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_AntDiv.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_CfoTracking.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DIG.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DynamicBBPowerSaving.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DynamicTxPower.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_EdcaTurboCheck.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_HWConfig.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_NoiseMonitor.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_PathDiv.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_PowerTracking.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RXHP.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RaInfo.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RegDefine11AC.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RegDefine11N.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_debug.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_interface.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_precomp.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_reg.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_types.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rom_odm_interface.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/Hal8195ARateAdaptive.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/Hal8195AReg.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/HalPhyRf_8195A.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/ROM_RTL8195A_PHYDM.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_bb.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_mac.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_rf.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/phydm_RTL8195A.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/phydm_RegConfig8195A.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/hal_data.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8192CPhyReg.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APhyCfg.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APhyReg.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APwrSeq.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rom_Hal8195APhyCfg.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_cmd.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_dm.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_led.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_pmu_cmd.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_pmu_task.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_recv.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_rf.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_spec.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_sreset.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_xmit.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_intf.c create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_io.c create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_isr.c create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_spec.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/hci_intfs.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/hci_spec.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/lxbus/lxbus_spec.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_drvio.c create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_intf.c create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_isr.c create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_spec.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_intfs.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_recv.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_skbuff.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_xmit.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/netdev.h create mode 100644 RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/osdep_intf.h create mode 100644 RTL00_SDKV35a/component/os/rtx/rtx_service.c create mode 100644 RTL00_SDKV35a/component/os/rtx/rtx_service.h create mode 100644 RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/include/rtl_rr_libc.h create mode 100644 RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/c_stdio.c diff --git a/RTL00_SDKV35a/component/common/api/network/include/util.h b/RTL00_SDKV35a/component/common/api/network/include/util.h index 1572c8f..377c9c8 100644 --- a/RTL00_SDKV35a/component/common/api/network/include/util.h +++ b/RTL00_SDKV35a/component/common/api/network/include/util.h @@ -15,6 +15,7 @@ typedef enum _WIFI_EVENT_INDICATE{ WIFI_EVENT_DISCONNECT = 1, WIFI_EVENT_FOURWAY_HANDSHAKE_DONE = 2, }WIFI_EVENT_INDICATE; +rtw_event_indicate_t int wext_get_ssid(const char *ifname, __u8 *ssid); int wext_set_ssid(const char *ifname, const __u8 *ssid, __u16 ssid_len); diff --git a/RTL00_SDKV35a/component/common/api/platform/platform_stdlib.h b/RTL00_SDKV35a/component/common/api/platform/platform_stdlib.h index fe3123e..364ccab 100644 --- a/RTL00_SDKV35a/component/common/api/platform/platform_stdlib.h +++ b/RTL00_SDKV35a/component/common/api/platform/platform_stdlib.h @@ -1,17 +1,38 @@ /****************************************************************************** + * Copyright (c) 2013-2016 Realtek Semiconductor Corp. * - * Copyright(c) 2007 - 2014 Realtek Corporation. All rights reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * + * http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. ******************************************************************************/ #ifndef __PLATFORM_STDLIB_H__ #define __PLATFORM_STDLIB_H__ #define USE_CLIB_PATCH 0 #if defined (__GNUC__) +/* build rom should set USE_RTL_ROM_CLIB=0 */ +#ifndef CONFIG_MBED_ENABLED +#include +#endif +#endif + +#ifdef CONFIG_BUILD_ROM +#define USE_RTL_ROM_CLIB 0 +#else +#define BUFFERED_PRINTF 0 +#ifndef CONFIG_MBED_ENABLED #define USE_RTL_ROM_CLIB 1 #else -#define USE_RTL_ROM_CLIB 1 +#define USE_RTL_ROM_CLIB 0 +#endif #endif #if defined(CONFIG_PLATFORM_8195A) @@ -59,7 +80,12 @@ #endif #if USE_RTL_ROM_CLIB +#if BUFFERED_PRINTF + extern int buffered_printf(const char* fmt, ...); + #define printf buffered_printf +#else #define printf rtl_printf +#endif #define sprintf rtl_sprintf #define snprintf rtl_snprintf #define memchr rtl_memchr @@ -67,7 +93,6 @@ #define memcpy rtl_memcpy #define memmove rtl_memmove #define memset rtl_memset - #define bzero(s,l) rtl_memset(s,0,l) #define strcat rtl_strcat #define strchr rtl_strchr #define strcmp(s1, s2) rtl_strcmp((const char *)s1, (const char *)s2) @@ -85,12 +110,12 @@ extern char* DiagStrtokPatch(char *str, const char* delim); extern char* DiagStrstrPatch(char *string, char *substring); extern int DiagSnPrintfPatch(char *buf, size_t size, const char *fmt, ...); - extern int DiagPrintfPatch(const char *fmt, ...); - extern int DiagSPrintfPatch(u8 *buf, const char *fmt, ...); + extern u32 DiagPrintfPatch(const char *fmt, ...); + extern u32 DiagSPrintfPatch(u8 *buf, const char *fmt, ...); #define printf DiagPrintfPatch #define sprintf DiagSPrintfPatch #define snprintf DiagSnPrintfPatch - #define strstr(a, b) DiagStrstrPatch((char *)(a), (char *)(b)) + #define strstr(a, b) DiagStrstrPatch((char *)(a), (char *)(b)) #define strtok DiagStrtokPatch #else #define printf DiagPrintf @@ -125,25 +150,27 @@ //extern int DiagSscanfPatch(const char *buf, const char *fmt, ...); //#define sscanf DiagSscanfPatch #define sscanf sscanf // use libc sscanf - #endif + #endif #endif #endif // defined (__IARSTDLIB__) // // memory management // +#ifndef CONFIG_MBED_ENABLED extern void *pvPortMalloc( size_t xWantedSize ); extern void vPortFree( void *pv ); -#undef malloc #define malloc pvPortMalloc -#undef free #define free vPortFree +#endif #elif defined (CONFIG_PLATFORM_8711B) + #if defined (__IARSTDLIB__) #include #include #include #include + #include /* va_list */ #include "diag.h" #define strsep(str, delim) _strsep(str, delim) @@ -151,18 +178,24 @@ extern void vPortFree( void *pv ); #include #include #include + #include /* va_list */ #include "diag.h" #include "strproc.h" + #include "memproc.h" #include "basic_types.h" - #include "hal_misc.h" +#if USE_RTL_ROM_CLIB + #include "rtl_lib.h" + #include "rom_libc_string.h" +#endif #undef printf #undef sprintf #undef snprintf - #undef atoi + #undef memchr #undef memcmp #undef memcpy #undef memset + #undef memmove #undef strcmp #undef strcpy #undef strlen @@ -170,63 +203,61 @@ extern void vPortFree( void *pv ); #undef strncpy #undef strsep #undef strtok - -#if USE_RTL_ROM_CLIB - #undef memchr - #undef memmove #undef strcat #undef strchr #undef strncat #undef strstr + #undef atol + #undef atoi + #undef strpbrk - #define printf rtl_printf - #define sprintf rtl_sprintf - #define snprintf rtl_snprintf - #define memchr rtl_memchr - #define memcmp rtl_memcmp - #define memcpy rtl_memcpy - #define memmove rtl_memmove - #define memset rtl_memset - #define strcat rtl_strcat - #define strchr rtl_strchr - #define strcmp(s1, s2) rtl_strcmp((const char *)s1, (const char *)s2) - #define strcpy rtl_strcpy - #define strlen(str) rtl_strlen((const char *)str) - #define strncat rtl_strncat - #define strncmp(s1, s2, n) rtl_strncmp((const char *)s1, (const char *)s2, n) - #define strncpy rtl_strncpy - #define strstr rtl_strstr - #define strsep rtl_strsep - #define strtok rtl_strtok +#if USE_RTL_ROM_CLIB +#if BUFFERED_PRINTF + extern int buffered_printf(const char* fmt, ...); + #define printf buffered_printf #else - #define printf DiagPrintf - #define sprintf(fmt, arg...) DiagSPrintf((u8*)fmt, ##arg) -#if defined (__GNUC__) - #define snprintf DiagSnPrintf // NULL function - #define strstr(str1, str2) prvStrStr(str1, str2) // NULL function + #define printf rtl_printf #endif - #define strtok(str, delim) _strsep(str, delim) - + #define sprintf rtl_sprintf + #define snprintf rtl_snprintf + #define vsnprintf rtl_vsnprintf +#else + #define printf DiagPrintf + #define sprintf(fmt, arg...) DiagSPrintf((u8*)fmt, ##arg) + #define snprintf DiagSnPrintf // NULL function + #define vsnprintf(buf, size, fmt, ap) VSprintf(buf, fmt, ap) +#endif + #define memchr __rtl_memchr_v1_00 #define memcmp(dst, src, sz) _memcmp(dst, src, sz) #define memcpy(dst, src, sz) _memcpy(dst, src, sz) + #define memmove __rtl_memmove_v1_00 #define memset(dst, val, sz) _memset(dst, val, sz) + #define strchr(s, c) _strchr(s, c) // for B-cut ROM #define strcmp(str1, str2) prvStrCmp((const unsigned char *) str1, (const unsigned char *) str2) #define strcpy(dest, src) _strcpy(dest, src) - #define strlen(str) prvStrLen((const unsigned char *) str) + #define strlen(str) prvStrLen((const unsigned char *) str) + #define strsep(str, delim) _strsep(str, delim) + #define strstr(str1, str2) prvStrStr(str1, str2) // NULL function + #define strtok(str, delim) prvStrtok(str, delim)//_strsep(str, delim) + #define strcat __rtl_strcat_v1_00 + #define strncmp(str1, str2, cnt) _strncmp(str1, str2, cnt) #define strncpy(dest, src, count) _strncpy(dest, src, count) - #define strsep(str, delim) _strsep(str, delim) - + #define strncat __rtl_strncat_v1_00 + + #define atol(str) strtol(str,NULL,10) #define atoi(str) prvAtoi(str) - #define strpbrk(cs, ct) _strpbrk(cs, ct) // for B-cut ROM - + #define strpbrk(cs, ct) _strpbrk(cs, ct) // for B-cut ROM #if defined (__GNUC__) #undef sscanf - #define sscanf _sscanf + #define sscanf _sscanf_patch + #define rand Rand #endif + //extern int _sscanf_patch(const char *buf, const char *fmt, ...); + //#define sscanf _sscanf_patch + -#endif #endif // defined (__IARSTDLIB__) // @@ -245,3 +276,4 @@ extern void vPortFree( void *pv ); #endif //__PLATFORM_STDLIB_H__ + diff --git a/RTL00_SDKV35a/component/common/api/wifi/wifi_conf.h b/RTL00_SDKV35a/component/common/api/wifi/wifi_conf.h index 8f2ebcb..7d95edd 100644 --- a/RTL00_SDKV35a/component/common/api/wifi/wifi_conf.h +++ b/RTL00_SDKV35a/component/common/api/wifi/wifi_conf.h @@ -1,6 +1,6 @@ //----------------------------------------------------------------------------// -#ifndef __WIFI_API_H -#define __WIFI_API_H +#ifndef __WIFI_CONF_API_H +#define __WIFI_CONF_API_H #include "FreeRTOS.h" #include "wifi_constants.h" @@ -705,6 +705,6 @@ int wifi_remove_packet_filter(unsigned char filter_id); } #endif -#endif // __WIFI_API_H +#endif // __WIFI_CONF_API_H //----------------------------------------------------------------------------// diff --git a/RTL00_SDKV35a/component/common/api/wifi_api.c b/RTL00_SDKV35a/component/common/api/wifi_api.c index 43d6c86..fb5f554 100644 --- a/RTL00_SDKV35a/component/common/api/wifi_api.c +++ b/RTL00_SDKV35a/component/common/api/wifi_api.c @@ -367,38 +367,40 @@ extern int lwip_init_done; void _LwIP_Init(void) { - int idx; - debug_printf("LwIP Init (%d)\n", wifi_mode); - /* Create tcp_ip stack thread */ - tcpip_init( NULL, NULL ); + if(!lwip_init_done) { + int idx; + debug_printf("LwIP Init (%d)\n", wifi_mode); + /* Create tcp_ip stack thread */ + tcpip_init( NULL, NULL ); - chk_ap_netif_num(); // Исполняется после _wifi_on() - for(int idx = 0; idx < NET_IF_NUM; idx++) { - xnetif[idx].name[0] = 'r'; - xnetif[idx].name[1] = '0' + idx; + chk_ap_netif_num(); // Исполняется после _wifi_on() + for(int idx = 0; idx < NET_IF_NUM; idx++) { + xnetif[idx].name[0] = 'r'; + xnetif[idx].name[1] = '0' + idx; + } + netif_add(&xnetif[WLAN_ST_NETIF_NUM], (struct netif *)&wifi_st_dhcp.ip, (struct netif *)&wifi_st_dhcp.mask, (struct netif *)&wifi_st_dhcp.gw, NULL, ðernetif_init, &tcpip_input); + netif_add(&xnetif[WLAN_AP_NETIF_NUM], (struct netif *)&wifi_ap_dhcp.ip, (struct netif *)&wifi_ap_dhcp.mask, (struct netif *)&wifi_ap_dhcp.gw, NULL, ðernetif_init, &tcpip_input); + #if CONFIG_ETHERNET // && NET_IF_NUM > 2 + { + struct ip_addr ipaddr; + struct ip_addr netmask; + struct ip_addr gw; + ipaddr.addr = DEF_EH_IP; + netmask.addr = DEF_EH_MSK; + gw.addr = DEF_EH_GW; + netif_add(&xnetif[2], &ipaddr, &netmask, &gw, NULL, ðernetif_mii_init, &tcpip_input); + } + #endif + /* Registers the default network interface. */ + netif_set_default(&xnetif[0]); + /* When the netif is fully configured this function must be called.*/ + for(idx = 0; idx < NET_IF_NUM; idx++) { + netif_set_up(&xnetif[idx]); + } + info_printf("interface %d is initialized\n", idx); + wifi_mode = 0; + lwip_init_done = 1; } - netif_add(&xnetif[WLAN_ST_NETIF_NUM], (struct netif *)&wifi_st_dhcp.ip, (struct netif *)&wifi_st_dhcp.mask, (struct netif *)&wifi_st_dhcp.gw, NULL, ðernetif_init, &tcpip_input); - netif_add(&xnetif[WLAN_AP_NETIF_NUM], (struct netif *)&wifi_ap_dhcp.ip, (struct netif *)&wifi_ap_dhcp.mask, (struct netif *)&wifi_ap_dhcp.gw, NULL, ðernetif_init, &tcpip_input); -#if CONFIG_ETHERNET // && NET_IF_NUM > 2 - { - struct ip_addr ipaddr; - struct ip_addr netmask; - struct ip_addr gw; - ipaddr.addr = DEF_EH_IP; - netmask.addr = DEF_EH_MSK; - gw.addr = DEF_EH_GW; - netif_add(&xnetif[2], &ipaddr, &netmask, &gw, NULL, ðernetif_mii_init, &tcpip_input); - } -#endif - /* Registers the default network interface. */ - netif_set_default(&xnetif[0]); - /* When the netif is fully configured this function must be called.*/ - for(idx = 0; idx < NET_IF_NUM; idx++) { - netif_set_up(&xnetif[idx]); - } - info_printf("interface %d is initialized\n", idx); - wifi_mode = 0; - lwip_init_done = 1; } int wifi_run(rtw_mode_t mode) { @@ -406,6 +408,9 @@ int wifi_run(rtw_mode_t mode) { #if CONFIG_DEBUG_LOG > 4 debug_printf("\n%s(%d), %d\n", __func__, mode, wifi_run_mode); #endif + if(mode != RTW_MODE_NONE) { + _LwIP_Init(); + }; if(wifi_run_mode & RTW_MODE_AP) { info_printf("Deinit old AP...\n"); LwIP_DHCP(WLAN_AP_NETIF_NUM, DHCP_STOP); @@ -414,12 +419,12 @@ int wifi_run(rtw_mode_t mode) { #endif dhcps_deinit(); wifi_run_mode &= ~RTW_MODE_AP; - } + }; if(wifi_run_mode & RTW_MODE_STA) { info_printf("Deinit old ST...\n"); LwIP_DHCP(WLAN_ST_NETIF_NUM, DHCP_STOP); wifi_run_mode &= ~RTW_MODE_STA; - } + }; // if(mode != wifi_mode) // wifi_mode = mode; // chk_ap_netif_num(); @@ -469,7 +474,7 @@ error_end: connect_close(); #endif wifi_off(); - } + }; chk_ap_netif_num(); return ret; } @@ -484,10 +489,6 @@ void wifi_init_thrd(void) { p_wlan_autoreconnect_hdl = NULL; if (wifi_cfg.mode != RTW_MODE_NONE) { wifi_mode = wifi_cfg.mode; - if(!lwip_init_done) { - /* Initilaize the LwIP stack */ - _LwIP_Init(); - }; user_start(); #if CONFIG_WIFI_IND_USE_THREAD wifi_manager_init(); diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/HalPwrSeqCmd.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/HalPwrSeqCmd.h new file mode 100644 index 0000000..51b8210 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/HalPwrSeqCmd.h @@ -0,0 +1,136 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HALPWRSEQCMD_H__ +#define __HALPWRSEQCMD_H__ + +/*---------------------------------------------*/ +//3 The value of cmd: 4 bits +/*---------------------------------------------*/ +#define PWR_CMD_READ 0x00 + // offset: the read register offset + // msk: the mask of the read value + // value: N/A, left by 0 + // note: dirver shall implement this function by read & msk + +#define PWR_CMD_WRITE 0x01 + // offset: the read register offset + // msk: the mask of the write bits + // value: write value + // note: driver shall implement this cmd by read & msk after write + +#define PWR_CMD_POLLING 0x02 + // offset: the read register offset + // msk: the mask of the polled value + // value: the value to be polled, masked by the msd field. + // note: driver shall implement this cmd by + // do{ + // if( (Read(offset) & msk) == (value & msk) ) + // break; + // } while(not timeout); + +#define PWR_CMD_DELAY 0x03 + // offset: the value to delay + // msk: N/A + // value: the unit of delay, 0: us, 1: ms + +#define PWR_CMD_END 0x04 + // offset: N/A + // msk: N/A + // value: N/A + +/*---------------------------------------------*/ +//3 The value of base: 4 bits +/*---------------------------------------------*/ + // define the base address of each block +#define PWR_BASEADDR_MAC 0x00 +#define PWR_BASEADDR_USB 0x01 +#define PWR_BASEADDR_PCIE 0x02 +#define PWR_BASEADDR_SDIO 0x03 + +/*---------------------------------------------*/ +//3 The value of interface_msk: 4 bits +/*---------------------------------------------*/ +#define PWR_INTF_SDIO_MSK BIT(0) +#define PWR_INTF_USB_MSK BIT(1) +#define PWR_INTF_PCI_MSK BIT(2) +#define PWR_INTF_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) + +/*---------------------------------------------*/ +//3 The value of fab_msk: 4 bits +/*---------------------------------------------*/ +#define PWR_FAB_TSMC_MSK BIT(0) +#define PWR_FAB_UMC_MSK BIT(1) +#define PWR_FAB_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) + +/*---------------------------------------------*/ +//3 The value of cut_msk: 8 bits +/*---------------------------------------------*/ +#define PWR_CUT_TESTCHIP_MSK BIT(0) +#define PWR_CUT_A_MSK BIT(1) +#define PWR_CUT_B_MSK BIT(2) +#define PWR_CUT_C_MSK BIT(3) +#define PWR_CUT_D_MSK BIT(4) +#define PWR_CUT_E_MSK BIT(5) +#define PWR_CUT_F_MSK BIT(6) +#define PWR_CUT_G_MSK BIT(7) +#define PWR_CUT_ALL_MSK 0xFF + + +typedef enum _PWRSEQ_CMD_DELAY_UNIT_ +{ + PWRSEQ_DELAY_US, + PWRSEQ_DELAY_MS, +} PWRSEQ_DELAY_UNIT; + +typedef struct _WL_PWR_CFG_ +{ + u16 offset; + u8 cut_msk; + u8 fab_msk:4; + u8 interface_msk:4; + u8 base:4; + u8 cmd:4; + u8 msk; + u8 value; +} WLAN_PWR_CFG, *PWLAN_PWR_CFG; + + +#define GET_PWR_CFG_OFFSET(__PWR_CMD) __PWR_CMD.offset +#define GET_PWR_CFG_CUT_MASK(__PWR_CMD) __PWR_CMD.cut_msk +#define GET_PWR_CFG_FAB_MASK(__PWR_CMD) __PWR_CMD.fab_msk +#define GET_PWR_CFG_INTF_MASK(__PWR_CMD) __PWR_CMD.interface_msk +#define GET_PWR_CFG_BASE(__PWR_CMD) __PWR_CMD.base +#define GET_PWR_CFG_CMD(__PWR_CMD) __PWR_CMD.cmd +#define GET_PWR_CFG_MASK(__PWR_CMD) __PWR_CMD.msk +#define GET_PWR_CFG_VALUE(__PWR_CMD) __PWR_CMD.value + + +//================================================================================ +// Prototype of protected function. +//================================================================================ +u8 HalPwrSeqCmdParsing( + _adapter * padapter, + u8 CutVersion, + u8 FabVersion, + u8 InterfaceType, + WLAN_PWR_CFG PwrCfgCmd[]); + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/HalVerDef.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/HalVerDef.h new file mode 100644 index 0000000..bdb0f06 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/HalVerDef.h @@ -0,0 +1,178 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HAL_VERSION_DEF_H__ +#define __HAL_VERSION_DEF_H__ + +#ifndef TRUE +#define TRUE _TRUE +#endif +#ifndef FALSE +#define FALSE _FALSE +#endif + +// HAL_IC_TYPE_E +typedef enum tag_HAL_IC_Type_Definition +{ + CHIP_8192S = 0, + CHIP_8188C = 1, + CHIP_8192C = 2, + CHIP_8192D = 3, + CHIP_8723A = 4, + CHIP_8188E = 5, + CHIP_8812 = 6, + CHIP_8821 = 7, + CHIP_8723B = 8, + CHIP_8192E = 9, + CHIP_8195A = 10, + CHIP_8710B = 11, + CHIP_8188F = 12, +}HAL_IC_TYPE_E; + +//HAL_CHIP_TYPE_E +typedef enum tag_HAL_CHIP_Type_Definition +{ + TEST_CHIP = 0, + NORMAL_CHIP = 1, + FPGA = 2, +}HAL_CHIP_TYPE_E; + +//HAL_CUT_VERSION_E +typedef enum tag_HAL_Cut_Version_Definition +{ + A_CUT_VERSION = 0, + B_CUT_VERSION = 1, + C_CUT_VERSION = 2, + D_CUT_VERSION = 3, + E_CUT_VERSION = 4, + F_CUT_VERSION = 5, + G_CUT_VERSION = 6, + H_CUT_VERSION = 7, + I_CUT_VERSION = 8, + J_CUT_VERSION = 9, + K_CUT_VERSION = 10, +}HAL_CUT_VERSION_E; + +// HAL_Manufacturer +typedef enum tag_HAL_Manufacturer_Version_Definition +{ + CHIP_VENDOR_TSMC = 0, + CHIP_VENDOR_UMC = 1, + CHIP_VENDOR_SMIC = 2, +}HAL_VENDOR_E; + +typedef enum tag_HAL_RF_Type_Definition +{ + RF_TYPE_1T1R = 0, + RF_TYPE_1T2R = 1, + RF_TYPE_2T2R = 2, + RF_TYPE_2T3R = 3, + RF_TYPE_2T4R = 4, + RF_TYPE_3T3R = 5, + RF_TYPE_3T4R = 6, + RF_TYPE_4T4R = 7, +}HAL_RF_TYPE_E; + +typedef struct tag_HAL_VERSION +{ + HAL_IC_TYPE_E ICType; + HAL_CHIP_TYPE_E ChipType; + HAL_CUT_VERSION_E CUTVersion; + HAL_VENDOR_E VendorType; + HAL_RF_TYPE_E RFType; + u8 ROMVer; +}HAL_VERSION,*PHAL_VERSION; + +//VERSION_8192C VersionID; +//HAL_VERSION VersionID; + +// Get element +#define GET_CVID_IC_TYPE(version) ((HAL_IC_TYPE_E)((version).ICType) ) +#define GET_CVID_CHIP_TYPE(version) ((HAL_CHIP_TYPE_E)((version).ChipType) ) +#define GET_CVID_RF_TYPE(version) ((HAL_RF_TYPE_E)((version).RFType)) +#define GET_CVID_MANUFACTUER(version) ((HAL_VENDOR_E)((version).VendorType)) +#define GET_CVID_CUT_VERSION(version) ((HAL_CUT_VERSION_E)((version).CUTVersion)) +#define GET_CVID_ROM_VERSION(version) (((version).ROMVer) & ROM_VERSION_MASK) + +//---------------------------------------------------------------------------- +//Common Macro. -- +//---------------------------------------------------------------------------- +//HAL_VERSION VersionID + +// HAL_IC_TYPE_E +#define IS_81XXC(version) (((GET_CVID_IC_TYPE(version) == CHIP_8192C)||(GET_CVID_IC_TYPE(version) == CHIP_8188C))? TRUE : FALSE) +#define IS_8723_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723A)? TRUE : FALSE) +#define IS_92D(version) ((GET_CVID_IC_TYPE(version) == CHIP_8192D)? TRUE : FALSE) +#define IS_8188E(version) ((GET_CVID_IC_TYPE(version) == CHIP_8188E)? TRUE : FALSE) +#define IS_8192E(version) ((GET_CVID_IC_TYPE(version) == CHIP_8192E)? TRUE : FALSE) +#define IS_8812_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8812)? TRUE : FALSE) +#define IS_8821_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8821)? TRUE : FALSE) +#define IS_8723B_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723B)? TRUE : FALSE) +#define IS_8710B_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8710B)? TRUE : FALSE) +#define IS_8188F(version) ((GET_CVID_IC_TYPE(version) == CHIP_8188F)? TRUE : FALSE) + +//HAL_CHIP_TYPE_E +#define IS_TEST_CHIP(version) ((GET_CVID_CHIP_TYPE(version)==TEST_CHIP)? TRUE: FALSE) +#define IS_NORMAL_CHIP(version) ((GET_CVID_CHIP_TYPE(version)==NORMAL_CHIP)? TRUE: FALSE) + +//HAL_CUT_VERSION_E +#define IS_A_CUT(version) ((GET_CVID_CUT_VERSION(version) == A_CUT_VERSION) ? TRUE : FALSE) +#define IS_B_CUT(version) ((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? TRUE : FALSE) +#define IS_C_CUT(version) ((GET_CVID_CUT_VERSION(version) == C_CUT_VERSION) ? TRUE : FALSE) +#define IS_D_CUT(version) ((GET_CVID_CUT_VERSION(version) == D_CUT_VERSION) ? TRUE : FALSE) +#define IS_E_CUT(version) ((GET_CVID_CUT_VERSION(version) == E_CUT_VERSION) ? TRUE : FALSE) +#define IS_I_CUT(version) ((GET_CVID_CUT_VERSION(version) == I_CUT_VERSION) ? TRUE : FALSE) +#define IS_J_CUT(version) ((GET_CVID_CUT_VERSION(version) == J_CUT_VERSION) ? TRUE : FALSE) +#define IS_K_CUT(version) ((GET_CVID_CUT_VERSION(version) == K_CUT_VERSION) ? TRUE : FALSE) + +//HAL_VENDOR_E +#define IS_CHIP_VENDOR_TSMC(version) ((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_TSMC)? TRUE: FALSE) +#define IS_CHIP_VENDOR_UMC(version) ((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_UMC)? TRUE: FALSE) +#define IS_CHIP_VENDOR_SMIC(version) ((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_SMIC)? TRUE: FALSE) + +//HAL_RF_TYPE_E +#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T1R)? TRUE : FALSE ) +#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)? TRUE : FALSE) +#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)? TRUE : FALSE) + + +//---------------------------------------------------------------------------- +//Chip version Macro. -- +//---------------------------------------------------------------------------- +#define IS_81XXC_TEST_CHIP(version) ((IS_81XXC(version) && (!IS_NORMAL_CHIP(version)))? TRUE: FALSE) + +#define IS_92C_SERIAL(version) ((IS_81XXC(version) && IS_2T2R(version)) ? TRUE : FALSE) +#define IS_81xxC_VENDOR_UMC_A_CUT(version) (IS_81XXC(version)?(IS_CHIP_VENDOR_UMC(version) ? (IS_A_CUT(version) ? TRUE : FALSE) : FALSE): FALSE) +#define IS_81xxC_VENDOR_UMC_B_CUT(version) (IS_81XXC(version)?(IS_CHIP_VENDOR_UMC(version) ? (IS_B_CUT(version) ? TRUE : FALSE) : FALSE): FALSE) +#define IS_81xxC_VENDOR_UMC_C_CUT(version) (IS_81XXC(version)?(IS_CHIP_VENDOR_UMC(version) ? (IS_C_CUT(version) ? TRUE : FALSE) : FALSE): FALSE) + +#define IS_NORMAL_CHIP92D(version) (( IS_92D(version))?((GET_CVID_CHIP_TYPE(version)==NORMAL_CHIP)? TRUE: FALSE):FALSE) + +#define IS_92D_SINGLEPHY(version) ((IS_92D(version)) ? (IS_2T2R(version) ? TRUE: FALSE) : FALSE) +#define IS_92D_C_CUT(version) ((IS_92D(version)) ? (IS_C_CUT(version) ? TRUE : FALSE) : FALSE) +#define IS_92D_D_CUT(version) ((IS_92D(version)) ? (IS_D_CUT(version) ? TRUE : FALSE) : FALSE) +#define IS_92D_E_CUT(version) ((IS_92D(version)) ? (IS_E_CUT(version) ? TRUE : FALSE) : FALSE) + +#define IS_8723A_A_CUT(version) ((IS_8723_SERIES(version)) ? ( IS_A_CUT(version)?TRUE : FALSE) : FALSE) +#define IS_8723A_B_CUT(version) ((IS_8723_SERIES(version)) ? ( IS_B_CUT(version)?TRUE : FALSE) : FALSE) + +#define IS_VENDOR_8188E_I_CUT_SERIES(_Adapter) ((IS_8188E(GET_HAL_DATA(_Adapter)->VersionID)) ? ((GET_CVID_CUT_VERSION(GET_HAL_DATA(_Adapter)->VersionID) >= I_CUT_VERSION) ? TRUE : FALSE) : FALSE) + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/autoconf.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/autoconf.h index c271d04..c2505cf 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/autoconf.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/autoconf.h @@ -1,3 +1,22 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ #ifndef WLANCONFIG_H #define WLANCONFIG_H @@ -21,11 +40,12 @@ #endif #ifndef CONFIG_INIC_EN -#define CONFIG_INIC_EN 0//For iNIC project +#define CONFIG_INIC_EN 0 //For iNIC project +#endif + #if CONFIG_INIC_EN #define CONFIG_LWIP_LAYER 0 #endif -#endif #define CONFIG_LITTLE_ENDIAN #define CONFIG_80211N_HT @@ -61,8 +81,11 @@ #endif // CONFIG_PLATFORM_AMEBA_X //#define CONFIG_DONT_CARE_TP +//#define CONFIG_HIGH_TP //#define CONFIG_MEMORY_ACCESS_ALIGNED +#ifndef PLATFORM_CMSIS_RTOS // unsupported feature #define CONFIG_POWER_SAVING +#endif #ifdef CONFIG_POWER_SAVING #define CONFIG_IPS #define CONFIG_LPS @@ -86,7 +109,7 @@ #if defined(CONFIG_PLATFORM_AMEBA_X) #if !defined(CONFIG_PLATFORM_8711B) - #define CONFIG_USE_TCM_HEAP 1 /* USE TCM HEAP */ + #define CONFIG_USE_TCM_HEAP 1 /* USE TCM HEAP */ #endif #define CONFIG_RECV_TASKLET_THREAD #define CONFIG_XMIT_TASKLET_THREAD @@ -128,14 +151,16 @@ #define NOT_SUPPORT_VHT #define NOT_SUPPORT_40M #define NOT_SUPPORT_80M +#ifndef CONFIG_PLATFORM_8711B #define NOT_SUPPORT_BBSWING +#endif #define NOT_SUPPORT_OLD_CHANNEL_PLAN #define NOT_SUPPORT_BT #define CONFIG_WIFI_SPEC 0 #define CONFIG_FAKE_EFUSE 0 #if CONFIG_FAKE_EFUSE - #define FAKE_CHIPID CHIPID_8711AN + #define FAKE_CHIPID CHIPID_8710BN #endif #define CONFIG_AUTO_RECONNECT 1 @@ -156,9 +181,6 @@ /* For promiscuous mode */ #define CONFIG_PROMISC -#ifdef CONFIG_PROMISC -//#define CONFIG_PROMISC_SCAN_CONCURENT -#endif #define PROMISC_DENY_PAIRWISE 0 @@ -176,9 +198,7 @@ #endif /* For STA+AP Concurrent MODE */ -#if !defined(CONFIG_PLATFORM_8711B) #define CONFIG_CONCURRENT_MODE -#endif #ifdef CONFIG_CONCURRENT_MODE #if defined(CONFIG_PLATFORM_8195A) #define CONFIG_RUNTIME_PORT_SWITCH @@ -210,8 +230,9 @@ #endif // enable 1X code in lib_wlan as default (increase 380 bytes) +#ifndef PLATFORM_CMSIS_RTOS // unsupported feature #define CONFIG_EAP - +#endif #if CONFIG_TLS || CONFIG_PEAP || CONFIG_TTLS #define EAP_REMOVE_UNUSED_CODE 1 #endif @@ -233,7 +254,7 @@ /****************** End of EAP configurations *******************/ /* For WPS and P2P */ -// #define CONFIG_WPS +#define CONFIG_WPS #if 0 #define CONFIG_WPS_AP #define CONFIG_P2P_NEW @@ -243,6 +264,7 @@ #endif #define CONFIG_NEW_SIGNAL_STAT_PROCESS +#define CONFIG_SKIP_SIGNAL_SCALE_MAPPING /* For AP_MODE */ #define CONFIG_AP_MODE @@ -259,6 +281,10 @@ extern unsigned int g_ap_sta_num; #define AP_STA_NUM 3//g_ap_sta_num #endif #ifdef CONFIG_AP_MODE +#if defined(CONFIG_PLATFORM_8195A) + //softap sent qos null0 polling client alive or not + #define CONFIG_AP_POLLING_CLIENT_ALIVE +#endif #define CONFIG_NATIVEAP_MLME #if defined(CONFIG_PLATFORM_AMEBA_X) #define CONFIG_INTERRUPT_BASED_TXBCN @@ -318,20 +344,27 @@ extern unsigned int g_ap_sta_num; //Control wifi mcu function #define CONFIG_LITTLE_WIFI_MCU_FUNCTION_THREAD #define CONFIG_ODM_REFRESH_RAMASK - #define CONFIG_ANTENNA_DIVERSITY #endif #endif // #ifdef CONFIG_MP_INCLUDED #if defined(CONFIG_PLATFORM_AMEBA_X) #if defined(CONFIG_PLATFORM_8195A) - #ifndef CONFIG_RTL8195A - #define CONFIG_RTL8195A - #endif + #undef CONFIG_RTL8195A + #define CONFIG_RTL8195A #endif #if defined(CONFIG_PLATFORM_8711B) #ifndef CONFIG_RTL8711B - #define CONFIG_RTL8711B + #define CONFIG_RTL8711B #endif + #undef CONFIG_ADAPTOR_INFO_CACHING_FLASH + #define CONFIG_ADAPTOR_INFO_CACHING_FLASH 0 + //#undef CONFIG_EAP + //#undef CONFIG_IPS + #define CONFIG_8710B_MOVE_TO_ROM + #define CONFIG_EFUSE_SEPARATE + #define CONFIG_MOVE_PSK_TO_ROM + #define CONFIG_WOWLAN + #define CONFIG_TRAFFIC_PROTECT #endif #elif defined(CONFIG_HARDWARE_8188F) #define CONFIG_RTL8188F @@ -385,8 +418,7 @@ extern unsigned int g_ap_sta_num; #define DBG_TX_RATE 1 // DebugComponents: bit9 #define DBG_DM_RA 1 // DebugComponents: bit9 #define DBG_DM_DIG 1 // DebugComponents: bit0 - #define DBG_DM_ANT_DIV 1 // DebugComponents: bit6 - #define DBG_DM_ADAPTIVITY 1 // DebugComponents: bit17 + #define DBG_DM_ADAPTIVITY 1 // DebugComponents: bit16 // RF #define DBG_PWR_TRACKING 1 // DebugComponents: bit24 #define DBG_RF_IQK 1 // DebugComponents: bit26 @@ -398,6 +430,9 @@ extern unsigned int g_ap_sta_num; /* For DM support */ #if defined(CONFIG_RTL8188F) #define RATE_ADAPTIVE_SUPPORT 0 +#elif defined(CONFIG_PLATFORM_8711B) +#define RATE_ADAPTIVE_SUPPORT 1 +#define CONFIG_ODM_REFRESH_RAMASK #else #define RATE_ADAPTIVE_SUPPORT 1 #endif @@ -431,8 +466,8 @@ extern unsigned int g_ap_sta_num; #if (SKB_PRE_ALLOCATE_RX == 1) #define EXCHANGE_LXBUS_RX_SKB 0 #endif -#if defined(CONFIG_PLATFORM_8711B) -//Enable mac loopback for test mode (Ameba) +#ifdef CONFIG_FPGA + //Enable mac loopback for test mode (Ameba) #define CONFIG_TWO_MAC_DRIVER // for test mode #endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/generic.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/generic.h new file mode 100644 index 0000000..13fdbf3 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/generic.h @@ -0,0 +1,223 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _LINUX_BYTEORDER_GENERIC_H +#define _LINUX_BYTEORDER_GENERIC_H + +/* + * linux/byteorder_generic.h + * Generic Byte-reordering support + * + * Francois-Rene Rideau 19970707 + * gathered all the good ideas from all asm-foo/byteorder.h into one file, + * cleaned them up. + * I hope it is compliant with non-GCC compilers. + * I decided to put __BYTEORDER_HAS_U64__ in byteorder.h, + * because I wasn't sure it would be ok to put it in types.h + * Upgraded it to 2.1.43 + * Francois-Rene Rideau 19971012 + * Upgraded it to 2.1.57 + * to please Linus T., replaced huge #ifdef's between little/big endian + * by nestedly #include'd files. + * Francois-Rene Rideau 19971205 + * Made it to 2.1.71; now a facelift: + * Put files under include/linux/byteorder/ + * Split swab from generic support. + * + * TODO: + * = Regular kernel maintainers could also replace all these manual + * byteswap macros that remain, disseminated among drivers, + * after some grep or the sources... + * = Linus might want to rename all these macros and files to fit his taste, + * to fit his personal naming scheme. + * = it seems that a few drivers would also appreciate + * nybble swapping support... + * = every architecture could add their byteswap macro in asm/byteorder.h + * see how some architectures already do (i386, alpha, ppc, etc) + * = cpu_to_beXX and beXX_to_cpu might some day need to be well + * distinguished throughout the kernel. This is not the case currently, + * since little endian, big endian, and pdp endian machines needn't it. + * But this might be the case for, say, a port of Linux to 20/21 bit + * architectures (and F21 Linux addict around?). + */ + +/* + * The following macros are to be defined by : + * + * Conversion of long and short int between network and host format + * ntohl(__u32 x) + * ntohs(__u16 x) + * htonl(__u32 x) + * htons(__u16 x) + * It seems that some programs (which? where? or perhaps a standard? POSIX?) + * might like the above to be functions, not macros (why?). + * if that's true, then detect them, and take measures. + * Anyway, the measure is: define only ___ntohl as a macro instead, + * and in a separate file, have + * unsigned long inline ntohl(x){return ___ntohl(x);} + * + * The same for constant arguments + * __constant_ntohl(__u32 x) + * __constant_ntohs(__u16 x) + * __constant_htonl(__u32 x) + * __constant_htons(__u16 x) + * + * Conversion of XX-bit integers (16- 32- or 64-) + * between native CPU format and little/big endian format + * 64-bit stuff only defined for proper architectures + * cpu_to_[bl]eXX(__uXX x) + * [bl]eXX_to_cpu(__uXX x) + * + * The same, but takes a pointer to the value to convert + * cpu_to_[bl]eXXp(__uXX x) + * [bl]eXX_to_cpup(__uXX x) + * + * The same, but change in situ + * cpu_to_[bl]eXXs(__uXX x) + * [bl]eXX_to_cpus(__uXX x) + * + * See asm-foo/byteorder.h for examples of how to provide + * architecture-optimized versions + * + */ + + +#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL) || defined(PLATFORM_FREEBSD) || defined(PLATFORM_ECOS) || defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) +/* + * inside the kernel, we can use nicknames; + * outside of it, we must avoid POSIX namespace pollution... + */ + +//TODO +#if 0 + +#define cpu_to_le64 __cpu_to_le64 +#define le64_to_cpu __le64_to_cpu + +#endif //#if 0 + +#define cpu_to_le32 __cpu_to_le32 +#define le32_to_cpu __le32_to_cpu +#define cpu_to_le16 __cpu_to_le16 +#define le16_to_cpu __le16_to_cpu +#define cpu_to_be64 __cpu_to_be64 +#define be64_to_cpu __be64_to_cpu +#define cpu_to_be32 __cpu_to_be32 +#define be32_to_cpu __be32_to_cpu +#define cpu_to_be16 __cpu_to_be16 +#define be16_to_cpu __be16_to_cpu +#define cpu_to_le64p __cpu_to_le64p +#define le64_to_cpup __le64_to_cpup +#define cpu_to_le32p __cpu_to_le32p +#define le32_to_cpup __le32_to_cpup +#define cpu_to_le16p __cpu_to_le16p +#define le16_to_cpup __le16_to_cpup +#define cpu_to_be64p __cpu_to_be64p +#define be64_to_cpup __be64_to_cpup +#define cpu_to_be32p __cpu_to_be32p +#define be32_to_cpup __be32_to_cpup +#define cpu_to_be16p __cpu_to_be16p +#define be16_to_cpup __be16_to_cpup +#define cpu_to_le64s __cpu_to_le64s +#define le64_to_cpus __le64_to_cpus +#define cpu_to_le32s __cpu_to_le32s +#define le32_to_cpus __le32_to_cpus +#define cpu_to_le16s __cpu_to_le16s +#define le16_to_cpus __le16_to_cpus +#define cpu_to_be64s __cpu_to_be64s +#define be64_to_cpus __be64_to_cpus +#define cpu_to_be32s __cpu_to_be32s +#define be32_to_cpus __be32_to_cpus +#define cpu_to_be16s __cpu_to_be16s +#define be16_to_cpus __be16_to_cpus +#endif + +//TODO +#if 0 + +/* + * Handle ntohl and suches. These have various compatibility + * issues - like we want to give the prototype even though we + * also have a macro for them in case some strange program + * wants to take the address of the thing or something.. + * + * Note that these used to return a "long" in libc5, even though + * long is often 64-bit these days.. Thus the casts. + * + * They have to be macros in order to do the constant folding + * correctly - if the argument passed into a inline function + * it is no longer constant according to gcc.. + */ + +#undef ntohl +#undef ntohs +#undef htonl +#undef htons + +/* + * Do the prototypes. Somebody might want to take the + * address or some such sick thing.. + */ +#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2) +extern __u32 ntohl(__u32); +extern __u32 htonl(__u32); +#else //defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2) +#ifndef PLATFORM_FREEBSD +extern unsigned long int ntohl(unsigned long int); +extern unsigned long int htonl(unsigned long int); +#endif +#endif +#ifndef PLATFORM_FREEBSD +extern unsigned short int ntohs(unsigned short int); +extern unsigned short int htons(unsigned short int); +#endif + +#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) || defined(PLATFORM_MPIXEL) + +#define ___htonl(x) __cpu_to_be32(x) +#define ___htons(x) __cpu_to_be16(x) +#define ___ntohl(x) __be32_to_cpu(x) +#define ___ntohs(x) __be16_to_cpu(x) + +#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2) +#define htonl(x) ___htonl(x) +#define ntohl(x) ___ntohl(x) +#else +#define htonl(x) ((unsigned long)___htonl(x)) +#define ntohl(x) ((unsigned long)___ntohl(x)) +#endif +#define htons(x) ___htons(x) +#define ntohs(x) ___ntohs(x) + +#endif /* OPTIMIZE */ + + +#if defined (PLATFORM_WINDOWS) + +#define htonl(x) __cpu_to_be32(x) +#define ntohl(x) __be32_to_cpu(x) +#define htons(x) __cpu_to_be16(x) +#define ntohs(x) __be16_to_cpu(x) + +#endif + +#endif //#if 0 + +#endif /* _LINUX_BYTEORDER_GENERIC_H */ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/little_endian.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/little_endian.h new file mode 100644 index 0000000..6c12102 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/little_endian.h @@ -0,0 +1,97 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _LINUX_BYTEORDER_LITTLE_ENDIAN_H +#define _LINUX_BYTEORDER_LITTLE_ENDIAN_H + +#ifndef __LITTLE_ENDIAN +#define __LITTLE_ENDIAN 1234 +#endif +#ifndef __LITTLE_ENDIAN_BITFIELD +#define __LITTLE_ENDIAN_BITFIELD +#endif + +#include + +#ifndef __constant_htonl + +//TODO +#if 0 + +#define __constant_htonl(x) ___constant_swab32((x)) +#define __constant_ntohl(x) ___constant_swab32((x)) +#define __constant_htons(x) ___constant_swab16((x)) +#define __constant_ntohs(x) ___constant_swab16((x)) +#define __constant_cpu_to_le64(x) ((__u64)(x)) +#define __constant_le64_to_cpu(x) ((__u64)(x)) +#define __constant_cpu_to_le32(x) ((__u32)(x)) +#define __constant_le32_to_cpu(x) ((__u32)(x)) +#define __constant_cpu_to_le16(x) ((__u16)(x)) +#define __constant_le16_to_cpu(x) ((__u16)(x)) +#define __constant_cpu_to_be64(x) ___constant_swab64((x)) +#define __constant_be64_to_cpu(x) ___constant_swab64((x)) +#define __constant_cpu_to_be32(x) ___constant_swab32((x)) +#define __constant_be32_to_cpu(x) ___constant_swab32((x)) +#define __constant_cpu_to_be16(x) ___constant_swab16((x)) +#define __constant_be16_to_cpu(x) ___constant_swab16((x)) +#define __cpu_to_le64(x) ((__u64)(x)) +#define __le64_to_cpu(x) ((__u64)(x)) + +#endif //#if 0 + +#define __cpu_to_le32(x) ((__u32)(x)) +#define __le32_to_cpu(x) ((__u32)(x)) +#define __cpu_to_le16(x) ((__u16)(x)) +#define __le16_to_cpu(x) ((__u16)(x)) +#define __cpu_to_be64(x) __swab64((x)) +#define __be64_to_cpu(x) __swab64((x)) +#define __cpu_to_be32(x) __swab32((x)) +#define __be32_to_cpu(x) __swab32((x)) +#define __cpu_to_be16(x) __swab16((x)) +#define __be16_to_cpu(x) __swab16((x)) +#define __cpu_to_le64p(x) (*(__u64*)(x)) +#define __le64_to_cpup(x) (*(__u64*)(x)) +#define __cpu_to_le32p(x) (*(__u32*)(x)) +#define __le32_to_cpup(x) (*(__u32*)(x)) +#define __cpu_to_le16p(x) (*(__u16*)(x)) +#define __le16_to_cpup(x) (*(__u16*)(x)) +#define __cpu_to_be64p(x) __swab64p((x)) +#define __be64_to_cpup(x) __swab64p((x)) +#define __cpu_to_be32p(x) __swab32p((x)) +#define __be32_to_cpup(x) __swab32p((x)) +#define __cpu_to_be16p(x) __swab16p((x)) +#define __be16_to_cpup(x) __swab16p((x)) +#define __cpu_to_le64s(x) do {} while (0) +#define __le64_to_cpus(x) do {} while (0) +#define __cpu_to_le32s(x) do {} while (0) +#define __le32_to_cpus(x) do {} while (0) +#define __cpu_to_le16s(x) do {} while (0) +#define __le16_to_cpus(x) do {} while (0) +#define __cpu_to_be64s(x) __swab64s((x)) +#define __be64_to_cpus(x) __swab64s((x)) +#define __cpu_to_be32s(x) __swab32s((x)) +#define __be32_to_cpus(x) __swab32s((x)) +#define __cpu_to_be16s(x) __swab16s((x)) +#define __be16_to_cpus(x) __swab16s((x)) +#endif // __constant_htonl + +#include + +#endif /* _LINUX_BYTEORDER_LITTLE_ENDIAN_H */ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/swab.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/swab.h new file mode 100644 index 0000000..a956a0b --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/byteorder/swab.h @@ -0,0 +1,145 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _LINUX_BYTEORDER_SWAB_H +#define _LINUX_BYTEORDER_SWAB_H +/* +#if !defined(CONFIG_PLATFORM_MSTAR_TITANIA12) && !defined(PLATFORM_ECOS) && \ + !defined(CONFIG_PLATFORM_8195A) +*/ +#if !defined(CONFIG_PLATFORM_MSTAR_TITANIA12) && !defined(PLATFORM_ECOS) + +#if !defined(PLATFORM_FREERTOS) && !defined (PLATFORM_CMSIS_RTOS) +#ifndef __u16 +typedef unsigned short __u16; +#endif + +#ifndef __u32 +typedef unsigned int __u32; +#endif + +#ifndef __u8 +typedef unsigned char __u8; +#endif + +#ifndef __u64 +typedef unsigned long long __u64; +#endif +#endif +__inline static __u16 ___swab16(__u16 x) +{ + __u16 __x = x; + return + ((__u16)( + (((__u16)(__x) & (__u16)0x00ffU) << 8) | + (((__u16)(__x) & (__u16)0xff00U) >> 8) )); + +} + +__inline static __u32 ___swab32(__u32 x) +{ + __u32 __x = (x); + return ((__u32)( + (((__u32)(__x) & (__u32)0x000000ffUL) << 24) | + (((__u32)(__x) & (__u32)0x0000ff00UL) << 8) | + (((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) | + (((__u32)(__x) & (__u32)0xff000000UL) >> 24) )); +} + +__inline static __u64 ___swab64(__u64 x) +{ + __u64 __x = (x); + + return + ((__u64)( \ + (__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | \ + (__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | \ + (__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | \ + (__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) << 8) | \ + (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >> 8) | \ + (__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | \ + (__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \ + (__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); \ +} +#endif // CONFIG_PLATFORM_MSTAR_TITANIA12 + +#ifndef __arch__swab16 +__inline static __u16 __arch__swab16(__u16 x) +{ + return ___swab16(x); +} + +#endif + +#ifndef __arch__swab32 +__inline static __u32 __arch__swab32(__u32 x) +{ + __u32 __tmp = (x) ; + return ___swab32(__tmp); +} +#endif + +#ifndef __arch__swab64 + +__inline static __u64 __arch__swab64(__u64 x) +{ + __u64 __tmp = (x) ; + return ___swab64(__tmp); +} + + +#endif + +#ifndef __swab16 +#define __swab16(x) __fswab16(x) +#define __swab32(x) __fswab32(x) +#define __swab64(x) __fswab64(x) +#endif // __swab16 + +#ifdef PLATFORM_FREEBSD +__inline static __u16 __fswab16(__u16 x) +#else +__inline static __u16 __fswab16(__u16 x) +#endif //PLATFORM_FREEBSD +{ + return __arch__swab16(x); +} +#ifdef PLATFORM_FREEBSD +__inline static __u32 __fswab32(__u32 x) +#else +__inline static __u32 __fswab32(__u32 x) +#endif //PLATFORM_FREEBSD +{ + return __arch__swab32(x); +} + +#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) +#define swab16 __swab16 +#define swab32 __swab32 +#define swab64 __swab64 +#define swab16p __swab16p +#define swab32p __swab32p +#define swab64p __swab64p +#define swab16s __swab16s +#define swab32s __swab32s +#define swab64s __swab64s +#endif + +#endif /* _LINUX_BYTEORDER_SWAB_H */ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/drv_types.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/drv_types.h new file mode 100644 index 0000000..49bedcc --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/drv_types.h @@ -0,0 +1,863 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/*------------------------------------------------------------------------------- + + For type defines and data structure defines + +--------------------------------------------------------------------------------*/ + + +#ifndef __DRV_TYPES_H__ +#define __DRV_TYPES_H__ + +#include + + +#ifdef PLATFORM_OS_XP +#include +#endif + +#ifdef PLATFORM_OS_CE +#include +#endif + +#ifdef PLATFORM_LINUX +#include +#endif + + +#if defined (__ICCARM__) +#define _PACKED __packed +#define _WEAK __weak +#else +#define _PACKED __attribute__ ((packed)) +#define _WEAK __attribute__ ((weak)) +#endif + +// Assign memory sectinon usage +#if defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B) +#include +//#include "rtl_utility_ram.h" +#include "platform/platform_stdlib.h" +#else +#define SRAM_BD_DATA_SECTION +#define WLAN_ROM_TEXT_SECTION +#define WLAN_ROM_DATA_SECTION +#define _LONG_CALL_ +#endif + +#ifdef CONFIG_TRACE_SKB +#define SKBLIST_ALL 0xFFFFFFFF +// receive +#define SKBLIST_RECVBUF_MASK 0x0000000F +#define SKBLIST_RECVBUF 0x00000001 +#define SKBLIST_RECVBUF_FREEQUEUE 0x00000002 +#define SKBLIST_RECVBUF_PENDINGQUEUE 0x00000004 + +#define SKBLIST_RECVFRAME_MASK 0x000000F0 +#define SKBLIST_RECVFRAME 0x00000010 +#define SKBLIST_RECVFRAME_FREEQUEUE 0x00000020 +#define SKBLIST_RECVFRAME_SWDECQUEUE 0x00000040 +#ifdef CONFIG_RECV_REORDERING_CTRL +#define SKBLIST_RECVFRAME_REORDERQUEUE 0x00000080 +#endif + +// transmit +#define SKBLIST_XMITBUF_MASK 0x0000FF00 +#define SKBLIST_XMITBUF 0x00000100 +#define SKBLIST_XMITEXTBUF 0x00000200 +#define SKBLIST_XMITBUF_FREEQUEUE 0x00000400 +#define SKBLIST_XMITEXTBUF_FREEQUEUE 0x00000800 +#define SKBLIST_XMITBUF_PENDINGQUEUE 0x00001000 +#ifdef CONFIG_SDIO_TX_MULTI_QUEUE +#define SKBLIST_XMITBUF_PENDING0QUEUE 0x00002000 +#define SKBLIST_XMITBUF_PENDING1QUEUE 0x00004000 +#define SKBLIST_XMITBUF_PENDING2QUEUE 0x00008000 +#endif + +#define SKBLIST_XMITFRAME_MASK 0x0FFF0000 +#define SKBLIST_XMITFRAME 0x00010000 +#define SKBLIST_XMITFRAME_FREEQUEUE 0x00020000 +#define SKBLIST_XMITFRAME_SLEEPQUEUE 0x00040000 +#define SKBLIST_XMITFRAME_VOQUEUE 0x00100000 +#define SKBLIST_XMITFRAME_VIQUEUE 0x00200000 +#define SKBLIST_XMITFRAME_BEQUEUE 0x00400000 +#define SKBLIST_XMITFRAME_BKQUEUE 0x00800000 +#define SKBLIST_XMITFRAME_BMQUEUE 0x01000000 + +#define SKBLIST_POOL 0x10000000 +#endif + +enum _NIC_VERSION { + + RTL8711_NIC, + RTL8712_NIC, + RTL8713_NIC, + RTL8716_NIC + +}; + +typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER; + +#include "wireless.h" +#include +#include +#include +#include +#include + +#include + +#ifdef CONFIG_80211N_HT +#include +#endif + +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_INCLUDE_WPA_PSK +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_P2P_NEW +#include +#endif +//#include +#include +#include + +#include + +#include + +#ifdef CONFIG_WAPI_SUPPORT +#include +#endif + +#ifdef CONFIG_DRVEXT_MODULE +#include +#endif + +#ifdef CONFIG_MP_INCLUDED +#include +#endif + +#ifdef CONFIG_BR_EXT +#include +#endif // CONFIG_BR_EXT + +#ifdef CONFIG_IOCTL_CFG80211 + #include "ioctl_cfg80211.h" +#endif //CONFIG_IOCTL_CFG80211 + +#define SPEC_DEV_ID_NONE BIT(0) +#define SPEC_DEV_ID_DISABLE_HT BIT(1) +#define SPEC_DEV_ID_ENABLE_PS BIT(2) +#define SPEC_DEV_ID_RF_CONFIG_1T1R BIT(3) +#define SPEC_DEV_ID_RF_CONFIG_2T2R BIT(4) +#define SPEC_DEV_ID_ASSIGN_IFNAME BIT(5) + +struct specific_device_id{ + + u32 flags; + + u16 idVendor; + u16 idProduct; + +}; + +struct registry_priv +{ + u8 chip_version; +// u8 rfintfs; +// u8 lbkmode; + u8 hci; + NDIS_802_11_SSID ssid; +// u8 network_mode; //infra, ad-hoc, auto + u8 channel;//ad-hoc support requirement + u8 wireless_mode;//A, B, G, auto + u8 scan_mode;//active, passive +// u8 radio_enable; +// u8 preamble;//long, short, auto + u8 vrtl_carrier_sense;//Enable, Disable, Auto + u8 vcs_type;//RTS/CTS, CTS-to-self + u16 rts_thresh; +// u8 adhoc_tx_pwr; + u8 soft_ap; + u8 power_mgnt; + u8 ps_enable; + u8 ips_mode; + u8 smart_ps; +// u8 long_retry_lmt; +// u8 short_retry_lmt; +// u16 busy_thresh; +// u8 ack_policy; + u8 mp_mode; + u8 software_encrypt; + u8 software_decrypt; + #ifdef CONFIG_TX_EARLY_MODE + u8 early_mode; + #endif + u8 acm_method; + //UAPSD + u8 wmm_enable; + u8 uapsd_enable; +// u8 uapsd_max_sp; +// u8 uapsd_acbk_en; +// u8 uapsd_acbe_en; +// u8 uapsd_acvi_en; +// u8 uapsd_acvo_en; + +// WLAN_BSSID_EX dev_network; + u32 beacon_period; + +#ifdef CONFIG_80211N_HT + u8 ht_enable; +#if !defined(NOT_SUPPORT_40M) + u8 cbw40_enable; +#endif + u8 ampdu_enable;//for tx + u8 rx_stbc; + u8 ampdu_amsdu;//A-MPDU Supports A-MSDU is permitted +#endif + //u8 lowrate_two_xmit; + + u8 rf_config ; +// u8 low_power ; + u8 power_percentage_idx; + + u8 wifi_spec;// !turbo_mode + + u8 channel_plan; +#ifdef CONFIG_BT_COEXIST + u8 btcoex; + u8 bt_iso; + u8 bt_sco; + u8 bt_ampdu; +#endif +#if RX_AGGREGATION + BOOLEAN bAcceptAddbaReq; +#endif +// u8 antdiv_cfg; +// u8 antdiv_type; + +#ifdef CONFIG_AUTOSUSPEND + u8 usbss_enable;//0:disable,1:enable +#endif +#ifdef SUPPORT_HW_RFOFF_DETECTED + u8 hwpdn_mode;//0:disable,1:enable,2:decide by EFUSE config + u8 hwpwrp_detect;//0:disable,1:enable +#endif +#ifdef CONFIG_SUPPORT_HW_WPS_PBC + u8 hw_wps_pbc;//0:disable,1:enable +#endif + +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE + char adaptor_info_caching_file_path[PATH_LENGTH_MAX]; +#endif + +#ifdef CONFIG_LAYER2_ROAMING + u8 max_roaming_times; // the max number driver will try to roaming +#endif + +#ifdef CONFIG_IOL + bool force_iol; //enable iol without other concern +#endif + +#ifdef CONFIG_80211D + u8 enable80211d; +#endif + + u8 ifname[16]; + u8 if2name[16]; + +#if (RTW_NOTCH_FILTER != 0) + u8 notch_filter; +#endif + +#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + u8 force_ant;//0 normal,1 main,2 aux + u8 force_igi;//0 normal +#endif + + //define for tx power adjust + u8 RegEnableTxPowerLimit; + u8 RegEnableTxPowerByRate; +#ifdef CONFIG_RF_GAIN_OFFSET + u8 RegEnableKFree; +#endif + u8 RegPowerBase; + u8 RegPwrTblSel; + + u8 adaptivity_en; + u8 adaptivity_mode; + u8 adaptivity_dml; + u8 adaptivity_dc_backoff; + s8 adaptivity_th_l2h_ini; +// u8 nhm_en; +}; + +//For registry parameters +#define RGTRY_OFT(field) ((u32)FIELD_OFFSET(struct registry_priv,field)) +#define RGTRY_SZ(field) sizeof(((struct registry_priv*) 0)->field) +#define BSSID_OFT(field) ((u32)FIELD_OFFSET(WLAN_BSSID_EX,field)) +#define BSSID_SZ(field) sizeof(((PWLAN_BSSID_EX) 0)->field) + +#define MAX_CONTINUAL_URB_ERR 4 + +#ifdef CONFIG_CONCURRENT_MODE +#define is_primary_adapter(adapter) (adapter->adapter_type == PRIMARY_ADAPTER) +#define get_iface_type(adapter) (adapter->iface_type) +#else +#define is_primary_adapter(adapter) (1) +#define get_iface_type(adapter) (IFACE_PORT0) +#endif + +enum _IFACE_TYPE { + IFACE_PORT0, //mapping to port0 for C/D series chips + IFACE_PORT1, //mapping to port1 for C/D series chip + MAX_IFACE_PORT, +}; + +enum _ADAPTER_TYPE { + PRIMARY_ADAPTER, + SECONDARY_ADAPTER, + MAX_ADAPTER, +}; + +struct dvobj_priv +{ + void *if1; +#ifdef CONFIG_CONCURRENT_MODE + void *if2; +#endif + + //For 92D, DMDP have 2 interface. + //u8 InterfaceNumber; + //u8 NumInterfaces; +#ifdef CONFIG_CONCURRENT_MODE + void *padapters[MAX_IFACE_PORT]; + u8 iface_nums; // total number of ifaces used runtime +#endif + //In /Out Pipe information + //int RtInPipe[2]; + u8 RtOutPipe[3];//int RtOutPipe[3]; + u8 Queue2Pipe[HW_QUEUE_ENTRY];//for out pipe mapping + + //u8 irq_alloc; + +/*-------- below is for SDIO INTERFACE --------*/ +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + // + // SDIO ISR Related + // + u32 sdio_himr; + + // + // SDIO Tx FIFO related. + // + // HIQ, MID, LOW, PUB free pages; padapter->xmitpriv.free_txpg + u8 SdioTxFIFOFreePage[TX_FREE_PG_QUEUE]; + _lock SdioTxFIFOFreePageLock; + + // + // SDIO Rx FIFO related. + // + u16 SdioRxFIFOSize; + +#ifdef INTF_DATA + INTF_DATA intf_data; +#endif +#endif //CONFIG_SDIO_HCI + +/*-------- below is for USB INTERFACE --------*/ + +#ifdef CONFIG_USB_HCI + + u8 irq_alloc; + u8 nr_endpoint; + u8 ishighspeed; + u8 RtNumInPipes; + u8 RtNumOutPipes; + int ep_num[5]; //endpoint number + + int RegUsbSS; + + _sema usb_suspend_sema; + +#ifdef CONFIG_USB_VENDOR_REQ_MUTEX + _mutex usb_vendor_req_mutex; +#endif + +#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC + u8 * usb_alloc_vendor_req_buf; + u8 * usb_vendor_req_buf; +#endif + +#ifdef PLATFORM_WINDOWS + //related device objects + PDEVICE_OBJECT pphysdevobj;//pPhysDevObj; + PDEVICE_OBJECT pfuncdevobj;//pFuncDevObj; + PDEVICE_OBJECT pnextdevobj;//pNextDevObj; + + u8 nextdevstacksz;//unsigned char NextDeviceStackSize; //= (CHAR)CEdevice->pUsbDevObj->StackSize + 1; + + //urb for control diescriptor request + +#ifdef PLATFORM_OS_XP + struct _URB_CONTROL_DESCRIPTOR_REQUEST descriptor_urb; + PUSB_CONFIGURATION_DESCRIPTOR pconfig_descriptor;//UsbConfigurationDescriptor; +#endif + +#ifdef PLATFORM_OS_CE + WCHAR active_path[MAX_ACTIVE_REG_PATH]; // adapter regpath + USB_EXTENSION usb_extension; + + _nic_hdl pipehdls_r8192c[0x10]; +#endif + + u32 config_descriptor_len;//u32 UsbConfigurationDescriptorLength; +#endif//PLATFORM_WINDOWS + +#ifdef PLATFORM_LINUX + struct usb_interface *pusbintf; + struct usb_device *pusbdev; +#endif//PLATFORM_LINUX + +#ifdef PLATFORM_FREEBSD + struct usb_interface *pusbintf; + struct usb_device *pusbdev; +#endif//PLATFORM_FREEBSD + ATOMIC_T continual_urb_error; +#endif//CONFIG_USB_HCI + +/*-------- below is for PCIE INTERFACE --------*/ + +#ifdef CONFIG_PCI_HCI + u8 irq_alloc; + +#ifdef PLATFORM_LINUX + struct pci_dev *ppcidev; + + //PCI MEM map + unsigned long pci_mem_end; /* shared mem end */ + unsigned long pci_mem_start; /* shared mem start */ + + //PCI IO map + unsigned long pci_base_addr; /* device I/O address */ + + //PciBridge + struct pci_priv pcipriv; + + u16 irqline; + u8 irq_enabled; + RT_ISR_CONTENT isr_content; + _lock irq_th_lock; + + //ASPM + u8 const_pci_aspm; + u8 const_amdpci_aspm; + u8 const_hwsw_rfoff_d3; + u8 const_support_pciaspm; + // pci-e bridge */ + u8 const_hostpci_aspm_setting; + // pci-e device */ + u8 const_devicepci_aspm_setting; + u8 b_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00. + u8 b_support_backdoor; + u8 bdma64; +#endif//PLATFORM_LINUX + +#if defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) + u8 irq_enabled; + _lock irq_th_lock; +#endif //PLATFORM_FREERTOS + +#endif//CONFIG_PCI_HCI + +#ifdef CONFIG_LX_HCI + u8 irq_alloc; +#if defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) + u8 irq_enabled; + _lock irq_th_lock; +#endif //PLATFORM_FREERTOS +#endif + +}; + +#ifdef PLATFORM_LINUX +static struct device *dvobj_to_dev(struct dvobj_priv *dvobj) +{ + /* todo: get interface type from dvobj and the return the dev accordingly */ +#ifdef RTW_DVOBJ_CHIP_HW_TYPE +#endif + +#ifdef CONFIG_USB_HCI + return &dvobj->pusbintf->dev; +#endif +#ifdef CONFIG_SDIO_HCI + return &dvobj->intf_data.func->dev; +#endif +#ifdef CONFIG_GSPI_HCI + return &dvobj->intf_data.func->dev; +#endif +#ifdef CONFIG_PCI_HCI + return &dvobj->ppcidev->dev; +#endif +} +#endif + +#ifdef CONFIG_CONCURRENT_MODE +struct co_data_priv{ + + //george@20120518 + //current operating channel/bw/ch_offset + //save the correct ch/bw/ch_offset whatever the inputted values are + //when calling set_channel_bwmode() at concurrent mode + //for debug check or reporting to layer app (such as wpa_supplicant for nl80211) + u8 co_ch; + u8 co_bw; + u8 co_ch_offset; + u8 rsvd; + +}; +#endif //CONFIG_CONCURRENT_MODE + +typedef enum _DRIVER_STATE{ + DRIVER_NORMAL = 0, + DRIVER_DISAPPEAR = 1, + DRIVER_REPLACE_DONGLE = 2, +}DRIVER_STATE; + +#ifdef CONFIG_INTEL_PROXIM +struct proxim { + bool proxim_support; + bool proxim_on; + + void *proximity_priv; + int (*proxim_rx)(_adapter *padapter, + union recv_frame *precv_frame); + u8 (*proxim_get_var)(_adapter* padapter, u8 type); +}; +#endif //CONFIG_INTEL_PROXIM + +#ifdef CONFIG_MAC_LOOPBACK_DRIVER +typedef struct loopbackdata +{ + _sema sema; + _thread_hdl_ lbkthread; + u8 bstop; + u32 cnt; + u16 size; + u16 txsize; + u8 txbuf[0x8000]; + u16 rxsize; + u8 rxbuf[0x8000]; + u8 msg[100]; + +}LOOPBACKDATA, *PLOOPBACKDATA; +#endif + +struct _ADAPTER{ +#ifdef CONFIG_EASY_REPLACEMENT + int DriverState;// for disable driver using module, use dongle to replace module. + int bDongle;//build-in module or external dongle + +#endif +#ifdef PLATFORM_LINUX + int pid[3];//process id from UI, 0:wps, 1:hostapd, 2:dhcpcd +#endif + +#ifdef CONFIG_PROC_DEBUG + u16 chip_type; +#endif + + u16 HardwareType; + u16 interface_type;//USB,SDIO,SPI,PCI + u32 work_mode; //STA, AP, STA+AP, PROMISC, P2P + + struct dvobj_priv *dvobj; + struct mlme_priv mlmepriv; + struct mlme_ext_priv mlmeextpriv; + struct cmd_priv cmdpriv; + struct evt_priv evtpriv; + //struct io_queue *pio_queue; + struct io_priv iopriv; + struct xmit_priv xmitpriv; + struct recv_priv recvpriv; + struct sta_priv stapriv; + struct security_priv securitypriv; + struct registry_priv registrypriv; + struct pwrctrl_priv pwrctrlpriv; + struct eeprom_priv eeprompriv; +//TODO +// struct led_priv ledpriv; + + +#ifdef CONFIG_MP_INCLUDED + struct mp_priv mppriv; +#endif + +#ifdef CONFIG_DRVEXT_MODULE + struct drvext_priv drvextpriv; +#endif + +#if defined(CONFIG_HOSTAPD_MLME) && defined (CONFIG_AP_MODE) + struct hostapd_priv *phostapdpriv; +#endif + +#ifdef CONFIG_IOCTL_CFG80211 +#ifdef CONFIG_P2P + struct cfg80211_wifidirect_info cfg80211_wdinfo; +#endif //CONFIG_P2P +#endif //CONFIG_IOCTL_CFG80211 + +#ifdef CONFIG_P2P_NEW + struct wifidirect_info wdinfo; +#endif //CONFIG_P2P + +#ifdef CONFIG_TDLS + struct tdls_info tdlsinfo; +#endif //CONFIG_TDLS + +#ifdef CONFIG_WAPI_SUPPORT + u8 WapiSupport; + RT_WAPI_T wapiInfo; +#endif + + +#ifdef CONFIG_WFD + struct wifi_display_info wfd_info; +#endif //CONFIG_WFD + + PVOID HalData; + u32 hal_data_sz; + struct hal_ops HalFunc; + + s32 bDriverStopped; + s32 bSurpriseRemoved; + s32 bCardDisableWOHSM; + u8 RxStop; //Used to stop rx thread as early as possible + + u32 IsrContent; + u32 ImrContent; + + u8 EepromAddressSize; + u8 hw_init_completed; + u8 bDriverIsGoingToUnload; + u8 init_adpt_in_progress; + u8 bMpDriver; + +#ifdef CONFIG_AP_MODE + u8 bForwardingDisabled; +#endif + +#if defined(CONFIG_EVENT_THREAD_MODE) + _thread_hdl_ evtThread; +#endif +#if defined(CONFIG_ISR_THREAD_MODE_POLLING) || defined(CONFIG_ISR_THREAD_MODE_INTERRUPT) + struct task_struct isrThread; +#endif + struct task_struct cmdThread; +#ifdef CONFIG_XMIT_THREAD_MODE + struct task_struct xmitThread; +#endif +#if defined(CONFIG_RECV_THREAD_MODE) + struct task_struct recvThread; +#endif +#ifdef CONFIG_RECV_TASKLET_THREAD + struct task_struct recvtasklet_thread; +#endif +#ifdef CONFIG_XMIT_TASKLET_THREAD +#ifdef PLATFORM_LINUX + struct tasklet_struct xmit_tasklet; +#else + struct task_struct xmittasklet_thread; +#endif +#endif +#ifdef CONFIG_SDIO_XMIT_THREAD + struct task_struct SdioXmitThread; +#endif //CONFIG_XMIT_TASKLET_THREAD + + +#if !defined(PLATFORM_LINUX) && !defined(PLATFORM_ECOS) && !defined(PLATFORM_FREERTOS) && !defined(PLATFORM_CMSIS_RTOS) + NDIS_STATUS (*dvobj_init)(struct dvobj_priv *dvobj); + void (*dvobj_deinit)(struct dvobj_priv *dvobj); +#endif + + void (*intf_start)(_adapter * adapter); + void (*intf_stop)(_adapter * adapter); + +#ifdef PLATFORM_WINDOWS + _nic_hdl hndis_adapter;//hNdisAdapter(NDISMiniportAdapterHandle); + _nic_hdl hndis_config;//hNdisConfiguration; + NDIS_STRING fw_img; + + u32 NdisPacketFilter; + u8 MCList[MAX_MCAST_LIST_NUM][6]; + u32 MCAddrCount; +#endif //end of PLATFORM_WINDOWS + +#ifdef PLATFORM_ECOS + _nic_hdl pnetdev; + int bup; + struct net_device_stats stats; +#endif //#ifdef PLATFORM_ECOS + +#if defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) + _nic_hdl pnetdev; + int bup; + struct net_device_stats stats; +#endif //#ifdef PLATFORM_FREERTOS + +#ifdef PLATFORM_LINUX + _nic_hdl pnetdev; + + // used by rtw_rereg_nd_name related function + struct rereg_nd_name_data { + _nic_hdl old_pnetdev; + char old_ifname[IFNAMSIZ]; + u8 old_ips_mode; + u8 old_bRegUseLed; + } rereg_nd_name_priv; + + int bup; + struct net_device_stats stats; + struct iw_statistics iwstats; + struct proc_dir_entry *dir_dev;// for proc directory + +#ifdef CONFIG_IOCTL_CFG80211 + struct wireless_dev *rtw_wdev; +#endif //CONFIG_IOCTL_CFG80211 + +#endif //end of PLATFORM_LINUX + +#ifdef PLATFORM_FREEBSD + _nic_hdl pifp; + int bup; + _lock glock; +#endif //PLATFORM_FREEBSD + u8 net_closed; + + u8 bFWReady; + //u8 bBTFWReady; + //u8 bReadPortCancel; + //u8 bWritePortCancel; + u8 bLinkInfoDump; + u8 bRxRSSIDisplay; +#ifdef CONFIG_AUTOSUSPEND + u8 bDisableAutosuspend; +#endif + + _adapter *pbuddy_adapter; + + _mutex *hw_init_mutex; +#if defined(CONFIG_CONCURRENT_MODE) + u8 isprimary; //is primary adapter or not + u8 adapter_type; + u8 iface_type; //interface port type + + //for global synchronization + _mutex *ph2c_fwcmd_mutex; + _mutex *psetch_mutex; + _mutex *psetbw_mutex; + + struct co_data_priv *pcodatapriv;//data buffer shared among interfaces +#endif + +#ifdef CONFIG_BR_EXT + _lock br_ext_lock; + //unsigned int macclone_completed; + struct nat25_network_db_entry *nethash[NAT25_HASH_SIZE]; + int pppoe_connection_in_progress; + unsigned char pppoe_addr[MACADDRLEN]; + unsigned char scdb_mac[MACADDRLEN]; + unsigned char scdb_ip[4]; + struct nat25_network_db_entry *scdb_entry; + unsigned char br_mac[MACADDRLEN]; + unsigned char br_ip[4]; + + struct br_ext_info ethBrExtInfo; +#endif // CONFIG_BR_EXT + +#ifdef CONFIG_INTEL_PROXIM + /* intel Proximity, should be alloc mem + * in intel Proximity module and can only + * be used in intel Proximity mode */ + struct proxim proximity; +#endif //CONFIG_INTEL_PROXIM + +#ifdef CONFIG_MAC_LOOPBACK_DRIVER + PLOOPBACKDATA ploopback; +#endif + + u8 fix_rate; +#ifdef CONFIG_CAC_TEST + unsigned char in_cta_test; +#endif + /* This flag is used to dynamically enabling debug message if + certain sympton happen. Use iwpriv command to enable it */ +#if defined(CONFIG_DEBUG_DYNAMIC) + u8 debug_level; +#endif + +}; + +#define adapter_to_dvobj(adapter) (adapter->dvobj) +#define adapter_to_pwrctl(adapter) (&adapter->pwrctrlpriv) + +int rtw_handle_dualmac(_adapter *adapter, bool init); + +__inline static u8 *myid(struct eeprom_priv *peepriv) +{ + return (peepriv->mac_addr); +} + +#if 0 //#if (CONFIG_LWIP_LAYER == 0) +// For FPGA test program +#define _htons(x) (x) +#define _htons(x) (x) +#define _htons(x) (x) +#define _htons(x) (x) +#endif + +//fast reconnection function prototype +typedef int (*init_done_ptr)(void); +#endif //__DRV_TYPES_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ethernet.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ethernet.h new file mode 100644 index 0000000..e6c220e --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ethernet.h @@ -0,0 +1,42 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/*! \file */ +#ifndef __INC_ETHERNET_H +#define __INC_ETHERNET_H + +#define ETHERNET_ADDRESS_LENGTH 6 //!< Ethernet Address Length +#define ETHERNET_HEADER_SIZE 14 //!< Ethernet Header Length +#define LLC_HEADER_SIZE 6 //!< LLC Header Length +#define TYPE_LENGTH_FIELD_SIZE 2 //!< Type/Length Size +#define MINIMUM_ETHERNET_PACKET_SIZE 60 //!< Minimum Ethernet Packet Size +#define MAXIMUM_ETHERNET_PACKET_SIZE 1514 //!< Maximum Ethernet Packet Size + +#define RT_ETH_IS_MULTICAST(_pAddr) ((((u8 *)(_pAddr))[0]&0x01)!=0) //!< Is Multicast Address? +#define RT_ETH_IS_BROADCAST(_pAddr) ( \ + ((u8 *)(_pAddr))[0]==0xff && \ + ((u8 *)(_pAddr))[1]==0xff && \ + ((u8 *)(_pAddr))[2]==0xff && \ + ((u8 *)(_pAddr))[3]==0xff && \ + ((u8 *)(_pAddr))[4]==0xff && \ + ((u8 *)(_pAddr))[5]==0xff ) //!< Is Broadcast Address? + + +#endif // #ifndef __INC_ETHERNET_H + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com.h new file mode 100644 index 0000000..d096386 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com.h @@ -0,0 +1,287 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HAL_COMMON_H__ +#define __HAL_COMMON_H__ + +#include "HalVerDef.h" +#include "hal_pg.h" +#include "hal_intf.h" +#include "hal_phy.h" +#include "hal_phy_reg.h" +#include "hal_com_reg.h" +#include "hal_com_phycfg.h" + +//---------------------------------------------------------------------------- +// Rate Definition +//---------------------------------------------------------------------------- +//CCK +#define RATR_1M 0x00000001 +#define RATR_2M 0x00000002 +#define RATR_55M 0x00000004 +#define RATR_11M 0x00000008 +//OFDM +#define RATR_6M 0x00000010 +#define RATR_9M 0x00000020 +#define RATR_12M 0x00000040 +#define RATR_18M 0x00000080 +#define RATR_24M 0x00000100 +#define RATR_36M 0x00000200 +#define RATR_48M 0x00000400 +#define RATR_54M 0x00000800 +//MCS 1 Spatial Stream +#define RATR_MCS0 0x00001000 +#define RATR_MCS1 0x00002000 +#define RATR_MCS2 0x00004000 +#define RATR_MCS3 0x00008000 +#define RATR_MCS4 0x00010000 +#define RATR_MCS5 0x00020000 +#define RATR_MCS6 0x00040000 +#define RATR_MCS7 0x00080000 +//MCS 2 Spatial Stream +#define RATR_MCS8 0x00100000 +#define RATR_MCS9 0x00200000 +#define RATR_MCS10 0x00400000 +#define RATR_MCS11 0x00800000 +#define RATR_MCS12 0x01000000 +#define RATR_MCS13 0x02000000 +#define RATR_MCS14 0x04000000 +#define RATR_MCS15 0x08000000 + +//CCK +#define RATE_1M BIT(0) +#define RATE_2M BIT(1) +#define RATE_5_5M BIT(2) +#define RATE_11M BIT(3) +//OFDM +#define RATE_6M BIT(4) +#define RATE_9M BIT(5) +#define RATE_12M BIT(6) +#define RATE_18M BIT(7) +#define RATE_24M BIT(8) +#define RATE_36M BIT(9) +#define RATE_48M BIT(10) +#define RATE_54M BIT(11) +//MCS 1 Spatial Stream +#define RATE_MCS0 BIT(12) +#define RATE_MCS1 BIT(13) +#define RATE_MCS2 BIT(14) +#define RATE_MCS3 BIT(15) +#define RATE_MCS4 BIT(16) +#define RATE_MCS5 BIT(17) +#define RATE_MCS6 BIT(18) +#define RATE_MCS7 BIT(19) +//MCS 2 Spatial Stream +#define RATE_MCS8 BIT(20) +#define RATE_MCS9 BIT(21) +#define RATE_MCS10 BIT(22) +#define RATE_MCS11 BIT(23) +#define RATE_MCS12 BIT(24) +#define RATE_MCS13 BIT(25) +#define RATE_MCS14 BIT(26) +#define RATE_MCS15 BIT(27) + +// ALL CCK Rate +#define RATE_ALL_CCK RATR_1M|RATR_2M|RATR_55M|RATR_11M +#define RATE_ALL_OFDM_AG RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\ + RATR_36M|RATR_48M|RATR_54M +#define RATE_ALL_OFDM_1SS RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\ + RATR_MCS4|RATR_MCS5|RATR_MCS6 |RATR_MCS7 +#define RATE_ALL_OFDM_2SS RATR_MCS8|RATR_MCS9 |RATR_MCS10|RATR_MCS11|\ + RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15 + +/*------------------------------ Tx Desc definition Macro ------------------------*/ +//#pragma mark -- Tx Desc related definition. -- +//---------------------------------------------------------------------------- +//----------------------------------------------------------- +// Rate +//----------------------------------------------------------- +// CCK Rates, TxHT = 0 +#define DESC_RATE1M 0x00 +#define DESC_RATE2M 0x01 +#define DESC_RATE5_5M 0x02 +#define DESC_RATE11M 0x03 + +// OFDM Rates, TxHT = 0 +#define DESC_RATE6M 0x04 +#define DESC_RATE9M 0x05 +#define DESC_RATE12M 0x06 +#define DESC_RATE18M 0x07 +#define DESC_RATE24M 0x08 +#define DESC_RATE36M 0x09 +#define DESC_RATE48M 0x0a +#define DESC_RATE54M 0x0b + +// MCS Rates, TxHT = 1 +#define DESC_RATEMCS0 0x0c +#define DESC_RATEMCS1 0x0d +#define DESC_RATEMCS2 0x0e +#define DESC_RATEMCS3 0x0f +#define DESC_RATEMCS4 0x10 +#define DESC_RATEMCS5 0x11 +#define DESC_RATEMCS6 0x12 +#define DESC_RATEMCS7 0x13 +#define DESC_RATEMCS8 0x14 +#define DESC_RATEMCS9 0x15 +#define DESC_RATEMCS10 0x16 +#define DESC_RATEMCS11 0x17 +#define DESC_RATEMCS12 0x18 +#define DESC_RATEMCS13 0x19 +#define DESC_RATEMCS14 0x1a +#define DESC_RATEMCS15 0x1b +#define DESC_RATEMCS16 0x1C +#define DESC_RATEMCS17 0x1D +#define DESC_RATEMCS18 0x1E +#define DESC_RATEMCS19 0x1F +#define DESC_RATEMCS20 0x20 +#define DESC_RATEMCS21 0x21 +#define DESC_RATEMCS22 0x22 +#define DESC_RATEMCS23 0x23 +#define DESC_RATEMCS24 0x24 +#define DESC_RATEMCS25 0x25 +#define DESC_RATEMCS26 0x26 +#define DESC_RATEMCS27 0x27 +#define DESC_RATEMCS28 0x28 +#define DESC_RATEMCS29 0x29 +#define DESC_RATEMCS30 0x2A +#define DESC_RATEMCS31 0x2B + +#define DESC_RATEVHTSS1MCS0 0x2c +#define DESC_RATEVHTSS1MCS1 0x2d +#define DESC_RATEVHTSS1MCS2 0x2e +#define DESC_RATEVHTSS1MCS3 0x2f +#define DESC_RATEVHTSS1MCS4 0x30 +#define DESC_RATEVHTSS1MCS5 0x31 +#define DESC_RATEVHTSS1MCS6 0x32 +#define DESC_RATEVHTSS1MCS7 0x33 +#define DESC_RATEVHTSS1MCS8 0x34 +#define DESC_RATEVHTSS1MCS9 0x35 +#define DESC_RATEVHTSS2MCS0 0x36 +#define DESC_RATEVHTSS2MCS1 0x37 +#define DESC_RATEVHTSS2MCS2 0x38 +#define DESC_RATEVHTSS2MCS3 0x39 +#define DESC_RATEVHTSS2MCS4 0x3a +#define DESC_RATEVHTSS2MCS5 0x3b +#define DESC_RATEVHTSS2MCS6 0x3c +#define DESC_RATEVHTSS2MCS7 0x3d +#define DESC_RATEVHTSS2MCS8 0x3e +#define DESC_RATEVHTSS2MCS9 0x3f +#define DESC_RATEVHTSS3MCS0 0x40 +#define DESC_RATEVHTSS3MCS1 0x41 +#define DESC_RATEVHTSS3MCS2 0x42 +#define DESC_RATEVHTSS3MCS3 0x43 +#define DESC_RATEVHTSS3MCS4 0x44 +#define DESC_RATEVHTSS3MCS5 0x45 +#define DESC_RATEVHTSS3MCS6 0x46 +#define DESC_RATEVHTSS3MCS7 0x47 +#define DESC_RATEVHTSS3MCS8 0x48 +#define DESC_RATEVHTSS3MCS9 0x49 +#define DESC_RATEVHTSS4MCS0 0x4A +#define DESC_RATEVHTSS4MCS1 0x4B +#define DESC_RATEVHTSS4MCS2 0x4C +#define DESC_RATEVHTSS4MCS3 0x4D +#define DESC_RATEVHTSS4MCS4 0x4E +#define DESC_RATEVHTSS4MCS5 0x4F +#define DESC_RATEVHTSS4MCS6 0x50 +#define DESC_RATEVHTSS4MCS7 0x51 +#define DESC_RATEVHTSS4MCS8 0x52 +#define DESC_RATEVHTSS4MCS9 0x53 + +typedef enum _FIRMWARE_SOURCE { + FW_SOURCE_IMG_FILE = 0, + FW_SOURCE_HEADER_FILE = 1, //from header file +} FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; + +// BK, BE, VI, VO, HCCA, MANAGEMENT, COMMAND, HIGH, BEACON. +//#define MAX_TX_QUEUE 9 + +#define TX_SELE_HQ BIT(0) // High Queue +#define TX_SELE_LQ BIT(1) // Low Queue +#define TX_SELE_NQ BIT(2) // Normal Queue +#define TX_SELE_EQ BIT(3) // Extern Queue + +#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) +#define PageNum_256(_Len) (u32)(((_Len)>>8) + ((_Len)&0xFF ? 1:0)) +#define PageNum_512(_Len) (u32)(((_Len)>>9) + ((_Len)&0x1FF ? 1:0)) +#define PageNum(_Len, _Size) (u32)(((_Len)/(_Size)) + ((_Len)&((_Size) - 1) ? 1:0)) + +#define DYNAMIC_FUNC_DISABLE (0x0) +#define DYNAMIC_ALL_FUNC_ENABLE 0xFFFFFFF + +void dump_chip_info(HAL_VERSION ChipVersion); + + +u8 //return the final channel plan decision +hal_com_get_channel_plan( + IN PADAPTER padapter, + IN u8 hw_channel_plan, //channel plan from HW (efuse/eeprom) + IN u8 sw_channel_plan, //channel plan from SW (registry/module param) + IN u8 def_channel_plan, //channel plan used when the former two is invalid + IN BOOLEAN AutoLoadFail + ); + +u8 MRateToHwRate(u8 rate); + +void HalSetBrateCfg( + IN PADAPTER Adapter, + IN u8 *mBratesOS, + OUT u16 *pBrateCfg); + +BOOLEAN +Hal_MappingOutPipe( + IN PADAPTER pAdapter, + IN u8 NumOutPipe + ); + +BOOLEAN +HAL_IsLegalChannel( + IN _adapter * Adapter, + IN u32 Channel + ); + +void hal_init_macaddr(_adapter *adapter); +void SetHwReg(PADAPTER padapter, u8 variable, u8 *val); +void GetHwReg(PADAPTER padapter, u8 variable, u8 *val); + +#if defined (CONFIG_RTL8188F) || defined (CONFIG_RTL8711B) +typedef enum _RT_MEDIA_STATUS { + RT_MEDIA_DISCONNECT = 0, + RT_MEDIA_CONNECT = 1 +} RT_MEDIA_STATUS; + + +void GetHalODMVar( + PADAPTER Adapter, + HAL_ODM_VARIABLE eVariable, + PVOID pValue1, + PVOID pValue2); + +void SetHalODMVar( + PADAPTER Adapter, + HAL_ODM_VARIABLE eVariable, + PVOID pValue1, + BOOLEAN bSet); + +u8 SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value); +u8 GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value); +void rtw_hal_wow_enable(_adapter *adapter); +void rtw_hal_wow_disable(_adapter *adapter); +#endif +#endif //__HAL_COMMON_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com_phycfg.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com_phycfg.h new file mode 100644 index 0000000..5cb5366 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com_phycfg.h @@ -0,0 +1,288 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HAL_COM_PHYCFG_H__ +#define __HAL_COM_PHYCFG_H__ + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 + +typedef enum _RATE_SECTION { + CCK = 0, + OFDM, + HT_MCS0_MCS7, + HT_MCS8_MCS15, + HT_MCS16_MCS23, + HT_MCS24_MCS31, + VHT_1SSMCS0_1SSMCS9, + VHT_2SSMCS0_2SSMCS9, + VHT_3SSMCS0_3SSMCS9, + VHT_4SSMCS0_4SSMCS9, +} RATE_SECTION; + +typedef enum _RF_TX_NUM { + RF_1TX = 0, + RF_2TX, + RF_3TX, + RF_4TX, + RF_MAX_TX_NUM, + RF_TX_NUM_NONIMPLEMENT, +} RF_TX_NUM; + +#define MAX_POWER_INDEX 0x3F + +typedef enum _REGULATION_TXPWR_LMT { + TXPWR_LMT_FCC = 0, + TXPWR_LMT_MKK = 1, + TXPWR_LMT_ETSI = 2, + TXPWR_LMT_WW = 3, // WW13, The mininum of ETSI,MKK + TXPWR_LMT_GL = 4, // Global, The mininum of ETSI,MKK,FCC + TXPWR_LMT_MAX_REGULATION_NUM = 5 +} REGULATION_TXPWR_LMT; + +/*------------------------------Define structure----------------------------*/ +typedef struct _BB_REGISTER_DEFINITION{ + u32 rfintfs; // set software control: + // 0x870~0x877[8 bytes] + + u32 rfintfo; // output data: + // 0x860~0x86f [16 bytes] + + u32 rfintfe; // output enable: + // 0x860~0x86f [16 bytes] + + u32 rf3wireOffset; // LSSI data: + // 0x840~0x84f [16 bytes] + + u32 rfHSSIPara2; // wire parameter control2 : + // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes] + + u32 rfLSSIReadBack; //LSSI RF readback data SI mode + // 0x8a0~0x8af [16 bytes] + + u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B + +}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T; + + +//---------------------------------------------------------------------- +s32 +phy_TxPwrIdxToDbm( + IN PADAPTER Adapter, + IN WIRELESS_MODE WirelessMode, + IN u8 TxPwrIdx + ); + +u8 +PHY_GetTxPowerByRateBase( + IN PADAPTER Adapter, + IN u8 Band, + IN u8 RfPath, + IN u8 TxNum, + IN RATE_SECTION RateSection + ); + +u8 +PHY_GetRateSectionIndexOfTxPowerByRate( + IN PADAPTER pAdapter, + IN u32 RegAddr, + IN u32 BitMask + ); + +VOID +PHY_GetRateValuesOfTxPowerByRate( + IN PADAPTER pAdapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Value, + OUT u8* RateIndex, + OUT s8* PwrByRateVal, + OUT u8* RateNum + ); + +u8 +PHY_GetRateIndexOfTxPowerByRate( + IN u8 Rate + ); + +VOID +PHY_SetTxPowerIndexByRateSection( + IN PADAPTER pAdapter, + IN u8 RFPath, + IN u8 Channel, + IN u8 RateSection + ); + +s8 +PHY_GetTxPowerByRate( + IN PADAPTER pAdapter, + IN u8 Band, + IN u8 RFPath, + IN u8 TxNum, + IN u8 RateIndex + ); + +VOID +PHY_SetTxPowerByRate( + IN PADAPTER pAdapter, + IN u8 Band, + IN u8 RFPath, + IN u8 TxNum, + IN u8 Rate, + IN s8 Value + ); + +VOID +PHY_SetTxPowerLevelByPath( + IN PADAPTER Adapter, + IN u8 channel, + IN u8 path + ); + +VOID +PHY_SetTxPowerIndexByRateArray( + IN PADAPTER pAdapter, + IN u8 RFPath, + IN CHANNEL_WIDTH BandWidth, + IN u8 Channel, + IN u8* Rates, + IN u8 RateArraySize + ); + +VOID +PHY_InitTxPowerByRate( + IN PADAPTER pAdapter + ); + +VOID +PHY_StoreTxPowerByRate( + IN PADAPTER pAdapter, + IN u32 Band, + IN u32 RfPath, + IN u32 TxNum, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); + +VOID +PHY_TxPowerByRateConfiguration( + IN PADAPTER pAdapter + ); + +u8 +PHY_GetTxPowerIndexBase( + IN PADAPTER pAdapter, + IN u8 RFPath, + IN u8 Rate, + IN CHANNEL_WIDTH BandWidth, + IN u8 Channel, + OUT PBOOLEAN bIn24G + ); + +s8 +PHY_GetTxPowerLimit( + IN PADAPTER Adapter, + IN u32 RegPwrTblSel, + IN BAND_TYPE Band, + IN CHANNEL_WIDTH Bandwidth, + IN u8 RfPath, + IN u8 DataRate, + IN u8 Channel + ); + +VOID +PHY_SetTxPowerLimit( + IN PADAPTER Adapter, + IN u8 Regulation, + IN u8 Band, + IN u8 Bandwidth, + IN u8 RateSection, + IN u8 RfPath, + IN u8 Channel, + IN u8 PowerLimit + ); + +VOID +PHY_ConvertTxPowerLimitToPowerIndex( + IN PADAPTER Adapter + ); + +VOID +PHY_InitTxPowerLimit( + IN PADAPTER Adapter + ); + +s8 +PHY_GetTxPowerTrackingOffset( + PADAPTER pAdapter, + u8 Rate, + u8 RFPath + ); + +u8 +PHY_GetTxPowerIndex( + IN PADAPTER pAdapter, + IN u8 RFPath, + IN u8 Rate, + IN CHANNEL_WIDTH BandWidth, + IN u8 Channel + ); + +VOID +PHY_SetTxPowerIndex( + IN PADAPTER pAdapter, + IN u32 PowerIndex, + IN u8 RFPath, + IN u8 Rate + ); + +#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE +#define MAX_PARA_FILE_BUF_LEN 25600 + +#define LOAD_MAC_PARA_FILE BIT0 +#define LOAD_BB_PARA_FILE BIT1 +#define LOAD_BB_PG_PARA_FILE BIT2 +#define LOAD_BB_MP_PARA_FILE BIT3 +#define LOAD_RF_PARA_FILE BIT4 +#define LOAD_RF_TXPWR_TRACK_PARA_FILE BIT5 +#define LOAD_RF_TXPWR_LMT_PARA_FILE BIT6 + +int phy_ConfigMACWithParaFile(IN PADAPTER Adapter, IN char* pFileName); + +int phy_ConfigBBWithParaFile(IN PADAPTER Adapter, IN char* pFileName, IN u32 ConfigType); + +int phy_ConfigBBWithPgParaFile(IN PADAPTER Adapter, IN char* pFileName); + +int phy_ConfigBBWithMpParaFile(IN PADAPTER Adapter, IN char* pFileName); + +int PHY_ConfigRFWithParaFile(IN PADAPTER Adapter, IN char* pFileName, IN u8 eRFPath); + +int PHY_ConfigRFWithTxPwrTrackParaFile(IN PADAPTER Adapter, IN char* pFileName); + +int PHY_ConfigRFWithPowerLimitTableParaFile(IN PADAPTER Adapter, IN char* pFileName); + +void phy_free_filebuf(_adapter *padapter); +#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE + + +#endif //__HAL_COMMON_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com_reg.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com_reg.h index 7c9dde0..4e176f4 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com_reg.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_com_reg.h @@ -20,6 +20,7 @@ #ifndef __HAL_COMMON_REG_H__ #define __HAL_COMMON_REG_H__ + #define MAC_ADDR_LEN 6 #define HAL_NAV_UPPER_UNIT 128 // micro-second @@ -39,21 +40,20 @@ // //----------------------------------------------------- #define REG_SYS_ISO_CTRL 0x0000 -#define REG_SYS_FUNC_EN 0x0002 +#define REG_SYS_FUNC_EN 0x0002 #define REG_APS_FSMCO 0x0004 #define REG_SYS_CLKR 0x0008 -#define REG_SYS_CLK_CTRL REG_SYS_CLKR #define REG_9346CR 0x000A -#define REG_SYS_EEPROM_CTRL 0x000A +#define REG_SYS_EEPROM_CTRL 0x000A #define REG_EE_VPD 0x000C #define REG_AFE_MISC 0x0010 #define REG_SPS0_CTRL 0x0011 #define REG_SPS0_CTRL_6 0x0016 #define REG_POWER_OFF_IN_PROCESS 0x0017 -#define REG_SPS_OCP_CFG 0x0018 +#define REG_SPS_OCP_CFG 0x0018 #define REG_RSV_CTRL 0x001C #define REG_RF_CTRL 0x001F -#define REG_LDOA15_CTRL 0x0020 +#define REG_LDOA15_CTRL 0x0020 #define REG_LDOV12D_CTRL 0x0021 #define REG_LDOHCI12_CTRL 0x0022 #define REG_LPLDO_CTRL 0x0023 @@ -67,9 +67,9 @@ #define REG_PWR_DATA 0x0038 #define REG_CAL_TIMER 0x003C #define REG_ACLK_MON 0x003E -#define REG_GPIO_MUXCFG 0x0040 +#define REG_GPIO_MUXCFG 0x0040 #define REG_GPIO_IO_SEL 0x0042 -#define REG_MAC_PINMUX_CFG 0x0043 +#define REG_MAC_PINMUX_CFG 0x0043 #define REG_GPIO_PIN_CTRL 0x0044 #define REG_GPIO_INTM 0x0048 #define REG_LEDCFG0 0x004C @@ -80,18 +80,18 @@ #define REG_FSISR 0x0054 #define REG_HSIMR 0x0058 #define REG_HSISR 0x005c -#define REG_GPIO_PIN_CTRL_2 0x0060 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Pin Control. +#define REG_GPIO_PIN_CTRL_2 0x0060 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Pin Control. #define REG_GPIO_IO_SEL_2 0x0062 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Select. -#define REG_MULTI_FUNC_CTRL 0x0068 // RTL8723 WIFI/BT/GPS Multi-Function control source. +#define REG_MULTI_FUNC_CTRL 0x0068 // RTL8723 WIFI/BT/GPS Multi-Function control source. #define REG_GSSR 0x006c #define REG_AFE_XTAL_CTRL_EXT 0x0078 //RTL8188E #define REG_XCK_OUT_CTRL 0x007c //RTL8188E -#define REG_MCUFWDL 0x0080 +#define REG_MCUFWDL 0x0080 #define REG_WOL_EVENT 0x0081 //RTL8188E #define REG_MCUTSTCFG 0x0084 #define REG_FDHM0 0x0088 #define REG_HOST_SUSP_CNT 0x00BC // RTL8192C Host suspend counter on FPGA platform -#define REG_SYSTEM_ON_CTRL 0x00CC // For 8723AE Reset after S3 +#define REG_SYSTEM_ON_CTRL 0x00CC // For 8723AE Reset after S3 #define REG_EFUSE_ACCESS 0x00CF // Efuse access protection for RTL8723 #define REG_BIST_SCAN 0x00D0 #define REG_BIST_RPT 0x00D4 @@ -101,13 +101,17 @@ #define REG_PCIE_MIO_INTD 0x00E8 #define REG_HPON_FSM 0x00EC #define REG_SYS_CFG 0x00F0 -#define REG_GPIO_OUTSTS 0x00F4 // For RTL8723 only. +#define REG_GPIO_OUTSTS 0x00F4 // For RTL8723 only. #define REG_TYPE_ID 0x00FC -// -// 2010/12/29 MH Add for 92D -// -#define REG_MAC_PHY_CTRL_NORMAL 0x00f8 + +#define REG_WL_CLK_CTRL 0x0002 +#define REG_WL_FUNC_EN 0x0004 +#define REG_WL_PMC_CTRL 0x0020 +#define REG_WL_AFE_CTRL 0x0050 +#define REG_WL_PMC_IMR 0x0080 +#define REG_WL_PMC_ISR 0x0084 + //----------------------------------------------------- // @@ -117,7 +121,7 @@ #define REG_CR 0x0100 #define REG_PBP 0x0104 #define REG_PKT_BUFF_ACCESS_CTRL 0x0106 -#define REG_TRXDMA_CTRL 0x010C +#define REG_TRXDMA_CTRL 0x010C #define REG_TRXFF_BNDY 0x0114 #define REG_TRXFF_STATUS 0x0118 #define REG_RXFF_PTR 0x011C @@ -130,25 +134,25 @@ #define REG_FWISR 0x0134 #define REG_FTIMR 0x0138 #define REG_FTISR 0x013C //RTL8192C -#define REG_PKTBUF_DBG_CTRL 0x0140 +#define REG_PKTBUF_DBG_CTRL 0x0140 #define REG_RXPKTBUF_CTRL (REG_PKTBUF_DBG_CTRL+2) #define REG_PKTBUF_DBG_DATA_L 0x0144 -#define REG_PKTBUF_DBG_DATA_H 0x0148 +#define REG_PKTBUF_DBG_DATA_H 0x0148 #define REG_TC0_CTRL 0x0150 #define REG_TC1_CTRL 0x0154 #define REG_TC2_CTRL 0x0158 #define REG_TC3_CTRL 0x015C #define REG_TC4_CTRL 0x0160 -#define REG_TCUNIT_BASE 0x0164 -#define REG_MBIST_START 0x0174 +#define REG_TCUNIT_BASE 0x0164 +#define REG_MBIST_START 0x0174 #define REG_MBIST_DONE 0x0178 #define REG_MBIST_FAIL 0x017C #define REG_32K_CTRL 0x0194 //RTL8188E -#define REG_C2HEVT_MSG_NORMAL 0x01A0 +#define REG_C2HEVT_MSG_NORMAL 0x01A0 #define REG_C2HEVT_CLEAR 0x01AF #define REG_MCUTST_1 0x01c0 -#define REG_MCUTST_WOWLAN 0x01C7 // Defined after 8188E series. +#define REG_MCUTST_WOWLAN 0x01C7 // Defined after 8188E series. #define REG_FMETHR 0x01C8 #define REG_HMETFR 0x01CC #define REG_HMEBOX_0 0x01D0 @@ -156,10 +160,6 @@ #define REG_HMEBOX_2 0x01D8 #define REG_HMEBOX_3 0x01DC #define REG_LLT_INIT 0x01E0 -#define REG_HMEBOX_EXT_0 0x01F0 -#define REG_HMEBOX_EXT_1 0x01F4 -#define REG_HMEBOX_EXT_2 0x01F8 -#define REG_HMEBOX_EXT_3 0x01FC //----------------------------------------------------- // @@ -174,14 +174,17 @@ #define REG_RQPN_NPQ 0x0214 #define REG_AUTO_LLT 0x0224 + //----------------------------------------------------- // // 0x0280h ~ 0x02FFh RXDMA Configuration // //----------------------------------------------------- -#define REG_RXDMA_AGG_PG_TH 0x0280 +#define REG_RXDMA_AGG_PG_TH 0x0280 #define REG_RXPKT_NUM 0x0284 #define REG_RXDMA_STATUS 0x0288 +#define REG_C2H_PKT_8723B 0x0294 + //----------------------------------------------------- // @@ -189,62 +192,110 @@ // //----------------------------------------------------- #define REG_PCIE_CTRL_REG 0x0300 -#define REG_INT_MIG 0x0304 /* Interrupt Migration */ -#define REG_BCNQ_DESA 0x0308 /* TX Beacon Descriptor Address */ -#define REG_HQ_DESA 0x0310 /* TX High Queue Descriptor Address */ -#define REG_MGQ_DESA 0x0318 /* TX Manage Queue Descriptor Address */ -#define REG_VOQ_DESA 0x0320 /* TX VO Queue Descriptor Address */ -#define REG_VIQ_DESA 0x0328 /* TX VI Queue Descriptor Address */ -#define REG_BEQ_DESA 0x0330 /* TX BE Queue Descriptor Address */ -#define REG_BKQ_DESA 0x0338 /* TX BK Queue Descriptor Address */ -#define REG_RX_DESA 0x0340 /* RX Queue Descriptor Address */ +#define REG_INT_MIG 0x0304 // Interrupt Migration +#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address +#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address +#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address +#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address +#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address +#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address +#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address +#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address //sherry added for DBI Read/Write 20091126 -#define REG_DBI_WDATA 0x0348 /* Backdoor REG for Access Configuration */ -#define REG_DBI_RDATA 0x034C /* Backdoor REG for Access Configuration */ -#define REG_DBI_CTRL 0x0350 /* Backdoor REG for Access Configuration */ -#define REG_DBI_FLAG 0x0352 /* Backdoor REG for Access Configuration */ -#define REG_MDIO 0x0354 /* MDIO for Access PCIE PHY */ -#define REG_DBG_SEL 0x0360 /* Debug Selection Register */ -#define REG_PCIE_HRPWM 0x0361 /* PCIe RPWM */ -#define REG_PCIE_HCPWM 0x0363 /* PCIe CPWM */ +#define REG_DBI_WDATA 0x0348 // Backdoor REG for Access Configuration +#define REG_DBI_RDATA 0x034C //Backdoor REG for Access Configuration +#define REG_DBI_CTRL 0x0350 //Backdoor REG for Access Configuration +#define REG_DBI_FLAG 0x0352 //Backdoor REG for Access Configuration +#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY +#define REG_DBG_SEL 0x0360 // Debug Selection Register +#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM +#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM #define REG_WATCH_DOG 0x0368 -#define REG_RX_RXBD_NUM 0x0382 -// RTL8723 series ------------------------------- -#define REG_PCIE_HISR_EN 0x0394 /* PCIE Local Interrupt Enable Register */ -#define REG_PCIE_HISR 0x03A0 -#define REG_PCIE_HISRE 0x03A4 -#define REG_PCIE_HIMR 0x03A8 -#define REG_PCIE_HIMRE 0x03AC +// For new buffer descriptor ring architecture -#define REG_USB_HIMR 0xFE38 -#define REG_USB_HIMRE 0xFE3C -#define REG_USB_HISR 0xFE78 -#define REG_USB_HISRE 0xFE7C +#define REG_LX_CTRL1 0x0300 // 4 Bytes + +#define REG_BCNQ_TXBD_DESA 0x0308 // 8 Bytes +#define REG_MGQ_TXBD_DESA 0x0310 // 8 Bytes +#define REG_VOQ_TXBD_DESA 0x0318 // 8 Bytes +#define REG_VIQ_TXBD_DESA 0x0320 // 8 Bytes +#define REG_BEQ_TXBD_DESA 0x0328 // 8 Bytes +#define REG_BKQ_TXBD_DESA 0x0330 // 8 Bytes +#define REG_RXQ_RXBD_DESA 0x0338 // 8 Bytes +#define REG_HI0Q_TXBD_DESA 0x0340 // 8 Bytes +#define REG_HI1Q_TXBD_DESA 0x0348 // 8 Bytes +#define REG_HI2Q_TXBD_DESA 0x0350 // 8 Bytes +#define REG_HI3Q_TXBD_DESA 0x0358 // 8 Bytes +#define REG_HI4Q_TXBD_DESA 0x0360 // 8 Bytes +#define REG_HI5Q_TXBD_DESA 0x0368 // 8 Bytes +#define REG_HI6Q_TXBD_DESA 0x0370 // 8 Bytes +#define REG_HI7Q_TXBD_DESA 0x0378 // 8 Bytes + +#define REG_MGQ_TXBD_NUM 0x0380 // 2 Bytes +#define REG_RX_RXBD_NUM 0x0382 // 2 Bytes +#define REG_VOQ_TXBD_NUM 0x0384 // 2 Bytes +#define REG_VIQ_TXBD_NUM 0x0386 // 2 Bytes +#define REG_BEQ_TXBD_NUM 0x0388 // 2 Bytes +#define REG_BKQ_TXBD_NUM 0x038A // 2 Bytes +#define REG_HI0Q_TXBD_NUM 0x038C // 2 Bytes +#define REG_HI1Q_TXBD_NUM 0x038E // 2 Bytes +#define REG_HI2Q_TXBD_NUM 0x0390 // 2 Bytes +#define REG_HI3Q_TXBD_NUM 0x0392 // 2 Bytes +#define REG_HI4Q_TXBD_NUM 0x0394 // 2 Bytes +#define REG_HI5Q_TXBD_NUM 0x0396 // 2 Bytes +#define REG_HI6Q_TXBD_NUM 0x0398 // 2 Bytes +#define REG_HI7Q_TXBD_NUM 0x039A // 2 Bytes + +#define REG_BD_RWPTR_CLR 0x039C // 4 Bytes +#define REG_VOQ_TXBD_IDX 0x03A0 // 4 Bytes +#define REG_VIQ_TXBD_IDX 0x03A4 // 4 Bytes +#define REG_BEQ_TXBD_IDX 0x03A8 // 4 Bytes +#define REG_BKQ_TXBD_IDX 0x03AC // 4 Bytes +#define REG_MGQ_TXBD_IDX 0x03B0 // 4 Bytes +#define REG_RXQ_RXBD_IDX 0x03B4 // 4 Bytes +#define REG_HI0Q_TXBD_IDX 0x03B8 // 4 Bytes +#define REG_HI1Q_TXBD_IDX 0x03BC // 4 Bytes +#define REG_HI2Q_TXBD_IDX 0x03C0 // 4 Bytes +#define REG_HI3Q_TXBD_IDX 0x03C4 // 4 Bytes +#define REG_HI4Q_TXBD_IDX 0x03C8 // 4 Bytes +#define REG_HI5Q_TXBD_IDX 0x03CC // 4 Bytes +#define REG_HI6Q_TXBD_IDX 0x03D0 // 4 Bytes +#define REG_HI7Q_TXBD_IDX 0x03D4 // 4 Bytes + +//CPWM &RPWM +#define REG_LX_HRPWM_8711B 0x03D9 // 1 Bytes +#define REG_LX_HCPWM_8711B 0x03DA // 1 Bytes //from 0x14c + +#define REG_LX_CTRL2 0x03DB // 1 Bytes + +#define REG_LX_HRPWM2_8711B 0x03DC // 2 Bytes //REG_LX_HCPWM1_8711B +#define REG_LX_HCPWM2_8711B 0x03DE // 2 Bytes +#define REG_LX_H2C_MSG_V1 0x03E0 // 4 Bytes +#define REG_LX_C2H_MSG_V1 0x03E4 // 4 Bytes + + +#define REG_LX_DMA_ISR 0x03E8 // 4 Bytes +#define REG_LX_DMA_IMR 0x03EC // 4 Bytes +#define REG_LX_DMA_DBG 0x03F0 // 4 Bytes + +#define REG_BUS_MIX_CFG 0x03F8 // 4 Bytes# +#define REG_BUS_MIX_CFG1 0x03FC // 4 Bytes //----------------------------------------------------- // // 0x0400h ~ 0x047Fh Protocol Configuration // //----------------------------------------------------- - -/* 92C, 92D */ -#define REG_VOQ_INFO 0x0400 -#define REG_VIQ_INFO 0x0404 -#define REG_BEQ_INFO 0x0408 -#define REG_BKQ_INFO 0x040C - -/* 88E, 8723A, 8812A, 8821A, 92E, 8723B */ -#define REG_Q0_INFO 0x400 -#define REG_Q1_INFO 0x404 -#define REG_Q2_INFO 0x408 -#define REG_Q3_INFO 0x40C - -#define REG_MGQ_INFO 0x0410 -#define REG_HGQ_INFO 0x0414 -#define REG_BCNQ_INFO 0x0418 -#define REG_TXPKT_EMPTY 0x041A -#define REG_CPU_MGQ_INFORMATION 0x041C +#define REG_VOQ_INFORMATION 0x0400 +#define REG_VIQ_INFORMATION 0x0404 +#define REG_BEQ_INFORMATION 0x0408 +#define REG_BKQ_INFORMATION 0x040C +#define REG_MGQ_INFORMATION 0x0410 +#define REG_HGQ_INFORMATION 0x0414 +#define REG_BCNQ_INFORMATION 0x0418 +#define REG_TXPKT_EMPTY 0x041A +#define REG_CPU_MGQ_INFORMATION 0x041C #define REG_FWHW_TXQ_CTRL 0x0420 #define REG_HWSEQ_CTRL 0x0423 #define REG_BCNQ_BDNY 0x0424 @@ -263,54 +314,36 @@ #define REG_BCNQ1_BDNY 0x0457 #define REG_AGGLEN_LMT 0x0458 -#define REG_AMPDU_MIN_SPACE 0x045C -#define REG_WMAC_LBK_BF_HD 0x045D +#define REG_AMPDU_MIN_SPACE 0x045C +#define REG_WMAC_LBK_BF_HD 0x045D #define REG_FAST_EDCA_CTRL 0x0460 #define REG_RD_RESP_PKT_TH 0x0463 -/* 8723A, 8812A, 8821A, 92E, 8723B */ -#define REG_Q4_INFO 0x468 -#define REG_Q5_INFO 0x46C -#define REG_Q6_INFO 0x470 -#define REG_Q7_INFO 0x474 - #define REG_INIRTS_RATE_SEL 0x0480 -#define REG_INIDATA_RATE_SEL 0x0484 - -/* 8723B, 92E, 8812A, 8821A*/ +//#define REG_INIDATA_RATE_SEL 0x0484 #define REG_MACID_SLEEP_3 0x0484 #define REG_MACID_SLEEP_1 0x0488 #define REG_POWER_STAGE1 0x04B4 #define REG_POWER_STAGE2 0x04B8 -#define REG_PKT_VO_VI_LIFE_TIME 0x04C0 -#define REG_PKT_BE_BK_LIFE_TIME 0x04C2 +#define REG_PKT_VO_VI_LIFE_TIME 0x04C0 +#define REG_PKT_BE_BK_LIFE_TIME 0x04C2 #define REG_STBC_SETTING 0x04C4 #define REG_QUEUE_CTRL 0x04C6 #define REG_SINGLE_AMPDU_CTRL 0x04c7 -#define REG_PROT_MODE_CTRL 0x04C8 +#define REG_PROT_MODE_CTRL 0x04C8 #define REG_MAX_AGGR_NUM 0x04CA #define REG_RTS_MAX_AGGR_NUM 0x04CB #define REG_BAR_MODE_CTRL 0x04CC -#define REG_RA_TRY_RATE_AGG_LMT 0x04CF - -/* 8723A */ -#define REG_MACID_DROP 0x04D0 - -/* 88E */ -#define REG_EARLY_MODE_CONTROL 0x04D0 - -/* 8723B, 92E, 8812A, 8821A */ -#define REG_MACID_SLEEP_2 0x04D0 - -/* 8723A, 8723B, 92E, 8812A, 8821A */ -#define REG_MACID_SLEEP 0x04D4 - +#define REG_RA_TRY_RATE_AGG_LMT 0x04CF +//#define REG_EARLY_MODE_CONTROL 0x04D0 +#define REG_MACID_SLEEP_2 0x04D0 +#define REG_MACID_SLEEP 0x04D4 #define REG_NQOS_SEQ 0x04DC -#define REG_QOS_SEQ 0x04DE -#define REG_NEED_CPU_HANDLE 0x04E0 +#define REG_QOS_SEQ 0x04DE +#define REG_NEED_CPU_HANDLE 0x04E0 #define REG_PKT_LOSE_RPT 0x04E1 -#define REG_PTCL_ERR_STATUS 0x04E2 +#define REG_PTCL_ERR_STATUS 0x04E2 #define REG_TX_RPT_CTRL 0x04EC #define REG_TX_RPT_TIME 0x04F0 // 2 byte #define REG_DUMMY 0x04FC @@ -325,12 +358,12 @@ #define REG_EDCA_BE_PARAM 0x0508 #define REG_EDCA_BK_PARAM 0x050C #define REG_BCNTCFG 0x0510 -#define REG_PIFS 0x0512 +#define REG_PIFS 0x0512 #define REG_RDG_PIFS 0x0513 #define REG_SIFS_CTX 0x0514 #define REG_SIFS_TRX 0x0516 #define REG_TSFTR_SYN_OFFSET 0x0518 -#define REG_AGGR_BREAK_TIME 0x051A +#define REG_AGGR_BREAK_TIME 0x051A #define REG_SLOT 0x051B #define REG_TX_PTCL_CTRL 0x0520 #define REG_TXPAUSE 0x0522 @@ -361,9 +394,9 @@ #define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE #define REG_DRVERLYINT 0x0558 #define REG_BCNDMATIM 0x0559 -#define REG_ATIMWND 0x055A +#define REG_ATIMWND 0x055A #define REG_USTIME_TSF 0x055C -#define REG_BCN_MAX_ERR 0x055D +#define REG_BCN_MAX_ERR 0x055D #define REG_RXTSF_OFFSET_CCK 0x055E #define REG_RXTSF_OFFSET_OFDM 0x055F #define REG_TSFTR 0x0560 @@ -375,17 +408,17 @@ #define REG_TIMER1 0x0588 #define REG_ACMHWCTRL 0x05C0 #define REG_NOA_DESC_SEL 0x05CF -#define REG_NOA_DESC_DURATION 0x05E0 +#define REG_NOA_DESC_DURATION 0x05E0 #define REG_NOA_DESC_INTERVAL 0x05E4 -#define REG_NOA_DESC_START 0x05E8 -#define REG_NOA_DESC_COUNT 0x05EC +#define REG_NOA_DESC_START 0x05E8 +#define REG_NOA_DESC_COUNT 0x05EC #define REG_DMC 0x05F0 //Dual MAC Co-Existence Register #define REG_SCH_TX_CMD 0x05F8 -#define REG_FW_RESET_TSF_CNT_1 0x05FC -#define REG_FW_RESET_TSF_CNT_0 0x05FD -#define REG_FW_BCN_DIS_CNT 0x05FE +#define REG_FW_RESET_TSF_CNT_1 0x05FC +#define REG_FW_RESET_TSF_CNT_0 0x05FD +#define REG_FW_BCN_DIS_CNT 0x05FE //----------------------------------------------------- // @@ -397,7 +430,7 @@ #define REG_TCR 0x0604 #define REG_RCR 0x0608 #define REG_RX_PKT_LIMIT 0x060C -#define REG_RX_DLK_TIME 0x060D +#define REG_RX_DLK_TIME 0x060D #define REG_RX_DRVINFO_SZ 0x060F #define REG_MACID 0x0610 @@ -405,34 +438,35 @@ #define REG_MAR 0x0620 #define REG_MBIDCAMCFG 0x0628 -#define REG_PNO_STATUS 0x0631 -#define REG_USTIME_EDCA 0x0638 +#define REG_USTIME_EDCA 0x0638 #define REG_MAC_SPEC_SIFS 0x063A // 20100719 Joseph: Hardware register definition change. (HW datasheet v54) #define REG_RESP_SIFS_CCK 0x063C // [15:8]SIFS_R2T_OFDM, [7:0]SIFS_R2T_CCK -#define REG_RESP_SIFS_OFDM 0x063E // [15:8]SIFS_T2T_OFDM, [7:0]SIFS_T2T_CCK +#define REG_RESP_SIFS_OFDM 0x063E // [15:8]SIFS_T2T_OFDM, [7:0]SIFS_T2T_CCK #define REG_ACKTO 0x0640 #define REG_CTS2TO 0x0641 -#define REG_EIFS 0x0642 +#define REG_EIFS 0x0642 + +#define REG_PORT_CTRL 0x076D //RXERR_RPT #define RXERR_TYPE_OFDM_PPDU 0 #define RXERR_TYPE_OFDM_FALSE_ALARM 1 #define RXERR_TYPE_OFDM_MPDU_OK 2 -#define RXERR_TYPE_OFDM_MPDU_FAIL 3 +#define RXERR_TYPE_OFDM_MPDU_FAIL 3 #define RXERR_TYPE_CCK_PPDU 4 -#define RXERR_TYPE_CCK_FALSE_ALARM 5 -#define RXERR_TYPE_CCK_MPDU_OK 6 +#define RXERR_TYPE_CCK_FALSE_ALARM 5 +#define RXERR_TYPE_CCK_MPDU_OK 6 #define RXERR_TYPE_CCK_MPDU_FAIL 7 #define RXERR_TYPE_HT_PPDU 8 -#define RXERR_TYPE_HT_FALSE_ALARM 9 +#define RXERR_TYPE_HT_FALSE_ALARM 9 #define RXERR_TYPE_HT_MPDU_TOTAL 10 #define RXERR_TYPE_HT_MPDU_OK 11 #define RXERR_TYPE_HT_MPDU_FAIL 12 #define RXERR_TYPE_RX_FULL_DROP 15 -#define RXERR_COUNTER_MASK 0xFFFFF +#define RXERR_COUNTER_MASK 0xFFFFF #define RXERR_RPT_RST BIT(27) #define _RXERR_RPT_SEL(type) ((type) << 28) @@ -459,7 +493,7 @@ // Security #define REG_CAMCMD 0x0670 #define REG_CAMWRITE 0x0674 -#define REG_CAMREAD 0x0678 +#define REG_CAMREAD 0x0678 #define REG_CAMDBG 0x067C #define REG_SECCFG 0x0680 @@ -467,27 +501,30 @@ #define REG_WOW_CTRL 0x0690 #define REG_PS_RX_INFO 0x0692 #define REG_UAPSD_TID 0x0693 -#define REG_WKFMCAM_CMD 0x0698 -#define REG_WKFMCAM_NUM REG_WKFMCAM_CMD -#define REG_WKFMCAM_RWD 0x069C +#define REG_WKFMCAM_CMD 0x0698 +#define REG_WKFMCAM_NUM REG_WKFMCAM_CMD +#define REG_WKFMCAM_RWD 0x069C #define REG_RXFLTMAP0 0x06A0 #define REG_RXFLTMAP1 0x06A2 #define REG_RXFLTMAP2 0x06A4 -#define REG_BCN_PSR_RPT 0x06A8 +#define REG_BCN_PSR_RPT 0x06A8 #define REG_BT_COEX_TABLE 0x06C0 // Hardware Port 2 #define REG_MACID1 0x0700 #define REG_BSSID1 0x0708 +/* port0 & port1 enable */ +#define REG_PORT_CTRL 0x76D + //----------------------------------------------------- // // 0xFE00h ~ 0xFE55h USB Configuration // //----------------------------------------------------- #define REG_USB_INFO 0xFE17 -#define REG_USB_SPECIAL_OPTION 0xFE55 -#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B #define REG_USB_AGG_TO 0xFE5C #define REG_USB_AGG_TH 0xFE5D @@ -508,19 +545,21 @@ #define REG_TEST_SIE_CHIRP_K 0xFE65 #define REG_TEST_SIE_PHY 0xFE66 // 0xFE66~0xFE6B #define REG_TEST_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 -#define REG_TEST_SIE_STRING 0xFE80 // 0xFE80~0xFEB9 +#define REG_TEST_SIE_STRING 0xFE80 // 0xFE80~0xFEB9 + // For normal chip #define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61 #define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63 -#define REG_NORMAL_SIE_OPTIONAL 0xFE64 +#define REG_NORMAL_SIE_OPTIONAL 0xFE64 #define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67 -#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B +#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B #define REG_NORMAL_SIE_OPTIONAL2 0xFE6C #define REG_NORMAL_SIE_GPS_EP 0xFE6D // 0xFE6D, for RTL8723 only. -#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 #define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF + //----------------------------------------------------- // // Redifine 8192C register definition for compatibility @@ -535,7 +574,7 @@ #define MSR (REG_CR + 2) // Media Status register //#define ISR REG_HISR -#define TSFR REG_TSFTR // Timing Sync Function Timer Register. +#define TSFR REG_TSFTR // Timing Sync Function Timer Register. #define TSFR1 REG_TSFTR1 // HW Port 1 TSF Register #define PBP REG_PBP @@ -544,6 +583,7 @@ #define IDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053 #define IDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055 + // // 9. Security Control Registers (Offset: ) // @@ -551,14 +591,14 @@ #define WCAMI REG_CAMWRITE // Software write CAM input content #define RCAMO REG_CAMREAD // Software read/write CAM config #define CAMDBG REG_CAMDBG -#define SECR REG_SECCFG //Security Configuration Register +#define SECR REG_SECCFG //Security Configuration Register // Unused register #define UnusedRegister 0x1BF #define DCAM UnusedRegister #define PSR UnusedRegister #define BBAddr UnusedRegister -#define PhyDataR UnusedRegister +#define PhyDataR UnusedRegister // Min Spacing related settings. #define MAX_MSS_DENSITY_2T 0x13 @@ -615,13 +655,13 @@ // 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) //---------------------------------------------------------------------------- /* - Network Type - 00: No link - 01: Link in ad hoc network - 10: Link in infrastructure network - 11: AP mode - Default: 00b. - */ +Network Type +00: No link +01: Link in ad hoc network +10: Link in infrastructure network +11: AP mode +Default: 00b. +*/ #define MSR_NOLINK 0x00 #define MSR_ADHOC 0x01 #define MSR_INFRA 0x02 @@ -630,14 +670,14 @@ //---------------------------------------------------------------------------- // USB INTR CONTENT //---------------------------------------------------------------------------- -#define USB_C2H_CMDID_OFFSET 0 +#define USB_C2H_CMDID_OFFSET 0 #define USB_C2H_SEQ_OFFSET 1 -#define USB_C2H_EVENT_OFFSET 2 -#define USB_INTR_CPWM_OFFSET 16 +#define USB_C2H_EVENT_OFFSET 2 +#define USB_INTR_CPWM_OFFSET 16 #define USB_INTR_CONTENT_C2H_OFFSET 0 #define USB_INTR_CONTENT_CPWM1_OFFSET 16 #define USB_INTR_CONTENT_CPWM2_OFFSET 20 -#define USB_INTR_CONTENT_HISR_OFFSET 48 +#define USB_INTR_CONTENT_HISR_OFFSET 48 #define USB_INTR_CONTENT_HISRE_OFFSET 52 #define USB_INTR_CONTENT_LENGTH 56 @@ -667,7 +707,6 @@ #define RRSR_CCK_RATES (RRSR_11M|RRSR_5_5M|RRSR_2M|RRSR_1M) #define RRSR_OFDM_RATES (RRSR_54M|RRSR_48M|RRSR_36M|RRSR_24M|RRSR_18M|RRSR_12M|RRSR_9M|RRSR_6M) - // WOL bit information #define HAL92C_WOL_PTK_UPDATE_EVENT BIT0 #define HAL92C_WOL_GTK_UPDATE_EVENT BIT1 @@ -679,13 +718,13 @@ // Rate Definition //---------------------------------------------------------------------------- //CCK -#define RATR_1M 0x00000001 -#define RATR_2M 0x00000002 +#define RATR_1M 0x00000001 +#define RATR_2M 0x00000002 #define RATR_55M 0x00000004 #define RATR_11M 0x00000008 //OFDM -#define RATR_6M 0x00000010 -#define RATR_9M 0x00000020 +#define RATR_6M 0x00000010 +#define RATR_9M 0x00000020 #define RATR_12M 0x00000040 #define RATR_18M 0x00000080 #define RATR_24M 0x00000100 @@ -744,14 +783,15 @@ #define RATE_MCS14 BIT(26) #define RATE_MCS15 BIT(27) + // ALL CCK Rate #define RATE_ALL_CCK RATR_1M|RATR_2M|RATR_55M|RATR_11M #define RATE_ALL_OFDM_AG RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\ - RATR_36M|RATR_48M|RATR_54M + RATR_36M|RATR_48M|RATR_54M #define RATE_ALL_OFDM_1SS RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\ - RATR_MCS4|RATR_MCS5|RATR_MCS6 |RATR_MCS7 + RATR_MCS4|RATR_MCS5|RATR_MCS6 |RATR_MCS7 #define RATE_ALL_OFDM_2SS RATR_MCS8|RATR_MCS9 |RATR_MCS10|RATR_MCS11|\ - RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15 + RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15 #define RATE_BITMAP_ALL 0xFFFFF @@ -763,7 +803,7 @@ // BW_OPMODE bits (Offset 0x603, 8bit) //---------------------------------------------------------------------------- #define BW_OPMODE_20MHZ BIT2 -#define BW_OPMODE_5G BIT1 +#define BW_OPMODE_5G BIT1 //---------------------------------------------------------------------------- // CAM Config Setting (offset 0x680, 1 byte) @@ -772,7 +812,7 @@ #define CAM_NOTVALID 0x0000 #define CAM_USEDK BIT5 -#define CAM_CONTENT_COUNT 8 +#define CAM_CONTENT_COUNT 8 #define CAM_NONE 0x0 #define CAM_WEP40 0x01 @@ -780,10 +820,10 @@ #define CAM_AES 0x04 #define CAM_WEP104 0x05 #define CAM_SMS4 0x6 - -#define TOTAL_CAM_ENTRY 32 + +#define TOTAL_CAM_ENTRY 32 #define HALF_CAM_ENTRY 16 - + #define CAM_CONFIG_USEDK _TRUE #define CAM_CONFIG_NO_USEDK _FALSE @@ -791,13 +831,17 @@ #define CAM_READ 0x00000000 #define CAM_POLLINIG BIT31 +#define SCR_UseDK 0x01 +#define SCR_TxSecEnable 0x02 +#define SCR_RxSecEnable 0x04 + // // 10. Power Save Control Registers // -#define WOW_PMEN BIT0 // Power management Enable. -#define WOW_WOMEN BIT1 // WoW function on or off. -#define WOW_MAGIC BIT2 // Magic packet -#define WOW_UWF BIT3 // Unicast Wakeup frame. +#define WOW_PMEN BIT0 // Power management Enable. +#define WOW_WOMEN BIT1 // WoW function on or off. +#define WOW_MAGIC BIT2 // Magic packet +#define WOW_UWF BIT3 // Unicast Wakeup frame. // // 12. Host Interrupt Status Registers @@ -833,7 +877,7 @@ #define IMR_BDOK BIT9 // Beacon Queue DMA OK Interrup #define IMR_HIGHDOK BIT8 // High Queue DMA OK Interrupt #define IMR_TBDOK BIT7 // Transmit Beacon OK interrup -#define IMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt +#define IMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt #define IMR_TBDER BIT5 // For 92C,Transmit Beacon Error Interrupt #define IMR_BKDOK BIT4 // AC_BK DMA OK Interrupt #define IMR_BEDOK BIT3 // AC_BE DMA OK Interrupt @@ -843,14 +887,14 @@ // 13. Host Interrupt Status Extension Register (Offset: 0x012C-012Eh) #define IMR_TSF_BIT32_TOGGLE BIT15 -#define IMR_BcnInt_E BIT12 +#define IMR_BcnInt_E BIT12 #define IMR_TXERR BIT11 #define IMR_RXERR BIT10 #define IMR_C2HCMD BIT9 #define IMR_CPWM BIT8 //RSVD [2-7] #define IMR_OCPINT BIT1 -#define IMR_WLANOFF BIT0 +#define IMR_WLANOFF BIT0 //---------------------------------------------------------------------------- // 8723E series PCIE Host IMR/ISR bit @@ -858,12 +902,12 @@ // IMR DW0 Bit 0-31 #define PHIMR_TIMEOUT2 BIT31 #define PHIMR_TIMEOUT1 BIT30 -#define PHIMR_PSTIMEOUT BIT29 +#define PHIMR_PSTIMEOUT BIT29 #define PHIMR_GTINT4 BIT28 #define PHIMR_GTINT3 BIT27 #define PHIMR_TXBCNERR BIT26 #define PHIMR_TXBCNOK BIT25 -#define PHIMR_TSF_BIT32_TOGGLE BIT24 +#define PHIMR_TSF_BIT32_TOGGLE BIT24 #define PHIMR_BCNDMAINT3 BIT23 #define PHIMR_BCNDMAINT2 BIT22 #define PHIMR_BCNDMAINT1 BIT21 @@ -874,18 +918,18 @@ #define PHIMR_BCNDOK0 BIT16 #define PHIMR_HSISR_IND_ON BIT15 #define PHIMR_BCNDMAINT_E BIT14 -#define PHIMR_ATIMEND_E BIT13 -#define PHIMR_ATIM_CTW_END BIT12 -#define PHIMR_HISRE_IND BIT11 // RO. HISRE Indicator (HISRE & HIMRE is true, this bit is set to 1) +#define PHIMR_ATIMEND_E BIT13 +#define PHIMR_ATIM_CTW_END BIT12 +#define PHIMR_HISRE_IND BIT11 // RO. HISRE Indicator (HISRE & HIMRE is true, this bit is set to 1) #define PHIMR_C2HCMD BIT10 -#define PHIMR_CPWM2 BIT9 +#define PHIMR_CPWM2 BIT9 #define PHIMR_CPWM BIT8 #define PHIMR_HIGHDOK BIT7 // High Queue DMA OK Interrupt #define PHIMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt #define PHIMR_BKDOK BIT5 // AC_BK DMA OK Interrupt #define PHIMR_BEDOK BIT4 // AC_BE DMA OK Interrupt #define PHIMR_VIDOK BIT3 // AC_VI DMA OK Interrupt -#define PHIMR_VODOK BIT2 // AC_VO DMA Interrupt +#define PHIMR_VODOK BIT2 // AC_VO DMA Interrupt #define PHIMR_RDU BIT1 // Receive Descriptor Unavailable #define PHIMR_ROK BIT0 // Receive DMA OK Interrupt @@ -909,12 +953,12 @@ #define UHIMR_TIMEOUT2 BIT31 #define UHIMR_TIMEOUT1 BIT30 -#define UHIMR_PSTIMEOUT BIT29 +#define UHIMR_PSTIMEOUT BIT29 #define UHIMR_GTINT4 BIT28 #define UHIMR_GTINT3 BIT27 #define UHIMR_TXBCNERR BIT26 #define UHIMR_TXBCNOK BIT25 -#define UHIMR_TSF_BIT32_TOGGLE BIT24 +#define UHIMR_TSF_BIT32_TOGGLE BIT24 #define UHIMR_BCNDMAINT3 BIT23 #define UHIMR_BCNDMAINT2 BIT22 #define UHIMR_BCNDMAINT1 BIT21 @@ -923,20 +967,20 @@ #define UHIMR_BCNDOK2 BIT18 #define UHIMR_BCNDOK1 BIT17 #define UHIMR_BCNDOK0 BIT16 -#define UHIMR_HSISR_IND BIT15 +#define UHIMR_HSISR_IND BIT15 #define UHIMR_BCNDMAINT_E BIT14 //RSVD BIT13 #define UHIMR_CTW_END BIT12 //RSVD BIT11 #define UHIMR_C2HCMD BIT10 -#define UHIMR_CPWM2 BIT9 +#define UHIMR_CPWM2 BIT9 #define UHIMR_CPWM BIT8 #define UHIMR_HIGHDOK BIT7 // High Queue DMA OK Interrupt #define UHIMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt -#define UHIMR_BKDOK BIT5 // AC_BK DMA OK Interrupt -#define UHIMR_BEDOK BIT4 // AC_BE DMA OK Interrupt +#define UHIMR_BKDOK BIT5 // AC_BK DMA OK Interrupt +#define UHIMR_BEDOK BIT4 // AC_BE DMA OK Interrupt #define UHIMR_VIDOK BIT3 // AC_VI DMA OK Interrupt -#define UHIMR_VODOK BIT2 // AC_VO DMA Interrupt +#define UHIMR_VODOK BIT2 // AC_VO DMA Interrupt #define UHIMR_RDU BIT1 // Receive Descriptor Unavailable #define UHIMR_ROK BIT0 // Receive DMA OK Interrupt @@ -950,7 +994,7 @@ #define UHIMR_BCNDOK5 BIT17 #define UHIMR_BCNDOK4 BIT16 // bit14-15: RSVD -#define UHIMR_ATIMEND_E BIT13 +#define UHIMR_ATIMEND_E BIT13 #define UHIMR_ATIMEND BIT12 #define UHIMR_TXERR BIT11 #define UHIMR_RXERR BIT10 @@ -960,6 +1004,7 @@ #define UHIMR_OCPINT BIT1 // bit0: RSVD + #define HAL_NIC_UNPLUG_ISR 0xFFFFFFFF // The value when the NIC is unplugged for PCI. #define HAL_NIC_UNPLUG_PCI_ISR 0xEAEAEAEA // The value when the NIC is unplugged for PCI in PCI interrupt (page 3). @@ -975,17 +1020,17 @@ #define IMR_TBDER_88E BIT26 // Transmit Beacon0 Error #define IMR_TBDOK_88E BIT25 // Transmit Beacon0 OK #define IMR_TSF_BIT32_TOGGLE_88E BIT24 // TSF Timer BIT32 toggle indication interrupt -#define IMR_BCNDMAINT0_88E BIT20 // Beacon DMA Interrupt 0 +#define IMR_BCNDMAINT0_88E BIT20 // Beacon DMA Interrupt 0 #define IMR_BCNDERR0_88E BIT16 // Beacon Queue DMA Error 0 #define IMR_HSISR_IND_ON_INT_88E BIT15 // HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) -#define IMR_BCNDMAINT_E_88E BIT14 // Beacon DMA Interrupt Extension for Win7 -#define IMR_ATIMEND_88E BIT12 // CTWidnow End or ATIM Window End +#define IMR_BCNDMAINT_E_88E BIT14 // Beacon DMA Interrupt Extension for Win7 +#define IMR_ATIMEND_88E BIT12 // CTWidnow End or ATIM Window End #define IMR_HISR1_IND_INT_88E BIT11 // HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1) #define IMR_C2HCMD_88E BIT10 // CPU to Host Command INT Status, Write 1 clear #define IMR_CPWM2_88E BIT9 // CPU power Mode exchange INT Status, Write 1 clear #define IMR_CPWM_88E BIT8 // CPU power Mode exchange INT Status, Write 1 clear -#define IMR_HIGHDOK_88E BIT7 // High Queue DMA OK -#define IMR_MGNTDOK_88E BIT6 // Management Queue DMA OK +#define IMR_HIGHDOK_88E BIT7 // High Queue DMA OK +#define IMR_MGNTDOK_88E BIT6 // Management Queue DMA OK #define IMR_BKDOK_88E BIT5 // AC_BK DMA OK #define IMR_BEDOK_88E BIT4 // AC_BE DMA OK #define IMR_VIDOK_88E BIT3 // AC_VI DMA OK @@ -994,20 +1039,20 @@ #define IMR_ROK_88E BIT0 // Receive DMA OK // IMR DW1(0x00B4-00B7) Bit 0-31 -#define IMR_BCNDMAINT7_88E BIT27 // Beacon DMA Interrupt 7 -#define IMR_BCNDMAINT6_88E BIT26 // Beacon DMA Interrupt 6 -#define IMR_BCNDMAINT5_88E BIT25 // Beacon DMA Interrupt 5 -#define IMR_BCNDMAINT4_88E BIT24 // Beacon DMA Interrupt 4 -#define IMR_BCNDMAINT3_88E BIT23 // Beacon DMA Interrupt 3 -#define IMR_BCNDMAINT2_88E BIT22 // Beacon DMA Interrupt 2 -#define IMR_BCNDMAINT1_88E BIT21 // Beacon DMA Interrupt 1 -#define IMR_BCNDOK7_88E BIT20 // Beacon Queue DMA OK Interrup 7 -#define IMR_BCNDOK6_88E BIT19 // Beacon Queue DMA OK Interrup 6 -#define IMR_BCNDOK5_88E BIT18 // Beacon Queue DMA OK Interrup 5 -#define IMR_BCNDOK4_88E BIT17 // Beacon Queue DMA OK Interrup 4 -#define IMR_BCNDOK3_88E BIT16 // Beacon Queue DMA OK Interrup 3 -#define IMR_BCNDOK2_88E BIT15 // Beacon Queue DMA OK Interrup 2 -#define IMR_BCNDOK1_88E BIT14 // Beacon Queue DMA OK Interrup 1 +#define IMR_BCNDMAINT7_88E BIT27 // Beacon DMA Interrupt 7 +#define IMR_BCNDMAINT6_88E BIT26 // Beacon DMA Interrupt 6 +#define IMR_BCNDMAINT5_88E BIT25 // Beacon DMA Interrupt 5 +#define IMR_BCNDMAINT4_88E BIT24 // Beacon DMA Interrupt 4 +#define IMR_BCNDMAINT3_88E BIT23 // Beacon DMA Interrupt 3 +#define IMR_BCNDMAINT2_88E BIT22 // Beacon DMA Interrupt 2 +#define IMR_BCNDMAINT1_88E BIT21 // Beacon DMA Interrupt 1 +#define IMR_BCNDOK7_88E BIT20 // Beacon Queue DMA OK Interrup 7 +#define IMR_BCNDOK6_88E BIT19 // Beacon Queue DMA OK Interrup 6 +#define IMR_BCNDOK5_88E BIT18 // Beacon Queue DMA OK Interrup 5 +#define IMR_BCNDOK4_88E BIT17 // Beacon Queue DMA OK Interrup 4 +#define IMR_BCNDOK3_88E BIT16 // Beacon Queue DMA OK Interrup 3 +#define IMR_BCNDOK2_88E BIT15 // Beacon Queue DMA OK Interrup 2 +#define IMR_BCNDOK1_88E BIT14 // Beacon Queue DMA OK Interrup 1 #define IMR_ATIMEND_E_88E BIT13 // ATIM Window End Extension for Win7 #define IMR_TXERR_88E BIT11 // Tx Error Flag Interrupt Status, write 1 clear. #define IMR_RXERR_88E BIT10 // Rx Error Flag INT Status, Write 1 clear @@ -1015,36 +1060,36 @@ #define IMR_RXFOVW_88E BIT8 // Receive FIFO Overflow /*=================================================================== - ===================================================================== - Here the register defines are for 92C. When the define is as same with 92C, - we will use the 92C's define for the consistency - So the following defines for 92C is not entire!!!!!! - ===================================================================== - =====================================================================*/ +===================================================================== +Here the register defines are for 92C. When the define is as same with 92C, +we will use the 92C's define for the consistency +So the following defines for 92C is not entire!!!!!! +===================================================================== +=====================================================================*/ /* - Based on Datasheet V33---090401 - Register Summary - Current IOREG MAP - 0x0000h ~ 0x00FFh System Configuration (256 Bytes) - 0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) - 0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) - 0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) - 0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) - 0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) - 0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) - 0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) - 0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) - */ -//---------------------------------------------------------------------------- -// 8192C (TXPAUSE) transmission pause (Offset 0x522, 8 bits) -//---------------------------------------------------------------------------- +Based on Datasheet V33---090401 +Register Summary +Current IOREG MAP +0x0000h ~ 0x00FFh System Configuration (256 Bytes) +0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) +0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) +0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) +0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) +0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) +0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) +0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) +0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) +*/ + //---------------------------------------------------------------------------- + // 8192C (TXPAUSE) transmission pause (Offset 0x522, 8 bits) + //---------------------------------------------------------------------------- // Note: // The the bits of stoping AC(VO/VI/BE/BK) queue in datasheet RTL8192S/RTL8192C are wrong, // the correct arragement is VO - Bit0, VI - Bit1, BE - Bit2, and BK - Bit3. // 8723 and 88E may be not correct either in the eralier version. Confirmed with DD Tim. // By Bruce, 2011-09-22. #define StopBecon BIT6 -#define StopHigh BIT5 +#define StopHigh BIT5 #define StopMgt BIT4 #define StopBK BIT3 #define StopBE BIT2 @@ -1059,34 +1104,36 @@ #define RCR_APP_ICV BIT29 // MACRX will retain the ICV at the bottom of the packet. #define RCR_APP_PHYST_RXFF BIT28 // PHY Status is appended before RX packet in RXFF #define RCR_APP_BA_SSN BIT27 // SSN of previous TXBA is appended as after original RXDESC as the 4-th DW of RXDESC. -#define RCR_VHT_DACK BIT26 /* This bit to control response type for vht single mpdu data packet. 1. ACK as response 0. BA as response */ -#define RCR_TCPOFLD_EN BIT25 /* Enable TCP checksum offload */ +#define RCR_NONQOS_VHT BIT26 // Reserved +#define RCR_RSVD_BIT25 BIT25 // Reserved #define RCR_ENMBID BIT24 // Enable Multiple BssId. Only response ACK to the packets whose DID(A1) matching to the addresses in the MBSSID CAM Entries. #define RCR_LSIGEN BIT23 // Enable LSIG TXOP Protection function. Search KEYCAM for each rx packet to check if LSIGEN bit is set. #define RCR_MFBEN BIT22 // Enable immediate MCS Feedback function. When Rx packet with MRQ = 1'b1, then search KEYCAM to find sender's MCS Feedback function and send response. -#define RCR_DISCHKPPDLLEN BIT21 /* Do not check PPDU while the PPDU length is smaller than 14 byte. */ -#define RCR_PKTCTL_DLEN BIT20 /* While rx path dead lock occurs, reset rx path */ -#define RCR_DISGCLK BIT19 /* Disable macrx clock gating control (no used) */ +#define RCR_RSVD_BIT21 BIT21 // Reserved +#define RCR_RSVD_BIT20 BIT20 // Reserved +#define RCR_RSVD_BIT19 BIT19 // Reserved #define RCR_TIM_PARSER_EN BIT18 // RX Beacon TIM Parser. -#define RCR_BC_MD_EN BIT17 /* Broadcast data packet more data bit check interrupt enable.*/ -#define RCR_UC_MD_EN BIT16 /* Unicast data packet more data bit check interrupt enable. */ -#define RCR_RXSK_PERPKT BIT15 /* Executing key search per MPDU */ +#define RCR_BM_DATA_EN BIT17 // Broadcast data packet interrupt enable. +#define RCR_UC_DATA_EN BIT16 // Unicast data packet interrupt enable. +#define RCR_RSVD_BIT15 BIT15 // Reserved #define RCR_HTC_LOC_CTRL BIT14 // MFC<--HTC=1 MFC-->HTC=0 #define RCR_AMF BIT13 // Accept management type frame #define RCR_ACF BIT12 // Accept control type frame. Control frames BA, BAR, and PS-Poll (when in AP mode) are not controlled by this bit. They are controlled by ADF. #define RCR_ADF BIT11 // Accept data type frame. This bit also regulates BA, BAR, and PS-Poll (AP mode only). -#define RCR_DISDECMYPKT BIT10 /* This bit determines whether hw need to do decryption.1: If A1 match, do decryption.0: Do decryption. */ -#define RCR_AICV BIT9 // Accept ICV error packet +#define RCR_RSVD_BIT10 BIT10 // Reserved +#define RCR_AICV BIT9 // Accept ICV error packet #define RCR_ACRC32 BIT8 // Accept CRC32 error packet #define RCR_CBSSID_BCN BIT7 // Accept BSSID match packet (Rx beacon, probe rsp) -#define RCR_CBSSID_DATA BIT6 // Accept BSSID match packet (Data) -#define RCR_APWRMGT BIT5 // Accept power management packet +#define RCR_CBSSID_DATA BIT6 // Accept BSSID match packet (Data) +#define RCR_CBSSID RCR_CBSSID_DATA // Accept BSSID match packet +#define RCR_APWRMGT BIT5 // Accept power management packet #define RCR_ADD3 BIT4 // Accept address 3 match packet #define RCR_AB BIT3 // Accept broadcast packet #define RCR_AM BIT2 // Accept multicast packet #define RCR_APM BIT1 // Accept physical match packet #define RCR_AAP BIT0 // Accept all unicast packet + //----------------------------------------------------- // // 0x0000h ~ 0x00FFh System Configuration @@ -1100,27 +1147,28 @@ #define ISO_PA2PCIE BIT(3) #define ISO_PD2CORE BIT(4) #define ISO_IP2MAC BIT(5) -#define ISO_DIOP BIT(6) -#define ISO_DIOE BIT(7) +#define ISO_DIOP BIT(6) +#define ISO_DIOE BIT(7) #define ISO_EB2CORE BIT(8) -#define ISO_DIOR BIT(9) +#define ISO_DIOR BIT(9) #define PWC_EV12V BIT(15) + //2 SYS_FUNC_EN #define FEN_BBRSTB BIT(0) -#define FEN_BB_GLB_RSTn BIT(1) +#define FEN_BB_GLB_RSTn BIT(1) #define FEN_USBA BIT(2) #define FEN_UPLL BIT(3) #define FEN_USBD BIT(4) #define FEN_DIO_PCIE BIT(5) #define FEN_PCIEA BIT(6) -#define FEN_PPLL BIT(7) +#define FEN_PPLL BIT(7) #define FEN_PCIED BIT(8) #define FEN_DIOE BIT(9) #define FEN_CPUEN BIT(10) #define FEN_DCORE BIT(11) #define FEN_ELDR BIT(12) -#define FEN_EN_25_1 BIT(13) +//#define FEN_DIO_RF BIT(13) #define FEN_HWPDN BIT(14) #define FEN_MREGEN BIT(15) @@ -1158,16 +1206,19 @@ #define MACSLP BIT(4) #define LOADER_CLK_EN BIT(5) + //2 9346CR /REG_SYS_EEPROM_CTRL #define BOOT_FROM_EEPROM BIT(4) #define EEPROMSEL BIT(4) #define EEPROM_EN BIT(5) + //2 RF_CTRL #define RF_EN BIT(0) #define RF_RSTB BIT(1) #define RF_SDMRSTB BIT(2) + //2 LDOV12D_CTRL #define LDV12_EN BIT(0) #define LDV12_SDBY BIT(1) @@ -1175,17 +1226,20 @@ #define LPLDO_LSM_DIS BIT(3) #define _LDV12_VADJ(x) (((x) & 0xF) << 4) + + //2 EFUSE_TEST (For RTL8723 partially) #define EF_TRPT BIT(7) #define EF_CELL_SEL (BIT(8)|BIT(9)) // 00: Wifi Efuse, 01: BT Efuse0, 10: BT Efuse1, 11: BT Efuse2 #define LDOE25_EN BIT(31) -#define EFUSE_SEL(x) (((x) & 0x3) << 8) +#define EFUSE_SEL(x) (((x) & 0x3) << 8) #define EFUSE_SEL_MASK 0x300 #define EFUSE_WIFI_SEL_0 0x0 #define EFUSE_BT_SEL_0 0x1 #define EFUSE_BT_SEL_1 0x2 #define EFUSE_BT_SEL_2 0x3 + //2 8051FWDL //2 MCUFWDL #define MCUFWDL_EN BIT(0) @@ -1196,10 +1250,10 @@ #define RFINI_RDY BIT(5) #define WINTINI_RDY BIT(6) #define RAM_DL_SEL BIT(7) -#define CPU_DL_READY BIT(15) /* add flag by gw for fw download ready 20130826 */ #define ROM_DLEN BIT(19) #define CPRST BIT(23) + //2 REG_SYS_CFG #define XCLK_VLD BIT(0) #define ACLK_VLD BIT(1) @@ -1208,10 +1262,10 @@ #define PCIRSTB BIT(4) #define V15_VLD BIT(5) #define SW_OFFLOAD_EN BIT(7) -#define SIC_IDLE BIT(8) +#define SIC_IDLE BIT(8) #define BD_MAC2 BIT(9) #define BD_MAC1 BIT(10) -#define IC_MACPHY_MODE BIT(11) +#define IC_MACPHY_MODE BIT(11) #define CHIP_VER (BIT(12)|BIT(13)|BIT(14)|BIT(15)) #define BT_FUNC BIT(16) #define VENDOR_ID BIT(19) @@ -1227,6 +1281,7 @@ #define RTL_ID BIT(23) // TestChip ID, 1:Test(RLE); 0:MP(RL) #define SPS_SEL BIT(24) // 1:LDO regulator mode; 0:Switching regulator mode + #define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15 #define CHIP_VER_RTL_SHIFT 12 #define EXT_VENDOR_ID_SHIFT 18 @@ -1251,7 +1306,8 @@ #define UPHY_SUSB BIT(21) #define PCI_SUSEN BIT(22) #define USB_SUSEN BIT(23) -#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28)) +#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28)) + //----------------------------------------------------- // @@ -1295,14 +1351,15 @@ #define PBP_512 0x3 #define PBP_1024 0x4 + //2 TX/RXDMA -#define RXDMA_ARBBW_EN BIT(0) +#define RXDMA_ARBBW_EN BIT(0) #define RXSHFT_EN BIT(1) #define RXDMA_AGG_EN BIT(2) -#define QS_VO_QUEUE BIT(8) +#define QS_VO_QUEUE BIT(8) #define QS_VI_QUEUE BIT(9) -#define QS_BE_QUEUE BIT(10) -#define QS_BK_QUEUE BIT(11) +#define QS_BE_QUEUE BIT(10) +#define QS_BK_QUEUE BIT(11) #define QS_MANAGER_QUEUE BIT(12) #define QS_HIGH_QUEUE BIT(13) @@ -1327,8 +1384,10 @@ #define QUEUE_NORMAL 2 #define QUEUE_HIGH 3 + //2 TRXFF_BNDY + //2 LLT_INIT #define _LLT_NO_ACTIVE 0x0 #define _LLT_WRITE_ACCESS 0x1 @@ -1336,9 +1395,10 @@ #define _LLT_INIT_DATA(x) ((x) & 0xFF) #define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) -#define _LLT_OP(x) (((x) & 0x3) << 30) +#define _LLT_OP(x) (((u32)(x) & 0x3) << 30) #define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) + //----------------------------------------------------- // // 0x0200h ~ 0x027Fh TXDMA Configuration @@ -1347,18 +1407,21 @@ //2 RQPN #define _HPQ(x) ((x) & 0xFF) #define _LPQ(x) (((x) & 0xFF) << 8) -#define _PUBQ(x) (((x) & 0xFF) << 16) +#define _PUBQ(x) (((x) & 0xFF) << 16) #define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register #define _EPQ(x) (((x) & 0xFF) << 16) // NOTE: in RQPN_EPQ register + #define HPQ_PUBLIC_DIS BIT(24) #define LPQ_PUBLIC_DIS BIT(25) #define LD_RQPN BIT(31) + //2 TDECTL #define BLK_DESC_NUM_SHIFT 4 #define BLK_DESC_NUM_MASK 0xF + //2 TXDMA_OFFSET_CHK #define DROP_DATA_EN BIT(9) @@ -1374,6 +1437,7 @@ #define BIT_MASK_Tx_OQT_free_space 0xff #define BIT_Tx_OQT_free_space(x) (((x) & BIT_MASK_Tx_OQT_free_space) << BIT_SHIFT_Tx_OQT_free_space) + //----------------------------------------------------- // // 0x0280h ~ 0x028Bh RX DMA Configuration @@ -1401,9 +1465,13 @@ // 0x0400h ~ 0x047Fh Protocol Configuration // //----------------------------------------------------- +//2 CPU_MGT_INFORMATION +#define CPUMGT_POLL BIT(5) + //2 FWHW_TXQ_CTRL #define EN_AMPDU_RTY_NEW BIT(7) + //2 SPEC SIFS #define _SPEC_SIFS_CCK(x) ((x) & 0xFF) #define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) @@ -1422,18 +1490,20 @@ #define AC_PARAM_TXOP_LIMIT_OFFSET 16 #define AC_PARAM_ECW_MAX_OFFSET 12 #define AC_PARAM_ECW_MIN_OFFSET 8 -#define AC_PARAM_AIFS_OFFSET 0 +#define AC_PARAM_AIFS_OFFSET 0 + #define _LRL(x) ((x) & 0x3F) #define _SRL(x) (((x) & 0x3F) << 8) + //2 BCN_CTRL #define EN_TXBCN_RPT BIT(2) -#define EN_BCN_FUNCTION BIT(3) +#define EN_BCN_FUNCTION BIT(3) #define STOP_BCNQ BIT(6) #define DIS_RX_BSSID_FIT BIT(6) -#define DIS_ATIM BIT(0) +#define DIS_ATIM BIT(0) #define DIS_BCNQ_SUB BIT(1) #define DIS_TSF_UDT BIT(4) @@ -1441,14 +1511,15 @@ #define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) #define DIS_TSF_UDT0_TEST_CHIP BIT(5) + //2 ACMHWCTRL #define AcmHw_HwEn BIT(0) -#define AcmHw_BeqEn BIT(1) +#define AcmHw_BeqEn BIT(1) #define AcmHw_ViqEn BIT(2) -#define AcmHw_VoqEn BIT(3) -#define AcmHw_BeqStatus BIT(4) +#define AcmHw_VoqEn BIT(3) +#define AcmHw_BeqStatus BIT(4) #define AcmHw_ViqStatus BIT(5) -#define AcmHw_VoqStatus BIT(6) +#define AcmHw_VoqStatus BIT(6) //2 //REG_DUAL_TSF_RST (0x553) #define DUAL_TSF_RST_P2P BIT(4) @@ -1468,26 +1539,27 @@ //2 TCR #define TSFRST BIT(0) -#define DIS_GCLK BIT(1) +#define DIS_GCLK BIT(1) #define PAD_SEL BIT(2) #define PWR_ST BIT(6) #define PWRBIT_OW_EN BIT(7) -#define ACRC BIT(8) +#define ACRC BIT(8) #define CFENDFORM BIT(9) #define ICV BIT(10) + //2 RCR #define AAP BIT(0) #define APM BIT(1) #define AM BIT(2) #define AB BIT(3) -#define ADD3 BIT(4) -#define APWRMGT BIT(5) +#define ADD3 BIT(4) +#define APWRMGT BIT(5) #define CBSSID BIT(6) #define CBSSID_DATA BIT(6) #define CBSSID_BCN BIT(7) #define ACRC32 BIT(8) -#define AICV BIT(9) +#define AICV BIT(9) #define ADF BIT(11) #define ACF BIT(12) #define AMF BIT(13) @@ -1504,6 +1576,7 @@ #define APP_MIC BIT(30) #define APP_FCS BIT(31) + //2 SECCFG #define SCR_TxUseDK BIT(0) //Force Tx Use Default Key #define SCR_RxUseDK BIT(1) //Force Rx Use Default Key @@ -1513,150 +1586,418 @@ #define SCR_NoSKMC BIT(5) //No Key Search Multicast #define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key #define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key -#define SCR_CHK_KEYID BIT(8) -#define SCR_CHK_BMC BIT(9) /* add option to support a2+keyid+bcm */ + //----------------------------------------------------- // -// SDIO Bus Specification +// 0x0300h ~ 0x03FFh PCIe/LBus // //----------------------------------------------------- -// I/O bus domain address mapping -#define SDIO_LOCAL_BASE 0x10250000 -#define WLAN_IOREG_BASE 0x10260000 -#define FIRMWARE_FIFO_BASE 0x10270000 -#define TX_HIQ_BASE 0x10310000 -#define TX_MIQ_BASE 0x10320000 -#define TX_LOQ_BASE 0x10330000 -#define TX_EPQ_BASE 0x10350000 -#define RX_RX0FF_BASE 0x10340000 -//SDIO host local register space mapping. -#define SDIO_LOCAL_MSK 0x0FFF -#define WLAN_IOREG_MSK 0x7FFF -#define WLAN_FIFO_MSK 0x1FFF // Aggregation Length[12:0] -#define WLAN_RX0FF_MSK 0x0003 +//4 REG_LX_CTRL1(0x300) +#define BIT_WT_LIT_EDN BIT(25) +#define BIT_RD_LITT_EDN BIT(24) -#define SDIO_WITHOUT_REF_DEVICE_ID 0 // Without reference to the SDIO Device ID -#define SDIO_LOCAL_DEVICE_ID 0 // 0b[16], 000b[15:13] -#define WLAN_TX_HIQ_DEVICE_ID 4 // 0b[16], 100b[15:13] -#define WLAN_TX_MIQ_DEVICE_ID 5 // 0b[16], 101b[15:13] -#define WLAN_TX_LOQ_DEVICE_ID 6 // 0b[16], 110b[15:13] -#define WLAN_TX_EXQ_DEVICE_ID 3 // 0b[16], 011b[15:13] -#define WLAN_RX0FF_DEVICE_ID 7 // 0b[16], 111b[15:13] -#define WLAN_IOREG_DEVICE_ID 8 // 1b[16] +#define BIT_SHIFT_MAX_RXDMA 20 +#define BIT_MASK_MAX_RXDMA 0x7 +#define BIT_MAX_RXDMA(x) (((x) & BIT_MASK_MAX_RXDMA)<HardwareType >=HARDWARE_TYPE_RTL8192EE) +// +// RTL8192C Series +// +#define IS_HARDWARE_TYPE_8192CE(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192CE) +#define IS_HARDWARE_TYPE_8192CU(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192CU) +#define IS_HARDWARE_TYPE_8192C(_Adapter) \ +(IS_HARDWARE_TYPE_8192CE(_Adapter) || IS_HARDWARE_TYPE_8192CU(_Adapter)) + +// +// RTL8192D Series +// +#define IS_HARDWARE_TYPE_8192DE(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192DE) +#define IS_HARDWARE_TYPE_8192DU(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192DU) +#define IS_HARDWARE_TYPE_8192D(_Adapter) \ +(IS_HARDWARE_TYPE_8192DE(_Adapter) || IS_HARDWARE_TYPE_8192DU(_Adapter)) + +// +// RTL8723A Series +// +#define IS_HARDWARE_TYPE_8723AE(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723AE) +#define IS_HARDWARE_TYPE_8723AU(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723AU) +#define IS_HARDWARE_TYPE_8723AS(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723AS) +#define IS_HARDWARE_TYPE_8723A(_Adapter) \ +(IS_HARDWARE_TYPE_8723AE(_Adapter) || IS_HARDWARE_TYPE_8723AU(_Adapter) || IS_HARDWARE_TYPE_8723AS(_Adapter)) +// +// RTL8188E Series +// +#define IS_HARDWARE_TYPE_8188EE(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8188EE) +#define IS_HARDWARE_TYPE_8188EU(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8188EU) +#define IS_HARDWARE_TYPE_8188ES(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8188ES) +#define IS_HARDWARE_TYPE_8188E(_Adapter) \ +(IS_HARDWARE_TYPE_8188EE(_Adapter) || IS_HARDWARE_TYPE_8188EU(_Adapter) || IS_HARDWARE_TYPE_8188ES(_Adapter)) +// +//RTL8188F Series +// +#define IS_HARDWARE_TYPE_8188FE(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8188FE) +#define IS_HARDWARE_TYPE_8188FU(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8188EU) +#define IS_HARDWARE_TYPE_8188FS(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8188FS) +#define IS_HARDWARE_TYPE_8188F(_Adapter) \ +(IS_HARDWARE_TYPE_8188FE(_Adapter) || IS_HARDWARE_TYPE_8188FU(_Adapter) || IS_HARDWARE_TYPE_8188FS(_Adapter)) +// +// RTL8812 Series +// +#define IS_HARDWARE_TYPE_8812E(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8812E) +#define IS_HARDWARE_TYPE_8812AU(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8812AU) +#define IS_HARDWARE_TYPE_8812(_Adapter) \ +(IS_HARDWARE_TYPE_8812E(_Adapter) || IS_HARDWARE_TYPE_8812AU(_Adapter)) + +// RTL8821 Series +#define IS_HARDWARE_TYPE_8821E(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8821E) +#define IS_HARDWARE_TYPE_8821U(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8821U ||\ + ((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8811AU) +#define IS_HARDWARE_TYPE_8821S(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8821S) +#define IS_HARDWARE_TYPE_8821(_Adapter) \ +(IS_HARDWARE_TYPE_8821E(_Adapter) || IS_HARDWARE_TYPE_8821U(_Adapter)|| IS_HARDWARE_TYPE_8821S(_Adapter)) + +#define IS_HARDWARE_TYPE_JAGUAR(_Adapter) \ +(IS_HARDWARE_TYPE_8812(_Adapter) || IS_HARDWARE_TYPE_8821(_Adapter)) + +//RTL8192E Series +#define IS_HARDWARE_TYPE_8192EE(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192EE) +#define IS_HARDWARE_TYPE_8192EU(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192EU) +#define IS_HARDWARE_TYPE_8192ES(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192ES) + +#define IS_HARDWARE_TYPE_8192E(_Adapter) \ +(IS_HARDWARE_TYPE_8192EE(_Adapter) || IS_HARDWARE_TYPE_8192EU(_Adapter) ||IS_HARDWARE_TYPE_8192ES(_Adapter)) + +#define IS_HARDWARE_TYPE_8723BE(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723BE) +#define IS_HARDWARE_TYPE_8723BU(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723BU) +#define IS_HARDWARE_TYPE_8723BS(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723BS) + + +#define IS_HARDWARE_TYPE_8723B(_Adapter) \ + (IS_HARDWARE_TYPE_8723BE(_Adapter) || IS_HARDWARE_TYPE_8723BU(_Adapter) ||IS_HARDWARE_TYPE_8723BS(_Adapter)) + +#define IS_HARDWARE_TYPE_8195A(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8195A) + +#define IS_HARDWARE_TYPE_8711B(_Adapter) (((_adapter *)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8711B) + +typedef struct eeprom_priv EEPROM_EFUSE_PRIV, *PEEPROM_EFUSE_PRIV; +#define GET_EEPROM_EFUSE_PRIV(adapter) (&adapter->eeprompriv) +#define is_boot_from_eeprom(adapter) (adapter->eeprompriv.EepromOrEfuse) + +//TODO + +#ifdef CONFIG_WOWLAN +typedef enum _wowlan_subcode{ + WOWLAN_PATTERN_MATCH = 1, + WOWLAN_MAGIC_PACKET = 2, + WOWLAN_UNICAST = 3, + WOWLAN_SET_PATTERN = 4, + WOWLAN_DUMP_REG = 5, + WOWLAN_ENABLE = 6, + WOWLAN_DISABLE = 7, + WOWLAN_STATUS = 8, + WOWLAN_DEBUG_RELOAD_FW = 9, + WOWLAN_DEBUG_1 =10, + WOWLAN_DEBUG_2 =11 +}wowlan_subcode; + +struct wowlan_ioctl_param{ + unsigned int subcode; + unsigned int subcode_value; + unsigned int wakeup_reason; + unsigned int len; + unsigned char pattern[0]; +}; + +#define Rx_Pairwisekey 0x01 +#define Rx_GTK 0x02 +#define Rx_DisAssoc 0x04 +#define Rx_DeAuth 0x08 +#define FWDecisionDisconnect 0x10 +#define Rx_MagicPkt 0x21 +#define Rx_UnicastPkt 0x22 +#define Rx_PatternPkt 0x23 +#endif // CONFIG_WOWLAN + +void rtw_hal_def_value_init(_adapter *padapter); + +void rtw_hal_free_data(_adapter *padapter); + +void rtw_hal_dm_init(_adapter *padapter); +void rtw_hal_dm_deinit(_adapter *padapter); +#if 0 +void rtw_hal_sw_led_init(_adapter *padapter); +void rtw_hal_sw_led_deinit(_adapter *padapter); +#endif +u32 rtw_hal_power_on(_adapter *padapter); +uint rtw_hal_init(_adapter *padapter); +uint rtw_hal_deinit(_adapter *padapter); +void rtw_hal_stop(_adapter *padapter); +void rtw_hal_set_hwreg(PADAPTER padapter, u8 variable, u8 *val); +void rtw_hal_get_hwreg(PADAPTER padapter, u8 variable, u8 *val); + +void rtw_hal_chip_configure(_adapter *padapter); +void rtw_hal_read_chip_info(_adapter *padapter); +void rtw_hal_read_chip_version(_adapter *padapter); + +u8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue); +u8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue); + +void rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet); +void rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet); + +void rtw_hal_enable_interrupt(_adapter *padapter); +void rtw_hal_disable_interrupt(_adapter *padapter); +void rtw_hal_clear_interrupt(_adapter *padapter); +#ifdef CONFIG_WOWLAN +void rtw_hal_disable_interrupt_but_cpwm2(_adapter *padapter); +#endif + +u32 rtw_hal_inirp_init(_adapter *padapter); +u32 rtw_hal_inirp_deinit(_adapter *padapter); + +void rtw_hal_irp_reset(_adapter *padapter); +#if 0 +u8 rtw_hal_intf_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val); +#endif +s32 rtw_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtw_hal_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); + +s32 rtw_hal_init_xmit_priv(_adapter *padapter); +void rtw_hal_free_xmit_priv(_adapter *padapter); + +#if 1 +s32 rtw_hal_init_recv_priv(_adapter *padapter); +void rtw_hal_free_recv_priv(_adapter *padapter); +#endif + +void rtw_hal_update_ra_mask(struct sta_info *psta, u8 rssi_level); +void rtw_hal_add_ra_tid(_adapter *padapter, u32 bitmap, u8 *arg, u8 rssi_level); +void rtw_hal_clone_data(_adapter *dst_padapter, _adapter *src_padapter); +#ifdef CONFIG_LITTLE_WIFI_MCU_FUNCTION_THREAD +void rtw_hal_start_thread(_adapter *padapter); +void rtw_hal_stop_thread(_adapter *padapter); +#endif +void rtw_hal_bcn_related_reg_setting(_adapter *padapter); + +u32 rtw_hal_read_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask); +void rtw_hal_write_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data); +u32 rtw_hal_read_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask); +void rtw_hal_write_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data); + +s32 rtw_hal_interrupt_handler(_adapter *padapter); + +void rtw_hal_set_bwmode(_adapter *padapter, CHANNEL_WIDTH Bandwidth, u8 Offset); +void rtw_hal_set_chan(_adapter *padapter, u8 channel); +void rtw_hal_set_chnl_bw(_adapter *padapter, u8 channel, CHANNEL_WIDTH Bandwidth, u8 Offset40, u8 Offset80); +void rtw_hal_dm_watchdog(_adapter *padapter); +#if 1 +void rtw_hal_update_txdesc(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pbuf); +#endif +s32 rtw_hal_fill_h2c_cmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer); + +void rtw_hal_fill_fake_txdesc(_adapter* padapter, u8* pDesc, u32 BufferLen, + u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame); + +u8 rtw_hal_get_txbuff_rsvd_page_num(_adapter *padapter, bool wowlan); + + +void rtw_hal_set_wowlan_fw(_adapter *padapter, u8 sleep); + + +c2h_id_filter rtw_hal_c2h_id_filter_ccx(_adapter *padapter); + +s32 rtw_hal_c2h_handler(_adapter *padapter, u8 *c2h_evt); + + +#ifdef CONFIG_ANTENNA_DIVERSITY +u8 rtw_hal_antdiv_before_linked(_adapter *padapter); +void rtw_hal_antdiv_rssi_compared(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); +#endif + +#ifdef CONFIG_HOSTAPD_MLME +s32 rtw_hal_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); +#endif + +#ifdef DBG_CONFIG_ERROR_DETECT +void rtw_hal_sreset_init(_adapter *padapter); +void rtw_hal_sreset_reset(_adapter *padapter); +void rtw_hal_sreset_reset_value(_adapter *padapter); +void rtw_hal_sreset_xmit_status_check(_adapter *padapter); +void rtw_hal_sreset_linked_status_check (_adapter *padapter); +u8 rtw_hal_sreset_get_wifi_status(_adapter *padapter); +#endif + +#ifdef CONFIG_IOL +int rtw_hal_iol_cmd(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt) +#endif + +#if 0//def CONFIG_XMIT_THREAD_MODE +s32 rtw_hal_xmit_thread_handler(_adapter *padapter); +#endif + +s32 rtw_hal_recv_tasklet(_adapter *padapter); +#if (RTW_NOTCH_FILTER != 0) +void rtw_hal_notch_filter(_adapter * adapter, bool enable); +#endif +#if 0 +void rtw_hal_reset_security_engine(_adapter * adapter); +#endif + +void decide_chip_type_by_device_id(_adapter *padapter); + + +#ifdef CONFIG_RTL8723A +void rtl8723as_set_hal_ops(PADAPTER padapter); +#define hal_set_hal_ops(__adapter) rtl8723as_set_hal_ops(__adapter) +#endif + +#ifdef CONFIG_RTL8188E +u32 rtl8188e_set_hal_ops(PADAPTER padapter); +#define hal_set_hal_ops(__adapter) rtl8188e_set_hal_ops(__adapter) +#endif + +#ifdef CONFIG_RTL8188F +u32 rtl8188fs_set_hal_ops(PADAPTER padapter); +#define hal_set_hal_ops(__adapter) rtl8188fs_set_hal_ops(__adapter) +#endif + +#ifdef CONFIG_RTL8195A +u32 rtl8195ab_set_hal_ops(_adapter * padapter); +#define hal_set_hal_ops rtl8195ab_set_hal_ops +#define hal_interuupt_recognized InterruptRecognized8195a +#elif defined(CONFIG_RTL8711B) +u32 rtl8711bb_set_hal_ops(_adapter * padapter); +#define hal_set_hal_ops rtl8711bb_set_hal_ops +#define hal_interuupt_recognized InterruptRecognized8711b +#endif + + +#endif //__HAL_INTF_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_pg.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_pg.h new file mode 100644 index 0000000..70d4734 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_pg.h @@ -0,0 +1,81 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __HAL_PG_H__ +#define __HAL_PG_H__ + +#include + +// +// For VHT series TX power by rate table. +// VHT TX power by rate off setArray = +// Band:-2G&5G = 0 / 1 +// RF: at most 4*4 = ABCD=0/1/2/3 +// CCK=0 OFDM=1/2 HT-MCS 0-15=3/4/56 VHT=7/8/9/10/11 +// +#define PPG_BB_GAIN_2G_TX_OFFSET_MASK 0x0F +#define PPG_BB_GAIN_2G_TXB_OFFSET_MASK 0xF0 + +#define PPG_BB_GAIN_5G_TX_OFFSET_MASK 0x1F +#define PPG_THERMAL_OFFSET_MASK 0x1F +#define KFREE_BB_GAIN_2G_TX_OFFSET(_ppg_v) (((_ppg_v) == PPG_BB_GAIN_2G_TX_OFFSET_MASK) ? 0 : (((_ppg_v) & 0x01) ? ((_ppg_v) >> 1) : (-((_ppg_v) >> 1)))) +#define KFREE_THERMAL_OFFSET(_ppg_v) (((_ppg_v) == PPG_THERMAL_OFFSET_MASK) ? 0 : (((_ppg_v) & 0x01) ? ((_ppg_v) >> 1) : (-((_ppg_v) >> 1)))) + + + +#if defined(NOT_SUPPORT_5G) +#define TX_PWR_BY_RATE_NUM_BAND 1 +#else +#define TX_PWR_BY_RATE_NUM_BAND 2 +#endif + +#if defined(NOT_SUPPORT_RF_MULTIPATH) && defined(NOT_SUPPORT_VHT) +#define TX_PWR_BY_RATE_NUM_RF 1 +#define TX_PWR_BY_RATE_NUM_RATE 20 // CCK 1M~11M, OFDM 6M~54M, MCS0~7 +#else +#define TX_PWR_BY_RATE_NUM_RF 4 +#define TX_PWR_BY_RATE_NUM_RATE 84 +#endif + +#if defined(NOT_SUPPORT_RF_MULTIPATH) +#define MAX_RF_PATH 1 +#define MAX_TX_COUNT 1 +#else +#define MAX_RF_PATH 2 // Max 4 for ss larger than 2 +#define MAX_TX_COUNT 4 //It must always set to 4, otherwise read efuse table secquence will be wrong. +#endif +#define MAX_CHNL_GROUP_24G 6 // ch1~2, ch3~5, ch6~8,ch9~11,ch12~13,CH 14 total three groups +#define MAX_CHNL_GROUP_5G 14 + +typedef struct _TxPowerInfo24G{ + u8 IndexCCK_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G]; + u8 IndexBW40_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G]; + //If only one tx, only BW20 and OFDM are used. + s8 OFDM_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW20_Diff[MAX_RF_PATH][MAX_TX_COUNT]; +#if !defined(NOT_SUPPORT_RF_MULTIPATH) + s8 CCK_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW40_Diff[MAX_RF_PATH][MAX_TX_COUNT]; +#endif +}TxPowerInfo24G, *PTxPowerInfo24G; + +#endif + + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_phy.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_phy.h new file mode 100644 index 0000000..1488005 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_phy.h @@ -0,0 +1,99 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HAL_PHY_H__ +#define __HAL_PHY_H__ + +#define RF6052_MAX_TX_PWR 0x3F +#define RF6052_MAX_REG_88E 0xFF +#define RF6052_MAX_REG_92C 0x7F + +#define RF6052_MAX_REG \ + (RF6052_MAX_REG_88E > RF6052_MAX_REG_92C) ? RF6052_MAX_REG_88E: RF6052_MAX_REG_92C + +#define GET_RF6052_REAL_MAX_REG(_Adapter) \ + IS_HARDWARE_TYPE_8188E(_Adapter) ? RF6052_MAX_REG_88E : RF6052_MAX_REG_92C + +#define RF6052_MAX_PATH 2 + +/*--------------------------Define Parameters-------------------------------*/ +typedef enum _BAND_TYPE{ + BAND_ON_2_4G = 0, + BAND_ON_5G, + BAND_ON_BOTH, + BANDMAX +}BAND_TYPE,*PBAND_TYPE; + +typedef enum _RF_TYPE{ + RF_TYPE_MIN = 0, // 0 + RF_8225=1, // 1 11b/g RF for verification only + RF_8256=2, // 2 11b/g/n + RF_8258=3, // 3 11a/b/g/n RF + RF_6052=4, // 4 11b/g/n RF + RF_PSEUDO_11N=5, // 5, It is a temporality RF. + RF_TYPE_MAX +}RF_TYPE_E,*PRF_TYPE_E; + +typedef enum _RF_PATH{ + RF_PATH_A = 0, + RF_PATH_B, + RF_PATH_C, + RF_PATH_D +}RF_PATH, *PRF_PATH; + +#define TX_1S 0 +#define TX_2S 1 +#define TX_3S 2 +#define TX_4S 3 + +typedef enum _BaseBand_Config_Type{ + BaseBand_Config_PHY_REG = 0, //Radio Path A + BaseBand_Config_AGC_TAB = 1, //Radio Path B + BaseBand_Config_AGC_TAB_2G = 2, + BaseBand_Config_AGC_TAB_5G = 3, + BaseBand_Config_PHY_REG_PG +}BaseBand_Config_Type, *PBaseBand_Config_Type; + +typedef enum _WIRELESS_MODE { + WIRELESS_MODE_UNKNOWN = 0x00, + WIRELESS_MODE_A = 0x01, + WIRELESS_MODE_B = 0x02, + WIRELESS_MODE_G = 0x04, + WIRELESS_MODE_AUTO = 0x08, + WIRELESS_MODE_N_24G = 0x10, + WIRELESS_MODE_N_5G = 0x20, + WIRELESS_MODE_AC_5G = 0x40, + WIRELESS_MODE_AC_24G = 0x80, + WIRELESS_MODE_AC_ONLY = 0x100, +} WIRELESS_MODE; + +typedef struct RF_Shadow_Compare_Map { + // Shadow register value + u32 Value; + // Compare or not flag + u8 Compare; + // Record If it had ever modified unpredicted + u8 ErrorOrNot; + // Recorver Flag + u8 Recorver; + // + u8 Driver_Write; +}RF_SHADOW_T; + +#endif //__HAL_PHY_H__ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_phy_reg.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_phy_reg.h new file mode 100644 index 0000000..723eddb --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/hal_phy_reg.h @@ -0,0 +1,31 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HAL_PHY_REG_H__ +#define __HAL_PHY_REG_H__ + +//for PutRFRegsetting & GetRFRegSetting BitMask +//#if (RTL92SE_FPGA_VERIFY == 1) +//#define bRFRegOffsetMask 0xfff +//#else +#define bRFRegOffsetMask 0xfffff +//#endif + +#endif //__HAL_PHY_REG_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ieee80211.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ieee80211.h new file mode 100644 index 0000000..69b98d7 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ieee80211.h @@ -0,0 +1,1527 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __IEEE80211_H +#define __IEEE80211_H + +#ifndef CONFIG_RTL8711FW + +// #include + + #if defined PLATFORM_OS_XP + #include + #endif + #if defined PLATFORM_LINUX + #include + #endif +#else + + #include + +#endif + +#define MGMT_QUEUE_NUM 5 + +#define ETH_ALEN 6 +#define ETH_TYPE_LEN 2 +#define PAYLOAD_TYPE_LEN 1 + +#ifdef CONFIG_AP_MODE + +#define RTL_IOCTL_HOSTAPD (SIOCIWFIRSTPRIV + 28) + +/* RTL871X_IOCTL_HOSTAPD ioctl() cmd: */ +enum { + RTL871X_HOSTAPD_FLUSH = 1, + RTL871X_HOSTAPD_ADD_STA = 2, + RTL871X_HOSTAPD_REMOVE_STA = 3, + RTL871X_HOSTAPD_GET_INFO_STA = 4, + /* REMOVED: PRISM2_HOSTAPD_RESET_TXEXC_STA = 5, */ + RTL871X_HOSTAPD_GET_WPAIE_STA = 5, + RTL871X_SET_ENCRYPTION = 6, + RTL871X_GET_ENCRYPTION = 7, + RTL871X_HOSTAPD_SET_FLAGS_STA = 8, + RTL871X_HOSTAPD_GET_RID = 9, + RTL871X_HOSTAPD_SET_RID = 10, + RTL871X_HOSTAPD_SET_ASSOC_AP_ADDR = 11, + RTL871X_HOSTAPD_SET_GENERIC_ELEMENT = 12, + RTL871X_HOSTAPD_MLME = 13, + RTL871X_HOSTAPD_SCAN_REQ = 14, + RTL871X_HOSTAPD_STA_CLEAR_STATS = 15, + RTL871X_HOSTAPD_SET_BEACON=16, + RTL871X_HOSTAPD_SET_WPS_BEACON = 17, + RTL871X_HOSTAPD_SET_WPS_PROBE_RESP = 18, + RTL871X_HOSTAPD_SET_WPS_ASSOC_RESP = 19, + RTL871X_HOSTAPD_SET_HIDDEN_SSID = 20, + RTL871X_HOSTAPD_SET_MACADDR_ACL = 21, + RTL871X_HOSTAPD_ACL_ADD_STA = 22, + RTL871X_HOSTAPD_ACL_REMOVE_STA = 23, +}; + +/* STA flags */ +#define WLAN_STA_AUTH BIT(0) +#define WLAN_STA_ASSOC BIT(1) +#define WLAN_STA_PS BIT(2) +#define WLAN_STA_TIM BIT(3) +#define WLAN_STA_PERM BIT(4) +#define WLAN_STA_AUTHORIZED BIT(5) +#define WLAN_STA_PENDING_POLL BIT(6) /* pending activity poll not ACKed */ +#define WLAN_STA_SHORT_PREAMBLE BIT(7) +#define WLAN_STA_PREAUTH BIT(8) +#define WLAN_STA_WME BIT(9) +#define WLAN_STA_MFP BIT(10) +#define WLAN_STA_HT BIT(11) +#define WLAN_STA_WPS BIT(12) +#define WLAN_STA_MAYBE_WPS BIT(13) +#define WLAN_STA_NONERP BIT(31) + +#endif + +#define IEEE_CMD_SET_WPA_PARAM 1 +#define IEEE_CMD_SET_WPA_IE 2 +#define IEEE_CMD_SET_ENCRYPTION 3 +#define IEEE_CMD_MLME 4 + +#define IEEE_PARAM_WPA_ENABLED 1 +#define IEEE_PARAM_TKIP_COUNTERMEASURES 2 +#define IEEE_PARAM_DROP_UNENCRYPTED 3 +#define IEEE_PARAM_PRIVACY_INVOKED 4 +#define IEEE_PARAM_AUTH_ALGS 5 +#define IEEE_PARAM_IEEE_802_1X 6 +#define IEEE_PARAM_WPAX_SELECT 7 + +#define AUTH_ALG_OPEN_SYSTEM 0x1 +#define AUTH_ALG_SHARED_KEY 0x2 +#define AUTH_ALG_LEAP 0x00000004 + +#define IEEE_MLME_STA_DEAUTH 1 +#define IEEE_MLME_STA_DISASSOC 2 + +#define IEEE_CRYPT_ERR_UNKNOWN_ALG 2 +#define IEEE_CRYPT_ERR_UNKNOWN_ADDR 3 +#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED 4 +#define IEEE_CRYPT_ERR_KEY_SET_FAILED 5 +#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED 6 +#define IEEE_CRYPT_ERR_CARD_CONF_FAILED 7 + + +#define IEEE_CRYPT_ALG_NAME_LEN 16 + +#define WPA_CIPHER_NONE BIT(0) +#define WPA_CIPHER_WEP40 BIT(1) +#define WPA_CIPHER_WEP104 BIT(2) +#define WPA_CIPHER_TKIP BIT(3) +#define WPA_CIPHER_CCMP BIT(4) + + + +#define WPA_SELECTOR_LEN 4 +//extern u16 RTW_WPA_VERSION ; +//extern u8 WPA_AUTH_KEY_MGMT_NONE[]; +//extern u8 WPA_AUTH_KEY_MGMT_UNSPEC_802_1X[]; +//extern u8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[]; +//extern u8 WPA_CIPHER_SUITE_WRAP[]; + +#define RSN_HEADER_LEN 4 +#define RSN_SELECTOR_LEN 4 + +//tern u8 RSN_CIPHER_SUITE_WRAP[]; + +typedef enum _RATEID_IDX_ { + RATEID_IDX_BGN_40M_2SS = 0, + RATEID_IDX_BGN_40M_1SS = 1, + RATEID_IDX_BGN_20M_2SS_BN = 2, + RATEID_IDX_BGN_20M_1SS_BN = 3, + RATEID_IDX_GN_N2SS = 4, + RATEID_IDX_GN_N1SS = 5, + RATEID_IDX_BG = 6, + RATEID_IDX_G = 7, + RATEID_IDX_B = 8, + RATEID_IDX_VHT_2SS = 9, + RATEID_IDX_VHT_1SS = 10, +} RATEID_IDX, *PRATEID_IDX; + +enum NETWORK_TYPE +{ + WIRELESS_INVALID = 0, + //Sub-Element + WIRELESS_11B = BIT(0), // tx: cck only , rx: cck only, hw: cck + WIRELESS_11G = BIT(1), // tx: ofdm only, rx: ofdm & cck, hw: cck & ofdm + WIRELESS_11A = BIT(2), // tx: ofdm only, rx: ofdm only, hw: ofdm only + WIRELESS_11_24N = BIT(3), // tx: MCS only, rx: MCS & cck, hw: MCS & cck + WIRELESS_11_5N = BIT(4), // tx: MCS only, rx: MCS & ofdm, hw: ofdm only + //WIRELESS_AUTO = BIT(5), + WIRELESS_11AC = BIT(6), + + //Combination + WIRELESS_11BG = (WIRELESS_11B|WIRELESS_11G), // tx: cck & ofdm, rx: cck & ofdm & MCS, hw: cck & ofdm + WIRELESS_11G_24N = (WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & MCS, rx: ofdm & cck & MCS, hw: cck & ofdm + WIRELESS_11A_5N = (WIRELESS_11A|WIRELESS_11_5N), // tx: ofdm & MCS, rx: ofdm & MCS, hw: ofdm only + WIRELESS_11BG_24N = (WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & cck & MCS, rx: ofdm & cck & MCS, hw: ofdm & cck + WIRELESS_11AGN = (WIRELESS_11A|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N), // tx: ofdm & MCS, rx: ofdm & MCS, hw: ofdm only + WIRELESS_11ABGN = (WIRELESS_11A|WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N), +}; + + +#define SUPPORTED_24G_NETTYPE_MSK (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N) +#define SUPPORTED_5G_NETTYPE_MSK (WIRELESS_11A | WIRELESS_11_5N) + +#define IsSupported24G(NetType) ((NetType) & SUPPORTED_24G_NETTYPE_MSK ? _TRUE : _FALSE) +#define IsSupported5G(NetType) ((NetType) & SUPPORTED_5G_NETTYPE_MSK ? _TRUE : _FALSE) + +//TODO +#if 0 +#define IsEnableHWCCK(NetType) IsSupported24G(NetType) +#define IsEnableHWOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11_24N|SUPPORTED_5G_NETTYPE_MSK) ? _TRUE : _FALSE) + +#define IsSupportedRxCCK(NetType) IsEnableHWCCK(NetType) +#define IsSupportedRxOFDM(NetType) IsEnableHWOFDM(NetType) +#define IsSupportedRxMCS(NetType) IsEnableHWOFDM(NetType) + +#define IsSupportedTxCCK(NetType) ((NetType) & (WIRELESS_11B) ? _TRUE : _FALSE) +#define IsSupportedTxOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11A) ? _TRUE : _FALSE) +#define IsSupportedTxMCS(NetType) ((NetType) & (WIRELESS_11_24N|WIRELESS_11_5N) ? _TRUE : _FALSE) + +#endif //#if 0 + +typedef struct ieee_param { + u32 cmd; + u8 sta_addr[ETH_ALEN]; + union { + struct { + u8 name; + u32 value; + } wpa_param; + struct { + u32 len; + u8 reserved[32]; +#ifdef __CC_ARM + u8 data[1]; +#else + u8 data[0]; +#endif + } wpa_ie; + struct{ + int command; + int reason_code; + } mlme; + struct { + u8 alg[IEEE_CRYPT_ALG_NAME_LEN]; + u8 set_tx; + u32 err; + u8 idx; + u8 seq[8]; /* sequence counter (set: RX, get: TX) */ + u16 key_len; +#ifdef __CC_ARM + u8 key[1]; +#else + u8 key[0]; +#endif + } crypt; +#ifdef CONFIG_AP_MODE + struct { + u16 aid; + u16 capability; + int flags; + u8 tx_supp_rates[16]; + struct rtw_ieee80211_ht_cap ht_cap; + } add_sta; + struct { + u8 reserved[2];//for set max_num_sta +#ifdef __CC_ARM + u8 buf[1]; +#else + u8 buf[0]; +#endif + } bcn_ie; +#endif + + } u; +}ieee_param; + +//TODO +#if 0 + +#ifdef CONFIG_AP_MODE +typedef struct ieee_param_ex { + u32 cmd; + u8 sta_addr[ETH_ALEN]; + u8 data[0]; +}ieee_param_ex; + +struct sta_data{ + u16 aid; + u16 capability; + int flags; + u32 sta_set; + u8 tx_supp_rates[16]; + u32 tx_supp_rates_len; + struct rtw_ieee80211_ht_cap ht_cap; + u64 rx_pkts; + u64 rx_bytes; + u64 rx_drops; + u64 tx_pkts; + u64 tx_bytes; + u64 tx_drops; +}; +#endif + + +#if WIRELESS_EXT < 17 +#define IW_QUAL_QUAL_INVALID 0x10 +#define IW_QUAL_LEVEL_INVALID 0x20 +#define IW_QUAL_NOISE_INVALID 0x40 +#define IW_QUAL_QUAL_UPDATED 0x1 +#define IW_QUAL_LEVEL_UPDATED 0x2 +#define IW_QUAL_NOISE_UPDATED 0x4 +#endif + +#define IEEE80211_DATA_LEN 2304 +/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section + 6.2.1.1.2. + + The figure in section 7.1.2 suggests a body size of up to 2312 + bytes is allowed, which is a bit confusing, I suspect this + represents the 2304 bytes of real data, plus a possible 8 bytes of + WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ + + +#define IEEE80211_HLEN 30 +#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) + + +/* this is stolen from ipw2200 driver */ +#define IEEE_IBSS_MAC_HASH_SIZE 31 + +struct ieee_ibss_seq { + u8 mac[ETH_ALEN]; + u16 seq_num; + u16 frag_num; + unsigned long packet_time; + _list list; +}; + +#endif //#if 0 + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW)||defined(PLATFORM_FREEBSD) || defined(PLATFORM_ECOS) || defined(PLATFORM_FREERTOS) || defined(PLATFORM_CMSIS_RTOS) + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct rtw_ieee80211_hdr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u8 addr4[ETH_ALEN]; +} RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct rtw_ieee80211_hdr_3addr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; +} RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct rtw_ieee80211_hdr_qos { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u8 addr4[ETH_ALEN]; + u16 qc; +} RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct rtw_ieee80211_hdr_3addr_qos { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u16 qc; +} RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct eapol { + u8 snap[6]; + u16 ethertype; + u8 version; + u8 type; + u16 length; +} RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + +#endif //defined PLATFORM_LINUX/CONFIG_RTL8711FW/PLATFORM_FREEBSD/PLATFORM_ECOSPLATFORM_FREERTOS + +//TODO +#if 0 + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +struct rtw_ieee80211_hdr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u8 addr4[ETH_ALEN]; +}; + +struct rtw_ieee80211_hdr_3addr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; +}; + + +struct rtw_ieee80211_hdr_qos { + struct rtw_ieee80211_hdr wlan_hdr; + u16 qc; +}; + +struct rtw_ieee80211_hdr_3addr_qos { + struct rtw_ieee80211_hdr_3addr wlan_hdr; + u16 qc; +}; + +struct eapol { + u8 snap[6]; + u16 ethertype; + u8 version; + u8 type; + u16 length; +}; +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + + + +enum eap_type { + EAP_PACKET = 0, + EAPOL_START, + EAPOL_LOGOFF, + EAPOL_KEY, + EAPOL_ENCAP_ASF_ALERT +}; + +#endif //#if 0 + +#define IEEE80211_3ADDR_LEN 24 +#define IEEE80211_4ADDR_LEN 30 +#define IEEE80211_FCS_LEN 4 + +#define MIN_FRAG_THRESHOLD 256U +#define MAX_FRAG_THRESHOLD 2346U + +/* Frame control field constants */ +#define RTW_IEEE80211_FCTL_VERS 0x0002 +#define RTW_IEEE80211_FCTL_FTYPE 0x000c +#define RTW_IEEE80211_FCTL_STYPE 0x00f0 +#define RTW_IEEE80211_FCTL_TODS 0x0100 +#define RTW_IEEE80211_FCTL_FROMDS 0x0200 +#define RTW_IEEE80211_FCTL_MOREFRAGS 0x0400 +#define RTW_IEEE80211_FCTL_RETRY 0x0800 +#define RTW_IEEE80211_FCTL_PM 0x1000 +#define RTW_IEEE80211_FCTL_MOREDATA 0x2000 +#define RTW_IEEE80211_FCTL_WEP 0x4000 +#define RTW_IEEE80211_FCTL_ORDER 0x8000 + +#define RTW_IEEE80211_FTYPE_MGMT 0x0000 +#define RTW_IEEE80211_FTYPE_CTL 0x0004 +#define RTW_IEEE80211_FTYPE_DATA 0x0008 + +/* management */ +#define RTW_IEEE80211_STYPE_ASSOC_REQ 0x0000 +#define RTW_IEEE80211_STYPE_ASSOC_RESP 0x0010 +#define RTW_IEEE80211_STYPE_REASSOC_REQ 0x0020 +#define RTW_IEEE80211_STYPE_REASSOC_RESP 0x0030 +#define RTW_IEEE80211_STYPE_PROBE_REQ 0x0040 +#define RTW_IEEE80211_STYPE_PROBE_RESP 0x0050 +#define RTW_IEEE80211_STYPE_BEACON 0x0080 +#define RTW_IEEE80211_STYPE_ATIM 0x0090 +#define RTW_IEEE80211_STYPE_DISASSOC 0x00A0 +#define RTW_IEEE80211_STYPE_AUTH 0x00B0 +#define RTW_IEEE80211_STYPE_DEAUTH 0x00C0 + +/* control */ +#define RTW_IEEE80211_STYPE_PSPOLL 0x00A0 +#define RTW_IEEE80211_STYPE_RTS 0x00B0 +#define RTW_IEEE80211_STYPE_CTS 0x00C0 +#define RTW_IEEE80211_STYPE_ACK 0x00D0 +#define RTW_IEEE80211_STYPE_CFEND 0x00E0 +#define RTW_IEEE80211_STYPE_CFENDACK 0x00F0 + +/* data */ +#define RTW_IEEE80211_STYPE_DATA 0x0000 +#define RTW_IEEE80211_STYPE_DATA_CFACK 0x0010 +#define RTW_IEEE80211_STYPE_DATA_CFPOLL 0x0020 +#define RTW_IEEE80211_STYPE_DATA_CFACKPOLL 0x0030 +#define RTW_IEEE80211_STYPE_NULLFUNC 0x0040 +#define RTW_IEEE80211_STYPE_CFACK 0x0050 +#define RTW_IEEE80211_STYPE_CFPOLL 0x0060 +#define RTW_IEEE80211_STYPE_CFACKPOLL 0x0070 +#define RTW_IEEE80211_QOS_DATAGRP 0x0080 +#define RTW_IEEE80211_QoS_DATAGRP RTW_IEEE80211_QOS_DATAGRP + +#define RTW_IEEE80211_SCTL_FRAG 0x000F +#define RTW_IEEE80211_SCTL_SEQ 0xFFF0 + + +#define RTW_ERP_INFO_NON_ERP_PRESENT BIT(0) +#define RTW_ERP_INFO_USE_PROTECTION BIT(1) +#define RTW_ERP_INFO_BARKER_PREAMBLE_MODE BIT(2) + +/* QoS,QOS */ +#define NORMAL_ACK 0 +#define NO_ACK 1 +#define NON_EXPLICIT_ACK 2 +#define BLOCK_ACK 3 + +#ifndef ETH_P_PAE +#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ +#endif /* ETH_P_PAE */ + +#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ + +#define ETH_P_ECONET 0x0018 + +#ifndef ETH_P_80211_RAW +#define ETH_P_80211_RAW (ETH_P_ECONET + 1) +#endif + +/* IEEE 802.11 defines */ + +#define P80211_OUI_LEN 3 + + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) || defined(PLATFORM_FREEBSD) || defined(PLATFORM_ECOS) || defined(PLATFORM_FREERTOS) || defined(PLATFORM_CMSIS_RTOS) +RTW_PACK_STRUCT_BEGIN +struct ieee80211_snap_hdr { + + u8 dsap; /* always 0xAA */ + u8 ssap; /* always 0xAA */ + u8 ctrl; /* always 0x03 */ + u8 oui[P80211_OUI_LEN]; /* organizational universal id */ + +} RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END + +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_snap_hdr { + + u8 dsap; /* always 0xAA */ + u8 ssap; /* always 0xAA */ + u8 ctrl; /* always 0x03 */ + u8 oui[P80211_OUI_LEN]; /* organizational universal id */ + +}; +#pragma pack() + +#endif + + +#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) + +#define WLAN_FC_GET_TYPE(fc) ((fc) & RTW_IEEE80211_FCTL_FTYPE) +#define WLAN_FC_GET_STYPE(fc) ((fc) & RTW_IEEE80211_FCTL_STYPE) + +#define WLAN_QC_GET_TID(qc) ((qc) & 0x0f) + +#define WLAN_GET_SEQ_FRAG(seq) ((seq) & RTW_IEEE80211_SCTL_FRAG) +#define WLAN_GET_SEQ_SEQ(seq) ((seq) & RTW_IEEE80211_SCTL_SEQ) + + + +/* Authentication algorithms */ +#define WLAN_AUTH_OPEN 0 +#define WLAN_AUTH_SHARED_KEY 1 + +#define WLAN_AUTH_CHALLENGE_LEN 128 + +#define WLAN_CAPABILITY_BSS (1<<0) +#define WLAN_CAPABILITY_IBSS (1<<1) +#define WLAN_CAPABILITY_CF_POLLABLE (1<<2) +#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3) +#define WLAN_CAPABILITY_PRIVACY (1<<4) +#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5) +#define WLAN_CAPABILITY_PBCC (1<<6) +#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7) +#define WLAN_CAPABILITY_SHORT_SLOT (1<<10) + +/* Status codes */ +#define WLAN_STATUS_SUCCESS 0 +#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 +#define WLAN_STATUS_CAPS_UNSUPPORTED 10 +#define WLAN_STATUS_REASSOC_NO_ASSOC 11 +#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 +#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 +#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 +#define WLAN_STATUS_CHALLENGE_FAIL 15 +#define WLAN_STATUS_AUTH_TIMEOUT 16 +#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 +#define WLAN_STATUS_ASSOC_DENIED_RATES 18 +/* 802.11b */ +#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 +#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 +#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 + +/* Reason codes */ +#define WLAN_REASON_UNSPECIFIED 1 +#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 +#define WLAN_REASON_DEAUTH_LEAVING 3 +#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 +#define WLAN_REASON_DISASSOC_AP_BUSY 5 +#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 +#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 +#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 +#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 +#define WLAN_REASON_JOIN_WRONG_CHANNEL 65534 + +/* Information Element IDs */ +#define WLAN_EID_SSID 0 +#define WLAN_EID_SUPP_RATES 1 +#define WLAN_EID_FH_PARAMS 2 +#define WLAN_EID_DS_PARAMS 3 +#define WLAN_EID_CF_PARAMS 4 +#define WLAN_EID_TIM 5 +#define WLAN_EID_IBSS_PARAMS 6 +#define WLAN_EID_CHALLENGE 16 +/* EIDs defined by IEEE 802.11h - START */ +#define WLAN_EID_PWR_CONSTRAINT 32 +#define WLAN_EID_PWR_CAPABILITY 33 +#define WLAN_EID_TPC_REQUEST 34 +#define WLAN_EID_TPC_REPORT 35 +#define WLAN_EID_SUPPORTED_CHANNELS 36 +#define WLAN_EID_CHANNEL_SWITCH 37 +#define WLAN_EID_MEASURE_REQUEST 38 +#define WLAN_EID_MEASURE_REPORT 39 +#define WLAN_EID_QUITE 40 +#define WLAN_EID_IBSS_DFS 41 +/* EIDs defined by IEEE 802.11h - END */ +#define WLAN_EID_ERP_INFO 42 +#define WLAN_EID_HT_CAP 45 +#define WLAN_EID_RSN 48 +#define WLAN_EID_EXT_SUPP_RATES 50 +#define WLAN_EID_MOBILITY_DOMAIN 54 +#define WLAN_EID_FAST_BSS_TRANSITION 55 +#define WLAN_EID_TIMEOUT_INTERVAL 56 +#define WLAN_EID_RIC_DATA 57 +#define WLAN_EID_HT_OPERATION 61 +#define WLAN_EID_SECONDARY_CHANNEL_OFFSET 62 +#define WLAN_EID_20_40_BSS_COEXISTENCE 72 +#define WLAN_EID_20_40_BSS_INTOLERANT 73 +#define WLAN_EID_OVERLAPPING_BSS_SCAN_PARAMS 74 +#define WLAN_EID_MMIE 76 +#define WLAN_EID_VENDOR_SPECIFIC 221 +#define WLAN_EID_GENERIC (WLAN_EID_VENDOR_SPECIFIC) + +#define IEEE80211_MGMT_HDR_LEN 24 +#define IEEE80211_DATA_HDR3_LEN 24 +#define IEEE80211_DATA_HDR4_LEN 30 + + +#define IEEE80211_STATMASK_SIGNAL (1<<0) +#define IEEE80211_STATMASK_RSSI (1<<1) +#define IEEE80211_STATMASK_NOISE (1<<2) +#define IEEE80211_STATMASK_RATE (1<<3) +#define IEEE80211_STATMASK_WEMASK 0x7 + + +#define IEEE80211_CCK_MODULATION (1<<0) +#define IEEE80211_OFDM_MODULATION (1<<1) + +#define IEEE80211_24GHZ_BAND (1<<0) +#define IEEE80211_52GHZ_BAND (1<<1) + +#define IEEE80211_CCK_RATE_LEN 4 +#define IEEE80211_NUM_OFDM_RATESLEN 8 + + +#define IEEE80211_CCK_RATE_1MB 0x02 +#define IEEE80211_CCK_RATE_2MB 0x04 +#define IEEE80211_CCK_RATE_5MB 0x0B +#define IEEE80211_CCK_RATE_11MB 0x16 +#define IEEE80211_OFDM_RATE_LEN 8 +#define IEEE80211_OFDM_RATE_6MB 0x0C +#define IEEE80211_OFDM_RATE_9MB 0x12 +#define IEEE80211_OFDM_RATE_12MB 0x18 +#define IEEE80211_OFDM_RATE_18MB 0x24 +#define IEEE80211_OFDM_RATE_24MB 0x30 +#define IEEE80211_OFDM_RATE_36MB 0x48 +#define IEEE80211_OFDM_RATE_48MB 0x60 +#define IEEE80211_OFDM_RATE_54MB 0x6C +#define IEEE80211_BASIC_RATE_MASK 0x80 + +#define IEEE80211_CCK_RATE_1MB_MASK (1<<0) +#define IEEE80211_CCK_RATE_2MB_MASK (1<<1) +#define IEEE80211_CCK_RATE_5MB_MASK (1<<2) +#define IEEE80211_CCK_RATE_11MB_MASK (1<<3) +#define IEEE80211_OFDM_RATE_6MB_MASK (1<<4) +#define IEEE80211_OFDM_RATE_9MB_MASK (1<<5) +#define IEEE80211_OFDM_RATE_12MB_MASK (1<<6) +#define IEEE80211_OFDM_RATE_18MB_MASK (1<<7) +#define IEEE80211_OFDM_RATE_24MB_MASK (1<<8) +#define IEEE80211_OFDM_RATE_36MB_MASK (1<<9) +#define IEEE80211_OFDM_RATE_48MB_MASK (1<<10) +#define IEEE80211_OFDM_RATE_54MB_MASK (1<<11) + + +#define IEEE80211_CCK_RATES_MASK 0x0000000F +#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \ + IEEE80211_CCK_RATE_2MB_MASK) +#define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \ + IEEE80211_CCK_RATE_5MB_MASK | \ + IEEE80211_CCK_RATE_11MB_MASK) + +#define IEEE80211_OFDM_RATES_MASK 0x00000FF0 +#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \ + IEEE80211_OFDM_RATE_12MB_MASK | \ + IEEE80211_OFDM_RATE_24MB_MASK) +#define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \ + IEEE80211_OFDM_RATE_9MB_MASK | \ + IEEE80211_OFDM_RATE_18MB_MASK | \ + IEEE80211_OFDM_RATE_36MB_MASK | \ + IEEE80211_OFDM_RATE_48MB_MASK | \ + IEEE80211_OFDM_RATE_54MB_MASK) +#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \ + IEEE80211_CCK_DEFAULT_RATES_MASK) + +#define IEEE80211_NUM_OFDM_RATES 8 +#define IEEE80211_NUM_CCK_RATES 4 +#define IEEE80211_OFDM_SHIFT_MASK_A 4 + + +/* BIT 7 HT Rate*/ +enum MGN_RATE{ + MGN_1M = 0x02, + MGN_2M = 0x04, + MGN_5_5M = 0x0B, + MGN_6M = 0x0C, + MGN_9M = 0x12, + MGN_11M = 0x16, + MGN_12M = 0x18, + MGN_18M = 0x24, + MGN_24M = 0x30, + MGN_36M = 0x48, + MGN_48M = 0x60, + MGN_54M = 0x6C, + MGN_MCS32 = 0x7F, + MGN_MCS0, + MGN_MCS1, + MGN_MCS2, + MGN_MCS3, + MGN_MCS4, + MGN_MCS5, + MGN_MCS6, + MGN_MCS7, + MGN_MCS8, + MGN_MCS9, + MGN_MCS10, + MGN_MCS11, + MGN_MCS12, + MGN_MCS13, + MGN_MCS14, + MGN_MCS15, + MGN_MCS16, + MGN_MCS17, + MGN_MCS18, + MGN_MCS19, + MGN_MCS20, + MGN_MCS21, + MGN_MCS22, + MGN_MCS23, + MGN_MCS24, + MGN_MCS25, + MGN_MCS26, + MGN_MCS27, + MGN_MCS28, + MGN_MCS29, + MGN_MCS30, + MGN_MCS31, + MGN_VHT1SS_MCS0, + MGN_VHT1SS_MCS1, + MGN_VHT1SS_MCS2, + MGN_VHT1SS_MCS3, + MGN_VHT1SS_MCS4, + MGN_VHT1SS_MCS5, + MGN_VHT1SS_MCS6, + MGN_VHT1SS_MCS7, + MGN_VHT1SS_MCS8, + MGN_VHT1SS_MCS9, + MGN_VHT2SS_MCS0, + MGN_VHT2SS_MCS1, + MGN_VHT2SS_MCS2, + MGN_VHT2SS_MCS3, + MGN_VHT2SS_MCS4, + MGN_VHT2SS_MCS5, + MGN_VHT2SS_MCS6, + MGN_VHT2SS_MCS7, + MGN_VHT2SS_MCS8, + MGN_VHT2SS_MCS9, + MGN_VHT3SS_MCS0, + MGN_VHT3SS_MCS1, + MGN_VHT3SS_MCS2, + MGN_VHT3SS_MCS3, + MGN_VHT3SS_MCS4, + MGN_VHT3SS_MCS5, + MGN_VHT3SS_MCS6, + MGN_VHT3SS_MCS7, + MGN_VHT3SS_MCS8, + MGN_VHT3SS_MCS9, + MGN_VHT4SS_MCS0, + MGN_VHT4SS_MCS1, + MGN_VHT4SS_MCS2, + MGN_VHT4SS_MCS3, + MGN_VHT4SS_MCS4, + MGN_VHT4SS_MCS5, + MGN_VHT4SS_MCS6, + MGN_VHT4SS_MCS7, + MGN_VHT4SS_MCS8, + MGN_VHT4SS_MCS9, + MGN_UNKNOWN +}; + + +#define MGN_MCS0_SG 0xc0 +#define MGN_MCS1_SG 0xc1 +#define MGN_MCS2_SG 0xc2 +#define MGN_MCS3_SG 0xc3 +#define MGN_MCS4_SG 0xc4 +#define MGN_MCS5_SG 0xc5 +#define MGN_MCS6_SG 0xc6 +#define MGN_MCS7_SG 0xc7 +#define MGN_MCS8_SG 0xc8 +#define MGN_MCS9_SG 0xc9 +#define MGN_MCS10_SG 0xca +#define MGN_MCS11_SG 0xcb +#define MGN_MCS12_SG 0xcc +#define MGN_MCS13_SG 0xcd +#define MGN_MCS14_SG 0xce +#define MGN_MCS15_SG 0xcf + +#define IS_HT_RATE(_rate) (((_rate) & 0x80) ? _TRUE : _FALSE) +#define IS_CCK_RATE(_rate) (MGN_1M == _rate || _rate == MGN_2M || _rate == MGN_5_5M || _rate == MGN_11M ) +#define IS_OFDM_RATE(_rate) (MGN_6M <= _rate && _rate <= MGN_54M ) + + +/* NOTE: This data is for statistical purposes; not all hardware provides this + * information for frames received. Not setting these will not cause + * any adverse affects. */ +struct ieee80211_rx_stats { + //u32 mac_time[2]; + s8 rssi; + u8 signal; + u8 noise; + u8 received_channel; + u16 rate; /* in 100 kbps */ + //u8 control; + u8 mask; + u8 freq; + u16 len; +}; + +/* IEEE 802.11 requires that STA supports concurrent reception of at least + * three fragmented frames. This define can be increased to support more + * concurrent frames, but it should be noted that each entry can consume about + * 2 kB of RAM and increasing cache size will slow down frame reassembly. */ +#define IEEE80211_FRAG_CACHE_LEN 4 + +struct ieee80211_frag_entry { + u32 first_frag_time; + uint seq; + uint last_frag; + uint qos; //jackson + uint tid; //jackson + struct sk_buff *skb; + u8 src_addr[ETH_ALEN]; + u8 dst_addr[ETH_ALEN]; +}; + +#ifndef PLATFORM_FREEBSD //Baron BSD has already defined +struct ieee80211_stats { + uint tx_unicast_frames; + uint tx_multicast_frames; + uint tx_fragments; + uint tx_unicast_octets; + uint tx_multicast_octets; + uint tx_deferred_transmissions; + uint tx_single_retry_frames; + uint tx_multiple_retry_frames; + uint tx_retry_limit_exceeded; + uint tx_discards; + uint rx_unicast_frames; + uint rx_multicast_frames; + uint rx_fragments; + uint rx_unicast_octets; + uint rx_multicast_octets; + uint rx_fcs_errors; + uint rx_discards_no_buffer; + uint tx_discards_wrong_sa; + uint rx_discards_undecryptable; + uint rx_message_in_msg_fragments; + uint rx_message_in_bad_msg_fragments; +}; +#endif //PLATFORM_FREEBSD +struct ieee80211_softmac_stats{ + uint rx_ass_ok; + uint rx_ass_err; + uint rx_probe_rq; + uint tx_probe_rs; + uint tx_beacons; + uint rx_auth_rq; + uint rx_auth_rs_ok; + uint rx_auth_rs_err; + uint tx_auth_rq; + uint no_auth_rs; + uint no_ass_rs; + uint tx_ass_rq; + uint rx_ass_rq; + uint tx_probe_rq; + uint reassoc; + uint swtxstop; + uint swtxawake; +}; + +#define SEC_KEY_1 (1<<0) +#define SEC_KEY_2 (1<<1) +#define SEC_KEY_3 (1<<2) +#define SEC_KEY_4 (1<<3) +#define SEC_ACTIVE_KEY (1<<4) +#define SEC_AUTH_MODE (1<<5) +#define SEC_UNICAST_GROUP (1<<6) +#define SEC_LEVEL (1<<7) +#define SEC_ENABLED (1<<8) + +#define SEC_LEVEL_0 0 /* None */ +#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ +#define SEC_LEVEL_2 2 /* Level 1 + TKIP */ +#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ +#define SEC_LEVEL_3 4 /* Level 2 + CCMP */ + +#define WEP_KEYS 4 +#define WEP_KEY_LEN 13 + + + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + +struct ieee80211_security { + u16 active_key:2, + enabled:1, + auth_mode:2, + auth_algo:4, + unicast_uses_group:1; + u8 key_sizes[WEP_KEYS]; + u8 keys[WEP_KEYS][WEP_KEY_LEN]; + u8 level; + u16 flags; +} __attribute__ ((packed)); + +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_security { + u16 active_key:2, + enabled:1, + auth_mode:2, + auth_algo:4, + unicast_uses_group:1; + u8 key_sizes[WEP_KEYS]; + u8 keys[WEP_KEYS][WEP_KEY_LEN]; + u8 level; + u16 flags; +} ; +#pragma pack() + +#endif + +/* + + 802.11 data frame from AP + + ,-------------------------------------------------------------------. +Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 | + |------|------|---------|---------|---------|------|---------|------| +Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs | + | | tion | (BSSID) | | | ence | data | | + `-------------------------------------------------------------------' + +Total: 28-2340 bytes + +*/ + +struct ieee80211_header_data { + u16 frame_ctl; + u16 duration_id; + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + u16 seq_ctrl; +}; + +#define BEACON_PROBE_SSID_ID_POSITION 12 + +/* Management Frame Information Element Types */ +#define MFIE_TYPE_SSID 0 +#define MFIE_TYPE_RATES 1 +#define MFIE_TYPE_FH_SET 2 +#define MFIE_TYPE_DS_SET 3 +#define MFIE_TYPE_CF_SET 4 +#define MFIE_TYPE_TIM 5 +#define MFIE_TYPE_IBSS_SET 6 +#define MFIE_TYPE_CHALLENGE 16 +#define MFIE_TYPE_ERP 42 +#define MFIE_TYPE_RSN 48 +#define MFIE_TYPE_RATES_EX 50 +#define MFIE_TYPE_GENERIC 221 + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + +struct ieee80211_info_element_hdr { + u8 id; + u8 len; +} __attribute__ ((packed)); + +struct ieee80211_info_element { + u8 id; + u8 len; + u8 data[0]; +} __attribute__ ((packed)); +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_info_element_hdr { + u8 id; + u8 len; +} ; + +struct ieee80211_info_element { + u8 id; + u8 len; + u8 data[0]; +} ; +#pragma pack() + +#endif + + +/* + * These are the data types that can make up management packets + * + u16 auth_algorithm; + u16 auth_sequence; + u16 beacon_interval; + u16 capability; + u8 current_ap[ETH_ALEN]; + u16 listen_interval; + struct { + u16 association_id:14, reserved:2; + } __attribute__ ((packed)); + u32 time_stamp[2]; + u16 reason; + u16 status; +*/ + +#define IEEE80211_DEFAULT_TX_ESSID "Penguin" +#define IEEE80211_DEFAULT_BASIC_RATE 10 + + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + + +struct ieee80211_authentication { + struct ieee80211_header_data header; + u16 algorithm; + u16 transaction; + u16 status; + //struct ieee80211_info_element_hdr info_element; +} __attribute__ ((packed)); + + +struct ieee80211_probe_response { + struct ieee80211_header_data header; + u32 time_stamp[2]; + u16 beacon_interval; + u16 capability; + struct ieee80211_info_element info_element; +} __attribute__ ((packed)); + +struct ieee80211_probe_request { + struct ieee80211_header_data header; + /*struct ieee80211_info_element info_element;*/ +} __attribute__ ((packed)); + +struct ieee80211_assoc_request_frame { + struct rtw_ieee80211_hdr_3addr header; + u16 capability; + u16 listen_interval; + //u8 current_ap[ETH_ALEN]; + struct ieee80211_info_element_hdr info_element; +} __attribute__ ((packed)); + +struct ieee80211_assoc_response_frame { + struct rtw_ieee80211_hdr_3addr header; + u16 capability; + u16 status; + u16 aid; +// struct ieee80211_info_element info_element; /* supported rates */ +} __attribute__ ((packed)); +#endif + + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct ieee80211_authentication { + struct ieee80211_header_data header; + u16 algorithm; + u16 transaction; + u16 status; + //struct ieee80211_info_element_hdr info_element; +} ; + + +struct ieee80211_probe_response { + struct ieee80211_header_data header; + u32 time_stamp[2]; + u16 beacon_interval; + u16 capability; + struct ieee80211_info_element info_element; +} ; + +struct ieee80211_probe_request { + struct ieee80211_header_data header; + /*struct ieee80211_info_element info_element;*/ +} ; + +struct ieee80211_assoc_request_frame { + struct rtw_ieee80211_hdr_3addr header; + u16 capability; + u16 listen_interval; + //u8 current_ap[ETH_ALEN]; + struct ieee80211_info_element_hdr info_element; +} ; + +struct ieee80211_assoc_response_frame { + struct rtw_ieee80211_hdr_3addr header; + u16 capability; + u16 status; + u16 aid; +// struct ieee80211_info_element info_element; /* supported rates */ +}; + +#pragma pack() + +#endif + +/* SWEEP TABLE ENTRIES NUMBER*/ +#define MAX_SWEEP_TAB_ENTRIES 42 +#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 +/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs + * only use 8, and then use extended rates for the remaining supported + * rates. Other APs, however, stick all of their supported rates on the + * main rates information element... */ +#define MAX_RATES_LENGTH ((u8)12) +#define MAX_RATES_EX_LENGTH ((u8)16) +#define MAX_NETWORK_COUNT 128 +#define MAX_CHANNEL_NUMBER 161 +#define IEEE80211_SOFTMAC_SCAN_TIME 400 +//(HZ / 2) +#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2) + +#define CRC_LENGTH 4U + +#define MAX_WPA_IE_LEN (256) +#define MAX_WPS_IE_LEN (512) +#define MAX_P2P_IE_LEN (256) +#define MAX_WFD_IE_LEN (128) + +#define NETWORK_EMPTY_ESSID (1<<0) +#define NETWORK_HAS_OFDM (1<<1) +#define NETWORK_HAS_CCK (1<<2) + +#define IEEE80211_DTIM_MBCAST 4 +#define IEEE80211_DTIM_UCAST 2 +#define IEEE80211_DTIM_VALID 1 +#define IEEE80211_DTIM_INVALID 0 + +#define IEEE80211_PS_DISABLED 0 +#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST +#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST +#define IW_ESSID_MAX_SIZE 32 +#define IW_PASSPHRASE_MAX_SIZE 64 +#if 0 +struct ieee80211_network { + /* These entries are used to identify a unique network */ + u8 bssid[ETH_ALEN]; + u8 channel; + /* Ensure null-terminated for any debug msgs */ + u8 ssid[IW_ESSID_MAX_SIZE + 1]; + u8 ssid_len; + u8 rssi; //relative signal strength + u8 sq; //signal quality + + /* These are network statistics */ + //struct ieee80211_rx_stats stats; + u16 capability; + u16 aid; + u8 rates[MAX_RATES_LENGTH]; + u8 rates_len; + u8 rates_ex[MAX_RATES_EX_LENGTH]; + u8 rates_ex_len; + + u8 edca_parmsets[18]; + + u8 mode; + u8 flags; + u8 time_stamp[8]; + u16 beacon_interval; + u16 listen_interval; + u16 atim_window; + u8 wpa_ie[MAX_WPA_IE_LEN]; + size_t wpa_ie_len; + u8 rsn_ie[MAX_WPA_IE_LEN]; + size_t rsn_ie_len; + u8 country[6]; + u8 dtim_period; + u8 dtim_data; + u8 power_constraint; + u8 qosinfo; + u8 qbssload[5]; + u8 network_type; + int join_res; + unsigned long last_scanned; +}; +#endif +/* +join_res: +-1: authentication fail +-2: association fail +> 0: TID +*/ + +#ifndef PLATFORM_FREEBSD //Baron BSD has already defined + +enum ieee80211_state { + + /* the card is not linked at all */ + IEEE80211_NOLINK = 0, + + /* IEEE80211_ASSOCIATING* are for BSS client mode + * the driver shall not perform RX filtering unless + * the state is LINKED. + * The driver shall just check for the state LINKED and + * defaults to NOLINK for ALL the other states (including + * LINKED_SCANNING) + */ + + /* the association procedure will start (wq scheduling)*/ + IEEE80211_ASSOCIATING, + IEEE80211_ASSOCIATING_RETRY, + + /* the association procedure is sending AUTH request*/ + IEEE80211_ASSOCIATING_AUTHENTICATING, + + /* the association procedure has successfully authentcated + * and is sending association request + */ + IEEE80211_ASSOCIATING_AUTHENTICATED, + + /* the link is ok. the card associated to a BSS or linked + * to a ibss cell or acting as an AP and creating the bss + */ + IEEE80211_LINKED, + + /* same as LINKED, but the driver shall apply RX filter + * rules as we are in NO_LINK mode. As the card is still + * logically linked, but it is doing a syncro site survey + * then it will be back to LINKED state. + */ + IEEE80211_LINKED_SCANNING, + +}; +#endif //PLATFORM_FREEBSD + +#define DEFAULT_MAX_SCAN_AGE (15 * HZ) +#define DEFAULT_FTS 2346 +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" +#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] + +#ifdef PLATFORM_FREEBSD //Baron change func to macro +#define is_multicast_mac_addr(Addr) ((((Addr[0]) & 0x01) == 0x01) && ((Addr[0]) != 0xff)) +#define is_broadcast_mac_addr(Addr) ((((Addr[0]) & 0xff) == 0xff) && (((Addr[1]) & 0xff) == 0xff) && \ +(((Addr[2]) & 0xff) == 0xff) && (((Addr[3]) & 0xff) == 0xff) && (((Addr[4]) & 0xff) == 0xff) && \ +(((Addr[5]) & 0xff) == 0xff)) +#else +#if 0 +extern __inline int is_multicast_mac_addr(const u8 *addr) +{ + return ((addr[0] != 0xff) && (0x01 & addr[0])); +} + +extern __inline int is_broadcast_mac_addr(const u8 *addr) +{ + return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ + (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); +} +#endif +#endif //PLATFORM_FREEBSD + +#define CFG_IEEE80211_RESERVE_FCS (1<<0) +#define CFG_IEEE80211_COMPUTE_FCS (1<<1) + +#define MAXTID 16 + +#define IEEE_A (1<<0) +#define IEEE_B (1<<1) +#define IEEE_G (1<<2) +#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G) + +//Baron move to ieee80211.c +int ieee80211_is_empty_essid(const char *essid, int essid_len); +int ieee80211_get_hdrlen(u16 fc); + +#if 0 +/* Action frame categories (IEEE 802.11-2007, 7.3.1.11, Table 7-24) */ +#define WLAN_ACTION_SPECTRUM_MGMT 0 +#define WLAN_ACTION_QOS 1 +#define WLAN_ACTION_DLS 2 +#define WLAN_ACTION_BLOCK_ACK 3 +#define WLAN_ACTION_RADIO_MEASUREMENT 5 +#define WLAN_ACTION_FT 6 +#define WLAN_ACTION_SA_QUERY 8 +#define WLAN_ACTION_WMM 17 +#endif + + +/* Action category code */ +enum rtw_ieee80211_category { + RTW_WLAN_CATEGORY_SPECTRUM_MGMT = 0, + RTW_WLAN_CATEGORY_QOS = 1, + RTW_WLAN_CATEGORY_DLS = 2, + RTW_WLAN_CATEGORY_BACK = 3, + RTW_WLAN_CATEGORY_PUBLIC = 4, //IEEE 802.11 public action frames + RTW_WLAN_CATEGORY_RADIO_MEASUREMENT = 5, + RTW_WLAN_CATEGORY_FT = 6, + RTW_WLAN_CATEGORY_HT = 7, + RTW_WLAN_CATEGORY_SA_QUERY = 8, + RTW_WLAN_CATEGORY_TDLS = 12, + RTW_WLAN_CATEGORY_WMM = 17, + RTW_WLAN_CATEGORY_P2P = 0x7f,//P2P action frames +}; + +/* SPECTRUM_MGMT action code */ +enum rtw_ieee80211_spectrum_mgmt_actioncode { + RTW_WLAN_ACTION_SPCT_MSR_REQ = 0, + RTW_WLAN_ACTION_SPCT_MSR_RPRT = 1, + RTW_WLAN_ACTION_SPCT_TPC_REQ = 2, + RTW_WLAN_ACTION_SPCT_TPC_RPRT = 3, + RTW_WLAN_ACTION_SPCT_CHL_SWITCH = 4, + RTW_WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, +}; + +enum _PUBLIC_ACTION{ + ACT_PUBLIC_BSSCOEXIST = 0, // 20/40 BSS Coexistence + ACT_PUBLIC_DSE_ENABLE = 1, + ACT_PUBLIC_DSE_DEENABLE = 2, + ACT_PUBLIC_DSE_REG_LOCATION = 3, + ACT_PUBLIC_EXT_CHL_SWITCH = 4, + ACT_PUBLIC_DSE_MSR_REQ = 5, + ACT_PUBLIC_DSE_MSR_RPRT = 6, + ACT_PUBLIC_MP = 7, // Measurement Pilot + ACT_PUBLIC_DSE_PWR_CONSTRAINT = 8, + ACT_PUBLIC_VENDOR = 9, // for WIFI_DIRECT + ACT_PUBLIC_GAS_INITIAL_REQ = 10, + ACT_PUBLIC_GAS_INITIAL_RSP = 11, + ACT_PUBLIC_GAS_COMEBACK_REQ = 12, + ACT_PUBLIC_GAS_COMEBACK_RSP = 13, + ACT_PUBLIC_TDLS_DISCOVERY_RSP = 14, + ACT_PUBLIC_LOCATION_TRACK = 15, + ACT_PUBLIC_MAX +}; + +#ifdef CONFIG_TDLS +enum TDLS_ACTION_FIELD{ + TDLS_SETUP_REQUEST = 0, + TDLS_SETUP_RESPONSE = 1, + TDLS_SETUP_CONFIRM = 2, + TDLS_TEARDOWN = 3, + TDLS_PEER_TRAFFIC_INDICATION = 4, + TDLS_CHANNEL_SWITCH_REQUEST = 5, + TDLS_CHANNEL_SWITCH_RESPONSE = 6, + TDLS_PEER_PSM_REQUEST = 7, + TDLS_PEER_PSM_RESPONSE = 8, + TDLS_PEER_TRAFFIC_RESPONSE = 9, + TDLS_DISCOVERY_REQUEST = 10, + TDLS_DISCOVERY_RESPONSE = 14, //it's used in public action frame +}; + +#define TUNNELED_PROBE_REQ 15 +#define TUNNELED_PROBE_RSP 16 +#endif //CONFIG_TDLS + +/* BACK action code */ +enum rtw_ieee80211_back_actioncode { + RTW_WLAN_ACTION_ADDBA_REQ = 0, + RTW_WLAN_ACTION_ADDBA_RESP = 1, + RTW_WLAN_ACTION_DELBA = 2, +}; + +/* HT features action code */ +enum rtw_ieee80211_ht_actioncode { + RTW_WLAN_ACTION_NOTIFY_CH_WIDTH = 0, + RTW_WLAN_ACTION_SM_PS = 1, + RTW_WLAN_ACTION_PSPM = 2, + RTW_WLAN_ACTION_PCO_PHASE = 3, + RTW_WLAN_ACTION_MIMO_CSI_MX = 4, + RTW_WLAN_ACTION_MIMO_NONCP_BF = 5, + RTW_WLAN_ACTION_MIMP_CP_BF = 6, + RTW_WLAN_ACTION_ASEL_INDICATES_FB = 7, + RTW_WLAN_ACTION_HI_INFO_EXCHG = 8, +}; + +/* BACK (block-ack) parties */ +enum rtw_ieee80211_back_parties { + RTW_WLAN_BACK_RECIPIENT = 0, + RTW_WLAN_BACK_INITIATOR = 1, + RTW_WLAN_BACK_TIMER = 2, +}; + + +#define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs) + * 00:50:F2 */ +#ifndef PLATFORM_FREEBSD //Baron BSD has defined +#define WME_OUI_TYPE 2 +#endif //PLATFORM_FREEBSD +#define WME_OUI_SUBTYPE_INFORMATION_ELEMENT 0 +#define WME_OUI_SUBTYPE_PARAMETER_ELEMENT 1 +#define WME_OUI_SUBTYPE_TSPEC_ELEMENT 2 +#define WME_VERSION 1 + +#define WME_ACTION_CODE_SETUP_REQUEST 0 +#define WME_ACTION_CODE_SETUP_RESPONSE 1 +#define WME_ACTION_CODE_TEARDOWN 2 + +#define WME_SETUP_RESPONSE_STATUS_ADMISSION_ACCEPTED 0 +#define WME_SETUP_RESPONSE_STATUS_INVALID_PARAMETERS 1 +#define WME_SETUP_RESPONSE_STATUS_REFUSED 3 + +#define WME_TSPEC_DIRECTION_UPLINK 0 +#define WME_TSPEC_DIRECTION_DOWNLINK 1 +#define WME_TSPEC_DIRECTION_BI_DIRECTIONAL 3 + + +#define OUI_BROADCOM 0x00904c /* Broadcom (Epigram) */ + +#define VENDOR_HT_CAPAB_OUI_TYPE 0x33 /* 00-90-4c:0x33 */ + +u8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, u8 oui_len, u8 *ie, uint *ielen); +int rtw_ies_remove_ie(u8 *ies, uint *ies_len, uint offset, u8 eid, u8 *oui, u8 oui_len); + +int rtw_get_wapi_ie(u8 *in_ie,uint in_len,u8 *wapi_ie,u16 *wapi_len); + +u8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen); + +void dump_ies(u8 *buf, u32 buf_len); +void dump_wps_ie(u8 *ie, u32 ie_len); + +#ifdef CONFIG_P2P_NEW +u8 *rtw_get_p2p_ie(u8 *in_ie, uint in_len, u8 *p2p_ie, uint *p2p_ielen); +u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr, u32 *len_attr); +#endif //CONFIG_P2P +#ifdef CONFIG_P2P +void dump_p2p_ie(u8 *ie, u32 ie_len); +u8 *rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_content, uint *len_content); +u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr); +void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id); +#endif + +#ifdef CONFIG_WFD +int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen); +int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen); +#endif // CONFIG_WFD + +//struct registry_priv; +//int rtw_generate_ie(struct registry_priv *pregistrypriv); + +void rtw_get_bcn_info(struct wlan_network *pnetwork); + +void rtw_macaddr_cfg(u8 *mac_addr); + +u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI_20, u8 short_GI_40, unsigned char * MCS_rate); +#endif /* __IEEE80211_H */ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/if_ether.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/if_ether.h new file mode 100644 index 0000000..7e06597 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/if_ether.h @@ -0,0 +1,115 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef _LINUX_IF_ETHER_H +#define _LINUX_IF_ETHER_H + +/* + * IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble + * and FCS/CRC (frame check sequence). + */ + +#define ETH_ALEN 6 /* Octets in one ethernet addr */ +#define ETH_HLEN 14 /* Total octets in header. */ +#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */ +#define ETH_DATA_LEN 1500 /* Max. octets in payload */ +#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */ + +/* + * These are the defined Ethernet Protocol ID's. + */ + +#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */ +#define ETH_P_PUP 0x0200 /* Xerox PUP packet */ +#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */ +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_P_X25 0x0805 /* CCITT X.25 */ +#define ETH_P_ARP 0x0806 /* Address Resolution packet */ +#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet [ NOT AN OFFICIALLY REGISTERED ID ] */ +#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */ +#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */ +#define ETH_P_DEC 0x6000 /* DEC Assigned proto */ +#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */ +#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */ +#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */ +#define ETH_P_LAT 0x6004 /* DEC LAT */ +#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */ +#define ETH_P_CUST 0x6006 /* DEC Customer use */ +#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */ +#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */ +#define ETH_P_ATALK 0x809B /* Appletalk DDP */ +#define ETH_P_AARP 0x80F3 /* Appletalk AARP */ +#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */ +#define ETH_P_IPX 0x8137 /* IPX over DIX */ +#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */ +#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */ +#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */ +#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */ +#define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport + * over Ethernet + */ + +/* + * Non DIX types. Won't clash for 1500 types. + */ + +#define ETH_P_802_3 0x0001 /* Dummy type for 802.3 frames */ +#define ETH_P_AX25 0x0002 /* Dummy protocol id for AX.25 */ +#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */ +#define ETH_P_802_2 0x0004 /* 802.2 frames */ +#define ETH_P_SNAP 0x0005 /* Internal only */ +#define ETH_P_DDCMP 0x0006 /* DEC DDCMP: Internal only */ +#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/ +#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */ +#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ +#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ +#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ +#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ +#define ETH_P_CONTROL 0x0016 /* Card specific control frames */ +#define ETH_P_IRDA 0x0017 /* Linux-IrDA */ +#define ETH_P_ECONET 0x0018 /* Acorn Econet */ + +/* + * This is an Ethernet frame header. + */ +//CONFIG_MEMORY_ACCESS_ALIGNED for 4byte aligned,ethdhr size is 16,leading error in wlanhdr_to_ethdr +RTW_PACK_STRUCT_BEGIN +struct ethhdr +{ + unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ + unsigned char h_source[ETH_ALEN]; /* source ether addr */ + unsigned short h_proto; /* packet type ID field */ +} RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END + +struct _vlan { + unsigned short h_vlan_TCI; // Encapsulates priority and VLAN ID + unsigned short h_vlan_encapsulated_proto; +}; + + + +#define get_vlan_id(pvlan) ((_htons((unsigned short )pvlan->h_vlan_TCI)) & 0xfff) +#define get_vlan_priority(pvlan) ((_htons((unsigned short )pvlan->h_vlan_TCI))>>13) +#define get_vlan_encap_proto(pvlan) (_htons((unsigned short )pvlan->h_vlan_encapsulated_proto)) + + +#endif /* _LINUX_IF_ETHER_H */ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ip.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ip.h new file mode 100644 index 0000000..3911608 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/ip.h @@ -0,0 +1,142 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _LINUX_IP_H +#define _LINUX_IP_H +#include + +/* SOL_IP socket options */ +#ifndef IPTOS_TOS_MASK +#define IPTOS_TOS_MASK 0x1E +#define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK) +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_MINCOST 0x02 + +#define IPTOS_PREC_MASK 0xE0 +#define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK) +#define IPTOS_PREC_NETCONTROL 0xe0 +#define IPTOS_PREC_INTERNETCONTROL 0xc0 +#define IPTOS_PREC_CRITIC_ECP 0xa0 +#define IPTOS_PREC_FLASHOVERRIDE 0x80 +#define IPTOS_PREC_FLASH 0x60 +#define IPTOS_PREC_IMMEDIATE 0x40 +#define IPTOS_PREC_PRIORITY 0x20 +#define IPTOS_PREC_ROUTINE 0x00 +#endif + +/* IP options */ +#define IPOPT_COPY 0x80 +#define IPOPT_CLASS_MASK 0x60 +#define IPOPT_NUMBER_MASK 0x1f + +#define IPOPT_COPIED(o) ((o)&IPOPT_COPY) +#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK) +#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK) + +#define IPOPT_CONTROL 0x00 +#define IPOPT_RESERVED1 0x20 +#define IPOPT_MEASUREMENT 0x40 +#define IPOPT_RESERVED2 0x60 + +#define IPOPT_END (0 |IPOPT_CONTROL) +#define IPOPT_NOOP (1 |IPOPT_CONTROL) +#define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT) +#define IPOPT_RR (7 |IPOPT_CONTROL) +#define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY) + +#define IPVERSION 4 +#define MAXTTL 255 +#define IPDEFTTL 64 + +/* struct timestamp, struct route and MAX_ROUTES are removed. + + REASONS: it is clear that nobody used them because: + - MAX_ROUTES value was wrong. + - "struct route" was wrong. + - "struct timestamp" had fatally misaligned bitfields and was completely unusable. + */ + +#define IPOPT_OPTVAL 0 +#define IPOPT_OLEN 1 +#define IPOPT_OFFSET 2 +#define IPOPT_MINOFF 4 +#define MAX_IPOPTLEN 40 +#define IPOPT_NOP IPOPT_NOOP +#define IPOPT_EOL IPOPT_END +#define IPOPT_TS IPOPT_TIMESTAMP + +#define IPOPT_TS_TSONLY 0 /* timestamps only */ +#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ +#define IPOPT_TS_PRESPEC 3 /* specified modules only */ + +#ifdef PLATFORM_LINUX + +struct ip_options { + __u32 faddr; /* Saved first hop address */ + unsigned char optlen; + unsigned char srr; + unsigned char rr; + unsigned char ts; + unsigned char is_setbyuser:1, /* Set by setsockopt? */ + is_data:1, /* Options in __data, rather than skb */ + is_strictroute:1, /* Strict source route */ + srr_is_hit:1, /* Packet destination addr was our one */ + is_changed:1, /* IP checksum more not valid */ + rr_needaddr:1, /* Need to record addr of outgoing dev */ + ts_needtime:1, /* Need to record timestamp */ + ts_needaddr:1; /* Need to record addr of outgoing dev */ + unsigned char router_alert; + unsigned char __pad1; + unsigned char __pad2; + unsigned char __data[0]; +}; + +#define optlength(opt) (sizeof(struct ip_options) + opt->optlen) +#endif + +struct iphdr { +#if defined(__LITTLE_ENDIAN_BITFIELD) + __u8 ihl:4, + version:4; +#elif defined (__BIG_ENDIAN_BITFIELD) + __u8 version:4, + ihl:4; +#else +#error "Please fix " +#endif + __u8 tos; + __u16 tot_len; + __u16 id; + __u16 frag_off; + __u8 ttl; + __u8 protocol; + __u16 check; + __u32 saddr; + __u32 daddr; + /*The options start here. */ +}; + +#endif /* _LINUX_IP_H */ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_hal.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_hal.h new file mode 100644 index 0000000..74a161d --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_hal.h @@ -0,0 +1,24 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __LXBUS_HAL_H__ +#define __LXBUS_HAL_H__ + +#endif //__LXBUS_HAL_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_ops.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_ops.h new file mode 100644 index 0000000..aca3698 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_ops.h @@ -0,0 +1,80 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __LXBUS_OPS_H__ +#define __LXBUS_OPS_H__ + + +#if defined(CONFIG_RTL8195A) +//extern u32 TxbdRxbdInitRtl8195a(PADAPTER Adapter); +//extern u32 TxbdRxbdResetRtl8195a(PADAPTER Adapter); + +extern VOID InitLxDmaRtl8195a(_adapter * Adapter); +extern u32 rtl8195a_init_desc_ring(_adapter * padapter); +extern u32 rtl8195a_free_desc_ring(_adapter * padapter); +extern void rtl8195a_reset_desc_ring(_adapter * padapter); +extern void EnableDMA8195a(PADAPTER padapter); +extern void EnableInterrupt8195a(PADAPTER padapter); +extern void DisableDMA8195a(PADAPTER padapter); +extern void DisableInterrupt8195a(PADAPTER padapter); +extern s32 InterruptHandle8195a(PADAPTER Adapter); +extern void lxbus_set_intf_ops(struct _io_ops *pops); +extern void rtl8195a_xmit_tasklet(void *priv); +extern void rtl8195a_recv_tasklet(void *priv); +extern void rtl8195a_prepare_bcn_tasklet(void *priv); +extern void rtl8195a_tx_int_handler(_adapter *padapter); +extern void InitInterrupt8195a(PADAPTER padapter); +extern VOID UpdateInterruptMask8195a(PADAPTER Adapter, u32 *pAddMSRB, u32 *pRemoveMSR); + +#ifdef CONFIG_WOWLAN +extern void ClearInterrupt8195a(PADAPTER padapter); +#endif + +extern void ClearWlPmcInterrupt8195a(PADAPTER padapter); +extern BOOLEAN InterruptRecognized8195a(PADAPTER Adapter); +#elif defined(CONFIG_RTL8711B) + +extern u32 rtl8711b_init_desc_ring(_adapter * padapter); +extern u32 rtl8711b_free_desc_ring(_adapter * padapter); +extern void rtl8711b_reset_desc_ring(_adapter * padapter); +extern void EnableDMA8711b(PADAPTER padapter); +extern void EnableInterrupt8711b(PADAPTER padapter); +extern void DisableDMA8711b(PADAPTER padapter); +extern void DisableInterrupt8711b(PADAPTER padapter); +extern s32 InterruptHandle8711b(PADAPTER Adapter); +extern void lxbus_set_intf_ops(struct _io_ops *pops); +extern void rtl8711b_xmit_tasklet(void *priv); +extern void rtl8711b_recv_tasklet(void *priv); +extern void rtl8711b_prepare_bcn_tasklet(void *priv); +extern void rtl8711b_tx_int_handler(_adapter *padapter); +extern void InitInterrupt8711b(PADAPTER padapter); +extern VOID UpdateInterruptMask8711b(PADAPTER Adapter, u32 *pAddMSRB, u32 *pRemoveMSR); + +#ifdef CONFIG_WOWLAN +extern void ClearInterrupt8711b(PADAPTER padapter); +extern void DisableInterruptButCpwm28711b(PADAPTER padapter); +#endif + +extern void ClearWlPmcInterrupt8711b(PADAPTER padapter); +extern BOOLEAN InterruptRecognized8711b(PADAPTER Adapter); +#endif + + +#endif // !__LXBUS_OPS_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_osintf.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_osintf.h new file mode 100644 index 0000000..0c80793 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/lxbus_osintf.h @@ -0,0 +1,29 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __LXBUS_OSINTF_H +#define __LXBUS_OSINTF_H + + +//void rtw_pci_disable_aspm(_adapter *padapter); +//void rtw_pci_enable_aspm(_adapter *padapter); +//void PlatformClearPciPMEStatus(PADAPTER Adapter); + +#endif //__LXBUS_OSINTF_H + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/pack_begin.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/pack_begin.h new file mode 100644 index 0000000..7f1de7c --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/pack_begin.h @@ -0,0 +1,33 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ****************************************************************************** + * + * Define the start point of packed structure + * + ******************************************************************************/ + +#if defined(__IAR_SYSTEMS_ICC__) +#pragma pack(1) +#endif + +#if defined(PLATFORM_WINDOWS) +#pragma pack(push) +#pragma pack(1) +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/pack_end.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/pack_end.h new file mode 100644 index 0000000..e34640c --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/pack_end.h @@ -0,0 +1,33 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ****************************************************************************** + * + * Define the end point of packed structure + * + ******************************************************************************/ + +#if defined(__IAR_SYSTEMS_ICC__) +#pragma pack() +#endif + +#if defined(PLATFORM_WINDOWS) +#pragma pack(pop) +#endif + + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_aes.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_aes.h index 55fd9cc..c89c6cc 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_aes.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_aes.h @@ -1,10 +1,25 @@ /****************************************************************************** * - * Copyright(c) 2007 - 2014 Realtek Corporation. All rights reserved. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ****************************************************************************** * * This is ROM code section. * - * ******************************************************************************/ #ifndef ROM_AES_H #define ROM_AES_H diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_arc4.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_arc4.h new file mode 100644 index 0000000..1eb2391 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_arc4.h @@ -0,0 +1,39 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ****************************************************************************** + * + * This is ROM code section. + * + ******************************************************************************/ +#ifndef ROM_ARC4_H +#define ROM_ARC4_H + +struct arc4context +{ + u32 x; + u32 y; + u8 state[256]; +}; + +u32 crc32_get(u8 *buf, sint len); +void rt_arc4_init(struct arc4context *parc4ctx, u8 * key,u32 key_len); +void rt_arc4_crypt( struct arc4context *parc4ctx, u8 * dest, u8 * src, u32 len); + + +#endif //ROM_ARC4_H diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_ieee80211.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_ieee80211.h new file mode 100644 index 0000000..064729d --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_ieee80211.h @@ -0,0 +1,127 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __ROM_IEEE80211_H +#define __ROM_IEEE80211_H + +extern const u8 RTW_WPA_OUI_TYPE[] ; +extern const u8 WPA_CIPHER_SUITE_NONE[]; +extern const u8 WPA_CIPHER_SUITE_WEP40[]; +extern const u8 WPA_CIPHER_SUITE_TKIP[]; +extern const u8 WPA_CIPHER_SUITE_CCMP[]; +extern const u8 WPA_CIPHER_SUITE_WEP104[]; +extern const u16 RSN_VERSION_BSD; +extern const u8 RSN_AUTH_KEY_MGMT_UNSPEC_802_1X[]; +extern const u8 RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X[]; +extern const u8 RSN_CIPHER_SUITE_NONE[]; +extern const u8 RSN_CIPHER_SUITE_WEP40[]; +extern const u8 RSN_CIPHER_SUITE_TKIP[]; +extern const u8 RSN_CIPHER_SUITE_CCMP[]; +extern const u8 RSN_CIPHER_SUITE_WEP104[]; + +/* Parsed Information Elements */ +struct rtw_ieee802_11_elems { + u8 *ssid; + u8 ssid_len; + u8 *supp_rates; + u8 supp_rates_len; + u8 *fh_params; + u8 fh_params_len; + u8 *ds_params; + u8 ds_params_len; + u8 *cf_params; + u8 cf_params_len; + u8 *tim; + u8 tim_len; + u8 *ibss_params; + u8 ibss_params_len; + u8 *challenge; + u8 challenge_len; + u8 *erp_info; + u8 erp_info_len; + u8 *ext_supp_rates; + u8 ext_supp_rates_len; + u8 *wpa_ie; + u8 wpa_ie_len; + u8 *rsn_ie; + u8 rsn_ie_len; + u8 *wme; + u8 wme_len; + u8 *wme_tspec; + u8 wme_tspec_len; + u8 *wps_ie; + u8 wps_ie_len; + u8 *power_cap; + u8 power_cap_len; + u8 *supp_channels; + u8 supp_channels_len; + u8 *mdie; + u8 mdie_len; + u8 *ftie; + u8 ftie_len; + u8 *timeout_int; + u8 timeout_int_len; + u8 *ht_capabilities; + u8 ht_capabilities_len; + u8 *ht_operation; + u8 ht_operation_len; + u8 *vendor_ht_cap; + u8 vendor_ht_cap_len; +}; + +typedef enum { ParseOK = 0, ParseUnknown = 1, ParseFailed = -1 } ParseRes; + +ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, + struct rtw_ieee802_11_elems *elems, + int show_errors); + +u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, unsigned int *frlen); +u8 *rtw_set_ie(u8 *pbuf, sint index, uint len, u8 *source, uint *frlen); +u8 *rtw_get_ie(u8*pbuf, sint index, u32 *len, sint limit); + +void rtw_set_supported_rate(u8* SupportedRates, uint mode) ; + +unsigned char *rtw_get_wpa_ie(unsigned char *pie, u32 *wpa_ie_len, int limit); +unsigned char *rtw_get_wpa2_ie(unsigned char *pie, u32 *rsn_ie_len, int limit); +int rtw_get_wpa_cipher_suite(u8 *s); +int rtw_get_wpa2_cipher_suite(u8 *s); + +int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x); +int rtw_parse_wpa2_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x); + +int rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len); + +u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen); +u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_attr, u32 *len_attr); +u8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_content, uint *len_content); + +uint rtw_get_rateset_len(u8 *rateset); + +int rtw_get_bit_value_from_ieee_value(u8 val); + +uint rtw_is_cckrates_included(u8 *rate); + +uint rtw_is_cckratesonly_included(u8 *rate); + +int rtw_check_network_type(unsigned char *rate, int ratelen, int channel); + +u8 key_2char2num(u8 hch, u8 lch); + +#endif /* __ROM_IEEE80211_H */ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_md5.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_md5.h new file mode 100644 index 0000000..fb6e9d2 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_md5.h @@ -0,0 +1,45 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ****************************************************************************** + * + * This is ROM code section. + * + ******************************************************************************/ + +#ifndef ROM_MD5_H +#define ROM_MD5_H + +#if PSK_SUPPORT_TKIP + +/* MD5 context. */ +typedef struct { + u32 state[4]; /* state (ABCD) */ + u32 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + u8 buffer[64]; /* input buffer */ +} md5_ctx; + +void rt_md5_init(md5_ctx *context); +void rt_md5_append(md5_ctx *context, u8 *input, u32 inputLen); +void rt_md5_final(u8 digest[16], md5_ctx *context); +void rt_md5_hmac(unsigned char *text, int text_len, unsigned char *key, + int key_len, void * digest); + + +#endif //#if PSK_SUPPORT_TKIP +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rc4.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rc4.h new file mode 100644 index 0000000..5c40252 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rc4.h @@ -0,0 +1,89 @@ +/* crypto/rc4/rc4.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC4_H +#define HEADER_RC4_H + +#ifdef OPENSSL_NO_RC4 +#error RC4 is disabled. +#endif + +//#include /* RC4_INT */ +#define RC4_INT unsigned int + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc4_key_st + { + RC4_INT x,y; + RC4_INT data[256]; + } RC4_KEY; + + +//const char *RC4_options(void); +void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata, + unsigned char *outdata); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_message.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_message.h new file mode 100644 index 0000000..81115ae --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_message.h @@ -0,0 +1,48 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _ROM_RTW_MESSAGE_ +#define _ROM_RTW_MESSAGE_ + +#include + +typedef enum { +#define ROM_E_RTW_MSGPOOL(name,str) ROM_E_RTW_MSGP_##name, +#include "rom_rtw_message_e.h" + ROM_E_RTW_MSGP_MAX +} rom_e_rtw_msgp_t; + +#if ROM_E_RTW_MSG +extern const char *rom_e_rtw_msgp_str_[]; +#define rom_e_rtw_msg_printf(name, fmt, args...) printf((char*)rom_e_rtw_msgp_str_[ROM_E_RTW_MSGP_##name], ## args) +#define rom_e_rtw_msg_871X_LEVEL(name, level, fmt, args...) \ + do {\ + printf("\n\r");\ + printf((char*)rom_e_rtw_msgp_str_[ROM_E_RTW_MSGP_##name], ## args);\ + }while(0) +#else +#define rom_e_rtw_msg_printf(name, fmt, args...) printf(fmt, ## args) +#define rom_e_rtw_msg_871X_LEVEL(name, level, fmt, args...) \ + do {\ + printf("\n\r");\ + printf(DRIVER_PREFIX ##fmt, ## args);\ + }while(0) +#endif //ROM_E_RTW_MSG + +#endif //_ROM_RTW_MESSAGE_ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_message_e.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_message_e.h new file mode 100644 index 0000000..8740be2 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_message_e.h @@ -0,0 +1,174 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +// Debug message +// DBG_PWR_INDEX +ROM_E_RTW_MSGPOOL(PWR_INDEX_1, "BandWidth = %d, Rate = %d, Channel = %d\n\r") +ROM_E_RTW_MSGPOOL(PWR_INDEX_2, "Base = %d, DiffByRate = %d, limit = %d, DiffByTrack = %d, Tx Power = %d\n\n\r") +// DBG_RX_INFO +ROM_E_RTW_MSGPOOL(RX_INFO_1, "============ Rx Info dump ===================\n") +ROM_E_RTW_MSGPOOL(RX_INFO_2, "bLinked = %d, RSSI_Min = %d(%%), CurrentIGI = 0x%x\n") +ROM_E_RTW_MSGPOOL(RX_INFO_3, "Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n") +ROM_E_RTW_MSGPOOL(RX_INFO_4, "RxRate = 0x%x, RSSI_A = %d(%%), RSSI_B = %d(%%)\n") +// DBG_TX_RATE +ROM_E_RTW_MSGPOOL(TX_RATE_1, "Rate: 0x%x\n\r") +ROM_E_RTW_MSGPOOL(TX_RATE_2, "%s(): mac_id=%d raid=0x%x bw=%d mask=0x%x init_rate=0x%x\n") +// DBG_DM_RA +ROM_E_RTW_MSGPOOL(DM_RA_1, "==> ReadRateMask = 0x%x RAMASK[%d] = 0x%x\n") +ROM_E_RTW_MSGPOOL(DM_RA_2, "==> TMP_rate = %x highest_rate = 0x%02X, lowest_rate = 0x%02X\n") +ROM_E_RTW_MSGPOOL(DM_RA_3, "==> MacID = %d rateid = 0x%x sgi = %d bw_idx = %d\n\r") +ROM_E_RTW_MSGPOOL(DM_RA_4, "%s(): mac_id=%d raid=0x%x bw=%d mask=0x%x\r\n") +// DBG_DM_DIG +ROM_E_RTW_MSGPOOL(DM_DIG_1, "CurrentIGI(0x%02x)\n\n") +// DBG_PWR_TRACKING +ROM_E_RTW_MSGPOOL(PWR_TRACKING_1, "Thermal = 0x%02X\r\n") +ROM_E_RTW_MSGPOOL(PWR_TRACKING_2, "delta = %d, AVG Thermal = 0x%02X, EFUSE = 0x%02X, PackageType = 0x%02X\r\n") +ROM_E_RTW_MSGPOOL(PWR_TRACKING_3, "Channel = %d, CCK PwrBase = 0x%02X, HT40M PwrBase = 0x%02X, OFDMdiff = %d, 20Mdiff = %d \n\r") +ROM_E_RTW_MSGPOOL(PWR_TRACKING_4, "Remnant_CCKSwingIdx = %d\n\r") +ROM_E_RTW_MSGPOOL(PWR_TRACKING_5, "Remnant_OFDMSwingIdx = %d\n\r") +ROM_E_RTW_MSGPOOL(PWR_TRACKING_6, "CCK2~11: 0x86c = 0x%08X\r\n") +ROM_E_RTW_MSGPOOL(PWR_TRACKING_7, "MCS7~4 : 0xe14 = 0x%08X\r\n") +// DBG_RF_IQK +ROM_E_RTW_MSGPOOL(RF_IQK_1, "Path A Tx IQK Success!\n") +ROM_E_RTW_MSGPOOL(RF_IQK_2, "Path A Rx IQK Success!\n") +ROM_E_RTW_MSGPOOL(RF_IQK_3, "Path A IQK failed!\n") +ROM_E_RTW_MSGPOOL(RF_IQK_4, "IQK finished\n") +ROM_E_RTW_MSGPOOL(RF_IQK_5, "LCK finished\n") +// DBG_DM_ADAPTIVITY +ROM_E_RTW_MSGPOOL(DM_ADAPTIVITY_1, "IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d\n") +ROM_E_RTW_MSGPOOL(DM_ADAPTIVITY_2, "DynamicLinkAdaptivity = %d, Adaptivity_enable = %d\n") +ROM_E_RTW_MSGPOOL(DM_ADAPTIVITY_3, "IGI=0x%x, TH_L2H_dmc = 0x%x, TH_H2L_dmc = 0x%x\n\n") + +// freertos_ioctl.c +// mac_reg_dump, bb_reg_dump, rf_reg_dump +ROM_E_RTW_MSGPOOL(MAC_REG_DUMP_1, "\n======= MAC REG =======\n") +ROM_E_RTW_MSGPOOL(BB_REG_DUMP_1, "\n======= BB REG =======\n") +ROM_E_RTW_MSGPOOL(RF_REG_DUMP_1, "\n======= RF REG =======\n") +ROM_E_RTW_MSGPOOL(RF_REG_DUMP_2, "\nRF_Path(%x)\n") +ROM_E_RTW_MSGPOOL(REG_DUMP_1, "0x%02x ") +ROM_E_RTW_MSGPOOL(REG_DUMP_2, " 0x%08x ") +ROM_E_RTW_MSGPOOL(REG_DUMP_3, "\n") +// 0x70 read reg +ROM_E_RTW_MSGPOOL(READ_REG_1, "rtw_read8(0x%x)=0x%02x\n") +ROM_E_RTW_MSGPOOL(READ_REG_2, "rtw_read16(0x%x)=0x%04x\n") +ROM_E_RTW_MSGPOOL(READ_REG_3, "rtw_read32(0x%x)=0x%08x\n") +// 0x71 write reg +ROM_E_RTW_MSGPOOL(WRITE_REG_1, "rtw_write8(0x%x)=0x%02x\n") +ROM_E_RTW_MSGPOOL(WRITE_REG_2, "rtw_write16(0x%x)=0x%04x\n") +ROM_E_RTW_MSGPOOL(WRITE_REG_3, "rtw_write32(0x%x)=0x%08x\n") +// 0x72 read bb +ROM_E_RTW_MSGPOOL(READ_BB_1, "read_bbreg(0x%x)=0x%x\n") +// 0x73 write bb +ROM_E_RTW_MSGPOOL(WRITE_BB_1, "write_bbreg(0x%x)=0x%x\n") +// 0x74 read rf +ROM_E_RTW_MSGPOOL(READ_RF_1, "read RF_reg path(0x%02x),offset(0x%x),value(0x%08x)\n") +// 0x75 write rf +ROM_E_RTW_MSGPOOL(WRITE_RF_1, "write RF_reg path(0x%02x),offset(0x%x),value(0x%08x)\n") +// 0x17 fix channel +ROM_E_RTW_MSGPOOL(FIX_CHANNEL_1, "=>Fixed channel to %d\n") +ROM_E_RTW_MSGPOOL(FIX_CHANNEL_2, "Invalid channel number(%d)\n") +// 0x22 enable / disable power saving mode +ROM_E_RTW_MSGPOOL(PWR_SAVE_MODE_1, "wlan power saving mode = %s\n") +// 0xaa fix rate +ROM_E_RTW_MSGPOOL(FIX_RATE_1, "chang data rate to :0x%02x\n") +// 0xc0 get odm dbg flag +ROM_E_RTW_MSGPOOL(GET_ODM_DBG_FLAG_1, "get odm dbg flag : 0x%08x\n") +// 0xc1 set odm dbg flag +ROM_E_RTW_MSGPOOL(SET_ODM_DBG_FLAG_1, "set odm dbg flag : 0x%08x\n") +// 0xcc open power index debug message (power by rate, power limit, power tracking) +ROM_E_RTW_MSGPOOL(DUMP_PWR_IDX_1, "Fixed rate = %d\n") +// 0xdd dump info +ROM_E_RTW_MSGPOOL(DUMP_INFO_1, "Tx power:\n") +ROM_E_RTW_MSGPOOL(DUMP_INFO_2, "CCK 1(0xe08)= 0x%x\n") +ROM_E_RTW_MSGPOOL(DUMP_INFO_3, "CCK 11~2(0x86c)= 0x%x\n") +ROM_E_RTW_MSGPOOL(DUMP_INFO_4, "OFDM 18~6(0xe00)= 0x%x\n") +ROM_E_RTW_MSGPOOL(DUMP_INFO_5, "OFDM 54~24(0xe04)= 0x%x\n") +ROM_E_RTW_MSGPOOL(DUMP_INFO_6, "MCS 3~0(0xe10)= 0x%x\n") +ROM_E_RTW_MSGPOOL(DUMP_INFO_7, "MCS 7~4(0xe14)= 0x%x\n") +ROM_E_RTW_MSGPOOL(DUMP_INFO_8, "Country code: 0x%x\n") +// 0xee turn on/off dynamic funcs +ROM_E_RTW_MSGPOOL(DM_FUNC_FLAG_1, " === DMFlag(0x%08x) === \n") +ROM_E_RTW_MSGPOOL(DM_FUNC_FLAG_2, "extra_arg = 0 - disable all dynamic func\n") +ROM_E_RTW_MSGPOOL(DM_FUNC_FLAG_3, "extra_arg = 1 - enable all dynamic func\n") +ROM_E_RTW_MSGPOOL(DM_FUNC_FLAG_4, "extra_arg = 2 - disable DIG\n") +ROM_E_RTW_MSGPOOL(DM_FUNC_FLAG_5, "extra_arg = 3 - enable DIG\n") +ROM_E_RTW_MSGPOOL(DM_FUNC_FLAG_6, "extra_arg = 4 - disable tx power tracking\n") +ROM_E_RTW_MSGPOOL(DM_FUNC_FLAG_7, "extra_arg = 5 - enable tx power tracking\n") +ROM_E_RTW_MSGPOOL(DM_FUNC_FLAG_8, "extra_arg = 6 - disable adaptivity\n") +ROM_E_RTW_MSGPOOL(DM_FUNC_FLAG_9, "extra_arg = 7 - enable adaptivity\n") + +// lxbus_ops.c +ROM_E_RTW_MSGPOOL(RX_MPDU_1, "Drop packet! crc_err = %d, icv_err = %d, rx_pkt_len = %d, skb_pkt_len = %d\n") + +// wlan driver DBG_871X_LEVEL +#define ROM_E_RTW_MSGPOOL_871X(name,str) ROM_E_RTW_MSGPOOL(name,DRIVER_PREFIX str) +// rtw_ap.c +ROM_E_RTW_MSGPOOL_871X(AP_TIMEOUT_CHK_1, "Asoc expire "MAC_FMT"\n") +// rtw_intfs.c +ROM_E_RTW_MSGPOOL_871X(INIT_DRV_SW_1, "The driver is for MP\n") +// rtw_ioctl_set.c +ROM_E_RTW_MSGPOOL_871X(SET_BSSID_1, "set BSSID: %02x:%02x:%02x:%02x:%02x:%02x\n") +ROM_E_RTW_MSGPOOL_871X(SET_SSID_1, "set ssid [%s] \n") +// rtw_mlme_ext.c +ROM_E_RTW_MSGPOOL_871X(ON_BEACON_1, "ap has changed, disconnect now\n ") +ROM_E_RTW_MSGPOOL_871X(ON_AUTH_1, "+OnAuth: "MAC_FMT"\n") +ROM_E_RTW_MSGPOOL_871X(ON_AUTH_2, " Exceed the upper limit(%d) of supported clients...\n") +ROM_E_RTW_MSGPOOL_871X(ON_AUTH_CLIENT_1, "auth success, start assoc\n") +ROM_E_RTW_MSGPOOL_871X(ON_ASSOC_REQ_1, "+OnAssocReq\n") +ROM_E_RTW_MSGPOOL_871X(ON_ASSOC_RSP_1, "association success(res=%d)\n") +ROM_E_RTW_MSGPOOL_871X(ON_DE_AUTH_1, "ap recv deauth reason code(%d) sta:"MAC_FMT"\n") +ROM_E_RTW_MSGPOOL_871X(ON_DE_AUTH_2, "sta recv deauth reason code(%d) sta:"MAC_FMT"\n") +ROM_E_RTW_MSGPOOL_871X(ON_DISASSOC_1, "ap recv disassoc reason code(%d) sta:"MAC_FMT"\n") +ROM_E_RTW_MSGPOOL_871X(ON_DISASSOC_2, "sta recv disassoc reason code(%d) sta:"MAC_FMT"\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_BEACON_1, "beacon frame too large\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_PROBERSP_1, "probersp frame too large\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_PROBEREQ_1, "probereq frame too large\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_AUTH_1, "auth frame too large\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_ASSOCRSP_1, "assocrsp frame too large\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_ASSOCREQ_1, "assocreq frame too large\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_NULLDATA_1, "nulldata frame too large\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_QOS_NULLDATA_1, "qos nulldata frame too large\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_DEAUTH_1, "deauth frame too large\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_ACTION_BA_1, "action BA frame too large\n") +ROM_E_RTW_MSGPOOL_871X(ISSUE_BSS_COEXIST_1, "action BSSCoexist frame too large\n") +ROM_E_RTW_MSGPOOL_871X(START_CLNT_AUTH_1, "start auth to %02x:%02x:%02x:%02x:%02x:%02x\n") +ROM_E_RTW_MSGPOOL_871X(LINKED_STATUS_CHK_1, "no beacon for a long time, disconnect or roaming\n") +ROM_E_RTW_MSGPOOL_871X(SETKEY_HDL_1, "set group key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:%d\n") +ROM_E_RTW_MSGPOOL_871X(SET_STAKEY_HDL_1, "set pairwise key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4)\n") +ROM_E_RTW_MSGPOOL_871X(SET_STAKEY_HDL_2, "set pairwise key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) for %x:%x:%x:%x:%x:%x\n") +// rtw_p2p.c +ROM_E_RTW_MSGPOOL_871X(P2P_BUILD_MGNT_FRAME_1, "p2p mgnt frame too large\n") +// rtw_psk.c +ROM_E_RTW_MSGPOOL_871X(SEND_EAPOL_1, "ap mode 4-1\n") +ROM_E_RTW_MSGPOOL_871X(SEND_EAPOL_2, "ap mode 4-3\n") +ROM_E_RTW_MSGPOOL_871X(SEND_EAPOL_3, "ap mode 2-1 to WPA_STA(%d)\n") +ROM_E_RTW_MSGPOOL_871X(EAPOL_KEY_RECVD_1, "ap mode 4-2\n") +ROM_E_RTW_MSGPOOL_871X(EAPOL_KEY_RECVD_2, "ap mode 4-4\n") +ROM_E_RTW_MSGPOOL_871X(EAPOL_KEY_RECVD_3, "ap mode 2-2 from WPA_STA(%d)\n") +// rtw_recv.c +ROM_E_RTW_MSGPOOL_871X(FREE_RECVFRAME_1, "%s free_recvframe_cnt:%d > %d refree happen !!!!\n") +// hal_com.c +ROM_E_RTW_MSGPOOL_871X(VAR_PORT_SWITCH_1, "port switch - port0("ADPT_FMT"), port1("ADPT_FMT")\n") +ROM_E_RTW_MSGPOOL_871X(VAR_PORT_SWITCH_2, "port switch - port0("ADPT_FMT"), port1("ADPT_FMT")\n") +// osdep_service.c +ROM_E_RTW_MSGPOOL_871X(DOWN_SEMA_1, "%s(%p) failed, retry\n") + + +#undef ROM_E_RTW_MSGPOOL +#undef ROM_E_RTW_MSGPOOL_871X diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_psk.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_psk.h new file mode 100644 index 0000000..14787ce --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_psk.h @@ -0,0 +1,44 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ****************************************************************************** + * + * This is ROM code section. + * + ******************************************************************************/ +#ifndef __ROM_RTW_PSK_H_ +#define __ROM_RTW_PSK_H_ + +int rom_psk_PasswordHash ( + unsigned char *password, + int passwordlength, + unsigned char *ssid, + int ssidlength, + unsigned char *output); + +void rom_psk_CalcPTK( unsigned char *addr1, unsigned char *addr2, + unsigned char *nonce1, unsigned char *nonce2, + unsigned char *keyin, int keyinlen, + unsigned char *keyout, int keyoutlen); + +void rom_psk_CalcGTK(unsigned char *addr, unsigned char *nonce, + unsigned char *keyin, int keyinlen, + unsigned char *keyout, int keyoutlen); + +#endif //__ROM_RTW_PSK_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_security.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_security.h new file mode 100644 index 0000000..28436b4 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_rtw_security.h @@ -0,0 +1,104 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ****************************************************************************** + * + * This is ROM code section. + * + ******************************************************************************/ +#ifndef __ROM_RTW_SECURITY_H_ +#define __ROM_RTW_SECURITY_H_ + +struct mic_data +{ + u32 K0, K1; // Key + u32 L, R; // Current state + u32 M; // Message accumulator (single word) + u32 nBytesInM; // # bytes in M +}; + +union u_crc +{ + unsigned char ch[4]; + int i; +}; + +//=============================== +// WEP related +//=============================== +void wep_80211_encrypt( + u8 *pframe, u32 wlan_hdr_len, \ + u32 iv_len, u32 payload_len,\ + u8* key, u32 key_len); + +u8 wep_80211_decrypt( + u8 *pframe, u32 wlan_hdr_len, + u32 iv_len, u32 payload_len, + u8* key, u32 key_len, + union u_crc *pcrc\ + ); + +//=============================== +// TKIP related +//=============================== +void tkip_80211_encrypt( + u8 *pframe, u32 wlan_hdr_len, \ + u32 iv_len, u32 payload_len,\ + u8* key, u32 key_len,\ + u8* ta); + +u8 tkip_80211_decrypt( + u8 *pframe, u32 wlan_hdr_len, \ + u32 iv_len, u32 payload_len,\ + u8* key, u32 key_len,\ + u8* ta, union u_crc *pcrc); + +void tkip_micappendbyte(struct mic_data *pmicdata, u8 b ); +void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key); +void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nbytes ); +void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst ); +void rtw_seccalctkipmic(u8 * key,u8 *header,u8 *data,u32 data_len,u8 *mic_code, u8 pri); +void tkip_phase1(u16 *p1k,const u8 *tk,const u8 *ta,u32 iv32); +void tkip_phase2(u8 *rc4key,const u8 *tk,const u16 *p1k,u16 iv16); + + +//=============================== +// AES related +//=============================== +void aes1_encrypt(u8 *key, u8 *data, u8 *ciphertext); +void aesccmp_construct_mic_iv( + u8 *mic_iv, sint qc_exists, sint a4_exists, + u8 *mpdu, uint payload_length,u8 *pn_vector); +void aesccmp_construct_mic_header1(u8 *mic_header1, sint header_length, u8 *mpdu); +void aesccmp_construct_mic_header2( + u8 *mic_header2, u8 *mpdu, sint a4_exists, sint qc_exists); +void aesccmp_construct_ctr_preload( + u8 *ctr_preload, sint a4_exists, sint qc_exists, + u8 *mpdu, u8 *pn_vector, sint c); + +u32 aes_80211_encrypt( + u8 *pframe, u32 wlan_hdr_len, \ + u32 payload_len, u8 *key, \ + u32 frame_type, u8 *mic); + +u32 aes_80211_decrypt( + u8 *pframe, u32 wlan_hdr_len, \ + u32 payload_len, u8 *key, \ + u32 frame_type, u8 *mic); +#endif //__ROM_RTW_SECURITY_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_sha1.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_sha1.h new file mode 100644 index 0000000..dc0dba0 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rom_sha1.h @@ -0,0 +1,71 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _ROM_SHA1_ +#define _ROM_SHA1_ + + +#ifndef _SHA_enum_ +#define _SHA_enum_ +enum +{ + shaSuccess = 0, + shaNull, /* Null pointer parameter */ + shaInputTooLong, /* input data too long */ + shaStateError /* called Input after Result */ +}; +#endif + + +#define SHA1HashSize 20 + +/* + * This structure will hold context information for the SHA-1 + * hashing operation + */ +typedef struct SHA1Context +{ + u32 Intermediate_Hash[SHA1HashSize/4]; /* Message Digest */ + + u32 Length_Low; /* Message length in bits */ + u32 Length_High; /* Message length in bits */ + + /* Index into message block array */ + u16 Message_Block_Index; + u8 Message_Block[64]; /* 512-bit message blocks */ + + int Computed; /* Is the digest computed? */ + int Corrupted; /* Is the message digest corrupted? */ +} SHA1Context; + + +/* + * Function Prototypes + */ + + +int rt_sha1_init( SHA1Context *); +int rt_sha1_update( SHA1Context *, const u8 *, unsigned int); +int rt_sha1_finish( SHA1Context *, u8 Message_Digest[SHA1HashSize]); + +void rt_hmac_sha1(unsigned char *text, int text_len, unsigned char *key, + int key_len, unsigned char *digest); + + +#endif //_ROM_SHA1_ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtl8195a_hal.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtl8195a_hal.h new file mode 100644 index 0000000..aca8be2 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtl8195a_hal.h @@ -0,0 +1,618 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __RTL8195A_HAL_H__ +#define __RTL8195A_HAL_H__ + +#include "drv_types.h" +#include "rtl8195a/rtl8195a_pmu_task.h" +#include "hal_data.h" + +#include "rtl8195a/rtl8195a_spec.h" +#include "rtl8195a/rtl8195a_rf.h" +#include "rtl8195a/rtl8195a_dm.h" +#include "rtl8195a/rtl8195a_recv.h" +#include "rtl8195a/rtl8195a_xmit.h" +#include "rtl8195a/rtl8195a_cmd.h" +#include "rtl8195a/rtl8195a_pmu_cmd.h" +#include "rtl8195a/rtl8195a_led.h" +#include "rtl8195a/Hal8195APwrSeq.h" +#include "rtl8195a/Hal8195APhyReg.h" +#include "rtl8195a/Hal8195APhyCfg.h" +#include "rtl8195a/rom_Hal8195APhyCfg.h" + +#ifdef DBG_CONFIG_ERROR_DETECT +#include "rtl8195a/rtl8195a_sreset.h" +#endif + +#include "../src/hal/OUTSRC/phydm_precomp.h" + +#if (RTL8195A_SUPPORT==1) + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + +//--------------------------------------------------------------------- +// RTL8723BS From file +//--------------------------------------------------------------------- + #define RTL8723B_FW_IMG "rtl8723B\\rtl8723bfw.bin" + #define RTL8195A_PHY_REG "rtl8195A\\PHY_REG_1T.txt" + #define RTL8195A_PHY_RADIO_A "rtl8195A\\radio_a_1T.txt" + #define RTL8195A_PHY_RADIO_B "rtl8195A\\radio_b_1T.txt" + #define RTL8195A_TXPWR_TRACK "rtl8195A\\TxPowerTrack.txt" + #define RTL8195A_AGC_TAB "rtl8195A\\AGC_TAB_1T.txt" + #define RTL8195A_PHY_MACREG "rtl87195A\\MAC_REG.txt" + #define RTL8195A_PHY_REG_PG "rtl8195A\\PHY_REG_PG.txt" + #define RTL8195A_PHY_REG_MP "rtl8195A\\PHY_REG_MP.txt" + #define RTL8195A_TXPWR_LMT "rtl8195A\\TXPWR_LMT.txt" + +//--------------------------------------------------------------------- +// RTL8723BS From header +//--------------------------------------------------------------------- + + //#define Rtl8723B_FwImageArray Array_MP_8723B_FW_NIC + //#define Rtl8723B_FwImgArrayLength ArrayLength_MP_8723B_FW_NIC + //#define Rtl8723B_FwWoWImageArray Array_MP_8723B_FW_WoWLAN + //#define Rtl8723B_FwWoWImgArrayLength ArrayLength_MP_8723B_FW_WoWLAN + + #define Rtl8723B_PHY_REG_Array_PG Rtl8723SPHY_REG_Array_PG + #define Rtl8723B_PHY_REG_Array_PGLength Rtl8723SPHY_REG_Array_PGLength + +#if MP_DRIVER == 1 + #define Rtl8723B_FwBTImgArray Rtl8723BFwBTImgArray + #define Rtl8723B_FwBTImgArrayLength Rtl8723BFwBTImgArrayLength + + #define Rtl8723B_FwMPImageArray Rtl8723BFwMPImgArray + #define Rtl8723B_FwMPImgArrayLength Rtl8723BMPImgArrayLength + + #define Rtl8723B_PHY_REG_Array_MP Rtl8723B_PHYREG_Array_MP + #define Rtl8723B_PHY_REG_Array_MPLength Rtl8723B_PHYREG_Array_MPLength +#endif + +#endif // RTL8195A_SUPPORT + +#define FW_8723B_SIZE 0x8000 +#define FW_8723B_START_ADDRESS 0x1000 +#define FW_8723B_END_ADDRESS 0x1FFF //0x5FFF + +#define IS_FW_HEADER_EXIST_8723B(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x5300) + +typedef struct _RT_FIRMWARE { + FIRMWARE_SOURCE eFWSource; +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; +#else + u8 szFwBuffer[FW_8723B_SIZE]; +#endif + u32 ulFwLength; + +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szBTFwBuffer; +#else + u8 szBTFwBuffer[FW_8723B_SIZE]; +#endif + u32 ulBTFwLength; + +#ifdef CONFIG_WOWLAN + u8* szWoWLANFwBuffer; + u32 ulWoWLANFwLength; +#endif //CONFIG_WOWLAN +} RT_FIRMWARE_8723B, *PRT_FIRMWARE_8723B; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. +typedef struct _RT_8723B_FIRMWARE_HDR +{ + // 8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u16 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u16 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; +}RT_8723B_FIRMWARE_HDR, *PRT_8723B_FIRMWARE_HDR; + +#define DRIVER_EARLY_INT_TIME_8195A 0x05 // 5ms +#define BCN_DMA_ATIME_INT_TIME_8195A 0x02 // 2ms + +// for 8195A +// TX 32K, RX 16K, Page size 128B for TX, 8B for RX +#define PAGE_SIZE_TX_8195A 128 +#define PAGE_SIZE_RX_8195A 8 + +#define RX_DMA_SIZE_8195A 0x4000 // 16K +#define RX_DMA_RESERVED_SIZE_8195A 0x80 // 128B, reserved for tx report +#define RX_DMA_BOUNDARY_8195A (RX_DMA_SIZE_8195A - RX_DMA_RESERVED_SIZE_8195A - 1) + + +// Note: We will divide number of page equally for each queue other than public queue! + +//For General Reserved Page Number(Beacon Queue is reserved page) +//Beacon:2, PS-Poll:1, Null Data:1,Qos Null Data:1,BT Qos Null Data:1 +#ifdef CONFIG_WLAN_HAL_TEST +#define BCNQ_PAGE_NUM_8195A 0x00 +#else +#define BCNQ_PAGE_NUM_8195A 0x08 +#endif + +#ifdef CONFIG_CONCURRENT_MODE +#define BCNQ1_PAGE_NUM_8195A 0x04 +#else +#define BCNQ1_PAGE_NUM_8195A 0x00 +#endif + +//For WoWLan , more reserved page +//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:2,GTK EXT MEM:2 +#ifdef CONFIG_WOWLAN +#define WOWLAN_PAGE_NUM_8195A 0x07 +#else +#define WOWLAN_PAGE_NUM_8195A 0x00 +#endif + +#ifdef CONFIG_WLAN_HAL_TEST +#define TX_TOTAL_PAGE_NUMBER_8195A 0x40 +#define TX_PAGE_BOUNDARY_8195A (TX_TOTAL_PAGE_NUMBER_8195A + 1) +#else +#define TX_TOTAL_PAGE_NUMBER_8195A (0xFF - BCNQ_PAGE_NUM_8195A - BCNQ1_PAGE_NUM_8195A - WOWLAN_PAGE_NUM_8195A) +#define TX_PAGE_BOUNDARY_8195A (TX_TOTAL_PAGE_NUMBER_8195A + 1) +#endif + +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER TX_TOTAL_PAGE_NUMBER_8195A +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER + 1) + +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8195A +#ifdef CONFIG_WLAN_HAL_TEST +#define NORMAL_PAGE_NUM_HPQ_8195A 0x10 +#define NORMAL_PAGE_NUM_LPQ_8195A 0x10 +#define NORMAL_PAGE_NUM_NPQ_8195A 0x10 +#else +#define NORMAL_PAGE_NUM_HPQ_8195A 0x0C +#define NORMAL_PAGE_NUM_LPQ_8195A 0x02 +#define NORMAL_PAGE_NUM_NPQ_8195A 0x02 +#endif + +// Note: For Normal Chip Setting, modify later +#define WMM_NORMAL_PAGE_NUM_HPQ_8195A 0x30 +#define WMM_NORMAL_PAGE_NUM_LPQ_8195A 0x20 +#define WMM_NORMAL_PAGE_NUM_NPQ_8195A 0x20 + +#include "HalVerDef.h" +#include "hal_com.h" + +#define EFUSE_OOB_PROTECT_BYTES (52+28+16+32) // Security + RF + MAC + OTP = 128 + +#define HWSET_MAX_SIZE_8195A 512 +#define EFUSE_REAL_CONTENT_LEN_8195A 256 +#define EFUSE_MAP_LEN_8195A 512 +#define EFUSE_MAX_SECTION_8195A 64 + +#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN_8195A) + +#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only. +#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only. + +#ifdef CONFIG_LITTLE_WIFI_MCU_FUNCTION_THREAD +#define LITTLE_WIFI_STACKSIZE 512 +#ifdef PLATFORM_CMSIS_RTOS +#define LITTLE_WIFI_TASK_PRIORITY 3 // osPriorityRealtime +#ifdef CONFIG_POWER_SAVING +#define CHECK_IN_REQ_STATE_STACKSIZE 256 +#define CHECK_IN_REQ_STATE_TASK_PRIORITY 0//osPriorityNormal + +#ifdef TDMA_POWER_SAVING +#define TDMA_CHANGE_STATE_STACKSIZE 256 +#define TDMA_CHANGE_STATE_TASK_PRIORITY 2//osPriorityRealtime +#endif //#ifdef TDMA_POWER_SAVING + +#endif +#else +#define LITTLE_WIFI_TASK_PRIORITY 6//TASK_PRORITY_LOW + +#ifdef CONFIG_POWER_SAVING +#define CHECK_IN_REQ_STATE_STACKSIZE 256 +#define CHECK_IN_REQ_STATE_TASK_PRIORITY 1 + +#ifdef TDMA_POWER_SAVING +#define TDMA_CHANGE_STATE_STACKSIZE 256 +#define TDMA_CHANGE_STATE_TASK_PRIORITY 3 +#endif //#ifdef TDMA_POWER_SAVING + +#endif +#endif +#endif + +#define LX_DMA_IMR_DISABLED 0 +#define FW_IMR_DISABLED 0 +#define WL_PMC_IMR_DISABLED 0 + + +//======================================================== +// EFUSE for BT definition +//======================================================== +#define EFUSE_BT_REAL_BANK_CONTENT_LEN 512 +#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 +#define EFUSE_BT_MAP_LEN 1024 // 1k bytes +#define EFUSE_BT_MAX_SECTION 128 // 1024/8 + +#define EFUSE_PROTECT_BYTES_BANK 16 + +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +// Description: Determine the types of C2H events that are the same in driver and Fw. +// Fisrt constructed by tynli. 2009.10.09. +typedef enum _C2H_EVT +{ + C2H_DBG = 0, + C2H_TSF = 1, + C2H_AP_RPT_RSP = 2, + C2H_CCX_TX_RPT = 3, // The FW notify the report of the specific tx packet. + C2H_BT_RSSI = 4, + C2H_BT_OP_MODE = 5, + C2H_EXT_RA_RPT = 6, + C2H_8723B_BT_INFO = 9, + C2H_HW_INFO_EXCH = 10, + C2H_8723B_BT_MP_INFO = 11, + MAX_C2HEVENT +} C2H_EVT; + +typedef _PACKED struct _C2H_EVT_HDR +{ + u8 CmdID; + u8 CmdLen; + u8 CmdSeq; +} C2H_EVT_HDR, *PC2H_EVT_HDR; + +typedef enum tag_Package_Definition +{ + PACKAGE_DEFAULT, + PACKAGE_QFN56, + PACKAGE_QFN48, + PACKAGE_BGA96, + PACKAGE_QFN88, + PACKAGE_QFN216 +}PACKAGE_TYPE_E; + +typedef enum tag_ChipID_Definition +{ + CHIPID_8711AM = 0xFF, + CHIPID_8195AM = 0xFE, + CHIPID_8711AF = 0xFD, + CHIPID_8710AF = 0xFC, + CHIPID_8711AN = 0xFB, + CHIPID_8710AM = 0xFA +}CHIP_TD_E; + + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +//======================================================== +// TXBD and RXBD definition +//======================================================== +#ifdef CONFIG_MP_INCLUDED // For MP Tx no idle +#define TX_VIQ_DESC_NUM 4 +#define TX_VOQ_DESC_NUM 4 +#define TX_BKQ_DESC_NUM 4 +#define TX_BEQ_DESC_NUM 32 +#else +#define TX_VIQ_DESC_NUM 4 +#define TX_VOQ_DESC_NUM 4 +#define TX_BKQ_DESC_NUM 4 +#define TX_BEQ_DESC_NUM 4 +#endif +#define TX_BCNQ_DESC_NUM 2 +#define TX_MGQ_DESC_NUM 4 +#define TX_H0Q_DESC_NUM 2 +#define TX_H1Q_DESC_NUM 2 +#define TX_H2Q_DESC_NUM 2 +#define TX_H3Q_DESC_NUM 2 +#define TX_H4Q_DESC_NUM 2 +#define TX_H5Q_DESC_NUM 2 +#define TX_H6Q_DESC_NUM 2 +#define TX_H7Q_DESC_NUM 2 +#define RX_Q_DESC_NUM 4 //16 Reduce rx desc number due to memory limitation + +#define SET_VIQ_DES_NUM (TX_VIQ_DESC_NUM<<16) +#define SET_VOQ_DES_NUM (TX_VOQ_DESC_NUM) +#define SET_RXQ_DES_NUM (RX_Q_DESC_NUM<<16) +#define SET_MGQ_DES_NUM (TX_MGQ_DESC_NUM) +#define SET_BKQ_DES_NUM (TX_BKQ_DESC_NUM<<16) +#define SET_BEQ_DES_NUM (TX_BEQ_DESC_NUM) +#define SET_H1Q_DES_NUM (TX_H1Q_DESC_NUM<<16) +#define SET_H0Q_DES_NUM (TX_H0Q_DESC_NUM) +#define SET_H3Q_DES_NUM (TX_H3Q_DESC_NUM<<16) +#define SET_H2Q_DES_NUM (TX_H2Q_DESC_NUM) +#define SET_H5Q_DES_NUM (TX_H5Q_DESC_NUM<<16) +#define SET_H4Q_DES_NUM (TX_H4Q_DESC_NUM) +#define SET_H7Q_DES_NUM (TX_H7Q_DESC_NUM<<16) +#define SET_H6Q_DES_NUM (TX_H6Q_DESC_NUM) + +#define TX_DESC_MODE 1 + +//0: 2 segment +//1: 4 segment +//2: 8 segment +//#define TX_DESC_MODE 2 + +#define MAX_TXBD_SEQMENT_NUM ((TX_DESC_MODE)? (4*TX_DESC_MODE): 2) +#define TXBD_SEGMENT_SIZE 8 + + + +typedef struct _RXBD_ELEMENT_ { + u32 Dword0; + u32 PhyAddr; +}RXBD_ELEMENT,*PRXBD_ELEMENT; + + +typedef struct _TXBD_ELEMENT_ { + u32 Dword0; + u32 AddrLow; +}TXBD_ELEMENT,*PTXBD_ELEMENT; + +typedef struct _LX_DMA_ELEMENT_ { + u32 QueueTRxBdBase; + u32 HwIndex; + u32 HostIndex; + u32 AvaliableCnt; +}LX_DMA_ELEMENT, *PLX_DMA_ELEMENT; +#if 1 + +typedef enum _LX_DMA_QUEUE_TYPE_{ + VO_QUEUE = 0, + VI_QUEUE = 1, + BE_QUEUE = 2, + BK_QUEUE = 3, + MG_QUEUE = 4, + RX_QUEUE = 5, + H0_QUEUE = 6, + H1_QUEUE = 7, + H2_QUEUE = 8, + H3_QUEUE = 9, + H4_QUEUE = 10, + H5_QUEUE = 11, + H6_QUEUE = 12, + H7_QUEUE = 13, + BCN_QUEUE = 14, + MAX_TX_QUEUE = 15, + ERROR_QUEUE = 16, +}LX_DMA_QUEUE_TYPE, *PLX_DMA_QUEUE_TYPE; + +typedef struct _TX_FREE_QUEUE_ { + _queue FreeQueue; + u32 Qlen; +}TX_FREE_QUEUE, *PTX_FREE_QUEUE; + +typedef struct _LX_DMA_MANAGER_ { + LX_DMA_ELEMENT QueueTRxBd[MAX_TX_QUEUE]; + u32 QueueMaxValue[MAX_TX_QUEUE]; + u32 RxBdSkb[RX_Q_DESC_NUM]; + u32 RxLen; + u32 RemainLen; + u16 RxAggregateNum; + u16 RxExpectTag; + u16 RxSegFlow; + u16 Flagls; + TX_FREE_QUEUE TxFreeQueue[MAX_TX_QUEUE]; + +}LX_DMA_MANAGER, *PLX_DMA_MANAGER; + +#else + +typedef struct _LX_DMA_MANAGER_ { + u32 *pVoqTXBD; + u32 *pViqTXBD; + u32 *pBeqTXBD; + u32 *pBkqTXBD; + u32 *pBcnqTXBD; + u32 *pMgqTXBD; + u32 *pH0qTXBD; + u32 *pH1qTXBD; + u32 *pH2qTXBD; + u32 *pH3qTXBD; + u32 *pH4qTXBD; + u32 *pH5qTXBD; + u32 *pH6qTXBD; + u32 *pH7qTXBD; + u32 *pExViqTXBD; + u32 *pExVoqTXBD; + u32 *pExBeqTXBD; + u32 *pExBkqTXBD; + u32 *pExMgqTXBD; + u32 *pRXBD; +// u4Byte RxAggBufEntry[RX_Q_DESC_NUM]; +// u4Byte RxAggLenEntry[RX_Q_DESC_NUM]; + u32 RxLen; + u32 RemainLen; + u16 ViqTxWritePoint; + u16 ViqTxReadPoint; + u16 VoqTxWritePoint; + u16 VoqTxReadPoint; + u16 BeqTxWritePoint; + u16 BeqTxReadPoint; + u16 BkqTxWritePoint; + u16 BkqTxReadPoint; + u16 RxWritePoint; + u16 RxReadPoint; + u16 RxAggregateNum; + u16 RxExpectTag; + u16 RxSegFlow; + u16 Flagls; +}LX_DMA_MANAGER, *PLX_DMA_MANAGER; +#endif + +// rtl8723a_hal_init.c +s32 rtl8195a_FirmwareDownload(PADAPTER padapter, BOOLEAN bUsedWoWLANFw); +void rtl8195a_FirmwareSelfReset(PADAPTER padapter); +void rtl8195a_InitializeFirmwareVars(PADAPTER padapter); + +void rtl8195a_InitAntenna_Selection(PADAPTER padapter); +void rtl8195a_DeinitAntenna_Selection(PADAPTER padapter); +void rtl8195a_CheckAntenna_Selection(PADAPTER padapter); +void rtl8195a_init_default_value(PADAPTER padapter); + +s32 rtl8195a_InitLLTTable(PADAPTER padapter); + +s32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU); +s32 CardDisableWithoutHWSM(PADAPTER padapter); + +// EFuse +//u8 GetEEPROMSize8195a(PADAPTER padapter); +void Hal_InitPGData(PADAPTER padapter, u8 *PROMContent); +void Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo); +void Hal_EfuseParseTxPowerInfo_8195A(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail); +void Hal_EfuseParseBTCoexistInfo_8195A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseEEPROMVer_8195A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseChnlPlan_8195A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseCustomerID_8195A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseAntennaDiversity_8195A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseXtal_8195A(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail); +void Hal_EfuseParseThermalMeter_8195A(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail); + +u8 rtw_flash_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); +u8 rtw_flash_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); +u8 rtw_config_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data, u8 efuse); +u8 rtw_config_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data, u8 efuse); + +void rtl8195a_set_hal_ops(struct hal_ops *pHalFunc); +void lxbus_set_intf_ops(struct _io_ops *pops); +void SetHwReg8195A(PADAPTER padapter, u8 variable, u8 *val); +void GetHwReg8195A(PADAPTER padapter, u8 variable, u8 *val); +u8 SetHalDefVar8195A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval); +u8 GetHalDefVar8195A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval); +void SetHalODMVar8195A( PADAPTER Adapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1, BOOLEAN bSet); +void GetHalODMVar8195A(PADAPTER Adapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1, BOOLEAN bSet); + +// register +void rtl8195a_InitBeaconParameters(PADAPTER padapter); +void rtl8195a_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode); +void _InitBurstPktLen_8195AB(PADAPTER Adapter); +#ifdef CONFIG_WOWLAN +void _8051Reset8195a(PADAPTER padapter); +void Hal_DetectWoWMode(PADAPTER pAdapter); +#endif //CONFIG_WOWLAN + +void rtl8195a_start_thread(_adapter *padapter); +void rtl8195a_stop_thread(_adapter *padapter); + +#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) +void rtl8195ab_init_checkbthang_workqueue(_adapter * adapter); +void rtl8195ab_free_checkbthang_workqueue(_adapter * adapter); +void rtl8195ab_cancle_checkbthang_workqueue(_adapter * adapter); +void rtl8195ab_hal_check_bt_hang(_adapter * adapter); +#endif + +#ifdef CONFIG_WOWLAN +void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip); +void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr); +#endif + +#ifdef CONFIG_GPIO_WAKEUP +void HalSetOutPutGPIO(PADAPTER padapter, u8 index, u8 OutPutValue); +#endif + +#ifdef CONFIG_RF_GAIN_OFFSET +void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +#endif //CONFIG_RF_GAIN_OFFSET + + +//1TODO: Chris +#if 1 + +//============= +// [1] Rx Buffer Descriptor (for PCIE) buffer descriptor architecture +//DWORD 0 +#define SET_RX_BUFFER_DESC_DATA_LENGTH_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value) +#define SET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc,__Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 14, 1, __Value) +#define SET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 15, 1, __Value) +#define SET_RX_BUFFER_DESC_RX_TAG_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 16, 13, __Value) + +#define GET_RX_BUFFER_DESC_OWN_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1) +#define GET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1) +#define GET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1) +#define GET_RX_BUFFER_DESC_RX_TAG_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 13) +#define GET_RX_BUFFER_DESC_TOTAL_LENGTH_92E(__pRxStatusDesc)LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14) + + +//DWORD 1 +#define SET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc+4, 0, 32, __Value) +#define GET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 0, 32) + +//DWORD 2 +#define SET_RX_BUFFER_PHYSICAL_HIGH_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc+8, 0, 32, __Value) + + +//=====Tx Desc Buffer content + +// config element for each tx buffer +/* +#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 0, 16, __Valeu) +#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 31, 1, __Valeu) +#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+4, 0, 32, __Valeu) +#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu) +*/ +#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 0, 16, __Valeu) +#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 31, 1, __Valeu) +#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8)+4, 0, 32, __Valeu) +#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu) + +// Dword 0 +#define SET_TX_BUFF_DESC_LEN_0_92E(__pTxDesc, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Valeu) +#define SET_TX_BUFF_DESC_PSB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value) +#define SET_TX_BUFF_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value) +// Dword 1 +#define SET_TX_BUFF_DESC_ADDR_LOW_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 32, __Value) +#define GET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc+4, 0,32) + + +// Dword 2 +#define SET_TX_BUFF_DESC_ADDR_HIGH_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 32, __Value) +// Dword 3, RESERVED + + +#define SET_TX_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value) + +#endif + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtl8711b_hal.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtl8711b_hal.h new file mode 100644 index 0000000..6f97db2 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtl8711b_hal.h @@ -0,0 +1,595 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __RTL8711B_HAL_H__ +#define __RTL8711B_HAL_H__ + +#include "drv_types.h" +//#include "rtl8711b/rtl8711b_pmu_task.h" +#include "hal_data.h" + +#include "rtl8711b/rtl8711b_spec.h" +#include "rtl8711b/rtl8711b_rf.h" +#include "rtl8711b/rtl8711b_dm.h" +#include "rtl8711b/rtl8711b_recv.h" +#include "rtl8711b/rtl8711b_xmit.h" +#include "rtl8711b/rtl8711b_cmd.h" +//#include "rtl8711b/rtl8711b_pmu_cmd.h" +#include "rtl8711b/rtl8711b_led.h" +#include "rtl8711b/Hal8711BPwrSeq.h" +#include "rtl8711b/Hal8711BPhyReg.h" +#include "rtl8711b/Hal8711BPhyCfg.h" +#include "rtl8711b/rom_Hal8711BPhyCfg.h" + +#ifdef DBG_CONFIG_ERROR_DETECT +#include "rtl8711b/rtl8711b_sreset.h" +#endif + +#include "../src/hal/OUTSRC/phydm_precomp.h" + +#if (RTL8711B_SUPPORT==1) + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + +//--------------------------------------------------------------------- +// RTL8723BS From file +//--------------------------------------------------------------------- + #define RTL8723B_FW_IMG "rtl8723B\\rtl8723bfw.bin" + #define RTL8711B_PHY_REG "rtl8711B\\PHY_REG_1T.txt" + #define RTL8711B_PHY_RADIO_A "rtl8711B\\radio_a_1T.txt" + #define RTL8711B_PHY_RADIO_B "rtl8711B\\radio_b_1T.txt" + #define RTL8711B_TXPWR_TRACK "rtl8711B\\TxPowerTrack.txt" + #define RTL8711B_AGC_TAB "rtl8711B\\AGC_TAB_1T.txt" + #define RTL8711B_PHY_MACREG "rtl87195A\\MAC_REG.txt" + #define RTL8711B_PHY_REG_PG "rtl8711B\\PHY_REG_PG.txt" + #define RTL8711B_PHY_REG_MP "rtl8711B\\PHY_REG_MP.txt" + #define RTL8711B_TXPWR_LMT "rtl8711B\\TXPWR_LMT.txt" + +//--------------------------------------------------------------------- +// RTL8723BS From header +//--------------------------------------------------------------------- + + //#define Rtl8723B_FwImageArray Array_MP_8723B_FW_NIC + //#define Rtl8723B_FwImgArrayLength ArrayLength_MP_8723B_FW_NIC + //#define Rtl8723B_FwWoWImageArray Array_MP_8723B_FW_WoWLAN + //#define Rtl8723B_FwWoWImgArrayLength ArrayLength_MP_8723B_FW_WoWLAN + + #define Rtl8711B_PHY_REG_Array_PG Rtl8723SPHY_REG_Array_PG + #define Rtl8711B_PHY_REG_Array_PGLength Rtl8723SPHY_REG_Array_PGLength + +#if MP_DRIVER == 1 + #define Rtl8711B_FwBTImgArray Rtl8723BFwBTImgArray + #define Rtl8711B_FwBTImgArrayLength Rtl8723BFwBTImgArrayLength + + #define Rtl8711B_FwMPImageArray Rtl8723BFwMPImgArray + #define Rtl8711B_FwMPImgArrayLength Rtl8723BMPImgArrayLength + + #define Rtl8711B_PHY_REG_Array_MP Rtl8723B_PHYREG_Array_MP + #define Rtl8711B_PHY_REG_Array_MPLength Rtl8723B_PHYREG_Array_MPLength +#endif + +#endif // RTL8711B_SUPPORT + +#define FW_8711B_SIZE 0x8000 +#define FW_8711B_START_ADDRESS 0x1000 +#define FW_8711B_END_ADDRESS 0x1FFF //0x5FFF + +#define IS_FW_HEADER_EXIST_8711B(_pFwHdr) ((GET_FIRMWARE_HDR_SIGNATURE(_pFwHdr)&0xFFF0) == 0x10B0) + +typedef struct _RT_FIRMWARE { + FIRMWARE_SOURCE eFWSource; +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; +#else + u8 szFwBuffer[FW_8711B_SIZE]; +#endif + u32 ulFwLength; + +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szBTFwBuffer; +#else + u8 szBTFwBuffer[FW_8711B_SIZE]; +#endif + u32 ulBTFwLength; + +#ifdef CONFIG_WOWLAN + u8* szWoWLANFwBuffer; + u32 ulWoWLANFwLength; +#endif //CONFIG_WOWLAN +} RT_FIRMWARE_8711B, *PRT_FIRMWARE_8711B; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. +typedef struct _RT_8723B_FIRMWARE_HDR +{ + // 8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u16 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u16 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; +}RT_8723B_FIRMWARE_HDR, *PRT_8723B_FIRMWARE_HDR; + +#define DRIVER_EARLY_INT_TIME_8711B 0x05 // 5ms +#define BCN_DMA_ATIME_INT_TIME_8711B 0x02 // 2ms + +// for 8711B +// TX 32K, RX 16K, Page size 128B for TX, 8B for RX +#define PAGE_SIZE_TX_8711B 128 +#define PAGE_SIZE_RX_8711B 8 + +#define RX_DMA_SIZE_8711B 0x4000 // 16K +#define RX_DMA_RESERVED_SIZE_8711B 0x80 // 128B, reserved for tx report +#define RX_DMA_BOUNDARY_8711B (RX_DMA_SIZE_8711B - RX_DMA_RESERVED_SIZE_8711B - 1) + +// Note: We will divide number of page equally for each queue other than public queue! + +//For General Reserved Page Number(Beacon Queue is reserved page) +//Beacon:2, PS-Poll:1, Null Data:1,Qos Null Data:1,BT Qos Null Data:1 +#ifdef CONFIG_WLAN_HAL_TEST +#define BCNQ_PAGE_NUM_8711B 0x00 +#else +#define BCNQ_PAGE_NUM_8711B 0x08 +#endif + +#ifdef CONFIG_CONCURRENT_MODE +#define BCNQ1_PAGE_NUM_8711B 0x04 +#else +#define BCNQ1_PAGE_NUM_8711B 0x00 +#endif + +//For WoWLan , more reserved page +//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:2,GTK EXT MEM:2 +#ifdef CONFIG_WOWLAN +#define WOWLAN_PAGE_NUM_8711B 0x07 +#else +#define WOWLAN_PAGE_NUM_8711B 0x00 +#endif + +#ifdef CONFIG_WLAN_HAL_TEST +#define TX_TOTAL_PAGE_NUMBER_8711B (0xF8 - BCNQ_PAGE_NUM_8711B - BCNQ1_PAGE_NUM_8711B - WOWLAN_PAGE_NUM_8711B) +//#define TX_TOTAL_PAGE_NUMBER_8711B 0x40 +#define TX_PAGE_BOUNDARY_8711B (TX_TOTAL_PAGE_NUMBER_8711B + 1) +#else +#define TX_TOTAL_PAGE_NUMBER_8711B (0xFF - BCNQ_PAGE_NUM_8711B - BCNQ1_PAGE_NUM_8711B - WOWLAN_PAGE_NUM_8711B) +#define TX_PAGE_BOUNDARY_8711B (TX_TOTAL_PAGE_NUMBER_8711B + 1) +#endif + +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER TX_TOTAL_PAGE_NUMBER_8711B +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER + 1) + +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8711B +#ifdef CONFIG_WLAN_HAL_TEST +#define NORMAL_PAGE_NUM_HPQ_8711B 0x10 +#define NORMAL_PAGE_NUM_LPQ_8711B 0x10 +#define NORMAL_PAGE_NUM_NPQ_8711B 0x10 +#else +#define NORMAL_PAGE_NUM_HPQ_8711B 0x0C +#define NORMAL_PAGE_NUM_LPQ_8711B 0x02 +#define NORMAL_PAGE_NUM_NPQ_8711B 0x02 +#endif + +#ifdef CONFIG_WLAN_HAL_TEST +#define WMM_NORMAL_PAGE_NUM_HPQ_8711B 0x10 +#define WMM_NORMAL_PAGE_NUM_LPQ_8711B 0x10 +#define WMM_NORMAL_PAGE_NUM_NPQ_8711B 0x10 +#else +// Note: For Normal Chip Setting, modify later +#define WMM_NORMAL_PAGE_NUM_HPQ_8711B 0x30 +#define WMM_NORMAL_PAGE_NUM_LPQ_8711B 0x20 +#define WMM_NORMAL_PAGE_NUM_NPQ_8711B 0x20 +#endif + +#include "HalVerDef.h" +#include "hal_com.h" + +#define LX_DMA_IMR_DISABLED 0 +#define FW_IMR_DISABLED 0 +#define WL_PMC_IMR_DISABLED 0 + + +//======================================================== +// EFUSE for BT definition +//======================================================== +#define EFUSE_BT_REAL_BANK_CONTENT_LEN 512 +#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 +#define EFUSE_BT_MAP_LEN 1024 // 1k bytes +#define EFUSE_BT_MAX_SECTION 128 // 1024/8 + +#define EFUSE_PROTECT_BYTES_BANK 16 + +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +// Description: Determine the types of C2H events that are the same in driver and Fw. +// Fisrt constructed by tynli. 2009.10.09. +typedef enum _C2H_EVT +{ + C2H_DBG = 0, + C2H_TSF = 1, + C2H_AP_RPT_RSP = 2, + C2H_CCX_TX_RPT = 3, // The FW notify the report of the specific tx packet. + C2H_BT_RSSI = 4, + C2H_BT_OP_MODE = 5, + C2H_EXT_RA_RPT = 6, + C2H_8723B_BT_INFO = 9, + C2H_HW_INFO_EXCH = 10, + C2H_8723B_BT_MP_INFO = 11, + MAX_C2HEVENT +} C2H_EVT; + +typedef _PACKED struct _C2H_EVT_HDR +{ + u8 CmdID; + u8 CmdLen; + u8 CmdSeq; +} C2H_EVT_HDR, *PC2H_EVT_HDR; + +typedef enum tag_Package_Definition +{ + PACKAGE_QFN32, + PACKAGE_QFN48_MCM, + PACKAGE_QFN48, + PACKAGE_QFN68, +}PACKAGE_TYPE_E; + +typedef enum tag_ChipID_Definition +{ + CHIPID_8710BN = 0xFF, /* PACKAGE_QFN32 */ + CHIPID_8710BU = 0xFE, /* PACKAGE_QFN48_MCM */ + CHIPID_8711BN = 0xFD, /* PACKAGE_QFN48 */ + CHIPID_8711BG = 0xFC, /* PACKAGE_QFN68 */ +}CHIP_TD_E; + + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +//======================================================== +// TXBD and RXBD definition +//======================================================== +#ifdef CONFIG_MP_INCLUDED // For MP Tx no idle +#define TX_VIQ_DESC_NUM 4 +#define TX_VOQ_DESC_NUM 4 +#define TX_BKQ_DESC_NUM 4 +#define TX_BEQ_DESC_NUM 32 +#else +#define TX_VIQ_DESC_NUM 4 +#define TX_VOQ_DESC_NUM 4 +#define TX_BKQ_DESC_NUM 4 +#define TX_BEQ_DESC_NUM 4 +#endif +#ifdef CONFIG_CONCURRENT_MODE +#define TX_BCNQ_DESC_NUM 4 +#else +#define TX_BCNQ_DESC_NUM 2 +#endif +#define TX_MGQ_DESC_NUM 4 +#define TX_H0Q_DESC_NUM 2 +#define TX_H1Q_DESC_NUM 2 +#define TX_H2Q_DESC_NUM 2 +#define TX_H3Q_DESC_NUM 2 +#define TX_H4Q_DESC_NUM 2 +#define TX_H5Q_DESC_NUM 2 +#define TX_H6Q_DESC_NUM 2 +#define TX_H7Q_DESC_NUM 2 +#define RX_Q_DESC_NUM 4 //16 Reduce rx desc number due to memory limitation + +#define SET_VIQ_DES_NUM (TX_VIQ_DESC_NUM<<16) +#define SET_VOQ_DES_NUM (TX_VOQ_DESC_NUM) +#define SET_RXQ_DES_NUM (RX_Q_DESC_NUM<<16) +#define SET_MGQ_DES_NUM (TX_MGQ_DESC_NUM) +#define SET_BKQ_DES_NUM (TX_BKQ_DESC_NUM<<16) +#define SET_BEQ_DES_NUM (TX_BEQ_DESC_NUM) +#define SET_H1Q_DES_NUM (TX_H1Q_DESC_NUM<<16) +#define SET_H0Q_DES_NUM (TX_H0Q_DESC_NUM) +#define SET_H3Q_DES_NUM (TX_H3Q_DESC_NUM<<16) +#define SET_H2Q_DES_NUM (TX_H2Q_DESC_NUM) +#define SET_H5Q_DES_NUM (TX_H5Q_DESC_NUM<<16) +#define SET_H4Q_DES_NUM (TX_H4Q_DESC_NUM) +#define SET_H7Q_DES_NUM (TX_H7Q_DESC_NUM<<16) +#define SET_H6Q_DES_NUM (TX_H6Q_DESC_NUM) + +#define TX_DESC_MODE 1 + +//0: 2 segment +//1: 4 segment +//2: 8 segment +//#define TX_DESC_MODE 2 + +#define MAX_TXBD_SEQMENT_NUM ((TX_DESC_MODE)? (4*TX_DESC_MODE): 2) +#define TXBD_SEGMENT_SIZE 8 + + + +typedef struct _RXBD_ELEMENT_ { + u32 Dword0; + u32 PhyAddr; +}RXBD_ELEMENT,*PRXBD_ELEMENT; + + +typedef struct _TXBD_ELEMENT_ { + u32 Dword0; + u32 AddrLow; +}TXBD_ELEMENT,*PTXBD_ELEMENT; + +typedef struct _LX_DMA_ELEMENT_ { + u32 QueueTRxBdBase; + u32 HwIndex; + u32 HostIndex; + u32 AvaliableCnt; +}LX_DMA_ELEMENT, *PLX_DMA_ELEMENT; +#if 1 + +typedef enum _LX_DMA_QUEUE_TYPE_{ + VO_QUEUE = 0, + VI_QUEUE = 1, + BE_QUEUE = 2, + BK_QUEUE = 3, + MG_QUEUE = 4, + RX_QUEUE = 5, + H0_QUEUE = 6, + H1_QUEUE = 7, + H2_QUEUE = 8, + H3_QUEUE = 9, + H4_QUEUE = 10, + H5_QUEUE = 11, + H6_QUEUE = 12, + H7_QUEUE = 13, + BCN_QUEUE = 14, + MAX_TX_QUEUE = 15, + ERROR_QUEUE = 16, +}LX_DMA_QUEUE_TYPE, *PLX_DMA_QUEUE_TYPE; + +typedef struct _TX_FREE_QUEUE_ { + _queue FreeQueue; + u32 Qlen; +}TX_FREE_QUEUE, *PTX_FREE_QUEUE; + +typedef struct _LX_DMA_MANAGER_ { + LX_DMA_ELEMENT QueueTRxBd[MAX_TX_QUEUE]; + u32 QueueMaxValue[MAX_TX_QUEUE]; + u32 RxBdSkb[RX_Q_DESC_NUM]; + u32 RxLen; + u32 RemainLen; + u16 RxAggregateNum; + u16 RxExpectTag; + u16 RxSegFlow; + u16 Flagls; + TX_FREE_QUEUE TxFreeQueue[MAX_TX_QUEUE]; + +}LX_DMA_MANAGER, *PLX_DMA_MANAGER; + +#else + +typedef struct _LX_DMA_MANAGER_ { + u32 *pVoqTXBD; + u32 *pViqTXBD; + u32 *pBeqTXBD; + u32 *pBkqTXBD; + u32 *pBcnqTXBD; + u32 *pMgqTXBD; + u32 *pH0qTXBD; + u32 *pH1qTXBD; + u32 *pH2qTXBD; + u32 *pH3qTXBD; + u32 *pH4qTXBD; + u32 *pH5qTXBD; + u32 *pH6qTXBD; + u32 *pH7qTXBD; + u32 *pExViqTXBD; + u32 *pExVoqTXBD; + u32 *pExBeqTXBD; + u32 *pExBkqTXBD; + u32 *pExMgqTXBD; + u32 *pRXBD; +// u4Byte RxAggBufEntry[RX_Q_DESC_NUM]; +// u4Byte RxAggLenEntry[RX_Q_DESC_NUM]; + u32 RxLen; + u32 RemainLen; + u16 ViqTxWritePoint; + u16 ViqTxReadPoint; + u16 VoqTxWritePoint; + u16 VoqTxReadPoint; + u16 BeqTxWritePoint; + u16 BeqTxReadPoint; + u16 BkqTxWritePoint; + u16 BkqTxReadPoint; + u16 RxWritePoint; + u16 RxReadPoint; + u16 RxAggregateNum; + u16 RxExpectTag; + u16 RxSegFlow; + u16 Flagls; +}LX_DMA_MANAGER, *PLX_DMA_MANAGER; +#endif + +// rtl8723a_hal_init.c +s32 rtl8711b_FirmwareDownload(PADAPTER padapter, BOOLEAN bUsedWoWLANFw); +void rtl8711b_FirmwareSelfReset(PADAPTER padapter); +void rtl8711b_InitializeFirmwareVars(PADAPTER padapter); + +void rtl8711b_InitAntenna_Selection(PADAPTER padapter); +void rtl8711b_DeinitAntenna_Selection(PADAPTER padapter); +void rtl8711b_CheckAntenna_Selection(PADAPTER padapter); +void rtl8711b_init_default_value(PADAPTER padapter); + +s32 rtl8711b_InitLLTTable(PADAPTER padapter); + +s32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU); +s32 CardDisableWithoutHWSM(PADAPTER padapter); + +// EFuse +//u8 GetEEPROMSize8711b(PADAPTER padapter); +void Hal_InitPGData(PADAPTER padapter, u8 *PROMContent); +void Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo); +void Hal_EfuseParseTxPowerInfo_8711B(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail); +void Hal_EfuseParseBTCoexistInfo_8711B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseEEPROMVer_8711B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseChnlPlan_8711B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseCustomerID_8711B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseAntennaDiversity_8711B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseXtal_8711B(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail); +void Hal_EfuseParseThermalMeter_8711B(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail); + +#ifdef CONFIG_C2H_PACKET_EN +void C2HPacketHandler_8711B(PADAPTER padapter, u8 *pbuffer, u16 length); +#endif + +u8 rtw_flash_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); +u8 rtw_flash_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); +u8 rtw_config_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data, u8 efuse); +u8 rtw_config_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data, u8 efuse); + +void rtl8711b_set_hal_ops(struct hal_ops *pHalFunc); +void lxbus_set_intf_ops(struct _io_ops *pops); +void SetHwReg8711B(PADAPTER padapter, u8 variable, u8 *val); +void GetHwReg8711B(PADAPTER padapter, u8 variable, u8 *val); +u8 SetHalDefVar8711B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval); +u8 GetHalDefVar8711B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval); +void SetHalODMVar8711B( PADAPTER Adapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1, BOOLEAN bSet); +void GetHalODMVar8711B(PADAPTER Adapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1, BOOLEAN bSet); + +// register +void rtl8711b_InitBeaconParameters(PADAPTER padapter); +void rtl8711b_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode); +void _InitBurstPktLen_8711BB(PADAPTER Adapter); +#ifdef CONFIG_WOWLAN +void _8051Reset8711b(PADAPTER padapter); +void Hal_DetectWoWMode(PADAPTER pAdapter); +#endif //CONFIG_WOWLAN + +void rtl8711b_start_thread(_adapter *padapter); +void rtl8711b_stop_thread(_adapter *padapter); + +#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) +void rtl8711bb_init_checkbthang_workqueue(_adapter * adapter); +void rtl8711bb_free_checkbthang_workqueue(_adapter * adapter); +void rtl8711bb_cancle_checkbthang_workqueue(_adapter * adapter); +void rtl8711bb_hal_check_bt_hang(_adapter * adapter); +#endif + +#ifdef CONFIG_WOWLAN +void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip); +void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr); +#endif + +u32 rtl8710b_wlan_suspend(u32 expected_idle_time, void *param); +u32 rtl8710b_wlan_late_resume(u32 expected_idle_time, void *param); +u32 rtl8710b_wlan_resume(u32 expected_idle_time, void *param); + +#ifdef CONFIG_GPIO_WAKEUP +void HalSetOutPutGPIO(PADAPTER padapter, u8 index, u8 OutPutValue); +#endif + +void CCX_FwC2HTxRpt_8711B(PADAPTER padapter, u8 *pdata, u8 len); +s32 c2h_id_filter_ccx_8711B(u8 *buf); +s32 c2h_handler_8711B(PADAPTER padapter, u8 *pC2hEvent); +u8 MRateToHwRate8723B(u8 rate); +u8 HwRateToMRate8723B(u8 rate); + +#ifdef CONFIG_RF_GAIN_OFFSET +void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +#endif //CONFIG_RF_GAIN_OFFSET + + +//1TODO: Chris +#if 1 + +//============= +// [1] Rx Buffer Descriptor (for PCIE) buffer descriptor architecture +//DWORD 0 +#define SET_RX_BUFFER_DESC_DATA_LENGTH_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value) +#define SET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc,__Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 14, 1, __Value) +#define SET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 15, 1, __Value) +#define SET_RX_BUFFER_DESC_RX_TAG_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 16, 13, __Value) + +#define GET_RX_BUFFER_DESC_OWN_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1) +#define GET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1) +#define GET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1) +#define GET_RX_BUFFER_DESC_RX_TAG_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 13) +#define GET_RX_BUFFER_DESC_TOTAL_LENGTH_92E(__pRxStatusDesc)LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14) + + +//DWORD 1 +#define SET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc+4, 0, 32, __Value) +#define GET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 0, 32) + +//DWORD 2 +#define SET_RX_BUFFER_PHYSICAL_HIGH_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc+8, 0, 32, __Value) + + +//=====Tx Desc Buffer content + +// config element for each tx buffer +/* +#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 0, 16, __Valeu) +#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 31, 1, __Valeu) +#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+4, 0, 32, __Valeu) +#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu) +*/ +#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 0, 16, __Valeu) +#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 31, 1, __Valeu) +#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8)+4, 0, 32, __Valeu) +#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu) + +// Dword 0 +#define SET_TX_BUFF_DESC_LEN_0_92E(__pTxDesc, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Valeu) +#define SET_TX_BUFF_DESC_PSB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value) +#define SET_TX_BUFF_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value) +// Dword 1 +#define SET_TX_BUFF_DESC_ADDR_LOW_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 32, __Value) +#define GET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc+4, 0,32) + + +// Dword 2 +#define SET_TX_BUFF_DESC_ADDR_HIGH_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 32, __Value) +// Dword 3, RESERVED + + +#define SET_TX_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value) + +#endif + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ap.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ap.h new file mode 100644 index 0000000..1a6e5d1 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ap.h @@ -0,0 +1,65 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_AP_H_ +#define __RTW_AP_H_ + +//#include + + +#ifdef CONFIG_AP_MODE + +//external function +extern void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta); +extern void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta); + + +void init_mlme_ap_info(_adapter *padapter); +void free_mlme_ap_info(_adapter *padapter); +//void update_BCNTIM(_adapter *padapter); +void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len); +void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index); +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx); +void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level); +void expire_timeout_chk(_adapter *padapter); +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta); +int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len); +void rtw_set_macaddr_acl(_adapter *padapter, int mode); +int rtw_acl_add_sta(_adapter *padapter, u8 *addr); +int rtw_acl_remove_sta(_adapter *padapter, u8 *addr); +int rtw_generate_bcn_ie(_adapter *adapter, u8 *ssid, u16 ssid_len, u8 *ie); +#if USE_DEDICATED_BCN_TX +struct xmit_frame *alloc_bcn_xmitframe(_adapter *padapter); +#endif + +#ifdef CONFIG_NATIVEAP_MLME +void associated_clients_update(_adapter *padapter, u8 updated); +void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta); +u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta); +void sta_info_update(_adapter *padapter, struct sta_info *psta); +void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta); +u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, u16 reason); +int rtw_sta_flush(_adapter *padapter); +void start_ap_mode(_adapter *padapter); +void stop_ap_mode(_adapter *padapter); +#endif +#endif //end of CONFIG_AP_MODE + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_byteorder.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_byteorder.h new file mode 100644 index 0000000..2f3b6f6 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_byteorder.h @@ -0,0 +1,53 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTL871X_BYTEORDER_H_ +#define _RTL871X_BYTEORDER_H_ + +#include + +#if defined (CONFIG_LITTLE_ENDIAN) && defined (CONFIG_BIG_ENDIAN) +#error "Shall be CONFIG_LITTLE_ENDIAN or CONFIG_BIG_ENDIAN, but not both!\n" +#endif + +#if defined (CONFIG_LITTLE_ENDIAN) +#ifndef CONFIG_PLATFORM_MSTAR389 +# include +#endif +#elif defined (CONFIG_BIG_ENDIAN) +# include +#else +# error "Must be LITTLE/BIG Endian Host" +#endif + +#ifdef CONFIG_BIG_ENDIAN +#define _htons(x) (x) +#define _ntohs(x) (x) +#define _htonl(x) (x) +#define _ntohl(x) (x) +#else /* !CONFIG_BIG_ENDIAN */ +u16 _htons(u16 x); +u16 _ntohs(u16 x); +u32 _htonl(u32 x); +u32 _ntohl(u32 x); +#endif /* CONFIG_BIG_ENDIAN */ + + +#endif /* _RTL871X_BYTEORDER_H_ */ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_cmd.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_cmd.h new file mode 100644 index 0000000..79b6ce1 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_cmd.h @@ -0,0 +1,1184 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_CMD_H_ +#define __RTW_CMD_H_ + +#include +#include + +#define C2H_MEM_SZ (16*1024) +//#define CMD_RSP_BUF 0 +//#define CMD_DBG 0 + +#ifndef CONFIG_RTL8711FW + + #include // + #include // + + #define FREE_CMDOBJ_SZ 128 + + #define MAX_CMDSZ 1024 + #define MAX_RSPSZ 512 + #define MAX_EVTSZ 1024 + +#if defined(PLATFORM_OS_CE) || defined(PLATFORM_ECOS) || defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) + #define CMDBUFF_ALIGN_SZ 4 +#else + #define CMDBUFF_ALIGN_SZ 512 +#endif + + struct cmd_obj { + _adapter *padapter; + u16 cmdcode; + u8 res; + u8 *parmbuf; + u32 cmdsz; + u8 *rsp; + u32 rspsz; + //_sema cmd_sem; + _list list; + }; + + struct cmd_priv { + //_sema cmd_done_sema; + _queue cmd_queue; +#ifdef CMD_BUF + u8 *cmd_buf; //shall be non-paged, and 4 bytes aligned + u8 *cmd_allocated_buf; +#endif +#ifdef CMD_RSP_BUF + u8 *rsp_buf; //shall be non-paged, and 4 bytes aligned + u8 *rsp_allocated_buf; + u32 rsp_cnt; +#endif +#ifdef CMD_DBG + u8 cmd_seq; + u32 cmd_issued_cnt; + u32 cmd_done_cnt; +#endif + u8 cmdthd_running; + _adapter *padapter; + }; + +#ifdef CONFIG_EVENT_THREAD_MODE + struct evt_obj { + u16 evtcode; + u8 res; + u8 *parmbuf; + u32 evtsz; + _list list; + }; +#endif + + struct evt_priv { +#ifdef CONFIG_EVENT_THREAD_MODE + _sema evt_notify; + _sema terminate_evtthread_sema; + _queue evt_queue; +#endif + +#ifdef CONFIG_H2CLBK + _sema lbkevt_done; + u8 lbkevt_limit; + u8 lbkevt_num; + u8 *cmdevt_parm; +#endif + ATOMIC_T event_seq; + u8 *evt_buf; //shall be non-paged, and 4 bytes aligned + u8 *evt_allocated_buf; + u32 evt_done_cnt; +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + u8 *c2h_mem; + u8 *allocated_c2h_mem; +#ifdef PLATFORM_OS_XP + PMDL pc2h_mdl; +#endif +#endif + + }; + +#define init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code) \ +do {\ + rtw_init_listhead(&pcmd->list);\ + pcmd->cmdcode = code;\ + pcmd->parmbuf = (u8 *)(pparm);\ + pcmd->cmdsz = sizeof (*pparm);\ + pcmd->rsp = NULL;\ + pcmd->rspsz = 0;\ +} while(0) + +extern u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj); +extern struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv); +extern void rtw_free_cmd_obj(struct cmd_obj *pcmd); + +#ifdef CONFIG_EVENT_THREAD_MODE +extern u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj); +extern struct evt_obj *rtw_dequeue_evt(_queue *queue); +extern void rtw_free_evt_obj(struct evt_obj *pcmd); +#endif + +thread_return rtw_cmd_thread(thread_context context); + +extern u32 rtw_init_cmd_priv (struct cmd_priv *pcmdpriv); +extern void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv); + +extern u32 rtw_init_evt_priv (struct evt_priv *pevtpriv); +extern void rtw_free_evt_priv (struct evt_priv *pevtpriv); +extern void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv); +extern void rtw_evt_notify_isr(struct evt_priv *pevtpriv); +#ifdef CONFIG_P2P +u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType ); +#endif //CONFIG_P2P + +#else /* CONFIG_RTL8711FW */ + #include +#endif /* CONFIG_RTL8711FW */ + +enum rtw_drvextra_cmd_id +{ + NONE_WK_CID, + DYNAMIC_CHK_WK_CID, + DM_CTRL_WK_CID, + PBC_POLLING_WK_CID, + POWER_SAVING_CTRL_WK_CID,//IPS,AUTOSuspend + LPS_CTRL_WK_CID, + ANT_SELECT_WK_CID, + P2P_PS_WK_CID, + //P2P_PROTO_WK_CID, + CHECK_HIQ_WK_CID,//for softap mode, check hi queue if empty + INTEl_WIDI_WK_CID, + C2H_WK_CID, + RTP_TIMER_CFG_WK_CID, + MAX_WK_CID +}; + +enum LPS_CTRL_TYPE +{ + LPS_CTRL_SCAN=0, + LPS_CTRL_JOINBSS=1, + LPS_CTRL_CONNECT=2, + LPS_CTRL_DISCONNECT=3, + LPS_CTRL_SPECIAL_PACKET=4, + LPS_CTRL_LEAVE=5, +}; + +enum RFINTFS { + SWSI, + HWSI, + HWPI, +}; + +/* +Caller Mode: Infra, Ad-HoC(C) + +Notes: To enter USB suspend mode + +Command Mode + +*/ +struct usb_suspend_parm { + u32 action;// 1: sleep, 0:resume +}; + +/* +Caller Mode: Infra, Ad-HoC + +Notes: To join a known BSS. + +Command-Event Mode + +*/ + +/* +Caller Mode: Infra, Ad-Hoc + +Notes: To join the specified bss + +Command Event Mode + +*/ +struct joinbss_parm { + WLAN_BSSID_EX network; +}; + +/* +Caller Mode: Infra, Ad-HoC(C) + +Notes: To disconnect the current associated BSS + +Command Mode + +*/ +struct disconnect_parm { + u32 rsvd; +}; + +/* +Caller Mode: AP, Ad-HoC(M) + +Notes: To create a BSS + +Command Mode +*/ +struct createbss_parm { + WLAN_BSSID_EX network; +}; + +/* +Caller Mode: AP, Ad-HoC, Infra + +Notes: To set the NIC mode of RTL8711 + +Command Mode + +The definition of mode: + +#define IW_MODE_AUTO 0 // Let the driver decides which AP to join +#define IW_MODE_ADHOC 1 // Single cell network (Ad-Hoc Clients) +#define IW_MODE_INFRA 2 // Multi cell network, roaming, .. +#define IW_MODE_MASTER 3 // Synchronisation master or Access Point +#define IW_MODE_REPEAT 4 // Wireless Repeater (forwarder) +#define IW_MODE_SECOND 5 // Secondary master/repeater (backup) +#define IW_MODE_MONITOR 6 // Passive monitor (listen only) + +*/ +struct setopmode_parm { + u8 mode; + u8 rsvd[3]; +}; + +/* +Caller Mode: AP, Ad-HoC, Infra + +Notes: To ask RTL8711 performing site-survey + +Command-Event Mode + +*/ + +#if defined(PLATFORM_ECOS) || defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) +#define RTW_SSID_SCAN_AMOUNT 1 //Reduce ssid scan amount due to memory limitation - Alex Fang +#else +#define RTW_SSID_SCAN_AMOUNT 9 // for WEXT_CSCAN_AMOUNT 9 +#endif + +struct sitesurvey_parm { + sint scan_mode; //active: 1, passive: 0 + sint bsslimit; // 1 ~ 48 + // for up to 9 probreq with specific ssid + NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT]; +}; + +/* +Caller Mode: Any + +Notes: To set the auth type of RTL8711. open/shared/802.1x + +Command Mode + +*/ +struct setauth_parm { + u8 mode; //0: legacy open, 1: legacy shared 2: 802.1x + u8 _1x; //0: PSK, 1: TLS + u8 rsvd[2]; +}; + +/* +Caller Mode: Infra + +a. algorithm: wep40, wep104, tkip & aes +b. keytype: grp key/unicast key +c. key contents + +when shared key ==> keyid is the camid +when 802.1x ==> keyid [0:1] ==> grp key +when 802.1x ==> keyid > 2 ==> unicast key + +*/ +struct setkey_parm { + u8 algorithm; // encryption algorithm, could be none, wep40, TKIP, CCMP, wep104 + u8 keyid; + u8 grpkey; // 1: this is the grpkey for 802.1x. 0: this is the unicast key for 802.1x + u8 set_tx; // 1: main tx key for wep. 0: other key. + u8 key[16]; // this could be 40 or 104 +}; + +/* +When in AP or Ad-Hoc mode, this is used to +allocate an sw/hw entry for a newly associated sta. + +Command + +when shared key ==> algorithm/keyid + +*/ +struct set_stakey_parm { + u8 addr[ETH_ALEN]; + u8 algorithm; + u8 id;// currently for erasing cam entry if algorithm == _NO_PRIVACY_ + u8 key[16]; +}; + +struct set_stakey_rsp { + u8 addr[ETH_ALEN]; + u8 keyid; + u8 rsvd; +}; + +/* +Caller Ad-Hoc/AP + +Command -Rsp(AID == CAMID) mode + +This is to force fw to add an sta_data entry per driver's request. + +FW will write an cam entry associated with it. + +*/ +struct set_assocsta_parm { + u8 addr[ETH_ALEN]; +}; + +struct set_assocsta_rsp { + u8 cam_id; + u8 rsvd[3]; +}; + +/* + Caller Ad-Hoc/AP + + Command mode + + This is to force fw to del an sta_data entry per driver's request + + FW will invalidate the cam entry associated with it. + +*/ +struct del_assocsta_parm { + u8 addr[ETH_ALEN]; +}; + +/* +Caller Mode: AP/Ad-HoC(M) + +Notes: To notify fw that given staid has changed its power state + +Command Mode + +*/ +struct setstapwrstate_parm { + u8 staid; + u8 status; + u8 hwaddr[6]; +}; + +/* +Caller Mode: Any + +Notes: To setup the basic rate of RTL8711 + +Command Mode + +*/ +struct setbasicrate_parm { + u8 basicrates[NumRates]; +}; + +/* +Caller Mode: Any + +Notes: To read the current basic rate + +Command-Rsp Mode + +*/ +struct getbasicrate_parm { + u32 rsvd; +}; + +struct getbasicrate_rsp { + u8 basicrates[NumRates]; +}; + +/* +Caller Mode: Any + +Notes: To setup the data rate of RTL8711 + +Command Mode + +*/ +struct setdatarate_parm { +#ifdef MP_FIRMWARE_OFFLOAD + u32 curr_rateidx; +#else + u8 mac_id; + u8 datarates[NumRates]; +#endif +}; + +/* +Caller Mode: Any + +Notes: To read the current data rate + +Command-Rsp Mode + +*/ +struct getdatarate_parm { + u32 rsvd; + +}; +struct getdatarate_rsp { + u8 datarates[NumRates]; +}; + + +/* +Caller Mode: Any +AP: AP can use the info for the contents of beacon frame +Infra: STA can use the info when sitesurveying +Ad-HoC(M): Like AP +Ad-HoC(C): Like STA + + +Notes: To set the phy capability of the NIC + +Command Mode + +*/ + +struct setphyinfo_parm { + struct regulatory_class class_sets[NUM_REGULATORYS]; + u8 status; +}; + +struct getphyinfo_parm { + u32 rsvd; +}; + +struct getphyinfo_rsp { + struct regulatory_class class_sets[NUM_REGULATORYS]; + u8 status; +}; + +/* +Caller Mode: Any + +Notes: To set the channel/modem/band +This command will be used when channel/modem/band is changed. + +Command Mode + +*/ +struct setphy_parm { + u8 rfchannel; + u8 modem; +}; + +/* +Caller Mode: Any + +Notes: To get the current setting of channel/modem/band + +Command-Rsp Mode + +*/ +struct getphy_parm { + u32 rsvd; + +}; +struct getphy_rsp { + u8 rfchannel; + u8 modem; +}; + +struct readBB_parm { + u8 offset; +}; +struct readBB_rsp { + u8 value; +}; + +struct readTSSI_parm { + u8 offset; +}; +struct readTSSI_rsp { + u8 value; +}; + +struct writeBB_parm { + u8 offset; + u8 value; +}; + +struct readRF_parm { + u8 offset; +}; +struct readRF_rsp { + u32 value; +}; + +struct writeRF_parm { + u32 offset; + u32 value; +}; + +struct getrfintfs_parm { + u8 rfintfs; +}; + + +struct Tx_Beacon_param +{ + WLAN_BSSID_EX network; +}; + +/* + Notes: This command is used for H2C/C2H loopback testing + + mac[0] == 0 + ==> CMD mode, return H2C_SUCCESS. + The following condition must be ture under CMD mode + mac[1] == mac[4], mac[2] == mac[3], mac[0]=mac[5]= 0; + s0 == 0x1234, s1 == 0xabcd, w0 == 0x78563412, w1 == 0x5aa5def7; + s2 == (b1 << 8 | b0); + + mac[0] == 1 + ==> CMD_RSP mode, return H2C_SUCCESS_RSP + + The rsp layout shall be: + rsp: parm: + mac[0] = mac[5]; + mac[1] = mac[4]; + mac[2] = mac[3]; + mac[3] = mac[2]; + mac[4] = mac[1]; + mac[5] = mac[0]; + s0 = s1; + s1 = swap16(s0); + w0 = swap32(w1); + b0 = b1 + s2 = s0 + s1 + b1 = b0 + w1 = w0 + + mac[0] == 2 + ==> CMD_EVENT mode, return H2C_SUCCESS + The event layout shall be: + event: parm: + mac[0] = mac[5]; + mac[1] = mac[4]; + mac[2] = event's sequence number, starting from 1 to parm's marc[3] + mac[3] = mac[2]; + mac[4] = mac[1]; + mac[5] = mac[0]; + s0 = swap16(s0) - event.mac[2]; + s1 = s1 + event.mac[2]; + w0 = swap32(w0); + b0 = b1 + s2 = s0 + event.mac[2] + b1 = b0 + w1 = swap32(w1) - event.mac[2]; + + parm->mac[3] is the total event counts that host requested. + + + event will be the same with the cmd's param. + +*/ + +#ifdef CONFIG_H2CLBK + +struct seth2clbk_parm { + u8 mac[6]; + u16 s0; + u16 s1; + u32 w0; + u8 b0; + u16 s2; + u8 b1; + u32 w1; +}; + +struct geth2clbk_parm { + u32 rsv; +}; + +struct geth2clbk_rsp { + u8 mac[6]; + u16 s0; + u16 s1; + u32 w0; + u8 b0; + u16 s2; + u8 b1; + u32 w1; +}; + +#endif /* CONFIG_H2CLBK */ + +// CMD param Formart for driver extra cmd handler +struct drvextra_cmd_parm { + int ec_id; //extra cmd id + int type_size; // Can use this field as the type id or command size + unsigned char *pbuf; +}; + +#ifdef CONFIG_P2P_NEW +// CMD param Formart for p2p cmd handler +struct p2p_cmd_parm { + int id; //p2p cmd id + int type_size; // Can use this field as the type id or command size + unsigned char *pbuf; +}; +#endif +/*------------------- Below are used for RF/BB tunning ---------------------*/ + +struct setantenna_parm { + u8 tx_antset; + u8 rx_antset; + u8 tx_antenna; + u8 rx_antenna; +}; + +struct enrateadaptive_parm { + u32 en; +}; + +struct settxagctbl_parm { + u32 txagc[MAX_RATES_LENGTH]; +}; + +struct gettxagctbl_parm { + u32 rsvd; +}; +struct gettxagctbl_rsp { + u32 txagc[MAX_RATES_LENGTH]; +}; + +struct setagcctrl_parm { + u32 agcctrl; // 0: pure hw, 1: fw +}; + + +struct setssup_parm { + u32 ss_ForceUp[MAX_RATES_LENGTH]; +}; + +struct getssup_parm { + u32 rsvd; +}; +struct getssup_rsp { + u8 ss_ForceUp[MAX_RATES_LENGTH]; +}; + + +struct setssdlevel_parm { + u8 ss_DLevel[MAX_RATES_LENGTH]; +}; + +struct getssdlevel_parm { + u32 rsvd; +}; +struct getssdlevel_rsp { + u8 ss_DLevel[MAX_RATES_LENGTH]; +}; + +struct setssulevel_parm { + u8 ss_ULevel[MAX_RATES_LENGTH]; +}; + +struct getssulevel_parm { + u32 rsvd; +}; +struct getssulevel_rsp { + u8 ss_ULevel[MAX_RATES_LENGTH]; +}; + + +struct setcountjudge_parm { + u8 count_judge[MAX_RATES_LENGTH]; +}; + +struct getcountjudge_parm { + u32 rsvd; +}; +struct getcountjudge_rsp { + u8 count_judge[MAX_RATES_LENGTH]; +}; + + +struct setratable_parm { + u8 ss_ForceUp[NumRates]; + u8 ss_ULevel[NumRates]; + u8 ss_DLevel[NumRates]; + u8 count_judge[NumRates]; +}; + +struct getratable_parm { + uint rsvd; +}; +struct getratable_rsp { + u8 ss_ForceUp[NumRates]; + u8 ss_ULevel[NumRates]; + u8 ss_DLevel[NumRates]; + u8 count_judge[NumRates]; +}; + + +//to get TX,RX retry count +struct gettxretrycnt_parm{ + unsigned int rsvd; +}; +struct gettxretrycnt_rsp{ + unsigned long tx_retrycnt; +}; + +struct getrxretrycnt_parm{ + unsigned int rsvd; +}; +struct getrxretrycnt_rsp{ + unsigned long rx_retrycnt; +}; + +//to get BCNOK,BCNERR count +struct getbcnokcnt_parm{ + unsigned int rsvd; +}; +struct getbcnokcnt_rsp{ + unsigned long bcnokcnt; +}; + +struct getbcnerrcnt_parm{ + unsigned int rsvd; +}; +struct getbcnerrcnt_rsp{ + unsigned long bcnerrcnt; +}; + +// to get current TX power level +struct getcurtxpwrlevel_parm{ + unsigned int rsvd; +}; +struct getcurtxpwrlevel_rsp{ + unsigned short tx_power; +}; + +///TODO +#if 0 + +struct setprobereqextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + +struct setassocreqextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + +struct setproberspextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + +struct setassocrspextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + +#endif //#if 0 + +struct addBaReq_parm +{ + unsigned int tid; + u8 addr[ETH_ALEN]; +}; + +/*H2C Handler index: 46 */ +struct SetChannel_parm +{ + u32 curr_ch; +}; + +#ifdef MP_FIRMWARE_OFFLOAD +/*H2C Handler index: 47 */ +struct SetTxPower_parm +{ + u8 TxPower; +}; + +/*H2C Handler index: 48 */ +struct SwitchAntenna_parm +{ + u16 antenna_tx; + u16 antenna_rx; +// R_ANTENNA_SELECT_CCK cck_txrx; + u8 cck_txrx; +}; + +/*H2C Handler index: 49 */ +struct SetCrystalCap_parm +{ + u32 curr_crystalcap; +}; + +/*H2C Handler index: 50 */ +struct SetSingleCarrierTx_parm +{ + u8 bStart; +}; + +/*H2C Handler index: 51 */ +struct SetSingleToneTx_parm +{ + u8 bStart; + u8 curr_rfpath; +}; + +/*H2C Handler index: 52 */ +struct SetCarrierSuppressionTx_parm +{ + u8 bStart; + u32 curr_rateidx; +}; + +/*H2C Handler index: 53 */ +struct SetContinuousTx_parm +{ + u8 bStart; + u8 CCK_flag; /*1:CCK 2:OFDM*/ + u32 curr_rateidx; +}; + +/*H2C Handler index: 54 */ +struct SwitchBandwidth_parm +{ + u8 curr_bandwidth; +}; + +#endif /* MP_FIRMWARE_OFFLOAD */ + +/*H2C Handler index: 59 */ +struct SetChannelPlan_param +{ + u8 channel_plan; +}; + +//TODO +#if 0 +/*H2C Handler index: 60 */ +struct LedBlink_param +{ + PLED_871x pLed; +}; +#endif //#if 0 + +/*H2C Handler index: 61 */ +struct SetChannelSwitch_param +{ + u8 new_ch_no; +}; + +/*H2C Handler index: 62 */ +struct TDLSoption_param +{ + u8 addr[ETH_ALEN]; + u8 option; +}; + +#define GEN_CMD_CODE(cmd) cmd ## _CMD_ + + +/* + +Result: +0x00: success +0x01: sucess, and check Response. +0x02: cmd ignored due to duplicated sequcne number +0x03: cmd dropped due to invalid cmd code +0x04: reserved. + +*/ + +#define H2C_RSP_OFFSET 512 + +#define H2C_SUCCESS 0x00 +#define H2C_SUCCESS_RSP 0x01 +#define H2C_DUPLICATED 0x02 +#define H2C_DROPPED 0x03 +#define H2C_PARAMETERS_ERROR 0x04 +#define H2C_REJECTED 0x05 +#define H2C_CMD_OVERFLOW 0x06 +#define H2C_RESERVED 0x07 + +extern u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr); +extern u8 rtw_setstandby_cmd(_adapter *padapter, uint action); +extern u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *pssid, int ssid_max_num); +extern u8 rtw_createbss_cmd(_adapter *padapter); +extern u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz); +extern u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch); +extern u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key); +extern u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue); +extern u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork); +extern u8 rtw_disassoc_cmd(_adapter *padapter); +extern u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); +extern u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset); +extern u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset); +extern u8 rtw_setbbreg_cmd(_adapter * padapter, u8 offset, u8 val); +extern u8 rtw_setrfreg_cmd(_adapter * padapter, u8 offset, u32 val); +extern u8 rtw_getbbreg_cmd(_adapter * padapter, u8 offset, u8 * pval); +extern u8 rtw_getrfreg_cmd(_adapter * padapter, u8 offset, u8 * pval); +extern u8 rtw_setrfintfs_cmd(_adapter *padapter, u8 mode); +extern u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table); +extern u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval); + +extern u8 rtw_gettssi_cmd(_adapter *padapter, u8 offset,u8 *pval); +extern u8 rtw_setfwdig_cmd(_adapter*padapter, u8 type); +extern u8 rtw_setfwra_cmd(_adapter*padapter, u8 type); + +extern u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr); + +extern u8 rtw_dynamic_chk_wk_cmd(_adapter *adapter); +#ifdef CONFIG_P2P_NEW +u8 rtw_p2p_cmd(_adapter*padapter, int subid); +#endif +u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue); +#if (RATE_ADAPTIVE_SUPPORT==1) +u8 rtw_rpt_timer_cfg_cmd(_adapter*padapter, u16 minRptTime); +#endif + +#ifdef CONFIG_ANTENNA_DIVERSITY +extern u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue); +#endif + +extern u8 rtw_ps_cmd(_adapter*padapter); + +#ifdef CONFIG_AP_MODE +u8 rtw_chk_hi_queue_cmd(_adapter*padapter); +#endif + +extern u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan, u8 enaueue); +//TODO +//extern u8 rtw_led_blink_cmd(_adapter*padapter, PLED_871x pLed); +extern u8 rtw_set_csa_cmd(_adapter*padapter, u8 new_ch_no); +extern u8 rtw_tdls_cmd(_adapter*padapter, u8 *addr, u8 option); + +extern u8 rtw_c2h_wk_cmd(PADAPTER padapter); + +u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf); +#ifdef CONFIG_P2P_NEW +u8 rtw_p2p_cmd_hdl(_adapter *padapter, unsigned char *pbuf); +#endif +extern void rtw_survey_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_disassoc_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_joinbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_getbbrfreg_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd); + +extern void rtw_setstaKey_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_setassocsta_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_getrttbl_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_set_channel_plan_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd); + + +struct _cmd_callback { + u32 cmd_code; + void (*callback)(_adapter *padapter, struct cmd_obj *cmd); +}; + +enum rtw_h2c_cmd +{ + GEN_CMD_CODE(_Read_MACREG) , /*0*/ + GEN_CMD_CODE(_Write_MACREG) , + GEN_CMD_CODE(_Read_BBREG) , + GEN_CMD_CODE(_Write_BBREG) , + GEN_CMD_CODE(_Read_RFREG) , + GEN_CMD_CODE(_Write_RFREG) , /*5*/ + GEN_CMD_CODE(_Read_EEPROM) , + GEN_CMD_CODE(_Write_EEPROM) , + GEN_CMD_CODE(_Read_EFUSE) , + GEN_CMD_CODE(_Write_EFUSE) , + + GEN_CMD_CODE(_Read_CAM) , /*10*/ + GEN_CMD_CODE(_Write_CAM) , + GEN_CMD_CODE(_setBCNITV), + GEN_CMD_CODE(_setMBIDCFG), + GEN_CMD_CODE(_JoinBss), /*14*/ + GEN_CMD_CODE(_DisConnect) , /*15*/ + GEN_CMD_CODE(_CreateBss) , + GEN_CMD_CODE(_SetOpMode) , + GEN_CMD_CODE(_SiteSurvey), /*18*/ + GEN_CMD_CODE(_SetAuth) , + + GEN_CMD_CODE(_SetKey) , /*20*/ + GEN_CMD_CODE(_SetStaKey) , + GEN_CMD_CODE(_SetAssocSta) , + GEN_CMD_CODE(_DelAssocSta) , + GEN_CMD_CODE(_SetStaPwrState) , + GEN_CMD_CODE(_SetBasicRate) , /*25*/ + GEN_CMD_CODE(_GetBasicRate) , + GEN_CMD_CODE(_SetDataRate) , + GEN_CMD_CODE(_GetDataRate) , + GEN_CMD_CODE(_SetPhyInfo) , + + GEN_CMD_CODE(_GetPhyInfo) , /*30*/ + GEN_CMD_CODE(_SetPhy) , + GEN_CMD_CODE(_GetPhy) , + GEN_CMD_CODE(_readRssi) , + GEN_CMD_CODE(_readGain) , + GEN_CMD_CODE(_SetAtim) , /*35*/ + GEN_CMD_CODE(_SetPwrMode) , + GEN_CMD_CODE(_JoinbssRpt), + GEN_CMD_CODE(_SetRaTable) , + GEN_CMD_CODE(_GetRaTable) , + + GEN_CMD_CODE(_GetCCXReport), /*40*/ + GEN_CMD_CODE(_GetDTMReport), + GEN_CMD_CODE(_GetTXRateStatistics), + GEN_CMD_CODE(_SetUsbSuspend), + GEN_CMD_CODE(_SetH2cLbk), + GEN_CMD_CODE(_AddBAReq) , /*45*/ + GEN_CMD_CODE(_SetChannel), /*46*/ + GEN_CMD_CODE(_SetTxPower), + GEN_CMD_CODE(_SwitchAntenna), + GEN_CMD_CODE(_SetCrystalCap), + GEN_CMD_CODE(_SetSingleCarrierTx), /*50*/ + + GEN_CMD_CODE(_SetSingleToneTx),/*51*/ + GEN_CMD_CODE(_SetCarrierSuppressionTx), + GEN_CMD_CODE(_SetContinuousTx), + GEN_CMD_CODE(_SwitchBandwidth), /*54*/ + GEN_CMD_CODE(_TX_Beacon), /*55*/ + + GEN_CMD_CODE(_Set_MLME_EVT), /*56*/ + GEN_CMD_CODE(_Set_Drv_Extra), /*57*/ + GEN_CMD_CODE(_Set_H2C_MSG), /*58*/ + + GEN_CMD_CODE(_SetChannelPlan), /*59*/ + GEN_CMD_CODE(_LedBlink), /*60*/ + + GEN_CMD_CODE(_SetChannelSwitch), /*61*/ + GEN_CMD_CODE(_TDLS), /*62*/ + GEN_CMD_CODE(_P2P), /*63*/ + + MAX_H2CCMD +}; + +#define _GetBBReg_CMD_ _Read_BBREG_CMD_ +#define _SetBBReg_CMD_ _Write_BBREG_CMD_ +#define _GetRFReg_CMD_ _Read_RFREG_CMD_ +#define _SetRFReg_CMD_ _Write_RFREG_CMD_ + +#ifdef _RTW_CMD_C_ +const struct _cmd_callback rtw_cmd_callback[] = +{ + {GEN_CMD_CODE(_Read_MACREG), NULL}, /*0*/ + {GEN_CMD_CODE(_Write_MACREG), NULL}, +//TODO +// {GEN_CMD_CODE(_Read_BBREG), &rtw_getbbrfreg_cmdrsp_callback}, + {GEN_CMD_CODE(_Read_BBREG), NULL}, + {GEN_CMD_CODE(_Write_BBREG), NULL}, +//TODO +// {GEN_CMD_CODE(_Read_RFREG), &rtw_getbbrfreg_cmdrsp_callback}, + {GEN_CMD_CODE(_Read_RFREG), NULL}, + {GEN_CMD_CODE(_Write_RFREG), NULL}, /*5*/ + {GEN_CMD_CODE(_Read_EEPROM), NULL}, + {GEN_CMD_CODE(_Write_EEPROM), NULL}, + {GEN_CMD_CODE(_Read_EFUSE), NULL}, + {GEN_CMD_CODE(_Write_EFUSE), NULL}, + + {GEN_CMD_CODE(_Read_CAM), NULL}, /*10*/ + {GEN_CMD_CODE(_Write_CAM), NULL}, + {GEN_CMD_CODE(_setBCNITV), NULL}, + {GEN_CMD_CODE(_setMBIDCFG), NULL}, + {GEN_CMD_CODE(_JoinBss), &rtw_joinbss_cmd_callback}, /*14*/ + {GEN_CMD_CODE(_DisConnect), &rtw_disassoc_cmd_callback}, /*15*/ +//TODO +// {GEN_CMD_CODE(_CreateBss), &rtw_createbss_cmd_callback}, + {GEN_CMD_CODE(_CreateBss), NULL}, + {GEN_CMD_CODE(_SetOpMode), NULL}, + {GEN_CMD_CODE(_SiteSurvey), &rtw_survey_cmd_callback}, /*18*/ + {GEN_CMD_CODE(_SetAuth), NULL}, + + {GEN_CMD_CODE(_SetKey), NULL}, /*20*/ + {GEN_CMD_CODE(_SetStaKey), &rtw_setstaKey_cmdrsp_callback}, +//TODO +// {GEN_CMD_CODE(_SetAssocSta), &rtw_setassocsta_cmdrsp_callback}, + {GEN_CMD_CODE(_SetAssocSta), NULL}, + {GEN_CMD_CODE(_DelAssocSta), NULL}, + {GEN_CMD_CODE(_SetStaPwrState), NULL}, + {GEN_CMD_CODE(_SetBasicRate), NULL}, /*25*/ + {GEN_CMD_CODE(_GetBasicRate), NULL}, + {GEN_CMD_CODE(_SetDataRate), NULL}, + {GEN_CMD_CODE(_GetDataRate), NULL}, + {GEN_CMD_CODE(_SetPhyInfo), NULL}, + + {GEN_CMD_CODE(_GetPhyInfo), NULL}, /*30*/ + {GEN_CMD_CODE(_SetPhy), NULL}, + {GEN_CMD_CODE(_GetPhy), NULL}, + {GEN_CMD_CODE(_readRssi), NULL}, + {GEN_CMD_CODE(_readGain), NULL}, + {GEN_CMD_CODE(_SetAtim), NULL}, /*35*/ + {GEN_CMD_CODE(_SetPwrMode), NULL}, + {GEN_CMD_CODE(_JoinbssRpt), NULL}, + {GEN_CMD_CODE(_SetRaTable), NULL}, + {GEN_CMD_CODE(_GetRaTable) , NULL}, + + {GEN_CMD_CODE(_GetCCXReport), NULL}, /*40*/ + {GEN_CMD_CODE(_GetDTMReport), NULL}, + {GEN_CMD_CODE(_GetTXRateStatistics), NULL}, + {GEN_CMD_CODE(_SetUsbSuspend), NULL}, + {GEN_CMD_CODE(_SetH2cLbk), NULL}, + {GEN_CMD_CODE(_AddBAReq), NULL}, /*45*/ + {GEN_CMD_CODE(_SetChannel), NULL}, /*46*/ + {GEN_CMD_CODE(_SetTxPower), NULL}, + {GEN_CMD_CODE(_SwitchAntenna), NULL}, + {GEN_CMD_CODE(_SetCrystalCap), NULL}, + {GEN_CMD_CODE(_SetSingleCarrierTx), NULL}, /*50*/ + + {GEN_CMD_CODE(_SetSingleToneTx), NULL}, /*51*/ + {GEN_CMD_CODE(_SetCarrierSuppressionTx), NULL}, + {GEN_CMD_CODE(_SetContinuousTx), NULL}, + {GEN_CMD_CODE(_SwitchBandwidth), NULL}, /*54*/ + {GEN_CMD_CODE(_TX_Beacon), NULL},/*55*/ + + {GEN_CMD_CODE(_Set_MLME_EVT), NULL},/*56*/ + {GEN_CMD_CODE(_Set_Drv_Extra), NULL},/*57*/ + {GEN_CMD_CODE(_Set_H2C_MSG), NULL},/*58*/ + {GEN_CMD_CODE(_SetChannelPlan), rtw_set_channel_plan_cmd_callback},/*59*/ + {GEN_CMD_CODE(_LedBlink), NULL},/*60*/ + + {GEN_CMD_CODE(_SetChannelSwitch), NULL},/*61*/ + {GEN_CMD_CODE(_TDLS), NULL},/*62*/ +#ifdef CONFIG_P2P_NEW + {GEN_CMD_CODE(_P2P), NULL},/*63*/ +#endif +}; +#endif + +#endif // _CMD_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_debug.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_debug.h index 904eaa0..a7d7b7d 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_debug.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_debug.h @@ -33,39 +33,39 @@ #define _drv_debug_ 10 -#define _module_rtl871x_xmit_c_ BIT(0) -#define _module_xmit_osdep_c_ BIT(1) -#define _module_rtl871x_recv_c_ BIT(2) -#define _module_recv_osdep_c_ BIT(3) -#define _module_rtl871x_mlme_c_ BIT(4) -#define _module_mlme_osdep_c_ BIT(5) +#define _module_rtl871x_xmit_c_ BIT(0) +#define _module_xmit_osdep_c_ BIT(1) +#define _module_rtl871x_recv_c_ BIT(2) +#define _module_recv_osdep_c_ BIT(3) +#define _module_rtl871x_mlme_c_ BIT(4) +#define _module_mlme_osdep_c_ BIT(5) #define _module_rtl871x_sta_mgt_c_ BIT(6) #define _module_rtl871x_cmd_c_ BIT(7) -#define _module_cmd_osdep_c_ BIT(8) -#define _module_rtl871x_io_c_ BIT(9) -#define _module_io_osdep_c_ BIT(10) -#define _module_os_intfs_c_ BIT(11) +#define _module_cmd_osdep_c_ BIT(8) +#define _module_rtl871x_io_c_ BIT(9) +#define _module_io_osdep_c_ BIT(10) +#define _module_os_intfs_c_ BIT(11) #define _module_rtl871x_security_c_ BIT(12) -#define _module_rtl871x_eeprom_c_ BIT(13) -#define _module_hal_init_c_ BIT(14) -#define _module_hci_hal_init_c_ BIT(15) +#define _module_rtl871x_eeprom_c_ BIT(13) +#define _module_hal_init_c_ BIT(14) +#define _module_hci_hal_init_c_ BIT(15) #define _module_rtl871x_ioctl_c_ BIT(16) -#define _module_rtl871x_ioctl_set_c_ BIT(17) +#define _module_rtl871x_ioctl_set_c_ BIT(17) #define _module_rtl871x_ioctl_query_c_ BIT(18) -#define _module_rtl871x_pwrctrl_c_ BIT(19) +#define _module_rtl871x_pwrctrl_c_ BIT(19) #define _module_hci_intfs_c_ BIT(20) -#define _module_hci_ops_c_ BIT(21) -#define _module_osdep_service_c_ BIT(22) -#define _module_mp_ BIT(23) +#define _module_hci_ops_c_ BIT(21) +#define _module_osdep_service_c_ BIT(22) +#define _module_mp_ BIT(23) #define _module_hci_ops_os_c_ BIT(24) #define _module_rtl871x_ioctl_os_c BIT(25) -#define _module_rtl8712_cmd_c_ BIT(26) -#define _module_fwcmd_c_ BIT(27) -#define _module_rtl8192c_xmit_c_ BIT(28) -#define _module_hal_xmit_c_ BIT(28) -#define _module_efuse_ BIT(29) -#define _module_rtl8712_recv_c_ BIT(30) -#define _module_rtl8712_led_c_ BIT(31) +#define _module_rtl8712_cmd_c_ BIT(26) +#define _module_fwcmd_c_ BIT(27) +#define _module_rtl8192c_xmit_c_ BIT(28) +#define _module_hal_xmit_c_ BIT(28) +#define _module_efuse_ BIT(29) +#define _module_rtl8712_recv_c_ BIT(30) +#define _module_rtl8712_led_c_ BIT(31) #undef _MODULE_DEFINE_ @@ -181,7 +181,7 @@ extern void rtl871x_cedbg(const char *fmt, ...); #define _dbgdump printk #elif defined PLATFORM_ECOS #define _dbgdump diag_printf -#elif defined PLATFORM_FREERTOS +#elif defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) #define _dbgdump printf("\n\r"); printf #elif defined PLATFORM_FREEBSD #define _dbgdump printf @@ -194,7 +194,7 @@ extern void rtl871x_cedbg(const char *fmt, ...); #define DEBUG_LEVEL (_drv_err_) #if defined (_dbgdump) #undef DBG_871X_LEVEL -#if defined (__ICCARM__) || defined (__CC_ARM) || defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B) +#if defined (__ICCARM__) || defined (__CC_ARM) ||defined(__GNUC__)|| defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B) #define DBG_871X_LEVEL(level, ...) \ do {\ _dbgdump(DRIVER_PREFIX __VA_ARGS__);\ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_eeprom.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_eeprom.h new file mode 100644 index 0000000..9891783 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_eeprom.h @@ -0,0 +1,158 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_EEPROM_H__ +#define __RTW_EEPROM_H__ + +#define RTL8712_EEPROM_ID 0x8712 +//#define EEPROM_MAX_SIZE 256 + +#define HWSET_MAX_SIZE_512 512 +#define EEPROM_MAX_SIZE HWSET_MAX_SIZE_512 + +#define CLOCK_RATE 50 //100us + +//- EEPROM opcodes +#define EEPROM_READ_OPCODE 06 +#define EEPROM_WRITE_OPCODE 05 +#define EEPROM_ERASE_OPCODE 07 +#define EEPROM_EWEN_OPCODE 19 // Erase/write enable +#define EEPROM_EWDS_OPCODE 16 // Erase/write disable + +//Country codes +#define USA 0x555320 +#define EUROPE 0x1 //temp, should be provided later +#define JAPAN 0x2 //temp, should be provided later + +#define EEPROM_CID_DEFAULT 0x0 +#define EEPROM_CID_ALPHA 0x1 +#define EEPROM_CID_Senao 0x3 +#define EEPROM_CID_NetCore 0x5 +#define EEPROM_CID_CAMEO 0X8 +#define EEPROM_CID_SITECOM 0x9 +#define EEPROM_CID_COREGA 0xB +#define EEPROM_CID_EDIMAX_BELKIN 0xC +#define EEPROM_CID_SERCOMM_BELKIN 0xE +#define EEPROM_CID_CAMEO1 0xF +#define EEPROM_CID_WNC_COREGA 0x12 +#define EEPROM_CID_CLEVO 0x13 +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + +// +// Customer ID, note that: +// This variable is initiailzed through EEPROM or registry, +// however, its definition may be different with that in EEPROM for +// EEPROM size consideration. So, we have to perform proper translation between them. +// Besides, CustomerID of registry has precedence of that of EEPROM. +// defined below. 060703, by rcnjko. +// +typedef enum _RT_CUSTOMER_ID +{ + RT_CID_DEFAULT = 0, + RT_CID_8187_ALPHA0 = 1, + RT_CID_8187_SERCOMM_PS = 2, + RT_CID_8187_HW_LED = 3, + RT_CID_8187_NETGEAR = 4, + RT_CID_WHQL = 5, + RT_CID_819x_CAMEO = 6, + RT_CID_819x_RUNTOP = 7, + RT_CID_819x_Senao = 8, + RT_CID_TOSHIBA = 9, // Merge by Jacken, 2008/01/31. + RT_CID_819x_Netcore = 10, + RT_CID_Nettronix = 11, + RT_CID_DLINK = 12, + RT_CID_PRONET = 13, + RT_CID_COREGA = 14, + RT_CID_CHINA_MOBILE = 15, + RT_CID_819x_ALPHA = 16, + RT_CID_819x_Sitecom = 17, + RT_CID_CCX = 18, // It's set under CCX logo test and isn't demanded for CCX functions, but for test behavior like retry limit and tx report. By Bruce, 2009-02-17. + RT_CID_819x_Lenovo = 19, + RT_CID_819x_QMI = 20, + RT_CID_819x_Edimax_Belkin = 21, + RT_CID_819x_Sercomm_Belkin = 22, + RT_CID_819x_CAMEO1 = 23, + RT_CID_819x_MSI = 24, + RT_CID_819x_Acer = 25, + RT_CID_819x_AzWave_ASUS = 26, + RT_CID_819x_AzWave = 27, // For AzWave in PCIe, The ID is AzWave use and not only Asus + RT_CID_819x_HP = 28, + RT_CID_819x_WNC_COREGA = 29, + RT_CID_819x_Arcadyan_Belkin = 30, + RT_CID_819x_SAMSUNG = 31, + RT_CID_819x_CLEVO = 32, + RT_CID_819x_DELL = 33, + RT_CID_819x_PRONETS = 34, + RT_CID_819x_Edimax_ASUS = 35, + RT_CID_819x_CAMEO_NETGEAR = 36, + RT_CID_PLANEX = 37, + RT_CID_CC_C = 38, + RT_CID_819x_Xavi = 39, + RT_CID_819x_FUNAI_TV = 40, + RT_CID_819x_ALPHA_WD=41, +}RT_CUSTOMER_ID, *PRT_CUSTOMER_ID; + +struct eeprom_priv +{ + u8 bautoload_fail_flag; + //u8 bempty; + //u8 sys_config; + u8 mac_addr[6]; //PermanentAddress + //u8 config0; +// u16 channel_plan; + u16 CustomerID; + //u8 country_string[3]; + //u8 tx_power_b[15]; + //u8 tx_power_g[15]; + //u8 tx_power_a[201]; + + u8 EepromOrEfuse; +#ifdef CONFIG_MEMORY_ACCESS_ALIGNED + u8 rsvd; //For byte aligned. By Fangyuan, 141201 +#endif + u8 efuse_eeprom_data[HWSET_MAX_SIZE_512]; //92C:256bytes, 88E:512bytes, we use union set (512bytes) + +#ifdef CONFIG_RF_GAIN_OFFSET + u8 EEPROMRFGainOffset; + u8 EEPROMRFGainVal; +#endif //CONFIG_RF_GAIN_OFFSET +}; + +//TODO +#if 0 + +extern void eeprom_write16(_adapter *padapter, u16 reg, u16 data); +extern u16 eeprom_read16(_adapter *padapter, u16 reg); +extern void read_eeprom_content(_adapter *padapter); +extern void eeprom_read_sz(_adapter * padapter, u16 reg,u8* data, u32 sz); + +extern void read_eeprom_content_by_attrib(_adapter * padapter ); + +#ifdef PLATFORM_LINUX +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE +extern int isAdaptorInfoFileValid(void); +extern int storeAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv); +extern int retriveAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv); +#endif //CONFIG_ADAPTOR_INFO_CACHING_FILE +#endif //PLATFORM_LINUX + +#endif //#if 0 + +#endif //__RTL871X_EEPROM_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_efuse.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_efuse.h new file mode 100644 index 0000000..d08f088 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_efuse.h @@ -0,0 +1,163 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_EFUSE_H__ +#define __RTW_EFUSE_H__ + +#if (RTL8195A_SUPPORT == 1) +#include "rtl8195a.h" +#endif +#if (RTL8711B_SUPPORT == 1) +#include "ameba_soc.h" +#endif +/*--------------------------Define efuse Parameters-------------------------*/ +#define EFUSE_ERROE_HANDLE 1 + +#define PG_STATE_HEADER 0x01 +#define PG_STATE_WORD_0 0x02 +#define PG_STATE_WORD_1 0x04 +#define PG_STATE_WORD_2 0x08 +#define PG_STATE_WORD_3 0x10 +#define PG_STATE_DATA 0x20 + +#define PG_SWBYTE_H 0x01 +#define PG_SWBYTE_L 0x02 + +#define PGPKT_DATA_SIZE 8 + +#define EFUSE_WIFI 0 +#define EFUSE_BT 1 + +enum _EFUSE_DEF_TYPE { + TYPE_EFUSE_MAX_SECTION = 0, + TYPE_EFUSE_REAL_CONTENT_LEN = 1, + TYPE_AVAILABLE_EFUSE_BYTES_BANK = 2, + TYPE_AVAILABLE_EFUSE_BYTES_TOTAL = 3, + TYPE_EFUSE_MAP_LEN = 4, + TYPE_EFUSE_PROTECT_BYTES_BANK = 5, + TYPE_EFUSE_CONTENT_LEN_BANK = 6, +}; + +#define EFUSE_MAP_SIZE 512 +#define EFUSE_MAX_SIZE 256 + +#define EFUSE_MAX_MAP_LEN 512 +#define EFUSE_MAX_HW_SIZE 256 +#define EFUSE_MAX_SECTION_BASE 16 + +#define EXT_HEADER(header) ((header & 0x1F ) == 0x0F) +#define ALL_WORDS_DISABLED(wde) ((wde & 0x0F) == 0x0F) +#define GET_HDR_OFFSET_2_0(header) ( (header & 0xE0) >> 5) + +#define EFUSE_REPEAT_THRESHOLD_ 3 +#define EFUSE_MAX_WORD_UNIT 4 + +//============================================= +// The following is for BT Efuse definition +//============================================= +#define EFUSE_BT_MAX_MAP_LEN 1024 +#define EFUSE_MAX_BANK 4 +#define EFUSE_MAX_BT_BANK (EFUSE_MAX_BANK-1) +//============================================= + +/*--------------------------Define flash Parameters-------------------------*/ +#if CONFIG_ADAPTOR_INFO_CACHING_FLASH +#if defined CONFIG_RTL8195A || defined(CONFIG_RTL8711B) + #define FLASH_MAX_SIZE FLASH_CAL_DATA_SIZE + #define FLASH_MAGIC_NUMBER 0x8195 // magic number + #define FLASH_HEADER_SIZE 4 // 2: address, 2: length +#endif +#endif // CONFIG_ADAPTOR_INFO_CACHING_FLASH +/*------------------------------Define structure----------------------------*/ +typedef struct PG_PKT_STRUCT_A{ + u8 offset; + u8 word_en; + u8 data[8]; + u8 word_cnts; +}PGPKT_STRUCT,*PPGPKT_STRUCT; + +#ifdef HAL_EFUSE_MEMORY +typedef struct _EFUSE_HAL{ + u8 fakeEfuseBank; + u32 fakeEfuseUsedBytes; + u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE]; + u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN]; + u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]; + + u16 BTEfuseUsedBytes; + u8 BTEfuseUsedPercentage; + u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; + u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]; + u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]; + + u16 fakeBTEfuseUsedBytes; + u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; + u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]; + u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]; +}EFUSE_HAL, *PEFUSE_HAL; +#endif // HAL_EFUSE_MEMORY + +/*------------------------Export global variable----------------------------*/ +#if CONFIG_FAKE_EFUSE +extern u8 fakeEfuseBank; +extern u32 fakeEfuseUsedBytes; +extern u8 fakeEfuseContent[]; +extern u8 fakeEfuseInitMap[]; +extern u8 fakeEfuseModifiedMap[]; +#endif + +#ifdef CONFIG_BT_COEXIST +extern u32 BTEfuseUsedBytes; +extern u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; +extern u8 BTEfuseInitMap[]; +extern u8 BTEfuseModifiedMap[]; +#if CONFIG_FAKE_EFUSE +extern u32 fakeBTEfuseUsedBytes; +extern u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; +extern u8 fakeBTEfuseInitMap[]; +extern u8 fakeBTEfuseModifiedMap[]; +#endif +#endif + +/*------------------------Export global variable----------------------------*/ + +u8 efuse_GetCurrentSize(_adapter * padapter, u16 *size); +u8 rtw_efuse_access(_adapter * padapter, u8 bRead, u16 start_addr, u16 cnts, u8 *data); +u8 rtw_efuse_map_read(_adapter * padapter, u16 addr, u16 cnts, u8 *data); +u8 rtw_efuse_map_write(_adapter * padapter, u16 addr, u16 cnts, u8 *data); +u8 rtw_BT_efuse_map_read(_adapter * padapter, u16 addr, u16 cnts, u8 *data); +u8 rtw_BT_efuse_map_write(_adapter * padapter, u16 addr, u16 cnts, u8 *data); + +u16 Efuse_GetCurrentSize(_adapter * pAdapter, u8 efuseType, BOOLEAN bPseudoTest); +u8 Efuse_CalculateWordCnts(u8 word_en); +void EFUSE_GetEfuseDefinition(_adapter * pAdapter, u8 efuseType, u8 type, void *pOut, BOOLEAN bPseudoTest); +u8 efuse_OneByteRead(_adapter * pAdapter, u16 addr, u8 *data, BOOLEAN bPseudoTest); +u8 efuse_OneByteWrite(_adapter * pAdapter, u16 addr, u8 data, BOOLEAN bPseudoTest); + +void Efuse_PowerSwitch(_adapter * pAdapter,u8 bWrite,u8 PwrState); +//int Efuse_PgPacketRead(_adapter * pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest); +int Efuse_PgPacketWrite(_adapter * pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest); +void efuse_WordEnableDataRead(u8 word_en, u8 *sourdata, u8 *targetdata); +u8 Efuse_WordEnableDataWrite(_adapter * pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest); + +void EFUSE_ShadowMapUpdate(_adapter * pAdapter, u8 efuseType, BOOLEAN bPseudoTest); +void EFUSE_ShadowRead(_adapter * pAdapter, u8 Type, u16 Offset, u32 *Value); + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_event.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_event.h new file mode 100644 index 0000000..83b29b9 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_event.h @@ -0,0 +1,151 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTW_EVENT_H_ +#define _RTW_EVENT_H_ + +#ifndef CONFIG_RTL8711FW +#ifdef PLATFORM_LINUX +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) +#include +#else +#include +#endif +#include +#endif +#endif//CONFIG_RTL8711FW + + + +#ifdef CONFIG_H2CLBK +#include +#endif + +/* +Used to report a bss has been scanned + +*/ +struct survey_event { + WLAN_BSSID_EX bss; +}; + +/* +Used to report that the requested site survey has been done. + +bss_cnt indicates the number of bss that has been reported. + + +*/ +struct surveydone_event { + unsigned int bss_cnt; + +}; + +/* +Used to report the link result of joinning the given bss + + +join_res: +-1: authentication fail +-2: association fail +> 0: TID + +*/ +struct joinbss_event { + //struct wlan_network network; + int join_res; +}; + +/* +Used to report a given STA has joinned the created BSS. +It is used in AP/Ad-HoC(M) mode. + + +*/ +struct stassoc_event { + unsigned char macaddr[6]; + unsigned char rsvd[2]; + int cam_id; + +}; + +struct stadel_event { + unsigned char macaddr[6]; + unsigned char rsvd[2]; //for reason + int mac_id; +}; + +struct addba_event +{ + unsigned int tid; +}; + + +#ifdef CONFIG_H2CLBK +struct c2hlbk_event{ + unsigned char mac[6]; + unsigned short s0; + unsigned short s1; + unsigned int w0; + unsigned char b0; + unsigned short s2; + unsigned char b1; + unsigned int w1; +}; +#endif//CONFIG_H2CLBK + +#define GEN_EVT_CODE(event) event ## _EVT_ + +struct fwevent { + u32 parmsize; + void (*event_callback)(_adapter *dev, u8 *pbuf); +}; + +//TODO +#if 0 + +#define C2HEVENT_SZ 32 + +struct event_node{ + unsigned char *node; + unsigned char evt_code; + unsigned short evt_sz; + volatile int *caller_ff_tail; + int caller_ff_sz; +}; + +struct c2hevent_queue { + volatile int head; + volatile int tail; + struct event_node nodes[C2HEVENT_SZ]; + unsigned char seq; +}; + +#define NETWORK_QUEUE_SZ 4 + +struct network_queue { + volatile int head; + volatile int tail; + WLAN_BSSID_EX networks[NETWORK_QUEUE_SZ]; +}; + +#endif //#if 0 + +#endif // _WLANEVENT_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ht.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ht.h new file mode 100644 index 0000000..5910986 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ht.h @@ -0,0 +1,66 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTW_HT_H_ +#define _RTW_HT_H_ + +#include "wifi.h" + +struct ht_priv +{ + u32 ht_option; + u32 ampdu_enable;//for enable Tx A-MPDU + //u8 baddbareq_issued[16]; + //u32 tx_amsdu_enable;//for enable Tx A-MSDU + //u32 tx_amdsu_maxlen; // 1: 8k, 0:4k ; default:8k, for tx + //u32 rx_ampdu_maxlen; //for rx reordering ctrl win_sz, updated when join_callback. + + u8 bwmode;// + u8 ch_offset;//PRIME_CHNL_OFFSET + u8 sgi;//short GI + + //for processing Tx A-MPDU + u8 agg_enable_bitmap; + //u8 ADDBA_retry_count; + u8 candidate_tid_bitmap; + + u8 stbc_cap; + + struct rtw_ieee80211_ht_cap ht_cap; + +}; + +#define STBC_HT_ENABLE_RX BIT0 +#define STBC_HT_ENABLE_TX BIT1 +#define STBC_HT_TEST_TX_ENABLE BIT2 +#define STBC_HT_CAP_TX BIT3 + +typedef enum AGGRE_SIZE{ + HT_AGG_SIZE_8K = 0, + HT_AGG_SIZE_16K = 1, + HT_AGG_SIZE_32K = 2, + HT_AGG_SIZE_64K = 3, + VHT_AGG_SIZE_128K = 4, + VHT_AGG_SIZE_256K = 5, + VHT_AGG_SIZE_512K = 6, + VHT_AGG_SIZE_1024K = 7, +}AGGRE_SIZE_E, *PAGGRE_SIZE_E; + +#endif //_RTL871X_HT_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_intfs.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_intfs.h new file mode 100644 index 0000000..1a8594e --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_intfs.h @@ -0,0 +1,39 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTW_INTFS_H_ +#define _RTW_INTFS_H_ + +extern u8 rtw_init_default_value(_adapter *padapter); +#ifdef CONFIG_WOWLAN +void rtw_cancel_dynamic_chk_timer(_adapter *padapter); +#endif +extern void rtw_cancel_all_timer(_adapter *padapter); + +extern u8 rtw_init_drv_sw(_adapter *padapter); +extern u8 rtw_free_drv_sw(_adapter *padapter); +extern u8 rtw_reset_drv_sw(_adapter *padapter); + +extern int rtw_drv_init(ADAPTER *padapter); +extern void rtw_drv_deinit(ADAPTER *Adapter); + +extern u32 rtw_start_drv_threads(_adapter *padapter); +extern void rtw_stop_drv_threads (_adapter *padapter); + +#endif //_RTW_INTFS_H_ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_io.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_io.h new file mode 100644 index 0000000..2801cce --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_io.h @@ -0,0 +1,140 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef _RTW_IO_H_ +#define _RTW_IO_H_ + +//IO Bus domain address mapping +#define DEFUALT_OFFSET 0x0 +#define WLAN_LOCAL_OFFSET 0x10250000 +#define WLAN_IOREG_OFFSET 0x10260000 +#define FW_FIFO_OFFSET 0x10270000 +#define TX_HIQ_OFFSET 0x10310000 +#define TX_MIQ_OFFSET 0x1032000 +#define TX_LOQ_OFFSET 0x10330000 +#define RX_RXOFF_OFFSET 0x10340000 + +struct fifo_more_data { + u32 more_data; + u32 len; +}; + +struct dvobj_priv; + +typedef struct _io_ops { + int (*init_io_priv)(struct dvobj_priv *pdvobj); + int (*write8_endian)(struct dvobj_priv *pdvobj, u32 addr, u32 buf, u32 big); + + u8 (*_read8)(struct dvobj_priv *pdvobj, u32 addr, s32 *err); + u16 (*_read16)(struct dvobj_priv *pdvobj, u32 addr, s32 *err); + u32 (*_read32)(struct dvobj_priv *pdvobj, u32 addr, s32 *err); + + s32 (*_write8)(struct dvobj_priv *pdvobj, u32 addr, u8 buf, s32 *err); + s32 (*_write16)(struct dvobj_priv *pdvobj, u32 addr,u16 buf, s32 *err); + s32 (*_write32)(struct dvobj_priv *pdvobj, u32 addr, u32 buf, s32 *err); + + int (*read_rx_fifo)(struct dvobj_priv *pdvobj, u32 addr, u8 *buf, u32 len, struct fifo_more_data *more_data); + int (*write_tx_fifo)(struct dvobj_priv *pdvobj, u32 addr, u8 *buf, u32 len); +} IO_OPS_T; + +struct bus_transfer { + void *tx_buf; + void *rx_buf; + unsigned int len; +}; + +typedef struct _bus_drv_ops { + int (*bus_drv_init)(ADAPTER *Adapter); + int (*bus_send_msg)(PADAPTER Adapter, struct bus_transfer xfers[], u32 RegAction); +} BUS_DRV_OPS_T; + +/* +struct intf_hdl { + + u32 intf_option; + u32 bus_status; + u32 do_flush; + u8 *adapter; + u8 *intf_dev; + struct intf_priv *pintfpriv; + u8 cnt; + void (*intf_hdl_init)(u8 *priv); + void (*intf_hdl_unload)(u8 *priv); + void (*intf_hdl_open)(u8 *priv); + void (*intf_hdl_close)(u8 *priv); + struct _io_ops io_ops; + //u8 intf_status;//moved to struct intf_priv + u16 len; + u16 done_len; + + _adapter *padapter; + struct dvobj_priv *pintf_dev;// pointer to &(padapter->dvobjpriv); + + struct _io_ops io_ops; + +}; +*/ + +struct io_priv{ + struct _io_ops io_ops; +}; + + +extern u8 rtw_read8(ADAPTER *adapter, u32 addr); +extern u16 rtw_read16(ADAPTER *adapter, u32 addr); +extern u32 rtw_read32(ADAPTER *adapter, u32 addr); +extern s32 rtw_write8(ADAPTER *adapter, u32 addr, u8 val); +extern s32 rtw_write16(ADAPTER *adapter, u32 addr, u16 val); +extern s32 rtw_write32(ADAPTER *adapter, u32 addr, u32 val); + +#define PlatformEFIOWrite1Byte(_a,_b,_c) \ + rtw_write8(_a,_b,_c) +#define PlatformEFIOWrite2Byte(_a,_b,_c) \ + rtw_write16(_a,_b,_c) +#define PlatformEFIOWrite4Byte(_a,_b,_c) \ + rtw_write32(_a,_b,_c) + +#define PlatformEFIORead1Byte(_a,_b) \ + rtw_read8(_a,_b) +#define PlatformEFIORead2Byte(_a,_b) \ + rtw_read16(_a,_b) +#define PlatformEFIORead4Byte(_a,_b) \ + rtw_read32(_a,_b) + +extern IO_OPS_T io_ops; + +extern u32 rtw_write_port( + ADAPTER *adapter, + u32 addr, + u32 cnt, + u8 *mem); +extern u32 rtw_read_port( + ADAPTER *adapter, + u32 addr, + u32 cnt, + u8 *mem, + struct fifo_more_data *more_data); +extern void rtw_set_chip_endian(PADAPTER padapter); +extern int rtw_get_chip_endian(PADAPTER padapter); + +int rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(struct _io_ops *pops)); + +#endif //_RTW_IO_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ioctl_set.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ioctl_set.h new file mode 100644 index 0000000..8e247e3 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_ioctl_set.h @@ -0,0 +1,75 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_IOCTL_SET_H_ +#define __RTW_IOCTL_SET_H_ + + +#ifdef PLATFORM_OS_XP +typedef struct _NDIS_802_11_PMKID { + u32 Length; + u32 BSSIDInfoCount; + BSSIDInfo BSSIDInfo[1]; +} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID; +#endif + + +#ifdef PLATFORM_WINDOWS +typedef u8 NDIS_802_11_PMKID_VALUE[16]; + +typedef struct _BSSIDInfo { + NDIS_802_11_MAC_ADDRESS BSSID; + NDIS_802_11_PMKID_VALUE PMKID; +} BSSIDInfo, *PBSSIDInfo; + +u8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults); +u8 rtw_set_802_11_test(_adapter * padapter, NDIS_802_11_TEST * test); +u8 rtw_set_802_11_pmkid(_adapter *pdapter, NDIS_802_11_PMKID *pmkid); + +u8 rtw_pnp_set_power_sleep(_adapter* padapter); +u8 rtw_pnp_set_power_wakeup(_adapter* padapter); + +void rtw_pnp_resume_wk(void *context); +void rtw_pnp_sleep_wk(void * context); + +#endif + +u8 rtw_set_802_11_add_key(_adapter * padapter, NDIS_802_11_KEY * key); +u8 rtw_set_802_11_authentication_mode(_adapter *pdapter, NDIS_802_11_AUTHENTICATION_MODE authmode); +u8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid); +u8 rtw_set_802_11_add_wep(_adapter * padapter, NDIS_802_11_WEP * wep); +u8 rtw_set_802_11_disassociate(_adapter * padapter); +u8 rtw_set_802_11_bssid_list_scan(_adapter* padapter, NDIS_802_11_SSID *pssid, int ssid_max_num); +u8 rtw_set_802_11_infrastructure_mode(_adapter * padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); +u8 rtw_set_802_11_remove_wep(_adapter * padapter, u32 keyindex); +u8 rtw_set_802_11_ssid(_adapter * padapter, NDIS_802_11_SSID * ssid); +u8 rtw_set_802_11_connect(_adapter* padapter, u8 *bssid, NDIS_802_11_SSID *ssid); +u8 rtw_set_802_11_remove_key(_adapter * padapter, NDIS_802_11_REMOVE_KEY * key); + +u8 rtw_validate_bssid(u8 *bssid); +u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid); + +u16 rtw_get_cur_max_rate(_adapter *adapter); +//int rtw_set_scan_mode(_adapter *adapter, RT_SCAN_TYPE scan_mode); +int rtw_set_channel_plan(_adapter *adapter, u8 channel_plan); +int rtw_set_country(_adapter *adapter, const char *country_code); +//int rtw_set_band(_adapter *adapter, enum _BAND band); + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_led.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_led.h new file mode 100644 index 0000000..e6b6d8a --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_led.h @@ -0,0 +1,250 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_LED_H_ +#define __RTW_LED_H_ + +//TODO +#if 0 + +//#include + +#define MSECS(t) (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000) + +#define LED_BLINK_NORMAL_INTERVAL 100 +#define LED_BLINK_SLOWLY_INTERVAL 200 +#define LED_BLINK_LONG_INTERVAL 400 + +#define LED_BLINK_NO_LINK_INTERVAL_ALPHA 1000 +#define LED_BLINK_LINK_INTERVAL_ALPHA 500 //500 +#define LED_BLINK_SCAN_INTERVAL_ALPHA 180 //150 +#define LED_BLINK_FASTER_INTERVAL_ALPHA 50 +#define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA 5000 + +#define LED_BLINK_NORMAL_INTERVAL_NETTRONIX 100 +#define LED_BLINK_SLOWLY_INTERVAL_NETTRONIX 2000 + +#define LED_BLINK_SLOWLY_INTERVAL_PORNET 1000 +#define LED_BLINK_NORMAL_INTERVAL_PORNET 100 + +#define LED_BLINK_FAST_INTERVAL_BITLAND 30 + +// 060403, rcnjko: Customized for AzWave. +#define LED_CM2_BLINK_ON_INTERVAL 250 +#define LED_CM2_BLINK_OFF_INTERVAL 4750 + +#define LED_CM8_BLINK_INTERVAL 500 //for QMI +#define LED_CM8_BLINK_OFF_INTERVAL 3750 //for QMI + +// 080124, lanhsin: Customized for RunTop +#define LED_RunTop_BLINK_INTERVAL 300 + +// 060421, rcnjko: Customized for Sercomm Printer Server case. +#define LED_CM3_BLINK_INTERVAL 1500 + +#endif //#if 0 + +typedef enum _LED_CTL_MODE{ + LED_CTL_POWER_ON = 1, + LED_CTL_LINK = 2, + LED_CTL_NO_LINK = 3, + LED_CTL_TX = 4, + LED_CTL_RX = 5, + LED_CTL_SITE_SURVEY = 6, + LED_CTL_POWER_OFF = 7, + LED_CTL_START_TO_LINK = 8, + LED_CTL_START_WPS = 9, + LED_CTL_STOP_WPS = 10, + LED_CTL_START_WPS_BOTTON = 11, //added for runtop + LED_CTL_STOP_WPS_FAIL = 12, //added for ALPHA + LED_CTL_STOP_WPS_FAIL_OVERLAP = 13, //added for BELKIN + LED_CTL_CONNECTION_NO_TRANSFER = 14, +}LED_CTL_MODE; + +//TODO +#if 0 + +typedef enum _LED_STATE_871x{ + LED_UNKNOWN = 0, + RTW_LED_ON = 1, + RTW_LED_OFF = 2, + LED_BLINK_NORMAL = 3, + LED_BLINK_SLOWLY = 4, + LED_BLINK_POWER_ON = 5, + LED_BLINK_SCAN = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning. + LED_BLINK_NO_LINK = 7, // LED is blinking during no link state. + LED_BLINK_StartToBlink = 8,// Customzied for Sercomm Printer Server case + LED_BLINK_TXRX = 9, + LED_BLINK_WPS = 10, // LED is blinkg during WPS communication + LED_BLINK_WPS_STOP = 11, //for ALPHA + LED_BLINK_WPS_STOP_OVERLAP = 12, //for BELKIN + LED_BLINK_RUNTOP = 13, // Customized for RunTop + LED_BLINK_CAMEO = 14, + LED_BLINK_XAVI = 15, + LED_BLINK_ALWAYS_ON = 16, +}LED_STATE_871x; + +typedef enum _LED_PIN_871x{ + LED_PIN_NULL = 0, + LED_PIN_LED0 = 1, + LED_PIN_LED1 = 2, + LED_PIN_LED2 = 3, + LED_PIN_GPIO0 = 4, +}LED_PIN_871x; + +typedef struct _LED_871x{ + _adapter *padapter; + + LED_PIN_871x LedPin; // Identify how to implement this SW led. + LED_STATE_871x CurrLedState; // Current LED state. + LED_STATE_871x BlinkingLedState; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. + + u8 bLedOn; // true if LED is ON, false if LED is OFF. + + u8 bLedBlinkInProgress; // true if it is blinking, false o.w.. + + u8 bLedWPSBlinkInProgress; + + u32 BlinkTimes; // Number of times to toggle led state for blinking. + + _timer BlinkTimer; // Timer object for led blinking. + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + u8 bSWLedCtrl; + + // ALPHA, added by chiyoko, 20090106 + u8 bLedNoLinkBlinkInProgress; + u8 bLedLinkBlinkInProgress; + u8 bLedStartToLinkBlinkInProgress; + u8 bLedScanBlinkInProgress; + + #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)|| defined PLATFORM_FREEBSD + _workitem BlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED. + #endif +#endif //defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) + u8 bLedSlowBlinkInProgress;//added by vivi, for led new mode +#endif + +} LED_871x, *PLED_871x; + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + +#define IS_LED_WPS_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS \ + || ((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS_STOP \ + || ((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress) + +#define IS_LED_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress \ + ||((PLED_871x)_LED_871x)->bLedScanBlinkInProgress) + +//================================================================================ +// LED customization. +//================================================================================ + +typedef enum _LED_STRATEGY_871x{ + SW_LED_MODE0 = 0, // SW control 1 LED via GPIO0. It is default option. + SW_LED_MODE1= 1, // 2 LEDs, through LED0 and LED1. For ALPHA. + SW_LED_MODE2 = 2, // SW control 1 LED via GPIO0, customized for AzWave 8187 minicard. + SW_LED_MODE3 = 3, // SW control 1 LED via GPIO0, customized for Sercomm Printer Server case. + SW_LED_MODE4 = 4, //for Edimax / Belkin + SW_LED_MODE5 = 5, //for Sercomm / Belkin + SW_LED_MODE6 = 6, //for 88CU minicard, porting from ce SW_LED_MODE7 + HW_LED = 50, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes, see MAC.CONFIG1 for details.) + LED_ST_NONE = 99, +}LED_STRATEGY_871x, *PLED_STRATEGY_871x; + +void +LedControl871x( + _adapter *padapter, + LED_CTL_MODE LedAction + ); +#endif //defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) +//================================================================================ +// LED customization. +//================================================================================ + +typedef enum _LED_STRATEGY_871x{ + SW_LED_MODE0 = 0, // SW control 1 LED via GPIO0. It is default option. + SW_LED_MODE1 = 1, // SW control for PCI Express + SW_LED_MODE2 = 2, // SW control for Cameo. + SW_LED_MODE3 = 3, // SW contorl for RunTop. + SW_LED_MODE4 = 4, // SW control for Netcore + SW_LED_MODE5 = 5, //added by vivi, for led new mode, DLINK + SW_LED_MODE6 = 6, //added by vivi, for led new mode, PRONET + SW_LED_MODE7 = 7, //added by chiyokolin, for Lenovo, PCI Express Minicard Spec Rev.1.2 spec + SW_LED_MODE8 = 8, //added by chiyokolin, for QMI + SW_LED_MODE9 = 9, //added by chiyokolin, for BITLAND, PCI Express Minicard Spec Rev.1.1 + SW_LED_MODE10 = 10, //added by chiyokolin, for Edimax-ASUS + HW_LED = 50, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes) + LED_ST_NONE = 99, +}LED_STRATEGY_871x, *PLED_STRATEGY_871x; +#endif //defined(CONFIG_PCI_HCI) + +struct led_priv{ + /* add for led controll */ + LED_871x SwLed0; + LED_871x SwLed1; + LED_STRATEGY_871x LedStrategy; + u8 bRegUseLed; + void (*LedControlHandler)(_adapter *padapter, LED_CTL_MODE LedAction); + /* add for led controll */ +}; + +#endif //#if 0 + +#ifdef CONFIG_SW_LED +#define rtw_led_control(adapter, LedAction) \ + do { \ + if((adapter)->ledpriv.LedControlHandler) \ + (adapter)->ledpriv.LedControlHandler((adapter), (LedAction)); \ + } while(0) +#else //CONFIG_SW_LED +#define rtw_led_control(adapter, LedAction) +#endif //CONFIG_SW_LED + +//TODO +#if 0 + +void BlinkTimerCallback(void *data); +void BlinkWorkItemCallback(struct work_struct *work); + +void ResetLedStatus(PLED_871x pLed); + +void +InitLed871x( + _adapter *padapter, + PLED_871x pLed, + LED_PIN_871x LedPin + ); + +void +DeInitLed871x( + PLED_871x pLed + ); + +//hal... +extern void BlinkHandler(PLED_871x pLed); + +#endif //#if 0 + +#endif //__RTW_LED_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mlme.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mlme.h new file mode 100644 index 0000000..f80fc61 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mlme.h @@ -0,0 +1,795 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_MLME_H_ +#define __RTW_MLME_H_ + +#ifdef CONFIG_INTEL_WIDI +#include +#endif + +#if defined(PLATFORM_ECOS) +#define MAX_BSS_CNT 10 //alloc less wlan_network due to memory limitation - Alex Fang +#elif defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) +#define MAX_BSS_CNT 1 //alloc less wlan_network due to memory limitation - Alex Fang +#else +#define MAX_BSS_CNT 128 +#endif +//#define MAX_JOIN_TIMEOUT 2000 +//#define MAX_JOIN_TIMEOUT 2500 +#define MAX_JOIN_TIMEOUT 6500 + +#ifdef CONFIG_MULTICAST +#define MULTICAST_LIST_SIZE 4 +#endif + +// Commented by Albert 20101105 +// Increase the scanning timeout because of increasing the SURVEY_TO value. + +#define SCANNING_TIMEOUT 8000 + +#define SCAN_INTERVAL (30) // unit:2sec, 30*2=60sec + +#ifdef PALTFORM_OS_WINCE +#define SCANQUEUE_LIFETIME 12000000 // unit:us +#else +#define SCANQUEUE_LIFETIME 20 // unit:sec +#endif + +#define WIFI_NULL_STATE 0x00000000 +#define WIFI_ASOC_STATE 0x00000001 // Under Linked state... +#define WIFI_REASOC_STATE 0x00000002 +#define WIFI_SLEEP_STATE 0x00000004 +#define WIFI_STATION_STATE 0x00000008 +#define WIFI_AP_STATE 0x00000010 +#define WIFI_ADHOC_STATE 0x00000020 +#define WIFI_ADHOC_MASTER_STATE 0x00000040 +#define WIFI_UNDER_LINKING 0x00000080 +//#define WIFI_UNDER_CMD 0x00000200 +// ========== P2P Section Start =============== +#define WIFI_P2P_LISTEN_STATE 0x00010000 +#define WIFI_P2P_GROUP_FORMATION_STATE 0x00020000 +// ========== P2P Section End =============== +#define WIFI_UNDER_WPS 0x00000100 +#define WIFI_SITE_MONITOR 0x00000800 //to indicate the station is under site surveying + +#ifdef WDS +#define WIFI_WDS 0x00001000 +#define WIFI_WDS_RX_BEACON 0x00002000 // already rx WDS AP beacon +#endif +#ifdef AUTO_CONFIG +#define WIFI_AUTOCONF 0x00004000 +#define WIFI_AUTOCONF_IND 0x00008000 +#endif + +//#ifdef UNDER_MPTEST +#define WIFI_MP_STATE 0x00010000 +#define WIFI_MP_CTX_BACKGROUND 0x00020000 // in continous tx background +#define WIFI_MP_CTX_ST 0x00040000 // in continous tx with single-tone +#define WIFI_MP_CTX_BACKGROUND_PENDING 0x00080000 // pending in continous tx background due to out of skb +#define WIFI_MP_CTX_CCK_HW 0x00100000 // in continous tx +#define WIFI_MP_CTX_CCK_CS 0x00200000 // in continous tx with carrier suppression +#define WIFI_MP_LPBK_STATE 0x00400000 +//#endif + +//#define _FW_UNDER_CMD WIFI_UNDER_CMD +#define _FW_UNDER_LINKING WIFI_UNDER_LINKING +#define _FW_LINKED WIFI_ASOC_STATE +#define _FW_UNDER_SURVEY WIFI_SITE_MONITOR + +enum dot11AuthAlgrthmNum { + dot11AuthAlgrthm_Open = 0, + dot11AuthAlgrthm_Shared, + dot11AuthAlgrthm_8021X, + dot11AuthAlgrthm_Auto, + dot11AuthAlgrthm_WAPI, + dot11AuthAlgrthm_MaxNum +}; + +// Scan type including active and passive scan. +typedef enum _RT_SCAN_TYPE +{ + SCAN_PASSIVE, + SCAN_ACTIVE, + SCAN_MIX, +} RT_SCAN_TYPE, *PRT_SCAN_TYPE; + +/* + +there are several "locks" in mlme_priv, +since mlme_priv is a shared resource between many threads, +like ISR/Call-Back functions, the OID handlers, and even timer functions. + + +Each _queue has its own locks, already. +Other items are protected by mlme_priv.lock. + +To avoid possible dead lock, any thread trying to modifiying mlme_priv +SHALL not lock up more than one locks at a time! + +*/ + + +#define traffic_threshold 10 +#define traffic_scan_period 500 + +struct sitesurvey_ctrl { + u64 last_tx_pkts; + uint last_rx_pkts; + sint traffic_busy; + _timer sitesurvey_ctrl_timer; +}; + +typedef struct _RT_LINK_DETECT_T{ + u32 NumTxOkInPeriod; + u32 NumRxOkInPeriod; + u32 NumRxUnicastOkInPeriod; + BOOLEAN bBusyTraffic; + BOOLEAN bTxBusyTraffic; + BOOLEAN bRxBusyTraffic; + BOOLEAN bHigherBusyTraffic; // For interrupt migration purpose. + BOOLEAN bHigherBusyRxTraffic; // We may disable Tx interrupt according as Rx traffic. + BOOLEAN bHigherBusyTxTraffic; // We may disable Tx interrupt according as Tx traffic. +} RT_LINK_DETECT_T, *PRT_LINK_DETECT_T; + +//TODO +#if 0 + +struct profile_info { + u8 ssidlen; + u8 ssid[ WLAN_SSID_MAXLEN ]; + u8 peermac[ ETH_ALEN ]; +}; + +struct tx_invite_req_info{ + u8 token; + u8 benable; + u8 go_ssid[ WLAN_SSID_MAXLEN ]; + u8 ssidlen; + u8 go_bssid[ ETH_ALEN ]; + u8 peer_macaddr[ ETH_ALEN ]; + u8 operating_ch; // This information will be set by using the p2p_set op_ch=x + u8 peer_ch; // The listen channel for peer P2P device + +}; + +struct tx_invite_resp_info{ + u8 token; // Used to record the dialog token of p2p invitation request frame. +}; + +#ifdef CONFIG_WFD + +struct wifi_display_info{ + u16 wfd_enable; // Eanble/Disable the WFD function. + u16 rtsp_ctrlport; // TCP port number at which the this WFD device listens for RTSP messages + u16 peer_rtsp_ctrlport; // TCP port number at which the peer WFD device listens for RTSP messages + // This filed should be filled when receiving the gropu negotiation request + + u8 peer_session_avail; // WFD session is available or not for the peer wfd device. + // This variable will be set when sending the provisioning discovery request to peer WFD device. + // And this variable will be reset when it is read by using the iwpriv p2p_get wfd_sa command. + u8 ip_address[4]; + u8 peer_ip_address[4]; + u8 wfd_pc; // WFD preferred connection + // 0 -> Prefer to use the P2P for WFD connection on peer side. + // 1 -> Prefer to use the TDLS for WFD connection on peer side. + + u8 wfd_device_type; // WFD Device Type + // 0 -> WFD Source Device + // 1 -> WFD Primary Sink Device + +}; +#endif //CONFIG_WFD + +struct tx_provdisc_req_info{ + u16 wps_config_method_request; // Used when sending the provisioning request frame + u16 peer_channel_num[2]; // The channel number which the receiver stands. + NDIS_802_11_SSID ssid; + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address + u8 peerIFAddr[ ETH_ALEN ]; // Peer interface address + u8 benable; // This provision discovery request frame is trigger to send or not +}; + +struct rx_provdisc_req_info{ //When peer device issue prov_disc_req first, we should store the following informations + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address + u8 strconfig_method_desc_of_prov_disc_req[4]; // description for the config method located in the provisioning discovery request frame. + // The UI must know this information to know which config method the remote p2p device is requiring. +}; + +struct tx_nego_req_info{ + u16 peer_channel_num[2]; // The channel number which the receiver stands. + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address + u8 benable; // This negoitation request frame is trigger to send or not +}; + +struct group_id_info{ + u8 go_device_addr[ ETH_ALEN ]; // The GO's device address of this P2P group + u8 ssid[ WLAN_SSID_MAXLEN ]; // The SSID of this P2P group +}; + +#ifdef CONFIG_IOCTL_CFG80211 +struct cfg80211_wifidirect_info{ + _timer remain_on_ch_timer; + u8 restore_channel; + struct ieee80211_channel remain_on_ch_channel; + enum nl80211_channel_type remain_on_ch_type; + u64 remain_on_ch_cookie; + struct net_device *remain_on_ch_dev; + bool is_ro_ch; +}; +#endif //CONFIG_IOCTL_CFG80211 + +#endif + +struct wifidirect_info{ + enum P2P_ROLE role; + enum P2P_STATE p2p_state; + u8 baction_tx_pending; + u8 pending_peer[ETH_ALEN]; + struct xmit_frame *pending_action; + _timer pre_tx_scan_timer; + +#if 0 + _adapter* padapter; + _timer find_phase_timer; + _timer restore_p2p_state_timer; + + // Used to do the scanning. After confirming the peer is availalble, the driver transmits the P2P frame to peer. + _timer pre_tx_scan_timer; +#ifdef CONFIG_CONCURRENT_MODE + // Used to switch the channel between legacy AP and listen state. + _timer ap_p2p_switch_timer; +#endif + struct tx_provdisc_req_info tx_prov_disc_info; + struct rx_provdisc_req_info rx_prov_disc_info; + struct tx_invite_req_info invitereq_info; + struct profile_info profileinfo[ P2P_MAX_PERSISTENT_GROUP_NUM ]; // Store the profile information of persistent group + struct tx_invite_resp_info inviteresp_info; + struct tx_nego_req_info nego_req_info; + struct group_id_info groupid_info; // Store the group id information when doing the group negotiation handshake. +#ifdef CONFIG_WFD + struct wifi_display_info *wfd_info; +#endif + enum P2P_ROLE role; + enum P2P_STATE pre_p2p_state; + enum P2P_STATE p2p_state; + u8 device_addr[ETH_ALEN]; // The device address should be the mac address of this device. + u8 interface_addr[ETH_ALEN]; + u8 social_chan[4]; + u8 listen_channel; + u8 operating_channel; + u8 listen_dwell; // This value should be between 1 and 3 + u8 support_rate[8]; + u8 p2p_wildcard_ssid[P2P_WILDCARD_SSID_LEN]; + u8 intent; // should only include the intent value. + u8 p2p_peer_interface_addr[ ETH_ALEN ]; + u8 p2p_peer_device_addr[ ETH_ALEN ]; + u8 peer_intent; // Included the intent value and tie breaker value. + u8 device_name[ WPS_MAX_DEVICE_NAME_LEN ]; // Device name for displaying on searching device screen + u8 device_name_len; + u8 profileindex; // Used to point to the index of profileinfo array + u8 peer_operating_ch; + u8 find_phase_state_exchange_cnt; + u16 device_password_id_for_nego; // The device password ID for group negotation + u8 negotiation_dialog_token; + u8 nego_ssid[ WLAN_SSID_MAXLEN ]; // SSID information for group negotitation + u8 nego_ssidlen; + u8 p2p_group_ssid[WLAN_SSID_MAXLEN]; + u8 p2p_group_ssid_len; + u8 persistent_supported; // Flag to know the persistent function should be supported or not. + // In the Sigma test, the Sigma will provide this enable from the sta_set_p2p CAPI. + // 0: disable + // 1: enable + u8 session_available; // Flag to set the WFD session available to enable or disable "by Sigma" + // In the Sigma test, the Sigma will disable the session available by using the sta_preset CAPI. + // 0: disable + // 1: enable + + u8 wfd_tdls_enable; // Flag to enable or disable the TDLS by WFD Sigma + // 0: disable + // 1: enable + u8 wfd_tdls_weaksec; // Flag to enable or disable the weak security function for TDLS by WFD Sigma + // 0: disable + // In this case, the driver can't issue the tdsl setup request frame. + // 1: enable + // In this case, the driver can issue the tdls setup request frame + // even the current security is weak security. + + enum P2P_WPSINFO ui_got_wps_info; // This field will store the WPS value (PIN value or PBC) that UI had got from the user. + u16 supported_wps_cm; // This field describes the WPS config method which this driver supported. + // The value should be the combination of config method defined in page104 of WPS v2.0 spec. + uint channel_list_attr_len; // This field will contain the length of body of P2P Channel List attribute of group negotitation response frame. + u8 channel_list_attr[100]; // This field will contain the body of P2P Channel List attribute of group negotitation response frame. + // We will use the channel_cnt and channel_list fields when constructing the group negotitation confirm frame. +#ifdef CONFIG_CONCURRENT_MODE + u16 ext_listen_interval; // The interval to be available with legacy AP (ms) + u16 ext_listen_period; // The time period to be available for P2P listen state (ms) +#endif + u8 p2p_ps_enable; + enum P2P_PS p2p_ps; // indicate p2p ps state + u8 noa_index; // Identifies and instance of Notice of Absence timing. + u8 ctwindow; // Client traffic window. A period of time in TU after TBTT. + u8 opp_ps; // opportunistic power save. + u8 noa_num; // number of NoA descriptor in P2P IE. + u8 noa_count[P2P_MAX_NOA_NUM]; // Count for owner, Type of client. + u32 noa_duration[P2P_MAX_NOA_NUM]; // Max duration for owner, preferred or min acceptable duration for client. + u32 noa_interval[P2P_MAX_NOA_NUM]; // Length of interval for owner, preferred or max acceptable interval of client. + u32 noa_start_time[P2P_MAX_NOA_NUM]; // schedule expressed in terms of the lower 4 bytes of the TSF timer. +#endif +}; +#if 0 +struct tdls_ss_record{ //signal strength record + u8 macaddr[ETH_ALEN]; + u8 RxPWDBAll; + u8 is_tdls_sta; // _TRUE: direct link sta, _FALSE: else +}; + +struct tdls_info{ + u8 ap_prohibited; + uint setup_state; + u8 sta_cnt; + u8 sta_maximum; // 1:tdls sta is equal (NUM_STA-1), reach max direct link number; 0: else; + struct tdls_ss_record ss_record; + u8 macid_index; //macid entry that is ready to write + u8 clear_cam; //cam entry that is trying to clear, using it in direct link teardown + u8 ch_sensing; + u8 cur_channel; + u8 candidate_ch; + u8 collect_pkt_num[MAX_CHANNEL_NUM]; + _lock cmd_lock; + _lock hdl_lock; + u8 watchdog_count; + u8 dev_discovered; //WFD_TDLS: for sigma test + u8 enable; +#ifdef CONFIG_WFD + struct wifi_display_info *wfd_info; +#endif +}; + +#endif //#if 0 + +struct mlme_priv { + + _lock lock; + sint fw_state; //shall we protect this variable? maybe not necessarily... + u8 bScanInProcess; + u8 to_join; //flag + #ifdef CONFIG_LAYER2_ROAMING + u8 to_roaming; // roaming trying times + #endif + + u8 *nic_hdl; //can be removed + + //u8 not_indic_disco; + _list *pscanned; + _queue free_bss_pool; + _queue scanned_queue; + u8 *free_bss_buf; + u16 num_of_scanned; + +#if SUPPORT_SCAN_BUF // Cloud 2013/12/20 + u8 *scan_buf; + u32 scan_buf_len; + u16 scan_cnt; + u16 scan_type; +#endif + + NDIS_802_11_SSID assoc_ssid; + u8 assoc_bssid[6]; + + struct wlan_network cur_network; + + //uint wireless_mode; no used, remove it + + u32 scan_interval; + + _timer assoc_timer; + + u8 assoc_by_bssid; + u8 assoc_by_rssi; + + _timer scan_to_timer; // driver itself handles scan_timeout status. + u32 scan_start_time; // used to evaluate the time spent in scanning + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + _timer set_scan_deny_timer; + ATOMIC_T set_scan_deny; //0: allowed, 1: deny + #endif + + struct qos_priv qospriv; + +#ifdef CONFIG_80211N_HT + + /* Number of non-HT AP/stations */ + u16 num_sta_no_ht; //int num_sta_no_ht; + + /* Number of HT AP/stations 20 MHz */ + //int num_sta_ht_20mhz; + + + u16 num_FortyMHzIntolerant; //int num_FortyMHzIntolerant; + + struct ht_priv htpriv; + +#endif + + RT_LINK_DETECT_T LinkDetectInfo; + _timer dynamic_chk_timer; //dynamic/periodic check timer + + u8 key_mask; //use for ips to set wep key after ips_leave + u8 acm_mask; // for wmm acm mask + u8 ChannelPlan; + RT_SCAN_TYPE scan_mode; // active: 1, passive: 0 + +#ifdef CONFIG_WPS + u8 *wps_probe_req_ie; + u32 wps_probe_req_ie_len; + u8 *wps_assoc_req_ie; + u32 wps_assoc_req_ie_len; +#endif + +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + /* Number of associated Non-ERP stations (i.e., stations using 802.11b + * in 802.11g BSS) */ + u16 num_sta_non_erp; + + /* Number of associated stations that do not support Short Slot Time */ + u16 num_sta_no_short_slot_time; + + /* Number of associated stations that do not support Short Preamble */ + u16 num_sta_no_short_preamble; + + //int olbc; /* Overlapping Legacy BSS Condition */ + + /* Number of HT associated stations that do not support greenfield */ + u16 num_sta_ht_no_gf; + + /* Number of associated non-HT stations */ + //int num_sta_no_ht; + + /* Number of HT associated stations 20 MHz */ + u16 num_sta_ht_20mhz; + + /* Overlapping BSS information */ + u8 olbc_ht; + +#ifdef CONFIG_80211N_HT + u16 ht_op_mode; +#endif /* CONFIG_80211N_HT */ + +#ifdef CONFIG_WPS + u8 *wps_beacon_ie; + u8 *wps_probe_resp_ie; + u8 *wps_assoc_resp_ie; // for CONFIG_IOCTL_CFG80211, this IE could include p2p ie + + u32 wps_beacon_ie_len; + u32 wps_probe_resp_ie_len; + u32 wps_assoc_resp_ie_len; + + +#ifdef CONFIG_P2P_NEW + u8 *p2p_beacon_ie; + u8 *p2p_probe_req_ie; + u8 *p2p_probe_resp_ie; +// u8 *p2p_go_probe_resp_ie; //for GO + u8 *p2p_assoc_req_ie; + u8 *p2p_assoc_rsp_ie; + + u32 p2p_beacon_ie_len; + u32 p2p_probe_req_ie_len; + u32 p2p_probe_resp_ie_len; +// u32 p2p_go_probe_resp_ie_len; //for GO + u32 p2p_assoc_req_ie_len; + u32 p2p_assoc_rsp_ie_len; +#endif //CONFIG_P2P +#endif //CONFIG_WPS + + _lock bcn_update_lock; + u8 update_bcn; +#if USE_DEDICATED_BCN_TX + //Dedicated xmit frame and buffer for beacon update - Alex Fang + struct xmit_frame bcn_xmit_frame; + struct xmit_buf bcn_xmit_buf; + //u8 bcn_buf[256]; + u8 bcn_buf[320]; //p2p go beacon size is about 272+32 bytes +#endif +#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + +#ifdef RTK_DMP_PLATFORM + // DMP kobject_hotplug function signal need in passive level + _workitem Linkup_workitem; + _workitem Linkdown_workitem; +#endif + +#ifdef CONFIG_INTEL_WIDI + int widi_state; + int listen_state; + _timer listen_timer; + ATOMIC_T rx_probe_rsp; // 1:receive probe respone from RDS source. + u8 *l2sdTaBuffer; + u8 channel_idx; + u8 group_cnt; //In WiDi 3.5, they specified another scan algo. for WFD/RDS co-existed + u8 sa_ext[L2SDTA_SERVICE_VE_LEN]; +#endif // CONFIG_INTEL_WIDI + +#ifdef CONFIG_CONCURRENT_MODE + u8 scanning_via_buddy_intf; +#endif + +#ifdef CONFIG_FTP_PROTECT + u8 ftp_lock_flag; +#endif //CONFIG_FTP_PROTECT + +#ifdef CONFIG_MULTICAST + u32 multicast_list[MULTICAST_LIST_SIZE]; +#endif + //For fast reconnection to keep frame info temporarily + union recv_frame *p_copy_recv_frame; +}; + +#ifdef CONFIG_AP_MODE + +struct hostapd_priv +{ + _adapter *padapter; + +#ifdef CONFIG_HOSTAPD_MLME + struct net_device *pmgnt_netdev; + struct usb_anchor anchored; +#endif + +}; + +extern int hostapd_mode_init(_adapter *padapter); +extern void hostapd_mode_unload(_adapter *padapter); +#endif + + +extern void rtw_joinbss_event_prehandle(_adapter *adapter, u8 *pbuf); +extern void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_atimdone_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf); + +#ifdef PLATFORM_WINDOWS +extern thread_return event_thread(void *context); + +extern void rtw_join_timeout_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); + +extern void _rtw_scan_timeout_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); + +#endif + +#if defined (PLATFORM_LINUX)|| defined (PLATFORM_FREEBSD) +extern int event_thread(void *context); +extern void rtw_join_timeout_handler(void* FunctionContext); +extern void _rtw_scan_timeout_handler(void* FunctionContext); +#endif + +extern void rtw_free_network_queue(_adapter *adapter,u8 isfreeall); +extern int rtw_init_mlme_priv(_adapter *adapter);// (struct mlme_priv *pmlmepriv); + +extern void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv); + + +extern sint rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv); +extern sint rtw_set_key(_adapter *adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx); +extern sint rtw_set_auth(_adapter *adapter,struct security_priv *psecuritypriv); +extern sint rtw_linked_check(_adapter *padapter); + +__inline static u8 *get_bssid(struct mlme_priv *pmlmepriv) +{ //if sta_mode:pmlmepriv->cur_network.network.MacAddress=> bssid + // if adhoc_mode:pmlmepriv->cur_network.network.MacAddress=> ibss mac address + return pmlmepriv->cur_network.network.MacAddress; +} + +__inline static sint check_fwstate(struct mlme_priv *pmlmepriv, sint state) +{ + if (pmlmepriv->fw_state & state) + return _TRUE; + + return _FALSE; +} + +__inline static sint get_fwstate(struct mlme_priv *pmlmepriv) +{ + return pmlmepriv->fw_state; +} + +/* + * No Limit on the calling context, + * therefore set it to be the critical section... + * + * ### NOTE:#### (!!!!) + * MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock + */ +__inline static void set_fwstate(struct mlme_priv *pmlmepriv, sint state) +{ + pmlmepriv->fw_state |= state; + //FOR HW integration + if(_FW_UNDER_SURVEY==state){ + pmlmepriv->bScanInProcess = _TRUE; + } +} + +__inline static void _clr_fwstate_(struct mlme_priv *pmlmepriv, sint state) +{ + pmlmepriv->fw_state &= ~state; + //FOR HW integration + if(_FW_UNDER_SURVEY==state){ + pmlmepriv->bScanInProcess = _FALSE; + } +} + +/* + * No Limit on the calling context, + * therefore set it to be the critical section... + */ +__inline static void clr_fwstate(struct mlme_priv *pmlmepriv, sint state) +{ + _irqL irqL; + + rtw_enter_critical_bh(&pmlmepriv->lock, &irqL); + if (check_fwstate(pmlmepriv, state) == _TRUE) + pmlmepriv->fw_state ^= state; + rtw_exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void clr_fwstate_ex(struct mlme_priv *pmlmepriv, sint state) +{ + _irqL irqL; + + rtw_enter_critical_bh(&pmlmepriv->lock, &irqL); + _clr_fwstate_(pmlmepriv, state); + rtw_exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void up_scanned_network(struct mlme_priv *pmlmepriv) +{ + _irqL irqL; + + rtw_enter_critical_bh(&pmlmepriv->lock, &irqL); + pmlmepriv->num_of_scanned++; + rtw_exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +#ifdef CONFIG_CONCURRENT_MODE +sint rtw_buddy_adapter_up(_adapter *padapter); +sint check_buddy_fwstate(_adapter *padapter, sint state); +#endif //CONFIG_CONCURRENT_MODE + +__inline static void down_scanned_network(struct mlme_priv *pmlmepriv) +{ + _irqL irqL; + + rtw_enter_critical_bh(&pmlmepriv->lock, &irqL); + pmlmepriv->num_of_scanned--; + rtw_exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void set_scanned_network_val(struct mlme_priv *pmlmepriv, sint val) +{ + _irqL irqL; + + rtw_enter_critical_bh(&pmlmepriv->lock, &irqL); + pmlmepriv->num_of_scanned = val; + rtw_exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +extern u16 rtw_get_capability(WLAN_BSSID_EX *bss); +extern void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target); +extern void rtw_disconnect_hdl_under_linked(_adapter* adapter, struct sta_info *psta, u8 free_assoc); +extern void rtw_generate_random_ibss(u8 *pibss); +extern struct wlan_network* rtw_find_network(_queue *scanned_queue, u8 *addr); +extern struct wlan_network* rtw_get_oldest_wlan_network(_queue *scanned_queue); + +extern void rtw_free_assoc_resources(_adapter* adapter, int lock_scanned_queue); +extern void rtw_indicate_disconnect(_adapter* adapter); +extern void rtw_indicate_connect(_adapter* adapter); +void rtw_indicate_scan_done( _adapter *padapter, bool aborted); +void rtw_scan_abort(_adapter *adapter); + +extern int rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie,u8 *out_ie,uint in_len); +extern int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len); +//extern void rtw_init_registrypriv_dev_network(_adapter *adapter); + +//extern void rtw_update_registrypriv_dev_network(_adapter *adapter); + +extern void rtw_get_encrypt_decrypt_from_registrypriv(_adapter *adapter); + +extern void _rtw_join_timeout_handler(_adapter *adapter); +extern void rtw_scan_timeout_handler(_adapter *adapter); + +extern void rtw_dynamic_check_timer_handlder(_adapter *adapter); +#ifdef CONFIG_SET_SCAN_DENY_TIMER +extern void rtw_set_scan_deny_timer_hdl(_adapter *adapter); +void rtw_set_scan_deny(struct mlme_priv *mlmepriv, u32 ms); +#endif + + +extern int _rtw_init_mlme_priv(_adapter *padapter); + +void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv); + +extern void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv); + +extern int _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork); + +extern struct wlan_network* _rtw_dequeue_network(_queue *queue); + +extern struct wlan_network* _rtw_alloc_network(struct mlme_priv *pmlmepriv); + + +extern void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall); +extern void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork); + + +extern struct wlan_network* _rtw_find_network(_queue *scanned_queue, u8 *addr); + +extern void _rtw_free_network_queue(_adapter* padapter, u8 isfreeall); + +extern sint rtw_if_up(_adapter *padapter); + + +u8 *rtw_get_capability_from_ie(u8 *ie); +u8 *rtw_get_timestampe_from_ie(u8 *ie); +u8 *rtw_get_beacon_interval_from_ie(u8 *ie); + + +void rtw_joinbss_reset(_adapter *padapter); + +#ifdef CONFIG_80211N_HT +unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len); +void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len); +void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe); +#endif + +int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork); +int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst); + +#ifdef CONFIG_LAYER2_ROAMING +void rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network); +void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network); +#endif + + +#ifdef CONFIG_INTEL_PROXIM +void rtw_proxim_enable(_adapter *padapter); +void rtw_proxim_disable(_adapter *padapter); +void rtw_proxim_send_packet(_adapter *padapter,u8 *pbuf,u16 len,u8 hw_rate); +#endif //CONFIG_INTEL_PROXIM + +extern void rtw_os_indicate_disconnect( _adapter *adapter ); +extern void rtw_os_indicate_scan_done( _adapter *padapter, bool aborted); +extern void rtw_reset_securitypriv( _adapter *adapter ); +#endif //__RTL871X_MLME_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mlme_ext.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mlme_ext.h new file mode 100644 index 0000000..b504f25 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mlme_ext.h @@ -0,0 +1,1014 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_MLME_EXT_H_ +#define __RTW_MLME_EXT_H_ + + +// Commented by Albert 20101105 +// Increase the SURVEY_TO value from 100 to 150 ( 100ms to 150ms ) +// The Realtek 8188CE SoftAP will spend around 100ms to send the probe response after receiving the probe request. +// So, this driver tried to extend the dwell time for each scanning channel. +// This will increase the chance to receive the probe response from SoftAP. + +#if CONFIG_AUTO_RECONNECT + +#endif + +//TODO +#define FAST_SURVEY_TO (25) //Fast connection time, scan only partial channel +#define SURVEY_TO (100) //Reduce connection time +//#define SURVEY_TO (300) //Increase time to stay each channel - Alex Fang +#define REAUTH_TO (300) //(50) +#define REASSOC_TO (300) //(50) +//#define DISCONNECT_TO (3000) +#define ADDBA_TO (2000) + +#define LINKED_TO (1) //unit:2 sec, 1x2=2 sec + +#define REAUTH_LIMIT (4) +#define REASSOC_LIMIT (4) +#define READDBA_LIMIT (2) + +#if (defined CONFIG_GSPI_HCI || defined CONFIG_SDIO_HCI) + #define ROAMING_LIMIT 5 +#else + #define ROAMING_LIMIT 8 +#endif +//#define IOCMD_REG0 0x10250370 +//#define IOCMD_REG1 0x10250374 +//#define IOCMD_REG2 0x10250378 + +//#define FW_DYNAMIC_FUN_SWITCH 0x10250364 + +//#define WRITE_BB_CMD 0xF0000001 +//#define SET_CHANNEL_CMD 0xF3000000 +//#define UPDATE_RA_CMD 0xFD0000A2 + +#define _HW_STATE_NOLINK_ 0x00 +#define _HW_STATE_ADHOC_ 0x01 +#define _HW_STATE_STATION_ 0x02 +#define _HW_STATE_AP_ 0x03 +#define _HW_STATE_MONITOR_ 0x04 + + +#define _1M_RATE_ 0 +#define _2M_RATE_ 1 +#define _5M_RATE_ 2 +#define _11M_RATE_ 3 +#define _6M_RATE_ 4 +#define _9M_RATE_ 5 +#define _12M_RATE_ 6 +#define _18M_RATE_ 7 +#define _24M_RATE_ 8 +#define _36M_RATE_ 9 +#define _48M_RATE_ 10 +#define _54M_RATE_ 11 + +#define MAX_COUNTRY_NUM 250 + +extern const u8 WMM_OUI[]; +extern const u8 WPS_OUI[]; +extern const u8 WFD_OUI[]; +extern const u8 P2P_OUI[]; + +//extern const unsigned char WMM_INFO_OUI[]; +extern const u8 WMM_PARA_OUI[]; + + +// +// Channel Plan Type. +// Note: +// We just add new channel plan when the new channel plan is different from any of the following +// channel plan. +// If you just wnat to customize the acitions(scan period or join actions) about one of the channel plan, +// customize them in RT_CHANNEL_INFO in the RT_CHANNEL_LIST. +// +typedef enum _RT_CHANNEL_DOMAIN +{ + //===== old channel plan mapping =====// + RT_CHANNEL_DOMAIN_FCC = 0x00, + RT_CHANNEL_DOMAIN_IC = 0x01, + RT_CHANNEL_DOMAIN_ETSI = 0x02, + RT_CHANNEL_DOMAIN_SPAIN = 0x03, + RT_CHANNEL_DOMAIN_FRANCE = 0x04, + RT_CHANNEL_DOMAIN_MKK = 0x05, + RT_CHANNEL_DOMAIN_MKK1 = 0x06, + RT_CHANNEL_DOMAIN_ISRAEL = 0x07, + RT_CHANNEL_DOMAIN_TELEC = 0x08, + RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN = 0x09, + RT_CHANNEL_DOMAIN_WORLD_WIDE_13 = 0x0A, + RT_CHANNEL_DOMAIN_TAIWAN = 0x0B, + RT_CHANNEL_DOMAIN_CHINA = 0x0C, + RT_CHANNEL_DOMAIN_SINGAPORE_INDIA_MEXICO = 0x0D, + RT_CHANNEL_DOMAIN_KOREA = 0x0E, + RT_CHANNEL_DOMAIN_TURKEY = 0x0F, + RT_CHANNEL_DOMAIN_JAPAN = 0x10, + RT_CHANNEL_DOMAIN_FCC_NO_DFS = 0x11, + RT_CHANNEL_DOMAIN_JAPAN_NO_DFS = 0x12, + RT_CHANNEL_DOMAIN_WORLD_WIDE_5G = 0x13, + RT_CHANNEL_DOMAIN_TAIWAN_NO_DFS = 0x14, + + //===== new channel plan mapping, (2GDOMAIN_5GDOMAIN) =====// + // 2.4 G only + RT_CHANNEL_DOMAIN_WORLD_NULL = 0x20, // ETSI, MKK ch1~13 + RT_CHANNEL_DOMAIN_ETSI1_NULL = 0x21, + RT_CHANNEL_DOMAIN_FCC1_NULL = 0x22, // FCC ch1~11 + RT_CHANNEL_DOMAIN_MKK1_NULL = 0x23, // MKK ch1~14 + RT_CHANNEL_DOMAIN_ETSI2_NULL = 0x24, + // 2.4 G + 5G type 1 + RT_CHANNEL_DOMAIN_FCC1_FCC1 = 0x25, + RT_CHANNEL_DOMAIN_WORLD_ETSI1 = 0x26, + RT_CHANNEL_DOMAIN_MKK1_MKK1 = 0x27, + RT_CHANNEL_DOMAIN_WORLD_KCC1 = 0x28, + RT_CHANNEL_DOMAIN_WORLD_FCC2 = 0x29, + RT_CHANNEL_DOMAIN_FCC2_NULL = 0x2A, // FCC ch1~13 + RT_CHANNEL_DOMAIN_WORLD_FCC3 = 0x30, + RT_CHANNEL_DOMAIN_WORLD_FCC4 = 0x31, + RT_CHANNEL_DOMAIN_WORLD_FCC5 = 0x32, + RT_CHANNEL_DOMAIN_WORLD_FCC6 = 0x33, + RT_CHANNEL_DOMAIN_FCC1_FCC7 = 0x34, + RT_CHANNEL_DOMAIN_WORLD_ETSI2 = 0x35, + RT_CHANNEL_DOMAIN_WORLD_ETSI3 = 0x36, + RT_CHANNEL_DOMAIN_MKK1_MKK2 = 0x37, + RT_CHANNEL_DOMAIN_MKK1_MKK3 = 0x38, + RT_CHANNEL_DOMAIN_FCC1_NCC1 = 0x39, + RT_CHANNEL_DOMAIN_FCC1_NCC2 = 0x40, + RT_CHANNEL_DOMAIN_GLOBAL_NULL = 0x41, + RT_CHANNEL_DOMAIN_ETSI1_ETSI4 = 0x42, + RT_CHANNEL_DOMAIN_FCC1_FCC2 = 0x43, + RT_CHANNEL_DOMAIN_FCC1_NCC3 = 0x44, + RT_CHANNEL_DOMAIN_WORLD_ETSI5 = 0x45, + RT_CHANNEL_DOMAIN_FCC1_FCC8 = 0x46, + RT_CHANNEL_DOMAIN_WORLD_ETSI6 = 0x47, // ETSI, MKK, FCC ch1~13 + RT_CHANNEL_DOMAIN_WORLD_ETSI7 = 0x48, + RT_CHANNEL_DOMAIN_WORLD_ETSI8 = 0x49, + RT_CHANNEL_DOMAIN_WORLD_ETSI9 = 0x50, + RT_CHANNEL_DOMAIN_WORLD_ETSI10 = 0x51, + RT_CHANNEL_DOMAIN_WORLD_ETSI11 = 0x52, + RT_CHANNEL_DOMAIN_FCC1_NCC4 = 0x53, + RT_CHANNEL_DOMAIN_WORLD_ETSI12 = 0x54, + RT_CHANNEL_DOMAIN_FCC1_FCC9 = 0x55, + RT_CHANNEL_DOMAIN_WORLD_ETSI13 = 0x56, + RT_CHANNEL_DOMAIN_FCC1_FCC10 = 0x57, + RT_CHANNEL_DOMAIN_MKK2_MKK4 = 0x58, // MKK ch1~13 + //===== Add new channel plan above this line===============// + RT_CHANNEL_DOMAIN_MAX, + RT_CHANNEL_DOMAIN_REALTEK_DEFINE = 0x7F, +}RT_CHANNEL_DOMAIN, *PRT_CHANNEL_DOMAIN; + +typedef enum _RT_CHANNEL_DOMAIN_2G +{ + RT_CHANNEL_DOMAIN_2G_WORLD1 = 0x00, //Worldwird 13, ch1~13 (ETSI, MKK) + RT_CHANNEL_DOMAIN_2G_ETSI1 = 0x01, //Europe, ch1~13 + RT_CHANNEL_DOMAIN_2G_FCC1 = 0x02, //US, ch1~11 + RT_CHANNEL_DOMAIN_2G_MKK1 = 0x03, //Japan, ch1~14 + RT_CHANNEL_DOMAIN_2G_ETSI2 = 0x04, //France, ch10~13 + RT_CHANNEL_DOMAIN_2G_RCC2 = 0x05, //US, ch1~13 + RT_CHANNEL_DOMAIN_2G_MKK2 = 0x06, //Japan, ch1~13 + RT_CHANNEL_DOMAIN_2G_WORLD2 = 0x07, //Worldwird 13, ch1~13 (ETSI, MKK, FCC) + //===== Add new channel plan above this line===============// + RT_CHANNEL_DOMAIN_2G_MAX, +}RT_CHANNEL_DOMAIN_2G, *PRT_CHANNEL_DOMAIN_2G; + +typedef enum _RT_CHANNEL_DOMAIN_5G +{ + RT_CHANNEL_DOMAIN_5G_NULL = 0x00, + RT_CHANNEL_DOMAIN_5G_ETSI1 = 0x01, //Europe + RT_CHANNEL_DOMAIN_5G_ETSI2 = 0x02, //Australia, New Zealand + RT_CHANNEL_DOMAIN_5G_ETSI3 = 0x03, //Russia + RT_CHANNEL_DOMAIN_5G_FCC1 = 0x04, //US + RT_CHANNEL_DOMAIN_5G_FCC2 = 0x05, //FCC o/w DFS Channels + RT_CHANNEL_DOMAIN_5G_FCC3 = 0x06, //India, Mexico + RT_CHANNEL_DOMAIN_5G_FCC4 = 0x07, //Venezuela + RT_CHANNEL_DOMAIN_5G_FCC5 = 0x08, //China + RT_CHANNEL_DOMAIN_5G_FCC6 = 0x09, //Israel + RT_CHANNEL_DOMAIN_5G_FCC7_IC1 = 0x0A, //US, Canada + RT_CHANNEL_DOMAIN_5G_KCC1 = 0x0B, //Korea + RT_CHANNEL_DOMAIN_5G_MKK1 = 0x0C, //Japan + RT_CHANNEL_DOMAIN_5G_MKK2 = 0x0D, //Japan (W52, W53) + RT_CHANNEL_DOMAIN_5G_MKK3 = 0x0E, //Japan (W56) + RT_CHANNEL_DOMAIN_5G_NCC1 = 0x0F, //Taiwan + RT_CHANNEL_DOMAIN_5G_NCC2 = 0x10, //Taiwan o/w DFS + //===== Add new channel plan above this line===============// + //===== Driver Self Defined =====// + RT_CHANNEL_DOMAIN_5G_FCC = 0x11, + RT_CHANNEL_DOMAIN_5G_JAPAN_NO_DFS = 0x12, + RT_CHANNEL_DOMAIN_5G_MAX, +}RT_CHANNEL_DOMAIN_5G, *PRT_CHANNEL_DOMAIN_5G; + +#define rtw_is_channel_plan_valid(chplan) (chplancur_network.network. YJ,del,140408 + struct FW_Sta_Info FW_sta_info[NUM_STA]; + +#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE + u8 scan_cnt; +#endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE +}; + +// The channel information about this channel including joining, scanning, and power constraints. +#define PSCAN_ENABLE 0x01 //enable for partial channel scan +#define PSCAN_FAST_SURVEY 0x02 //set to select scan time to FAST_SURVEY_TO and resend probe request +#define PSCAN_SIMPLE_CONFIG 0x04 //set to select scan time to FAST_SURVEY_TO and resend probe request +#define PSCAN_SET_SSID_DONE 0x80 //When receive probe response, this bit is set to 1 + +#define PSCAN_DISABLE_MASK 0xFE //disable PSCAN_ENABLE +#define PSCAN_CLEAR_SSID_DONE 0x7F //clear PSCAN_SET_SSID_DONE +#define PSCAN_RETRY_TIMES 7 //the retry times of resending probe request when PSCAN_FAST_SURVEY is set + +typedef struct _RT_CHANNEL_INFO +{ + u8 ChannelNum; // The channel number. + RT_SCAN_TYPE ScanType; // Scan type such as passive or active scan. + //u16 ScanPeriod; // Listen time in millisecond in this channel. + //s32 MaxTxPwrDbm; // Max allowed tx power. + //u32 ExInfo; // Extended Information for this channel. +#ifdef CONFIG_FIND_BEST_CHANNEL + u32 rx_count; +#endif + u8 pscan_config; +}RT_CHANNEL_INFO, *PRT_CHANNEL_INFO; + +extern int rtw_is_channel_set_contains_channel(RT_CHANNEL_INFO *channel_set, const u32 channel_num, int *pchannel_idx); + +#ifdef CONFIG_CUSTOM_IE +#ifndef _CUS_IE_ +#define _CUS_IE_ +typedef struct _cus_ie +{ + u8 *ie; + u8 type; +}rtw_custom_ie_t, *p_rtw_custom_ie_t; +#endif /* _CUS_IE_ */ +#endif + +struct mlme_ext_priv +{ + _adapter *padapter; + u8 mlmeext_init; + ATOMIC_T event_seq; + u16 mgnt_seq; + + //struct fw_priv fwpriv; + + u8 cur_channel; + u8 cur_bwmode; + u8 cur_ch_offset;//PRIME_CHNL_OFFSET + u8 cur_wireless_mode; // NETWORK_TYPE + u8 max_chan_nums; + RT_CHANNEL_INFO channel_set[MAX_CHANNEL_NUM]; +#ifdef CONFIG_P2P_NEW + RT_CHANNEL_INFO social_channel_set[4]; + RT_CHANNEL_INFO special_channel[2]; + u8 special_mac[ETH_ALEN]; + u16 scan_mode; + u8 bremain_on_channel; + _timer remainon_timer; +#endif + u8 basicrate[NumRates]; + u8 datarate[NumRates]; + + struct ss_res sitesurvey_res; + struct mlme_ext_info mlmext_info;//for sta/adhoc mode, including current scanning/connecting/connected related info. + //for ap mode, network includes ap's cap_info + _timer survey_timer; + _timer link_timer; + //_timer ADDBA_timer; + u16 chan_scan_time; + + u8 scan_abort; + u8 tx_rate; // TXRATE when USERATE is set. + + u8 retry; //retry for issue probereq + + u64 TSFValue; + +#ifdef CONFIG_AP_MODE + unsigned char bstart_bss; +#endif + +#ifdef CONFIG_80211D + u8 update_channel_plan_by_ap_done; +#endif + //recv_decache check for Action_public frame + u16 action_public_rxseq; + + /* for softap power save */ +#ifdef CONFIG_P2P_NEW + u8 action_public_dialog_token; +#endif +#if CONFIG_AUTO_RECONNECT + _timer reconnect_timer; + u8 reconnect_deauth_filtered; + u8 reconnect_times; + u8 reconnect_cnt; + u16 reconnect_timeout; // the unit is second + u8 saved_alg; + u8 saved_essid[32+1]; + u8 saved_key[32]; + u16 saved_key_len; + u8 saved_key_idx; + u8 saved_wpa_passphrase[IW_PASSPHRASE_MAX_SIZE + 1]; + u8 saved_eap_method; + u8 auto_reconnect; +#endif + u8 partial_scan; +#ifdef CONFIG_CUSTOM_IE + p_rtw_custom_ie_t cus_ven_ie; + u8 ie_num; +#endif + +#ifdef CONFIG_CONCURRENT_MODE + u8 bChDeauthDisabled; + u8 bConcurrentFlushingSTA; +#endif +}; + +int init_mlme_ext_priv(_adapter* padapter); +int init_hw_mlme_ext(_adapter *padapter); +void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext); +extern void init_mlme_ext_timer(_adapter *padapter); +extern void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta); +extern struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv); +extern struct xmit_frame *alloc_FwRsvdframe(struct xmit_priv *pxmitpriv, u32 size); +//void fill_fwpriv(_adapter * padapter, struct fw_priv *pfwpriv); + +unsigned char networktype_to_raid(unsigned char network_type); +u8 judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen); +void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len); +void UpdateBrateTbl(_adapter *padapter,u8 *mBratesOS); +void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen); + +void Save_DM_Func_Flag(_adapter *padapter); +void Restore_DM_Func_Flag(_adapter *padapter); +void Switch_DM_Func(_adapter *padapter, u32 mode, u8 enable); + +//void Set_NETYPE1_MSR(_adapter *padapter, u8 type); +//void Set_NETYPE0_MSR(_adapter *padapter, u8 type); +void Set_MSR(_adapter *padapter, u8 type); + +u8 set_opmode(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); +void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode); +void SelectChannel(_adapter *padapter, unsigned char channel); +void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset); + +unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval); + +void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key); +void clear_cam_entry(_adapter *padapter, u8 entry); + +void invalidate_cam_all(_adapter *padapter); +void CAM_empty_entry(PADAPTER Adapter, u8 ucIndex); + + +int allocate_fw_sta_entry(_adapter *padapter); +void flush_all_cam_entry(_adapter *padapter); + +BOOLEAN IsLegal5GChannel(PADAPTER Adapter, u8 channel); + +void site_survey(_adapter *padapter); +u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid); +void update_network(WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src, _adapter * padapter, bool update_ie); + +int get_bsstype(unsigned short capability); +u8* get_my_bssid(WLAN_BSSID_EX *pnetwork); +u16 get_beacon_interval(WLAN_BSSID_EX *bss); + +int is_client_associated_to_ap(_adapter *padapter); +int is_client_associated_to_ibss(_adapter *padapter); +int is_IBSS_empty(_adapter *padapter); + +unsigned char check_assoc_AP(u8 *pframe, uint len); + +int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +#ifdef CONFIG_WFD +int WFD_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +#endif +void WMMOnAssocRsp(_adapter *padapter); + +void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void HTOnAssocRsp(_adapter *padapter); + +void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void VCS_update(_adapter *padapter, struct sta_info *psta); + +void update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_info *psta); +int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len); +#ifdef CONFIG_DFS +void process_csa_ie(_adapter *padapter, u8 *pframe, uint len); +#endif //CONFIG_DFS +void update_IOT_info(_adapter *padapter); +void update_capinfo(PADAPTER Adapter, u16 updateCap); +void update_wireless_mode(_adapter * padapter); +void update_tx_basic_rate(_adapter *padapter, u8 modulation); +void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id); +int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx); + +//for sta/adhoc mode +void update_sta_info(_adapter *padapter, struct sta_info *psta); +unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz); +unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz); +unsigned int update_MCS_rate(struct HT_caps_element *pHT_caps); +void Update_RA_Entry(_adapter *padapter, struct sta_info *psta); +void set_sta_rate(_adapter *padapter, struct sta_info *psta); + +unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason); + +unsigned char get_highest_rate_idx(u32 mask); +int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps); +unsigned int is_ap_in_tkip(_adapter *padapter); +unsigned int is_ap_in_wep(_adapter *padapter); +unsigned int should_forbid_n_rate(_adapter * padapter); + +void report_join_res(_adapter *padapter, int res); +void report_survey_event(_adapter *padapter, union recv_frame *precv_frame); +void report_surveydone_event(_adapter *padapter); +void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason); +void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx); + +void beacon_timing_control(_adapter *padapter); +extern u8 set_tx_beacon_cmd(_adapter*padapter); +unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame); +void update_mgnt_tx_rate(_adapter *padapter, u8 rate); +void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib); +void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe); +s32 dump_mgntframe_and_wait(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms); + +#ifdef CONFIG_P2P +void issue_probersp_p2p(_adapter *padapter, unsigned char *da); +void issue_p2p_provision_request( _adapter *padapter, u8* pssid, u8 ussidlen, u8* pdev_raddr); +void issue_p2p_GO_request(_adapter *padapter, u8* raddr); +void issue_probereq_p2p(_adapter *padapter); +void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 success); +void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ); +#endif //CONFIG_P2P +void issue_beacon(_adapter *padapter); +void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq); +void issue_assocreq(_adapter *padapter); +void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type); +void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status); +// Added by Albert 2010/07/26 +// blnbc: 1 -> broadcast probe request +// blnbc: 0 -> unicast probe request. The address 1 will be the BSSID. +void issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 blnbc); +void issue_nulldata(_adapter *padapter, unsigned int power_mode); +void issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid); +void issue_deauth(_adapter *padapter, unsigned char *da, u32 reason); +void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status); +unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr); +unsigned int send_beacon(_adapter *padapter); + +void start_clnt_assoc(_adapter *padapter); +void start_clnt_auth(_adapter* padapter); +void start_clnt_join(_adapter* padapter); +void start_create_ibss(_adapter* padapter); + +unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame); +unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame); + +unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_public(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame); + + +void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res); +void mlmeext_sta_del_event_callback(_adapter *padapter); +void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta); + +void linked_status_chk(_adapter *padapter); + +void survey_timer_hdl (_adapter *padapter); +void link_timer_hdl (_adapter *padapter); +void addba_timer_hdl(struct sta_info *psta); +//void reauth_timer_hdl(_adapter *padapter); +//void reassoc_timer_hdl(_adapter *padapter); + +#define set_survey_timer(mlmeext, ms) \ + do { \ + /*DBG_871X("%s set_survey_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \ + rtw_set_timer(&(mlmeext)->survey_timer, (ms)); \ + } while(0) + +#define set_link_timer(mlmeext, ms) \ + do { \ + /*DBG_871X("%s set_link_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \ + rtw_set_timer(&(mlmeext)->link_timer, (ms)); \ + } while(0) + +//TODO +#if 0 +extern int cckrates_included(unsigned char *rate, int ratelen); +extern int cckratesonly_included(unsigned char *rate, int ratelen); +extern void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr); +#endif + +extern void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len); +extern void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext); + +#ifdef CONFIG_CONCURRENT_MODE + sint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state); +int concurrent_chk_start_clnt_join(_adapter *padapter); +void concurrent_chk_joinbss_done(_adapter *padapter, int join_res); +#endif //CONFIG_CONCURRENT_MODE + + +struct cmd_hdl { + uint parmsize; + u8 (*h2cfuns)(struct _ADAPTER *padapter, u8 *pbuf); +}; + +//TODO +#if 0 + +u8 read_macreg_hdl(_adapter *padapter, u8 *pbuf); +u8 write_macreg_hdl(_adapter *padapter, u8 *pbuf); +u8 read_bbreg_hdl(_adapter *padapter, u8 *pbuf); +u8 write_bbreg_hdl(_adapter *padapter, u8 *pbuf); +u8 read_rfreg_hdl(_adapter *padapter, u8 *pbuf); +u8 write_rfreg_hdl(_adapter *padapter, u8 *pbuf); + +#endif //#if 0 + +u8 NULL_hdl(_adapter *padapter, u8 *pbuf); +u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf); +u8 disconnect_hdl(_adapter *padapter, u8 *pbuf); +u8 createbss_hdl(_adapter *padapter, u8 *pbuf); +u8 setopmode_hdl(_adapter *padapter, u8 *pbuf); +u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf); +u8 setauth_hdl(_adapter *padapter, u8 *pbuf); +u8 setkey_hdl(_adapter *padapter, u8 *pbuf); +u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf); +u8 set_assocsta_hdl(_adapter *padapter, u8 *pbuf); +u8 del_assocsta_hdl(_adapter *padapter, u8 *pbuf); +u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf); + +u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf); +u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf); +u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf); +u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf); +u8 led_blink_hdl(_adapter *padapter, unsigned char *pbuf); +u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf); //Kurt: Handling DFS channel switch announcement ie. +u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf); + +#if CONFIG_AUTO_RECONNECT +extern void reconnect_timer_hdl(void *FunctionContext); +#endif + +#define GEN_DRV_CMD_HANDLER(size, cmd) {size, &cmd ## _hdl}, +#define GEN_MLME_EXT_HANDLER(size, cmd) {size, cmd}, + +#ifdef _RTW_CMD_C_ + +const struct cmd_hdl wlancmds[] = +{ + GEN_DRV_CMD_HANDLER(0, NULL) /*0*/ + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) /*10*/ + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct joinbss_parm), join_cmd_hdl) /*14*/ + GEN_MLME_EXT_HANDLER(sizeof (struct disconnect_parm), disconnect_hdl) +//TODO +// GEN_MLME_EXT_HANDLER(sizeof (struct createbss_parm), createbss_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct createbss_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setopmode_parm), setopmode_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct sitesurvey_parm), sitesurvey_cmd_hdl) /*18*/ + GEN_MLME_EXT_HANDLER(sizeof (struct setauth_parm), setauth_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct setkey_parm), setkey_hdl) /*20*/ + GEN_MLME_EXT_HANDLER(sizeof (struct set_stakey_parm), set_stakey_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct set_assocsta_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct del_assocsta_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setstapwrstate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setbasicrate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getbasicrate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setdatarate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getdatarate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setphyinfo_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getphyinfo_parm), NULL) /*30*/ + GEN_MLME_EXT_HANDLER(sizeof (struct setphy_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getphy_parm), NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) /*40*/ + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) +//TODO +#if RX_AGGREGATION + GEN_MLME_EXT_HANDLER(sizeof(struct addBaReq_parm), add_ba_hdl) +#else + GEN_MLME_EXT_HANDLER(sizeof(struct addBaReq_parm), NULL) +#endif + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) /*50*/ + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(sizeof(struct Tx_Beacon_param), tx_beacon_hdl) /*55*/ + GEN_MLME_EXT_HANDLER(0, mlme_evt_hdl) /*56*/ + GEN_MLME_EXT_HANDLER(0, rtw_drvextra_cmd_hdl) /*57*/ +//TODO +// GEN_MLME_EXT_HANDLER(0, h2c_msg_hdl) /*58*/ + GEN_MLME_EXT_HANDLER(0, NULL) /*58*/ +//TODO +// GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelPlan_param), set_chplan_hdl) /*59*/ + GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelPlan_param), NULL) /*59*/ +//TODO +// GEN_MLME_EXT_HANDLER(sizeof(struct LedBlink_param), led_blink_hdl) /*60*/ + GEN_MLME_EXT_HANDLER(0, NULL) /*60*/ +//TODO +// GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelSwitch_param), set_csa_hdl) /*61*/ + GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelSwitch_param), NULL) /*61*/ +//TODO +// GEN_MLME_EXT_HANDLER(sizeof(struct TDLSoption_param), tdls_hdl) /*62*/ + GEN_MLME_EXT_HANDLER(sizeof(struct TDLSoption_param), NULL) /*62*/ +#ifdef CONFIG_P2P_NEW + GEN_MLME_EXT_HANDLER(0, rtw_p2p_cmd_hdl) /*63*/ +#endif +}; + +#endif + +struct C2HEvent_Header +{ + +#ifdef CONFIG_LITTLE_ENDIAN + + unsigned int len:16; + unsigned int ID:8; + unsigned int seq:8; + +#elif defined(CONFIG_BIG_ENDIAN) + + unsigned int seq:8; + unsigned int ID:8; + unsigned int len:16; + +#else + +# error "Must be LITTLE or BIG Endian" + +#endif + + unsigned int rsvd; + +}; + +void rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf); +void rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf); + +enum rtw_c2h_event +{ + GEN_EVT_CODE(_Read_MACREG)=0, /*0*/ + GEN_EVT_CODE(_Read_BBREG), + GEN_EVT_CODE(_Read_RFREG), + GEN_EVT_CODE(_Read_EEPROM), + GEN_EVT_CODE(_Read_EFUSE), + GEN_EVT_CODE(_Read_CAM), /*5*/ + GEN_EVT_CODE(_Get_BasicRate), + GEN_EVT_CODE(_Get_DataRate), + GEN_EVT_CODE(_Survey), /*8*/ + GEN_EVT_CODE(_SurveyDone), /*9*/ + + GEN_EVT_CODE(_JoinBss) , /*10*/ + GEN_EVT_CODE(_AddSTA), + GEN_EVT_CODE(_DelSTA), + GEN_EVT_CODE(_AtimDone) , + GEN_EVT_CODE(_TX_Report), + GEN_EVT_CODE(_CCX_Report), /*15*/ + GEN_EVT_CODE(_DTM_Report), + GEN_EVT_CODE(_TX_Rate_Statistics), + GEN_EVT_CODE(_C2HLBK), + GEN_EVT_CODE(_FWDBG), + GEN_EVT_CODE(_C2HFEEDBACK), /*20*/ + GEN_EVT_CODE(_ADDBA), + GEN_EVT_CODE(_C2HBCN), + GEN_EVT_CODE(_ReportPwrState), //filen: only for PCIE, USB + GEN_EVT_CODE(_CloseRF), //filen: only for PCIE, work around ASPM + MAX_C2HEVT +}; + + +#ifdef _RTW_MLME_EXT_C_ + +const static struct fwevent wlanevents[] = +{ + {0, rtw_dummy_event_callback}, /*0*/ + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, &rtw_survey_event_callback}, /*8*/ + {sizeof (struct surveydone_event), &rtw_surveydone_event_callback}, /*9*/ + {0, &rtw_joinbss_event_callback}, /*10*/ + {sizeof(struct stassoc_event), &rtw_stassoc_event_callback}, + {sizeof(struct stadel_event), &rtw_stadel_event_callback}, +//TODO +// {0, &rtw_atimdone_event_callback}, + {0, NULL}, /*rtw_atimdone_event_callback*/ + {0, rtw_dummy_event_callback}, + {0, NULL}, /*15*/ + {0, NULL}, + {0, NULL}, + {0, NULL}, +//TODO +// {0, rtw_fwdbg_event_callback}, + {0, NULL}, /*rtw_fwdbg_event_callback*/ + {0, NULL}, /*20*/ + {0, NULL}, + {0, NULL}, +//TODO +// {0, &rtw_cpwm_event_callback}, + {0, NULL}, /*rtw_cpwm_event_callback*/ +}; + +#endif//_RTL8192C_CMD_C_ + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mp.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mp.h new file mode 100644 index 0000000..f8f8253 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_mp.h @@ -0,0 +1,722 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTW_MP_H_ +#define _RTW_MP_H_ + +#ifndef PLATFORM_WINDOWS +// 00 - Success +// 11 - Error +#define STATUS_SUCCESS (0x00000000L) +#define STATUS_PENDING (0x00000103L) + +#define STATUS_UNSUCCESSFUL (0xC0000001L) +#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL) +#define STATUS_NOT_SUPPORTED (0xC00000BBL) + +#define NDIS_STATUS_SUCCESS ((NDIS_STATUS)STATUS_SUCCESS) +#define NDIS_STATUS_PENDING ((NDIS_STATUS)STATUS_PENDING) +#define NDIS_STATUS_NOT_RECOGNIZED ((NDIS_STATUS)0x00010001L) +#define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L) +#define NDIS_STATUS_NOT_ACCEPTED ((NDIS_STATUS)0x00010003L) +#define NDIS_STATUS_CALL_ACTIVE ((NDIS_STATUS)0x00010007L) + +#define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL) +#define NDIS_STATUS_RESOURCES ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES) +#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L) +#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L) +#define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L) +#define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L) +#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L) +#define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L) +#define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L) +#define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL) +#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL) +#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL) +#define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL) +#define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL) +#define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED) +#define NDIS_STATUS_INVALID_PACKET ((NDIS_STATUS)0xC001000FL) +#define NDIS_STATUS_OPEN_LIST_FULL ((NDIS_STATUS)0xC0010010L) +#define NDIS_STATUS_ADAPTER_NOT_READY ((NDIS_STATUS)0xC0010011L) +#define NDIS_STATUS_ADAPTER_NOT_OPEN ((NDIS_STATUS)0xC0010012L) +#define NDIS_STATUS_NOT_INDICATING ((NDIS_STATUS)0xC0010013L) +#define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L) +#define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L) +#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L) +#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L) +#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L) +#define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L) +#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL) +#define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL) +#define NDIS_STATUS_ERROR_READING_FILE ((NDIS_STATUS)0xC001001CL) +#define NDIS_STATUS_ALREADY_MAPPED ((NDIS_STATUS)0xC001001DL) +#define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL) +#define NDIS_STATUS_NO_CABLE ((NDIS_STATUS)0xC001001FL) + +#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L) +#define NDIS_STATUS_SAP_IN_USE ((NDIS_STATUS)0xC0010021L) +#define NDIS_STATUS_INVALID_ADDRESS ((NDIS_STATUS)0xC0010022L) +#define NDIS_STATUS_VC_NOT_ACTIVATED ((NDIS_STATUS)0xC0010023L) +#define NDIS_STATUS_DEST_OUT_OF_ORDER ((NDIS_STATUS)0xC0010024L) // cause 27 +#define NDIS_STATUS_VC_NOT_AVAILABLE ((NDIS_STATUS)0xC0010025L) // cause 35,45 +#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((NDIS_STATUS)0xC0010026L) // cause 37 +#define NDIS_STATUS_INCOMPATABLE_QOS ((NDIS_STATUS)0xC0010027L) // cause 49 +#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((NDIS_STATUS)0xC0010028L) // cause 93 +#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((NDIS_STATUS)0xC0010029L) // cause 3 +#endif /* #ifndef PLATFORM_WINDOWS */ + +#if 0 +#define MPT_NOOP 0 +#define MPT_READ_MAC_1BYTE 1 +#define MPT_READ_MAC_2BYTE 2 +#define MPT_READ_MAC_4BYTE 3 +#define MPT_WRITE_MAC_1BYTE 4 +#define MPT_WRITE_MAC_2BYTE 5 +#define MPT_WRITE_MAC_4BYTE 6 +#define MPT_READ_BB_CCK 7 +#define MPT_WRITE_BB_CCK 8 +#define MPT_READ_BB_OFDM 9 +#define MPT_WRITE_BB_OFDM 10 +#define MPT_READ_RF 11 +#define MPT_WRITE_RF 12 +#define MPT_READ_EEPROM_1BYTE 13 +#define MPT_WRITE_EEPROM_1BYTE 14 +#define MPT_READ_EEPROM_2BYTE 15 +#define MPT_WRITE_EEPROM_2BYTE 16 +#define MPT_SET_CSTHRESHOLD 21 +#define MPT_SET_INITGAIN 22 +#define MPT_SWITCH_BAND 23 +#define MPT_SWITCH_CHANNEL 24 +#define MPT_SET_DATARATE 25 +#define MPT_SWITCH_ANTENNA 26 +#define MPT_SET_TX_POWER 27 +#define MPT_SET_CONT_TX 28 +#define MPT_SET_SINGLE_CARRIER 29 +#define MPT_SET_CARRIER_SUPPRESSION 30 +#define MPT_GET_RATE_TABLE 31 +#define MPT_READ_TSSI 32 +#define MPT_GET_THERMAL_METER 33 +#endif + +typedef enum _ANTENNA_PATH{ + ANTENNA_NONE = 0x00, + ANTENNA_D , + ANTENNA_C , + ANTENNA_CD , + ANTENNA_B , + ANTENNA_BD , + ANTENNA_BC , + ANTENNA_BCD , + ANTENNA_A , + ANTENNA_AD , + ANTENNA_AC , + ANTENNA_ACD , + ANTENNA_AB , + ANTENNA_ABD , + ANTENNA_ABC , + ANTENNA_ABCD +} ANTENNA_PATH; + + +#define MAX_MP_XMITBUF_SZ 2048 +#define NR_MP_XMITFRAME 8 + +struct mp_xmit_frame +{ + _list list; + + struct pkt_attrib attrib; + + _pkt *pkt; + + int frame_tag; + + _adapter *padapter; + +#ifdef CONFIG_USB_HCI + + //insert urb, irp, and irpcnt info below... + //max frag_cnt = 8 + + u8 *mem_addr; + u32 sz[8]; + +#if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX) + PURB pxmit_urb[8]; +#endif + +#ifdef PLATFORM_OS_XP + PIRP pxmit_irp[8]; +#endif + + u8 bpending[8]; + s32 ac_tag[8]; + s32 last[8]; + uint irpcnt; + uint fragcnt; +#endif /* CONFIG_USB_HCI */ + + uint mem[(MAX_MP_XMITBUF_SZ >> 2)]; +}; + +struct mp_wiparam +{ + u32 bcompleted; + u32 act_type; + u32 io_offset; + u32 io_value; +}; + +typedef void(*wi_act_func)(void* padapter); + +#ifdef PLATFORM_WINDOWS +struct mp_wi_cntx +{ + u8 bmpdrv_unload; + + // Work Item + NDIS_WORK_ITEM mp_wi; + NDIS_EVENT mp_wi_evt; + _lock mp_wi_lock; + u8 bmp_wi_progress; + wi_act_func curractfunc; + // Variable needed in each implementation of CurrActFunc. + struct mp_wiparam param; +}; +#endif + +struct mp_tx +{ + u8 stop; + u32 count, sended; + u8 payload; + struct pkt_attrib attrib; + struct tx_desc desc; + u8 *pallocated_buf; + u8 *buf; + u32 buf_size, write_size; + //_thread_hdl_ PktTxThread; + struct task_struct MpXmitThread; +}; + +#define MP_MAX_LINES 1000 +#define MP_MAX_LINES_BYTES 256 + + +typedef void (*MPT_WORK_ITEM_HANDLER)(IN void *Adapter); +typedef struct _MPT_CONTEXT +{ + // Indicate if we have started Mass Production Test. + BOOLEAN bMassProdTest; + + // Indicate if the driver is unloading or unloaded. + BOOLEAN bMptDrvUnload; + + _sema MPh2c_Sema; + _timer MPh2c_timeout_timer; +// Event used to sync H2c for BT control + + BOOLEAN MptH2cRspEvent; + BOOLEAN MptBtC2hEvent; + BOOLEAN bMPh2c_timeout; + + /* 8190 PCI does not support NDIS_WORK_ITEM. */ + // Work Item for Mass Production Test. + //NDIS_WORK_ITEM MptWorkItem; +// RT_WORK_ITEM MptWorkItem; + // Event used to sync the case unloading driver and MptWorkItem is still in progress. +// NDIS_EVENT MptWorkItemEvent; + // To protect the following variables. +// NDIS_SPIN_LOCK MptWorkItemSpinLock; + // Indicate a MptWorkItem is scheduled and not yet finished. + BOOLEAN bMptWorkItemInProgress; + // An instance which implements function and context of MptWorkItem. + MPT_WORK_ITEM_HANDLER CurrMptAct; + + // 1=Start, 0=Stop from UI. + u32 MptTestStart; + // _TEST_MODE, defined in MPT_Req2.h + u32 MptTestItem; + // Variable needed in each implementation of CurrMptAct. + u32 MptActType; // Type of action performed in CurrMptAct. + // The Offset of IO operation is depend of MptActType. + u32 MptIoOffset; + // The Value of IO operation is depend of MptActType. + u32 MptIoValue; + // The RfPath of IO operation is depend of MptActType. + u32 MptRfPath; + + WIRELESS_MODE MptWirelessModeToSw; // Wireless mode to switch. + u8 MptChannelToSw; // Channel to switch. + u8 MptInitGainToSet; // Initial gain to set. + //u32 bMptAntennaA; // TRUE if we want to use antenna A. + u32 MptBandWidth; // bandwidth to switch. + u32 MptRateIndex; // rate index. + // Register value kept for Single Carrier Tx test. + u8 btMpCckTxPower; + // Register value kept for Single Carrier Tx test. + u8 btMpOfdmTxPower; + // For MP Tx Power index + u8 TxPwrLevel[2]; // rf-A, rf-B + + // Content of RCR Regsiter for Mass Production Test. + u32 MptRCR; + // TRUE if we only receive packets with specific pattern. + BOOLEAN bMptFilterPattern; + // Rx OK count, statistics used in Mass Production Test. + u32 MptRxOkCnt; + // Rx CRC32 error count, statistics used in Mass Production Test. + u32 MptRxCrcErrCnt; + + BOOLEAN bCckContTx; // TRUE if we are in CCK Continuous Tx test. + BOOLEAN bOfdmContTx; // TRUE if we are in OFDM Continuous Tx test. + BOOLEAN bStartContTx; // TRUE if we have start Continuous Tx test. + // TRUE if we are in Single Carrier Tx test. + BOOLEAN bSingleCarrier; + // TRUE if we are in Carrier Suppression Tx Test. + BOOLEAN bCarrierSuppression; + //TRUE if we are in Single Tone Tx test. + BOOLEAN bSingleTone; + + // ACK counter asked by K.Y.. + BOOLEAN bMptEnableAckCounter; + u32 MptAckCounter; + + // SD3 Willis For 8192S to save 1T/2T RF table for ACUT Only fro ACUT delete later ~~~! + //s8 BufOfLines[2][MAX_LINES_HWCONFIG_TXT][MAX_BYTES_LINE_HWCONFIG_TXT]; + //s8 BufOfLines[2][MP_MAX_LINES][MP_MAX_LINES_BYTES]; + //s32 RfReadLine[2]; + + u8 APK_bound[2]; //for APK path A/path B + BOOLEAN bMptIndexEven; + + u8 backup0xc50; + u8 backup0xc58; + u8 backup0xc30; + u8 backup0x52_RF_A; + u8 backup0x52_RF_B; + + u8 h2cReqNum; + u8 c2hBuf[20]; + + u8 btInBuf[100]; + u32 mptOutLen; + u8 mptOutBuf[100]; + +}MPT_CONTEXT, *PMPT_CONTEXT; +//#endif + +//#define RTPRIV_IOCTL_MP ( SIOCIWFIRSTPRIV + 0x17) +enum { + WRITE_REG = 1, + READ_REG, + WRITE_RF, + READ_RF, + MP_START, + MP_STOP, + MP_RATE, + MP_CHANNEL, + MP_BANDWIDTH, + MP_TXPOWER, + MP_ANT_TX, + MP_ANT_RX, + MP_CTX, + MP_QUERY, + MP_ARX, + MP_PSD, + MP_PWRTRK, + MP_THER, + MP_IOCTL, + EFUSE_GET, + EFUSE_SET, + CONFIG_GET, + CONFIG_SET, + MP_RESET_STATS, + MP_DUMP, + MP_PHYPARA, + MP_SetRFPathSwh, + MP_QueryDrvStats, + MP_SetBT, + TEST_CFG, + MP_NULL, + MP_GET_TXPOWER_INX, + MP_SET_PREAMBLE, + MP_DISABLE_BT_COEXIST, + MP_PwrCtlDM, + MP_IQK, + MP_LCK, + MP_DRV_ABILITY +}; + +struct mp_priv +{ + _adapter *papdater; + + //Testing Flag + u32 mode;//0 for normal type packet, 1 for loopback packet (16bytes TXCMD) + + u32 prev_fw_state; + + //OID cmd handler + struct mp_wiparam workparam; +// u8 act_in_progress; + + //Tx Section + u8 TID; + u32 tx_pktcount; + struct mp_tx tx; + + //Rx Section + u8 rx_pkt_by_mac; + u32 rx_pktcount; + u32 rx_crcerrpktcount; + u32 rx_macpktcount; + u32 rx_pktloss; + + struct recv_stat rxstat; + + //RF/BB relative + u8 channel; + u8 bandwidth; + u8 prime_channel_offset; + u8 txpoweridx; + u8 txpoweridx_b; + u8 rateidx; + u32 preamble; +// u8 modem; + u32 CrystalCap; +// u32 curr_crystalcap; + + u16 antenna_tx; + u16 antenna_rx; +// u8 curr_rfpath; + + u8 check_mp_pkt; + + u8 bSetTxPower; + u8 bCCKTxPowerAdjust; + u8 bFAStatistics; +// uint ForcedDataRate; + u8 mp_dm; + struct wlan_network mp_network; + NDIS_802_11_MAC_ADDRESS network_macaddr; + +#ifdef PLATFORM_WINDOWS + u32 rx_testcnt; + u32 rx_testcnt1; + u32 rx_testcnt2; + u32 tx_testcnt; + u32 tx_testcnt1; + + struct mp_wi_cntx wi_cntx; + + u8 h2c_result; + u8 h2c_seqnum; + u16 h2c_cmdcode; + u8 h2c_resp_parambuf[512]; + _lock h2c_lock; + _lock wkitm_lock; + u32 h2c_cmdcnt; + NDIS_EVENT h2c_cmd_evt; + NDIS_EVENT c2h_set; + NDIS_EVENT h2c_clr; + NDIS_EVENT cpwm_int; + + NDIS_EVENT scsir_full_evt; + NDIS_EVENT scsiw_empty_evt; +#endif + + u8 *pallocated_mp_xmitframe_buf; + u8 *pmp_xmtframe_buf; + _queue free_mp_xmitqueue; + u32 free_mp_xmitframe_cnt; + + MPT_CONTEXT MptCtx; +}; + +typedef struct _IOCMD_STRUCT_ { + u8 cmdclass; + u16 value; + u8 index; +}IOCMD_STRUCT; + +struct rf_reg_param { + u32 path; + u32 offset; + u32 value; +}; + +struct bb_reg_param { + u32 offset; + u32 value; +}; +//======================================================================= + +#define LOWER _TRUE +#define RAISE _FALSE + +/* Hardware Registers */ +#if 0 +#if 0 +#define IOCMD_CTRL_REG 0x102502C0 +#define IOCMD_DATA_REG 0x102502C4 +#else +#define IOCMD_CTRL_REG 0x10250370 +#define IOCMD_DATA_REG 0x10250374 +#endif + +#define IOCMD_GET_THERMAL_METER 0xFD000028 + +#define IOCMD_CLASS_BB_RF 0xF0 +#define IOCMD_BB_READ_IDX 0x00 +#define IOCMD_BB_WRITE_IDX 0x01 +#define IOCMD_RF_READ_IDX 0x02 +#define IOCMD_RF_WRIT_IDX 0x03 +#endif +#define BB_REG_BASE_ADDR 0x800 + +/* MP variables */ +#if 0 +#define _2MAC_MODE_ 0 +#define _LOOPBOOK_MODE_ 1 +#endif +typedef enum _MP_MODE_ { + MP_OFF, + MP_ON, + MP_ERR, + MP_CONTINUOUS_TX, + MP_SINGLE_CARRIER_TX, + MP_CARRIER_SUPPRISSION_TX, + MP_SINGLE_TONE_TX, + MP_PACKET_TX, + MP_PACKET_RX +} MP_MODE; + + +#define MAX_RF_PATH_NUMS MAX_RF_PATH + + +extern u8 mpdatarate[NumRates]; + +/* MP set force data rate base on the definition. */ +typedef enum _MPT_RATE_INDEX +{ + /* CCK rate. */ + MPT_RATE_1M, /* 0 */ + MPT_RATE_2M, + MPT_RATE_55M, + MPT_RATE_11M, /* 3 */ + + /* OFDM rate. */ + MPT_RATE_6M, /* 4 */ + MPT_RATE_9M, + MPT_RATE_12M, + MPT_RATE_18M, + MPT_RATE_24M, + MPT_RATE_36M, + MPT_RATE_48M, + MPT_RATE_54M, /* 11 */ + + /* HT rate. */ + MPT_RATE_MCS0, /* 12 */ + MPT_RATE_MCS1, + MPT_RATE_MCS2, + MPT_RATE_MCS3, + MPT_RATE_MCS4, + MPT_RATE_MCS5, + MPT_RATE_MCS6, + MPT_RATE_MCS7, /* 19 */ + MPT_RATE_MCS8, + MPT_RATE_MCS9, + MPT_RATE_MCS10, + MPT_RATE_MCS11, + MPT_RATE_MCS12, + MPT_RATE_MCS13, + MPT_RATE_MCS14, + MPT_RATE_MCS15, /* 27 */ + MPT_RATE_LAST +}MPT_RATE_E, *PMPT_RATE_E; + +#define MAX_TX_PWR_INDEX_N_MODE 64 // 0x3F + +typedef enum _POWER_MODE_ { + POWER_LOW = 0, + POWER_NORMAL +}POWER_MODE; + + +#define RX_PKT_BROADCAST 1 +#define RX_PKT_DEST_ADDR 2 +#define RX_PKT_PHY_MATCH 3 + +#if 0 +#define RPTMaxCount 0x000FFFFF; + +// parameter 1 : BitMask +// bit 0 : OFDM PPDU +// bit 1 : OFDM False Alarm +// bit 2 : OFDM MPDU OK +// bit 3 : OFDM MPDU Fail +// bit 4 : CCK PPDU +// bit 5 : CCK False Alarm +// bit 6 : CCK MPDU ok +// bit 7 : CCK MPDU fail +// bit 8 : HT PPDU counter +// bit 9 : HT false alarm +// bit 10 : HT MPDU total +// bit 11 : HT MPDU OK +// bit 12 : HT MPDU fail +// bit 15 : RX full drop +typedef enum _RXPHY_BITMASK_ +{ + OFDM_PPDU_BIT = 0, + OFDM_FALSE_BIT, + OFDM_MPDU_OK_BIT, + OFDM_MPDU_FAIL_BIT, + CCK_PPDU_BIT, + CCK_FALSE_BIT, + CCK_MPDU_OK_BIT, + CCK_MPDU_FAIL_BIT, + HT_PPDU_BIT, + HT_FALSE_BIT, + HT_MPDU_BIT, + HT_MPDU_OK_BIT, + HT_MPDU_FAIL_BIT, +} RXPHY_BITMASK; +#endif + +typedef enum _ENCRY_CTRL_STATE_ { + HW_CONTROL, //hw encryption& decryption + SW_CONTROL, //sw encryption& decryption + HW_ENCRY_SW_DECRY, //hw encryption & sw decryption + SW_ENCRY_HW_DECRY //sw encryption & hw decryption +}ENCRY_CTRL_STATE; + +typedef enum _PREAMBLE { + Long_Preamble = 0x01, + Short_Preamble , + Long_GI , + Short_GI +} PREAMBLE; + + + +//======================================================================= +//extern struct mp_xmit_frame *alloc_mp_xmitframe(struct mp_priv *pmp_priv); +//extern int free_mp_xmitframe(struct xmit_priv *pxmitpriv, struct mp_xmit_frame *pmp_xmitframe); + +extern s32 init_mp_priv(_adapter * padapter); +extern void free_mp_priv(struct mp_priv *pmp_priv); +extern s32 MPT_InitializeAdapter(_adapter * padapter, u8 Channel); +extern void MPT_DeInitAdapter(_adapter * padapter); +extern s32 mp_start_test(_adapter * padapter); +extern void mp_stop_test(_adapter * padapter); + +//======================================================================= +//extern void IQCalibrateBcut(_adapter * pAdapter); + +//extern u32 bb_reg_read(_adapter * Adapter, u16 offset); +//extern u8 bb_reg_write(_adapter * Adapter, u16 offset, u32 value); +//extern u32 rf_reg_read(_adapter * Adapter, u8 path, u8 offset); +//extern u8 rf_reg_write(_adapter * Adapter, u8 path, u8 offset, u32 value); + +//extern u32 get_bb_reg(_adapter * Adapter, u16 offset, u32 bitmask); +//extern u8 set_bb_reg(_adapter * Adapter, u16 offset, u32 bitmask, u32 value); +//extern u32 get_rf_reg(_adapter * Adapter, u8 path, u8 offset, u32 bitmask); +//extern u8 set_rf_reg(_adapter * Adapter, u8 path, u8 offset, u32 bitmask, u32 value); + +extern u32 _read_rfreg(_adapter * padapter, u8 rfpath, u32 addr, u32 bitmask); +extern void _write_rfreg(_adapter * padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val); + +extern u32 read_macreg(_adapter *padapter, u32 addr, u32 sz); +extern void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz); +extern u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask); +extern void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val); +extern u32 read_rfreg(_adapter * padapter, u8 rfpath, u32 addr); +extern void write_rfreg(_adapter * padapter, u8 rfpath, u32 addr, u32 val); + +extern void SetChannel(_adapter * pAdapter); +extern void SetBandwidth(_adapter * pAdapter); +extern void SetTxPower(_adapter * pAdapter); +extern void SetAntennaPathPower(_adapter * pAdapter); +//extern void SetTxAGCOffset(_adapter * pAdapter, u32 ulTxAGCOffset); +extern void SetDataRate(_adapter * pAdapter); + +extern void SetAntenna(_adapter * pAdapter); + +//extern void SetCrystalCap(_adapter * pAdapter); + +extern s32 SetThermalMeter(_adapter * pAdapter, u8 target_ther); +extern void GetThermalMeter(_adapter * pAdapter, u8 *value); + +extern void SetContinuousTx(_adapter * pAdapter, u8 bStart); +extern void SetSingleCarrierTx(_adapter * pAdapter, u8 bStart); +extern void SetSingleToneTx(_adapter * pAdapter, u8 bStart); +extern void SetCarrierSuppressionTx(_adapter * pAdapter, u8 bStart); +extern void PhySetTxPowerLevel(_adapter * pAdapter); + +extern void fill_txdesc_for_mp(_adapter * padapter, struct tx_desc *ptxdesc); +extern void SetPacketTx(_adapter * padapter); +extern void SetPacketRx(_adapter * pAdapter, u8 bStartRx); + +extern void ResetPhyRxPktCount(_adapter * pAdapter); +extern u32 GetPhyRxPktReceived(_adapter * pAdapter); +extern u32 GetPhyRxPktCRC32Error(_adapter * pAdapter); + +extern s32 SetPowerTracking(_adapter * padapter, u8 enable); +extern void GetPowerTracking(_adapter * padapter, u8 *enable); + +extern u32 mp_query_psd(_adapter * pAdapter, u8 *data); + + +extern void Hal_SetAntenna(_adapter * pAdapter); +extern void Hal_SetBandwidth(_adapter * pAdapter); + +extern void Hal_SetTxPower(_adapter * pAdapter); +extern void Hal_SetCarrierSuppressionTx(_adapter * pAdapter, u8 bStart); +extern void Hal_SetSingleToneTx ( _adapter * pAdapter , u8 bStart ); +extern void Hal_SetSingleCarrierTx (_adapter * pAdapter, u8 bStart); +extern void Hal_SetContinuousTx (_adapter * pAdapter, u8 bStart); +extern void Hal_SetBandwidth(_adapter * pAdapter); + +extern void Hal_SetDataRate(_adapter * pAdapter); +extern void Hal_SetChannel(_adapter * pAdapter); +extern void Hal_SetAntennaPathPower(_adapter * pAdapter); +extern s32 Hal_SetThermalMeter(_adapter * pAdapter, u8 target_ther); +extern s32 Hal_SetPowerTracking(_adapter * padapter, u8 enable); +extern void Hal_GetPowerTracking(_adapter * padapter, u8 * enable); +extern void Hal_GetThermalMeter(_adapter * pAdapter, u8 *value); +extern void Hal_mpt_SwitchRfSetting(_adapter * pAdapter); +extern void Hal_MPT_CCKTxPowerAdjust(_adapter * Adapter); +extern void Hal_MPT_CCKTxPowerAdjustbyIndex(_adapter * pAdapter, BOOLEAN beven); +extern void Hal_SetCCKTxPower(_adapter * pAdapter, u8 * TxPower); +extern void Hal_SetOFDMTxPower(_adapter * pAdapter, u8 * TxPower); +extern void Hal_TriggerRFThermalMeter(_adapter * pAdapter); +extern u8 Hal_ReadRFThermalMeter(_adapter * pAdapter); +extern void Hal_SetCCKContinuousTx(_adapter * pAdapter, u8 bStart); +extern void Hal_SetOFDMContinuousTx(_adapter * pAdapter, u8 bStart); +extern void Hal_ProSetCrystalCap (_adapter * pAdapter , u32 CrystalCapVal); +extern void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv); +extern void MP_PHY_SetRFPathSwitch(_adapter * pAdapter ,BOOLEAN bMain); +extern u32 mpt_ProQueryCalTxPower(_adapter * pAdapter, u8 RfPath); +extern void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart); + +#endif //_RTW_MP_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_p2p.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_p2p.h new file mode 100644 index 0000000..610a75a --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_p2p.h @@ -0,0 +1,58 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTW_P2P_H_ +#define _RTW_P2P_H_ + +#define P2P_WILDCARD_SSID "DIRECT-" +#define P2P_WILDCARD_SSID_LEN 7 + +#define P2P_SEND_ACTION_AFTER_PROBE_RSP 1 + +#define RTW_P2P_SEND_ACTION_SUCCESS 0 +#define RTW_P2P_SEND_ACTION_FAILED 2 + +static inline bool rtw_p2p_chk_state(struct wifidirect_info *wdinfo, enum P2P_STATE state) +{ + return wdinfo->p2p_state == state; +} +static inline bool rtw_p2p_chk_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role) +{ + return wdinfo->role == role; +} + +extern void rtw_p2p_remain_on_channel(_adapter *padapter, u8 channel, u8 wait_time); +extern void rtw_p2p_cancel_remain_on_channel(_adapter *padapter); +extern void rtw_p2p_special_scan_param(_adapter *padapter, u8 channel, u8 *mac); +extern void rtw_p2p_set_p2p_role(_adapter *padapter, u32 role); +extern void rtw_p2p_set_p2p_state(_adapter *padapter, u32 state); +extern int rtw_p2p_send_mgnt(_adapter *padapter, u8 *data, u16 len, u16 flags); +extern void rtw_p2p_indicate_mgnt(_adapter *padapter, u8 *data, u16 len, u8 channel); +extern void rtw_indicate_sta_assoc(_adapter *padapter, u8 *addr, u8 *buf, u16 len); +extern void rtw_p2p_indicate_sta_disassoc(_adapter *padapter, u8 *addr); +extern void rtw_p2p_indicate_send_action_done(_adapter *padapter, u16 status); + +extern int rtw_p2p_init_mlme_ext(_adapter *padapter); +extern void rtw_p2p_deinit_mlme_ext(_adapter *padapter); +extern int rtw_init_p2p_wdinfo(_adapter *padapter); +extern void rtw_deinit_p2p_wdinfo(_adapter *padapter); +extern void rtw_p2p_pre_tx_scan_cmd_callback(_adapter *padapter); + +#endif //_RTW_P2P_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_promisc.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_promisc.h new file mode 100644 index 0000000..918d840 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_promisc.h @@ -0,0 +1,38 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef _RTW_PROMISC_H_ +#define _RTW_PROMISC_H_ +#include +#ifdef CONFIG_PROMISC +void promisc_deinit(_adapter *padapter); +//void promisc_set_enable(_adapter *padapter, u8 enabled, u8 len_used); +int promisc_recv_func(_adapter *padapter, union recv_frame *rframe); +#endif +int promisc_set(rtw_rcr_level_t enabled, void (*callback)(unsigned char*, unsigned int, void*), unsigned char len_used); +unsigned char is_promisc_enabled(void); +int promisc_get_fixed_channel(void * fixed_bssid, u8 * ssid, int *ssid_length); +void promisc_issue_probereq(void); +void promisc_issue_probersp(unsigned char *da); +void promisc_stop_tx_beacn(void); +void promisc_resume_tx_beacn(void); +void promisc_get_ap_info(rtw_result_t (*func)(char *ssid, u8 ssid_len, s16 rssi, char channel, char security)); +#endif //_RTW_PROMISC_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_psk.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_psk.h new file mode 100644 index 0000000..75c275d --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_psk.h @@ -0,0 +1,341 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef _RTW_PSK_H_ +#define _RTW_PSK_H_ + +#define GMK_LEN 32 +#define GTK_LEN 32 +#define PMK_LEN 32 +#define KEY_NONCE_LEN 32 +#define NumGroupKey 4 +#define KEY_RC_LEN 8 +#define KEY_IV_LEN 16 +#define KEY_RSC_LEN 8 +#define KEY_ID_LEN 8 +#define KEY_MIC_LEN 16 +#define KEY_MATERIAL_LEN 2 +#define PTK_LEN_EAPOLMIC 16 +#define PTK_LEN_EAPOLENC 16 +#define PTK_LEN_TKIP 64 +#define PTK_LEN_CCMP 48 +#define LIB1X_ETHER_EAPOL_TYPE 0x888E + +#define DescTypePos 0 +#define KeyInfoPos 1 +#define KeyLenPos 3 +#define ReplayCounterPos 5 +#define KeyNoncePos 13 +#define KeyIVPos 45 +#define KeyRSCPos 61 +#define KeyIDPos 69 +#define KeyMICPos 77 +#define KeyDataLenPos 93 +#define KeyDataPos 95 +#define LIB1X_EAPOL_VER 1 //0000 0001B +#define LIB1X_EAPOL_EAPPKT 0 //0000 0000B +#define LIB1X_EAPOL_START 1 //0000 0001B +#define LIB1X_EAPOL_LOGOFF 2 //0000 0010B +#define LIB1X_EAPOL_KEY 3 //0000 0011B +#define LIB1X_EAPOL_ENCASFALERT 4 //0000 0100B + + +#define A_SHA_DIGEST_LEN 20 +#define ETHER_HDRLEN 14 +#define LIB1X_EAPOL_HDRLEN 4 +#define INFO_ELEMENT_SIZE 128 +#define MAX_EAPOLMSG_LEN 512 +#define MAX_EAPOLKEYMSG_LEN (MAX_EAPOLMSG_LEN-(ETHER_HDRLEN+LIB1X_EAPOL_HDRLEN)) +#define EAPOLMSG_HDRLEN 95 //EAPOL-key payload length without KeyData +#define WPA_ELEMENT_ID 0xDD +#define WPA2_ELEMENT_ID 0x30 + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define ETHER_ADDRLEN 6 +#define PMK_EXPANSION_CONST "Pairwise key expansion" +#define PMK_EXPANSION_CONST_SIZE 22 +#define GMK_EXPANSION_CONST "Group key expansion" +#define GMK_EXPANSION_CONST_SIZE 19 +#define RANDOM_EXPANSION_CONST "Init Counter" +#define RANDOM_EXPANSION_CONST_SIZE 12 + +#define WLAN_REASON_MIC_FAILURE 14 +#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15 + +/* + 2008-12-16, For Corega CG-WLCB54GL 54Mbps NIC interoperability issue. + The behavior of this NIC when it connect to the other AP with WPA/TKIP is: + AP <----------------------> STA + .................... + ------------> Assoc Rsp (ok) + ------------> EAPOL-key (4-way msg 1) + <------------ unknown TKIP encryption data + ------------> EAPOL-key (4-way msg 1) + <------------ unknown TKIP encryption data + ..................... + <------------ disassoc (code=8, STA is leaving) when the 5 seconds timer timeout counting from Assoc_Rsp is got. + .................... + ------------> Assoc Rsp (ok) + <-----------> EAPOL-key (4-way handshake success) + + If MAX_RESEND_NUM=3, our AP will send disassoc (code=15, 4-way timeout) to STA before STA sending disassoc to AP. + And this NIC will always can not connect to our AP. + set MAX_RESEND_NUM=5 can fix this issue. + */ +//#define MAX_RESEND_NUM 3 +#define MAX_RESEND_NUM 5 +#define RESEND_TIME 1000 + +#define GK_REKEY_TIME 3600000 //Set rekey period to 1 hour + +typedef enum { + desc_type_RSN = 2, + desc_type_WPA = 254 +} DescTypeRSN; + +typedef enum { + type_Group = 0, + type_Pairwise = 1 +} KeyType; + +typedef enum { + key_desc_ver1 = 1, + key_desc_ver2 = 2 +} KeyDescVer; + +enum { + PSK_WPA = 1, + PSK_WPA2 = 2 +}; + +enum { + PSK_STATE_IDLE, + PSK_STATE_PTKSTART, + PSK_STATE_PTKINITNEGOTIATING, + PSK_STATE_PTKINITDONE, +}; + +enum { + PSK_GSTATE_REKEYNEGOTIATING, + PSK_GSTATE_REKEYESTABLISHED, + PSK_GSTATE_KEYERROR, +}; + +typedef struct _OCTET_STRING { + unsigned char *Octet; + int Length; +} OCTET_STRING; + +typedef union _LARGE_INTEGER { + unsigned char charData[8]; + struct { + unsigned long HighPart; + unsigned long LowPart; + } field; +} LARGE_INTEGER, *PLARGE_INTEGER; + +typedef union _OCTET16_INTEGER { + unsigned char charData[16]; + struct { + LARGE_INTEGER HighPart; + LARGE_INTEGER LowPart; + } field; +} OCTET16_INTEGER; + +typedef union _OCTET32_INTEGER { + unsigned char charData[32]; + struct { + OCTET16_INTEGER HighPart; + OCTET16_INTEGER LowPart; + } field; +} OCTET32_INTEGER; + +// group key info +typedef struct _wpa_global_info { + OCTET32_INTEGER Counter; +//Save PSK to global array +// unsigned char PSK[A_SHA_DIGEST_LEN * 2]; + int GTKAuthenticator; + int GKeyDoneStations; + int GInitAKeys; + int GUpdateStationKeys; + int GkeyReady; + OCTET_STRING AuthInfoElement; + unsigned char AuthInfoBuf[INFO_ELEMENT_SIZE]; + unsigned char MulticastCipher; + OCTET_STRING GNonce; + unsigned char GNonceBuf[KEY_NONCE_LEN]; + unsigned char GTK[NumGroupKey][GTK_LEN]; + unsigned char GMK[GMK_LEN]; + int GN; + int GM; + int GTKRekey; +#ifdef CONFIG_GK_REKEY + struct timer_list GKRekeyTimer; +#endif +} WPA_GLOBAL_INFO; + +// wpa sta info +typedef struct _wpa_sta_info { + int state; + int gstate; + int RSNEnabled; // bit0-WPA, bit1-WPA2 + int PInitAKeys; + unsigned char UnicastCipher; + LARGE_INTEGER CurrentReplayCounter; + LARGE_INTEGER ReplayCounterStarted; // david+1-12-2007 + OCTET_STRING ANonce; + OCTET_STRING SNonce; + unsigned char AnonceBuf[KEY_NONCE_LEN]; + unsigned char SnonceBuf[KEY_NONCE_LEN]; + unsigned char PMK[PMK_LEN]; + unsigned char PTK[PTK_LEN_TKIP]; + OCTET_STRING EAPOLMsgRecvd; + OCTET_STRING EAPOLMsgSend; + OCTET_STRING EapolKeyMsgRecvd; + OCTET_STRING EapolKeyMsgSend; + + unsigned char eapSendBuf[MAX_EAPOLMSG_LEN]; +// unsigned char eapRecvdBuf[MAX_EAPOLMSG_LEN]; + struct timer_list resendTimer; + int resendCnt; + int clientHndshkProcessing; + int clientHndshkDone; + int clientGkeyUpdate; + LARGE_INTEGER clientMICReportReplayCounter; +} WPA_STA_INFO; + +typedef struct _LIB1X_EAPOL_KEY +{ + unsigned char key_desc_ver; + unsigned char key_info[2]; + unsigned char key_len[2]; + unsigned char key_replay_counter[KEY_RC_LEN]; + unsigned char key_nounce[KEY_NONCE_LEN]; + unsigned char key_iv[KEY_IV_LEN]; + unsigned char key_rsc[KEY_RSC_LEN]; + unsigned char key_id[KEY_ID_LEN]; + unsigned char key_mic[KEY_MIC_LEN]; + unsigned char key_data_len[KEY_MATERIAL_LEN]; + unsigned char *key_data; +} lib1x_eapol_key; + +struct lib1x_eapol +{ + unsigned char protocol_version; + unsigned char packet_type; // This makes it odd in number ! + unsigned short packet_body_length; +}; + +struct wlan_ethhdr_t +{ + unsigned char daddr[WLAN_ETHADDR_LEN]; + unsigned char saddr[WLAN_ETHADDR_LEN]; + unsigned short type; +}; + +typedef enum{ + DOT11_PortStatus_Unauthorized, + DOT11_PortStatus_Authorized, + DOT11_PortStatus_Guest +}DOT11_PORT_STATUS; + +#ifdef CONFIG_MOVE_PSK_TO_ROM +static __inline__ OCTET_STRING SubStr(OCTET_STRING f, unsigned short s, unsigned short l) +{ + OCTET_STRING res; + + res.Length = l; + res.Octet = f.Octet + s; + + return res; +} +#endif + +#define SetSubStr(f,a,l) memcpy(f.Octet+l,a.Octet,a.Length) +#define GetKeyInfo0(f, mask) ((f.Octet[KeyInfoPos + 1] & mask) ? 1 : 0) +#define SetKeyInfo0(f,mask,b) (f.Octet[KeyInfoPos + 1] = (f.Octet[KeyInfoPos + 1] & ~mask) | ( b?mask:0x0) ) +#define GetKeyInfo1(f, mask) ((f.Octet[KeyInfoPos] & mask) ? 1 : 0) +#define SetKeyInfo1(f,mask,b) (f.Octet[KeyInfoPos] = (f.Octet[KeyInfoPos] & ~mask) | ( b?mask:0x0) ) + +// EAPOLKey +#define Message_DescType(f) (f.Octet[DescTypePos]) +#define Message_setDescType(f, type) (f.Octet[DescTypePos] = type) +// Key Information Filed +#define Message_KeyDescVer(f) (f.Octet[KeyInfoPos+1] & 0x07) +#define Message_setKeyDescVer(f, v) (f.Octet[KeyInfoPos+1] &= 0xf8) , f.Octet[KeyInfoPos+1] |= (v & 0x07) +#define Message_KeyType(f) GetKeyInfo0(f, 0x08) +#define Message_setKeyType(f, b) SetKeyInfo0(f,0x08,b) +#define Message_KeyIndex(f) ((f.Octet[KeyInfoPos+1] & 0x30) >> 4) & 0x03 +#define Message_setKeyIndex(f, v) (f.Octet[KeyInfoPos+1] &= 0xcf), f.Octet[KeyInfoPos+1] |= ((v<<4) & 0x30) +#define Message_setInstall(f, b) SetKeyInfo0(f,0x40,b) +#define Message_setKeyAck(f, b) SetKeyInfo0(f,0x80,b) + +#define Message_KeyMIC(f) GetKeyInfo1(f, 0x01) +#define Message_setKeyMIC(f, b) SetKeyInfo1(f,0x01,b) +#define Message_Secure(f) GetKeyInfo1(f,0x02) +#define Message_setSecure(f, b) SetKeyInfo1(f,0x02,b) +#define Message_Error(f) GetKeyInfo1(f,0x04) +#define Message_setError(f, b) SetKeyInfo1(f,0x04,b) +#define Message_Request(f) GetKeyInfo1(f,0x08) +#define Message_setRequest(f, b) SetKeyInfo1(f,0x08,b) +#define Message_setReserved(f, v) (f.Octet[KeyInfoPos] |= (v<<4&0xff)) +#define Message_KeyLength(f) ((unsigned short)(f.Octet[KeyLenPos] <<8) + (unsigned short)(f.Octet[KeyLenPos+1])) +#define Message_setKeyLength(f, v) (f.Octet[KeyLenPos] = (v&0xff00) >>8 , f.Octet[KeyLenPos+1] = (v&0x00ff)) + +#define Message_KeyNonce(f) SubStr(f, KeyNoncePos, KEY_NONCE_LEN) +#define Message_setKeyNonce(f, v) SetSubStr(f, v, KeyNoncePos) +#define Message_EqualKeyNonce(f1, f2) memcmp(f1.Octet + KeyNoncePos, f2.Octet, KEY_NONCE_LEN)? 0:1 +#define Message_setKeyIV(f, v) SetSubStr(f, v, KeyIVPos) +#define Message_setKeyRSC(f, v) SetSubStr(f, v, KeyRSCPos) +#define Message_setKeyID(f, v) SetSubStr(f, v, KeyIDPos) +#define Message_setMIC(f, v) SetSubStr(f, v, KeyMICPos) +#define Message_KeyDataLength(f) ((unsigned short)(f.Octet[KeyDataLenPos] <<8) + (unsigned short)(f.Octet[KeyDataLenPos+1])) +#define Message_setKeyDataLength(f, v) (f.Octet[KeyDataLenPos] = (v&0xff00) >>8 , f.Octet[KeyDataLenPos+1] = (v&0x00ff)) +#define Message_setKeyData(f, v) SetSubStr(f, v, KeyDataPos); + +#define Message_CopyReplayCounter(f1, f2) memcpy(f1.Octet + ReplayCounterPos, f2.Octet + ReplayCounterPos, KEY_RC_LEN) +#define Message_DefaultReplayCounter(li) (((li.field.HighPart == 0xffffffff) && (li.field.LowPart == 0xffffffff) ) ?1:0) + +#define GET_MY_HWADDR(padapter) ((padapter)->eeprompriv.mac_addr) +#define LargeIntegerOverflow(x) (x.field.HighPart == 0xffffffff) && (x.field.LowPart == 0xffffffff) +#define LargeIntegerZero(x) memset(&x.charData, 0, 8) +#define Octet16IntegerOverflow(x) LargeIntegerOverflow(x.field.HighPart) && LargeIntegerOverflow(x.field.LowPart) +#define Octet16IntegerZero(x) memset(&x.charData, 0, 16) +#define SetNonce(ocDst, oc32Counter) SetEAPOL_KEYIV(ocDst, oc32Counter) + +void ClientSendEAPOL(_adapter *padapter, struct sta_info *psta, int resend); +void SendEAPOL(_adapter *padapter, struct sta_info *psta, int resend); +void EAPOLKeyRecvd(_adapter *padapter, struct sta_info *psta); +void ClientEAPOLKeyRecvd(_adapter *padapter, struct sta_info *psta); +void init_wpa_sta_info(_adapter *padapter, struct sta_info *psta); +void psk_init(_adapter *padapter, unsigned char *pie, unsigned short ielen); +void psk_derive(_adapter *padapter, unsigned char *passphrase, unsigned char *ssid); +u16 psk_strip_rsn_pairwise(u8 *ie, u16 ie_len); +u16 psk_strip_wpa_pairwise(u8 *ie, u16 ie_len); + +#endif // _RTW_PSK_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_pwrctrl.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_pwrctrl.h new file mode 100644 index 0000000..c90c200 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_pwrctrl.h @@ -0,0 +1,386 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_PWRCTRL_H_ +#define __RTW_PWRCTRL_H_ + + +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif //CONFIG_HAS_EARLYSUSPEND + +#define FW_PWR0 0 +#define FW_PWR1 1 +#define FW_PWR2 2 +#define FW_PWR3 3 + + +#define HW_PWR0 7 +#define HW_PWR1 6 +#define HW_PWR2 2 +#define HW_PWR3 0 +#define HW_PWR4 8 + +#define FW_PWRMSK 0x7 + + +#define XMIT_ALIVE BIT(0) +#define RECV_ALIVE BIT(1) +#define CMD_ALIVE BIT(2) +#define EVT_ALIVE BIT(3) + + +enum Power_Mgnt +{ + PS_MODE_ACTIVE = 0 , + PS_MODE_MIN , + PS_MODE_MAX , + PS_MODE_DTIM , + PS_MODE_VOIP , + PS_MODE_UAPSD_WMM , + PS_MODE_UAPSD , + PS_MODE_IBSS , + PS_MODE_WWLAN , + PM_Radio_Off , + PM_Card_Disable , + PS_MODE_NUM +}; + + +/* + BIT[2:0] = HW state + BIT[3] = Protocol PS state, 0: register active state , 1: register sleep state + BIT[4] = sub-state +*/ + +#define PS_DPS BIT(0) +#define PS_LCLK (PS_DPS) +#define PS_RF_OFF BIT(1) +#define PS_ALL_ON BIT(2) +#define PS_ST_ACTIVE BIT(3) + +#define PS_ISR_ENABLE BIT(4) +#define PS_IMR_ENABLE BIT(5) +#define PS_ACK BIT(6) +#define PS_TOGGLE BIT(7) + +#define PS_STATE_MASK (0x0F) +#define PS_STATE_HW_MASK (0x07) +#define PS_SEQ_MASK (0xc0) + +#define PS_STATE(x) (PS_STATE_MASK & (x)) +#define PS_STATE_HW(x) (PS_STATE_HW_MASK & (x)) +#define PS_SEQ(x) (PS_SEQ_MASK & (x)) + +#define PS_STATE_S0 (PS_DPS) +#define PS_STATE_S1 (PS_LCLK) +#define PS_STATE_S2 (PS_RF_OFF) +#define PS_STATE_S3 (PS_ALL_ON) +#define PS_STATE_S4 ((PS_ST_ACTIVE) | (PS_ALL_ON)) + + +#define PS_IS_RF_ON(x) ((x) & (PS_ALL_ON)) +#define PS_IS_ACTIVE(x) ((x) & (PS_ST_ACTIVE)) +#define CLR_PS_STATE(x) ((x) = ((x) & (0xF0))) + + +struct reportpwrstate_parm { + unsigned char mode; + unsigned char state; //the CPWM value + unsigned short rsvd; +}; + + +typedef _sema _pwrlock; + + +__inline static void _init_pwrlock(_pwrlock *plock) +{ + rtw_init_sema(plock, 1); +} + +__inline static void _free_pwrlock(_pwrlock *plock) +{ + rtw_free_sema(plock); +} + + +__inline static void _enter_pwrlock(_pwrlock *plock) +{ + rtw_down_sema(plock); +} + + +__inline static void _exit_pwrlock(_pwrlock *plock) +{ + rtw_up_sema(plock); +} + +#define LPS_DELAY_TIME 1 // 1 sec + +#define EXE_PWR_NONE 0x01 +#define EXE_PWR_IPS 0x02 +#define EXE_PWR_LPS 0x04 + +// RF state. +typedef enum _rt_rf_power_state +{ + rf_on, // RF is on after RFSleep or RFOff + rf_sleep, // 802.11 Power Save mode + rf_off, // HW/SW Radio OFF or Inactive Power Save + //=====Add the new RF state above this line=====// + rf_max +}rt_rf_power_state; + +// RF Off Level for IPS or HW/SW radio off +#define RT_RF_OFF_LEVL_ASPM BIT(0) // PCI ASPM +#define RT_RF_OFF_LEVL_CLK_REQ BIT(1) // PCI clock request +#define RT_RF_OFF_LEVL_PCI_D3 BIT(2) // PCI D3 mode +#define RT_RF_OFF_LEVL_HALT_NIC BIT(3) // NIC halt, re-initialize hw parameters +#define RT_RF_OFF_LEVL_FREE_FW BIT(4) // FW free, re-download the FW +#define RT_RF_OFF_LEVL_FW_32K BIT(5) // FW in 32k +#define RT_RF_PS_LEVEL_ALWAYS_ASPM BIT(6) // Always enable ASPM and Clock Req in initialization. +#define RT_RF_LPS_DISALBE_2R BIT(30) // When LPS is on, disable 2R if no packet is received or transmittd. +#define RT_RF_LPS_LEVEL_ASPM BIT(31) // LPS with ASPM + +#define RT_IN_PS_LEVEL(ppsc, _PS_FLAG) ((ppsc->cur_ps_level & _PS_FLAG) ? _TRUE : _FALSE) +#define RT_CLEAR_PS_LEVEL(ppsc, _PS_FLAG) (ppsc->cur_ps_level &= (~(_PS_FLAG))) +#define RT_SET_PS_LEVEL(ppsc, _PS_FLAG) (ppsc->cur_ps_level |= _PS_FLAG) + + +enum _PS_BBRegBackup_ { + PSBBREG_RF0 = 0, + PSBBREG_RF1, + PSBBREG_RF2, + PSBBREG_AFE0, + PSBBREG_TOTALCNT +}; + +enum { // for ips_mode + IPS_NONE=0, + IPS_NORMAL, + IPS_LEVEL_2, + IPS_NUM +}; + +struct pwrctrl_priv +{ + _pwrlock lock; + volatile u8 rpwm; // requested power state for fw + volatile u8 cpwm; // fw current power state. updated when 1. read from HCPWM 2. driver lowers power level + volatile u8 tog; // toggling + volatile u8 cpwm_tog; // toggling + + u8 pwr_mode; + u8 smart_ps; + u8 bcn_ant_mode; + + u32 alives; + u64 wowlan_fw_iv; +//TODO +// _workitem cpwm_event; +#ifdef CONFIG_LPS_RPWM_TIMER + u8 brpwmtimeout; + _workitem rpwmtimeoutwi; + _timer pwr_rpwm_timer; +#endif // CONFIG_LPS_RPWM_TIMER + u8 bpower_saving; + + u8 b_hw_radio_off; + u8 reg_rfoff; + u8 reg_pdnmode; //powerdown mode + u32 rfoff_reason; + + //RF OFF Level + u32 cur_ps_level; + u32 reg_rfps_level; + + + +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) + //just for PCIE ASPM + u8 b_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00. + u8 b_support_backdoor; + + //just for PCIE ASPM + u8 const_amdpci_aspm; +#endif + + uint ips_enter_cnts; + uint ips_leave_cnts; + + u8 ps_enable; + u8 ips_mode; + u8 ips_org_mode; + u8 ips_mode_req; // used to accept the mode setting request, will update to ipsmode later + uint bips_processing; + u32 ips_deny_time; /* will deny IPS when system time is smaller than this */ + u8 ps_processing; /* temporarily used to mark whether in rtw_ps_processor */ + + u8 bLeisurePs; + u8 LpsIdleCount; + u8 power_mgnt; + u8 org_power_mgnt; + u8 bFwCurrentInPSMode; + u32 DelayLPSLastTimeStamp; + u8 btcoex_rfon; + s32 pnp_current_pwr_state; + u8 pnp_bstop_trx; + + + u8 bInternalAutoSuspend; + u8 bInSuspend; +#ifdef CONFIG_BT_COEXIST + u8 bAutoResume; + u8 autopm_cnt; +#endif + u8 bSupportRemoteWakeup; +#ifdef CONFIG_WOWLAN + u8 wowlan_txpause_status; + u8 wowlan_mode; + u8 wowlan_pattern; + u8 wowlan_magic; + u8 wowlan_unicast; + u8 wowlan_pattern_idx; + u8 wowlan_wake_reason; + u32 wowlan_pattern_context[8][5]; +#endif // CONFIG_WOWLAN + _timer pwr_state_check_timer; + int pwr_state_check_interval; + u8 pwr_state_check_cnts; + + int ps_flag; + + rt_rf_power_state rf_pwrstate;//cur power state + //rt_rf_power_state current_rfpwrstate; + rt_rf_power_state change_rfpwrstate; + + u8 wepkeymask; + u8 bHWPowerdown;//if support hw power down + u8 bHWPwrPindetect; + u8 bkeepfwalive; + u8 brfoffbyhw; + unsigned long PS_BBRegBackup[PSBBREG_TOTALCNT]; + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + struct workqueue_struct *rtw_workqueue; + _workitem resume_work; + #endif + + #ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; + u8 do_late_resume; + #endif //CONFIG_HAS_EARLYSUSPEND + + #ifdef CONFIG_ANDROID_POWER + android_early_suspend_t early_suspend; + u8 do_late_resume; + #endif + + #ifdef CONFIG_INTEL_PROXIM + u8 stored_power_mgnt; + #endif + + #ifdef TDMA_POWER_SAVING + u8 tdma_slot_period; + u8 tdma_rfon_period_len_1; + u8 tdma_rfon_period_len_2; + u8 tdma_rfon_period_len_3; + #endif + + u8 lps_dtim; +}; + +#define rtw_get_ips_mode_req(pwrctrlpriv) \ + (pwrctrlpriv)->ips_mode_req + +#define rtw_ips_mode_req(pwrctrlpriv, ips_mode) \ + (pwrctrlpriv)->ips_mode_req = (ips_mode) + +#define RTW_PWR_STATE_CHK_INTERVAL 2000 + +#define _rtw_set_pwr_state_check_timer(pwrctrlpriv, ms) \ + do { \ + /*DBG_871X("%s _rtw_set_pwr_state_check_timer(%p, %d)\n", __FUNCTION__, (pwrctrlpriv), (ms));*/ \ + rtw_set_timer(&(pwrctrlpriv)->pwr_state_check_timer, (ms)); \ + } while(0) + +#define rtw_set_pwr_state_check_timer(pwrctrlpriv) \ + _rtw_set_pwr_state_check_timer((pwrctrlpriv), (pwrctrlpriv)->pwr_state_check_interval) + +extern void rtw_init_pwrctrl_priv(_adapter *adapter); +extern void rtw_free_pwrctrl_priv(_adapter * adapter); + +#ifdef CONFIG_LPS_LCLK +extern s32 rtw_register_tx_alive(PADAPTER padapter); +extern void rtw_unregister_tx_alive(PADAPTER padapter); +extern s32 rtw_register_rx_alive(PADAPTER padapter); +extern void rtw_unregister_rx_alive(PADAPTER padapter); +extern s32 rtw_register_cmd_alive(PADAPTER padapter); +extern void rtw_unregister_cmd_alive(PADAPTER padapter); +extern s32 rtw_register_evt_alive(PADAPTER padapter); +extern void rtw_unregister_evt_alive(PADAPTER padapter); +extern void cpwm_int_hdl(PADAPTER padapter, struct reportpwrstate_parm *preportpwrstate); +extern void LPS_Leave_check(PADAPTER padapter); +#endif + +extern void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode); +extern void rtw_set_rpwm(_adapter * padapter, u8 val8); +extern void LeaveAllPowerSaveMode(PADAPTER Adapter); +#ifdef CONFIG_IPS +void ips_enter(_adapter * padapter); +int ips_leave(_adapter * padapter); +#endif + +void rtw_ps_processor(_adapter*padapter); + +#ifdef CONFIG_AUTOSUSPEND +int autoresume_enter(_adapter* padapter); +#endif +#ifdef SUPPORT_HW_RFOFF_DETECTED +rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter ); +#endif + + +#ifdef CONFIG_LPS +s32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms); +void LPS_Enter(PADAPTER padapter); +void LPS_Leave(PADAPTER padapter); +#endif + +#ifdef CONFIG_RESUME_IN_WORKQUEUE +void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv); +#endif //CONFIG_RESUME_IN_WORKQUEUE + +#if defined(CONFIG_HAS_EARLYSUSPEND ) || defined(CONFIG_ANDROID_POWER) +#define rtw_is_earlysuspend_registered(pwrpriv) (pwrpriv)->early_suspend.suspend +void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv); +void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv); +#endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER +//TODO +//u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val); +int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller); +#define rtw_pwr_wakeup(adapter) _rtw_pwr_wakeup(adapter, RTW_PWR_STATE_CHK_INTERVAL, __FUNCTION__) +int rtw_pm_set_ips(_adapter *padapter, u8 mode); +int rtw_pm_set_lps(_adapter *padapter, u8 mode); +int rtw_pm_set_tdma_param(_adapter *padapter, u8 tdma_slot_period, u8 tdma_rfon_period_len_1, u8 tdma_rfon_period_len_2, u8 tdma_rfon_period_len_3); +int rtw_pm_set_lps_dtim(_adapter *padapter, u8 lps_dtim); +u8 rtw_pm_get_lps_dtim(_adapter *padapter); +#endif //__RTL871X_PWRCTRL_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_qos.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_qos.h new file mode 100644 index 0000000..0d6c8c4 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_qos.h @@ -0,0 +1,33 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef _RTW_QOS_H_ +#define _RTW_QOS_H_ + +struct qos_priv { + + u32 qos_option; //bit mask option: u-apsd, s-apsd, ts, block ack... + +}; + + +#endif //_RTL871X_QOS_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_recv.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_recv.h new file mode 100644 index 0000000..523c4d0 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_recv.h @@ -0,0 +1,918 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTW_RECV_H_ +#define _RTW_RECV_H_ +#include + +#if defined(PLATFORM_ECOS) +#define NR_RECVFRAME 16 //Decrease recv frame due to memory limitation - Alex Fang +#elif defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) +#ifdef CONFIG_RECV_REORDERING_CTRL +#define NR_RECVFRAME 16 //Increase recv frame due to rx reorder - Andy Sun +#else +#if WIFI_LOGO_CERTIFICATION + #define NR_RECVFRAME 8 //Decrease recv frame due to memory limitation - Alex Fang +#else +#ifndef CONFIG_HIGH_TP + #define NR_RECVFRAME 2 //Decrease recv frame due to memory limitation - YangJue +#else + #define NR_RECVFRAME 256 +#endif +#endif +#endif +#else +#define NR_RECVFRAME 256 +#endif + +#ifdef PLATFORM_OS_XP + #define NR_RECVBUFF (16) +#elif defined(PLATFORM_OS_CE) + #define NR_RECVBUFF (4) +#elif defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) +#ifndef CONFIG_HIGH_TP +// #define NR_RECVBUFF (8) //Decrease recv buffer due to memory limitation - Alex Fang + #define NR_RECVBUFF (1) //Decrease recv buffer due to memory limitation - YangJue +#else + #define NR_RECVBUFF (32) +#endif +#else + #if (defined CONFIG_GSPI_HCI || defined CONFIG_SDIO_HCI) + #define NR_RECVBUFF (32) + #else + #define NR_RECVBUFF (4) + #endif + + #define NR_PREALLOC_RECV_SKB (8) +#endif + +#define RECV_BULK_IN_ADDR 0x80 +#define RECV_INT_IN_ADDR 0x81 + +#define PHY_RSSI_SLID_WIN_MAX 100 +#define PHY_LINKQUALITY_SLID_WIN_MAX 20 + +// Rx smooth factor +#define Rx_Smooth_Factor (20) + +#define RXFRAME_ALIGN 8 +#define RXFRAME_ALIGN_SZ (1<signal_stat_timer, (recvpriv)->signal_stat_sampling_interval) +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + +struct sta_recv_priv { + + _lock lock; + sint option; + + //_queue blk_strms[MAX_RX_NUMBLKS]; + _queue defrag_q; //keeping the fragment frame until defrag + + struct stainfo_rxcache rxcache; + + //uint sta_rx_bytes; + //uint sta_rx_pkts; + //uint sta_rx_fail; + +}; + +struct recv_buf +{ + _list list; + +// _lock recvbuf_lock; + +// u32 ref_cnt; + + PADAPTER adapter; + +// u8 *pbuf; +// u8 *pallocated_buf; + + u32 len; + u8 *phead; + u8 *pdata; + u8 *ptail; + u8 *pend; + +#ifdef CONFIG_USB_HCI + + #if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX)||defined(PLATFORM_FREEBSD) + PURB purb; + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ + u32 alloc_sz; + #endif + + #ifdef PLATFORM_OS_XP + PIRP pirp; + #endif + + #ifdef PLATFORM_OS_CE + USB_TRANSFER usb_transfer_read_port; + #endif + + u8 irp_pending; + int transfer_len; + +#endif + +#if defined(PLATFORM_LINUX) || defined(PLATFORM_ECOS) || defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) + _pkt *pskb; +// u8 reuse; +#endif +#ifdef PLATFORM_FREEBSD //skb solution + struct sk_buff *pskb; + u8 reuse; +#endif //PLATFORM_FREEBSD //skb solution +}; + +/* + head -----> + + data -----> + + payload + + tail -----> + + + end -----> + + len = (unsigned int )(tail - data); + +*/ +struct recv_frame_hdr +{ + _list list; +#ifndef CONFIG_BSD_RX_USE_MBUF + struct sk_buff *pkt; + struct sk_buff *pkt_newalloc; +#else // CONFIG_BSD_RX_USE_MBUF + _pkt *pkt; + _pkt *pkt_newalloc; +#endif // CONFIG_BSD_RX_USE_MBUF + + _adapter *adapter; + + u8 fragcnt; + + int frame_tag; + + struct rx_pkt_attrib attrib; + + uint len; + u8 *rx_head; + u8 *rx_data; + u8 *rx_tail; + u8 *rx_end; + + void *precvbuf; + + + // + struct sta_info *psta; +#ifdef CONFIG_RECV_REORDERING_CTRL + //for A-MPDU Rx reordering buffer control + struct recv_reorder_ctrl *preorder_ctrl; +#endif +#ifdef CONFIG_WAPI_SUPPORT + u8 UserPriority; + u8 WapiTempPN[16]; + u8 WapiSrcAddr[6]; + u8 bWapiCheckPNInDecrypt; + u8 bIsWaiPacket; +#endif + +}; + +union recv_frame{ + + union{ + _list list; + struct recv_frame_hdr hdr; + uint mem[RECVFRAME_HDR_ALIGN>>2]; + }u; + + //uint mem[MAX_RXSZ>>2]; + +}; + +typedef enum _RX_PACKET_TYPE{ + NORMAL_RX,//Normal rx packet + TX_REPORT1,//CCX + TX_REPORT2,//TX RPT + HIS_REPORT,// USB HISR RPT + C2H_PACKET +}RX_PACKET_TYPE, *PRX_PACKET_TYPE; + +extern union recv_frame *_rtw_alloc_recvframe (_queue *pfree_recv_queue); //get a free recv_frame from pfree_recv_queue +extern void rtw_init_recvframe(union recv_frame *precvframe ,struct recv_priv *precvpriv); +extern int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue); + +#define rtw_dequeue_recvframe(queue) rtw_alloc_recvframe(queue) +extern int _rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue); + +#ifdef CONFIG_TRACE_SKB +int __rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue); +union recv_frame *__rtw_alloc_recvframe (_queue *pfree_recv_queue); //get a free recv_frame from pfree_recv_queue + +#define rtw_enqueue_recvframe(precvframe, queue, Q) \ + do{\ + set_skb_list_flag(precvframe->u.hdr.pkt, SKBLIST_RECVFRAME_##Q);\ + __rtw_enqueue_recvframe(precvframe, queue);\ + }while (0) +#define rtw_alloc_recvframe(queue, precvframe, Q) \ + (\ + precvframe = __rtw_alloc_recvframe(queue),\ + precvframe ? clear_skb_list_flag(precvframe->u.hdr.pkt, SKBLIST_RECVFRAME_##Q):0,\ + precvframe\ + ) +#else +extern int rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue); +extern union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue); //get a free recv_frame from pfree_recv_queue +#endif + +extern void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue); +u32 rtw_free_uc_swdec_pending_queue(_adapter *adapter); + +#ifdef CONFIG_TRACE_SKB +sint _rtw_enqueue_recvbuf_to_head(struct recv_buf *precvbuf, _queue *queue); +sint _rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue); +struct recv_buf *_rtw_dequeue_recvbuf (_queue *queue); + +#define rtw_enqueue_recvbuf_to_head(precvbuf, queue, Q) \ + do{\ + set_skb_list_flag(precvbuf->pskb, SKBLIST_RECVBUF_##Q);\ + _rtw_enqueue_recvbuf_to_head(precvbuf, queue);\ + }while (0) +#define rtw_enqueue_recvbuf(precvbuf, queue, Q) \ + do{\ + set_skb_list_flag(precvbuf->pskb, SKBLIST_RECVBUF_##Q);\ + _rtw_enqueue_recvbuf(precvbuf, queue);\ + }while (0) +#define rtw_dequeue_recvbuf(queue, precvbuf, Q) \ + (\ + precvbuf = _rtw_dequeue_recvbuf(queue),\ + precvbuf ? clear_skb_list_flag(precvbuf->pskb, SKBLIST_RECVBUF_##Q):0,\ + precvbuf\ + ) + +#else +sint rtw_enqueue_recvbuf_to_head(struct recv_buf *precvbuf, _queue *queue); +sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue); +struct recv_buf *rtw_dequeue_recvbuf (_queue *queue); +#endif + +void rtw_reordering_ctrl_timeout_handler(void *pcontext); + + +__inline static u8 *get_rxmem(union recv_frame *precvframe) +{ + //always return rx_head... + if(precvframe==NULL) + return NULL; + + return precvframe->u.hdr.rx_head; +} + +__inline static u8 *get_rx_status(union recv_frame *precvframe) +{ + + return get_rxmem(precvframe); + +} + + + +__inline static u8 *get_recvframe_data(union recv_frame *precvframe) +{ + + //alwasy return rx_data + if(precvframe==NULL) + return NULL; + + return precvframe->u.hdr.rx_data; + +} + +//TODO +#if 0 + +__inline static u8 *recvframe_push(union recv_frame *precvframe, sint sz) +{ + // append data before rx_data + + /* add data to the start of recv_frame + * + * This function extends the used data area of the recv_frame at the buffer + * start. rx_data must be still larger than rx_head, after pushing. + */ + + if(precvframe==NULL) + return NULL; + + + precvframe->u.hdr.rx_data -= sz ; + if( precvframe->u.hdr.rx_data < precvframe->u.hdr.rx_head ) + { + precvframe->u.hdr.rx_data += sz ; + return NULL; + } + + precvframe->u.hdr.len +=sz; + + return precvframe->u.hdr.rx_data; + +} + +#endif //#if 0 + +__inline static u8 *recvframe_pull(union recv_frame *precvframe, sint sz) +{ + // rx_data += sz; move rx_data sz bytes hereafter + + //used for extract sz bytes from rx_data, update rx_data and return the updated rx_data to the caller + + + if(precvframe==NULL) + return NULL; + + + precvframe->u.hdr.rx_data += sz; + + if(precvframe->u.hdr.rx_data > precvframe->u.hdr.rx_tail) + { + precvframe->u.hdr.rx_data -= sz; + return NULL; + } + + precvframe->u.hdr.len -=sz; + + return precvframe->u.hdr.rx_data; + +} + +__inline static u8 *recvframe_put(union recv_frame *precvframe, sint sz) +{ + // rx_tai += sz; move rx_tail sz bytes hereafter + + //used for append sz bytes from ptr to rx_tail, update rx_tail and return the updated rx_tail to the caller + //after putting, rx_tail must be still larger than rx_end. + + if(precvframe==NULL) + return NULL; + + precvframe->u.hdr.rx_tail += sz; + + if(precvframe->u.hdr.rx_tail > precvframe->u.hdr.rx_end) + { + precvframe->u.hdr.rx_tail -= sz; + return NULL; + } + + precvframe->u.hdr.len +=sz; + + return precvframe->u.hdr.rx_tail; + +} + + + +__inline static u8 *recvframe_pull_tail(union recv_frame *precvframe, sint sz) +{ + // rmv data from rx_tail (by yitsen) + + //used for extract sz bytes from rx_end, update rx_end and return the updated rx_end to the caller + //after pulling, rx_end must be still larger than rx_data. + + if(precvframe==NULL) + return NULL; + + precvframe->u.hdr.rx_tail -= sz; + + if(precvframe->u.hdr.rx_tail < precvframe->u.hdr.rx_data) + { + precvframe->u.hdr.rx_tail += sz; + return NULL; + } + + precvframe->u.hdr.len -=sz; + + return precvframe->u.hdr.rx_tail; + +} + +__inline static _buffer * get_rxbuf_desc(union recv_frame *precvframe) +{ + _buffer * buf_desc = NULL; + + if(precvframe==NULL) + return NULL; +#ifdef PLATFORM_WINDOWS + NdisQueryPacket(precvframe->u.hdr.pkt, NULL, NULL, &buf_desc, NULL); +#endif + + return buf_desc; +} + + +__inline static union recv_frame *rxmem_to_recvframe(u8 *rxmem) +{ + //due to the design of 2048 bytes alignment of recv_frame, we can reference the union recv_frame + //from any given member of recv_frame. + // rxmem indicates the any member/address in recv_frame + + return (union recv_frame*)(((SIZE_PTR)rxmem >> RXFRAME_ALIGN) << RXFRAME_ALIGN); + +} + +__inline static union recv_frame *pkt_to_recvframe(_pkt *pkt) +{ + + u8 * buf_star = NULL; + union recv_frame * precv_frame = NULL; +#ifdef PLATFORM_WINDOWS + _buffer * buf_desc; + uint len; + + NdisQueryPacket(pkt, NULL, NULL, &buf_desc, &len); + NdisQueryBufferSafe(buf_desc, &buf_star, &len, HighPagePriority); +#endif + precv_frame = rxmem_to_recvframe((unsigned char*)buf_star); + + return precv_frame; +} + +__inline static u8 *pkt_to_recvmem(_pkt *pkt) +{ + // return the rx_head + + union recv_frame * precv_frame = pkt_to_recvframe(pkt); + + return precv_frame->u.hdr.rx_head; + +} + +__inline static u8 *pkt_to_recvdata(_pkt *pkt) +{ + // return the rx_data + + union recv_frame * precv_frame =pkt_to_recvframe(pkt); + + return precv_frame->u.hdr.rx_data; + +} + + +__inline static sint get_recvframe_len(union recv_frame *precvframe) +{ + return precvframe->u.hdr.len; +} + + +__inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex) +{ + s32 SignalPower; // in dBm. + +#ifndef CONFIG_SKIP_SIGNAL_SCALE_MAPPING + // Translate to dBm (x=0.9y-95). + SignalPower = (s32)((SignalStrengthIndex *18) /20); + SignalPower -= 95; +#else + /* Translate to dBm (x=y-100) */ + SignalPower = SignalStrengthIndex - 100; +#endif + + return SignalPower; +} + + +struct sta_info; + +extern void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv); +extern void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame); +int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe); + +void rtw_rxhandler(_adapter * padapter, struct recv_buf *precvbuf); +u32 rtw_free_buf_pending_queue(_adapter *adapter); + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_rf.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_rf.h new file mode 100644 index 0000000..a9f8220 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_rf.h @@ -0,0 +1,175 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_RF_H_ +#define __RTW_RF_H_ + + +#define OFDM_PHY 1 +#define MIXED_PHY 2 +#define CCK_PHY 3 + +#define NumRates (13) + +// slot time for 11g +#define SHORT_SLOT_TIME 9 +#define NON_SHORT_SLOT_TIME 20 + +#define RTL8711_RF_MAX_SENS 6 +#define RTL8711_RF_DEF_SENS 4 + +// +// We now define the following channels as the max channels in each channel plan. +// 2G, total 14 chnls +// {1,2,3,4,5,6,7,8,9,10,11,12,13,14} +// 5G, total 24 chnls +// {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165} +#define MAX_CHANNEL_NUM_2G 14 +#define MAX_CHANNEL_NUM_5G 24 +#if defined(NOT_SUPPORT_5G) +#define MAX_CHANNEL_NUM 14 +#else +#define MAX_CHANNEL_NUM 38//14+24 +#endif + +//#define NUM_REGULATORYS 21 +#define NUM_REGULATORYS 1 + +//Country codes +#define USA 0x555320 +#define EUROPE 0x1 //temp, should be provided later +#define JAPAN 0x2 //temp, should be provided later + +struct regulatory_class { + u32 starting_freq; //MHz, + u8 channel_set[MAX_CHANNEL_NUM]; + u8 channel_cck_power[MAX_CHANNEL_NUM];//dbm + u8 channel_ofdm_power[MAX_CHANNEL_NUM];//dbm + u8 txpower_limit; //dbm + u8 channel_spacing; //MHz + u8 modem; +}; + +typedef enum _CAPABILITY{ + cESS = 0x0001, + cIBSS = 0x0002, + cPollable = 0x0004, + cPollReq = 0x0008, + cPrivacy = 0x0010, + cShortPreamble = 0x0020, + cPBCC = 0x0040, + cChannelAgility = 0x0080, + cSpectrumMgnt = 0x0100, + cQos = 0x0200, // For HCCA, use with CF-Pollable and CF-PollReq + cShortSlotTime = 0x0400, + cAPSD = 0x0800, + cRM = 0x1000, // RRM (Radio Request Measurement) + cDSSS_OFDM = 0x2000, + cDelayedBA = 0x4000, + cImmediateBA = 0x8000, +}CAPABILITY, *PCAPABILITY; + +enum _REG_PREAMBLE_MODE{ + PREAMBLE_LONG = 1, + PREAMBLE_AUTO = 2, + PREAMBLE_SHORT = 3, +}; + + +enum _RTL8712_RF_MIMO_CONFIG_{ + RTL8712_RFCONFIG_1T=0x10, + RTL8712_RFCONFIG_2T=0x20, + RTL8712_RFCONFIG_1R=0x01, + RTL8712_RFCONFIG_2R=0x02, + RTL8712_RFCONFIG_1T1R=0x11, + RTL8712_RFCONFIG_1T2R=0x12, + RTL8712_RFCONFIG_TURBO=0x92, + RTL8712_RFCONFIG_2T2R=0x22 +}; + + +typedef enum _RF90_RADIO_PATH{ + RF90_PATH_A = 0, //Radio Path A + RF90_PATH_B = 1, //Radio Path B + RF90_PATH_C = 2, //Radio Path C + RF90_PATH_D = 3 //Radio Path D + //RF90_PATH_MAX //Max RF number 90 support +}RF90_RADIO_PATH_E, *PRF90_RADIO_PATH_E; + +// Bandwidth Offset +#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 +#define HAL_PRIME_CHNL_OFFSET_LOWER 1 +#define HAL_PRIME_CHNL_OFFSET_UPPER 2 + +// Represent Channel Width in HT Capabilities +// +typedef enum _CHANNEL_WIDTH{ + CHANNEL_WIDTH_20 = 0, + CHANNEL_WIDTH_40 = 1, + CHANNEL_WIDTH_80 = 2, + CHANNEL_WIDTH_160 = 3, + CHANNEL_WIDTH_80_80 = 4, + CHANNEL_WIDTH_MAX = 5, +}CHANNEL_WIDTH, *PCHANNEL_WIDTH; + +// +// Represent Extention Channel Offset in HT Capabilities +// This is available only in 40Mhz mode. +// +typedef enum _EXTCHNL_OFFSET{ + EXTCHNL_OFFSET_NO_EXT = 0, + EXTCHNL_OFFSET_UPPER = 1, + EXTCHNL_OFFSET_NO_DEF = 2, + EXTCHNL_OFFSET_LOWER = 3, +}EXTCHNL_OFFSET, *PEXTCHNL_OFFSET; + +typedef enum _VHT_DATA_SC{ + VHT_DATA_SC_DONOT_CARE = 0, + VHT_DATA_SC_20_UPPER_OF_80MHZ = 1, + VHT_DATA_SC_20_LOWER_OF_80MHZ = 2, + VHT_DATA_SC_20_UPPERST_OF_80MHZ = 3, + VHT_DATA_SC_20_LOWEST_OF_80MHZ = 4, + VHT_DATA_SC_20_RECV1 = 5, + VHT_DATA_SC_20_RECV2 = 6, + VHT_DATA_SC_20_RECV3 = 7, + VHT_DATA_SC_20_RECV4 = 8, + VHT_DATA_SC_40_UPPER_OF_80MHZ = 9, + VHT_DATA_SC_40_LOWER_OF_80MHZ = 10, +}VHT_DATA_SC, *PVHT_DATA_SC_E; + + + +/* 2007/11/15 MH Define different RF type. */ +typedef enum _RT_RF_TYPE_DEFINITION +{ + RF_1T2R = 0, + RF_2T4R = 1, + RF_2T2R = 2, + RF_1T1R = 3, + RF_2T2R_GREEN = 4, + RF_819X_MAX_TYPE = 5, +}RT_RF_TYPE_DEF_E; + + +u32 rtw_ch2freq(u32 ch); +u32 rtw_freq2ch(u32 freq); + + +#endif //_RTL8711_RF_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_security.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_security.h new file mode 100644 index 0000000..958be9d --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_security.h @@ -0,0 +1,446 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_SECURITY_H_ +#define __RTW_SECURITY_H_ + + +#define _NO_PRIVACY_ 0x0 +#define _WEP40_ 0x1 +#define _TKIP_ 0x2 +#define _TKIP_WTMIC_ 0x3 +#define _AES_ 0x4 +#define _WEP104_ 0x5 +#define _WEP_WPA_MIXED_ 0x07 // WEP + WPA +#define _SMS4_ 0x06 + +#define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_)) + +#define _WPA_IE_ID_ 0xdd +#define _WPA2_IE_ID_ 0x30 + +#define SHA256_MAC_LEN 32 +#define AES_BLOCK_SIZE 16 +#define AES_PRIV_SIZE (4 * 44) +#define _AES_IV_LEN_ 8 + +typedef enum { + ENCRYP_PROTOCOL_OPENSYS, //open system + ENCRYP_PROTOCOL_WEP, //WEP + ENCRYP_PROTOCOL_WPA, //WPA + ENCRYP_PROTOCOL_WPA2, //WPA2 + ENCRYP_PROTOCOL_WAPI, //WAPI: Not support in this version + ENCRYP_PROTOCOL_MAX +}ENCRYP_PROTOCOL_E; + + +#ifndef Ndis802_11AuthModeWPA2 +#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1) +#endif + +#ifndef Ndis802_11AuthModeWPA2PSK +#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2) +#endif + +union pn48 { + + u64 val; + +#ifdef CONFIG_LITTLE_ENDIAN + +struct { + u8 TSC0; + u8 TSC1; + u8 TSC2; + u8 TSC3; + u8 TSC4; + u8 TSC5; + u8 TSC6; + u8 TSC7; +} _byte_; + +#elif defined(CONFIG_BIG_ENDIAN) + +struct { + u8 TSC7; + u8 TSC6; + u8 TSC5; + u8 TSC4; + u8 TSC3; + u8 TSC2; + u8 TSC1; + u8 TSC0; +} _byte_; + +#endif + +}; + +union Keytype { + u8 skey[16]; + u32 lkey[4]; +}; + + +typedef struct _RT_PMKID_LIST +{ + u8 bUsed; + u8 Bssid[6]; + u8 PMKID[16]; + u8 SsidBuf[33]; + u8* ssid_octet; + u16 ssid_length; +} RT_PMKID_LIST, *PRT_PMKID_LIST; + + +struct security_priv +{ + u32 dot11AuthAlgrthm; // 802.11 auth, could be open, shared, 8021x and authswitch + u32 dot11PrivacyAlgrthm; // This specify the privacy for shared auth. algorithm. + + /* WEP */ + u32 dot11PrivacyKeyIndex; // this is only valid for legendary wep, 0~3 for key id. (tx key index) + union Keytype dot11DefKey[4]; // this is only valid for def. key + u32 dot11DefKeylen[4]; + + u32 dot118021XGrpPrivacy; // This specify the privacy algthm. used for Grp key + u32 dot118021XGrpKeyid; // key id used for Grp Key ( tx key index) + union Keytype dot118021XGrpKey[4]; // 802.1x Group Key, for inx0 and inx1 + union Keytype dot118021XGrptxmickey[4]; + union Keytype dot118021XGrprxmickey[4]; + union pn48 dot11Grptxpn; // PN48 used for Grp Key xmit. + union pn48 dot11Grprxpn; // PN48 used for Grp Key recv. + +#ifdef CONFIG_AP_MODE + //extend security capabilities for AP_MODE + unsigned int dot8021xalg;//0:disable, 1:psk, 2:802.1x + unsigned int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2 + unsigned int wpa_group_cipher; + unsigned int wpa2_group_cipher; + unsigned int wpa_pairwise_cipher; + unsigned int wpa2_pairwise_cipher; +#endif + +#ifdef CONFIG_WPS + u8 wps_ie[MAX_WPS_IE_LEN];//added in assoc req + int wps_ie_len; +#endif + + u8 binstallGrpkey; + u8 busetkipkey; + //_timer tkip_timer; + u8 bcheck_grpkey; + u8 bgrpkey_handshake; + + //u8 packet_cnt;//unused, removed + + s32 sw_encrypt;//from registry_priv + s32 sw_decrypt;//from registry_priv + + s32 hw_decrypted;//if the rx packets is hw_decrypted==_FALSE, it means the hw has not been ready. + + + //keeps the auth_type & enc_status from upper layer ioctl(wpa_supplicant or wzc) + u32 ndisauthtype; // NDIS_802_11_AUTHENTICATION_MODE + u32 ndisencryptstatus; // NDIS_802_11_ENCRYPTION_STATUS + + //WLAN_BSSID_EX sec_bss; //for joinbss (h2c buffer) usage //YJ,del,140410 + + NDIS_802_11_WEP ndiswep; +#ifdef PLATFORM_WINDOWS + u8 KeyMaterial[16];// variable length depending on above field. +#endif + +//TODO +#if 0 //Remove unused wpa2 data - Alex Fang + u8 assoc_info[600]; + u8 szofcapability[256]; //for wpa2 usage + u8 oidassociation[512]; //for wpa/wpa2 usage + u8 authenticator_ie[256]; //store ap security information element +#endif + u8 supplicant_ie[256]; //store sta security information element + + + //for tkip countermeasure + u32 last_mic_err_time; + u8 btkip_countermeasure; + u8 btkip_wait_report; + u32 btkip_countermeasure_time; +#ifdef CONFIG_WPA2_PREAUTH + //--------------------------------------------------------------------------- + // For WPA2 Pre-Authentication. + //--------------------------------------------------------------------------- + //u8 RegEnablePreAuth; // Default value: Pre-Authentication enabled or not, from registry "EnablePreAuth". Added by Annie, 2005-11-01. + //u8 EnablePreAuthentication; // Current Value: Pre-Authentication enabled or not. + RT_PMKID_LIST PMKIDList[NUM_PMKID_CACHE]; // Renamed from PreAuthKey[NUM_PRE_AUTH_KEY]. Annie, 2006-10-13. + u8 PMKIDIndex; + //u32 PMKIDCount; // Added by Annie, 2006-10-13. + //u8 szCapability[256]; // For WPA2-PSK using zero-config, by Annie, 2005-09-20. +#endif + +#ifdef CONFIG_INCLUDE_WPA_PSK + WPA_GLOBAL_INFO wpa_global_info; +#if defined(CONFIG_AP_MODE) && defined(CONFIG_MULTIPLE_WPA_STA) +// WPA_STA_INFO wpa_sta_info[AP_STA_NUM]; + u8 *palloc_wpastainfo_buf; + u32 alloc_wpastainfo_size; + WPA_STA_INFO *wpa_sta_info[NUM_STA-2]; +#else + WPA_STA_INFO wpa_sta_info; +#endif + u8 wpa_passphrase[IW_PASSPHRASE_MAX_SIZE + 1]; +#endif +#ifdef CONFIG_WPS + u8 wps_phase; +#endif +}; + +struct sha256_state { + u64 length; + u32 state[8], curlen; + u8 buf[64]; +}; + + +#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\ +do{\ + switch(psecuritypriv->dot11AuthAlgrthm)\ + {\ + case dot11AuthAlgrthm_Open:\ + case dot11AuthAlgrthm_Shared:\ + case dot11AuthAlgrthm_Auto:\ + encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\ + break;\ + case dot11AuthAlgrthm_8021X:\ + if(bmcst)\ + encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\ + else\ + encry_algo =(u8) psta->dot118021XPrivacy;\ + break;\ + case dot11AuthAlgrthm_WAPI:\ + encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\ + break;\ + }\ +}while(0) + + +#define SET_ICE_IV_LEN( iv_len, icv_len, encrypt)\ +do{\ + switch(encrypt)\ + {\ + case _WEP40_:\ + case _WEP104_:\ + iv_len = 4;\ + icv_len = 4;\ + break;\ + case _TKIP_:\ + iv_len = 8;\ + icv_len = 4;\ + break;\ + case _AES_:\ + iv_len = 8;\ + icv_len = 8;\ + break;\ + case _SMS4_:\ + iv_len = 18;\ + icv_len = 16;\ + break;\ + default:\ + iv_len = 0;\ + icv_len = 0;\ + break;\ + }\ +}while(0) + + +#define GET_TKIP_PN(iv,dot11txpn)\ +do{\ + dot11txpn._byte_.TSC0=iv[2];\ + dot11txpn._byte_.TSC1=iv[0];\ + dot11txpn._byte_.TSC2=iv[4];\ + dot11txpn._byte_.TSC3=iv[5];\ + dot11txpn._byte_.TSC4=iv[6];\ + dot11txpn._byte_.TSC5=iv[7];\ +}while(0) + + +#define ROL32( A, n ) ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) ) +#define ROR32( A, n ) ROL32( (A), 32-(n) ) + +extern const u32 Te0[256]; +extern const u32 Te1[256]; +extern const u32 Te2[256]; +extern const u32 Te3[256]; +extern const u32 Te4[256]; +extern const u32 Td0[256]; +extern const u32 Td1[256]; +extern const u32 Td2[256]; +extern const u32 Td3[256]; +extern const u32 Td4[256]; +extern const u32 rcon[10]; +extern const u8 Td4s[256]; +extern const u8 rcons[10]; + +#define RCON(i) (rcons[(i)] << 24) + +static inline u32 rotr(u32 val, int bits) +{ + return (val >> bits) | (val << (32 - bits)); +} + +#define TE0(i) Te0[((i) >> 24) & 0xff] +#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8) +#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16) +#define TE3(i) rotr(Te0[(i) & 0xff], 24) +#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000) +#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000) +#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00) +#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff) +#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000) +#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000) +#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00) +#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff) +#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff) + +#define TD0(i) Td0[((i) >> 24) & 0xff] +#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8) +#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16) +#define TD3(i) rotr(Td0[(i) & 0xff], 24) +#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24) +#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16) +#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8) +#define TD44(i) (Td4s[(i) & 0xff]) +#define TD0_(i) Td0[(i) & 0xff] +#define TD1_(i) rotr(Td0[(i) & 0xff], 8) +#define TD2_(i) rotr(Td0[(i) & 0xff], 16) +#define TD3_(i) rotr(Td0[(i) & 0xff], 24) + +#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \ + ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) + +#define PUTU32(ct, st) { \ +(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \ +(ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } + +#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ + (((u32) (a)[2]) << 8) | ((u32) (a)[3])) + +#define WPA_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_PUT_BE64(a, val) \ + do { \ + (a)[0] = (u8) (((u64) (val)) >> 56); \ + (a)[1] = (u8) (((u64) (val)) >> 48); \ + (a)[2] = (u8) (((u64) (val)) >> 40); \ + (a)[3] = (u8) (((u64) (val)) >> 32); \ + (a)[4] = (u8) (((u64) (val)) >> 24); \ + (a)[5] = (u8) (((u64) (val)) >> 16); \ + (a)[6] = (u8) (((u64) (val)) >> 8); \ + (a)[7] = (u8) (((u64) (val)) & 0xff); \ + } while (0) + +/* ===== start - public domain SHA256 implementation ===== */ + +/* This is based on SHA256 implementation in LibTomCrypt that was released into + * public domain by Tom St Denis. */ + +/* the K array */ +static const unsigned long K[64] = { + 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, + 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, + 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, + 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, + 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL, + 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, + 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, + 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, + 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, + 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL, + 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, + 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, + 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL +}; + + +/* Various logical functions */ +#define RORc(x, y) \ +( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \ + ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL) +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S(x, n) RORc((x), (n)) +#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) +#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) +#ifndef MIN +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) +#endif + +u32 rtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe); +u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe); +void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe); + +u32 rtw_aes_decrypt(_adapter *padapter, u8 *precvframe); +u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe); +void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe); + +#ifdef CONFIG_TDLS +void wpa_tdls_generate_tpk(_adapter *padapter, struct sta_info *psta); +int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie, + u8 *mic); +int tdls_verify_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie); +#endif //CONFIG_TDLS + +#ifdef PLATFORM_WINDOWS +void rtw_use_tkipkey_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); +#endif +#ifdef PLATFORM_LINUX +void rtw_use_tkipkey_handler(void* FunctionContext); +#endif + +#ifdef PLATFORM_FREEBSD +void rtw_use_tkipkey_handler(void* FunctionContext); +#endif //PLATFORM_FREEBSD + +u32 rtw_init_sec_priv(_adapter *padapter); +void rtw_free_sec_priv(struct security_priv *psecpriv); + +#endif //__RTL871X_SECURITY_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_xmit.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_xmit.h new file mode 100644 index 0000000..46e3379 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/rtw_xmit.h @@ -0,0 +1,839 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTW_XMIT_H_ +#define _RTW_XMIT_H_ + +/*--------------------------------------- + Define MAX_XMITBUF_SZ +---------------------------------------*/ +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) || defined(CONFIG_LX_HCI) + +#ifdef CONFIG_TX_AGGREGATION //effect only for SDIO and GSPI Interface +#define MAX_XMITBUF_SZ (20480) // 20k +#else +#if defined(PLATFORM_ECOS) || defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) + + #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + #define HAL_INTERFACE_OVERHEAD_XMIT_BUF 12 //HAL_INTERFACE_CMD (4) + HAL_INTERFACE_STATUS (8) + #elif defined(CONFIG_LX_HCI) + #define HAL_INTERFACE_OVERHEAD_XMIT_BUF 0 + #endif + +// Consideration for MAX_XMITBUF_SZ size +// Check more detail information in MAX_SKB_BUF_SIZE +// Tx: [INTF_CMD][TX_DESC][WLAN_HDR][QoS][IV][SNAP][Data][MIC][ICV][INTF_STATUS] +// HAL_INTERFACE_OVERHEAD: HAL_INTERFACE_CMD is 4/0 for SPI/PCIE, HAL_INTERFACE_STATUS is 8/0 for SPI/PCIE +// WLAN_MAX_ETHFRM_LEN : May not be required because WLAN_HEADER +SNAP can totally +// cover ethernet header.Keep in only for safety. + +#ifndef CONFIG_DONT_CARE_TP +#define MAX_XMITBUF_SZ (HAL_INTERFACE_OVERHEAD_XMIT_BUF+\ + TXDESC_SIZE+\ + WLAN_MAX_PROTOCOL_OVERHEAD + WLAN_MAX_ETHFRM_LEN +\ + SKB_RESERVED_FOR_SAFETY) +#else +#define MAX_XMITBUF_SZ (HAL_INTERFACE_OVERHEAD_XMIT_BUF+\ + TXDESC_SIZE+\ + WLAN_MAX_PROTOCOL_OVERHEAD + WLAN_MAX_TX_ETHFRM_LEN +\ + SKB_RESERVED_FOR_SAFETY) +#endif + + +#else // Other OS +#define MAX_XMITBUF_SZ (12288) //12k 1536*8 +#endif //#ifdef PLATFORM_ECOS || defined(PLATFORM_FREERTOS) +#endif //#ifdef CONFIG_TX_AGGREGATION + +#elif defined(CONFIG_USB_HCI) || defined(CONFIG_PCI_HCI) + #errof "Undefined bus interface for MAX_XMITBUF_SZ" +#endif //interface define. SDIO/GSPI/LXbus/PCI/USB + + + +/*--------------------------------------------------------------*/ +/* Define MAX_XMITBUF_SZ */ +/*--------------------------------------------------------------*/ +#if (defined CONFIG_GSPI_HCI || defined CONFIG_SDIO_HCI) + +#if defined(PLATFORM_ECOS) +#define NR_XMITBUFF (8) +#elif defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) +#ifndef CONFIG_HIGH_TP +#define NR_XMITBUFF (2) //Decrease recv frame (8->2) due to memory limitation - YangJue +#else +#define NR_XMITBUFF (128) +#endif +#else +#define NR_XMITBUFF (128) +#endif //#ifdef PLATFORM_ECOS + +#elif defined(CONFIG_LX_HCI) +#define NR_XMITBUFF (8) + +#elif defined(CONFIG_USB_HCI) || defined(CONFIG_PCI_HCI) + #errof "Undefined bus interface for MAX_XMITBUF_SZ" +#endif //interface define + + +/*--------------------------------------------------------------*/ +/* Define XMITBUF_ALIGN_SZ */ +/*--------------------------------------------------------------*/ +#if defined(PLATFORM_OS_CE) || defined(PLATFORM_ECOS) || defined(PLATFORM_FREERTOS) || defined(PLATFORM_CMSIS_RTOS) +#define XMITBUF_ALIGN_SZ 4 +#else +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) +#define XMITBUF_ALIGN_SZ 4 +#else +#define XMITBUF_ALIGN_SZ 512 +#endif +#endif + +#define MAX_CMDBUF_SZ (5120) //(4096) +/*--------------------------------------------------------------*/ +/* Define xmit extension buff, size/numbers */ +/*--------------------------------------------------------------*/ +#define MAX_XMIT_EXTBUF_SZ (1536) + +#if defined(PLATFORM_ECOS) +#define NR_XMIT_EXTBUFF (16) //Decrease ext xmit buffer due to memory limitation - Alex Fang +#elif defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) +#define NR_XMIT_EXTBUFF (8) //Decrease ext xmit buffer due to memory limitation - Alex Fang +#else +#define NR_XMIT_EXTBUFF (32) +#endif //#ifdef PLATFORM_ECOS + +#define MAX_NUMBLKS (1) + +#define XMIT_VO_QUEUE (0) +#define XMIT_VI_QUEUE (1) +#define XMIT_BE_QUEUE (2) +#define XMIT_BK_QUEUE (3) + +#define VO_QUEUE_INX 0 +#define VI_QUEUE_INX 1 +#define BE_QUEUE_INX 2 +#define BK_QUEUE_INX 3 +#define BCN_QUEUE_INX 4 +#define MGT_QUEUE_INX 5 +#define HIGH_QUEUE_INX 6 +#define TXCMD_QUEUE_INX 7 +#ifdef CONFIG_WLAN_HAL_TEST +#define HIGH1_QUEUE_INX 8 +#define HIGH2_QUEUE_INX 9 +#define HIGH3_QUEUE_INX 10 +#define HIGH4_QUEUE_INX 11 +#define HIGH5_QUEUE_INX 12 +#define HIGH6_QUEUE_INX 13 +#define HIGH7_QUEUE_INX 14 +#define HW_QUEUE_ENTRY 15 +#else +#define HW_QUEUE_ENTRY 8 +#endif + +#define WEP_IV(pattrib_iv, dot11txpn, keyidx)\ +do{\ + pattrib_iv[0] = dot11txpn._byte_.TSC0;\ + pattrib_iv[1] = dot11txpn._byte_.TSC1;\ + pattrib_iv[2] = dot11txpn._byte_.TSC2;\ + pattrib_iv[3] = ((keyidx & 0x3)<<6);\ + dot11txpn.val = (dot11txpn.val == 0xffffff) ? 0: (dot11txpn.val+1);\ +}while(0) + + +#define TKIP_IV(pattrib_iv, dot11txpn, keyidx)\ +do{\ + pattrib_iv[0] = dot11txpn._byte_.TSC1;\ + pattrib_iv[1] = (dot11txpn._byte_.TSC1 | 0x20) & 0x7f;\ + pattrib_iv[2] = dot11txpn._byte_.TSC0;\ + pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\ + pattrib_iv[4] = dot11txpn._byte_.TSC2;\ + pattrib_iv[5] = dot11txpn._byte_.TSC3;\ + pattrib_iv[6] = dot11txpn._byte_.TSC4;\ + pattrib_iv[7] = dot11txpn._byte_.TSC5;\ + dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\ +}while(0) + +#define AES_IV(pattrib_iv, dot11txpn, keyidx)\ +do{\ + pattrib_iv[0] = dot11txpn._byte_.TSC0;\ + pattrib_iv[1] = dot11txpn._byte_.TSC1;\ + pattrib_iv[2] = 0;\ + pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\ + pattrib_iv[4] = dot11txpn._byte_.TSC2;\ + pattrib_iv[5] = dot11txpn._byte_.TSC3;\ + pattrib_iv[6] = dot11txpn._byte_.TSC4;\ + pattrib_iv[7] = dot11txpn._byte_.TSC5;\ + dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\ +}while(0) + + +#define HWXMIT_ENTRY 4 + +#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8195A) || defined(CONFIG_RTL8711B) ||defined(CONFIG_RTL8188F) +#define TXDESC_SIZE 40 +#else +#define TXDESC_SIZE 32 +#endif + +#ifdef CONFIG_TX_EARLY_MODE +#define EARLY_MODE_INFO_SIZE 8 +#endif + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) +#define TXDESC_OFFSET TXDESC_SIZE + +#endif + +#ifdef CONFIG_USB_HCI +#define PACKET_OFFSET_SZ (8) +#define TXDESC_OFFSET (TXDESC_SIZE + PACKET_OFFSET_SZ) +#endif + +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) +#if defined(CONFIG_RTL8195A) || defined(CONFIG_RTL8711B)// buffer descriptor architecture +#define TXDESC_OFFSET TXDESC_SIZE +#else +#define TXDESC_OFFSET 0 +#endif +#define TX_DESC_NEXT_DESC_OFFSET 40 +#endif + +#define TX_FRAGMENTATION_THRESHOLD 2346 + +// Suppose (TX_DESC_MODE=1) ==> Segment number for each tx_buf_desc is 4. 2X4 = 8 (double words). +struct tx_buf_desc { + unsigned int txdw0; + unsigned int txdw1; + unsigned int txdw2; + unsigned int txdw3; + unsigned int txdw4; + unsigned int txdw5; + unsigned int txdw6; + unsigned int txdw7; +}; + +struct tx_desc{ + + //DWORD 0 + unsigned int txdw0; + + unsigned int txdw1; + + unsigned int txdw2; + + unsigned int txdw3; + + unsigned int txdw4; + + unsigned int txdw5; + + unsigned int txdw6; + + unsigned int txdw7; +#ifdef CONFIG_PCI_HCI + unsigned int txdw8; + + unsigned int txdw9; + + unsigned int txdw10; + + unsigned int txdw11; + + // 2008/05/15 MH Because PCIE HW memory R/W 4K limit. And now, our descriptor + // size is 40 bytes. If you use more than 102 descriptor( 103*40>4096), HW will execute + // memoryR/W CRC error. And then all DMA fetch will fail. We must decrease descriptor + // number or enlarge descriptor size as 64 bytes. + unsigned int txdw12; + + unsigned int txdw13; + + unsigned int txdw14; + + unsigned int txdw15; +#endif +#if defined(CONFIG_LX_HCI)||defined(CONFIG_RTL8188F) + unsigned int txdw8; + + unsigned int txdw9; +#endif +}; + + +union txdesc { + struct tx_desc txdesc; + unsigned int value[TXDESC_SIZE>>2]; +}; + +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) +#ifdef CONFIG_WLAN_HAL_TEST +#define PCI_MAX_TX_QUEUE_COUNT HW_QUEUE_ENTRY +#else +#define PCI_MAX_TX_QUEUE_COUNT 8 +#endif + +struct rtw_tx_ring { + +#if ((RTL8195A_SUPPORT ==1) ||(RTL8711B_SUPPORT == 1)) + struct tx_buf_desc *desc; +#else + struct tx_desc *desc; +#endif + dma_addr_t dma; + unsigned int idx; + unsigned int entries; + _queue queue; + u32 qlen; +}; +#endif + +struct hw_xmit { + //_lock xmit_lock; + //_list pending; + _queue *sta_queue; + //struct hw_txqueue *phwtxqueue; + //sint txcmdcnt; + int accnt; +}; + +#if 0 +struct pkt_attrib +{ + u8 type; + u8 subtype; + u8 bswenc; + u8 dhcp_pkt; + u16 ether_type; + int pktlen; //the original 802.3 pkt raw_data len (not include ether_hdr data) + int pkt_hdrlen; //the original 802.3 pkt header len + int hdrlen; //the WLAN Header Len + int nr_frags; + int last_txcmdsz; + int encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith + u8 iv[8]; + int iv_len; + u8 icv[8]; + int icv_len; + int priority; + int ack_policy; + int mac_id; + int vcs_mode; //virtual carrier sense method + + u8 dst[ETH_ALEN]; + u8 src[ETH_ALEN]; + u8 ta[ETH_ALEN]; + u8 ra[ETH_ALEN]; + + u8 key_idx; + + u8 qos_en; + u8 ht_en; + u8 raid;//rate adpative id + u8 bwmode; + u8 ch_offset;//PRIME_CHNL_OFFSET + u8 sgi;//short GI + u8 ampdu_en;//tx ampdu enable + u8 mdata;//more data bit + u8 eosp; + + u8 pctrl;//per packet txdesc control enable + u8 triggered;//for ap mode handling Power Saving sta + + u32 qsel; + u16 seqnum; + + struct sta_info * psta; +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + u8 hw_tcp_csum; +#endif +}; +#else +//reduce size +struct pkt_attrib +{ + u8 type; + u8 subtype; + u8 bswenc; + u8 dhcp_pkt; + u16 ether_type; + u16 seqnum; + u16 pkt_hdrlen; //the original 802.3 pkt header len + u16 hdrlen; //the WLAN Header Len + u32 pktlen; //the original 802.3 pkt raw_data len (not include ether_hdr data) + u32 last_txcmdsz; + u8 encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith + u8 iv_len; + u8 icv_len; + u8 iv[18]; + u8 icv[16]; + u8 priority; + u8 ack_policy; + u8 mac_id; + u8 vcs_mode; //virtual carrier sense method + u8 dst[ETH_ALEN]; + u8 src[ETH_ALEN]; + u8 ta[ETH_ALEN]; + u8 ra[ETH_ALEN]; + u8 key_idx; + u8 qos_en; + u8 ht_en; + u8 raid;//rate adpative id + u8 bwmode; + u8 ch_offset;//PRIME_CHNL_OFFSET + u8 sgi;//short GI + u8 ampdu_en;//tx ampdu enable + u8 mdata;//more data bit + u8 pctrl;//per packet txdesc control enable + u8 triggered;//for ap mode handling Power Saving sta + u8 qsel; + u8 eosp; + u8 rate; + u8 intel_proxim; + u8 retry_ctrl; + struct sta_info * psta; +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + u8 hw_tcp_csum; +#endif +}; +#endif + +#ifdef PLATFORM_FREEBSD +#define ETH_ALEN 6 /* Octets in one ethernet addr */ +#define ETH_HLEN 14 /* Total octets in header. */ +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ + +/*struct rtw_ieee80211_hdr { + uint16_t frame_control; + uint16_t duration_id; + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + uint16_t seq_ctrl; + u8 addr4[6]; +} ;*/ +#endif //PLATFORM_FREEBSD + +#define WLANHDR_OFFSET 64 + +#define NULL_FRAMETAG (0x0) +#define DATA_FRAMETAG 0x01 +#define L2_FRAMETAG 0x02 +#define MGNT_FRAMETAG 0x03 +#define AMSDU_FRAMETAG 0x04 + +#define EII_FRAMETAG 0x05 +#define IEEE8023_FRAMETAG 0x06 + +#define MP_FRAMETAG 0x07 + +#define TXAGG_FRAMETAG 0x08 + +enum { + XMITBUF_DATA = 0, + XMITBUF_MGNT = 1, + XMITBUF_CMD = 2, +}; + +struct submit_ctx{ + u32 submit_time; /* */ + u32 timeout_ms; /* <0: not synchronous, 0: wait forever, >0: up to ms waiting */ + int status; /* status for operation */ +#ifdef PLATFORM_LINUX + struct completion done; +#endif +}; + +enum { + RTW_SCTX_DONE_SUCCESS = 0, + RTW_SCTX_DONE_UNKNOWN, + RTW_SCTX_DONE_BUF_ALLOC, + RTW_SCTX_DONE_BUF_FREE, + RTW_SCTX_DONE_WRITE_PORT_ERR, + RTW_SCTX_DONE_TX_DESC_NA, + RTW_SCTX_DONE_TX_DENY, +}; + + +void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms); +int rtw_sctx_wait(struct submit_ctx *sctx); +void rtw_sctx_done_err(struct submit_ctx **sctx, int status); +void rtw_sctx_done(struct submit_ctx **sctx); + +typedef struct _XIMT_BUF_ { + u32 AllocatBufAddr; + u32 BufAddr; + u32 BufLen; +}XIMT_BUF, *PXIMT_BUF; + +struct xmit_buf +{ + _list list; + + _adapter *padapter; + +#if USE_SKB_AS_XMITBUF + _pkt *pkt; +#else + u8 *pallocated_buf; +#endif + u8 *pbuf; + + void *priv_data; + + u16 buf_tag; // 0: Normal xmitbuf, 1: extension xmitbuf, 2:cmd xmitbuf + u16 flags; + u32 alloc_sz; + + u32 len; + + struct submit_ctx *sctx; + +#ifdef CONFIG_USB_HCI + + //u32 sz[8]; + u32 ff_hwaddr; + +#if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) + PURB pxmit_urb[8]; + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ +#endif + +#ifdef PLATFORM_OS_XP + PIRP pxmit_irp[8]; +#endif + +#ifdef PLATFORM_OS_CE + USB_TRANSFER usb_transfer_write_port; +#endif + + u8 bpending[8]; + + sint last[8]; + +#endif + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + u8 *phead; + u8 *pdata; + u8 *ptail; + u8 *pend; + u32 ff_hwaddr; + u8 pg_num; + u8 agg_num; +#ifdef PLATFORM_OS_XP + PMDL pxmitbuf_mdl; + PIRP pxmitbuf_irp; + PSDBUS_REQUEST_PACKET pxmitbuf_sdrp; +#endif +#endif + +#if defined(DBG_XMIT_BUF )|| defined(DBG_XMIT_BUF_EXT) + u8 no; +#endif + +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) +#if ((RTL8195A_SUPPORT ==1) ||(RTL8711B_SUPPORT == 1)) + XIMT_BUF BufInfo[4]; + u32 BlockNum; +#endif +#endif +}; + + +struct xmit_frame +{ + _list list; + + struct pkt_attrib attrib; + + _pkt *pkt; + + int frame_tag; + + _adapter *padapter; + + u8 *buf_addr; + + struct xmit_buf *pxmitbuf; + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + u8 pg_num; + u8 agg_num; +#endif + +#ifdef CONFIG_USB_HCI +#ifdef CONFIG_USB_TX_AGGREGATION + u8 agg_num; +#endif + s8 pkt_offset; +#ifdef CONFIG_RTL8192D + u8 EMPktNum; + u16 EMPktLen[5];//The max value by HW +#endif +#endif + +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) +#if ((RTL8195A_SUPPORT ==1) ||(RTL8711B_SUPPORT == 1)) + u32 TxDexAddr; + u32 HdrLen; + u32 PayLoadAddr; + u32 PayLoadLen; + u32 TotalLen; + u32 BlockNum; + XIMT_BUF BufInfo[4]; + BOOLEAN NoCoalesce; +#endif +#endif +}; + +struct tx_servq { + _list tx_pending; + _queue sta_pending; + int qcnt; +}; + +struct sta_xmit_priv +{ + _lock lock; + sint option; + sint apsd_setting; //When bit mask is on, the associated edca queue supports APSD. + + + //struct tx_servq blk_q[MAX_NUMBLKS]; + struct tx_servq be_q; //priority == 0,3 + struct tx_servq bk_q; //priority == 1,2 + struct tx_servq vi_q; //priority == 4,5 + struct tx_servq vo_q; //priority == 6,7 + _list legacy_dz; + _list apsd; + + u16 txseq_tid[16]; + + //uint sta_tx_bytes; + //u64 sta_tx_pkts; + //uint sta_tx_fail; + + +}; + + +struct hw_txqueue { + volatile sint head; + volatile sint tail; + volatile sint free_sz; //in units of 64 bytes + volatile sint free_cmdsz; + volatile sint txsz[8]; + uint ff_hwaddr; + uint cmd_hwaddr; + sint ac_tag; +}; + +struct agg_pkt_info{ + u16 offset; + u16 pkt_len; +}; + + +struct xmit_priv { + + _lock lock; + + //_queue blk_strms[MAX_NUMBLKS]; + _queue be_pending; + _queue bk_pending; + _queue vi_pending; + _queue vo_pending; + _queue bm_pending; + + //_queue legacy_dz_queue; + //_queue apsd_queue; + + u8 *pallocated_frame_buf; + u8 *pxmit_frame_buf; + uint free_xmitframe_cnt; + + //uint mapping_addr; + //uint pkt_sz; + + _queue free_xmit_queue; + + //struct hw_txqueue be_txqueue; + //struct hw_txqueue bk_txqueue; + //struct hw_txqueue vi_txqueue; + //struct hw_txqueue vo_txqueue; + //struct hw_txqueue bmc_txqueue; + + _adapter *adapter; + + u8 vcs_setting; + u8 vcs; + u8 vcs_type; + //u16 rts_thresh; + + u64 tx_bytes; + u64 tx_pkts; + u64 tx_drop; + u64 last_tx_bytes; + u64 last_tx_pkts; + + struct hw_xmit *hwxmits; + u8 hwxmit_entry; + +#ifdef CONFIG_USB_HCI + _sema tx_retevt;//all tx return event; + u8 txirp_cnt;// + +#ifdef PLATFORM_OS_CE + USB_TRANSFER usb_transfer_write_port; +// USB_TRANSFER usb_transfer_write_mem; +#endif +#ifdef PLATFORM_LINUX + struct tasklet_struct xmit_tasklet; +#endif +#ifdef PLATFORM_FREEBSD + struct task xmit_tasklet; +#endif + //per AC pending irp + int beq_cnt; + int bkq_cnt; + int viq_cnt; + int voq_cnt; + +#endif + +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) + // Tx + struct rtw_tx_ring tx_ring[PCI_MAX_TX_QUEUE_COUNT]; + int txringcount[PCI_MAX_TX_QUEUE_COUNT]; + u8 beaconDMAing; //flag of indicating beacon is transmiting to HW by DMA +#ifdef PLATFORM_LINUX + struct tasklet_struct xmit_tasklet; +#endif +#endif + + _queue free_xmitbuf_queue; + _queue pending_xmitbuf_queue; + u8 *pallocated_xmitbuf; + u8 *pxmitbuf; + uint free_xmitbuf_cnt; +#if USE_XMIT_EXTBUFF + _queue free_xmit_extbuf_queue; + u8 *pallocated_xmit_extbuf; + u8 *pxmit_extbuf; + uint free_xmit_extbuf_cnt; +#endif + u16 nqos_ssn; + #ifdef CONFIG_TX_EARLY_MODE + + #define MAX_AGG_PKT_NUM 256 //Max tx ampdu coounts + + struct agg_pkt_info agg_pkt[MAX_AGG_PKT_NUM]; + #endif +}; + +#ifdef CONFIG_TRACE_SKB +extern struct xmit_buf *_rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv, u32 size); + +//extern struct xmit_frame *_rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv); +//extern s32 _rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe); +//extern void _rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue); + +#define rtw_alloc_xmitbuf_ext(pxmitpriv, pxmitbuf, size) \ + (\ + pxmitbuf = _rtw_alloc_xmitbuf_ext(pxmitpriv, size),\ + pxmitbuf ? set_skb_list_flag(pxmitbuf->pkt, SKBLIST_XMITEXTBUF):0,\ + pxmitbuf\ + ) +#else +extern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv, u32 size); +#endif +extern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); + +extern struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv); +extern s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); + +extern struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv); +extern s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe); +extern void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue); +struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac); +extern s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +extern struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry); + +void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz); +extern void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len); +extern s32 rtw_make_wlanhdr(_adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib); +extern s32 rtw_put_snap(u8 *data, u16 h_proto); + +extern s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe); +extern u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib); +#define rtw_wlan_pkt_size(f) rtw_calculate_wlan_pkt_size_by_attribue(&f->attrib) +extern s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe); +#ifdef CONFIG_TDLS +s32 rtw_xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, u8 action); +#endif +s32 _rtw_init_hw_txqueue(struct hw_txqueue* phw_txqueue, u8 ac_tag); +void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv); + + +s32 rtw_txframes_pending(_adapter *padapter); +s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib); +void rtw_txframes_update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitframe); +void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry); + + +s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter); +void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv); + + +void rtw_alloc_hwxmits(_adapter *padapter); +void rtw_free_hwxmits(_adapter *padapter); + + +s32 rtw_xmit(_adapter *padapter, _pkt **pkt); + +#if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS) +sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe); +void stop_sta_xmit(_adapter *padapter, struct sta_info *psta); +void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta); +void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta); +#endif + +u8 qos_acm(u8 acm_mask, u8 priority); + +s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe); + +#ifdef CONFIG_XMIT_THREAD_MODE +void enqueue_pending_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); +struct xmit_buf* dequeue_pending_xmitbuf(struct xmit_priv *pxmitpriv); +struct xmit_buf* dequeue_pending_xmitbuf_under_survey(struct xmit_priv *pxmitpriv); +sint check_pending_xmitbuf(struct xmit_priv *pxmitpriv); +thread_return rtw_xmit_thread(thread_context context); +#endif + +u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe); + +extern s32 rtw_xmit_mgnt(_adapter * padapter, struct xmit_frame *pmgntframe); +extern s32 rtw_xmit_data(PADAPTER padapter, struct xmit_frame *pxmitframe); +extern s32 rtw_xmit_xmitbuf(_adapter * padapter, struct xmit_buf *pxmitbuf); +extern u32 ffaddr2deviceId(struct dvobj_priv *pdvobj, u32 addr); +extern unsigned int nr_xmitframe; +extern unsigned int nr_xmitbuff; +#endif //_RTL871X_XMIT_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/sta_info.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/sta_info.h new file mode 100644 index 0000000..3ea91a5 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/sta_info.h @@ -0,0 +1,400 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __STA_INFO_H_ +#define __STA_INFO_H_ + +#define IBSS_START_MAC_ID 2 + +#if 0 //move to wifi.h +#if defined(PLATFORM_ECOS) +#define NUM_STA 10 //Decrease STA due to memory limitation - Alex Fang +#elif defined(PLATFORM_FREERTOS) +//Decrease STA due to memory limitation - Alex Fang +#ifdef CONFIG_AP_MODE +#define NUM_STA (2 + AP_STA_NUM) //2 + supported clients +#else +#define NUM_STA 2 //Client mode sta for AP and broadcast +#endif +#else +#define NUM_STA 32 +#endif +#endif + +#define NUM_ACL 16 + +//if mode ==0, then the sta is allowed once the addr is hit. +//if mode ==1, then the sta is rejected once the addr is non-hit. +struct rtw_wlan_acl_node { + _list list; + u8 addr[ETH_ALEN]; + u8 valid; +}; + +//mode=0, disable +//mode=1, accept unless in deny list +//mode=2, deny unless in accept list +struct wlan_acl_pool { + int mode; + int num; + struct rtw_wlan_acl_node aclnode[NUM_ACL]; + _queue acl_node_q; +}; + +typedef struct _RSSI_STA{ + s32 UndecoratedSmoothedPWDB; + s32 UndecoratedSmoothedCCK; + s32 UndecoratedSmoothedOFDM; + u64 PacketMap; + u8 ValidBit; + u32 OFDM_pkt; +}RSSI_STA, *PRSSI_STA; + +struct stainfo_stats { + + //u64 rx_pkts; + u64 rx_mgnt_pkts; + u64 rx_ctrl_pkts; + u64 rx_data_pkts; + + //u64 last_rx_pkts; + u64 last_rx_mgnt_pkts; + u64 last_rx_ctrl_pkts; + u64 last_rx_data_pkts; + + u64 rx_bytes; +// u64 rx_drops; + + u64 tx_pkts; + u64 tx_bytes; +// u64 tx_drops; + +}; + +#ifdef CONFIG_TDLS +struct TDLS_PeerKey { + u8 kck[16]; /* TPK-KCK */ + u8 tk[16]; /* TPK-TK; only CCMP will be used */ +} ; +#endif //CONFIG_TDLS + +struct sta_info { + + _lock lock; + _list list; //free_sta_queue + _list hash_list; //sta_hash + //_list asoc_list; //20061114 + //_list sleep_list;//sleep_q + //_list wakeup_list;//wakeup_q + _adapter *padapter; + + struct sta_xmit_priv sta_xmitpriv; + struct sta_recv_priv sta_recvpriv; + + _queue sleep_q; + unsigned int sleepq_len; + + uint state; + uint aid; + uint mac_id; + uint qos_option; + u8 hwaddr[ETH_ALEN]; + + uint ieee8021x_blocked; //0: allowed, 1:blocked + uint dot118021XPrivacy; //aes, tkip... + union Keytype dot11tkiptxmickey; + union Keytype dot11tkiprxmickey; + union Keytype dot118021x_UncstKey; + union pn48 dot11txpn; // PN48 used for Unicast xmit. + union pn48 dot11rxpn; // PN48 used for Unicast recv. + + + u8 bssrateset[16]; + u32 bssratelen; + s32 rssi; + s32 signal_quality; + + u8 cts2self; + u8 rtsen; + + u8 raid; + u8 init_rate; + u32 ra_mask; + u8 wireless_mode; // NETWORK_TYPE + struct stainfo_stats sta_stats; + +#ifdef CONFIG_TDLS + u32 tdls_sta_state; + u8 dialog; + u8 SNonce[32]; + u8 ANonce[32]; + u32 TDLS_PeerKey_Lifetime; + u16 TPK_count; + _timer TPK_timer; + struct TDLS_PeerKey tpk; + u16 stat_code; + u8 off_ch; + u16 ch_switch_time; + u16 ch_switch_timeout; + u8 option; + _timer option_timer; + _timer base_ch_timer; + _timer off_ch_timer; + + _timer handshake_timer; + _timer alive_timer1; + _timer alive_timer2; + u8 timer_flag; + u8 alive_count; +#endif //CONFIG_TDLS + + //for A-MPDU TX, ADDBA timeout check + _timer addba_retry_timer; +#ifdef CONFIG_RECV_REORDERING_CTRL + //for A-MPDU Rx reordering buffer control + struct recv_reorder_ctrl recvreorder_ctrl[16]; +#endif + //for A-MPDU Tx + //unsigned char ampdu_txen_bitmap; + u16 BA_starting_seqctrl[16]; + + +#ifdef CONFIG_80211N_HT + struct ht_priv htpriv; +#endif + + //Notes: + //STA_Mode: + //curr_network(mlme_priv/security_priv/qos/ht) + sta_info: (STA & AP) CAP/INFO + //scan_q: AP CAP/INFO + + //AP_Mode: + //curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO + //sta_info: (AP & STA) CAP/INFO + +#ifdef CONFIG_AP_MODE + + _list asoc_list; + _list auth_list; + + unsigned int expire_to; +#ifdef CONFIG_AP_POLLING_CLIENT_ALIVE + unsigned int tx_null0; + unsigned int tx_null0_fail; + unsigned int tx_null0_retry; +#endif + unsigned int auth_seq; + unsigned int authalg; + unsigned char chg_txt[128]; + + u16 capability; + u32 flags; + + int dot8021xalg;//0:disable, 1:psk, 2:802.1x + int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2 + int wpa_group_cipher; + int wpa2_group_cipher; + int wpa_pairwise_cipher; + int wpa2_pairwise_cipher; + + u8 bpairwise_key_installed; + +#ifdef CONFIG_NATIVEAP_MLME + u8 wpa_ie[32]; + + u8 nonerp_set; + u8 no_short_slot_time_set; + u8 no_short_preamble_set; + u8 no_ht_gf_set; + u8 no_ht_set; + u8 ht_20mhz_set; +#endif // CONFIG_NATIVEAP_MLME + + unsigned int tx_ra_bitmap; + u8 qos_info; + + u8 max_sp_len; + u8 uapsd_bk;//BIT(0): Delivery enabled, BIT(1): Trigger enabled + u8 uapsd_be; + u8 uapsd_vi; + u8 uapsd_vo; + + u8 has_legacy_ac; + unsigned int sleepq_ac_len; + +#ifdef CONFIG_P2P + //p2p priv data + u8 is_p2p_device; + u8 p2p_status_code; + + //p2p client info + u8 dev_addr[ETH_ALEN]; + //u8 iface_addr[ETH_ALEN];//= hwaddr[ETH_ALEN] + u8 dev_cap; + u16 config_methods; + u8 primary_dev_type[8]; + u8 num_of_secdev_type; + u8 secdev_types_list[32];// 32/8 == 4; + u16 dev_name_len; + u8 dev_name[32]; +#endif //CONFIG_P2P + +#ifdef CONFIG_TX_MCAST2UNI + u8 under_exist_checking; +#endif // CONFIG_TX_MCAST2UNI + +#endif // CONFIG_AP_MODE + +#ifdef CONFIG_IOCTL_CFG80211 + u8 *passoc_req; + u32 assoc_req_len; +#endif + + //for DM + RSSI_STA rssi_stat; + + // + // ================ODM Relative Info======================= + // Please be care, dont declare too much structure here. It will cost memory * STA support num. + // + // + // 2011/10/20 MH Add for ODM STA info. + // + // Driver Write + u8 bValid; // record the sta status link or not? + //u8 WirelessMode; // + u8 IOTPeer; // Enum value. HT_IOT_PEER_E + u8 rssi_level; //for Refresh RA mask + // ODM Write + //1 PHY_STATUS_INFO + u8 RSSI_Path[4]; // + u8 RSSI_Ave; + u8 RXEVM[4]; + u8 RXSNR[4]; + + // ODM Write + //1 TX_INFO (may changed by IC) + //TX_INFO_T pTxInfo; // Define in IC folder. Move lower layer. + // + // ================ODM Relative Info======================= + // +}; + +#define sta_rx_pkts(sta) \ + (sta->sta_stats.rx_mgnt_pkts \ + + sta->sta_stats.rx_ctrl_pkts \ + + sta->sta_stats.rx_data_pkts) + +#define sta_last_rx_pkts(sta) \ + (sta->sta_stats.last_rx_mgnt_pkts \ + + sta->sta_stats.last_rx_ctrl_pkts \ + + sta->sta_stats.last_rx_data_pkts) + +#define sta_update_last_rx_pkts(sta) \ + do { \ + sta->sta_stats.last_rx_mgnt_pkts = sta->sta_stats.rx_mgnt_pkts; \ + sta->sta_stats.last_rx_ctrl_pkts = sta->sta_stats.rx_ctrl_pkts; \ + sta->sta_stats.last_rx_data_pkts = sta->sta_stats.rx_data_pkts; \ + } while(0) + +#define STA_RX_PKTS_ARG(sta) \ + sta->sta_stats.rx_mgnt_pkts \ + , sta->sta_stats.rx_ctrl_pkts \ + , sta->sta_stats.rx_data_pkts + +#define STA_LAST_RX_PKTS_ARG(sta) \ + sta->sta_stats.last_rx_mgnt_pkts \ + , sta->sta_stats.last_rx_ctrl_pkts \ + , sta->sta_stats.last_rx_data_pkts + +#define STA_PKTS_FMT "(m:%llu, c:%llu, d:%llu)" + +struct sta_priv { + + u8 *pallocated_stainfo_buf; + u32 allocated_stainfo_size; + u8 *pstainfo_buf; + _queue free_sta_queue; + + _lock sta_hash_lock; + _list sta_hash[NUM_STA]; + int asoc_sta_count; + _queue sleep_q; + _queue wakeup_q; + + _adapter *padapter; + + +#ifdef CONFIG_AP_MODE + _list asoc_list; + _list auth_list; + _lock asoc_list_lock; + _lock auth_list_lock; + + unsigned int auth_to; //sec, time to expire in authenticating. + unsigned int assoc_to; //sec, time to expire before associating. + unsigned int expire_to; //sec , time to expire after associated. + + /* pointers to STA info; based on allocated AID or NULL if AID free + * AID is in the range 1-2007, so sta_aid[0] corresponders to AID 1 + * and so on + */ + struct sta_info *sta_aid[NUM_STA]; + + u16 sta_dz_bitmap;//only support 15 stations, staion aid bitmap for sleeping sta. + u16 tim_bitmap;//only support 15 stations, aid=0~15 mapping bit0~bit15 + + u16 max_num_sta; +//TODO: AP +// struct wlan_acl_pool acl_list; +#endif + +}; + + +__inline static u32 wifi_mac_hash(u8 *mac) +{ + u32 x; + + x = mac[0]; + x = (x << 2) ^ mac[1]; + x = (x << 2) ^ mac[2]; + x = (x << 2) ^ mac[3]; + x = (x << 2) ^ mac[4]; + x = (x << 2) ^ mac[5]; + + x ^= x >> 8; + x = x & (NUM_STA - 1); + + return x; +} + + +extern u32 _rtw_init_sta_priv(_adapter *padapter); +extern u32 _rtw_free_sta_priv(struct sta_priv *pstapriv); +extern struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr); +extern u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta); +extern void rtw_free_all_stainfo(_adapter *padapter); +extern struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr); +extern u32 rtw_init_bcmc_stainfo(_adapter* padapter); +extern struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter); +extern u8 rtw_access_ctrl(_adapter *padapter, u8 *mac_addr); + +#endif //_STA_INFO_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi.h new file mode 100644 index 0000000..1ab28fe --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi.h @@ -0,0 +1,1369 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _WIFI_H_ +#define _WIFI_H_ + +#include +#include + + +#ifdef BIT +//#error "BIT define occurred earlier elsewhere!\n" +#undef BIT +#endif +#define BIT(x) ((u32)1 << (x)) + +#if defined(PLATFORM_ECOS) +#define NUM_STA 10 //Decrease STA due to memory limitation - Alex Fang +#elif defined(PLATFORM_FREERTOS) || defined(PLATFORM_CMSIS_RTOS) +//Decrease STA due to memory limitation - Alex Fang +#ifdef CONFIG_AP_MODE +#define NUM_STA (2 + AP_STA_NUM) //2 + supported clients +#else +#define NUM_STA 2 //Client mode sta for AP and broadcast +#endif +#else +#define NUM_STA 32 +#endif + +#define WLAN_ETHHDR_LEN 14 +#define WLAN_ETHADDR_LEN 6 +#define WLAN_IEEE_OUI_LEN 3 +#define WLAN_ADDR_LEN 6 +#define WLAN_CRC_LEN 4 +#define WLAN_BSSID_LEN 6 +#define WLAN_BSS_TS_LEN 8 +#define WLAN_HDR_A3_LEN 24 +#define WLAN_HDR_A4_LEN 30 +#define WLAN_HDR_A3_QOS_LEN 26 +#define WLAN_HDR_A4_QOS_LEN 32 +#define WLAN_SSID_MAXLEN 32 +#define WLAN_DATA_MAXLEN 2312 + +#define WLAN_A3_PN_OFFSET 24 +#define WLAN_A4_PN_OFFSET 30 + +#define WLAN_MIN_ETHFRM_LEN 60 +#ifndef CONFIG_DONT_CARE_TP +#if WIFI_LOGO_CERTIFICATION +#define WLAN_MAX_ETHFRM_LEN 4000 +#else +#define WLAN_MAX_ETHFRM_LEN 1514 +#endif +#else +#define WLAN_MAX_RX_ETHFRM_LEN 1514 +#define WLAN_MAX_TX_ETHFRM_LEN 590 +#endif +#define WLAN_ETHHDR_LEN 14 +#define WLAN_SNAP_HEADER 8 +#define WLAN_MAX_IV_LEN 8 +#define WLAN_MAX_ICV_LEN 8 +#define WLAN_MAX_MIC_LEN 8 +#define WLAN_MAX_PROTOCOL_OVERHEAD (WLAN_HDR_A4_QOS_LEN+WLAN_MAX_IV_LEN\ + +WLAN_SNAP_HEADER+WLAN_MAX_MIC_LEN+WLAN_MAX_ICV_LEN) //=64 + +#define P80211CAPTURE_VERSION 0x80211001 + +// This value is tested by WiFi 11n Test Plan 5.2.3. +// This test verifies the WLAN NIC can update the NAV through sending the CTS with large duration. +#define WiFiNavUpperUs 30000 // 30 ms +// enum WLAN_IDX{ +// WLAN0_IDX = 0, +// WLAN1_IDX, +// WLAN_UNDEF = -1 +// }; + +#ifdef GREEN_HILL +#pragma pack(1) +#endif + +enum WIFI_FRAME_TYPE { + WIFI_MGT_TYPE = (0), + WIFI_CTRL_TYPE = (BIT(2)), + WIFI_DATA_TYPE = (BIT(3)), + WIFI_QOS_DATA_TYPE = (BIT(7)|BIT(3)), //!< QoS Data +}; + +enum WIFI_FRAME_SUBTYPE { + + // below is for mgt frame + WIFI_ASSOCREQ = (0 | WIFI_MGT_TYPE), + WIFI_ASSOCRSP = (BIT(4) | WIFI_MGT_TYPE), + WIFI_REASSOCREQ = (BIT(5) | WIFI_MGT_TYPE), + WIFI_REASSOCRSP = (BIT(5) | BIT(4) | WIFI_MGT_TYPE), + WIFI_PROBEREQ = (BIT(6) | WIFI_MGT_TYPE), + WIFI_PROBERSP = (BIT(6) | BIT(4) | WIFI_MGT_TYPE), + WIFI_BEACON = (BIT(7) | WIFI_MGT_TYPE), + WIFI_ATIM = (BIT(7) | BIT(4) | WIFI_MGT_TYPE), + WIFI_DISASSOC = (BIT(7) | BIT(5) | WIFI_MGT_TYPE), + WIFI_AUTH = (BIT(7) | BIT(5) | BIT(4) | WIFI_MGT_TYPE), + WIFI_DEAUTH = (BIT(7) | BIT(6) | WIFI_MGT_TYPE), + WIFI_ACTION = (BIT(7) | BIT(6) | BIT(4) | WIFI_MGT_TYPE), + + // below is for control frame + WIFI_PSPOLL = (BIT(7) | BIT(5) | WIFI_CTRL_TYPE), + WIFI_RTS = (BIT(7) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE), + WIFI_CTS = (BIT(7) | BIT(6) | WIFI_CTRL_TYPE), + WIFI_ACK = (BIT(7) | BIT(6) | BIT(4) | WIFI_CTRL_TYPE), + WIFI_CFEND = (BIT(7) | BIT(6) | BIT(5) | WIFI_CTRL_TYPE), + WIFI_CFEND_CFACK = (BIT(7) | BIT(6) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE), + + // below is for data frame + WIFI_DATA = (0 | WIFI_DATA_TYPE), + WIFI_DATA_CFACK = (BIT(4) | WIFI_DATA_TYPE), + WIFI_DATA_CFPOLL = (BIT(5) | WIFI_DATA_TYPE), + WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | WIFI_DATA_TYPE), + WIFI_DATA_NULL = (BIT(6) | WIFI_DATA_TYPE), + WIFI_CF_ACK = (BIT(6) | BIT(4) | WIFI_DATA_TYPE), + WIFI_CF_POLL = (BIT(6) | BIT(5) | WIFI_DATA_TYPE), + WIFI_CF_ACKPOLL = (BIT(6) | BIT(5) | BIT(4) | WIFI_DATA_TYPE), + WIFI_QOS_DATA_NULL = (BIT(6) | WIFI_QOS_DATA_TYPE), +}; + +enum WIFI_REASON_CODE { + _RSON_RESERVED_ = 0, + _RSON_UNSPECIFIED_ = 1, + _RSON_AUTH_NO_LONGER_VALID_ = 2, + _RSON_DEAUTH_STA_LEAVING_ = 3, + _RSON_INACTIVITY_ = 4, + _RSON_UNABLE_HANDLE_ = 5, + _RSON_CLS2_ = 6, + _RSON_CLS3_ = 7, + _RSON_DISAOC_STA_LEAVING_ = 8, + _RSON_ASOC_NOT_AUTH_ = 9, + + // WPA reason + _RSON_INVALID_IE_ = 13, + _RSON_MIC_FAILURE_ = 14, + _RSON_4WAY_HNDSHK_TIMEOUT_ = 15, + _RSON_GROUP_KEY_UPDATE_TIMEOUT_ = 16, + _RSON_DIFF_IE_ = 17, + _RSON_MLTCST_CIPHER_NOT_VALID_ = 18, + _RSON_UNICST_CIPHER_NOT_VALID_ = 19, + _RSON_AKMP_NOT_VALID_ = 20, + _RSON_UNSUPPORT_RSNE_VER_ = 21, + _RSON_INVALID_RSNE_CAP_ = 22, + _RSON_IEEE_802DOT1X_AUTH_FAIL_ = 23, + + //belowing are Realtek definition + _RSON_PMK_NOT_AVAILABLE_ = 24, + _RSON_TDLS_TEAR_TOOFAR_ = 25, + _RSON_TDLS_TEAR_UN_RSN_ = 26, +}; + +/* Reason codes (IEEE 802.11-2007, 7.3.1.7, Table 7-22) */ +#if 0 +#define WLAN_REASON_UNSPECIFIED 1 +#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 +#define WLAN_REASON_DEAUTH_LEAVING 3 +#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 +#define WLAN_REASON_DISASSOC_AP_BUSY 5 +#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 +#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 +#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 +#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 +#endif +/* IEEE 802.11h */ +#define WLAN_REASON_PWR_CAPABILITY_NOT_VALID 10 +#define WLAN_REASON_SUPPORTED_CHANNEL_NOT_VALID 11 +#if 0 +/* IEEE 802.11i */ +#define WLAN_REASON_INVALID_IE 13 +#define WLAN_REASON_MICHAEL_MIC_FAILURE 14 +#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15 +#define WLAN_REASON_GROUP_KEY_UPDATE_TIMEOUT 16 +#define WLAN_REASON_IE_IN_4WAY_DIFFERS 17 +#define WLAN_REASON_GROUP_CIPHER_NOT_VALID 18 +#define WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID 19 +#define WLAN_REASON_AKMP_NOT_VALID 20 +#define WLAN_REASON_UNSUPPORTED_RSN_IE_VERSION 21 +#define WLAN_REASON_INVALID_RSN_IE_CAPAB 22 +#define WLAN_REASON_IEEE_802_1X_AUTH_FAILED 23 +#define WLAN_REASON_CIPHER_SUITE_REJECTED 24 +#endif + +enum WIFI_STATUS_CODE { + _STATS_SUCCESSFUL_ = 0, + _STATS_FAILURE_ = 1, + _STATS_CAP_FAIL_ = 10, + _STATS_NO_ASOC_ = 11, + _STATS_OTHER_ = 12, + _STATS_NO_SUPP_ALG_ = 13, + _STATS_OUT_OF_AUTH_SEQ_ = 14, + _STATS_CHALLENGE_FAIL_ = 15, + _STATS_AUTH_TIMEOUT_ = 16, + _STATS_UNABLE_HANDLE_STA_ = 17, + _STATS_RATE_FAIL_ = 18, +}; + +/* Status codes (IEEE 802.11-2007, 7.3.1.9, Table 7-23) */ +#if 0 +#define WLAN_STATUS_SUCCESS 0 +#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 +#define WLAN_STATUS_CAPS_UNSUPPORTED 10 +#define WLAN_STATUS_REASSOC_NO_ASSOC 11 +#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 +#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 +#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 +#define WLAN_STATUS_CHALLENGE_FAIL 15 +#define WLAN_STATUS_AUTH_TIMEOUT 16 +#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 +#define WLAN_STATUS_ASSOC_DENIED_RATES 18 +#endif +//entended +/* IEEE 802.11b */ +#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 +#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 +#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 +/* IEEE 802.11h */ +#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22 +#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23 +#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24 +/* IEEE 802.11g */ +#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25 +#define WLAN_STATUS_ASSOC_DENIED_NO_ER_PBCC 26 +#define WLAN_STATUS_ASSOC_DENIED_NO_DSSS_OFDM 27 +/* IEEE 802.11w */ +#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30 +#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31 +/* IEEE 802.11i */ +#define WLAN_STATUS_INVALID_IE 40 +#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41 +#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42 +#define WLAN_STATUS_AKMP_NOT_VALID 43 +#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44 +#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45 +#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46 +#define WLAN_STATUS_TS_NOT_CREATED 47 +#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48 +#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49 +#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50 +#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51 +/* IEEE 802.11r */ +#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52 +#define WLAN_STATUS_INVALID_PMKID 53 +#define WLAN_STATUS_INVALID_MDIE 54 +#define WLAN_STATUS_INVALID_FTIE 55 + + +enum WIFI_REG_DOMAIN { + DOMAIN_FCC = 1, + DOMAIN_IC = 2, + DOMAIN_ETSI = 3, + DOMAIN_SPAIN = 4, + DOMAIN_FRANCE = 5, + DOMAIN_MKK = 6, + DOMAIN_ISRAEL = 7, + DOMAIN_MKK1 = 8, + DOMAIN_MKK2 = 9, + DOMAIN_MKK3 = 10, + DOMAIN_MAX +}; + +#define _TO_DS_ BIT(8) +#define _FROM_DS_ BIT(9) +#define _MORE_FRAG_ BIT(10) +#define _RETRY_ BIT(11) +#define _PWRMGT_ BIT(12) +#define _MORE_DATA_ BIT(13) +#define _PRIVACY_ BIT(14) +#define _ORDER_ BIT(15) + +#define SetToDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_TO_DS_); \ + } while(0) + +#define GetToDs(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_TO_DS_)) != 0) + +#define ClearToDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_TO_DS_)); \ + } while(0) + +#define SetFrDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_FROM_DS_); \ + } while(0) + +#define GetFrDs(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_FROM_DS_)) != 0) + +#define ClearFrDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_FROM_DS_)); \ + } while(0) + +#define get_tofr_ds(pframe) ((GetToDs(pframe) << 1) | GetFrDs(pframe)) + + +#define SetMFrag(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_FRAG_); \ + } while(0) + +#define GetMFrag(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_FRAG_)) != 0) + +#define ClearMFrag(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_FRAG_)); \ + } while(0) + +#define SetRetry(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_RETRY_); \ + } while(0) + +#define GetRetry(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_RETRY_)) != 0) + +#define ClearRetry(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_RETRY_)); \ + } while(0) + +#define SetPwrMgt(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_PWRMGT_); \ + } while(0) + +#define GetPwrMgt(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_PWRMGT_)) != 0) + +#define ClearPwrMgt(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PWRMGT_)); \ + } while(0) + +#define SetMData(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_DATA_); \ + } while(0) + +#define GetMData(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_DATA_)) != 0) + +#define ClearMData(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_DATA_)); \ + } while(0) + +#define SetPrivacy(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_PRIVACY_); \ + } while(0) + +#define GetPrivacy(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_PRIVACY_)) != 0) + +#define ClearPrivacy(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PRIVACY_)); \ + } while(0) + + +#define GetOrder(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0) + +#define GetFrameType(pbuf) (le16_to_cpu(*(unsigned short *)(pbuf)) & (BIT(3) | BIT(2))) + +#define SetFrameType(pbuf,type) \ + do { \ + *(unsigned short *)(pbuf) &= cpu_to_le16(~(BIT(3) | BIT(2))); \ + *(unsigned short *)(pbuf) |= cpu_to_le16(type); \ + } while(0) + +#define GetFrameSubType(pbuf) (cpu_to_le16(*(unsigned short *)(pbuf)) & (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))) + +#define SetFrameSubType(pbuf,type) \ + do { \ + *(unsigned short *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))); \ + *(unsigned short *)(pbuf) |= cpu_to_le16(type); \ + } while(0) + +#define GetSequence(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) >> 4) + +#define GetFragNum(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & 0x0f) + +#define GetTupleCache(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22))) + +#define SetFragNum(pbuf, num) \ + do { \ + *(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \ + ((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu(~(0x000f))) | \ + cpu_to_le16(0x0f & (num)); \ + } while(0) + +#define SetSeqNum(pbuf, num) \ + do { \ + *(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \ + ((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu((unsigned short)~0xfff0)) | \ + le16_to_cpu((unsigned short)(0xfff0 & (num << 4))); \ + } while(0) +#define GetFrameControl(pbuf)(cpu_to_le16(*(unsigned short*)((SIZE_PTR)(pbuf)))) +#define GetDuration(pbuf) (cpu_to_le16(*(unsigned short*)((SIZE_PTR)(pbuf) + 2))) +#define SetDuration(pbuf, dur) \ + do { \ + *(unsigned short *)((SIZE_PTR)(pbuf) + 2) = cpu_to_le16(0xffff & (dur)); \ + } while(0) + + +#define SetPriority(pbuf, tid) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(tid & 0xf); \ + } while(0) + +#define GetPriority(pbuf) ((le16_to_cpu(*(unsigned short *)(pbuf))) & 0xf) + +#define SetEOSP(pbuf, eosp) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16( (eosp & 1) << 4); \ + } while(0) + +#define SetAckpolicy(pbuf, ack) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16( (ack & 3) << 5); \ + } while(0) + +#define GetAckpolicy(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 5) & 0x3) + +#define GetAMsdu(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 7) & 0x1) + +#define SetAMsdu(pbuf, amsdu) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16( (amsdu & 1) << 7); \ + } while(0) + +#define GetAid(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 2)) & 0x3fff) + +#define GetTid(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + (((GetToDs(pbuf)<<1)|GetFrDs(pbuf))==3?30:24))) & 0x000f) + +#define GetAddr1Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 4)) + +#define GetAddr2Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 10)) + +#define GetAddr3Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 16)) + +#define GetAddr4Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 24)) + +#define MacAddr_isBcst(addr) \ +( \ + ( (addr[0] == 0xff) && (addr[1] == 0xff) && \ + (addr[2] == 0xff) && (addr[3] == 0xff) && \ + (addr[4] == 0xff) && (addr[5] == 0xff) ) ? _TRUE : _FALSE \ +) + +__inline static int IS_MCAST(unsigned char *da) +{ + if ((*da) & 0x01) + return _TRUE; + else + return _FALSE; +} + +__inline static unsigned char * get_ta(unsigned char *pframe) +{ + unsigned char *ta; + ta = GetAddr2Ptr(pframe); + return ta; +} + +__inline static unsigned char * get_da(unsigned char *pframe) +{ + unsigned char *da; + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); + + switch (to_fr_ds) { + case 0x00: // ToDs=0, FromDs=0 + da = GetAddr1Ptr(pframe); + break; + case 0x01: // ToDs=0, FromDs=1 + da = GetAddr1Ptr(pframe); + break; + case 0x02: // ToDs=1, FromDs=0 + da = GetAddr3Ptr(pframe); + break; + default: // ToDs=1, FromDs=1 + da = GetAddr3Ptr(pframe); + break; + } + + return da; +} + + +__inline static unsigned char * get_sa(unsigned char *pframe) +{ + unsigned char *sa; + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); + + switch (to_fr_ds) { + case 0x00: // ToDs=0, FromDs=0 + sa = GetAddr2Ptr(pframe); + break; + case 0x01: // ToDs=0, FromDs=1 + sa = GetAddr3Ptr(pframe); + break; + case 0x02: // ToDs=1, FromDs=0 + sa = GetAddr2Ptr(pframe); + break; + default: // ToDs=1, FromDs=1 + sa = GetAddr4Ptr(pframe); + break; + } + + return sa; +} + +__inline static unsigned char * get_hdr_bssid(unsigned char *pframe) +{ + unsigned char *sa; + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); + + switch (to_fr_ds) { + case 0x00: // ToDs=0, FromDs=0 + sa = GetAddr3Ptr(pframe); + break; + case 0x01: // ToDs=0, FromDs=1 + sa = GetAddr2Ptr(pframe); + break; + case 0x02: // ToDs=1, FromDs=0 + sa = GetAddr1Ptr(pframe); + break; + case 0x03: // ToDs=1, FromDs=1 + sa = GetAddr1Ptr(pframe); + break; + default: + sa =NULL; //??????? + break; + } + + return sa; +} + + +__inline static int IsFrameTypeCtrl(unsigned char *pframe) +{ + if(WIFI_CTRL_TYPE == GetFrameType(pframe)) + return _TRUE; + else + return _FALSE; +} +/*----------------------------------------------------------------------------- + Below is for the security related definition +------------------------------------------------------------------------------*/ +#define _RESERVED_FRAME_TYPE_ 0 +#define _SKB_FRAME_TYPE_ 2 +#define _PRE_ALLOCMEM_ 1 +#define _PRE_ALLOCHDR_ 3 +#define _PRE_ALLOCLLCHDR_ 4 +#define _PRE_ALLOCICVHDR_ 5 +#define _PRE_ALLOCMICHDR_ 6 + +#define _SIFSTIME_ ((priv->pmib->dot11BssType.net_work_type&WIRELESS_11A)?16:10) +#define _ACKCTSLNG_ 14 //14 bytes long, including crclng +#define _CRCLNG_ 4 + +#define _ASOCREQ_IE_OFFSET_ 4 // excluding wlan_hdr +#define _ASOCRSP_IE_OFFSET_ 6 +#define _REASOCREQ_IE_OFFSET_ 10 +#define _REASOCRSP_IE_OFFSET_ 6 +#define _PROBEREQ_IE_OFFSET_ 0 +#define _PROBERSP_IE_OFFSET_ 12 +#define _AUTH_IE_OFFSET_ 6 +#define _DEAUTH_IE_OFFSET_ 0 +#define _BEACON_IE_OFFSET_ 12 +#define _PUBLIC_ACTION_IE_OFFSET_ 8 + +#define _FIXED_IE_LENGTH_ _BEACON_IE_OFFSET_ + +#define _SSID_IE_ 0 +#define _SUPPORTEDRATES_IE_ 1 +#define _DSSET_IE_ 3 +#define _TIM_IE_ 5 +#define _IBSS_PARA_IE_ 6 +#define _COUNTRY_IE_ 7 +#define _CHLGETXT_IE_ 16 +#define _SUPPORTED_CH_IE_ 36 +#define _CH_SWTICH_ANNOUNCE_ 37 //Secondary Channel Offset +#define _RSN_IE_2_ 48 +#define _SSN_IE_1_ 221 +#define _ERPINFO_IE_ 42 +#define _EXT_SUPPORTEDRATES_IE_ 50 + +#define _HT_CAPABILITY_IE_ 45 +#define _FTIE_ 55 +#define _TIMEOUT_ITVL_IE_ 56 +#define _SRC_IE_ 59 +#define _HT_EXTRA_INFO_IE_ 61 +#define _HT_ADD_INFO_IE_ 61 //_HT_EXTRA_INFO_IE_ +#define _WAPI_IE_ 68 + + +#define EID_BSSCoexistence 72 // 20/40 BSS Coexistence +#define EID_BSSIntolerantChlReport 73 +#define _RIC_Descriptor_IE_ 75 + +#define _LINK_ID_IE_ 101 +#define _CH_SWITCH_TIMING_ 104 +#define _PTI_BUFFER_STATUS_ 106 +#define _EXT_CAP_IE_ 127 +#define _VENDOR_SPECIFIC_IE_ 221 + +#define _RESERVED47_ 47 + +/* --------------------------------------------------------------------------- + Below is the fixed elements... +-----------------------------------------------------------------------------*/ +#define _AUTH_ALGM_NUM_ 2 +#define _AUTH_SEQ_NUM_ 2 +#define _BEACON_ITERVAL_ 2 +#define _CAPABILITY_ 2 +#define _CURRENT_APADDR_ 6 +#define _LISTEN_INTERVAL_ 2 +#define _RSON_CODE_ 2 +#define _ASOC_ID_ 2 +#define _STATUS_CODE_ 2 +#define _TIMESTAMP_ 8 + +#define AUTH_ODD_TO 0 +#define AUTH_EVEN_TO 1 + +#define WLAN_ETHCONV_ENCAP 1 +#define WLAN_ETHCONV_RFC1042 2 +#define WLAN_ETHCONV_8021h 3 + +#define cap_ESS BIT(0) +#define cap_IBSS BIT(1) +#define cap_CFPollable BIT(2) +#define cap_CFRequest BIT(3) +#define cap_Privacy BIT(4) +#define cap_ShortPremble BIT(5) +#define cap_PBCC BIT(6) +#define cap_ChAgility BIT(7) +#define cap_SpecMgmt BIT(8) +#define cap_QoS BIT(9) +#define cap_ShortSlot BIT(10) + +/*----------------------------------------------------------------------------- + Below is the definition for 802.11i / 802.1x +------------------------------------------------------------------------------*/ +#define _IEEE8021X_MGT_ 1 // WPA +#define _IEEE8021X_PSK_ 2 // WPA with pre-shared key + +/* +#define _NO_PRIVACY_ 0 +#define _WEP_40_PRIVACY_ 1 +#define _TKIP_PRIVACY_ 2 +#define _WRAP_PRIVACY_ 3 +#define _CCMP_PRIVACY_ 4 +#define _WEP_104_PRIVACY_ 5 +#define _WEP_WPA_MIXED_PRIVACY_ 6 // WEP + WPA +*/ + +/*----------------------------------------------------------------------------- + Below is the definition for WMM +------------------------------------------------------------------------------*/ +#define _WMM_IE_Length_ 7 // for WMM STA +#define _WMM_Para_Element_Length_ 24 + +//TODO +#if 0 + +/*----------------------------------------------------------------------------- + Below is the definition for 802.11n +------------------------------------------------------------------------------*/ + +//#ifdef CONFIG_80211N_HT + +#define SetOrderBit(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_ORDER_); \ + } while(0) + +#define GetOrderBit(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0) + + +/** + * struct rtw_ieee80211_bar - HT Block Ack Request + * + * This structure refers to "HT BlockAckReq" as + * described in 802.11n draft section 7.2.1.7.1 + */ + #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW) +struct rtw_ieee80211_bar { + unsigned short frame_control; + unsigned short duration; + unsigned char ra[6]; + unsigned char ta[6]; + unsigned short control; + unsigned short start_seq_num; +} __attribute__((packed)); + #endif + +/* 802.11 BAR control masks */ +#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL 0x0000 +#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA 0x0004 + +#endif //#if 0 + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW) || defined(PLATFORM_FREEBSD) || defined(PLATFORM_ECOS) || defined(PLATFORM_FREERTOS) || defined(PLATFORM_CMSIS_RTOS) + + + + /** + * struct rtw_ieee80211_ht_cap - HT capabilities + * + * This structure refers to "HT capabilities element" as + * described in 802.11n draft section 7.3.2.52 + */ + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct rtw_ieee80211_ht_cap { + unsigned short cap_info; + unsigned char ampdu_params_info; + unsigned char supp_mcs_set[16]; + unsigned short extended_ht_cap_info; + unsigned int tx_BF_cap_info; + unsigned char antenna_selection_info; +}RTW_PACK_STRUCT_STRUCT; +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + + +/** + * struct rtw_ieee80211_ht_cap - HT additional information + * + * This structure refers to "HT information element" as + * described in 802.11n draft section 7.3.2.53 + */ +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct ieee80211_ht_addt_info { + unsigned char control_chan; + unsigned char ht_param; + unsigned short operation_mode; + unsigned short stbc_param; + unsigned char basic_set[16]; +}RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct HT_caps_element +{ + union + { + struct + { + unsigned short HT_caps_info; + unsigned char AMPDU_para; + unsigned char MCS_rate[16]; + unsigned short HT_ext_caps; + unsigned int Beamforming_caps; + unsigned char ASEL_caps; + } +#ifdef __CC_ARM + __attribute__ ((packed)) +#endif + HT_cap_element; + unsigned char HT_cap[26]; + } +#ifdef __CC_ARM + __attribute__ ((packed)) +#endif + u; +}RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct HT_info_element +{ + unsigned char primary_channel; + unsigned char infos[5]; + unsigned char MCS_rate[16]; +}RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct AC_param +{ + unsigned char ACI_AIFSN; + unsigned char CW; + unsigned short TXOP_limit; +}RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct WMM_para_element +{ + unsigned char QoS_info; + unsigned char reserved; + struct AC_param ac_param[4]; +}RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +struct ADDBA_request +{ + unsigned char dialog_token; + unsigned short BA_para_set; + unsigned short BA_timeout_value; + unsigned short BA_starting_seqctrl; +}RTW_PACK_STRUCT_STRUCT; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + +#endif //#if defined PLATFORM_LINUX/CONFIG_RTL8712FW/PLATFORM_FREEBSD/PLATFORM_ECOS/PLATFORM_FREERTOS + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct rtw_ieee80211_ht_cap { + unsigned short cap_info; + unsigned char ampdu_params_info; + unsigned char supp_mcs_set[16]; + unsigned short extended_ht_cap_info; + unsigned int tx_BF_cap_info; + unsigned char antenna_selection_info; +}; + + +struct ieee80211_ht_addt_info { + unsigned char control_chan; + unsigned char ht_param; + unsigned short operation_mode; + unsigned short stbc_param; + unsigned char basic_set[16]; +}; + +struct HT_caps_element +{ + union + { + struct + { + unsigned short HT_caps_info; + unsigned char AMPDU_para; + unsigned char MCS_rate[16]; + unsigned short HT_ext_caps; + unsigned int Beamforming_caps; + unsigned char ASEL_caps; + } HT_cap_element; + unsigned char HT_cap[26]; + }; +}; + +struct HT_info_element +{ + unsigned char primary_channel; + unsigned char infos[5]; + unsigned char MCS_rate[16]; +}; + +struct AC_param +{ + unsigned char ACI_AIFSN; + unsigned char CW; + unsigned short TXOP_limit; +}; + +struct WMM_para_element +{ + unsigned char QoS_info; + unsigned char reserved; + struct AC_param ac_param[4]; +}; + +struct ADDBA_request +{ + unsigned char dialog_token; + unsigned short BA_para_set; + unsigned short BA_timeout_value; + unsigned short BA_starting_seqctrl; +}; + + +#pragma pack() + +#endif + +typedef enum _HT_CAP_AMPDU_FACTOR { + MAX_AMPDU_FACTOR_8K = 0, + MAX_AMPDU_FACTOR_16K = 1, + MAX_AMPDU_FACTOR_32K = 2, + MAX_AMPDU_FACTOR_64K = 3, +}HT_CAP_AMPDU_FACTOR; + +/* 802.11n HT capabilities masks */ +#define IEEE80211_HT_CAP_SUP_WIDTH 0x0002 +#define IEEE80211_HT_CAP_SM_PS 0x000C +#define IEEE80211_HT_CAP_GRN_FLD 0x0010 +#define IEEE80211_HT_CAP_SGI_20 0x0020 +#define IEEE80211_HT_CAP_SGI_40 0x0040 +#define IEEE80211_HT_CAP_TX_STBC 0x0080 +#define IEEE80211_HT_CAP_RX_STBC 0x0300 +#define IEEE80211_HT_CAP_DELAY_BA 0x0400 +#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 +#define IEEE80211_HT_CAP_DSSSCCK40 0x1000 +/* 802.11n HT capability AMPDU settings */ +#define IEEE80211_HT_CAP_AMPDU_FACTOR 0x03 +#define IEEE80211_HT_CAP_AMPDU_DENSITY 0x1C +/* 802.11n HT capability MSC set */ +#define IEEE80211_SUPP_MCS_SET_UEQM 4 +#define IEEE80211_HT_CAP_MAX_STREAMS 4 +#define IEEE80211_SUPP_MCS_SET_LEN 10 +/* maximum streams the spec allows */ +#define IEEE80211_HT_CAP_MCS_TX_DEFINED 0x01 +#define IEEE80211_HT_CAP_MCS_TX_RX_DIFF 0x02 +#define IEEE80211_HT_CAP_MCS_TX_STREAMS 0x0C +#define IEEE80211_HT_CAP_MCS_TX_UEQM 0x10 +/* 802.11n HT IE masks */ +#define IEEE80211_HT_IE_CHA_SEC_OFFSET 0x03 +#define IEEE80211_HT_IE_CHA_SEC_NONE 0x00 +#define IEEE80211_HT_IE_CHA_SEC_ABOVE 0x01 +#define IEEE80211_HT_IE_CHA_SEC_BELOW 0x03 +#define IEEE80211_HT_IE_CHA_WIDTH 0x04 +#define IEEE80211_HT_IE_HT_PROTECTION 0x0003 +#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004 +#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010 + +/* block-ack parameters */ +#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 +#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C +#define RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0 +#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 +#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 + +/* + * A-PMDU buffer sizes + * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2) + */ +#define IEEE80211_MIN_AMPDU_BUF 0x8 +#define IEEE80211_MAX_AMPDU_BUF 0x40 + + +/* Spatial Multiplexing Power Save Modes */ +#define WLAN_HT_CAP_SM_PS_STATIC 0 +#define WLAN_HT_CAP_SM_PS_DYNAMIC 1 +#define WLAN_HT_CAP_SM_PS_INVALID 2 +#define WLAN_HT_CAP_SM_PS_DISABLED 3 + + +#define OP_MODE_PURE 0 +#define OP_MODE_MAY_BE_LEGACY_STAS 1 +#define OP_MODE_20MHZ_HT_STA_ASSOCED 2 +#define OP_MODE_MIXED 3 + +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK ((u8) BIT(0) | BIT(1)) +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE ((u8) BIT(0)) +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW ((u8) BIT(0) | BIT(1)) +#define HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH ((u8) BIT(2)) +#define HT_INFO_HT_PARAM_RIFS_MODE ((u8) BIT(3)) +#define HT_INFO_HT_PARAM_CTRL_ACCESS_ONLY ((u8) BIT(4)) +#define HT_INFO_HT_PARAM_SRV_INTERVAL_GRANULARITY ((u8) BIT(5)) + +#define HT_INFO_OPERATION_MODE_OP_MODE_MASK \ + ((u16) (0x0001 | 0x0002)) +#define HT_INFO_OPERATION_MODE_OP_MODE_OFFSET 0 +#define HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT ((u8) BIT(2)) +#define HT_INFO_OPERATION_MODE_TRANSMIT_BURST_LIMIT ((u8) BIT(3)) +#define HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT ((u8) BIT(4)) + +#define HT_INFO_STBC_PARAM_DUAL_BEACON ((u16) BIT(6)) +#define HT_INFO_STBC_PARAM_DUAL_STBC_PROTECT ((u16) BIT(7)) +#define HT_INFO_STBC_PARAM_SECONDARY_BCN ((u16) BIT(8)) +#define HT_INFO_STBC_PARAM_LSIG_TXOP_PROTECT_ALLOWED ((u16) BIT(9)) +#define HT_INFO_STBC_PARAM_PCO_ACTIVE ((u16) BIT(10)) +#define HT_INFO_STBC_PARAM_PCO_PHASE ((u16) BIT(11)) + + + +//#endif + +// ===============WPS Section=============== +// For WPSv1.0 +#define WPSOUI 0x0050f204 +// WPS attribute ID +#define WPS_ATTR_VER1 0x104A +#define WPS_ATTR_SIMPLE_CONF_STATE 0x1044 +#define WPS_ATTR_RESP_TYPE 0x103B +#define WPS_ATTR_UUID_E 0x1047 +#define WPS_ATTR_MANUFACTURER 0x1021 +#define WPS_ATTR_MODEL_NAME 0x1023 +#define WPS_ATTR_MODEL_NUMBER 0x1024 +#define WPS_ATTR_SERIAL_NUMBER 0x1042 +#define WPS_ATTR_PRIMARY_DEV_TYPE 0x1054 +#define WPS_ATTR_SEC_DEV_TYPE_LIST 0x1055 +#define WPS_ATTR_DEVICE_NAME 0x1011 +#define WPS_ATTR_CONF_METHOD 0x1008 +#define WPS_ATTR_RF_BANDS 0x103C +#define WPS_ATTR_DEVICE_PWID 0x1012 +#define WPS_ATTR_REQUEST_TYPE 0x103A +#define WPS_ATTR_ASSOCIATION_STATE 0x1002 +#define WPS_ATTR_CONFIG_ERROR 0x1009 +#define WPS_ATTR_VENDOR_EXT 0x1049 +#define WPS_ATTR_SELECTED_REGISTRAR 0x1041 + +// Value of WPS attribute "WPS_ATTR_DEVICE_NAME +#define WPS_MAX_DEVICE_NAME_LEN 32 + +// Value of WPS Request Type Attribute +#define WPS_REQ_TYPE_ENROLLEE_INFO_ONLY 0x00 +#define WPS_REQ_TYPE_ENROLLEE_OPEN_8021X 0x01 +#define WPS_REQ_TYPE_REGISTRAR 0x02 +#define WPS_REQ_TYPE_WLAN_MANAGER_REGISTRAR 0x03 + +// Value of WPS Response Type Attribute +#define WPS_RESPONSE_TYPE_INFO_ONLY 0x00 +#define WPS_RESPONSE_TYPE_8021X 0x01 +#define WPS_RESPONSE_TYPE_REGISTRAR 0x02 +#define WPS_RESPONSE_TYPE_AP 0x03 + +// Value of WPS WiFi Simple Configuration State Attribute +#define WPS_WSC_STATE_NOT_CONFIG 0x01 +#define WPS_WSC_STATE_CONFIG 0x02 + +// Value of WPS Version Attribute +#define WPS_VERSION_1 0x10 + +// Value of WPS Configuration Method Attribute +#define WPS_CONFIG_METHOD_FLASH 0x0001 +#define WPS_CONFIG_METHOD_ETHERNET 0x0002 +#define WPS_CONFIG_METHOD_LABEL 0x0004 +#define WPS_CONFIG_METHOD_DISPLAY 0x0008 +#define WPS_CONFIG_METHOD_E_NFC 0x0010 +#define WPS_CONFIG_METHOD_I_NFC 0x0020 +#define WPS_CONFIG_METHOD_NFC 0x0040 +#define WPS_CONFIG_METHOD_PBC 0x0080 +#define WPS_CONFIG_METHOD_KEYPAD 0x0100 +#define WPS_CONFIG_METHOD_VPBC 0x0280 +#define WPS_CONFIG_METHOD_PPBC 0x0480 +#define WPS_CONFIG_METHOD_VDISPLAY 0x2008 +#define WPS_CONFIG_METHOD_PDISPLAY 0x4008 + +// Value of Category ID of WPS Primary Device Type Attribute +#define WPS_PDT_CID_DISPLAYS 0x0007 +#define WPS_PDT_CID_MULIT_MEDIA 0x0008 +#define WPS_PDT_CID_RTK_WIDI WPS_PDT_CID_MULIT_MEDIA + +// Value of Sub Category ID of WPS Primary Device Type Attribute +#define WPS_PDT_SCID_MEDIA_SERVER 0x0005 +#define WPS_PDT_SCID_RTK_DMP WPS_PDT_SCID_MEDIA_SERVER + +// Value of Device Password ID +#define WPS_DPID_PIN 0x0000 +#define WPS_DPID_USER_SPEC 0x0001 +#define WPS_DPID_MACHINE_SPEC 0x0002 +#define WPS_DPID_REKEY 0x0003 +#define WPS_DPID_PBC 0x0004 +#define WPS_DPID_REGISTRAR_SPEC 0x0005 + +// Value of WPS RF Bands Attribute +#define WPS_RF_BANDS_2_4_GHZ 0x01 +#define WPS_RF_BANDS_5_GHZ 0x02 + +// Value of WPS Association State Attribute +#define WPS_ASSOC_STATE_NOT_ASSOCIATED 0x00 +#define WPS_ASSOC_STATE_CONNECTION_SUCCESS 0x01 +#define WPS_ASSOC_STATE_CONFIGURATION_FAILURE 0x02 +#define WPS_ASSOC_STATE_ASSOCIATION_FAILURE 0x03 +#define WPS_ASSOC_STATE_IP_FAILURE 0x04 + +// =====================P2P Section===================== +// For P2P +#define P2POUI 0x506F9A09 + +// P2P Attribute ID +#define P2P_ATTR_STATUS 0x00 +#define P2P_ATTR_MINOR_REASON_CODE 0x01 +#define P2P_ATTR_CAPABILITY 0x02 +#define P2P_ATTR_DEVICE_ID 0x03 +#define P2P_ATTR_GO_INTENT 0x04 +#define P2P_ATTR_CONF_TIMEOUT 0x05 +#define P2P_ATTR_LISTEN_CH 0x06 +#define P2P_ATTR_GROUP_BSSID 0x07 +#define P2P_ATTR_EX_LISTEN_TIMING 0x08 +#define P2P_ATTR_INTENTED_IF_ADDR 0x09 +#define P2P_ATTR_MANAGEABILITY 0x0A +#define P2P_ATTR_CH_LIST 0x0B +#define P2P_ATTR_NOA 0x0C +#define P2P_ATTR_DEVICE_INFO 0x0D +#define P2P_ATTR_GROUP_INFO 0x0E +#define P2P_ATTR_GROUP_ID 0x0F +#define P2P_ATTR_INTERFACE 0x10 +#define P2P_ATTR_OPERATING_CH 0x11 +#define P2P_ATTR_INVITATION_FLAGS 0x12 + +// Value of Status Attribute +#define P2P_STATUS_SUCCESS 0x00 +#define P2P_STATUS_FAIL_INFO_UNAVAILABLE 0x01 +#define P2P_STATUS_FAIL_INCOMPATIBLE_PARAM 0x02 +#define P2P_STATUS_FAIL_LIMIT_REACHED 0x03 +#define P2P_STATUS_FAIL_INVALID_PARAM 0x04 +#define P2P_STATUS_FAIL_REQUEST_UNABLE 0x05 +#define P2P_STATUS_FAIL_PREVOUS_PROTO_ERR 0x06 +#define P2P_STATUS_FAIL_NO_COMMON_CH 0x07 +#define P2P_STATUS_FAIL_UNKNOWN_P2PGROUP 0x08 +#define P2P_STATUS_FAIL_BOTH_GOINTENT_15 0x09 +#define P2P_STATUS_FAIL_INCOMPATIBLE_PROVSION 0x0A +#define P2P_STATUS_FAIL_USER_REJECT 0x0B + +// Value of Inviation Flags Attribute +#define P2P_INVITATION_FLAGS_PERSISTENT BIT(0) + +#define DMP_P2P_DEVCAP_SUPPORT (P2P_DEVCAP_SERVICE_DISCOVERY | \ + P2P_DEVCAP_CLIENT_DISCOVERABILITY | \ + P2P_DEVCAP_CONCURRENT_OPERATION | \ + P2P_DEVCAP_INVITATION_PROC) + +#define DMP_P2P_GRPCAP_SUPPORT (P2P_GRPCAP_INTRABSS) + +// Value of Device Capability Bitmap +#define P2P_DEVCAP_SERVICE_DISCOVERY BIT(0) +#define P2P_DEVCAP_CLIENT_DISCOVERABILITY BIT(1) +#define P2P_DEVCAP_CONCURRENT_OPERATION BIT(2) +#define P2P_DEVCAP_INFRA_MANAGED BIT(3) +#define P2P_DEVCAP_DEVICE_LIMIT BIT(4) +#define P2P_DEVCAP_INVITATION_PROC BIT(5) + +// Value of Group Capability Bitmap +#define P2P_GRPCAP_GO BIT(0) +#define P2P_GRPCAP_PERSISTENT_GROUP BIT(1) +#define P2P_GRPCAP_GROUP_LIMIT BIT(2) +#define P2P_GRPCAP_INTRABSS BIT(3) +#define P2P_GRPCAP_CROSS_CONN BIT(4) +#define P2P_GRPCAP_PERSISTENT_RECONN BIT(5) +#define P2P_GRPCAP_GROUP_FORMATION BIT(6) + +// P2P Public Action Frame ( Management Frame ) +#define P2P_PUB_ACTION_ACTION 0x09 + +// P2P Public Action Frame Type +#define P2P_GO_NEGO_REQ 0 +#define P2P_GO_NEGO_RESP 1 +#define P2P_GO_NEGO_CONF 2 +#define P2P_INVIT_REQ 3 +#define P2P_INVIT_RESP 4 +#define P2P_DEVDISC_REQ 5 +#define P2P_DEVDISC_RESP 6 +#define P2P_PROVISION_DISC_REQ 7 +#define P2P_PROVISION_DISC_RESP 8 + +// P2P Action Frame Type +#define P2P_NOTICE_OF_ABSENCE 0 +#define P2P_PRESENCE_REQUEST 1 +#define P2P_PRESENCE_RESPONSE 2 +#define P2P_GO_DISC_REQUEST 3 + + +#define P2P_MAX_PERSISTENT_GROUP_NUM 10 + +#define P2P_PROVISIONING_SCAN_CNT 3 + +#define P2P_WILDCARD_SSID_LEN 7 + +#define P2P_FINDPHASE_EX_NONE 0 // default value, used when: (1)p2p disabed or (2)p2p enabled but only do 1 scan phase +#define P2P_FINDPHASE_EX_FULL 1 // used when p2p enabled and want to do 1 scan phase and P2P_FINDPHASE_EX_MAX-1 find phase +#define P2P_FINDPHASE_EX_SOCIAL_FIRST (P2P_FINDPHASE_EX_FULL+1) +#define P2P_FINDPHASE_EX_MAX 4 +#define P2P_FINDPHASE_EX_SOCIAL_LAST P2P_FINDPHASE_EX_MAX + +#define P2P_PROVISION_TIMEOUT 5000 // 5 seconds timeout for sending the provision discovery request +#define P2P_CONCURRENT_PROVISION_TIMEOUT 3000 // 3 seconds timeout for sending the provision discovery request under concurrent mode +#define P2P_GO_NEGO_TIMEOUT 5000 // 5 seconds timeout for receiving the group negotation response +#define P2P_CONCURRENT_GO_NEGO_TIMEOUT 3000 // 3 seconds timeout for sending the negotiation request under concurrent mode +#define P2P_TX_PRESCAN_TIMEOUT 100 // 100ms +#define P2P_INVITE_TIMEOUT 5000 // 5 seconds timeout for sending the invitation request +#define P2P_CONCURRENT_INVITE_TIMEOUT 3000 // 3 seconds timeout for sending the invitation request under concurrent mode + +#define P2P_MAX_INTENT 15 + +#define P2P_MAX_NOA_NUM 2 + +// WPS Configuration Method +#define WPS_CM_NONE 0x0000 +#define WPS_CM_LABEL 0x0004 +#define WPS_CM_DISPLYA 0x0008 +#define WPS_CM_EXTERNAL_NFC_TOKEN 0x0010 +#define WPS_CM_INTEGRATED_NFC_TOKEN 0x0020 +#define WPS_CM_NFC_INTERFACE 0x0040 +#define WPS_CM_PUSH_BUTTON 0x0080 +#define WPS_CM_KEYPAD 0x0100 +#define WPS_CM_SW_PUHS_BUTTON 0x0280 +#define WPS_CM_HW_PUHS_BUTTON 0x0480 +#define WPS_CM_SW_DISPLAY_PIN 0x2008 +#define WPS_CM_LCD_DISPLAY_PIN 0x4008 + +enum gen_ie_type{ + P2PWPS_PROBE_REQ_IE = 0, + P2PWPS_PROBE_RSP_IE, + P2PWPS_BEACON_IE, + P2PWPS_ASSOC_REQ_IE, + P2PWPS_ASSOC_RSP_IE +}; + +enum P2P_ROLE { + P2P_ROLE_DISABLE = 0, + P2P_ROLE_DEVICE = 1, + P2P_ROLE_CLIENT = 2, + P2P_ROLE_GO = 3 +}; + +enum P2P_STATE { + P2P_STATE_NONE = 0, // P2P disable + P2P_STATE_IDLE = 1, // P2P had enabled and do nothing + P2P_STATE_LISTEN = 2, // In pure listen state + P2P_STATE_SCAN = 3, // In scan phase + P2P_STATE_FIND_PHASE_LISTEN = 4, // In the listen state of find phase + P2P_STATE_FIND_PHASE_SEARCH = 5, // In the search state of find phase + P2P_STATE_TX_PROVISION_DIS_REQ = 6, // In P2P provisioning discovery + P2P_STATE_RX_PROVISION_DIS_RSP = 7, + P2P_STATE_RX_PROVISION_DIS_REQ = 8, + P2P_STATE_GONEGO_ING = 9, // Doing the group owner negoitation handshake + P2P_STATE_GONEGO_OK = 10, // finish the group negoitation handshake with success + P2P_STATE_GONEGO_FAIL = 11, // finish the group negoitation handshake with failure + P2P_STATE_RECV_INVITE_REQ_MATCH = 12, // receiving the P2P Inviation request and match with the profile. + P2P_STATE_PROVISIONING_ING = 13, // Doing the P2P WPS + P2P_STATE_PROVISIONING_DONE = 14, // Finish the P2P WPS + P2P_STATE_TX_INVITE_REQ = 15, // Transmit the P2P Invitation request + P2P_STATE_RX_INVITE_RESP = 16, // Receiving the P2P Invitation response + P2P_STATE_RECV_INVITE_REQ_DISMATCH = 17, // receiving the P2P Inviation request and dismatch with the profile. + P2P_STATE_RECV_INVITE_REQ_GO = 18, // receiving the P2P Inviation request and this wifi is GO. + P2P_STATE_RECV_INVITE_REQ_JOIN = 19, // receiving the P2P Inviation request to join an existing P2P Group. + P2P_STATE_FORMATION_COMPLETE = 20, + P2P_STATE_CONNECTED = 21, +}; + +enum P2P_WPSINFO { + P2P_NO_WPSINFO = 0, + P2P_GOT_WPSINFO_PEER_DISPLAY_PIN = 1, + P2P_GOT_WPSINFO_SELF_DISPLAY_PIN = 2, + P2P_GOT_WPSINFO_PBC = 3, +}; + +#define P2P_PRIVATE_IOCTL_SET_LEN 64 + +enum P2P_PROTO_WK_ID +{ + P2P_FIND_PHASE_WK = 0, + P2P_RESTORE_STATE_WK = 1, + P2P_PRE_TX_PROVDISC_PROCESS_WK = 2, + P2P_PRE_TX_NEGOREQ_PROCESS_WK = 3, + P2P_PRE_TX_INVITEREQ_PROCESS_WK = 4, + P2P_AP_P2P_CH_SWITCH_PROCESS_WK =5, + P2P_RO_CH_WK = 6, +}; + +enum P2P_PS +{ + P2P_PS_DISABLE=0, + P2P_PS_ENABLE=1, + P2P_PS_SCAN=2, + P2P_PS_SCAN_DONE=3, + P2P_PS_ALLSTASLEEP=4, // for owner +}; + +// =====================WFD Section===================== +// For Wi-Fi Display +#define WFD_ATTR_DEVICE_INFO 0x00 +#define WFD_ATTR_ASSOC_BSSID 0x01 +#define WFD_ATTR_COUPLED_SINK_INFO 0x06 +#define WFD_ATTR_LOCAL_IP_ADDR 0x08 +#define WFD_ATTR_SESSION_INFO 0x09 +#define WFD_ATTR_ALTER_MAC 0x0a + +// For WFD Device Information Attribute +#define WFD_DEVINFO_SOURCE 0x0000 +#define WFD_DEVINFO_PSINK 0x0001 +#define WFD_DEVINFO_SSINK 0x0002 + +#define WFD_DEVINFO_SESSION_AVAIL 0x0010 +#define WFD_DEVINFO_WSD 0x0040 +#define WFD_DEVINFO_PC_TDLS 0x0080 + + +#ifdef CONFIG_TX_MCAST2UNI +#define IP_MCAST_MAC(mac) ((mac[0]==0x01)&&(mac[1]==0x00)&&(mac[2]==0x5e)) +#define ICMPV6_MCAST_MAC(mac) ((mac[0]==0x33)&&(mac[1]==0x33)&&(mac[2]!=0xff)) +#endif // CONFIG_TX_MCAST2UNI + + + +#ifdef CONFIG_WAPI_SUPPORT +#ifndef IW_AUTH_WAPI_VERSION_1 +#define IW_AUTH_WAPI_VERSION_1 0x00000008 +#endif +#ifndef IW_AUTH_KEY_MGMT_WAPI_PSK +#define IW_AUTH_KEY_MGMT_WAPI_PSK 0x04 +#endif +#ifndef IW_AUTH_WAPI_ENABLED +#define IW_AUTH_WAPI_ENABLED 0x20 +#endif +#ifndef IW_ENCODE_ALG_SM4 +#define IW_ENCODE_ALG_SM4 0x20 +#endif +#endif + +#ifndef _CUSTOM_IE_TYPE_ +#define _CUSTOM_IE_TYPE_ +typedef enum CUSTOM_IE_TYPE{ + PROBE_REQ = BIT(0), + PROBE_RSP = BIT(1), + BEACON = BIT(2), +}rtw_custom_ie_type_t; +#endif /* _CUSTOM_IE_TYPE_ */ + +#endif // _WIFI_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_constants.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_constants.h index 77bedab..859fb9d 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_constants.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_constants.h @@ -1,3 +1,25 @@ +/****************************************************************************** + * Copyright (c) 2013-2016 Realtek Semiconductor Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ****************************************************************************** + * @file wifi_constants.h + * @author + * @version + * @brief This file provides the data types used for wlan API. + ****************************************************************************** + */ + #ifndef _WIFI_CONSTANTS_H #define _WIFI_CONSTANTS_H @@ -27,6 +49,9 @@ extern "C" { #define MCSSET_LEN 16 +/** + * @brief The enumeration lists the results of the function. + */ typedef enum { RTW_SUCCESS = 0, /**< Success */ @@ -88,6 +113,11 @@ typedef enum RTW_DISABLED = -43 /**< Disabled in this build */ } rtw_result_t; +/** + * @brief The enumeration lists the possible security types to set when connection.\n + * Station mode supports OPEN, WEP, and WPA2.\n + * AP mode support OPEN and WPA2. + */ typedef enum { RTW_SECURITY_OPEN = 0, /**< Open security */ RTW_SECURITY_WEP_PSK = WEP_ENABLED, /**< WEP Security with open authentication */ @@ -125,11 +155,17 @@ typedef enum { RTW_TRUE = 1 } rtw_bool_t; +/** + * @brief The enumeration lists the band types. + */ typedef enum { RTW_802_11_BAND_5GHZ = 0, /**< Denotes 5GHz radio band */ RTW_802_11_BAND_2_4GHZ = 1 /**< Denotes 2.4GHz radio band */ } rtw_802_11_band_t; +/** + * @brief The enumeration lists all the country codes able to set to Wi-Fi driver. + */ typedef enum { /* CHANNEL PLAN */ RTW_COUNTRY_WORLD1, // 0x20 @@ -326,42 +362,56 @@ typedef enum { RTW_COUNTRY_MAX -} rtw_country_code_t; +}rtw_country_code_t; +/** + * @brief The enumeration lists the adaptivity types. + */ typedef enum { RTW_ADAPTIVITY_DISABLE = 0, RTW_ADAPTIVITY_NORMAL, // CE RTW_ADAPTIVITY_CARRIER_SENSE // MKK } rtw_adaptivity_mode_t; - +/** + * @brief The enumeration lists the supported operation mode by WIFI driver, + * including station and AP mode. + */ typedef enum { RTW_MODE_NONE = 0, RTW_MODE_STA, RTW_MODE_AP, RTW_MODE_STA_AP, RTW_MODE_PROMISC, - RTW_MODE_P2P, - RTW_MODE_MAX -} rtw_mode_t; + RTW_MODE_P2P +}rtw_mode_t; typedef enum { RTW_SCAN_FULL = 0, RTW_SCAN_SOCIAL, RTW_SCAN_ONE -} rtw_scan_mode_t; +}rtw_scan_mode_t; +/** + * @brief The enumeration lists the status to describe the connection link. + */ typedef enum { RTW_LINK_DISCONNECTED = 0, RTW_LINK_CONNECTED } rtw_link_status_t; +/** + * @brief The enumeration lists the scan types. + */ typedef enum { RTW_SCAN_TYPE_ACTIVE = 0x00, /**< Actively scan a network by sending 802.11 probe(s) */ RTW_SCAN_TYPE_PASSIVE = 0x01, /**< Passively scan a network by listening for beacons from APs */ RTW_SCAN_TYPE_PROHIBITED_CHANNELS = 0x04 /**< Passively scan on channels not enabled by the country code */ } rtw_scan_type_t; +/** + * @brief The enumeration lists the bss types. + */ typedef enum { RTW_BSS_TYPE_INFRASTRUCTURE = 0, /**< Denotes infrastructure network */ RTW_BSS_TYPE_ADHOC = 1, /**< Denotes an 802.11 ad-hoc IBSS network */ @@ -388,33 +438,45 @@ typedef enum { RTW_WPS_TYPE_NONE = 0x0006 } rtw_wps_type_t; +/** + * @brief The enumeration lists all the network bgn mode. + */ typedef enum { RTW_NETWORK_B = 1, RTW_NETWORK_BG = 3, RTW_NETWORK_BGN = 11 } rtw_network_mode_t; +/** + * @brief The enumeration lists the interfaces. + */ typedef enum { RTW_STA_INTERFACE = 0, /**< STA or Client Interface */ - RTW_AP_INTERFACE = 1, /**< softAP Interface */ + RTW_AP_INTERFACE = 1, /**< SoftAP Interface */ } rtw_interface_t; /** - * Enumeration of packet filter rules - */ + * @brief The enumeration lists the packet filter rules. + */ typedef enum { - RTW_POSITIVE_MATCHING = 0, /**< Specifies that a filter should match a given pattern */ - RTW_NEGATIVE_MATCHING = 1 /**< Specifies that a filter should NOT match a given pattern */ + RTW_POSITIVE_MATCHING = 0, /**< Receive the data matching with this pattern and discard the other data */ + RTW_NEGATIVE_MATCHING = 1 /**< Discard the data matching with this pattern and receive the other data */ } rtw_packet_filter_rule_e; +/** + * @brief The enumeration lists the promisc levels. + */ typedef enum { - RTW_PROMISC_DISABLE = 0, /**< disable the promisc */ - RTW_PROMISC_ENABLE = 1, /**< fetch all ethernet packets */ - RTW_PROMISC_ENABLE_1 = 2, /**< fetch only B/M packets */ - RTW_PROMISC_ENABLE_2 = 3, /**< fetch all 802.11 packets*/ - RTW_PROMISC_ENABLE_3 = 4, /**< fetch only B/M 802.11 packets*/ + RTW_PROMISC_DISABLE = 0, /**< Disable the promisc */ + RTW_PROMISC_ENABLE = 1, /**< Fetch all ethernet packets */ + RTW_PROMISC_ENABLE_1 = 2, /**< Fetch only B/M packets */ + RTW_PROMISC_ENABLE_2 = 3, /**< Fetch all 802.11 packets*/ + RTW_PROMISC_ENABLE_3 = 4, /**< Fetch only B/M 802.11 packets*/ } rtw_rcr_level_t; +/** + * @brief The enumeration lists the disconnect reasons. + */ typedef enum{ RTW_NO_ERROR = 0, RTW_NONE_NETWORK = 1, @@ -422,7 +484,7 @@ typedef enum{ RTW_WRONG_PASSWORD = 3 , RTW_DHCP_FAIL = 4, RTW_UNKNOWN, -} rtw_connect_error_flag_t; +}rtw_connect_error_flag_t; typedef enum { RTW_TX_PWR_PERCENTAGE_100 = 0, /* 100%, default target output power. */ @@ -430,8 +492,11 @@ typedef enum { RTW_TX_PWR_PERCENTAGE_50 = 2, /* 50% */ RTW_TX_PWR_PERCENTAGE_25 = 3, /* 25% */ RTW_TX_PWR_PERCENTAGE_12_5 = 4, /* 12.5% */ -} rtw_tx_pwr_percentage_t; +}rtw_tx_pwr_percentage_t; +/** + * @brief The enumeration is event type indicated from wlan driver. + */ typedef enum _WIFI_EVENT_INDICATE{ WIFI_EVENT_CONNECT = 0, WIFI_EVENT_DISCONNECT = 1, @@ -451,6 +516,7 @@ typedef enum _WIFI_EVENT_INDICATE{ WIFI_EVENT_BEACON_AFTER_DHCP = 15, WIFI_EVENT_MAX, }WIFI_EVENT_INDICATE; +//rtw_event_indicate_e; #ifdef __cplusplus } #endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_structures.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_structures.h index 8bd0f20..06e5a1e 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_structures.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_structures.h @@ -1,3 +1,25 @@ +/****************************************************************************** + * Copyright (c) 2013-2016 Realtek Semiconductor Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ****************************************************************************** + * @file wifi_structures.h + * @author + * @version + * @brief This file provides the data structures used for wlan API. + ****************************************************************************** + */ + #ifndef _WIFI_STRUCTURES_H #define _WIFI_STRUCTURES_H @@ -11,6 +33,10 @@ extern "C" { #if defined(__IAR_SYSTEMS_ICC__) #pragma pack(1) #endif + +/** + * @brief The structure is used to describe the SSID. + */ typedef struct rtw_ssid { unsigned char len; /**< SSID length */ unsigned char val[33]; /**< SSID name (AP name) */ @@ -22,6 +48,10 @@ typedef struct rtw_ssid { #if defined(__IAR_SYSTEMS_ICC__) #pragma pack(1) #endif + +/** + * @brief The structure is used to describe the unique 6-byte MAC address. + */ typedef struct rtw_mac { unsigned char octet[6]; /**< Unique 6-byte MAC address */ } rtw_mac_t; @@ -29,6 +59,11 @@ typedef struct rtw_mac { #pragma pack() #endif +/** + * @brief The structure is used to describe the setting about SSID, + * security type, password and default channel, used to start AP mode. + * @note The data length of string pointed by ssid and password should not exceed 32. + */ typedef struct rtw_ap_info { rtw_ssid_t ssid; rtw_security_t security_type; @@ -37,6 +72,11 @@ typedef struct rtw_ap_info { int channel; }rtw_ap_info_t; +/** + * @brief The structure is used to describe the station mode setting about SSID, + * security type and password, used when connecting to an AP. + * @note The data length of string pointed by ssid and password should not exceed 32. + */ typedef struct rtw_network_info { rtw_ssid_t ssid; rtw_mac_t bssid; @@ -46,23 +86,30 @@ typedef struct rtw_network_info { int key_id; }rtw_network_info_t; -#if defined(__IAR_SYSTEMS_ICC__) +#if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) #pragma pack(1) #endif + +/** + * @brief The structure is used to describe the scan result of the AP. + */ typedef struct rtw_scan_result { rtw_ssid_t SSID; /**< Service Set Identification (i.e. Name of Access Point) */ rtw_mac_t BSSID; /**< Basic Service Set Identification (i.e. MAC address of Access Point) */ - signed short signal_strength; /**< Receive Signal Strength Indication in dBm. <-90=Very poor, >-30=Excellent */ + signed short signal_strength; /**< Receive Signal Strength Indication in dBm. <-90=Very poor, >-30=Excellent */ rtw_bss_type_t bss_type; /**< Network type */ rtw_security_t security; /**< Security type */ rtw_wps_type_t wps_type; /**< WPS type */ - unsigned int channel; /**< Radio channel that the AP beacon was received on */ + unsigned int channel; /**< Radio channel that the AP beacon was received on */ rtw_802_11_band_t band; /**< Radio band */ } rtw_scan_result_t; -#if defined(__IAR_SYSTEMS_ICC__) +#if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) #pragma pack() #endif +/** + * @brief The structure is used to describe the data needed by scan result handler function. + */ typedef struct rtw_scan_handler_result { rtw_scan_result_t ap_details; rtw_bool_t scan_complete; @@ -70,21 +117,28 @@ typedef struct rtw_scan_handler_result { } rtw_scan_handler_result_t; -#if defined(__IAR_SYSTEMS_ICC__) +#if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) #pragma pack(1) #endif + +/** + * @brief The structure is used to store the WIFI setting gotten from WIFI driver. + */ typedef struct rtw_wifi_setting { - rtw_mode_t mode; + rtw_mode_t mode; unsigned char ssid[33]; unsigned char channel; rtw_security_t security_type; unsigned char password[65]; unsigned char key_idx; -} rtw_wifi_setting_t; -#if defined(__IAR_SYSTEMS_ICC__) +}rtw_wifi_setting_t; +#if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) #pragma pack() #endif +/** + * @brief The structure is used to describe the setting when configure the network. + */ typedef struct rtw_wifi_config { unsigned int boot_mode; unsigned char ssid[32]; @@ -95,19 +149,27 @@ typedef struct rtw_wifi_config { unsigned char channel; } rtw_wifi_config_t; +/** + * @brief The structure is used to describe the maclist. + */ typedef struct { unsigned int count; /**< Number of MAC addresses in the list */ rtw_mac_t mac_list[1]; /**< Variable length array of MAC addresses */ } rtw_maclist_t; +/** + * @brief The structure is used to describe the bss info of the network.\n + * It include the version, BSSID, beacon_period, capability, SSID, + * channel, atm_window, dtim_period, RSSI e.g. + */ typedef struct { - unsigned int version; /* version field */ - unsigned int length; /* byte length of data in this record, */ + unsigned int version; /**< version field */ + unsigned int length; /**< byte length of data in this record, */ /* starting at version and including IEs */ rtw_mac_t BSSID; - unsigned short beacon_period; /* units are Kusec */ - unsigned short capability; /* Capability information */ + unsigned short beacon_period; /**< units are Kusec */ + unsigned short capability; /**< Capability information */ unsigned char SSID_len; unsigned char SSID[32]; unsigned char channel; @@ -116,18 +178,21 @@ typedef struct { // uint8_t rates[16]; /* rates in 500kbps units w/hi bit set if basic */ // } rateset; /* supported rates */ // rtw_chanspec_t chanspec; /* chanspec for bss */ - unsigned short atim_window; /* units are Kusec */ - unsigned char dtim_period; /* DTIM period */ - signed short RSSI; /* receive signal strength (in dBm) */ + unsigned short atim_window; /**< units are Kusec */ + unsigned char dtim_period; /**< DTIM period */ + signed short RSSI; /**< receive signal strength (in dBm) */ - unsigned char n_cap; /* BSS is 802.11N Capable */ - unsigned int nbss_cap; /* 802.11N BSS Capabilities (based on HT_CAP_*) */ - unsigned char basic_mcs[MCSSET_LEN]; /* 802.11N BSS required MCS set */ + unsigned char n_cap; /**< BSS is 802.11N Capable */ + unsigned int nbss_cap; /**< 802.11N BSS Capabilities (based on HT_CAP_*) */ + unsigned char basic_mcs[MCSSET_LEN]; /**< 802.11N BSS required MCS set */ - unsigned short ie_offset; /* offset at which IEs start, from beginning */ - unsigned int ie_length; /* byte length of Information Elements */ + unsigned short ie_offset; /**< offset at which IEs start, from beginning */ + unsigned int ie_length; /**< byte length of Information Elements */ } rtw_bss_info_t; +/** + * @brief The structure is used to set WIFI packet filter pattern. + */ typedef struct { unsigned short offset; /**< Offset in bytes to start filtering (referenced to the start of the ethernet packet) */ unsigned short mask_size; /**< Size of the mask in bytes */ @@ -159,7 +224,6 @@ typedef struct rtw_mac_filter_list{ unsigned char mac_addr[6]; }rtw_mac_filter_list_t; - #ifdef __cplusplus } #endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_basic_types.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_basic_types.h new file mode 100644 index 0000000..f7bd19f --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_basic_types.h @@ -0,0 +1,610 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __WLAN_BASIC_TYPES_H__ +#define __WLAN_BASIC_TYPES_H__ + + +/* ================================================ + * Sections (1) rtl8195a and (2) other MCU based wlan driver + * For 8195a, some of the definitions are already defined in system wise "basic_types.h" + *================================================ */ +#define _SUCCESS 1 +#define _PASS 1 +#define _FAIL 0 + +//ERRNO Define +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define EDEADLK 35 /* Resource deadlock would occur */ +#define ENAMETOOLONG 36 /* File name too long */ +#define ENOLCK 37 /* No record locks available */ +#define ENOSYS 38 /* Function not implemented */ +#define ENOTEMPTY 39 /* Directory not empty */ +#define ELOOP 40 /* Too many symbolic links encountered */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define ENOMSG 42 /* No message of desired type */ +#define EIDRM 43 /* Identifier removed */ +#define ECHRNG 44 /* Channel number out of range */ +#define EL2NSYNC 45 /* Level 2 not synchronized */ +#define EL3HLT 46 /* Level 3 halted */ +#define EL3RST 47 /* Level 3 reset */ +#define ELNRNG 48 /* Link number out of range */ +#define EUNATCH 49 /* Protocol driver not attached */ +#define ENOCSI 50 /* No CSI structure available */ +#define EL2HLT 51 /* Level 2 halted */ +#define EBADE 52 /* Invalid exchange */ +#define EBADR 53 /* Invalid request descriptor */ +#define EXFULL 54 /* Exchange full */ +#define ENOANO 55 /* No anode */ +#define EBADRQC 56 /* Invalid request code */ +#define EBADSLT 57 /* Invalid slot */ + +#define EDEADLOCK EDEADLK + +#define EBFONT 59 /* Bad font file format */ +#define ENOSTR 60 /* Device not a stream */ +#define ENODATA 61 /* No data available */ +#define ETIME 62 /* Timer expired */ +#define ENOSR 63 /* Out of streams resources */ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* Object is remote */ +#define ENOLINK 67 /* Link has been severed */ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 72 /* Multihop attempted */ +#define EDOTDOT 73 /* RFS specific error */ +#define EBADMSG 74 /* Not a data message */ +#define EOVERFLOW 75 /* Value too large for defined data type */ +#define ENOTUNIQ 76 /* Name not unique on network */ +#define EBADFD 77 /* File descriptor in bad state */ +#define EREMCHG 78 /* Remote address changed */ +#define ELIBACC 79 /* Can not access a needed shared library */ +#define ELIBBAD 80 /* Accessing a corrupted shared library */ +#define ELIBSCN 81 /* .lib section in a.out corrupted */ +#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ +#define ELIBEXEC 83 /* Cannot exec a shared library directly */ +#define EILSEQ 84 /* Illegal byte sequence */ +#define ERESTART 85 /* Interrupted system call should be restarted */ +#define ESTRPIPE 86 /* Streams pipe error */ +#define EUSERS 87 /* Too many users */ +#define ENOTSOCK 88 /* Socket operation on non-socket */ +#define EDESTADDRREQ 89 /* Destination address required */ +#define EMSGSIZE 90 /* Message too long */ +#define EPROTOTYPE 91 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 92 /* Protocol not available */ +#define EPROTONOSUPPORT 93 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ +#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ +#define EADDRINUSE 98 /* Address already in use */ +#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ +#define ENETDOWN 100 /* Network is down */ +#define ENETUNREACH 101 /* Network is unreachable */ +#define ENETRESET 102 /* Network dropped connection because of reset */ +#define ECONNABORTED 103 /* Software caused connection abort */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EISCONN 106 /* Transport endpoint is already connected */ +#define ENOTCONN 107 /* Transport endpoint is not connected */ +#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ +#define ETOOMANYREFS 109 /* Too many references: cannot splice */ +#define ETIMEDOUT 110 /* Connection timed out */ +#define ECONNREFUSED 111 /* Connection refused */ +#define EHOSTDOWN 112 /* Host is down */ +#define EHOSTUNREACH 113 /* No route to host */ +#define EALREADY 114 /* Operation already in progress */ +#define EINPROGRESS 115 /* Operation now in progress */ +#define ESTALE 116 /* Stale NFS file handle */ +#define EUCLEAN 117 /* Structure needs cleaning */ +#define ENOTNAM 118 /* Not a XENIX named type file */ +#define ENAVAIL 119 /* No XENIX semaphores available */ +#define EISNAM 120 /* Is a named type file */ +#define EREMOTEIO 121 /* Remote I/O error */ +#define EDQUOT 122 /* Quota exceeded */ + +#define ENOMEDIUM 123 /* No medium found */ +#define EMEDIUMTYPE 124 /* Wrong medium type */ + + +#define ENSROK 0 /* DNS server returned answer with no data */ +#define ENSRNODATA 160 /* DNS server returned answer with no data */ +#define ENSRFORMERR 161 /* DNS server claims query was misformatted */ +#define ENSRSERVFAIL 162 /* DNS server returned general failure */ +#define ENSRNOTFOUND 163 /* Domain name not found */ +#define ENSRNOTIMP 164 /* DNS server does not implement requested operation */ +#define ENSRREFUSED 165 /* DNS server refused query */ +#define ENSRBADQUERY 166 /* Misformatted DNS query */ +#define ENSRBADNAME 167 /* Misformatted domain name */ +#define ENSRBADFAMILY 168 /* Unsupported address family */ +#define ENSRBADRESP 169 /* Misformatted DNS reply */ +#define ENSRCONNREFUSED 170 /* Could not contact DNS servers */ +#define ENSRTIMEOUT 171 /* Timeout while contacting DNS servers */ +#define ENSROF 172 /* End of file */ +#define ENSRFILE 173 /* Error reading file */ +#define ENSRNOMEM 174 /* Out of memory */ +#define ENSRDESTRUCTION 175 /* Application terminated lookup */ +#define ENSRQUERYDOMAINTOOLONG 176 /* Domain name is too long */ +#define ENSRCNAMELOOP 177 /* Domain name is too long */ + + + + + + + +/* ================================================ + * Sections only for other MCU based wlan driver + *========================================== ======*/ + #if !defined(CONFIG_PLATFORM_8195A) && !defined(CONFIG_PLATFORM_8711B) +#include + +#define SUCCESS 0 +#define FAIL (-1) + +#ifndef TRUE + #define _TRUE 1 +#else + #define _TRUE TRUE +#endif + +#ifndef FALSE + #define _FALSE 0 +#else + #define _FALSE FALSE +#endif + +// +// pack & weak attribute +// +#if defined (__ICCARM__) + +#define RTW_PACK_STRUCT_BEGIN +#define RTW_PACK_STRUCT_STRUCT +#define RTW_PACK_STRUCT_END +#define RTW_PACK_STRUCT_USE_INCLUDES + +#define RTW_WEAK __weak + +#elif defined (__CC_ARM) + +#define RTW_PACK_STRUCT_BEGIN __packed +#define RTW_PACK_STRUCT_STRUCT +#define RTW_PACK_STRUCT_END + +#define RTW_WEAK __weak + +#elif defined (__GNUC__) + +#define RTW_PACK_STRUCT_BEGIN +#define RTW_PACK_STRUCT_STRUCT __attribute__ ((__packed__)) +#define RTW_PACK_STRUCT_END + +#define RTW_WEAK __attribute__ ((weak)) + +#elif defined(PLATFORM_WINDOWS) + +#define RTW_PACK_STRUCT_BEGIN +#define RTW_PACK_STRUCT_STRUCT +#define RTW_PACK_STRUCT_END +#define RTW_PACK_STRUCT_USE_INCLUDES +#endif + +#ifndef BIT + #define BIT(x) ((u32)1 << (x)) +#endif + +#if !defined(CONFIG_PLATFORM_8195A) && !defined(CONFIG_PLATFORM_8711B) +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 +#define BIT32 0x0100000000 +#define BIT33 0x0200000000 +#define BIT34 0x0400000000 +#define BIT35 0x0800000000 +#define BIT36 0x1000000000 +#endif + + +#ifdef PLATFORM_ECOS + + #define IN + #define OUT + #define VOID void + #define NDIS_OID uint + #define NDIS_STATUS uint + + typedef unsigned int uint; + typedef signed int sint; + + #ifndef PVOID + typedef void * PVOID; + #endif + + + typedef unsigned int __kernel_size_t; + typedef int __kernel_ssize_t; + + typedef __kernel_size_t SIZE_T; + typedef __kernel_ssize_t SSIZE_T; + #define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field) + +#endif + + +#ifdef PLATFORM_WINDOWS + + typedef signed char s8; + typedef unsigned char u8; + + typedef signed short s16; + typedef unsigned short u16; + + typedef signed long s32; + typedef unsigned long u32; + + typedef unsigned int uint; + typedef signed int sint; + + + typedef signed long long s64; + typedef unsigned long long u64; + + #ifdef NDIS50_MINIPORT + + #define NDIS_MAJOR_VERSION 5 + #define NDIS_MINOR_VERSION 0 + + #endif + + #ifdef NDIS51_MINIPORT + + #define NDIS_MAJOR_VERSION 5 + #define NDIS_MINOR_VERSION 1 + + #endif + + typedef NDIS_PROC proc_t; + + typedef LONG atomic_t; + +#endif + + +#ifdef PLATFORM_LINUX + + #include + #define IN + #define OUT + #define VOID void + #define NDIS_OID uint + #define NDIS_STATUS uint + + typedef signed int sint; + + #ifndef PVOID + typedef void * PVOID; + //#define PVOID (void *) + #endif + + typedef void (*proc_t)(void*); + + typedef __kernel_size_t SIZE_T; + typedef __kernel_ssize_t SSIZE_T; + #define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field) + +#endif + + +#ifdef PLATFORM_FREEBSD + typedef signed char s8; + typedef unsigned char u8; + + typedef signed short s16; + typedef unsigned short u16; + + typedef signed int s32; + typedef unsigned int u32; + + typedef unsigned int uint; + typedef signed int sint; + typedef long atomic_t; + + typedef signed long long s64; + typedef unsigned long long u64; + #define IN + #define OUT + #define VOID void + #define NDIS_OID uint + #define NDIS_STATUS uint + + #ifndef PVOID + typedef void * PVOID; + //#define PVOID (void *) + #endif + typedef u32 dma_addr_t; + + typedef void (*proc_t)(void*); + + typedef unsigned int __kernel_size_t; + typedef int __kernel_ssize_t; + + typedef __kernel_size_t SIZE_T; + typedef __kernel_ssize_t SSIZE_T; + #define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field) + +#endif + + +#define MEM_ALIGNMENT_OFFSET (sizeof (SIZE_T)) +#define MEM_ALIGNMENT_PADDING (sizeof(SIZE_T) - 1) + +#define SIZE_PTR SIZE_T +#define SSIZE_PTR SSIZE_T + +//port from fw by thomas +// TODO: Belows are Sync from SD7-Driver. It is necessary to check correctness + +/* + * Call endian free function when + * 1. Read/write packet content. + * 2. Before write integer to IO. + * 3. After read integer from IO. +*/ + +// +// Byte Swapping routine. +// +#define EF1Byte +#define EF2Byte le16_to_cpu +#define EF4Byte le32_to_cpu + +// +// Read LE format data from memory +// +#define ReadEF1Byte(_ptr) EF1Byte(*((u8 *)(_ptr))) +#define ReadEF2Byte(_ptr) EF2Byte(*((u16 *)(_ptr))) +#define ReadEF4Byte(_ptr) EF4Byte(*((u32 *)(_ptr))) + +// +// Write LE data to memory +// +#define WriteEF1Byte(_ptr, _val) (*((u8 *)(_ptr)))=EF1Byte(_val) +#define WriteEF2Byte(_ptr, _val) (*((u16 *)(_ptr)))=EF2Byte(_val) +#define WriteEF4Byte(_ptr, _val) (*((u32 *)(_ptr)))=EF4Byte(_val) + +// +// Example: +// BIT_LEN_MASK_32(0) => 0x00000000 +// BIT_LEN_MASK_32(1) => 0x00000001 +// BIT_LEN_MASK_32(2) => 0x00000003 +// BIT_LEN_MASK_32(32) => 0xFFFFFFFF +// +#define BIT_LEN_MASK_32(__BitLen) \ + (0xFFFFFFFF >> (32 - (__BitLen))) +// +// Example: +// BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003 +// BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000 +// +#define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_32(__BitLen) << (__BitOffset)) + +// +// Description: +// Return 4-byte value in host byte ordering from +// 4-byte pointer in litten-endian system. +// +#define LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ + (EF4Byte(*((u32 *)(__pStart)))) + +// +// Description: +// Translate subfield (continuous bits in little-endian) of 4-byte value in litten byte to +// 4-byte value in host byte ordering. +// +#define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_32(__BitLen) \ + ) + +// +// Description: +// Mask subfield (continuous bits in little-endian) of 4-byte value in litten byte oredering +// and return the result in 4-byte value in host byte ordering. +// +#define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \ + ) + +// +// Description: +// Set subfield of little-endian 4-byte value to specified value. +// +#define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u32 *)(__pStart)) = \ + EF4Byte( \ + LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \ + ); + + +#define BIT_LEN_MASK_16(__BitLen) \ + (0xFFFF >> (16 - (__BitLen))) + +#define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_16(__BitLen) << (__BitOffset)) + +#define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ + (EF2Byte(*((u16 *)(__pStart)))) + +#define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_16(__BitLen) \ + ) + +#define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \ + ) + +#define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u16 *)(__pStart)) = \ + EF2Byte( \ + LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \ + ); + +#define BIT_LEN_MASK_8(__BitLen) \ + (0xFF >> (8 - (__BitLen))) + +#define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_8(__BitLen) << (__BitOffset)) + +#define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + (EF1Byte(*((u8 *)(__pStart)))) + +#define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_8(__BitLen) \ + ) + +#define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \ + ) + +#define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u8 *)(__pStart)) = \ + EF1Byte( \ + LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \ + ); + +//pclint +#define LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + ) + +//pclint +#define SET_BITS_TO_LE_1BYTE_8BIT(__pStart, __BitOffset, __BitLen, __Value) \ +{ \ + *((u8*)(__pStart)) = \ + EF1Byte( \ + LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \ + | \ + ((u8)__Value) \ + ); \ +} + +// Get the N-bytes aligment offset from the current length +#define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment)) + +typedef unsigned char BOOLEAN,*PBOOLEAN; + +#define TEST_FLAG(__Flag,__testFlag) (((__Flag) & (__testFlag)) != 0) + + + +#endif//! defined(CONFIG_PLATFORM_8195A) + +#endif //__WLAN_BASIC_TYPES_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_bssdef.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_bssdef.h new file mode 100644 index 0000000..8701d02 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_bssdef.h @@ -0,0 +1,756 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __WLAN_BSSDEF_H__ +#define __WLAN_BSSDEF_H__ + + +#define MAX_IE_SZ 768 //384// + +#if defined(PLATFORM_LINUX) || defined(PLATFORM_ECOS) || defined(PLATFORM_FREERTOS) || defined(PLATFORM_CMSIS_RTOS) +#define NDIS_802_11_LENGTH_SSID 32 +#define NDIS_802_11_LENGTH_RATES 8 +#define NDIS_802_11_LENGTH_RATES_EX 16 + +typedef unsigned char NDIS_802_11_MAC_ADDRESS[6]; +typedef long NDIS_802_11_RSSI; // in dBm +typedef unsigned char NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; // Set of 8 data rates +typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; // Set of 16 data rates + + +typedef u32 NDIS_802_11_KEY_INDEX; +typedef unsigned long long NDIS_802_11_KEY_RSC; + + +typedef struct _NDIS_802_11_SSID +{ + u32 SsidLength; + u8 Ssid[NDIS_802_11_LENGTH_SSID+4]; +} +#ifdef __CC_ARM +__attribute__((packed)) +#endif +NDIS_802_11_SSID, *PNDIS_802_11_SSID; + +typedef enum _NDIS_802_11_NETWORK_TYPE +{ + Ndis802_11FH, + Ndis802_11DS, + Ndis802_11OFDM5, + Ndis802_11OFDM24, + Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound +} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE; + +typedef struct _NDIS_802_11_CONFIGURATION_FH +{ + u32 Length; // Length of structure + u32 HopPattern; // As defined by 802.11, MSB set + u32 HopSet; // to one if non-802.11 + u32 DwellTime; // units are Kusec +} +#ifdef __CC_ARM +__attribute__((packed)) +#endif +NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH; + + +/* + FW will only save the channel number in DSConfig. + ODI Handler will convert the channel number to freq. number. +*/ +typedef struct _NDIS_802_11_CONFIGURATION +{ + u32 Length; // Length of structure + u32 BeaconPeriod; // units are Kusec + u32 ATIMWindow; // units are Kusec + u32 DSConfig; // Frequency, units are kHz + NDIS_802_11_CONFIGURATION_FH FHConfig; +} +#ifdef __CC_ARM +__attribute__((packed)) +#endif +NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; + + + +typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE +{ + Ndis802_11IBSS, + Ndis802_11Infrastructure, + Ndis802_11AutoUnknown, + Ndis802_11InfrastructureMax, // Not a real value, defined as upper bound + Ndis802_11APMode +} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE; + + + + + +typedef struct _NDIS_802_11_FIXED_IEs +{ + u8 Timestamp[8]; + u16 BeaconInterval; + u16 Capabilities; +} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs; + + + +typedef struct _NDIS_802_11_VARIABLE_IEs +{ + u8 ElementID; + u8 Length; + u8 data[1]; +} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs; + + + +/* + + + +Length is the 4 bytes multiples of the sume of + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (u32) ++ sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION) ++ sizeof (NDIS_802_11_RATES_EX) + IELength + +Except the IELength, all other fields are fixed length. Therefore, we can define a marco to present the +partial sum. + +*/ +#if 0 +typedef struct _NDIS_WLAN_BSSID_EX +{ + u32 Length; + NDIS_802_11_MAC_ADDRESS MacAddress; + u8 Reserved[2];//[0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity; + NDIS_802_11_SSID Ssid; + u32 Privacy; + NDIS_802_11_RSSI Rssi; + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; + NDIS_802_11_CONFIGURATION Configuration; + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; + NDIS_802_11_RATES_EX SupportedRates; + u32 IELength; + u8 IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information) +} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX; + + +typedef struct _NDIS_802_11_BSSID_LIST_EX +{ + u32 NumberOfItems; + NDIS_WLAN_BSSID_EX Bssid[1]; +} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX; +#endif + +typedef enum _NDIS_802_11_AUTHENTICATION_MODE +{ + Ndis802_11AuthModeOpen, + Ndis802_11AuthModeShared, + Ndis802_11AuthModeAutoSwitch, + Ndis802_11AuthModeWPA, + Ndis802_11AuthModeWPAPSK, + Ndis802_11AuthModeWPANone, + Ndis802_11AuthModeWAPI, + Ndis802_11AuthModeMax // Not a real mode, defined as upper bound +} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE; + +typedef enum _NDIS_802_11_WEP_STATUS +{ + Ndis802_11WEPEnabled, + Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, + Ndis802_11WEPDisabled, + Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, + Ndis802_11WEPKeyAbsent, + Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, + Ndis802_11WEPNotSupported, + Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, + Ndis802_11Encryption2Enabled, + Ndis802_11Encryption2KeyAbsent, + Ndis802_11Encryption3Enabled, + Ndis802_11Encryption3KeyAbsent, + Ndis802_11_EncrypteionWAPI +} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, + NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS; + + +#define NDIS_802_11_AI_REQFI_CAPABILITIES 1 +#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2 +#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4 + +#define NDIS_802_11_AI_RESFI_CAPABILITIES 1 +#define NDIS_802_11_AI_RESFI_STATUSCODE 2 +#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4 + +typedef struct _NDIS_802_11_AI_REQFI +{ + u16 Capabilities; + u16 ListenInterval; + NDIS_802_11_MAC_ADDRESS CurrentAPAddress; +} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI; + +typedef struct _NDIS_802_11_AI_RESFI +{ + u16 Capabilities; + u16 StatusCode; + u16 AssociationId; +} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI; + +typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION +{ + u32 Length; + u16 AvailableRequestFixedIEs; + NDIS_802_11_AI_REQFI RequestFixedIEs; + u32 RequestIELength; + u32 OffsetRequestIEs; + u16 AvailableResponseFixedIEs; + NDIS_802_11_AI_RESFI ResponseFixedIEs; + u32 ResponseIELength; + u32 OffsetResponseIEs; +} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION; + +typedef enum _NDIS_802_11_RELOAD_DEFAULTS +{ + Ndis802_11ReloadWEPKeys +} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS; + + +// Key mapping keys require a BSSID +typedef struct _NDIS_802_11_KEY +{ + u32 Length; // Length of this structure + u32 KeyIndex; + u32 KeyLength; // length of key in bytes + NDIS_802_11_MAC_ADDRESS BSSID; + NDIS_802_11_KEY_RSC KeyRSC; + u8 KeyMaterial[32]; // variable length depending on above field +} NDIS_802_11_KEY, *PNDIS_802_11_KEY; + +typedef struct _NDIS_802_11_REMOVE_KEY +{ + u32 Length; // Length of this structure + u32 KeyIndex; + NDIS_802_11_MAC_ADDRESS BSSID; +} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY; + +typedef struct _NDIS_802_11_WEP +{ + u32 Length; // Length of this structure + u32 KeyIndex; // 0 is the per-client key, 1-N are the global keys + u32 KeyLength; // length of key in bytes + u8 KeyMaterial[16];// variable length depending on above field +} NDIS_802_11_WEP, *PNDIS_802_11_WEP; + +typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST +{ + u32 Length; // Length of structure + NDIS_802_11_MAC_ADDRESS Bssid; + u32 Flags; +} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST; + +typedef enum _NDIS_802_11_STATUS_TYPE +{ + Ndis802_11StatusType_Authentication, + Ndis802_11StatusType_MediaStreamMode, + Ndis802_11StatusType_PMKID_CandidateList, + Ndis802_11StatusTypeMax // not a real type, defined as an upper bound +} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE; + +typedef struct _NDIS_802_11_STATUS_INDICATION +{ + NDIS_802_11_STATUS_TYPE StatusType; +} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION; + +// mask for authentication/integrity fields +#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f +#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01 +#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02 +#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06 +#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E + +// MIC check time, 60 seconds. +#define MIC_CHECK_TIME 60000000 + +typedef struct _NDIS_802_11_AUTHENTICATION_EVENT +{ + NDIS_802_11_STATUS_INDICATION Status; + NDIS_802_11_AUTHENTICATION_REQUEST Request[1]; +} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT; + +typedef struct _NDIS_802_11_TEST +{ + u32 Length; + u32 Type; + union + { + NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent; + NDIS_802_11_RSSI RssiTrigger; + }tt; +} NDIS_802_11_TEST, *PNDIS_802_11_TEST; + + +#endif //end of #ifdef PLATFORM_LINUX + +#ifdef PLATFORM_FREEBSD + +#define NDIS_802_11_LENGTH_SSID 32 +#define NDIS_802_11_LENGTH_RATES 8 +#define NDIS_802_11_LENGTH_RATES_EX 16 + +typedef unsigned char NDIS_802_11_MAC_ADDRESS[6]; +typedef long NDIS_802_11_RSSI; // in dBm +typedef unsigned char NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; // Set of 8 data rates +typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; // Set of 16 data rates + + +typedef u32 NDIS_802_11_KEY_INDEX; +typedef unsigned long long NDIS_802_11_KEY_RSC; + + +typedef struct _NDIS_802_11_SSID +{ + u32 SsidLength; + u8 Ssid[32]; +} NDIS_802_11_SSID, *PNDIS_802_11_SSID; + +typedef enum _NDIS_802_11_NETWORK_TYPE +{ + Ndis802_11FH, + Ndis802_11DS, + Ndis802_11OFDM5, + Ndis802_11OFDM24, + Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound +} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE; + +typedef struct _NDIS_802_11_CONFIGURATION_FH +{ + u32 Length; // Length of structure + u32 HopPattern; // As defined by 802.11, MSB set + u32 HopSet; // to one if non-802.11 + u32 DwellTime; // units are Kusec +} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH; + + +/* + FW will only save the channel number in DSConfig. + ODI Handler will convert the channel number to freq. number. +*/ +typedef struct _NDIS_802_11_CONFIGURATION +{ + u32 Length; // Length of structure + u32 BeaconPeriod; // units are Kusec + u32 ATIMWindow; // units are Kusec + u32 DSConfig; // Frequency, units are kHz + NDIS_802_11_CONFIGURATION_FH FHConfig; +} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; + + + +typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE +{ + Ndis802_11IBSS, + Ndis802_11Infrastructure, + Ndis802_11AutoUnknown, + Ndis802_11InfrastructureMax, // Not a real value, defined as upper bound + Ndis802_11APMode +} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE; + + + + + +typedef struct _NDIS_802_11_FIXED_IEs +{ + u8 Timestamp[8]; + u16 BeaconInterval; + u16 Capabilities; +} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs; + + + +typedef struct _NDIS_802_11_VARIABLE_IEs +{ + u8 ElementID; + u8 Length; + u8 data[1]; +} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs; + + + +/* + + + +Length is the 4 bytes multiples of the sume of + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (u32) ++ sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION) ++ sizeof (NDIS_802_11_RATES_EX) + IELength + +Except the IELength, all other fields are fixed length. Therefore, we can define a marco to present the +partial sum. + +*/ +#if 0 +typedef struct _NDIS_WLAN_BSSID_EX +{ + u32 Length; + NDIS_802_11_MAC_ADDRESS MacAddress; + u8 Reserved[2];//[0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity; + NDIS_802_11_SSID Ssid; + u32 Privacy; + NDIS_802_11_RSSI Rssi; + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; + NDIS_802_11_CONFIGURATION Configuration; + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; + NDIS_802_11_RATES_EX SupportedRates; + u32 IELength; + u8 IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information) +} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX; + + +typedef struct _NDIS_802_11_BSSID_LIST_EX +{ + u32 NumberOfItems; + NDIS_WLAN_BSSID_EX Bssid[1]; +} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX; +#endif + +typedef enum _NDIS_802_11_AUTHENTICATION_MODE +{ + Ndis802_11AuthModeOpen, + Ndis802_11AuthModeShared, + Ndis802_11AuthModeAutoSwitch, + Ndis802_11AuthModeWPA, + Ndis802_11AuthModeWPAPSK, + Ndis802_11AuthModeWPANone, + Ndis802_11AuthModeMax // Not a real mode, defined as upper bound +} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE; + +typedef enum _NDIS_802_11_WEP_STATUS +{ + Ndis802_11WEPEnabled, + Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, + Ndis802_11WEPDisabled, + Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, + Ndis802_11WEPKeyAbsent, + Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, + Ndis802_11WEPNotSupported, + Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, + Ndis802_11Encryption2Enabled, + Ndis802_11Encryption2KeyAbsent, + Ndis802_11Encryption3Enabled, + Ndis802_11Encryption3KeyAbsent +} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, + NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS; + + +#define NDIS_802_11_AI_REQFI_CAPABILITIES 1 +#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2 +#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4 + +#define NDIS_802_11_AI_RESFI_CAPABILITIES 1 +#define NDIS_802_11_AI_RESFI_STATUSCODE 2 +#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4 + +typedef struct _NDIS_802_11_AI_REQFI +{ + u16 Capabilities; + u16 ListenInterval; + NDIS_802_11_MAC_ADDRESS CurrentAPAddress; +} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI; + +typedef struct _NDIS_802_11_AI_RESFI +{ + u16 Capabilities; + u16 StatusCode; + u16 AssociationId; +} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI; + +typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION +{ + u32 Length; + u16 AvailableRequestFixedIEs; + NDIS_802_11_AI_REQFI RequestFixedIEs; + u32 RequestIELength; + u32 OffsetRequestIEs; + u16 AvailableResponseFixedIEs; + NDIS_802_11_AI_RESFI ResponseFixedIEs; + u32 ResponseIELength; + u32 OffsetResponseIEs; +} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION; + +typedef enum _NDIS_802_11_RELOAD_DEFAULTS +{ + Ndis802_11ReloadWEPKeys +} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS; + + +// Key mapping keys require a BSSID +typedef struct _NDIS_802_11_KEY +{ + u32 Length; // Length of this structure + u32 KeyIndex; + u32 KeyLength; // length of key in bytes + NDIS_802_11_MAC_ADDRESS BSSID; + NDIS_802_11_KEY_RSC KeyRSC; + u8 KeyMaterial[32]; // variable length depending on above field +} NDIS_802_11_KEY, *PNDIS_802_11_KEY; + +typedef struct _NDIS_802_11_REMOVE_KEY +{ + u32 Length; // Length of this structure + u32 KeyIndex; + NDIS_802_11_MAC_ADDRESS BSSID; +} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY; + +typedef struct _NDIS_802_11_WEP +{ + u32 Length; // Length of this structure + u32 KeyIndex; // 0 is the per-client key, 1-N are the global keys + u32 KeyLength; // length of key in bytes + u8 KeyMaterial[16];// variable length depending on above field +} NDIS_802_11_WEP, *PNDIS_802_11_WEP; + +typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST +{ + u32 Length; // Length of structure + NDIS_802_11_MAC_ADDRESS Bssid; + u32 Flags; +} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST; + +typedef enum _NDIS_802_11_STATUS_TYPE +{ + Ndis802_11StatusType_Authentication, + Ndis802_11StatusType_MediaStreamMode, + Ndis802_11StatusType_PMKID_CandidateList, + Ndis802_11StatusTypeMax // not a real type, defined as an upper bound +} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE; + +typedef struct _NDIS_802_11_STATUS_INDICATION +{ + NDIS_802_11_STATUS_TYPE StatusType; +} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION; + +// mask for authentication/integrity fields +#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f +#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01 +#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02 +#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06 +#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E + +// MIC check time, 60 seconds. +#define MIC_CHECK_TIME 60000000 + +typedef struct _NDIS_802_11_AUTHENTICATION_EVENT +{ + NDIS_802_11_STATUS_INDICATION Status; + NDIS_802_11_AUTHENTICATION_REQUEST Request[1]; +} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT; + +typedef struct _NDIS_802_11_TEST +{ + u32 Length; + u32 Type; + union + { + NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent; + NDIS_802_11_RSSI RssiTrigger; + }tt; +} NDIS_802_11_TEST, *PNDIS_802_11_TEST; + + +#endif //PLATFORM_FREEBSD + +typedef struct _WLAN_PHY_INFO +{ + u8 SignalStrength; //(in percentage) + u8 SignalQuality; //(in percentage) + u8 Optimum_antenna; //for Antenna diversity + u8 Reserved_0; +} +#ifdef __CC_ARM +__attribute__((packed)) +#endif +WLAN_PHY_INFO,*PWLAN_PHY_INFO; + +typedef struct _WLAN_BCN_INFO +{ + /* these infor get from rtw_get_encrypt_info when + * * translate scan to UI */ + u8 encryp_protocol; //ENCRYP_PROTOCOL_E: OPEN/WEP/WPA/WPA2/WAPI + int group_cipher; //WPA/WPA2 group cipher + int pairwise_cipher; //WPA/WPA2/WEP pairwise cipher + int is_8021x; + + /* bwmode 20/40 and ch_offset UP/LOW */ + unsigned short ht_cap_info; + unsigned char ht_info_infos_0; +} WLAN_BCN_INFO,*PWLAN_BCN_INFO; + +/* temporally add #pragma pack for structure alignment issue of +* WLAN_BSSID_EX and get_WLAN_BSSID_EX_sz() +*/ +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_begin.h" +#endif +RTW_PACK_STRUCT_BEGIN +typedef struct _WLAN_BSSID_EX +{ + u32 Length; + NDIS_802_11_MAC_ADDRESS MacAddress; + #ifdef CONFIG_P2P_NEW + u8 Reserved[1]; //[0]: IS beacon frame + u8 bP2pNetwork; + #else + u8 Reserved[2]; //[0]: IS beacon frame + #endif + NDIS_802_11_SSID Ssid; + u32 Privacy; + NDIS_802_11_RSSI Rssi; //(in dBM,raw data ,get from PHY) + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; + NDIS_802_11_CONFIGURATION Configuration; + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; + NDIS_802_11_RATES_EX SupportedRates; + WLAN_PHY_INFO PhyInfo; + u32 IELength; + u8 IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information) +} +RTW_PACK_STRUCT_STRUCT +WLAN_BSSID_EX, *PWLAN_BSSID_EX; +RTW_PACK_STRUCT_END +#ifdef RTW_PACK_STRUCT_USE_INCLUDES +# include "pack_end.h" +#endif + + +__inline static uint get_WLAN_BSSID_EX_sz(WLAN_BSSID_EX *bss) +{ +#if 0 + uint t_len; + + t_len = sizeof (u32) + + sizeof (NDIS_802_11_MAC_ADDRESS) + + 2 + + sizeof (NDIS_802_11_SSID) + + sizeof (u32) + + sizeof (NDIS_802_11_RSSI) + + sizeof (NDIS_802_11_NETWORK_TYPE) + + sizeof (NDIS_802_11_CONFIGURATION) + + sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) + + sizeof (NDIS_802_11_RATES_EX) + //all new member add here + + sizeof(WLAN_PHY_INFO) + //all new member add here + + sizeof (u32) + + bss->IELength; + return t_len; +#else + return (sizeof(WLAN_BSSID_EX) -MAX_IE_SZ + bss->IELength); +#endif +} + +struct wlan_network { + _list list; + int network_type; //refer to ieee80211.h for WIRELESS_11A/B/G + int fixed; // set to fixed when not to be removed as site-surveying + unsigned long last_scanned; //timestamp for the network + int aid; //will only be valid when a BSS is joinned. + int join_res; + WLAN_BSSID_EX network; //must be the last item + WLAN_BCN_INFO BcnInfo; +#ifdef PLATFORM_WINDOWS + unsigned char iebuf[MAX_IE_SZ]; +#endif + +}; + +enum VRTL_CARRIER_SENSE +{ + DISABLE_VCS, + ENABLE_VCS, + AUTO_VCS +}; + +enum VCS_TYPE +{ + NONE_VCS, + RTS_CTS, + CTS_TO_SELF +}; + + + + +#define PWR_CAM 0 +#define PWR_MINPS 1 +#define PWR_MAXPS 2 +#define PWR_UAPSD 3 +#define PWR_VOIP 4 + + +enum UAPSD_MAX_SP +{ + NO_LIMIT, + TWO_MSDU, + FOUR_MSDU, + SIX_MSDU +}; + + +#define NUM_PRE_AUTH_KEY 16 +#define NUM_PMKID_CACHE NUM_PRE_AUTH_KEY + +/* +* WPA2 +*/ + +#ifndef PLATFORM_OS_CE +typedef struct _PMKID_CANDIDATE { + NDIS_802_11_MAC_ADDRESS BSSID; + u32 Flags; +} PMKID_CANDIDATE, *PPMKID_CANDIDATE; + +typedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST +{ + u32 Version; // Version of the structure + u32 NumCandidates; // No. of pmkid candidates + PMKID_CANDIDATE CandidateList[1]; +} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST; + + +typedef struct _NDIS_802_11_AUTHENTICATION_ENCRYPTION +{ + NDIS_802_11_AUTHENTICATION_MODE AuthModeSupported; + NDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported; + +} NDIS_802_11_AUTHENTICATION_ENCRYPTION, *PNDIS_802_11_AUTHENTICATION_ENCRYPTION; + +typedef struct _NDIS_802_11_CAPABILITY +{ + u32 Length; + u32 Version; + u32 NoOfPMKIDs; + u32 NoOfAuthEncryptPairsSupported; + NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1]; + +} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY; +#endif + + +#endif //#ifndef WLAN_BSSDEF_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_lib.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_lib.h index 5559791..0c5936b 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_lib.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_lib.h @@ -245,7 +245,7 @@ extern u8 rtw_cancel_timer(_timer *ptimer); extern BOOL rltk_get_idx_bydev(struct net_device *dev); extern int rltk_wlan_init(int idx_wlan, rtw_mode_t mode); extern void rltk_wlan_deinit(); -extern void rltk_wlan_start(int idx_wlan); +extern int rltk_wlan_start(int idx_wlan); extern int rltk_wlan_check_isup(int idx); extern void rltk_wlan_tx_inc(int idx); extern void rltk_wlan_tx_dec(int idx); diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/HalPhyRf.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/HalPhyRf.h new file mode 100644 index 0000000..0d5c32a --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/HalPhyRf.h @@ -0,0 +1,102 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + #ifndef __HAL_PHY_RF_H__ + #define __HAL_PHY_RF_H__ + +typedef enum _SPUR_CAL_METHOD { + PLL_RESET, + AFE_PHASE_SEL +} SPUR_CAL_METHOD; + +typedef enum _PWRTRACK_CONTROL_METHOD { + BBSWING, + TXAGC, + MIX_MODE +} PWRTRACK_METHOD; + +typedef VOID (*FuncSetPwr)(PDM_ODM_T, PWRTRACK_METHOD, u1Byte, u1Byte); +typedef VOID (*FuncIQK)(PDM_ODM_T, u1Byte, u1Byte, u1Byte); +#if !defined(CONFIG_PLATFORM_8195A) && !defined(CONFIG_PLATFORM_8711B) +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) +typedef VOID (*FuncLCK)(PDM_ODM_T); +#else +typedef VOID (*FuncLCK)(PADAPTER); +#endif +#else +typedef VOID (*FuncLCK)(PDM_ODM_T); +#endif +typedef VOID (*FuncSwing)(PDM_ODM_T, ps1Byte*, ps1Byte*, ps1Byte*, ps1Byte*); +typedef VOID (*FuncSwingXtal)(PDM_ODM_T, ps1Byte*, ps1Byte*); +typedef VOID (*FuncSetXtal)(PDM_ODM_T); + + +typedef struct _TXPWRTRACK_CFG { + u1Byte SwingTableSize_CCK; + u1Byte SwingTableSize_OFDM; + u1Byte Threshold_IQK; + u1Byte AverageThermalNum; + u1Byte RfPathCount; + u4Byte ThermalRegAddr; + FuncSetPwr ODM_TxPwrTrackSetPwr; + FuncIQK DoIQK; + FuncLCK PHY_LCCalibrate; + FuncSwing GetDeltaSwingTable; + FuncSwingXtal GetDeltaSwingXtalTable; + FuncSetXtal ODM_TxXtalTrackSetXtal; +} TXPWRTRACK_CFG, *PTXPWRTRACK_CFG; + +void ConfigureTxpowerTrack( + IN PDM_ODM_T pDM_Odm, + OUT PTXPWRTRACK_CFG pConfig + ); + + +VOID +ODM_ClearTxPowerTrackingState( + IN PDM_ODM_T pDM_Odm + ); + +VOID +ODM_TXPowerTrackingCallback_ThermalMeter( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm +#else + IN PADAPTER Adapter +#endif + ); + + + +#define ODM_TARGET_CHNL_NUM_2G_5G 59 + + +VOID +ODM_ResetIQKResult( + IN PDM_ODM_T pDM_Odm +); +u1Byte +ODM_GetRightChnlPlaceforIQK( + IN u1Byte chnl +); + + +#endif // #ifndef __HAL_PHY_RF_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/PhyDM_Adaptivity.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/PhyDM_Adaptivity.h new file mode 100644 index 0000000..ac29d6f --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/PhyDM_Adaptivity.h @@ -0,0 +1,162 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMADAPTIVITY_H__ +#define __PHYDMADAPTIVITY_H__ + +#define ADAPTIVITY_VERSION "8.4" + +#define PwdBUpperBound 7 +#define DFIRloss 5 + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) +typedef enum _tag_PhyDM_REGULATION_Type { + REGULATION_FCC = 0, + REGULATION_MKK = 1, + REGULATION_ETSI = 2, + REGULATION_WW = 3, + + MAX_REGULATION_NUM = 4 +} PhyDM_REGULATION_TYPE; +#endif + + +typedef enum tag_PhyDM_TRx_MUX_Type +{ + PhyDM_SHUTDOWN = 0, + PhyDM_STANDBY_MODE = 1, + PhyDM_TX_MODE = 2, + PhyDM_RX_MODE = 3 +}PhyDM_Trx_MUX_Type; + +typedef enum tag_PhyDM_MACEDCCA_Type +{ + PhyDM_IGNORE_EDCCA = 0, + PhyDM_DONT_IGNORE_EDCCA = 1 +}PhyDM_MACEDCCA_Type; + +typedef struct _ADAPTIVITY_STATISTICS { + s1Byte TH_L2H_ini_mode2; + s1Byte TH_EDCCA_HL_diff_mode2; + s1Byte TH_EDCCA_HL_diff_backup; + s1Byte IGI_Base; + u1Byte IGI_target; + u1Byte NHMWait; + s1Byte H2L_lb; + s1Byte L2H_lb; + BOOLEAN bFirstLink; + BOOLEAN bCheck; + BOOLEAN DynamicLinkAdaptivity; + u1Byte APNumTH; + u1Byte AdajustIGILevel; + BOOLEAN bStopEDCCA; +} ADAPTIVITY_STATISTICS, *PADAPTIVITY_STATISTICS; + +VOID +Phydm_CheckAdaptivity( + IN PVOID pDM_VOID + ); + +VOID +Phydm_CheckEnvironment( + IN PVOID pDM_VOID + ); + +VOID +Phydm_NHMCounterStatisticsInit( + IN PVOID pDM_VOID + ); + +VOID +Phydm_NHMCounterStatistics( + IN PVOID pDM_VOID + ); + +VOID +Phydm_NHMCounterStatisticsReset( + IN PVOID pDM_VOID +); + +VOID +Phydm_GetNHMCounterStatistics( + IN PVOID pDM_VOID +); + +VOID +Phydm_MACEDCCAState( + IN PVOID pDM_VOID, + IN PhyDM_MACEDCCA_Type State +); + +VOID +Phydm_SetEDCCAThreshold( + IN PVOID pDM_VOID, + IN s1Byte H2L, + IN s1Byte L2H +); + +VOID +Phydm_SetTRxMux( + IN PVOID pDM_VOID, + IN PhyDM_Trx_MUX_Type txMode, + IN PhyDM_Trx_MUX_Type rxMode +); + +BOOLEAN +Phydm_CalNHMcnt( + IN PVOID pDM_VOID +); + +VOID +Phydm_SearchPwdBLowerBound( + IN PVOID pDM_VOID +); + +VOID +Phydm_AdaptivityInit( + IN PVOID pDM_VOID + ); + +VOID +Phydm_Adaptivity( + IN PVOID pDM_VOID, + IN u1Byte IGI + ); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +VOID +Phydm_DisableEDCCA( + IN PVOID pDM_VOID +); + +VOID +Phydm_DynamicEDCCA( + IN PVOID pDM_VOID +); + +VOID +Phydm_AdaptivityBSOD( + IN PVOID pDM_VOID +); + +#endif + + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/mp_precomp.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/mp_precomp.h new file mode 100644 index 0000000..4e376e7 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/mp_precomp.h @@ -0,0 +1,24 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +//#include +//#include "phydm_precomp.h" +//#include "../phydm_precomp.h" + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm.h new file mode 100644 index 0000000..e7f015e --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm.h @@ -0,0 +1,2088 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __HALDMOUTSRC_H__ +#define __HALDMOUTSRC_H__ + + +#include "phydm_EdcaTurboCheck.h" +#include "phydm_DIG.h" +#include "phydm_PathDiv.h" +#include "phydm_RaInfo.h" +#include "phydm_DynamicBBPowerSaving.h" +#include "phydm_DynamicTxPower.h" +#include "phydm_CfoTracking.h" +#include "phydm_PowerTracking.h" +#include "PhyDM_Adaptivity.h" +#include "phydm_NoiseMonitor.h" +#if RTL8195A_SUPPORT +#include "rtl8195a/ROM_RTL8195A_PHYDM.h" +#endif + +#if RTL8711B_SUPPORT +#include "rtl8711b/ROM_RTL8711B_PHYDM.h" +#endif + +//============================================================ +// Definition +//============================================================ +// +// 2011/09/22 MH Define all team supprt ability. +// + +// +// 2011/09/22 MH Define for all teams. Please Define the constan in your precomp header. +// +//#define DM_ODM_SUPPORT_AP 0 +//#define DM_ODM_SUPPORT_ADSL 0 +//#define DM_ODM_SUPPORT_CE 0 +//#define DM_ODM_SUPPORT_MP 1 + +// +// 2011/09/28 MH Define ODM SW team support flag. +// + + + +// +// Antenna Switch Relative Definition. +// + +// +// 20100503 Joseph: +// Add new function SwAntDivCheck8192C(). +// This is the main function of Antenna diversity function before link. +// Mainly, it just retains last scan result and scan again. +// After that, it compares the scan result to see which one gets better RSSI. +// It selects antenna with better receiving power and returns better scan result. +// +#define TP_MODE 0 +#define RSSI_MODE 1 +#define TRAFFIC_LOW 0 +#define TRAFFIC_HIGH 1 + + +//============================================================ +//3 Tx Power Tracking +//3============================================================ +#define DPK_DELTA_MAPPING_NUM 13 +#define index_mapping_HP_NUM 15 +#define OFDM_TABLE_SIZE 43 +#define CCK_TABLE_SIZE 33 +#define TXSCALE_TABLE_SIZE 37 +#define TXPWR_TRACK_TABLE_SIZE 30 +#define DELTA_SWINGIDX_SIZE 30 +#define BAND_NUM 4 + +//============================================================ +//3 PSD Handler +//3============================================================ + +#define AFH_PSD 1 //0:normal PSD scan, 1: only do 20 pts PSD +#define MODE_40M 0 //0:20M, 1:40M +#define PSD_TH2 3 +#define PSD_CHMIN 20 // Minimum channel number for BT AFH +#define SIR_STEP_SIZE 3 +#define Smooth_Size_1 5 +#define Smooth_TH_1 3 +#define Smooth_Size_2 10 +#define Smooth_TH_2 4 +#define Smooth_Size_3 20 +#define Smooth_TH_3 4 +#define Smooth_Step_Size 5 +#define Adaptive_SIR 1 +#if(RTL8723_FPGA_VERIFICATION == 1) +#define PSD_RESCAN 1 +#else +#define PSD_RESCAN 4 +#endif +#define PSD_SCAN_INTERVAL 700 //ms + + + +//8723A High Power IGI Setting +#define DM_DIG_HIGH_PWR_IGI_LOWER_BOUND 0x22 +#define DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND 0x28 +#define DM_DIG_HIGH_PWR_THRESHOLD 0x3a +#define DM_DIG_LOW_PWR_THRESHOLD 0x14 + +//ANT Test +#define ANTTESTALL 0x00 //Ant A or B will be Testing +#define ANTTESTA 0x01 //Ant A will be Testing +#define ANTTESTB 0x02 //Ant B will be testing + +//for 8723A Ant Definition--2012--06--07 due to different IC may be different ANT define +#define MAIN_ANT 1 //Ant A or Ant Main +#define AUX_ANT 2 //AntB or Ant Aux +#define MAX_ANT 3 // 3 for AP using + + +//Antenna Diversity Type +#define SW_ANTDIV 0 +#define HW_ANTDIV 1 +//============================================================ +// structure and define +//============================================================ + +// +// 2011/09/20 MH Add for AP/ADSLpseudo DM structuer requirement. +// We need to remove to other position??? +// +#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) +typedef struct rtl8192cd_priv { + u1Byte temp; + +}rtl8192cd_priv, *prtl8192cd_priv; +#endif + + +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +typedef struct _ADAPTER{ + u1Byte temp; + #ifdef AP_BUILD_WORKAROUND + HAL_DATA_TYPE* temp2; + prtl8192cd_priv priv; + #endif +}ADAPTER, *PADAPTER; +#endif + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) + +typedef struct _WLAN_STA{ + u1Byte temp; +} WLAN_STA, *PRT_WLAN_STA; + +#endif + +//Remove DIG by Yuchen + +//Remoce BB power saving by Yuchn + +//Remove DIG by yuchen + +typedef struct _Dynamic_Primary_CCA{ + u1Byte PriCCA_flag; + u1Byte intf_flag; + u1Byte intf_type; + u1Byte DupRTS_flag; + u1Byte Monitor_flag; + u1Byte CH_offset; + u1Byte MF_state; +}Pri_CCA_T, *pPri_CCA_T; + +//Remove RA_T,*pRA_T by RS_James + +typedef struct _RX_High_Power_ +{ + u1Byte RXHP_flag; + u1Byte PSD_func_trigger; + u1Byte PSD_bitmap_RXHP[80]; + u1Byte Pre_IGI; + u1Byte Cur_IGI; + u1Byte Pre_pw_th; + u1Byte Cur_pw_th; + BOOLEAN First_time_enter; + BOOLEAN RXHP_enable; + u1Byte TP_Mode; +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL)) + RT_TIMER PSDTimer; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #if USE_WORKITEM + RT_WORK_ITEM PSDTimeWorkitem; + #endif +#endif + +}RXHP_T, *pRXHP_T; + +#if(DM_ODM_SUPPORT_TYPE & (ODM_CE)) + #define ASSOCIATE_ENTRY_NUM MACID_NUM_SW_LIMIT /* Max size of AsocEntry[].*/ + #define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM +#elif(DM_ODM_SUPPORT_TYPE & (ODM_IOT)) + #ifdef CONFIG_CONCURRENT_MODE + #define ASSOCIATE_ENTRY_NUM NUM_STA+2 // 2 is for station mod + #else + #define ASSOCIATE_ENTRY_NUM NUM_STA//8 // Max size of AsocEntry[]. + #endif + #define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM +#elif(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + #define ASSOCIATE_ENTRY_NUM NUM_STAT + #define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1 +#else + #define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1// Default port only one +#endif + +//#ifdef CONFIG_ANTENNA_DIVERSITY +// This indicates two different the steps. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK +// with original RSSI to determine if it is necessary to switch antenna. +#define SWAW_STEP_PEAK 0 +#define SWAW_STEP_DETERMINE 1 + +#define TP_MODE 0 +#define RSSI_MODE 1 +#define TRAFFIC_LOW 0 +#define TRAFFIC_HIGH 1 +#define TRAFFIC_UltraLOW 2 + +typedef struct _SW_Antenna_Switch_ +{ + u1Byte Double_chk_flag; + u1Byte try_flag; + s4Byte PreRSSI; + u1Byte CurAntenna; + u1Byte PreAntenna; + u1Byte RSSI_Trying; + u1Byte TestMode; + u1Byte bTriggerAntennaSwitch; + u1Byte SelectAntennaMap; + u1Byte RSSI_target; + u1Byte reset_idx; + + // Before link Antenna Switch check + u1Byte SWAS_NoLink_State; + u4Byte SWAS_NoLink_BK_Reg860; + u4Byte SWAS_NoLink_BK_Reg92c; + BOOLEAN ANTA_ON; //To indicate Ant A is or not + BOOLEAN ANTB_ON; //To indicate Ant B is on or not + u1Byte Ant5G; + u1Byte Ant2G; + + s4Byte RSSI_sum_A; + s4Byte RSSI_sum_B; + s4Byte RSSI_cnt_A; + s4Byte RSSI_cnt_B; + + u8Byte lastTxOkCnt; + u8Byte lastRxOkCnt; + u8Byte TXByteCnt_A; + u8Byte TXByteCnt_B; + u8Byte RXByteCnt_A; + u8Byte RXByteCnt_B; + u1Byte TrafficLoad; + u1Byte Train_time; + u1Byte Train_time_flag; +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL)) + RT_TIMER SwAntennaSwitchTimer; +#endif +#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) + RT_TIMER SwAntennaSwitchTimer_8723B; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #if USE_WORKITEM + RT_WORK_ITEM SwAntennaSwitchWorkitem; + #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) + RT_WORK_ITEM SwAntennaSwitchWorkitem_8723B; + #endif + #endif +#endif +/* CE Platform use +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + _timer SwAntennaSwitchTimer; + u8Byte lastTxOkCnt; + u8Byte lastRxOkCnt; + u8Byte TXByteCnt_A; + u8Byte TXByteCnt_B; + u8Byte RXByteCnt_A; + u8Byte RXByteCnt_B; + u1Byte DoubleComfirm; + u1Byte TrafficLoad; + //SW Antenna Switch + + +#endif +*/ +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + //Hybrid Antenna Diversity + u4Byte CCK_Ant1_Cnt[ASSOCIATE_ENTRY_NUM]; + u4Byte CCK_Ant2_Cnt[ASSOCIATE_ENTRY_NUM]; + u4Byte OFDM_Ant1_Cnt[ASSOCIATE_ENTRY_NUM]; + u4Byte OFDM_Ant2_Cnt[ASSOCIATE_ENTRY_NUM]; + u4Byte RSSI_Ant1_Sum[ASSOCIATE_ENTRY_NUM]; + u4Byte RSSI_Ant2_Sum[ASSOCIATE_ENTRY_NUM]; + u1Byte TxAnt[ASSOCIATE_ENTRY_NUM]; + u1Byte TargetSTA; + u1Byte antsel; + u1Byte RxIdleAnt; + +#endif + +}SWAT_T, *pSWAT_T; +//#endif + +//Remove Edca by YuChen + +//Remove ODM_RATE_ADAPTIVE by RS_James + +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + + +#ifdef ADSL_AP_BUILD_WORKAROUND +#define MAX_TOLERANCE 5 +#define IQK_DELAY_TIME 1 //ms +#endif + +// +// Indicate different AP vendor for IOT issue. +// +typedef enum _HT_IOT_PEER +{ + HT_IOT_PEER_UNKNOWN = 0, + HT_IOT_PEER_REALTEK = 1, + HT_IOT_PEER_REALTEK_92SE = 2, + HT_IOT_PEER_BROADCOM = 3, + HT_IOT_PEER_RALINK = 4, + HT_IOT_PEER_ATHEROS = 5, + HT_IOT_PEER_CISCO = 6, + HT_IOT_PEER_MERU = 7, + HT_IOT_PEER_MARVELL = 8, + HT_IOT_PEER_REALTEK_SOFTAP = 9,// peer is RealTek SOFT_AP, by Bohn, 2009.12.17 + HT_IOT_PEER_SELF_SOFTAP = 10, // Self is SoftAP + HT_IOT_PEER_AIRGO = 11, + HT_IOT_PEER_INTEL = 12, + HT_IOT_PEER_RTK_APCLIENT = 13, + HT_IOT_PEER_REALTEK_81XX = 14, + HT_IOT_PEER_REALTEK_WOW = 15, + HT_IOT_PEER_MAX = 16 +}HT_IOT_PEER_E, *PHTIOT_PEER_E; +#endif//#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#define DM_Type_ByFW 0 +#define DM_Type_ByDriver 1 + +// +// Declare for common info +// +#define MAX_PATH_NUM_92CS 2 +#define MAX_PATH_NUM_8188E 1 +#define MAX_PATH_NUM_8192E 2 +#define MAX_PATH_NUM_8723B 1 +#define MAX_PATH_NUM_8812A 2 +#define MAX_PATH_NUM_8821A 1 +#define MAX_PATH_NUM_8195A MAX_RF_PATH // 1 +#define MAX_PATH_NUM_8711B 1 + +//Max RF path +#if ((RTL8195A_SUPPORT == 1) || (RTL8711B_SUPPORT == 1) ) +#define ODM_RF_PATH_MAX MAX_PATH_NUM_8195A +#else +#define ODM_RF_PATH_MAX 2 //92c-series +#endif +#define ODM_RF_PATH_MAX_JAGUAR 4 //jaguar - series + +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_IOT)) +#ifdef RTK_AC_SUPPORT +#define ODM_IC_11AC_SERIES_SUPPORT 1 +#else +#define ODM_IC_11AC_SERIES_SUPPORT 0 +#endif +#else +#define ODM_IC_11AC_SERIES_SUPPORT 1 +#endif + +#if (RTL8711B_SUPPORT == 1) +#define ODM_PHY_STATUS_NEW_TYPE_SUPPORT 1 +#else +#define ODM_PHY_STATUS_NEW_TYPE_SUPPORT 0 +#endif + +#define IQK_THRESHOLD 8 +#if 1 //(RTL8195A_SUPPORT == 1) +typedef struct _ODM_Phy_Status_Info_ +{ + // + // Be care, if you want to add any element please insert between + // RxPWDBAll & SignalStrength. + // +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) + u4Byte RxPWDBAll; +#else + u1Byte RxPWDBAll; +#endif +#if (DM_ODM_SUPPORT_TYPE & (ODM_IOT)) +#if (RTL8195A_SUPPORT == 1) + u1Byte SignalQuality; // in 0-100 index. + u1Byte RxMIMOSignalStrength[ODM_RF_PATH_MAX]; // in 0~100 index + s1Byte RecvSignalPower; // Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures. + u1Byte SignalStrength; // in 0-100 index. + #if (ODM_IC_11AC_SERIES_SUPPORT) + u1Byte RxMIMOEVMdbm[ODM_RF_PATH_MAX]; // per-path's EVM dbm + s2Byte Cfo_short[ODM_RF_PATH_MAX]; // per-path's Cfo_short + s2Byte Cfo_tail[ODM_RF_PATH_MAX]; // per-path's Cfo_tail + u1Byte BandWidth; + #endif +#elif (RTL8711B_SUPPORT == 1) + u1Byte SignalQuality; /* in 0-100 index. */ + s1Byte RxMIMOSignalQuality[4]; /* per-path's EVM */ + u1Byte RxMIMOEVMdbm[4]; /* per-path's EVM dbm */ + u1Byte RxMIMOSignalStrength[4]; /* in 0~100 index */ + s2Byte Cfo_short[4]; /* per-path's Cfo_short */ + s2Byte Cfo_tail[4]; /* per-path's Cfo_tail */ + s1Byte RxPower; /* in dBm Translate from PWdB */ + s1Byte RecvSignalPower; /* Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures. */ + u1Byte BTRxRSSIPercentage; + u1Byte SignalStrength; /* in 0-100 index. */ + s1Byte RxPwr[4]; /* per-path's pwdb */ + s1Byte RxSNR[4]; /* per-path's SNR */ +#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) + u1Byte RxCount:2; /* RX path counter---*/ + u1Byte BandWidth:2; + u1Byte rxsc:4; /* sub-channel---*/ +#else + u1Byte BandWidth; +#endif + u1Byte btCoexPwrAdjust; +#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) + u1Byte channel; /* channel number---*/ + BOOLEAN bMuPacket; /* is MU packet or not---*/ + BOOLEAN bBeamformed; /* BF packet---*/ +#endif +#endif +#else + u1Byte SignalQuality; // in 0-100 index. + s1Byte RxMIMOSignalQuality[4]; //per-path's EVM + u1Byte RxMIMOEVMdbm[4]; //per-path's EVM dbm + u1Byte RxMIMOSignalStrength[4];// in 0~100 index + u2Byte Cfo_short[4]; // per-path's Cfo_short + u2Byte Cfo_tail[4]; // per-path's Cfo_tail + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + s1Byte RxPower; // in dBm Translate from PWdB + s1Byte RecvSignalPower; // Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures. + u1Byte BTRxRSSIPercentage; + u1Byte SignalStrength; // in 0-100 index. + s1Byte RxPwr[4]; //per-path's pwdb + #endif + u1Byte RxSNR[4]; //per-path's SNR + u1Byte BandWidth; + u1Byte btCoexPwrAdjust; +#endif +}ODM_PHY_INFO_T,*PODM_PHY_INFO_T; +#else + +typedef struct _ODM_Phy_Status_Info_ { + // + // Be care, if you want to add any element please insert between + // RxPWDBAll & SignalStrength. + // +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) + u4Byte RxPWDBAll; +#else + u1Byte RxPWDBAll; +#endif + u1Byte SignalQuality; /* in 0-100 index. */ + s1Byte RxMIMOSignalQuality[ODM_RF_PATH_MAX]; /* per-path's EVM */ + u1Byte RxMIMOEVMdbm[ODM_RF_PATH_MAX]; /* per-path's EVM dbm */ + u1Byte RxMIMOSignalStrength[ODM_RF_PATH_MAX]; /* in 0~100 index */ + s2Byte Cfo_short[ODM_RF_PATH_MAX]; /* per-path's Cfo_short */ + s2Byte Cfo_tail[ODM_RF_PATH_MAX]; /* per-path's Cfo_tail */ + s1Byte RxPower; /* in dBm Translate from PWdB */ + s1Byte RecvSignalPower; /* Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures. */ + u1Byte BTRxRSSIPercentage; + u1Byte SignalStrength; /* in 0-100 index. */ + s1Byte RxPwr[ODM_RF_PATH_MAX]; /* per-path's pwdb */ + s1Byte RxSNR[ODM_RF_PATH_MAX]; /* per-path's SNR */ +#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) + u1Byte RxCount:2; /* RX path counter---*/ + u1Byte BandWidth:2; + u1Byte rxsc:4; /* sub-channel---*/ +#else + u1Byte BandWidth; +#endif +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_IOT)) + u1Byte btCoexPwrAdjust; +#endif +#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) + u1Byte channel; /* channel number---*/ + BOOLEAN bMuPacket; /* is MU packet or not---*/ + BOOLEAN bBeamformed; /* BF packet---*/ +#endif +} ODM_PHY_INFO_T, *PODM_PHY_INFO_T; + +#endif +typedef struct _ODM_Per_Pkt_Info_ +{ + //u1Byte Rate; + u1Byte DataRate; + u1Byte StationID; + BOOLEAN bPacketMatchBSSID; + BOOLEAN bPacketToSelf; + BOOLEAN bPacketBeacon; +}ODM_PACKET_INFO_T,*PODM_PACKET_INFO_T; + + +typedef struct _ODM_Phy_Dbg_Info_ +{ + //ODM Write,debug info + s1Byte RxSNRdB[4]; + u4Byte NumQryPhyStatus; + u4Byte NumQryPhyStatusCCK; + u4Byte NumQryPhyStatusOFDM; +#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) + u4Byte NumQryMuPkt; + u4Byte NumQryBfPkt; + u4Byte NumQryMuVhtPkt[40]; + u4Byte NumQryVhtPkt[40]; + BOOLEAN bLdpcPkt; + BOOLEAN bStbcPkt; +#endif + u1Byte NumQryBeaconPkt; + //Others + s4Byte RxEVM[4]; + +}ODM_PHY_DBG_INFO_T; + + +typedef struct _ODM_Mac_Status_Info_ +{ + u1Byte test; + +}ODM_MAC_INFO; + + +typedef enum tag_Dynamic_ODM_Support_Ability_Type +{ + // BB Team + ODM_DIG = 0x00000001, + ODM_HIGH_POWER = 0x00000002, + ODM_CCK_CCA_TH = 0x00000004, + ODM_FA_STATISTICS = 0x00000008, + ODM_RAMASK = 0x00000010, + ODM_RSSI_MONITOR = 0x00000020, + ODM_SW_ANTDIV = 0x00000040, + ODM_HW_ANTDIV = 0x00000080, + ODM_BB_PWRSV = 0x00000100, + ODM_2TPATHDIV = 0x00000200, + ODM_1TPATHDIV = 0x00000400, + ODM_PSD2AFH = 0x00000800 +}ODM_Ability_E; + +// +// 2011/20/20 MH For MP driver RT_WLAN_STA = STA_INFO_T +// Please declare below ODM relative info in your STA info structure. +// +#if 1 +typedef struct _ODM_STA_INFO{ + // Driver Write + BOOLEAN bUsed; // record the sta status link or not? + //u1Byte WirelessMode; // + u1Byte IOTPeer; // Enum value. HT_IOT_PEER_E + + // ODM Write + //1 PHY_STATUS_INFO + u1Byte RSSI_Path[4]; // + u1Byte RSSI_Ave; + u1Byte RXEVM[4]; + u1Byte RXSNR[4]; + + // ODM Write + //1 TX_INFO (may changed by IC) + //TX_INFO_T pTxInfo; // Define in IC folder. Move lower layer. +#if 0 + u1Byte ANTSEL_A; //in Jagar: 4bit; others: 2bit + u1Byte ANTSEL_B; //in Jagar: 4bit; others: 2bit + u1Byte ANTSEL_C; //only in Jagar: 4bit + u1Byte ANTSEL_D; //only in Jagar: 4bit + u1Byte TX_ANTL; //not in Jagar: 2bit + u1Byte TX_ANT_HT; //not in Jagar: 2bit + u1Byte TX_ANT_CCK; //not in Jagar: 2bit + u1Byte TXAGC_A; //not in Jagar: 4bit + u1Byte TXAGC_B; //not in Jagar: 4bit + u1Byte TXPWR_OFFSET; //only in Jagar: 3bit + u1Byte TX_ANT; //only in Jagar: 4bit for TX_ANTL/TX_ANTHT/TX_ANT_CCK +#endif + + // + // Please use compile flag to disabe the strcutrue for other IC except 88E. + // Move To lower layer. + // + // ODM Write Wilson will handle this part(said by Luke.Lee) + //TX_RPT_T pTxRpt; // Define in IC folder. Move lower layer. +#if 0 + //1 For 88E RA (don't redefine the naming) + u1Byte rate_id; + u1Byte rate_SGI; + u1Byte rssi_sta_ra; + + u1Byte SGI_enable; + u1Byte Decision_rate; + u1Byte Pre_rate; + u1Byte Active; + + // Driver write Wilson handle. + //1 TX_RPT (don't redefine the naming) + u2Byte RTY[4]; // ??? + u2Byte TOTAL; // ??? + u2Byte DROP; // ??? + // + // Please use compile flag to disabe the strcutrue for other IC except 88E. + // +#endif + +}ODM_STA_INFO_T, *PODM_STA_INFO_T; +#endif + +// +// 2011/10/20 MH Define Common info enum for all team. +// +typedef enum _ODM_Common_Info_Definition +{ +//-------------REMOVED CASE-----------// + //ODM_CMNINFO_CCK_HP, + //ODM_CMNINFO_RFPATH_ENABLE, // Define as ODM write??? + //ODM_CMNINFO_BT_COEXIST, // ODM_BT_COEXIST_E + //ODM_CMNINFO_OP_MODE, // ODM_OPERATION_MODE_E +//-------------REMOVED CASE-----------// + + // + // Fixed value: + // + + //-----------HOOK BEFORE REG INIT-----------// + ODM_CMNINFO_PLATFORM = 0, + ODM_CMNINFO_ABILITY, // ODM_ABILITY_E + ODM_CMNINFO_INTERFACE, // ODM_INTERFACE_E + ODM_CMNINFO_MP_TEST_CHIP, + ODM_CMNINFO_IC_TYPE, // ODM_IC_TYPE_E + ODM_CMNINFO_CUT_VER, // ODM_CUT_VERSION_E + ODM_CMNINFO_FAB_VER, // ODM_FAB_E + ODM_CMNINFO_RF_TYPE, // ODM_RF_PATH_E or ODM_RF_TYPE_E? + ODM_CMNINFO_RFE_TYPE, + ODM_CMNINFO_BOARD_TYPE, // ODM_BOARD_TYPE_E + ODM_CMNINFO_PACKAGE_TYPE, + ODM_CMNINFO_EXT_LNA, // TRUE + ODM_CMNINFO_5G_EXT_LNA, + ODM_CMNINFO_EXT_PA, + ODM_CMNINFO_5G_EXT_PA, + ODM_CMNINFO_GPA, + ODM_CMNINFO_APA, + ODM_CMNINFO_GLNA, + ODM_CMNINFO_ALNA, + ODM_CMNINFO_EXT_TRSW, + ODM_CMNINFO_PATCH_ID, //CUSTOMER ID + ODM_CMNINFO_BINHCT_TEST, + ODM_CMNINFO_BWIFI_TEST, + ODM_CMNINFO_SMART_CONCURRENT, + ODM_CMNINFO_DOMAIN_CODE_2G, + ODM_CMNINFO_DOMAIN_CODE_5G, + ODM_CMNINFO_EEPROMVERSION, + ODM_CMNINFO_CRYSTALCAP, + //-----------HOOK BEFORE REG INIT-----------// + + + // + // Dynamic value: + // +//--------- POINTER REFERENCE-----------// + ODM_CMNINFO_MAC_PHY_MODE, // ODM_MAC_PHY_MODE_E + ODM_CMNINFO_TX_UNI, + ODM_CMNINFO_RX_UNI, + ODM_CMNINFO_WM_MODE, // ODM_WIRELESS_MODE_E + ODM_CMNINFO_BAND, // ODM_BAND_TYPE_E + ODM_CMNINFO_SEC_CHNL_OFFSET, // ODM_SEC_CHNL_OFFSET_E + ODM_CMNINFO_SEC_MODE, // ODM_SECURITY_E + ODM_CMNINFO_BW, // ODM_BW_E + ODM_CMNINFO_CHNL, + ODM_CMNINFO_FORCED_RATE, + + ODM_CMNINFO_DMSP_GET_VALUE, + ODM_CMNINFO_BUDDY_ADAPTOR, + ODM_CMNINFO_DMSP_IS_MASTER, + ODM_CMNINFO_SCAN, + ODM_CMNINFO_POWER_SAVING, + ODM_CMNINFO_ONE_PATH_CCA, // ODM_CCA_PATH_E + ODM_CMNINFO_DRV_STOP, + ODM_CMNINFO_PNP_IN, + ODM_CMNINFO_INIT_ON, + ODM_CMNINFO_ANT_TEST, + ODM_CMNINFO_NET_CLOSED, + ODM_CMNINFO_MP_MODE, + //ODM_CMNINFO_RTSTA_AID, // For win driver only? + ODM_CMNINFO_FORCED_IGI_LB, + ODM_CMNINFO_P2P_LINK, + ODM_CMNINFO_FCS_MODE, +//--------- POINTER REFERENCE-----------// + +//------------CALL BY VALUE-------------// + ODM_CMNINFO_WIFI_DIRECT, + ODM_CMNINFO_WIFI_DISPLAY, + ODM_CMNINFO_LINK_IN_PROGRESS, + ODM_CMNINFO_LINK, + ODM_CMNINFO_STATION_STATE, + ODM_CMNINFO_RSSI_MIN, + ODM_CMNINFO_DBG_COMP, // u8Byte + ODM_CMNINFO_DBG_LEVEL, // u4Byte + ODM_CMNINFO_RA_THRESHOLD_HIGH, // u1Byte + ODM_CMNINFO_RA_THRESHOLD_LOW, // u1Byte + ODM_CMNINFO_RF_ANTENNA_TYPE, // u1Byte + ODM_CMNINFO_BT_ENABLED, + ODM_CMNINFO_BT_HS_CONNECT_PROCESS, + ODM_CMNINFO_BT_HS_RSSI, + ODM_CMNINFO_BT_OPERATION, + ODM_CMNINFO_BT_LIMITED_DIG, //Need to Limited Dig or not + ODM_CMNINFO_BT_DISABLE_EDCA, + ODM_CMNINFO_NO_BEACON_IN_2S, +//------------CALL BY VALUE-------------// + + // + // Dynamic ptr array hook itms. + // + ODM_CMNINFO_STA_STATUS, + ODM_CMNINFO_PHY_STATUS, + ODM_CMNINFO_MAC_STATUS, + + ODM_CMNINFO_MAX, + + +}ODM_CMNINFO_E; + +// +// 2011/10/20 MH Define ODM support ability. ODM_CMNINFO_ABILITY +// +typedef enum _ODM_Support_Ability_Definition +{ + // + // BB ODM section BIT 0-19 + // + ODM_BB_DIG = BIT0, + ODM_BB_RA_MASK = BIT1, + ODM_BB_DYNAMIC_TXPWR = BIT2, + ODM_BB_FA_CNT = BIT3, + ODM_BB_RSSI_MONITOR = BIT4, + ODM_BB_CCK_PD = BIT5, + ODM_BB_ANT_DIV = BIT6, + ODM_BB_PWR_SAVE = BIT7, + ODM_BB_PWR_TRAIN = BIT8, + ODM_BB_RATE_ADAPTIVE = BIT9, + ODM_BB_PATH_DIV = BIT10, + ODM_BB_PSD = BIT11, + ODM_BB_RXHP = BIT12, + ODM_BB_ADAPTIVITY = BIT13, + ODM_BB_CFO_TRACKING = BIT14, + ODM_BB_NHM_CNT = BIT15, + ODM_BB_PRIMARY_CCA = BIT16, + + // + // MAC DM section BIT 20-23 + // + ODM_MAC_EDCA_TURBO = BIT20, + ODM_MAC_EARLY_MODE = BIT21, + + // + // RF ODM section BIT 24-31 + // + ODM_RF_TX_PWR_TRACK = BIT24, + ODM_RF_RX_GAIN_TRACK = BIT25, + ODM_RF_CALIBRATION = BIT26, + +}ODM_ABILITY_E; + +// ODM_CMNINFO_INTERFACE +typedef enum tag_ODM_Support_Interface_Definition +{ + ODM_ITRF_PCIE = 0x1, + ODM_ITRF_USB = 0x2, + ODM_ITRF_SDIO = 0x4, + ODM_ITRF_GSPI = 0x8, + ODM_ITRF_LXBUS = 0x10, + ODM_ITRF_ALL = 0xFF, +}ODM_INTERFACE_E; + +// ODM_CMNINFO_IC_TYPE +typedef enum tag_ODM_Support_IC_Type_Definition +{ + ODM_RTL8192S = BIT0, + ODM_RTL8192C = BIT1, + ODM_RTL8192D = BIT2, + ODM_RTL8723A = BIT3, + ODM_RTL8188E = BIT4, + ODM_RTL8812 = BIT5, + ODM_RTL8821 = BIT6, + ODM_RTL8192E = BIT7, + ODM_RTL8723B = BIT8, + ODM_RTL8814A = BIT9, + ODM_RTL8881A = BIT10, + ODM_RTL8821B = BIT11, + ODM_RTL8822B = BIT12, + ODM_RTL8195A = BIT13, + ODM_RTL8711B = BIT14 +}ODM_IC_TYPE_E; + +#define ODM_IC_11N_SERIES (ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8195A|ODM_RTL8711B) +#define ODM_IC_11AC_SERIES (ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A|ODM_RTL8821B|ODM_RTL8822B) + +//ODM_CMNINFO_CUT_VER +typedef enum tag_ODM_Cut_Version_Definition +{ + ODM_CUT_A = 0, + ODM_CUT_B = 1, + ODM_CUT_C = 2, + ODM_CUT_D = 3, + ODM_CUT_E = 4, + ODM_CUT_F = 5, + + ODM_CUT_I = 8, + ODM_CUT_TEST = 15, +}ODM_CUT_VERSION_E; + +// ODM_CMNINFO_FAB_VER +typedef enum tag_ODM_Fab_Version_Definition +{ + ODM_TSMC = 0, + ODM_UMC = 1, +}ODM_FAB_E; + +// ODM_CMNINFO_RF_TYPE +// +// For example 1T2R (A+AB = BIT0|BIT4|BIT5) +// +typedef enum tag_ODM_RF_Path_Bit_Definition +{ + ODM_RF_TX_A = BIT0, + ODM_RF_TX_B = BIT1, + ODM_RF_TX_C = BIT2, + ODM_RF_TX_D = BIT3, + ODM_RF_RX_A = BIT4, + ODM_RF_RX_B = BIT5, + ODM_RF_RX_C = BIT6, + ODM_RF_RX_D = BIT7, +}ODM_RF_PATH_E; + + +typedef enum tag_ODM_RF_Type_Definition +{ + ODM_1T1R = 0, + ODM_1T2R = 1, + ODM_2T2R = 2, + ODM_2T3R = 3, + ODM_2T4R = 4, + ODM_3T3R = 5, + ODM_3T4R = 6, + ODM_4T4R = 7, +}ODM_RF_TYPE_E; + + +// +// ODM Dynamic common info value definition +// + +//typedef enum _MACPHY_MODE_8192D{ +// SINGLEMAC_SINGLEPHY, +// DUALMAC_DUALPHY, +// DUALMAC_SINGLEPHY, +//}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D; +// Above is the original define in MP driver. Please use the same define. THX. +typedef enum tag_ODM_MAC_PHY_Mode_Definition +{ + ODM_SMSP = 0, + ODM_DMSP = 1, + ODM_DMDP = 2, +}ODM_MAC_PHY_MODE_E; + + +typedef enum tag_BT_Coexist_Definition +{ + ODM_BT_BUSY = 1, + ODM_BT_ON = 2, + ODM_BT_OFF = 3, + ODM_BT_NONE = 4, +}ODM_BT_COEXIST_E; + +// ODM_CMNINFO_OP_MODE +typedef enum tag_Operation_Mode_Definition +{ + ODM_NO_LINK = BIT0, + ODM_LINK = BIT1, + ODM_SCAN = BIT2, + ODM_POWERSAVE = BIT3, + ODM_AP_MODE = BIT4, + ODM_CLIENT_MODE = BIT5, + ODM_AD_HOC = BIT6, + ODM_WIFI_DIRECT = BIT7, + ODM_WIFI_DISPLAY = BIT8, +}ODM_OPERATION_MODE_E; + +// ODM_CMNINFO_WM_MODE +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE|ODM_IOT)) +typedef enum tag_Wireless_Mode_Definition +{ + ODM_WM_UNKNOW = 0x0, + ODM_WM_B = BIT0, + ODM_WM_G = BIT1, + ODM_WM_A = BIT2, + ODM_WM_N24G = BIT3, + ODM_WM_N5G = BIT4, + ODM_WM_AUTO = BIT5, + ODM_WM_AC = BIT6, +}ODM_WIRELESS_MODE_E; +#else +typedef enum tag_Wireless_Mode_Definition +{ + ODM_WM_UNKNOWN = 0x00, + ODM_WM_A = BIT0, + ODM_WM_B = BIT1, + ODM_WM_G = BIT2, + ODM_WM_AUTO = BIT3, + ODM_WM_N24G = BIT4, + ODM_WM_N5G = BIT5, + ODM_WM_AC_5G = BIT6, + ODM_WM_AC_24G = BIT7, + ODM_WM_AC_ONLY = BIT8, + ODM_WM_MAX = BIT9 +}ODM_WIRELESS_MODE_E; +#endif + +// ODM_CMNINFO_BAND +typedef enum tag_Band_Type_Definition +{ + ODM_BAND_2_4G = 0, + ODM_BAND_5G, + ODM_BAND_ON_BOTH, + ODM_BANDMAX + +}ODM_BAND_TYPE_E; + +// ODM_CMNINFO_SEC_CHNL_OFFSET +typedef enum tag_Secondary_Channel_Offset_Definition +{ + ODM_DONT_CARE = 0, + ODM_BELOW = 1, + ODM_ABOVE = 2 +}ODM_SEC_CHNL_OFFSET_E; + +// ODM_CMNINFO_SEC_MODE +typedef enum tag_Security_Definition +{ + ODM_SEC_OPEN = 0, + ODM_SEC_WEP40 = 1, + ODM_SEC_TKIP = 2, + ODM_SEC_RESERVE = 3, + ODM_SEC_AESCCMP = 4, + ODM_SEC_WEP104 = 5, + ODM_WEP_WPA_MIXED = 6, // WEP + WPA + ODM_SEC_SMS4 = 7, +}ODM_SECURITY_E; + +// ODM_CMNINFO_BW +typedef enum tag_Bandwidth_Definition +{ + ODM_BW20M = 0, + ODM_BW40M = 1, + ODM_BW80M = 2, + ODM_BW160M = 3, + ODM_BW10M = 4, +}ODM_BW_E; + + +// ODM_CMNINFO_BOARD_TYPE +// For non-AC-series IC , ODM_BOARD_5G_EXT_PA and ODM_BOARD_5G_EXT_LNA are ignored +// For AC-series IC, external PA & LNA can be indivisuallly added on 2.4G and/or 5G +typedef enum tag_Board_Definition +{ + ODM_BOARD_DEFAULT = 0, // The DEFAULT case. + ODM_BOARD_MINICARD = BIT(0), // 0 = non-mini card, 1= mini card. + ODM_BOARD_SLIM = BIT(1), // 0 = non-slim card, 1 = slim card + ODM_BOARD_BT = BIT(2), // 0 = without BT card, 1 = with BT + ODM_BOARD_EXT_PA = BIT(3), // 0 = no 2G ext-PA, 1 = existing 2G ext-PA + ODM_BOARD_EXT_LNA = BIT(4), // 0 = no 2G ext-LNA, 1 = existing 2G ext-LNA + ODM_BOARD_EXT_TRSW = BIT(5), // 0 = no ext-TRSW, 1 = existing ext-TRSW + ODM_BOARD_EXT_PA_5G = BIT(6), // 0 = no 5G ext-PA, 1 = existing 5G ext-PA + ODM_BOARD_EXT_LNA_5G= BIT(7), // 0 = no 5G ext-LNA, 1 = existing 5G ext-LNA +}ODM_BOARD_TYPE_E; + +typedef enum tag_ODM_Package_Definition +{ + ODM_PACKAGE_DEFAULT = 0, + ODM_PACKAGE_QFN68 = BIT(0), + ODM_PACKAGE_TFBGA90 = BIT(1), + ODM_PACKAGE_TFBGA79 = BIT(2), +}ODM_Package_TYPE_E; + +typedef enum tag_ODM_TYPE_GPA_Definition +{ + TYPE_GPA0 = 0, + TYPE_GPA1 = BIT(1)|BIT(0) +}ODM_TYPE_GPA_E; + +typedef enum tag_ODM_TYPE_APA_Definition +{ + TYPE_APA0 = 0, + TYPE_APA1 = BIT(1)|BIT(0) +}ODM_TYPE_APA_E; + +typedef enum tag_ODM_TYPE_GLNA_Definition +{ + TYPE_GLNA0 = 0, + TYPE_GLNA1 = BIT(2)|BIT(0), + TYPE_GLNA2 = BIT(3)|BIT(1), + TYPE_GLNA3 = BIT(3)|BIT(2)|BIT(1)|BIT(0) +}ODM_TYPE_GLNA_E; + +typedef enum tag_ODM_TYPE_ALNA_Definition +{ + TYPE_ALNA0 = 0, + TYPE_ALNA1 = BIT(2)|BIT(0), + TYPE_ALNA2 = BIT(3)|BIT(1), + TYPE_ALNA3 = BIT(3)|BIT(2)|BIT(1)|BIT(0) +}ODM_TYPE_ALNA_E; + +// ODM_CMNINFO_ONE_PATH_CCA +typedef enum tag_CCA_Path +{ + ODM_CCA_2R = 0, + ODM_CCA_1R_A = 1, + ODM_CCA_1R_B = 2, +}ODM_CCA_PATH_E; + + +typedef struct _ODM_RA_Info_ +{ + u1Byte RateID; + u4Byte RateMask; + u4Byte RAUseRate; + u1Byte RateSGI; + u1Byte RssiStaRA; + u1Byte PreRssiStaRA; + u1Byte SGIEnable; + u1Byte DecisionRate; + u1Byte PreRate; + u1Byte HighestRate; + u1Byte LowestRate; + u4Byte NscUp; + u4Byte NscDown; + u2Byte RTY[5]; + u4Byte TOTAL; + u2Byte DROP; + u1Byte Active; + u2Byte RptTime; + u1Byte RAWaitingCounter; + u1Byte RAPendingCounter; +#if ((RTL8195A_SUPPORT == 1) || (RTL8711B_SUPPORT == 1)) + //---------Gary----------// //TODO: James + u1Byte RAINFO; + // BIT0: UL/DL state + // BIT1: EN_STBC + // BIT2: LDPC_CAP + // Add by Wilson 20130320 + // BIT3,BIT4 : 2SS short cut + // BIT5 : init rate by rssi + // BIT6: BF state + // BIT7: delay try rate + + u1Byte Initial_BW; + u1Byte BW_setting; + u1Byte DISPT; + u1Byte DISRA; + u1Byte Stage_RA; + u1Byte PRE_BW; + u1Byte MacID; + u1Byte Try_state; + u1Byte Try_done_cnt; + u2Byte RA_counter; + u1Byte Init_Rate_H; + u1Byte Init_Rate_M; + u1Byte Init_Rate_L; + u4Byte Total_TX; + + //2 Power Trainning + u1Byte TRAINING_RATE; + u1Byte STOP_PT_COUNTER; + u1Byte MODE_SS; + u1Byte PT_smooth_factor; +#endif + +#if 1 //POWER_TRAINING_ACTIVE == 1 // For compile pass only~! + u1Byte PTActive; // on or off + u1Byte PTTryState; // 0 trying state, 1 for decision state + u1Byte PTStage; // 0~6 + u1Byte PTStopCount; //Stop PT counter + u1Byte PTPreRate; // if rate change do PT + u1Byte PTPreRssi; // if RSSI change 5% do PT + u1Byte PTModeSS; // decide whitch rate should do PT + u1Byte RAstage; // StageRA, decide how many times RA will be done between PT + u1Byte PTSmoothFactor; +#endif +} ODM_RA_INFO_T,*PODM_RA_INFO_T; + +// +// ODM Dynamic common info value definition +// + +typedef struct _FAST_ANTENNA_TRAINNING_ +{ + u1Byte Bssid[6]; + u1Byte antsel_rx_keep_0; + u1Byte antsel_rx_keep_1; + u1Byte antsel_rx_keep_2; + u1Byte antsel_rx_keep_3; + u4Byte antSumRSSI[7]; + u4Byte antRSSIcnt[7]; + u4Byte antAveRSSI[7]; + u1Byte FAT_State; + u4Byte TrainIdx; + u1Byte antsel_a[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte antsel_b[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte antsel_c[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte MainAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte AuxAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte MainAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte AuxAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte RxIdleAnt; + BOOLEAN bBecomeLinked; + u4Byte MinMaxRSSI; + u1Byte idx_AntDiv_counter_2G; + u1Byte idx_AntDiv_counter_5G; + u4Byte AntDiv_2G_5G; + u4Byte CCK_counter_main; + u4Byte CCK_counter_aux; + u4Byte OFDM_counter_main; + u4Byte OFDM_counter_aux; + +}FAT_T,*pFAT_T; +#if !((RTL8195A_SUPPORT == 1) || (RTL8711B_SUPPORT == 1)) +typedef struct _ROM_INFO{ + u1Byte EEPROMVersion; + u1Byte CrystalCap; + u8Byte DebugComponents; + u4Byte DebugLevel; +}ROM_INFO, *PROM_INFO; +#endif + +typedef enum _FAT_STATE +{ + FAT_NORMAL_STATE = 0, + FAT_TRAINING_STATE = 1, +}FAT_STATE_E, *PFAT_STATE_E; + +typedef enum _ANT_DIV_TYPE +{ + NO_ANTDIV = 0xFF, + CG_TRX_HW_ANTDIV = 0x01, + CGCS_RX_HW_ANTDIV = 0x02, + FIXED_HW_ANTDIV = 0x03, + CG_TRX_SMART_ANTDIV = 0x04, + CGCS_RX_SW_ANTDIV = 0x05, + S0S1_SW_ANTDIV = 0x06 //8723B intrnal switch S0 S1 +}ANT_DIV_TYPE_E, *PANT_DIV_TYPE_E; + +#if (RTL8812A_SUPPORT == 1) +typedef struct _ODM_PATH_DIVERSITY_ +{ + u1Byte RespTxPath; + u1Byte PathSel[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte PathA_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte PathB_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte PathA_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte PathB_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; +}PATHDIV_T, *pPATHDIV_T; +#endif + +typedef enum _BASEBAND_CONFIG_PHY_REG_PG_VALUE_TYPE{ + PHY_REG_PG_RELATIVE_VALUE = 0, + PHY_REG_PG_EXACT_VALUE = 1 +} PHY_REG_PG_TYPE; + + +// +// Antenna detection information from single tone mechanism, added by Roger, 2012.11.27. +// +typedef struct _ANT_DETECTED_INFO{ + BOOLEAN bAntDetected; + u4Byte dBForAntA; + u4Byte dBForAntB; + u4Byte dBForAntO; +}ANT_DETECTED_INFO, *PANT_DETECTED_INFO; + +// +// 2011/09/22 MH Copy from SD4 defined structure. We use to support PHY DM integration. +// +#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (RT_PLATFORM != PLATFORM_LINUX) +typedef +#endif +struct DM_Out_Source_Dynamic_Mechanism_Structure +#else// for AP,ADSL,CE,IOT Team +typedef struct DM_Out_Source_Dynamic_Mechanism_Structure +#endif +{ + //RT_TIMER FastAntTrainingTimer; + // + // Add for different team use temporarily + // + PADAPTER Adapter; // For CE/NIC team +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv; // For AP/ADSL team +#endif + // WHen you use Adapter or priv pointer, you must make sure the pointer is ready. + BOOLEAN odm_ready; + +#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) + rtl8192cd_priv fake_priv; +#endif +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + // ADSL_AP_BUILD_WORKAROUND + ADAPTER fake_adapter; +#endif + + PHY_REG_PG_TYPE PhyRegPgValueType; + u1Byte PhyRegPgVersion; + + u4Byte NumQryPhyStatusAll; //CCK + OFDM + u4Byte LastNumQryPhyStatusAll; + u4Byte RxPWDBAve; + BOOLEAN MPDIG_2G; //off MPDIG + u1Byte Times_2G; + +//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------// + BOOLEAN bCckHighPower; + u1Byte RFPathRxEnable; // ODM_CMNINFO_RFPATH_ENABLE + u1Byte ControlChannel; +//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------// + +//--------REMOVED COMMON INFO----------// + //u1Byte PseudoMacPhyMode; + //BOOLEAN *BTCoexist; + //BOOLEAN PseudoBtCoexist; + //u1Byte OPMode; + //BOOLEAN bAPMode; + //BOOLEAN bClientMode; + //BOOLEAN bAdHocMode; + //BOOLEAN bSlaveOfDMSP; +//--------REMOVED COMMON INFO----------// + + +//1 COMMON INFORMATION + + // + // Init Value + // +//-----------HOOK BEFORE REG INIT-----------// + // ODM Platform info AP/ADSL/CE/MP = 1/2/3/4 + u1Byte SupportPlatform; + // ODM Support Ability DIG/RATR/TX_PWR_TRACK/ KK = 1/2/3/K + u4Byte SupportAbility; + // ODM PCIE/USB/SDIO = 1/2/3 + u1Byte SupportInterface; + // ODM composite or independent. Bit oriented/ 92C+92D+ .... or any other type = 1/2/3/... + u4Byte SupportICType; + // Cut Version TestChip/A-cut/B-cut... = 0/1/2/3/... + u1Byte CutVersion; + // Fab Version TSMC/UMC = 0/1 + u1Byte FabVersion; + // RF Type 4T4R/3T3R/2T2R/1T2R/1T1R/... + u1Byte RFType; + u1Byte RFEType; + // Board Type Normal/HighPower/MiniCard/SLIM/Combo/... = 0/1/2/3/4/... + u1Byte BoardType; + u1Byte PackageType; + u1Byte TypeGLNA; + u1Byte TypeGPA; + u1Byte TypeALNA; + u1Byte TypeAPA; + // with external LNA NO/Yes = 0/1 + u1Byte ExtLNA; + u1Byte ExtLNA5G; + // with external PA NO/Yes = 0/1 + u1Byte ExtPA; + u1Byte ExtPA5G; + // with external TRSW NO/Yes = 0/1 + u1Byte ExtTRSW; + u1Byte PatchID; //Customer ID + BOOLEAN bInHctTest; + BOOLEAN bWIFITest; + + BOOLEAN bDualMacSmartConcurrent; + u4Byte BK_SupportAbility; + u1Byte AntDivType; + + u1Byte odm_Regulation2_4G; + u1Byte odm_Regulation5G; + BOOLEAN cck_new_agc; +//-----------HOOK BEFORE REG INIT-----------// + + // + // Dynamic Value + // +//--------- POINTER REFERENCE-----------// + + u1Byte u1Byte_temp; +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_AP|ODM_ADSL)) + BOOLEAN BOOLEAN_temp; +#endif + PADAPTER PADAPTER_temp; + + // MAC PHY Mode SMSP/DMSP/DMDP = 0/1/2 + u1Byte *pMacPhyMode; + //TX Unicast byte count + u8Byte *pNumTxBytesUnicast; + //RX Unicast byte count + u8Byte *pNumRxBytesUnicast; + // Wireless mode B/G/A/N = BIT0/BIT1/BIT2/BIT3 + u1Byte *pWirelessMode; //ODM_WIRELESS_MODE_E + // Frequence band 2.4G/5G = 0/1 + u1Byte *pBandType; + // Secondary channel offset don't_care/below/above = 0/1/2 + u1Byte *pSecChOffset; + // Security mode Open/WEP/AES/TKIP = 0/1/2/3 + u1Byte *pSecurity; + // BW info 20M/40M/80M = 0/1/2 + u1Byte *pBandWidth; + // Central channel location Ch1/Ch2/.... + u1Byte *pChannel; //central channel number + BOOLEAN DPK_Done; + // Common info for 92D DMSP + + BOOLEAN *pbGetValueFromOtherMac; + PADAPTER *pBuddyAdapter; + BOOLEAN *pbMasterOfDMSP; //MAC0: master, MAC1: slave + // Common info for Status + BOOLEAN *pbScanInProcess; + BOOLEAN *pbPowerSaving; + // CCA Path 2-path/path-A/path-B = 0/1/2; using ODM_CCA_PATH_E. + u1Byte *pOnePathCCA; + //pMgntInfo->AntennaTest + u1Byte *pAntennaTest; + BOOLEAN *pbNet_closed; + u1Byte *mp_mode; + //u1Byte *pAidMap; + u1Byte *pu1ForcedIgiLb; + BOOLEAN *pIsFcsModeEnable; +//--------- POINTER REFERENCE-----------// + pu2Byte pForcedDataRate; +//------------CALL BY VALUE-------------// + BOOLEAN bLinkInProcess; + BOOLEAN bWIFI_Direct; + BOOLEAN bWIFI_Display; + BOOLEAN bLinked; + + BOOLEAN bsta_state; + u1Byte RSSI_Min; + u1Byte InterfaceIndex; // Add for 92D dual MAC: 0--Mac0 1--Mac1 + BOOLEAN bIsMPChip; + BOOLEAN bOneEntryOnly; + // Common info for BTDM + BOOLEAN bBtEnabled; // BT is disabled + BOOLEAN bBtConnectProcess; // BT HS is under connection progress. + u1Byte btHsRssi; // BT HS mode wifi rssi value. + BOOLEAN bBtHsOperation; // BT HS mode is under progress + BOOLEAN bBtDisableEdcaTurbo; // Under some condition, don't enable the EDCA Turbo + BOOLEAN bBtLimitedDig; // BT is busy. +//------------CALL BY VALUE-------------// + u1Byte RSSI_A; + u1Byte RSSI_B; + u8Byte RSSI_TRSW; + u8Byte RSSI_TRSW_H; + u8Byte RSSI_TRSW_L; + u8Byte RSSI_TRSW_iso; + u1Byte RXAntStatus; + u1Byte TXAntStatus; + u1Byte RxRate; + BOOLEAN bNoisyState; + u1Byte TxRate; + u1Byte LinkedInterval; + u1Byte preChannel; + u4Byte TxagcOffsetValueA; + BOOLEAN IsTxagcOffsetPositiveA; + u4Byte TxagcOffsetValueB; + BOOLEAN IsTxagcOffsetPositiveB; + u8Byte lastTxOkCnt; + u8Byte lastRxOkCnt; + u4Byte BbSwingOffsetA; + BOOLEAN IsBbSwingOffsetPositiveA; + u4Byte BbSwingOffsetB; + BOOLEAN IsBbSwingOffsetPositiveB; + u1Byte antdiv_rssi; + u1Byte AntType; + u1Byte pre_AntType; + u1Byte antdiv_period; + u1Byte antdiv_select; + u1Byte NdpaPeriod; + + BOOLEAN H2C_RARpt_connect; + + //For Adaptivtiy + u2Byte NHM_cnt_0; + u2Byte NHM_cnt_1; + s1Byte TH_L2H_ini; + s1Byte TH_EDCCA_HL_diff; + s1Byte TH_L2H_ini_backup; + BOOLEAN Carrier_Sense_enable; + u1Byte Adaptivity_IGI_upper; + BOOLEAN adaptivity_flag; + u1Byte DCbackoff; + BOOLEAN Adaptivity_enable; + u1Byte APTotalNum; + BOOLEAN EDCCA_enable; + ADAPTIVITY_STATISTICS Adaptivity; + //For Adaptivtiy + + ODM_NOISE_MONITOR noise_level;//[ODM_MAX_CHANNEL_NUM]; + /*for noise detection*/ + BOOLEAN NoisyDecision; /*b_noisy*/ + BOOLEAN pre_b_noisy; + u4Byte NoisyDecision_Smooth; + +#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) + s4Byte AccumulatePWDB[ODM_ASSOCIATE_ENTRY_NUM]; +#endif + + // + //2 Define STA info. + // _ODM_STA_INFO + // 2012/01/12 MH For MP, we need to reduce one array pointer for default port.?? + PSTA_INFO_T pODM_StaInfo[ODM_ASSOCIATE_ENTRY_NUM]; + +#if (RATE_ADAPTIVE_SUPPORT == 1) + u2Byte CurrminRptTime; + ODM_RA_INFO_T RAInfo[ODM_ASSOCIATE_ENTRY_NUM]; //See HalMacID support +#endif + // + // 2012/02/14 MH Add to share 88E ra with other SW team. + // We need to colelct all support abilit to a proper area. + // + BOOLEAN RaSupport88E; + + // Define ........... + + // Latest packet phy info (ODM write) + ODM_PHY_DBG_INFO_T PhyDbgInfo; + //PHY_INFO_88E PhyInfo; + + // Latest packet phy info (ODM write) + ODM_MAC_INFO *pMacInfo; + //MAC_INFO_88E MacInfo; + + // Different Team independt structure?? + + // + //TX_RTP_CMN TX_retrpo; + //TX_RTP_88E TX_retrpo; + //TX_RTP_8195 TX_retrpo; + + // + //ODM Structure + // + FAT_T DM_FatTable; + DIG_T DM_DigTable; + PS_T DM_PSTable; + Pri_CCA_T DM_PriCCA; + RXHP_T DM_RXHP_Table; +#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_IOT)) + RA_T DM_RA_Table; +#endif + PROM_INFO pROMInfo; + + FALSE_ALARM_STATISTICS FalseAlmCnt; + CFO_TRACKING DM_CfoTrack; + + FALSE_ALARM_STATISTICS FlaseAlmCntBuddyAdapter; + //#ifdef CONFIG_ANTENNA_DIVERSITY + SWAT_T DM_SWAT_Table; + BOOLEAN RSSI_test; + + //#endif + + BOOLEAN bNoBeaconIn2s; + +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + //Path Div Struct + PATHDIV_PARA pathIQK; +#endif + + EDCA_T DM_EDCA_Table; + u4Byte WMMEDCA_BE; +#if (RTL8812A_SUPPORT == 1) + PATHDIV_T DM_PathDiv; +#endif + // Copy from SD4 structure + // + // ================================================== + // + + //common + //u1Byte DM_Type; + //u1Byte PSD_Report_RXHP[80]; // Add By Gary + //u1Byte PSD_func_flag; // Add By Gary + //for DIG + //u1Byte bDMInitialGainEnable; + //u1Byte binitialized; // for dm_initial_gain_Multi_STA use. + //for Antenna diversity + //u8 AntDivCfg;// 0:OFF , 1:ON, 2:by efuse + //PSTA_INFO_T RSSI_target; + + BOOLEAN *pbDriverStopped; + BOOLEAN *pbDriverIsGoingToPnpSetPowerSleep; + BOOLEAN *pinit_adpt_in_progress; + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL)) + //PSD + BOOLEAN bUserAssignLevel; + RT_TIMER PSDTimer; + u1Byte RSSI_BT; //come from BT + BOOLEAN bPSDinProcess; + BOOLEAN bPSDactive; + BOOLEAN bDMInitialGainEnable; + + //MPT DIG + RT_TIMER MPT_DIGTimer; +#endif + + //for rate adaptive, in fact, 88c/92c fw will handle this + u1Byte bUseRAMask; + + ODM_RATE_ADAPTIVE RateAdaptive; + + ANT_DETECTED_INFO AntDetectedInfo; // Antenna detected information for RSSI tool + + ODM_RF_CAL_T RFCalibrateInfo; + + // + // TX power tracking + // + u1Byte BbSwingIdxOfdm[MAX_RF_PATH]; + u1Byte BbSwingIdxOfdmCurrent; + u1Byte BbSwingIdxOfdmBase[MAX_RF_PATH]; + BOOLEAN BbSwingFlagOfdm; + u1Byte BbSwingIdxCck[MAX_RF_PATH]; + u1Byte BbSwingIdxCckCurrent; + u1Byte BbSwingIdxCckBase[MAX_RF_PATH]; + u1Byte DefaultOfdmIndex; + u1Byte DefaultCckIndex; + BOOLEAN BbSwingFlagCck; + + s1Byte Absolute_OFDMSwingIdx[MAX_RF_PATH]; + s1Byte Absolute_CCKSwingIdx[MAX_RF_PATH]; + s1Byte Remnant_OFDMSwingIdx[MAX_RF_PATH]; + s1Byte Remnant_CCKSwingIdx[MAX_RF_PATH]; + s1Byte Modify_TxAGC_Value; //Remnat compensate value at TxAGC + BOOLEAN Modify_TxAGC_Flag_PathA; + BOOLEAN Modify_TxAGC_Flag_PathB; + BOOLEAN Modify_TxAGC_Flag_PathA_CCK; + + // + // ODM system resource. + // + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + // + // Power Training + // + BOOLEAN bDisablePowerTraining; + u1Byte ForcePowerTrainingState; + BOOLEAN bChangeState; + u4Byte PT_score; + u8Byte OFDM_RX_Cnt; + u8Byte CCK_RX_Cnt; +#endif + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL)) + // ODM relative time. + RT_TIMER PathDivSwitchTimer; + //2011.09.27 add for Path Diversity + RT_TIMER CCKPathDiversityTimer; + RT_TIMER FastAntTrainingTimer; +#endif + + // ODM relative workitem. +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #if USE_WORKITEM + RT_WORK_ITEM PathDivSwitchWorkitem; + RT_WORK_ITEM CCKPathDiversityWorkitem; + RT_WORK_ITEM FastAntTrainingWorkitem; + RT_WORK_ITEM MPT_DIGWorkitem; + RT_WORK_ITEM RaRptWorkitem; + #endif +#endif + +#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + +#if (RT_PLATFORM != PLATFORM_LINUX) +} DM_ODM_T, *PDM_ODM_T; // DM_Dynamic_Mechanism_Structure +#else +}; +#endif + +#else// for AP,ADSL,CE Team +} DM_ODM_T, *PDM_ODM_T; // DM_Dynamic_Mechanism_Structure +#endif + +typedef enum _PhyDM_Structure_Type{ + PhyDM_FalseAlmCnt, + PhyDM_CfoTrack, + PHYDM_ADAPTIVITY, + PhyDM_ROMInfo, + +}PhyDM_Structure_Type; + +typedef enum _ODM_RF_RADIO_PATH { + ODM_RF_PATH_A = 0, //Radio Path A + ODM_RF_PATH_B = 1, //Radio Path B + ODM_RF_PATH_C = 2, //Radio Path C + ODM_RF_PATH_D = 3, //Radio Path D + ODM_RF_PATH_AB, + ODM_RF_PATH_AC, + ODM_RF_PATH_AD, + ODM_RF_PATH_BC, + ODM_RF_PATH_BD, + ODM_RF_PATH_CD, + ODM_RF_PATH_ABC, + ODM_RF_PATH_ACD, + ODM_RF_PATH_BCD, + ODM_RF_PATH_ABCD, + // ODM_RF_PATH_MAX, //Max RF number 90 support +} ODM_RF_RADIO_PATH_E, *PODM_RF_RADIO_PATH_E; + + typedef enum _ODM_RF_CONTENT{ + odm_radioa_txt = 0x1000, + odm_radiob_txt = 0x1001, + odm_radioc_txt = 0x1002, + odm_radiod_txt = 0x1003 +} ODM_RF_CONTENT; + +typedef enum _ODM_BB_Config_Type{ + CONFIG_BB_PHY_REG, + CONFIG_BB_AGC_TAB, + CONFIG_BB_AGC_TAB_2G, + CONFIG_BB_AGC_TAB_5G, + CONFIG_BB_PHY_REG_PG, + CONFIG_BB_PHY_REG_MP, + CONFIG_BB_AGC_TAB_DIFF, +} ODM_BB_Config_Type, *PODM_BB_Config_Type; + +typedef enum _ODM_RF_Config_Type{ + CONFIG_RF_RADIO, + CONFIG_RF_TXPWR_LMT, +} ODM_RF_Config_Type, *PODM_RF_Config_Type; + +typedef enum _ODM_FW_Config_Type{ + CONFIG_FW_NIC, + CONFIG_FW_NIC_2, + CONFIG_FW_AP, + CONFIG_FW_MP, + CONFIG_FW_WoWLAN, + CONFIG_FW_WoWLAN_2, + CONFIG_FW_AP_WoWLAN, + CONFIG_FW_BT, + CONFIG_FW_ROM, +} ODM_FW_Config_Type; + +// Status code +#if (DM_ODM_SUPPORT_TYPE != ODM_WIN) +typedef enum _RT_STATUS{ + RT_STATUS_SUCCESS, + RT_STATUS_FAILURE, + RT_STATUS_PENDING, + RT_STATUS_RESOURCE, + RT_STATUS_INVALID_CONTEXT, + RT_STATUS_INVALID_PARAMETER, + RT_STATUS_NOT_SUPPORT, + RT_STATUS_OS_API_FAILED, +}RT_STATUS,*PRT_STATUS; +#endif // end of RT_STATUS definition + +#ifdef REMOVE_PACK +#pragma pack() +#endif + +//#include "odm_function.h" + +//3=========================================================== +//3 DIG +//3=========================================================== + +//Remove DIG by Yuchen + +//3=========================================================== +//3 AGC RX High Power Mode +//3=========================================================== +#define LNA_Low_Gain_1 0x64 +#define LNA_Low_Gain_2 0x5A +#define LNA_Low_Gain_3 0x58 + +#define FA_RXHP_TH1 5000 +#define FA_RXHP_TH2 1500 +#define FA_RXHP_TH3 800 +#define FA_RXHP_TH4 600 +#define FA_RXHP_TH5 500 + +//3=========================================================== +//3 EDCA +//3=========================================================== + +//3=========================================================== +//3 Dynamic Tx Power +//3=========================================================== +//Dynamic Tx Power Control Threshold + +//Remove By YuChen + +//3=========================================================== +//3 Tx Power Tracking +//3=========================================================== +#if 0 //mask this, since these have been defined in typdef.h, vivi +#define OFDM_TABLE_SIZE 43 +#define CCK_TABLE_SIZE 33 +#endif + + +//3=========================================================== +//3 Rate Adaptive +//3=========================================================== +//Remove to odm_RaInfo.h by RS_James + +//3=========================================================== +//3 BB Power Save +//3=========================================================== + +typedef enum tag_1R_CCA_Type_Definition +{ + CCA_1R =0, + CCA_2R = 1, + CCA_MAX = 2, +}DM_1R_CCA_E; + +typedef enum tag_RF_Type_Definition +{ + RF_Save =0, + RF_Normal = 1, + RF_MAX = 2, +}DM_RF_E; + +//3=========================================================== +//3 Antenna Diversity +//3=========================================================== +typedef enum tag_SW_Antenna_Switch_Definition +{ + Antenna_A = 1, + Antenna_B = 2, + Antenna_MAX = 3, +}DM_SWAS_E; + + +// Maximal number of antenna detection mechanism needs to perform, added by Roger, 2011.12.28. +#define MAX_ANTENNA_DETECTION_CNT 10 + +// +// Extern Global Variables. +// +// +// check Sta pointer valid or not +// +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#define IS_STA_VALID(pSta) (pSta && pSta->expire_to) +#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN) +#define IS_STA_VALID(pSta) (pSta && pSta->bUsed) +#else +#define IS_STA_VALID(pSta) (pSta) +#endif +// 20100514 Joseph: Add definition for antenna switching test after link. +// This indicates two different the steps. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK +// with original RSSI to determine if it is necessary to switch antenna. +#define SWAW_STEP_PEAK 0 +#define SWAW_STEP_DETERMINE 1 + +//Remove DIG by yuchen + +//Remove BB power saving by Yuchen + +//Remove ODM_RAStateCheck() by RS_James + +#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_AP|ODM_ADSL)) +//============================================================ +// function prototype +//============================================================ +//#define DM_ChangeDynamicInitGainThresh ODM_ChangeDynamicInitGainThresh +//void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter, +// IN INT32 DM_Type, +// IN INT32 DM_Value); + +//Remove DIG by yuchen + + +BOOLEAN +ODM_CheckPowerStatus( + IN PADAPTER Adapter + ); + + +//Remove ODM_RateAdaptiveStateApInit() by RS_James + +//Remove Edca by Yuchen + + +#define SwAntDivCheckBeforeLink ODM_SwAntDivCheckBeforeLink + +BOOLEAN +ODM_SwAntDivCheckBeforeLink( + IN PDM_ODM_T pDM_Odm + ); + + +#endif + + + +#if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) + +u4Byte ConvertTo_dB(u4Byte Value); + +u4Byte +GetPSDData( + PDM_ODM_T pDM_Odm, + unsigned int point, + u1Byte initial_gain_psd); + +#endif + +//Remove ODM_Get_Rate_Bitmap() by RS_James + +#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) +#define dm_PSDMonitorCallback odm_PSDMonitorCallback +VOID odm_PSDMonitorCallback(PRT_TIMER pTimer); + +VOID +odm_PSDMonitorWorkItemCallback( + IN PVOID pContext + ); + +VOID +PatchDCTone( + IN PDM_ODM_T pDM_Odm, + pu4Byte PSD_report, + u1Byte initial_gain_psd +); +VOID +ODM_PSDMonitor( + IN PDM_ODM_T pDM_Odm + ); +VOID odm_PSD_Monitor(PDM_ODM_T pDM_Odm); +VOID odm_PSDMonitorInit(PDM_ODM_T pDM_Odm); + +VOID +ODM_PSDDbgControl( + IN PADAPTER Adapter, + IN u4Byte mode, + IN u4Byte btRssi + ); + +#endif // DM_ODM_SUPPORT_TYPE + + +#if (BEAMFORMING_SUPPORT == 1) +BEAMFORMING_CAP +Beamforming_GetEntryBeamCapByMacId( + IN PMGNT_INFO pMgntInfo, + IN u1Byte MacId + ); +#endif + +VOID ODM_DMInit( IN PDM_ODM_T pDM_Odm); + +VOID +ODM_DMWatchdog( + IN PDM_ODM_T pDM_Odm // For common use in the future + ); + +VOID +ODM_CmnInfoInit( + IN PDM_ODM_T pDM_Odm, + IN ODM_CMNINFO_E CmnInfo, + IN u4Byte Value + ); + +VOID +ODM_CmnInfoHook( + IN PDM_ODM_T pDM_Odm, + IN ODM_CMNINFO_E CmnInfo, + IN PVOID pValue + ); + +VOID +ODM_CmnInfoPtrArrayHook( + IN PDM_ODM_T pDM_Odm, + IN ODM_CMNINFO_E CmnInfo, + IN u2Byte Index, + IN PVOID pValue + ); + +VOID +ODM_CmnInfoUpdate( + IN PDM_ODM_T pDM_Odm, + IN u4Byte CmnInfo, + IN u8Byte Value + ); + +VOID +ODM_InitAllTimers( + IN PDM_ODM_T pDM_Odm + ); + +VOID +ODM_CancelAllTimers( + IN PDM_ODM_T pDM_Odm + ); + +VOID +ODM_ReleaseAllTimers( + IN PDM_ODM_T pDM_Odm + ); + +VOID +ODM_ResetIQKResult( + IN PDM_ODM_T pDM_Odm + ); + +VOID phydm_NoisyDetection( + IN PDM_ODM_T pDM_Odm + ); + + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +VOID ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm ); +VOID ODM_FreeAllWorkItems(IN PDM_ODM_T pDM_Odm ); + + +//===========================================// +// Neil Chen----2011--06--15-- + +//3 Path Diversity +//=========================================================== + +#define TP_MODE 0 +#define RSSI_MODE 1 +#define TRAFFIC_LOW 0 +#define TRAFFIC_HIGH 1 + +//#define PATHDIV_ENABLE 1 +//#define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi + +u8Byte +PlatformDivision64( + IN u8Byte x, + IN u8Byte y +); + + +// 20100514 Joseph: Add definition for antenna switching test after link. +// This indicates two different the steps. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK +// with original RSSI to determine if it is necessary to switch antenna. +#define SWAW_STEP_PEAK 0 +#define SWAW_STEP_DETERMINE 1 + +//==================================================== +//3 PathDiV End +//==================================================== + +//#define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C + +#define DM_ChangeDynamicInitGainThresh ODM_ChangeDynamicInitGainThresh +//void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter, +// IN INT32 DM_Type, +// IN INT32 DM_Value); +// + + +typedef enum tag_DIG_Connect_Definition +{ + DIG_STA_DISCONNECT = 0, + DIG_STA_CONNECT = 1, + DIG_STA_BEFORE_CONNECT = 2, + DIG_MultiSTA_DISCONNECT = 3, + DIG_MultiSTA_CONNECT = 4, + DIG_CONNECT_MAX +}DM_DIG_CONNECT_E; + + + +// +// 2012/01/12 MH Check afapter status. Temp fix BSOD. +// +#define HAL_ADAPTER_STS_CHK(pDM_Odm)\ + if (pDM_Odm->Adapter == NULL)\ + {\ + return;\ + }\ + + +// +// For new definition in MP temporarily fro power tracking, +// +#define odm_TXPowerTrackingDirectCall(_Adapter) \ + IS_HARDWARE_TYPE_8192D(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92D(_Adapter) : \ + IS_HARDWARE_TYPE_8192C(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92C(_Adapter) : \ + IS_HARDWARE_TYPE_8723A(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_8723A(_Adapter) :\ + ODM_TXPowerTrackingCallback_ThermalMeter(_Adapter) + +#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + + +#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE)) + +VOID +ODM_SingleDualAntennaDefaultSetting( + IN PDM_ODM_T pDM_Odm + ); + +BOOLEAN +ODM_SingleDualAntennaDetection( + IN PDM_ODM_T pDM_Odm, + IN u1Byte mode + ); + +#endif // #if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) +VOID +ODM_UpdateNoisyState( + IN PDM_ODM_T pDM_Odm, + IN BOOLEAN bNoisyStateFromC2H +); + +u4Byte +Set_RA_DM_Ratrbitmap_by_Noisy( + IN PDM_ODM_T pDM_Odm, + IN WIRELESS_MODE WirelessMode, + IN u4Byte ratr_bitmap, + IN u1Byte rssi_level +); + +VOID +ODM_UpdateInitRate( + IN PDM_ODM_T pDM_Odm, + IN u1Byte Rate + ); + +//Remove ODM_DynamicARFBSelect() by RS_James + +PVOID +PhyDM_Get_Structure( + IN PDM_ODM_T pDM_Odm, + IN u1Byte Structure_Type +); + +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) +void odm_dtc(PDM_ODM_T pDM_Odm); +#endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */ + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_ACS.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_ACS.h new file mode 100644 index 0000000..f046c49 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_ACS.h @@ -0,0 +1,97 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMACS_H__ +#define __PHYDMACS_H__ + +#include "phydm_types.h" + +#define ACS_VERSION "1.1" /*20150729 by YuChen*/ +#define CLM_VERSION "1.0" + +#define ODM_MAX_CHANNEL_2G 14 +#define ODM_MAX_CHANNEL_5G 24 + +// For phydm_AutoChannelSelectSettingAP() +#define STORE_DEFAULT_NHM_SETTING 0 +#define RESTORE_DEFAULT_NHM_SETTING 1 +#define ACS_NHM_SETTING 2 + +#define ODM_REG_CLM_TIME_PERIOD_11AC 0x990 +#define ODM_REG_CLM_TIME_PERIOD_11N 0x894 +#define ODM_REG_CLM_RESULT_11AC 0xfa4 +#define ODM_REG_CLM_RESULT_11N 0x8d0 +#define ODM_REG_CLM_11AC 0x994 +#define ODM_REG_CLM_11N 0x890 +#define ODM_REG_CLM_READY_11N 0x8b4 + +typedef struct _ACS_ +{ + BOOLEAN bForceACSResult; + u1Byte CleanChannel_2G; + u1Byte CleanChannel_5G; + u2Byte Channel_Info_2G[2][ODM_MAX_CHANNEL_2G]; //Channel_Info[1]: Channel Score, Channel_Info[2]:Channel_Scan_Times + u2Byte Channel_Info_5G[2][ODM_MAX_CHANNEL_5G]; + +#if ( DM_ODM_SUPPORT_TYPE & ODM_AP ) + u1Byte ACS_Step; + // NHM Count 0-11 + u1Byte NHM_Cnt[14][11]; + + // AC-Series, for storing previous setting + u4Byte Reg0x990; + u4Byte Reg0x994; + u4Byte Reg0x998; + u4Byte Reg0x99C; + u1Byte Reg0x9A0; // u1Byte + + // N-Series, for storing previous setting + u4Byte Reg0x890; + u4Byte Reg0x894; + u4Byte Reg0x898; + u4Byte Reg0x89C; + u1Byte Reg0xE28; // u1Byte +#endif + +}ACS, *PACS; + +VOID +phydm_CLMInit( + IN PVOID pDM_VOID, + IN u2Byte sampleNum +); + +VOID +phydm_CLMtrigger( + IN PVOID pDM_VOID +); + +BOOLEAN +phydm_checkCLMready( + IN PVOID pDM_VOID +); + +u2Byte +phydm_getCLMresult( + IN PVOID pDM_VOID +); + + +#endif //#ifndef __PHYDMACS_H__ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_AntDect.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_AntDect.h new file mode 100644 index 0000000..7dc1d6e --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_AntDect.h @@ -0,0 +1,76 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMANTDECT_H__ +#define __PHYDMANTDECT_H__ + +#define ANTDECT_VERSION "1.0" + +#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE)) +//1 [1. Single Tone Method] =================================================== + + + +VOID +ODM_SingleDualAntennaDefaultSetting( + IN PDM_ODM_T pDM_Odm + ); + +BOOLEAN +ODM_SingleDualAntennaDetection( + IN PDM_ODM_T pDM_Odm, + IN u1Byte mode + ); + +//1 [2. Scan AP RSSI Method] ================================================== + +VOID +odm_SwAntDetectInit( + IN PDM_ODM_T pDM_Odm + ); + + +#define SwAntDivCheckBeforeLink ODM_SwAntDivCheckBeforeLink + +BOOLEAN +ODM_SwAntDivCheckBeforeLink( + IN PDM_ODM_T pDM_Odm + ); + + + + +//1 [3. PSD Method] ========================================================== + + +VOID +ODM_SingleDualAntennaDetection_PSD( + IN PDM_ODM_T pDM_Odm +); + + + + + + +#endif +#endif + + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_AntDiv.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_AntDiv.h new file mode 100644 index 0000000..f762e71 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_AntDiv.h @@ -0,0 +1,144 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMANTDIV_H__ +#define __PHYDMANTDIV_H__ + +#define ANTDIV_VERSION "1.0" + +#define ANT1_2G 0 // = ANT2_5G +#define ANT2_2G 1 // = ANT1_5G + +//Antenna Diversty Control Type +#define ODM_AUTO_ANT 0 +#define ODM_FIX_MAIN_ANT 1 +#define ODM_FIX_AUX_ANT 2 + +#define TX_BY_REG 0 + +#if (DM_ODM_SUPPORT_TYPE != ODM_AP) +#define ODM_RTL8881A 0 //Just for windows driver to jointly use ODM-driver +#endif + +#define ODM_ANTDIV_SUPPORT (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812) +#define ODM_N_ANTDIV_SUPPORT (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B) +#define ODM_AC_ANTDIV_SUPPORT (ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812) +#define ODM_SMART_ANT_SUPPORT (ODM_RTL8188E|ODM_RTL8192E) + +#define ODM_ANTDIV_2G_SUPPORT_IC (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8881A) +#define ODM_ANTDIV_5G_SUPPORT_IC (ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812) +#define ODM_ANTDIV_2G BIT0 +#define ODM_ANTDIV_5G BIT1 + +#define ANTDIV_ON 1 +#define ANTDIV_OFF 0 + +#define SwAntDivRestAfterLink ODM_SwAntDivRestAfterLink +VOID ODM_SwAntDivRestAfterLink( IN PDM_ODM_T pDM_Odm); + +VOID +odm_AntennaDiversityReset( + IN PDM_ODM_T pDM_Odm +); + +VOID +ODM_AntDivInit( + IN PDM_ODM_T pDM_Odm +); + +VOID +ODM_AntDiv( + IN PDM_ODM_T pDM_Odm +); + +#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) + +VOID +ODM_UpdateRxIdleAnt( + IN PDM_ODM_T pDM_Odm, + IN u1Byte Ant +); + +#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +VOID +ODM_SW_AntDiv_Callback( + IN PRT_TIMER pTimer +); + +VOID +ODM_SW_AntDiv_WorkitemCallback( + IN PVOID pContext +); +#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) +VOID +ODM_SW_AntDiv_Callback(void *FunctionContext); +#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE) +#endif + +#if(RTL8188E_SUPPORT == 1 || RTL8192E_SUPPORT == 1) +#if ( !(DM_ODM_SUPPORT_TYPE == ODM_CE)) +VOID +odm_FastAntTraining( + IN PDM_ODM_T pDM_Odm +); + +VOID +odm_FastAntTrainingCallback( + IN PDM_ODM_T pDM_Odm +); + +VOID +odm_FastAntTrainingWorkItemCallback( + IN PDM_ODM_T pDM_Odm +); +#endif +#endif + +VOID +ODM_Process_RSSIForAntDiv( + IN OUT PDM_ODM_T pDM_Odm, + IN PODM_PHY_INFO_T pPhyInfo, + IN PODM_PACKET_INFO_T pPktinfo +); + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) +VOID +ODM_SetTxAntByTxInfo( + IN PDM_ODM_T pDM_Odm, + IN pu1Byte pDesc, + IN u1Byte macId +); + +#else// (DM_ODM_SUPPORT_TYPE == ODM_AP) +VOID +ODM_SetTxAntByTxInfo( + //IN PDM_ODM_T pDM_Odm, + struct rtl8192cd_priv *priv, + struct tx_desc *pdesc, + struct tx_insn *txcfg, + unsigned short aid +); + +#endif + +#endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) +#endif //#ifndef __ODMANTDIV_H__ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_CfoTracking.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_CfoTracking.h new file mode 100644 index 0000000..3d473d5 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_CfoTracking.h @@ -0,0 +1,73 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMCFOTRACK_H__ +#define __PHYDMCFOTRACK_H__ + +#define CFO_TRACKING_VERSION "1.0" + +//#define CFO_TH_XTAL_HIGH 20 // kHz +//#define CFO_TH_XTAL_LOW 10 // kHz +//#define CFO_TH_ATC 80 // kHz + +#if ((RTL8195A_SUPPORT==0) && (RTL8711B_SUPPORT == 0)) +typedef struct _CFO_TRACKING_ +{ + BOOLEAN bATCStatus; + BOOLEAN largeCFOHit; + BOOLEAN bAdjust; + u1Byte CrystalCap; + u1Byte DefXCap; + int CFO_tail[2]; + int CFO_ave_pre; + u4Byte packetCount; + u4Byte packetCount_pre; + BOOLEAN bForceXtalCap; + BOOLEAN bReset; + u1Byte CFO_TH_XTAL_HIGH; + u1Byte CFO_TH_XTAL_LOW; + u1Byte CFO_TH_ATC; +}CFO_TRACKING, *PCFO_TRACKING; +#endif + +VOID +ODM_CfoTrackingReset( + IN PVOID pDM_VOID +); + +VOID +ODM_CfoTrackingInit( + IN PVOID pDM_VOID +); + +VOID +ODM_CfoTracking( + IN PVOID pDM_VOID +); + +VOID +ODM_ParsingCFO( + IN PVOID pDM_VOID, + IN PVOID pPktinfo_VOID, + IN s1Byte* pcfotail, + IN u1Byte num_ss +); + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DIG.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DIG.h new file mode 100644 index 0000000..58da5f8 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DIG.h @@ -0,0 +1,476 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __ODMDIG_H__ +#define __ODMDIG_H__ + +typedef struct _Dynamic_Initial_Gain_Threshold_ +{ + BOOLEAN bStopDIG; // for debug + BOOLEAN bPauseDIG; + BOOLEAN bIgnoreDIG; + BOOLEAN bPSDInProgress; + + u1Byte Dig_Enable_Flag; + u1Byte Dig_Ext_Port_Stage; + + int RssiLowThresh; + int RssiHighThresh; + + u4Byte FALowThresh; + u4Byte FAHighThresh; + + u1Byte CurSTAConnectState; + u1Byte PreSTAConnectState; + u1Byte CurMultiSTAConnectState; + + u1Byte PreIGValue; + u1Byte CurIGValue; + u1Byte BackupIGValue; //MP DIG + u1Byte BT30_CurIGI; + u1Byte IGIBackup; + + s1Byte BackoffVal; + s1Byte BackoffVal_range_max; + s1Byte BackoffVal_range_min; + u1Byte rx_gain_range_max; + u1Byte rx_gain_range_min; + u1Byte Rssi_val_min; + + u1Byte PreCCK_CCAThres; + u1Byte CurCCK_CCAThres; + u1Byte PreCCKPDState; + u1Byte CurCCKPDState; + u1Byte CCKPDBackup; + + u1Byte LargeFAHit; + u1Byte ForbiddenIGI; + u4Byte Recover_cnt; + + u1Byte DIG_Dynamic_MIN_0; + u1Byte DIG_Dynamic_MIN_1; + BOOLEAN bMediaConnect_0; + BOOLEAN bMediaConnect_1; + + u4Byte AntDiv_RSSI_max; + u4Byte RSSI_max; + + u1Byte *pbP2pLinkInProgress; + u4Byte cckFaMa; + +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + BOOLEAN bTpTarget; + BOOLEAN bNoiseEst; + u4Byte TpTrainTH_min; + u1Byte IGIOffset_A; + u1Byte IGIOffset_B; +#endif +}DIG_T,*pDIG_T; + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL)) +typedef struct _FALSE_ALARM_STATISTICS{ + u4Byte Cnt_Parity_Fail; + u4Byte Cnt_Rate_Illegal; + u4Byte Cnt_Crc8_fail; + u4Byte Cnt_Mcs_fail; + u4Byte Cnt_Ofdm_fail; + u4Byte Cnt_Ofdm_fail_pre; //For RTL8881A + u4Byte Cnt_Cck_fail; + u4Byte Cnt_all; + u4Byte Cnt_Fast_Fsync; + u4Byte Cnt_SB_Search_fail; + u4Byte Cnt_OFDM_CCA; + u4Byte Cnt_CCK_CCA; + u4Byte Cnt_CCA_all; + u4Byte Cnt_BW_USC; //Gary + u4Byte Cnt_BW_LSC; //Gary +}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; +#endif + +typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition +{ + DIG_TYPE_THRESH_HIGH = 0, + DIG_TYPE_THRESH_LOW = 1, + DIG_TYPE_BACKOFF = 2, + DIG_TYPE_RX_GAIN_MIN = 3, + DIG_TYPE_RX_GAIN_MAX = 4, + DIG_TYPE_ENABLE = 5, + DIG_TYPE_DISABLE = 6, + DIG_OP_TYPE_MAX +}DM_DIG_OP_E; + +typedef enum tag_ODM_PauseDIG_Type { + ODM_PAUSE_DIG = BIT0, + ODM_RESUME_DIG = BIT1 +} ODM_Pause_DIG_TYPE; + +typedef enum tag_ODM_PauseCCKPD_Type { + ODM_PAUSE_CCKPD = BIT0, + ODM_RESUME_CCKPD = BIT1 +} ODM_Pause_CCKPD_TYPE; + +typedef enum tag_ODM_TRx_MUX_Type +{ + ODM_SHUTDOWN = 0, + ODM_STANDBY_MODE = 1, + ODM_TX_MODE = 2, + ODM_RX_MODE = 3 +}ODM_Trx_MUX_Type; + +typedef enum tag_ODM_MACEDCCA_Type +{ + ODM_IGNORE_EDCCA = 0, + ODM_DONT_IGNORE_EDCCA = 1 +}ODM_MACEDCCA_Type; + +/* +typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition +{ + CCK_PD_STAGE_LowRssi = 0, + CCK_PD_STAGE_HighRssi = 1, + CCK_PD_STAGE_MAX = 3, +}DM_CCK_PDTH_E; + +typedef enum tag_DIG_EXT_PORT_ALGO_Definition +{ + DIG_EXT_PORT_STAGE_0 = 0, + DIG_EXT_PORT_STAGE_1 = 1, + DIG_EXT_PORT_STAGE_2 = 2, + DIG_EXT_PORT_STAGE_3 = 3, + DIG_EXT_PORT_STAGE_MAX = 4, +}DM_DIG_EXT_PORT_ALG_E; + +typedef enum tag_DIG_Connect_Definition +{ + DIG_STA_DISCONNECT = 0, + DIG_STA_CONNECT = 1, + DIG_STA_BEFORE_CONNECT = 2, + DIG_MultiSTA_DISCONNECT = 3, + DIG_MultiSTA_CONNECT = 4, + DIG_CONNECT_MAX +}DM_DIG_CONNECT_E; + + +#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;} + +#define DM_MultiSTA_InitGainChangeNotify_CONNECT(_ADAPTER) \ + DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_CONNECT) + +#define DM_MultiSTA_InitGainChangeNotify_DISCONNECT(_ADAPTER) \ + DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_DISCONNECT) +*/ +#define DM_DIG_THRESH_HIGH 40 +#define DM_DIG_THRESH_LOW 35 + +#define DM_FALSEALARM_THRESH_LOW 400 +#define DM_FALSEALARM_THRESH_HIGH 1000 + +#define DM_DIG_MAX_NIC 0x3e +#define DM_DIG_MIN_NIC 0x20 //0x1e +#define DM_DIG_MAX_OF_MIN_NIC 0x3e + +#define DM_DIG_MAX_AP 0x3e +#define DM_DIG_MIN_AP 0x1c +#define DM_DIG_MAX_OF_MIN 0x2A //0x32 +#define DM_DIG_MIN_AP_DFS 0x20 + +#define DM_DIG_MAX_NIC_HP 0x46 +#define DM_DIG_MIN_NIC_HP 0x2e + +#define DM_DIG_MAX_AP_HP 0x42 +#define DM_DIG_MIN_AP_HP 0x30 + +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#define DM_DIG_MAX_AP_COVERAGR 0x26 +#define DM_DIG_MIN_AP_COVERAGE 0x1c +#define DM_DIG_MAX_OF_MIN_COVERAGE 0x22 + +#define DM_DIG_TP_Target_TH0 500 +#define DM_DIG_TP_Target_TH1 1000 +#define DM_DIG_TP_Training_Period 10 +#endif + +//vivi 92c&92d has different definition, 20110504 +//this is for 92c +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_IOT)) + #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + #define DM_DIG_FA_TH0 0x80//0x20 + #else + #define DM_DIG_FA_TH0 0x200//0x20 + #endif +#else + #define DM_DIG_FA_TH0 0x200//0x20 +#endif + +#define DM_DIG_FA_TH1 0x300 +#define DM_DIG_FA_TH2 0x400 +//this is for 92d +#define DM_DIG_FA_TH0_92D 0x100 +#define DM_DIG_FA_TH1_92D 0x400 +#define DM_DIG_FA_TH2_92D 0x600 + +#define DM_DIG_BACKOFF_MAX 12 +#define DM_DIG_BACKOFF_MIN -4 +#define DM_DIG_BACKOFF_DEFAULT 10 + +#define DM_DIG_FA_TH0_LPS 4 //-> 4 in lps +#define DM_DIG_FA_TH1_LPS 15 //-> 15 lps +#define DM_DIG_FA_TH2_LPS 30 //-> 30 lps +#define RSSI_OFFSET_DIG 0x05 + + +VOID +odm_CheckAdaptivity( + IN PVOID pDM_VOID + ); + +VOID +odm_CheckEnvironment( + IN PVOID pDM_VOID + ); + +VOID +ODM_ChangeDynamicInitGainThresh( + IN PVOID pDM_VOID, + IN u4Byte DM_Type, + IN u4Byte DM_Value + ); + +VOID +odm_NHMCounterStatisticsInit( + IN PVOID pDM_VOID + ); + +VOID +odm_NHMCounterStatistics( + IN PVOID pDM_VOID + ); + +VOID +odm_NHMBBInit( + IN PVOID pDM_VOID +); + +VOID +odm_NHMBB( + IN PVOID pDM_VOID +); + +VOID +odm_NHMCounterStatisticsReset( + IN PVOID pDM_VOID +); + +VOID +odm_GetNHMCounterStatistics( + IN PVOID pDM_VOID +); + +VOID +odm_MACEDCCAState( + IN PVOID pDM_VOID, + IN ODM_MACEDCCA_Type State +); + +VOID +odm_SetEDCCAThreshold( + IN PVOID pDM_VOID, + IN s1Byte H2L, + IN s1Byte L2H +); + +VOID +odm_SetTRxMux( + IN PVOID pDM_VOID, + IN ODM_Trx_MUX_Type txMode, + IN ODM_Trx_MUX_Type rxMode +); + +BOOLEAN +odm_CalNHMcnt( + IN PVOID pDM_VOID + ); + +VOID +odm_SearchPwdBLowerBound( + IN PVOID pDM_VOID +); + +VOID +odm_AdaptivityInit( + IN PVOID pDM_VOID + ); + +BOOLEAN +odm_Adaptivity( + IN PVOID pDM_VOID, + IN u1Byte IGI + ); + +VOID +ODM_Write_DIG( + IN PVOID pDM_VOID, + IN u1Byte CurrentIGI + ); + +VOID +odm_PauseDIG( + IN PVOID pDM_VOID, + IN ODM_Pause_DIG_TYPE PauseType, + IN u1Byte IGIValue + ); + +VOID +odm_DIGInit( + IN PVOID pDM_VOID + ); + +VOID +odm_DIG( + IN PVOID pDM_VOID + ); + +VOID +odm_DIGbyRSSI_LPS( + IN PVOID pDM_VOID + ); + +VOID +odm_DigForBtHsMode( + IN PVOID pDM_VOID + ); + +VOID +odm_FalseAlarmCounterStatistics( + IN PVOID pDM_VOID + ); + +#if (DM_ODM_SUPPORT_TYPE & ODM_IOT) +VOID +odm_FAThresholdCheck( + IN PVOID pDM_VOID, + OUT u4Byte* dm_FA_thres + ); +#else +VOID +odm_FAThresholdCheck( + IN PVOID pDM_VOID, + IN BOOLEAN bDFSBand, + IN BOOLEAN bPerformance, + IN u4Byte RxTp, + IN u4Byte TxTp, + OUT u4Byte* dm_FA_thres + ); +#endif +u1Byte +odm_ForbiddenIGICheck( + IN PVOID pDM_VOID, + IN u1Byte DIG_Dynamic_MIN, + IN u1Byte CurrentIGI + ); + +VOID +odm_InbandNoiseCalculate ( + IN PVOID pDM_VOID + ); + +BOOLEAN +odm_DigAbort( + IN PVOID pDM_VOID + ); + +VOID +odm_PauseCCKPacketDetection( + IN PVOID pDM_VOID, + IN ODM_Pause_CCKPD_TYPE PauseType, + IN u1Byte CCKPDThreshold + ); + +VOID +odm_CCKPacketDetectionThresh( + IN PVOID pDM_VOID + ); + +VOID +ODM_Write_CCK_CCA_Thres( + IN PVOID pDM_VOID, + IN u1Byte CurCCK_CCAThres + ); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + +VOID +odm_DisableEDCCA( + IN PVOID pDM_VOID +); + +VOID +odm_DynamicEDCCA( + IN PVOID pDM_VOID +); + +VOID +odm_MPT_DIGCallback( + PRT_TIMER pTimer +); + +VOID +odm_MPT_DIGWorkItemCallback( + IN PVOID pContext + ); + +#endif + +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +VOID +odm_MPT_DIGCallback( + IN PVOID pDM_VOID +); +#endif + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_AP|ODM_ADSL)) +VOID +ODM_MPT_DIG( + IN PVOID pDM_VOID +); +#endif + + +#endif + +VOID +odm_DIGInit_8195A( + IN PVOID pDM_VOID + ); + +VOID +odm_DIG_8195A( + IN PVOID pDM_VOID + ); + +VOID +odm_FalseAlarmCounterStatistics_8195A( + IN PVOID pDM_VOID + ); + +VOID +odm_CCKPacketDetectionThresh_8195A( + IN PVOID pDM_VOID + ); \ No newline at end of file diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DynamicBBPowerSaving.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DynamicBBPowerSaving.h new file mode 100644 index 0000000..bf473f9 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DynamicBBPowerSaving.h @@ -0,0 +1,63 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMDYNAMICBBPOWERSAVING_H__ +#define __PHYDMDYNAMICBBPOWERSAVING_H__ + +#define DYNAMIC_BBPWRSAV_VERSION "1.0" + +typedef struct _Dynamic_Power_Saving_ +{ + u1Byte PreCCAState; + u1Byte CurCCAState; + + u1Byte PreRFState; + u1Byte CurRFState; + + int Rssi_val_min; + + u1Byte initialize; + u4Byte Reg874,RegC70,Reg85C,RegA74; + +}PS_T,*pPS_T; + +#define dm_RF_Saving ODM_RF_Saving + +void ODM_RF_Saving( + IN PVOID pDM_VOID, + IN u1Byte bForceInNormal + ); + +VOID +odm_DynamicBBPowerSavingInit( + IN PVOID pDM_VOID + ); + +VOID +odm_DynamicBBPowerSaving( + IN PVOID pDM_VOID + ); + +VOID +odm_1R_CCA( + IN PVOID pDM_VOID + ); + +#endif \ No newline at end of file diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DynamicTxPower.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DynamicTxPower.h new file mode 100644 index 0000000..9a38013 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_DynamicTxPower.h @@ -0,0 +1,89 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMDYNAMICTXPOWER_H__ +#define __PHYDMDYNAMICTXPOWER_H__ + +#define DYNAMIC_TXPWR_VERSION "1.0" + +#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 +#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 +#define TX_POWER_NEAR_FIELD_THRESH_AP 0x3F +#define TX_POWER_NEAR_FIELD_THRESH_8812 60 + +#define TxHighPwrLevel_Normal 0 +#define TxHighPwrLevel_Level1 1 +#define TxHighPwrLevel_Level2 2 +#define TxHighPwrLevel_BT1 3 +#define TxHighPwrLevel_BT2 4 +#define TxHighPwrLevel_15 5 +#define TxHighPwrLevel_35 6 +#define TxHighPwrLevel_50 7 +#define TxHighPwrLevel_70 8 +#define TxHighPwrLevel_100 9 + +VOID +odm_DynamicTxPowerInit( + IN PVOID pDM_VOID + ); + +VOID +odm_DynamicTxPowerRestorePowerIndex( + IN PVOID pDM_VOID + ); + +VOID +odm_DynamicTxPowerNIC( + IN PVOID pDM_VOID + ); + +#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) +VOID +odm_DynamicTxPowerSavePowerIndex( + IN PVOID pDM_VOID + ); + +VOID +odm_DynamicTxPowerWritePowerIndex( + IN PVOID pDM_VOID, + IN u1Byte Value); + +VOID +odm_DynamicTxPower_92C( + IN PVOID pDM_VOID + ); + +VOID +odm_DynamicTxPower_92D( + IN PVOID pDM_VOID + ); +#endif + +VOID +odm_DynamicTxPower( + IN PVOID pDM_VOID + ); + +VOID +odm_DynamicTxPowerAP( + IN PVOID pDM_VOID + ); + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_EdcaTurboCheck.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_EdcaTurboCheck.h new file mode 100644 index 0000000..65be74f --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_EdcaTurboCheck.h @@ -0,0 +1,152 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMEDCATURBOCHECK_H__ +#define __PHYDMEDCATURBOCHECK_H__ + +#define EDCATURBO_VERSION "1.0" + +typedef struct _EDCA_TURBO_ +{ + BOOLEAN bCurrentTurboEDCA; + BOOLEAN bIsCurRDLState; + + #if(DM_ODM_SUPPORT_TYPE == ODM_CE ) + u4Byte prv_traffic_idx; // edca turbo + #endif + +}EDCA_T,*pEDCA_T; + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) +static u4Byte edca_setting_UL[HT_IOT_PEER_MAX] = +// UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU MARVELL 92U_AP SELF_AP(DownLink/Tx) +{ 0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422, 0x5ea322, 0x3ea430, 0x5ea42b, 0x5ea44f, 0x5e4322, 0x5e4322}; + + +static u4Byte edca_setting_DL[HT_IOT_PEER_MAX] = +// UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU, MARVELL 92U_AP SELF_AP(UpLink/Rx) +{ 0xa44f, 0x5ea44f, 0x5e4322, 0x5ea42b, 0xa44f, 0xa630, 0x5ea630, 0x5ea42b, 0xa44f, 0xa42b, 0xa42b}; + +static u4Byte edca_setting_DL_GMode[HT_IOT_PEER_MAX] = +// UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU, MARVELL 92U_AP SELF_AP +{ 0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322, 0xa42b, 0x5ea42b, 0xa44f, 0x5e4322, 0x5ea42b}; + + +//============================================================ +// EDCA Paramter for AP/ADSL by Mingzhi 2011-11-22 +//============================================================ +#elif (DM_ODM_SUPPORT_TYPE &ODM_ADSL) +enum qos_prio { BK, BE, VI, VO, VI_AG, VO_AG }; + +static const struct ParaRecord rtl_ap_EDCA[] = +{ +//ACM,AIFSN, ECWmin, ECWmax, TXOplimit + {0, 7, 4, 10, 0}, //BK + {0, 3, 4, 6, 0}, //BE + {0, 1, 3, 4, 188}, //VI + {0, 1, 2, 3, 102}, //VO + {0, 1, 3, 4, 94}, //VI_AG + {0, 1, 2, 3, 47}, //VO_AG +}; + +static const struct ParaRecord rtl_sta_EDCA[] = +{ +//ACM,AIFSN, ECWmin, ECWmax, TXOplimit + {0, 7, 4, 10, 0}, + {0, 3, 4, 10, 0}, + {0, 2, 3, 4, 188}, + {0, 2, 2, 3, 102}, + {0, 2, 3, 4, 94}, + {0, 2, 2, 3, 47}, +}; +#endif + + +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#ifdef WIFI_WMM +VOID +ODM_IotEdcaSwitch( + IN PVOID pDM_VOID, + IN unsigned char enable + ); +#endif + +BOOLEAN +ODM_ChooseIotMainSTA( + IN PVOID pDM_VOID, + IN PSTA_INFO_T pstat + ); +#endif + +VOID +odm_EdcaTurboCheck( + IN PVOID pDM_VOID + ); +VOID +ODM_EdcaTurboInit( + IN PVOID pDM_VOID +); + +#if(DM_ODM_SUPPORT_TYPE==ODM_WIN) +VOID +odm_EdcaTurboCheckMP( + IN PVOID pDM_VOID + ); + +//check if edca turbo is disabled +BOOLEAN +odm_IsEdcaTurboDisable( + IN PVOID pDM_VOID +); +//choose edca paramter for special IOT case +VOID +ODM_EdcaParaSelByIot( + IN PVOID pDM_VOID, + OUT u4Byte *EDCA_BE_UL, + OUT u4Byte *EDCA_BE_DL + ); +//check if it is UL or DL +VOID +odm_EdcaChooseTrafficIdx( + IN PVOID pDM_VOID, + IN u8Byte cur_tx_bytes, + IN u8Byte cur_rx_bytes, + IN BOOLEAN bBiasOnRx, + OUT BOOLEAN *pbIsCurRDLState + ); + +#elif (DM_ODM_SUPPORT_TYPE==ODM_CE) +VOID +odm_EdcaTurboCheckCE( + IN PVOID pDM_VOID + ); +#else +VOID +odm_IotEngine( + IN PVOID pDM_VOID + ); + +VOID +odm_EdcaParaInit( + IN PVOID pDM_VOID + ); +#endif + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_HWConfig.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_HWConfig.h new file mode 100644 index 0000000..6d33de1 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_HWConfig.h @@ -0,0 +1,508 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __HALHWOUTSRC_H__ +#define __HALHWOUTSRC_H__ + + +/*--------------------------Define -------------------------------------------*/ +//#define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) +#define AGC_DIFF_CONFIG_MP(ic, band) (ODM_ReadAndConfig_MP_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_MP_##ic##_AGC_TAB_DIFF_##band, \ + sizeof(Array_MP_##ic##_AGC_TAB_DIFF_##band)/sizeof(u4Byte))) +#define AGC_DIFF_CONFIG_TC(ic, band) (ODM_ReadAndConfig_TC_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_TC_##ic##_AGC_TAB_DIFF_##band, \ + sizeof(Array_TC_##ic##_AGC_TAB_DIFF_##band)/sizeof(u4Byte))) + +#define AGC_DIFF_CONFIG(ic, band) do {\ + if (pDM_Odm->bIsMPChip)\ + AGC_DIFF_CONFIG_MP(ic,band);\ + else\ + AGC_DIFF_CONFIG_TC(ic,band);\ + } while(0) + + +//============================================================ +// structure and define +//============================================================ + +typedef struct _Phy_Rx_AGC_Info +{ + #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte gain:7,trsw:1; + #else + u1Byte trsw:1,gain:7; + #endif +} PHY_RX_AGC_INFO_T,*pPHY_RX_AGC_INFO_T; + +typedef struct _Phy_Status_Rpt_8192cd +{ + PHY_RX_AGC_INFO_T path_agc[2]; + u1Byte ch_corr[2]; + u1Byte cck_sig_qual_ofdm_pwdb_all; + u1Byte cck_agc_rpt_ofdm_cfosho_a; + u1Byte cck_rpt_b_ofdm_cfosho_b; + u1Byte rsvd_1;//ch_corr_msb; + u1Byte noise_power_db_msb; + s1Byte path_cfotail[2]; + u1Byte pcts_mask[2]; + s1Byte stream_rxevm[2]; + u1Byte path_rxsnr[2]; + u1Byte noise_power_db_lsb; + u1Byte rsvd_2[3]; + u1Byte stream_csi[2]; + u1Byte stream_target_csi[2]; + s1Byte sig_evm; + u1Byte rsvd_3; + +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte antsel_rx_keep_2:1; //ex_intf_flg:1; + u1Byte sgi_en:1; + u1Byte rxsc:2; + u1Byte idle_long:1; + u1Byte r_ant_train_en:1; + u1Byte ant_sel_b:1; + u1Byte ant_sel:1; +#else // _BIG_ENDIAN_ + u1Byte ant_sel:1; + u1Byte ant_sel_b:1; + u1Byte r_ant_train_en:1; + u1Byte idle_long:1; + u1Byte rxsc:2; + u1Byte sgi_en:1; + u1Byte antsel_rx_keep_2:1; //ex_intf_flg:1; +#endif +} PHY_STATUS_RPT_8192CD_T,*PPHY_STATUS_RPT_8192CD_T; + + +typedef struct _Phy_Status_Rpt_8812 +{ +#if 0 + PHY_RX_AGC_INFO_T path_agc[2]; + u1Byte ch_num[2]; + u1Byte cck_sig_qual_ofdm_pwdb_all; + u1Byte cck_agc_rpt_ofdm_cfosho_a; + u1Byte cck_bb_pwr_ofdm_cfosho_b; + u1Byte cck_rx_path; //CCK_RX_PATH [3:0] (with regA07[3:0] definition) + u1Byte rsvd_1; + u1Byte path_cfotail[2]; + u1Byte pcts_mask[2]; + s1Byte stream_rxevm[2]; + u1Byte path_rxsnr[2]; + u1Byte rsvd_2[2]; + u1Byte stream_snr[2]; + u1Byte stream_csi[2]; + u1Byte rsvd_3[2]; + s1Byte sig_evm; + u1Byte rsvd_4; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte antidx_anta:3; + u1Byte antidx_antb:3; + u1Byte rsvd_5:2; +#else // _BIG_ENDIAN_ + u1Byte rsvd_5:2; + u1Byte antidx_antb:3; + u1Byte antidx_anta:3; +#endif +#endif + + //2012.05.24 LukeLee: This structure should take big/little endian in consideration later..... + + //DWORD 0 + u1Byte gain_trsw[2]; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u2Byte chl_num:10; + u2Byte sub_chnl:4; + u2Byte r_RFMOD:2; +#else // _BIG_ENDIAN_ + u2Byte r_RFMOD:2; + u2Byte sub_chnl:4; + u2Byte chl_num:10; +#endif + + //DWORD 1 + u1Byte pwdb_all; + u1Byte cfosho[4]; // DW 1 byte 1 DW 2 byte 0 + + //DWORD 2 + s1Byte cfotail[4]; // DW 2 byte 1 DW 3 byte 0 + + //DWORD 3 + s1Byte rxevm[2]; // DW 3 byte 1 DW 3 byte 2 + s1Byte rxsnr[2]; // DW 3 byte 3 DW 4 byte 0 + + //DWORD 4 + u1Byte PCTS_MSK_RPT[2]; + u1Byte pdsnr[2]; // DW 4 byte 3 DW 5 Byte 0 + + //DWORD 5 + u1Byte csi_current[2]; + u1Byte rx_gain_c; + + //DWORD 6 + u1Byte rx_gain_d; + s1Byte sigevm; + u1Byte resvd_0; + u1Byte antidx_anta:3; + u1Byte antidx_antb:3; + u1Byte resvd_1:2; +} PHY_STATUS_RPT_8812_T,*PPHY_STATUS_RPT_8812_T; + + +VOID +odm_Init_RSSIForDM( + IN OUT PDM_ODM_T pDM_Odm + ); + +VOID +ODM_PhyStatusQuery( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ); + +VOID +ODM_MacStatusQuery( + IN OUT PDM_ODM_T pDM_Odm, + IN pu1Byte pMacStatus, + IN u1Byte MacID, + IN BOOLEAN bPacketMatchBSSID, + IN BOOLEAN bPacketToSelf, + IN BOOLEAN bPacketBeacon + ); +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_IOT)) + +HAL_STATUS +ODM_ConfigRFWithTxPwrTrackHeaderFile( + IN PDM_ODM_T pDM_Odm + ); + +HAL_STATUS +ODM_ConfigRFWithHeaderFile( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_Config_Type ConfigType, + IN ODM_RF_RADIO_PATH_E eRFPath + ); + +HAL_STATUS +ODM_ConfigBBWithHeaderFile( + IN PDM_ODM_T pDM_Odm, + IN ODM_BB_Config_Type ConfigType + ); + +HAL_STATUS +ODM_ConfigMACWithHeaderFile( + IN PDM_ODM_T pDM_Odm + ); + +HAL_STATUS +ODM_ConfigFWWithHeaderFile( + IN PDM_ODM_T pDM_Odm, + IN ODM_FW_Config_Type ConfigType, + OUT u1Byte *pFirmware, + OUT u4Byte *pSize + ); + +u4Byte +ODM_GetHWImgVersion( + IN PDM_ODM_T pDM_Odm + ); + +s4Byte +odm_SignalScaleMapping( + IN OUT PDM_ODM_T pDM_Odm, + IN s4Byte CurrSig + ); + +#endif + +#if(ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) +//For New RX PHY Status Report Format, include 8723D/8710B +VOID +phydm_RxPhyStatusNewType( + IN PDM_ODM_T pPhydm, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo, + OUT PODM_PHY_INFO_T pPhyInfo +); + +typedef struct _Phy_Status_Rpt_Jaguar2_Type0 { + /* DW0 */ + u1Byte page_num; + u1Byte pwdb; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte gain: 6; + u1Byte rsvd_0: 1; + u1Byte trsw: 1; +#else + u1Byte trsw: 1; + u1Byte rsvd_0: 1; + u1Byte gain: 6; +#endif + u1Byte rsvd_1; + + /* DW1 */ + u1Byte rsvd_2; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte rxsc: 4; + u1Byte agc_table: 4; +#else + u1Byte agc_table: 4; + u1Byte rxsc: 4; +#endif + u1Byte channel; + u1Byte band; + + /* DW2 */ + u2Byte length; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte antidx_a: 3; + u1Byte antidx_b: 3; + u1Byte rsvd_3: 2; + u1Byte antidx_c: 3; + u1Byte antidx_d: 3; + u1Byte rsvd_4:2; +#else + u1Byte rsvd_3: 2; + u1Byte antidx_b: 3; + u1Byte antidx_a: 3; + u1Byte rsvd_4:2; + u1Byte antidx_d: 3; + u1Byte antidx_c: 3; +#endif + + /* DW3 */ + u1Byte signal_quality; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte vga:5; + u1Byte lna_l:3; + u1Byte bb_power:6; + u1Byte rsvd_9:1; + u1Byte lna_h:1; +#else + u1Byte lna_l:3; + u1Byte vga:5; + u1Byte lna_h:1; + u1Byte rsvd_9:1; + u1Byte bb_power:6; +#endif + u1Byte rsvd_5; + + /* DW4 */ + u4Byte rsvd_6; + + /* DW5 */ + u4Byte rsvd_7; + + /* DW6 */ + u4Byte rsvd_8; +} PHY_STATUS_RPT_JAGUAR2_TYPE0, *PPHY_STATUS_RPT_JAGUAR2_TYPE0; //for CCK Format + +typedef struct _Phy_Status_Rpt_Jaguar2_Type1 { + /* DW0 and DW1 */ + u1Byte page_num; + u1Byte pwdb[4]; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte l_rxsc: 4; + u1Byte ht_rxsc: 4; +#else + u1Byte ht_rxsc: 4; + u1Byte l_rxsc: 4; +#endif + u1Byte channel; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte band: 2; + u1Byte rsvd_0: 1; + u1Byte hw_antsw_occu: 1; + u1Byte gnt_bt: 1; + u1Byte ldpc: 1; + u1Byte stbc: 1; + u1Byte beamformed: 1; +#else + u1Byte beamformed: 1; + u1Byte stbc: 1; + u1Byte ldpc: 1; + u1Byte gnt_bt: 1; + u1Byte hw_antsw_occu: 1; + u1Byte rsvd_0: 1; + u1Byte band: 2; +#endif + + /* DW2 */ + u2Byte lsig_length; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte antidx_a: 3; + u1Byte antidx_b: 3; + u1Byte rsvd_1: 2; + u1Byte antidx_c: 3; + u1Byte antidx_d: 3; + u1Byte rsvd_2: 2; +#else + u1Byte rsvd_1: 2; + u1Byte antidx_b: 3; + u1Byte antidx_a: 3; + u1Byte rsvd_2: 2; + u1Byte antidx_d: 3; + u1Byte antidx_c: 3; +#endif + + /* DW3 */ + u1Byte paid; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte paid_msb: 1; + u1Byte gid: 6; + u1Byte rsvd_3: 1; +#else + u1Byte rsvd_3: 1; + u1Byte gid: 6; + u1Byte paid_msb: 1; +#endif + u1Byte intf_pos; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte intf_pos_msb: 1; + u1Byte rsvd_4: 2; + u1Byte nb_intf_flag: 1; + u1Byte rf_mode: 2; + u1Byte rsvd_5: 2; +#else + u1Byte rsvd_5: 2; + u1Byte rf_mode: 2; + u1Byte nb_intf_flag: 1; + u1Byte rsvd_4: 2; + u1Byte intf_pos_msb: 1; +#endif + + /* DW4 */ + s1Byte rxevm[4]; /* s(8,1) */ + + /* DW5 */ + s1Byte cfo_tail[4]; /* s(8,7) */ + + /* DW6 */ + s1Byte rxsnr[4]; /* s(8,1) */ +} PHY_STATUS_RPT_JAGUAR2_TYPE1, *PPHY_STATUS_RPT_JAGUAR2_TYPE1;//for OFDM Format + +typedef struct _Phy_Status_Rpt_Jaguar2_Type2 { + /* DW0 ane DW1 */ + u1Byte page_num; + u1Byte pwdb[4]; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte l_rxsc: 4; + u1Byte ht_rxsc: 4; +#else + u1Byte ht_rxsc: 4; + u1Byte l_rxsc: 4; +#endif + u1Byte channel; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte band: 2; + u1Byte rsvd_0: 1; + u1Byte hw_antsw_occu: 1; + u1Byte gnt_bt: 1; + u1Byte ldpc: 1; + u1Byte stbc: 1; + u1Byte beamformed: 1; +#else + u1Byte beamformed: 1; + u1Byte stbc: 1; + u1Byte ldpc: 1; + u1Byte gnt_bt: 1; + u1Byte hw_antsw_occu: 1; + u1Byte rsvd_0: 1; + u1Byte band: 2; +#endif + + /* DW2 */ +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte shift_l_map: 6; + u1Byte rsvd_1: 2; +#else + u1Byte rsvd_1: 2; + u1Byte shift_l_map: 6; +#endif + u1Byte cnt_pw2cca; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte agc_table_a: 4; + u1Byte agc_table_b: 4; + u1Byte agc_table_c: 4; + u1Byte agc_table_d: 4; +#else + u1Byte agc_table_b: 4; + u1Byte agc_table_a: 4; + u1Byte agc_table_d: 4; + u1Byte agc_table_c: 4; +#endif + + /* DW3 ~ DW6*/ + u1Byte cnt_cca2agc_rdy; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte gain_a: 6; + u1Byte rsvd_2: 1; + u1Byte trsw_a: 1; + u1Byte gain_b: 6; + u1Byte rsvd_3: 1; + u1Byte trsw_b: 1; + u1Byte gain_c: 6; + u1Byte rsvd_4: 1; + u1Byte trsw_c: 1; + u1Byte gain_d: 6; + u1Byte rsvd_5: 1; + u1Byte trsw_d: 1; + u1Byte aagc_step_a: 2; + u1Byte aagc_step_b: 2; + u1Byte aagc_step_c: 2; + u1Byte aagc_step_d: 2; +#else + u1Byte trsw_a: 1; + u1Byte rsvd_2: 1; + u1Byte gain_a: 6; + u1Byte trsw_b: 1; + u1Byte rsvd_3: 1; + u1Byte gain_b: 6; + u1Byte trsw_c: 1; + u1Byte rsvd_4: 1; + u1Byte gain_c: 6; + u1Byte trsw_d: 1; + u1Byte rsvd_5: 1; + u1Byte gain_d: 6; + u1Byte aagc_step_d: 2; + u1Byte aagc_step_c: 2; + u1Byte aagc_step_b: 2; + u1Byte aagc_step_a: 2; +#endif + u1Byte ht_aagc_gain[4]; + u1Byte dagc_gain[4]; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte counter: 6; + u1Byte rsvd_6: 2; + u1Byte syn_count: 5; + u1Byte rsvd_7:3; +#else + u1Byte rsvd_6: 2; + u1Byte counter: 6; + u1Byte rsvd_7:3; + u1Byte syn_count: 5; +#endif +} PHY_STATUS_RPT_JAGUAR2_TYPE2, *PPHY_STATUS_RPT_JAGUAR2_TYPE2;//for debug mode: AGC&SBD + +#endif + +#endif /*#ifndef __HALHWOUTSRC_H__*/ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_NoiseMonitor.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_NoiseMonitor.h new file mode 100644 index 0000000..022cefe --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_NoiseMonitor.h @@ -0,0 +1,49 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + *****************************************************************************/ +#ifndef __ODMNOISEMONITOR_H__ +#define __ODMNOISEMONITOR_H__ + +#define ODM_MAX_CHANNEL_NUM 38//14+24 +struct noise_level +{ + //u1Byte value_a, value_b; + u1Byte value[MAX_RF_PATH]; + //s1Byte sval_a, sval_b; + s1Byte sval[MAX_RF_PATH]; + + //s4Byte noise_a=0, noise_b=0,sum_a=0, sum_b=0; + //s4Byte noise[ODM_RF_PATH_MAX]; + s4Byte sum[MAX_RF_PATH]; + //u1Byte valid_cnt_a=0, valid_cnt_b=0, + u1Byte valid[MAX_RF_PATH]; + u1Byte valid_cnt[MAX_RF_PATH]; + +}; + + +typedef struct _ODM_NOISE_MONITOR_ +{ + s1Byte noise[MAX_RF_PATH]; + s2Byte noise_all; +}ODM_NOISE_MONITOR; + +s2Byte ODM_InbandNoise_Monitor(PVOID pDM_VOID,u8 bPauseDIG,u8 IGIValue,u32 max_time); + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_PathDiv.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_PathDiv.h new file mode 100644 index 0000000..693f413 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_PathDiv.h @@ -0,0 +1,193 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMPATHDIV_H__ +#define __PHYDMPATHDIV_H__ + +#define PATHDIV_VERSION "1.0" + +VOID +odm_PathDiversityInit( + IN PVOID pDM_VOID + ); + +VOID +odm_PathDiversity( + IN PVOID pDM_VOID + ); + +#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) + +//#define PATHDIV_ENABLE 1 +#define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi +#define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C + +typedef struct _PathDiv_Parameter_define_ +{ + u4Byte org_5g_RegE30; + u4Byte org_5g_RegC14; + u4Byte org_5g_RegCA0; + u4Byte swt_5g_RegE30; + u4Byte swt_5g_RegC14; + u4Byte swt_5g_RegCA0; + //for 2G IQK information + u4Byte org_2g_RegC80; + u4Byte org_2g_RegC4C; + u4Byte org_2g_RegC94; + u4Byte org_2g_RegC14; + u4Byte org_2g_RegCA0; + + u4Byte swt_2g_RegC80; + u4Byte swt_2g_RegC4C; + u4Byte swt_2g_RegC94; + u4Byte swt_2g_RegC14; + u4Byte swt_2g_RegCA0; +}PATHDIV_PARA,*pPATHDIV_PARA; + +VOID +odm_PathDiversityInit_92C( + IN PADAPTER Adapter + ); + +VOID +odm_2TPathDiversityInit_92C( + IN PADAPTER Adapter + ); + +VOID +odm_1TPathDiversityInit_92C( + IN PADAPTER Adapter + ); + +BOOLEAN +odm_IsConnected_92C( + IN PADAPTER Adapter + ); + +BOOLEAN +ODM_PathDiversityBeforeLink92C( + //IN PADAPTER Adapter + IN PDM_ODM_T pDM_Odm + ); + +VOID +odm_PathDiversityAfterLink_92C( + IN PADAPTER Adapter + ); + +VOID +odm_SetRespPath_92C( + IN PADAPTER Adapter, + IN u1Byte DefaultRespPath + ); + +VOID +odm_OFDMTXPathDiversity_92C( + IN PADAPTER Adapter + ); + +VOID +odm_CCKTXPathDiversity_92C( + IN PADAPTER Adapter + ); + +VOID +odm_ResetPathDiversity_92C( + IN PADAPTER Adapter + ); + +VOID +odm_CCKTXPathDiversityCallback( + PRT_TIMER pTimer + ); + +VOID +odm_CCKTXPathDiversityWorkItemCallback( + IN PVOID pContext + ); + +VOID +odm_PathDivChkAntSwitchCallback( + PRT_TIMER pTimer + ); + +VOID +odm_PathDivChkAntSwitchWorkitemCallback( + IN PVOID pContext + ); + + +VOID +odm_PathDivChkAntSwitch( + PDM_ODM_T pDM_Odm + ); + +VOID +ODM_CCKPathDiversityChkPerPktRssi( + PADAPTER Adapter, + BOOLEAN bIsDefPort, + BOOLEAN bMatchBSSID, + PRT_WLAN_STA pEntry, + PRT_RFD pRfd, + pu1Byte pDesc + ); + +VOID +ODM_PathDivChkPerPktRssi( + PADAPTER Adapter, + BOOLEAN bIsDefPort, + BOOLEAN bMatchBSSID, + PRT_WLAN_STA pEntry, + PRT_RFD pRfd + ); + +VOID +ODM_PathDivRestAfterLink( + IN PDM_ODM_T pDM_Odm + ); + +VOID +ODM_FillTXPathInTXDESC( + IN PADAPTER Adapter, + IN PRT_TCB pTcb, + IN pu1Byte pDesc + ); + +VOID +odm_PathDivInit_92D( + IN PDM_ODM_T pDM_Odm + ); + +u1Byte +odm_SwAntDivSelectScanChnl( + IN PADAPTER Adapter + ); + +VOID +odm_SwAntDivConstructScanChnl( + IN PADAPTER Adapter, + IN u1Byte ScanChnl + ); + + #endif //#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) + + + #endif //#ifndef __ODMPATHDIV_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_PowerTracking.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_PowerTracking.h new file mode 100644 index 0000000..ea4350d --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_PowerTracking.h @@ -0,0 +1,306 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMPOWERTRACKING_H__ +#define __PHYDMPOWERTRACKING_H__ + +#define POWRTRACKING_VERSION "1.0" + +#define DPK_DELTA_MAPPING_NUM 13 +#define index_mapping_HP_NUM 15 +#define OFDM_TABLE_SIZE 43 +#define CCK_TABLE_SIZE 33 +#define TXSCALE_TABLE_SIZE 37 +#define TXPWR_TRACK_TABLE_SIZE 30 +#define DELTA_SWINGIDX_SIZE 30 +#define BAND_NUM 4 +#define CCK_TABLE_SIZE_8711B 41 + +#define AVG_THERMAL_NUM 8 +#define HP_THERMAL_NUM 8 +#define IQK_MAC_REG_NUM 4 +#define IQK_ADDA_REG_NUM 16 +#define IQK_BB_REG_NUM_MAX 10 +#if (RTL8192D_SUPPORT==1) +#define IQK_BB_REG_NUM 10 +#else +#define IQK_BB_REG_NUM 9 +#endif + + +#define IQK_Matrix_REG_NUM 8 +#if defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8195A) || defined (CONFIG_RTL8711B) +#define IQK_Matrix_Settings_NUM 14 +#else +#define IQK_Matrix_Settings_NUM 14+24+21 // Channels_2_4G_NUM + Channels_5G_20M_NUM + Channels_5G +#endif + +//extern u4Byte OFDMSwingTable[OFDM_TABLE_SIZE]; +//extern u1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8]; +//extern u1Byte CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]; +#if (RTL8195A_SUPPORT == 1) +extern const u1Byte CCKSwingTable_Ch1_Ch13_8195A[CCK_TABLE_SIZE][9]; +extern const u1Byte CCKSwingTable_Ch14_8195A[CCK_TABLE_SIZE][9]; +extern const u1Byte CCKFCCTable_8195A[16]; +extern const u1Byte CCKCETable_8195A[16]; +extern const u1Byte CCKFCCTable_Ch14_8195A[16]; +#endif + +#if (RTL8711B_SUPPORT == 1) + +extern const u1Byte CCKFCCTable_8711B[16]; +extern const u1Byte CCKCETable_8711B[16]; +extern const u1Byte CCKFCCTable_Ch14_8711B[16]; +extern const u4Byte CCKSwingTable_Ch1_Ch14_8711B[CCK_TABLE_SIZE_8711B]; +#endif + +extern const u4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE]; +extern const u1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8]; +extern const u1Byte CCKSwingTable_Ch14_New [CCK_TABLE_SIZE][8]; +//extern u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE]; + +// <20121018, Kordan> In case fail to read TxPowerTrack.txt, we use the table of 88E as the default table. +//static u1Byte DeltaSwingTableIdx_2GA_P_8188E[] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9}; +//static u1Byte DeltaSwingTableIdx_2GA_N_8188E[] = {0, 0, 0, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11}; + +#define dm_CheckTXPowerTracking ODM_TXPowerTrackingCheck + +typedef struct _IQK_MATRIX_REGS_SETTING{ + BOOLEAN bIQKDone; +#if defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8195A) || defined(CONFIG_RTL8711B) + s4Byte Value[1][IQK_Matrix_REG_NUM]; +#else + s4Byte Value[3][IQK_Matrix_REG_NUM]; + BOOLEAN bBWIqkResultSaved[3]; +#endif +}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING; + +typedef struct ODM_RF_Calibration_Structure +{ + //for tx power tracking + + u4Byte RegA24; // for TempCCK + s4Byte RegE94; + s4Byte RegE9C; + s4Byte RegEB4; + s4Byte RegEBC; + + u1Byte TXPowercount; + BOOLEAN bTXPowerTrackingInit; + BOOLEAN bTXPowerTracking; + u1Byte TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default + u1Byte TM_Trigger; + u1Byte InternalPA5G[2]; //pathA / pathB + + u1Byte ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 + u1Byte ThermalValue; + u1Byte ThermalValue_LCK; + u1Byte ThermalValue_IQK; + u1Byte ThermalValue_DPK; + u1Byte ThermalValue_AVG[AVG_THERMAL_NUM]; + u1Byte ThermalValue_AVG_index; + u1Byte ThermalValue_RxGain; + u1Byte ThermalValue_Crystal; + u1Byte ThermalValue_DPKstore; + u1Byte ThermalValue_DPKtrack; + BOOLEAN TxPowerTrackingInProgress; + + BOOLEAN bReloadtxpowerindex; + u1Byte bRfPiEnable; + u4Byte TXPowerTrackingCallbackCnt; //cosa add for debug + + + //------------------------- Tx power Tracking -------------------------// + u1Byte bCCKinCH14; + u1Byte CCK_index[MAX_RF_PATH]; + s1Byte PowerIndexOffset_CCK[MAX_RF_PATH]; + s1Byte DeltaPowerIndex_CCK[MAX_RF_PATH]; + s1Byte DeltaPowerIndexLast_CCK[MAX_RF_PATH]; + u1Byte OFDM_index[MAX_RF_PATH]; + s1Byte PowerIndexOffset_OFDM[MAX_RF_PATH]; + s1Byte DeltaPowerIndex_OFDM[MAX_RF_PATH]; + s1Byte DeltaPowerIndexLast_OFDM[MAX_RF_PATH]; + BOOLEAN bTxPowerChanged; + s1Byte XtalOffset; + s1Byte XtalOffsetLast; + + u1Byte ThermalValue_HP[HP_THERMAL_NUM]; + u1Byte ThermalValue_HP_index; + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; + u1Byte Delta_LCK; + s1Byte BBSwingDiff2G, BBSwingDiff5G; // Unit: dB + s1Byte DeltaSwingTableIdx_2GCCKA_P[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GCCKA_N[DELTA_SWINGIDX_SIZE]; +#if !defined(NOT_SUPPORT_RF_MULTIPATH) + s1Byte DeltaSwingTableIdx_2GCCKB_P[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GCCKB_N[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GCCKC_P[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GCCKC_N[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GCCKD_P[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GCCKD_N[DELTA_SWINGIDX_SIZE]; +#endif + s1Byte DeltaSwingTableIdx_2GA_P[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GA_N[DELTA_SWINGIDX_SIZE]; +#if !defined(NOT_SUPPORT_RF_MULTIPATH) + s1Byte DeltaSwingTableIdx_2GB_P[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GB_N[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GC_P[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GC_N[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GD_P[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_2GD_N[DELTA_SWINGIDX_SIZE]; +#endif +#if !defined(NOT_SUPPORT_5G) + s1Byte DeltaSwingTableIdx_5GA_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_5GA_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_5GB_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_5GB_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_5GC_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_5GC_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_5GD_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableIdx_5GD_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; +#endif +// u1Byte DeltaSwingTableIdx_2GA_P_8188E[DELTA_SWINGIDX_SIZE]; +// u1Byte DeltaSwingTableIdx_2GA_N_8188E[DELTA_SWINGIDX_SIZE]; + + s1Byte DeltaSwingTableXtal_P[DELTA_SWINGIDX_SIZE]; + s1Byte DeltaSwingTableXtal_N[DELTA_SWINGIDX_SIZE]; + + + + //--------------------------------------------------------------------// + + //for IQK + u4Byte RegC04; + u4Byte Reg874; + u4Byte RegC08; + u4Byte RegB68; + u4Byte RegB6C; + u4Byte Reg870; + u4Byte Reg860; + u4Byte Reg864; + + BOOLEAN bIQKInitialized; + BOOLEAN bLCKInProgress; + BOOLEAN bAntennaDetected; + BOOLEAN bNeedIQK; + BOOLEAN bIQKInProgress; + u1Byte Delta_IQK; + u4Byte ADDA_backup[IQK_ADDA_REG_NUM]; + u4Byte IQK_MAC_backup[IQK_MAC_REG_NUM]; + u4Byte IQK_BB_backup_recover[9]; + u4Byte IQK_BB_backup[IQK_BB_REG_NUM]; + u4Byte TxIQC_8723B[2][3][2]; // { {S1: 0xc94, 0xc80, 0xc4c} , {S0: 0xc9c, 0xc88, 0xc4c}} + u4Byte RxIQC_8723B[2][2][2]; // { {S1: 0xc14, 0xca0} , {S0: 0xc14, 0xca0}} + + // IQK time measurement + u8Byte IQK_StartTime; + u8Byte IQK_ProgressingTime; + u4Byte LOK_Result; + + //for APK + u4Byte APKoutput[2][2]; //path A/B; output1_1a/output1_2a + u1Byte bAPKdone; + u1Byte bAPKThermalMeterIgnore; + + // DPK + BOOLEAN bDPKFail; + u1Byte bDPdone; + u1Byte bDPPathAOK; + u1Byte bDPPathBOK; + + u4Byte TxLOK[2]; + u4Byte DpkTxAGC; + s4Byte DpkGain; + u4Byte DpkThermal[4]; +}ODM_RF_CAL_T,*PODM_RF_CAL_T; + + +VOID +ODM_TXPowerTrackingCheck( + IN PVOID pDM_VOID + ); + + +VOID +odm_TXPowerTrackingInit( + IN PVOID pDM_VOID + ); + +VOID +odm_TXPowerTrackingCheckAP( + IN PVOID pDM_VOID + ); + +VOID +odm_TXPowerTrackingThermalMeterInit( + IN PVOID pDM_VOID + ); + +VOID +odm_TXPowerTrackingInit( + IN PVOID pDM_VOID + ); + +VOID +odm_TXPowerTrackingCheckMP( + IN PVOID pDM_VOID + ); + + +VOID +odm_TXPowerTrackingCheckCE( + IN PVOID pDM_VOID + ); + +VOID +odm_TXPowerTrackingCheckIOT( + IN PVOID pDM_VOID + ); + +#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) + +VOID +odm_TXPowerTrackingCallbackThermalMeter92C( + IN PADAPTER Adapter + ); + +VOID +odm_TXPowerTrackingCallbackRXGainThermalMeter92D( + IN PADAPTER Adapter + ); + +VOID +odm_TXPowerTrackingCallbackThermalMeter92D( + IN PADAPTER Adapter + ); + +VOID +odm_TXPowerTrackingDirectCall92C( + IN PADAPTER Adapter + ); + +VOID +odm_TXPowerTrackingThermalMeterCheck( + IN PADAPTER Adapter + ); + +#endif + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RXHP.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RXHP.h new file mode 100644 index 0000000..98b3aa6 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RXHP.h @@ -0,0 +1,105 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __PHYDMRXHP_H__ +#define __PHYDMRXHP_H__ + +#define RXHP_VERSION "1.0" + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + +#define AFH_PSD 1 //0:normal PSD scan, 1: only do 20 pts PSD +#define MODE_40M 0 //0:20M, 1:40M +#define PSD_TH2 3 +#define PSD_CHMIN 20 // Minimum channel number for BT AFH +#define SIR_STEP_SIZE 3 +#define Smooth_Size_1 5 +#define Smooth_TH_1 3 +#define Smooth_Size_2 10 +#define Smooth_TH_2 4 +#define Smooth_Size_3 20 +#define Smooth_TH_3 4 +#define Smooth_Step_Size 5 +#define Adaptive_SIR 1 +#define PSD_RESCAN 4 +#define PSD_SCAN_INTERVAL 700 //ms + +typedef struct _RX_High_Power_ +{ + u1Byte RXHP_flag; + u1Byte PSD_func_trigger; + u1Byte PSD_bitmap_RXHP[80]; + u1Byte Pre_IGI; + u1Byte Cur_IGI; + u1Byte Pre_pw_th; + u1Byte Cur_pw_th; + BOOLEAN First_time_enter; + BOOLEAN RXHP_enable; + u1Byte TP_Mode; + RT_TIMER PSDTimer; + #if USE_WORKITEM + RT_WORK_ITEM PSDTimeWorkitem; + #endif +}RXHP_T, *pRXHP_T; + +#define dm_PSDMonitorCallback odm_PSDMonitorCallback +VOID odm_PSDMonitorCallback(PRT_TIMER pTimer); + +VOID +odm_PSDMonitorInit( + IN PVOID pDM_VOID + ); + +void odm_RXHPInit( + IN PVOID pDM_VOID); + +void odm_RXHP( + IN PVOID pDM_VOID); + +VOID +odm_PSD_RXHPCallback( + PRT_TIMER pTimer +); + + VOID +ODM_PSDDbgControl( + IN PADAPTER Adapter, + IN u4Byte mode, + IN u4Byte btRssi + ); + + VOID +odm_PSD_RXHPCallback( + PRT_TIMER pTimer +); + +VOID +odm_PSD_RXHPWorkitemCallback( + IN PVOID pContext + ); + +VOID +odm_PSDMonitorWorkItemCallback( + IN PVOID pContext + ); + + #endif + + #endif + \ No newline at end of file diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RaInfo.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RaInfo.h new file mode 100644 index 0000000..ae5371e --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RaInfo.h @@ -0,0 +1,210 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __PHYDMRAINFO_H__ +#define __PHYDMRAINFO_H__ + +#define RAINFO_VERSION "1.0" + +#define H2C_0X42_LENGTH 5 +#define H2C_MAX_LENGTH 7 + +#define RA_FLOOR_UP_GAP 3 +#define RA_FLOOR_TABLE_SIZE 7 + +#define ACTIVE_TP_THRESHOLD 150 +#define RA_RETRY_DESCEND_NUM 2 +#define RA_RETRY_LIMIT_LOW 4 +#define RA_RETRY_LIMIT_HIGH 32 + +#define RAINFO_BE_RX_STATE BIT0 // 1:RX //ULDL +#define RAINFO_STBC_STATE BIT1 +//#define RAINFO_LDPC_STATE BIT2 +#define RAINFO_NOISY_STATE BIT2 // set by Noisy_Detection +#define RAINFO_SHURTCUT_STATE BIT3 +#define RAINFO_SHURTCUT_FLAG BIT4 +#define RAINFO_INIT_RSSI_RATE_STATE BIT5 +#define RAINFO_BF_STATE BIT6 +#define RAINFO_BE_TX_STATE BIT7 // 1:TX + +#define AP_InitRateAdaptiveState ODM_RateAdaptiveStateApInit + +#define DM_RATR_STA_INIT 0 +#define DM_RATR_STA_HIGH 1 +#define DM_RATR_STA_MIDDLE 2 +#define DM_RATR_STA_LOW 3 +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#define DM_RATR_STA_ULTRA_LOW 4 +#endif + +#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_IOT)) +typedef struct _Rate_Adaptive_Table_{ + u1Byte firstconnect; + #if(DM_ODM_SUPPORT_TYPE==ODM_WIN) + BOOLEAN PT_collision_pre; + #endif + + //u1Byte link_tx_rate[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte highest_client_tx_order; + u2Byte highest_client_tx_rate_order; + u1Byte power_tracking_flag; + u1Byte RA_threshold_offset; + u1Byte RA_offset_direction; + +}RA_T, *pRA_T; +#endif + +typedef struct _ODM_RATE_ADAPTIVE +{ + u1Byte Type; // DM_Type_ByFW/DM_Type_ByDriver + u1Byte HighRSSIThresh; // if RSSI > HighRSSIThresh => RATRState is DM_RATR_STA_HIGH + u1Byte LowRSSIThresh; // if RSSI <= LowRSSIThresh => RATRState is DM_RATR_STA_LOW + u1Byte RATRState; // Current RSSI level, DM_RATR_STA_HIGH/DM_RATR_STA_MIDDLE/DM_RATR_STA_LOW + + #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_IOT)) + u1Byte LdpcThres; // if RSSI > LdpcThres => switch from LPDC to BCC + BOOLEAN bLowerRtsRate; + #endif + + #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + u1Byte RtsThres; + #elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_IOT)) + BOOLEAN bUseLdpc; + #else + u1Byte UltraLowRSSIThresh; + u4Byte LastRATR; // RATR Register Content + #endif + +} ODM_RATE_ADAPTIVE, *PODM_RATE_ADAPTIVE; + +VOID +odm_RSSIMonitorInit( + IN PVOID pDM_VOID + ); + +VOID +odm_RSSIMonitorCheck( + IN PVOID pDM_VOID + ); + +#if(DM_ODM_SUPPORT_TYPE==ODM_WIN) +VOID +odm_RSSIDumpToRegister( + IN PVOID pDM_VOID + ); +#endif + +VOID +odm_RSSIMonitorCheckMP( + IN PVOID pDM_VOID + ); + +VOID +odm_RSSIMonitorCheckCE( + IN PVOID pDM_VOID + ); + +VOID +odm_RSSIMonitorCheckIOT( + IN PVOID pDM_VOID + ); + +VOID +odm_RSSIMonitorCheckAP( + IN PVOID pDM_VOID + ); + + +VOID +odm_RateAdaptiveMaskInit( + IN PVOID pDM_VOID + ); + +VOID +odm_RefreshRateAdaptiveMask( + IN PVOID pDM_VOID + ); + +VOID +odm_RefreshRateAdaptiveMaskMP( + IN PVOID pDM_VOID + ); + +VOID +odm_RefreshRateAdaptiveMaskCE( + IN PVOID pDM_VOID + ); + +VOID +odm_RefreshRateAdaptiveMaskIOT( + IN PVOID pDM_VOID + ); + +VOID +odm_RefreshRateAdaptiveMaskAPADSL( + IN PVOID pDM_VOID + ); + +BOOLEAN +ODM_RAStateCheck( + IN PVOID pDM_VOID, + IN s4Byte RSSI, + IN BOOLEAN bForceUpdate, + OUT pu1Byte pRATRState + ); + +VOID +odm_RefreshBasicRateMask( + IN PVOID pDM_VOID + ); + +VOID +phydm_ra_info_init( + IN PVOID pDM_VOID + ); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +VOID +ODM_DynamicARFBSelect( + IN PVOID pDM_VOID, + IN u1Byte rate, + IN BOOLEAN Collision_State + ); + +VOID +ODM_RateAdaptiveStateApInit( + IN PVOID PADAPTER_VOID, + IN PRT_WLAN_STA pEntry + ); +#endif + +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_IOT)) +u4Byte +ODM_Get_Rate_Bitmap( + IN PVOID pDM_VOID, + IN u4Byte macid, + IN u4Byte ra_mask, + IN u1Byte rssi_level + ); +#endif + +#endif //#ifndef __ODMRAINFO_H__ + + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RegDefine11AC.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RegDefine11AC.h new file mode 100644 index 0000000..9b83c55 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RegDefine11AC.h @@ -0,0 +1,81 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __ODM_REGDEFINE11AC_H__ +#define __ODM_REGDEFINE11AC_H__ + +//2 RF REG LIST + + + +//2 BB REG LIST +//PAGE 8 +#define ODM_REG_CCK_RPT_FORMAT_11AC 0x804 +#define ODM_REG_BB_RX_PATH_11AC 0x808 +#define ODM_REG_BB_TX_PATH_11AC 0x80c +#define ODM_REG_BB_ATC_11AC 0x860 +#define ODM_REG_EDCCA_POWER_CAL 0x8dc +#define ODM_REG_DBG_RPT_11AC 0x8fc +//PAGE 9 +#define ODM_REG_EDCCA_DOWN_OPT 0x900 +#define ODM_REG_ACBB_EDCCA_ENHANCE 0x944 +#define ODM_REG_OFDM_FA_RST_11AC 0x9A4 +#define ODM_REG_NHM_TIMER_11AC 0x990 +#define ODM_REG_NHM_TH9_TH10_11AC 0x994 +#define ODM_REG_NHM_TH3_TO_TH0_11AC 0x998 +#define ODM_REG_NHM_TH7_TO_TH4_11AC 0x99c +#define ODM_REG_NHM_TH8_11AC 0x9a0 +#define ODM_REG_NHM_9E8_11AC 0x9e8 +//PAGE A +#define ODM_REG_CCK_CCA_11AC 0xA0A +#define ODM_REG_CCK_FA_RST_11AC 0xA2C +#define ODM_REG_CCK_FA_11AC 0xA5C +//PAGE B +#define ODM_REG_RST_RPT_11AC 0xB58 +//PAGE C +#define ODM_REG_TRMUX_11AC 0xC08 +#define ODM_REG_IGI_A_11AC 0xC50 +//PAGE E +#define ODM_REG_IGI_B_11AC 0xE50 +#define ODM_REG_TRMUX_11AC_B 0xE08 +//PAGE F +#define ODM_REG_CCK_CCA_CNT_11AC 0xF08 +#define ODM_REG_OFDM_FA_11AC 0xF48 +#define ODM_REG_RPT_11AC 0xfa0 +#define ODM_REG_NHM_CNT_11AC 0xfa8 +//PAGE 18 +#define ODM_REG_IGI_C_11AC 0x1850 +//PAGE 1A +#define ODM_REG_IGI_D_11AC 0x1A50 + +//2 MAC REG LIST +#define ODM_REG_RESP_TX_11AC 0x6D8 + + + +//DIG Related +#define ODM_BIT_IGI_11AC 0xFFFFFFFF +#define ODM_BIT_CCK_RPT_FORMAT_11AC BIT16 +#define ODM_BIT_BB_RX_PATH_11AC 0xF +#define ODM_BIT_BB_TX_PATH_11AC 0xF +#define ODM_BIT_BB_ATC_11AC BIT14 + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RegDefine11N.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RegDefine11N.h new file mode 100644 index 0000000..c1d91d7 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_RegDefine11N.h @@ -0,0 +1,186 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __ODM_REGDEFINE11N_H__ +#define __ODM_REGDEFINE11N_H__ + + +//2 RF REG LIST +#define ODM_REG_RF_MODE_11N 0x00 +#define ODM_REG_RF_0B_11N 0x0B +#define ODM_REG_CHNBW_11N 0x18 +#define ODM_REG_T_METER_11N 0x24 +#define ODM_REG_RF_25_11N 0x25 +#define ODM_REG_RF_26_11N 0x26 +#define ODM_REG_RF_27_11N 0x27 +#define ODM_REG_RF_2B_11N 0x2B +#define ODM_REG_RF_2C_11N 0x2C +#define ODM_REG_RXRF_A3_11N 0x3C +#define ODM_REG_T_METER_92D_11N 0x42 +#define ODM_REG_T_METER_88E_11N 0x42 + + + +//2 BB REG LIST +//PAGE 8 +#define ODM_REG_BB_CTRL_11N 0x800 +#define ODM_REG_RF_PIN_11N 0x804 +#define ODM_REG_PSD_CTRL_11N 0x808 +#define ODM_REG_TX_ANT_CTRL_11N 0x80C +#define ODM_REG_BB_PWR_SAV5_11N 0x818 +#define ODM_REG_CCK_RPT_FORMAT_11N 0x824 +#define ODM_REG_CCK_RPT_FORMAT_11N_B 0x82C +#define ODM_REG_RX_DEFUALT_A_11N 0x858 +#define ODM_REG_RX_DEFUALT_B_11N 0x85A +#define ODM_REG_BB_PWR_SAV3_11N 0x85C +#define ODM_REG_ANTSEL_CTRL_11N 0x860 +#define ODM_REG_RX_ANT_CTRL_11N 0x864 +#define ODM_REG_PIN_CTRL_11N 0x870 +#define ODM_REG_BB_PWR_SAV1_11N 0x874 +#define ODM_REG_ANTSEL_PATH_11N 0x878 +#define ODM_REG_BB_3WIRE_11N 0x88C +#define ODM_REG_SC_CNT_11N 0x8C4 +#define ODM_REG_PSD_DATA_11N 0x8B4 +#define ODM_REG_PSD_DATA_11N 0x8B4 +#define ODM_REG_NHM_TIMER_11N 0x894 +#define ODM_REG_NHM_TH9_TH10_11N 0x890 +#define ODM_REG_NHM_TH3_TO_TH0_11N 0x898 +#define ODM_REG_NHM_TH7_TO_TH4_11N 0x89c +#define ODM_REG_NHM_CNT_11N 0x8d8 +//PAGE 9 +#define ODM_REG_DBG_RPT_11N 0x908 +#define ODM_REG_BB_TX_PATH_11N 0x90c +#define ODM_REG_ANT_MAPPING1_11N 0x914 +#define ODM_REG_ANT_MAPPING2_11N 0x918 +#define ODM_REG_EDCCA_DOWN_OPT_11N 0x948 + +//PAGE A +#define ODM_REG_CCK_ANTDIV_PARA1_11N 0xA00 +#define ODM_REG_CCK_CCA_11N 0xA0A +#define ODM_REG_CCK_ANTDIV_PARA2_11N 0xA0C +#define ODM_REG_CCK_ANTDIV_PARA3_11N 0xA10 +#define ODM_REG_CCK_ANTDIV_PARA4_11N 0xA14 +#define ODM_REG_CCK_FILTER_PARA1_11N 0xA22 +#define ODM_REG_CCK_FILTER_PARA2_11N 0xA23 +#define ODM_REG_CCK_FILTER_PARA3_11N 0xA24 +#define ODM_REG_CCK_FILTER_PARA4_11N 0xA25 +#define ODM_REG_CCK_FILTER_PARA5_11N 0xA26 +#define ODM_REG_CCK_FILTER_PARA6_11N 0xA27 +#define ODM_REG_CCK_FILTER_PARA7_11N 0xA28 +#define ODM_REG_CCK_FILTER_PARA8_11N 0xA29 +#define ODM_REG_CCK_FA_RST_11N 0xA2C +#define ODM_REG_CCK_FA_MSB_11N 0xA58 +#define ODM_REG_CCK_FA_LSB_11N 0xA5C +#define ODM_REG_CCK_CCA_CNT_11N 0xA60 +#define ODM_REG_BB_PWR_SAV4_11N 0xA74 +//PAGE B +#define ODM_REG_LNA_SWITCH_11N 0xB2C +#define ODM_REG_PATH_SWITCH_11N 0xB30 +#define ODM_REG_RSSI_CTRL_11N 0xB38 +#define ODM_REG_CONFIG_ANTA_11N 0xB68 +#define ODM_REG_RSSI_BT_11N 0xB9C +//PAGE C +#define ODM_REG_OFDM_FA_HOLDC_11N 0xC00 +#define ODM_REG_BB_RX_PATH_11N 0xC04 +#define ODM_REG_TRMUX_11N 0xC08 +#define ODM_REG_OFDM_FA_RSTC_11N 0xC0C +#define ODM_REG_RXIQI_MATRIX_11N 0xC14 +#define ODM_REG_TXIQK_MATRIX_LSB1_11N 0xC4C +#define ODM_REG_IGI_A_11N 0xC50 +#define ODM_REG_ANTDIV_PARA2_11N 0xC54 +#define ODM_REG_IGI_B_11N 0xC58 +#define ODM_REG_ANTDIV_PARA3_11N 0xC5C +#define ODM_REG_L1SBD_PD_CH_11N 0XC6C +#define ODM_REG_BB_PWR_SAV2_11N 0xC70 +#define ODM_REG_RX_OFF_11N 0xC7C +#define ODM_REG_TXIQK_MATRIXA_11N 0xC80 +#define ODM_REG_TXIQK_MATRIXB_11N 0xC88 +#define ODM_REG_TXIQK_MATRIXA_LSB2_11N 0xC94 +#define ODM_REG_TXIQK_MATRIXB_LSB2_11N 0xC9C +#define ODM_REG_RXIQK_MATRIX_LSB_11N 0xCA0 +#define ODM_REG_ANTDIV_PARA1_11N 0xCA4 +#define ODM_REG_OFDM_FA_TYPE1_11N 0xCF0 +//PAGE D +#define ODM_REG_OFDM_FA_RSTD_11N 0xD00 +#define ODM_REG_BB_ATC_11N 0xD2C +#define ODM_REG_OFDM_FA_TYPE2_11N 0xDA0 +#define ODM_REG_OFDM_FA_TYPE3_11N 0xDA4 +#define ODM_REG_OFDM_FA_TYPE4_11N 0xDA8 +#define ODM_REG_RPT_11N 0xDF4 +//PAGE E +#define ODM_REG_TXAGC_A_6_18_11N 0xE00 +#define ODM_REG_TXAGC_A_24_54_11N 0xE04 +#define ODM_REG_TXAGC_A_1_MCS32_11N 0xE08 +#define ODM_REG_TXAGC_A_MCS0_3_11N 0xE10 +#define ODM_REG_TXAGC_A_MCS4_7_11N 0xE14 +#define ODM_REG_TXAGC_A_MCS8_11_11N 0xE18 +#define ODM_REG_TXAGC_A_MCS12_15_11N 0xE1C +#define DOM_REG_EDCCA_DCNF_11N 0xE24 +#define ODM_REG_FPGA0_IQK_11N 0xE28 +#define ODM_REG_TXIQK_TONE_A_11N 0xE30 +#define ODM_REG_RXIQK_TONE_A_11N 0xE34 +#define ODM_REG_TXIQK_PI_A_11N 0xE38 +#define ODM_REG_RXIQK_PI_A_11N 0xE3C +#define ODM_REG_TXIQK_11N 0xE40 +#define ODM_REG_RXIQK_11N 0xE44 +#define ODM_REG_IQK_AGC_PTS_11N 0xE48 +#define ODM_REG_IQK_AGC_RSP_11N 0xE4C +#define ODM_REG_BLUETOOTH_11N 0xE6C +#define ODM_REG_RX_WAIT_CCA_11N 0xE70 +#define ODM_REG_TX_CCK_RFON_11N 0xE74 +#define ODM_REG_TX_CCK_BBON_11N 0xE78 +#define ODM_REG_OFDM_RFON_11N 0xE7C +#define ODM_REG_OFDM_BBON_11N 0xE80 +#define ODM_REG_TX2RX_11N 0xE84 +#define ODM_REG_TX2TX_11N 0xE88 +#define ODM_REG_RX_CCK_11N 0xE8C +#define ODM_REG_RX_OFDM_11N 0xED0 +#define ODM_REG_RX_WAIT_RIFS_11N 0xED4 +#define ODM_REG_RX2RX_11N 0xED8 +#define ODM_REG_STANDBY_11N 0xEDC +#define ODM_REG_SLEEP_11N 0xEE0 +#define ODM_REG_PMPD_ANAEN_11N 0xEEC +#define ODM_REG_IGI_C_11N 0xF84 +#define ODM_REG_IGI_D_11N 0xF88 + +//2 MAC REG LIST +#define ODM_REG_BB_RST_11N 0x02 +#define ODM_REG_ANTSEL_PIN_11N 0x4C +#define ODM_REG_EARLY_MODE_11N 0x4D0 +#define ODM_REG_RSSI_MONITOR_11N 0x4FE +#define ODM_REG_EDCA_VO_11N 0x500 +#define ODM_REG_EDCA_VI_11N 0x504 +#define ODM_REG_EDCA_BE_11N 0x508 +#define ODM_REG_EDCA_BK_11N 0x50C +#define ODM_REG_TXPAUSE_11N 0x522 +#define ODM_REG_RESP_TX_11N 0x6D8 +#define ODM_REG_ANT_TRAIN_PARA1_11N 0x7b0 +#define ODM_REG_ANT_TRAIN_PARA2_11N 0x7b4 + + +//DIG Related +#define ODM_BIT_IGI_11N 0x0000007F +#define ODM_BIT_CCK_RPT_FORMAT_11N BIT9 +#define ODM_BIT_BB_RX_PATH_11N 0xF +#define ODM_BIT_BB_TX_PATH_11N 0xF +#define ODM_BIT_BB_ATC_11N BIT11 + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_debug.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_debug.h new file mode 100644 index 0000000..366e306 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_debug.h @@ -0,0 +1,900 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __ODM_DBG_H__ +#define __ODM_DBG_H__ + + +//----------------------------------------------------------------------------- +// Define the debug levels +// +// 1. DBG_TRACE and DBG_LOUD are used for normal cases. +// So that, they can help SW engineer to develope or trace states changed +// and also help HW enginner to trace every operation to and from HW, +// e.g IO, Tx, Rx. +// +// 2. DBG_WARNNING and DBG_SERIOUS are used for unusual or error cases, +// which help us to debug SW or HW. +// +//----------------------------------------------------------------------------- +// +// Never used in a call to ODM_RT_TRACE()! +// +#define ODM_DBG_OFF 1 + +// +// Fatal bug. +// For example, Tx/Rx/IO locked up, OS hangs, memory access violation, +// resource allocation failed, unexpected HW behavior, HW BUG and so on. +// +#define ODM_DBG_SERIOUS 2 + +// +// Abnormal, rare, or unexpeted cases. +// For example, IRP/Packet/OID canceled, device suprisely unremoved and so on. +// +#define ODM_DBG_WARNING 3 + +// +// Normal case with useful information about current SW or HW state. +// For example, Tx/Rx descriptor to fill, Tx/Rx descriptor completed status, +// SW protocol state change, dynamic mechanism state change and so on. +// +#define ODM_DBG_LOUD 4 + +// +// Normal case with detail execution flow or information. +// +#define ODM_DBG_TRACE 5 + +//----------------------------------------------------------------------------- +// Define the tracing components +// +//----------------------------------------------------------------------------- +//BB Functions +#define ODM_COMP_DIG BIT0 +#define ODM_COMP_RA_MASK BIT1 +#define ODM_COMP_DYNAMIC_TXPWR BIT2 +#define ODM_COMP_FA_CNT BIT3 +#define ODM_COMP_RSSI_MONITOR BIT4 +#define ODM_COMP_CCK_PD BIT5 +#define ODM_COMP_ANT_DIV BIT6 +#define ODM_COMP_PWR_SAVE BIT7 +#define ODM_COMP_PWR_TRAIN BIT8 +#define ODM_COMP_RATE_ADAPTIVE BIT9 +#define ODM_COMP_PATH_DIV BIT10 +#define ODM_COMP_PSD BIT11 +#define ODM_COMP_DYNAMIC_PRICCA BIT12 +#define ODM_COMP_RXHP BIT13 +#define ODM_COMP_MP BIT14 +#define ODM_COMP_CFO_TRACKING BIT15 +#define ODM_COMP_ACS BIT16 +#define PHYDM_COMP_ADAPTIVITY BIT17 + +//MAC Functions +#define ODM_COMP_EDCA_TURBO BIT18 +#define ODM_COMP_EARLY_MODE BIT19 +//RF Functions +#define ODM_COMP_TX_PWR_TRACK BIT24 +#define ODM_COMP_RX_GAIN_TRACK BIT25 +#define ODM_COMP_CALIBRATION BIT26 +//Common Functions +#define ODM_COMP_INIT BIT29 +#define ODM_COMP_COMMON BIT30 +#define ODM_COMP_FIX BIT31 + +/*------------------------Export Marco Definition---------------------------*/ +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #define RT_PRINTK DbgPrint +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + #define DbgPrint printk + #define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args); + #define RT_DISP(dbgtype, dbgflag, printstr) +#elif (DM_ODM_SUPPORT_TYPE == ODM_IOT) + #define DbgPrint printf + #define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args); + #define RT_DISP(dbgtype, dbgflag, printstr) +#else + #define DbgPrint panic_printk + #define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args); +#endif + +#ifndef ASSERT + #define ASSERT(expr) +#endif + +#if DBG +#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt) \ + if(((comp) & ROMInfo.DebugComponents) && (level <= ROMInfo.DebugLevel || level == ODM_DBG_SERIOUS)) \ + { \ + RT_PRINTK fmt; \ + } + +#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt) \ + if(((comp) & ROMInfo.DebugComponents) && (level <= ROMInfo.DebugLevel)) \ + { \ + RT_PRINTK fmt; \ + } + +#define ODM_RT_ASSERT(pDM_Odm, expr, fmt) \ + if(!(expr)) { \ + DbgPrint( "Assertion failed! %s at ......\n", #expr); \ + DbgPrint( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \ + RT_PRINTK fmt; \ + ASSERT(FALSE); \ + } +#define ODM_dbg_enter() { DbgPrint("==> %s\n", __FUNCTION__); } +#define ODM_dbg_exit() { DbgPrint("<== %s\n", __FUNCTION__); } +#define ODM_dbg_trace(str) { DbgPrint("%s:%s\n", __FUNCTION__, str); } + +#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr) \ + if(((comp) & ROMInfo.DebugComponents) && (level <= ROMInfo.DebugLevel)) \ + { \ + int __i; \ + pu1Byte __ptr = (pu1Byte)ptr; \ + DbgPrint("[ODM] "); \ + DbgPrint(title_str); \ + DbgPrint(" "); \ + for( __i=0; __i<6; __i++ ) \ + DbgPrint("%02X%s", __ptr[__i], (__i==5)?"":"-"); \ + DbgPrint("\n"); \ + } +#else +#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt) +#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt) +#define ODM_RT_ASSERT(pDM_Odm, expr, fmt) +#define ODM_dbg_enter() +#define ODM_dbg_exit() +#define ODM_dbg_trace(str) +#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr) +#endif + + +VOID +ODM_InitDebugSetting( + IN PDM_ODM_T pDM_Odm + ); + + + +#if 0 +#if DBG +#define DbgPrint printk + +#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) \ + { \ + char *szTitle = _TitleString; \ + pu1Byte pbtHexData = _HexData; \ + u4Byte u4bHexDataLen = _HexDataLen; \ + u4Byte __i; \ + DbgPrint("%s", szTitle); \ + for (__i=0;__i=' ' &&_ch<='~' ) // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22. + +#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) \ + if(((_Comp) & ODM_GlobalDebugComponents) && (_Level <= ODM_GlobalDebugLevel)) \ + { \ + int __i; \ + u1Byte buffer[MAX_STR_LEN]; \ + int length = (_Len\n", _Len, buffer); \ + } + +#else // of #if DBG +#define DbgPrint(...) +#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) +#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) +#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr) +#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum) +#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) +#endif // of #if DBG + +#endif + + +#if 0 +/* Define debug print header for every service module.*/ +typedef struct tag_ODM_DBGP_Service_Module_Header_Name_Structure +{ + const char *pMANS; + const char *pRTOS; + const char *pALM; + const char *pPEM; + const char *pCMPK; + const char *pRAPD; + const char *pTXPB; + const char *pQUMG; +}ODM_DBGP_HEAD_T; + + +/* Define different debug flag for dedicated service modules in debug flag array. */ +// Each module has independt 32 bit debug flag you cnn define the flag as yout require. +typedef enum tag_ODM_DBGP_Flag_Type_Definition +{ + ODM_FTX = 0, + ODM_FRX , + ODM_FPHY , + ODM_FPWR , + ODM_FDM , + ODM_FC2H , + ODM_FBT , + ODM_DBGP_TYPE_MAX +}ODM_DBGP_FLAG_E; + + +// Define TX relative debug bit --> FTX +#define ODM_TX_DESC BIT0 +#define ODM_TX_DESC_TID BIT1 +#define ODM_TX_PATH BIT2 + +// Define RX relative debug bit --> FRX +#define ODM_RX_DATA BIT0 +#define ODM_RX_PHY_STS BIT1 +#define ODM_RX_PHY_SS BIT2 +#define ODM_RX_PHY_SQ BIT3 +#define ODM_RX_PHY_ASTS BIT4 +#define ODM_RX_ERR_LEN BIT5 +#define ODM_RX_DEFRAG BIT6 +#define ODM_RX_ERR_RATE BIT7 +#define ODM_RX_PATH BIT8 +#define ODM_RX_BEACON BIT9 + +// Define PHY-BB/RF/MAC check module bit --> FPHY +#define ODM_PHY_BBR BIT0 +#define ODM_PHY_BBW BIT1 +#define ODM_PHY_RFR BIT2 +#define ODM_PHY_RFW BIT3 +#define ODM_PHY_MACR BIT4 +#define ODM_PHY_MACW BIT5 +#define ODM_PHY_ALLR BIT6 +#define ODM_PHY_ALLW BIT7 +#define ODM_PHY_TXPWR BIT8 +#define ODM_PHY_PWRDIFF BIT9 +#define ODM_PHY_SICR BIT10 +#define ODM_PHY_SICW BIT11 + + + + +extern u4Byte ODM_GlobalDebugLevel; + + +#if DBG +extern u8Byte ODM_GlobalDebugComponents; +#endif +#endif +#if 0 + +//----------------------------------------------------------------------------- +// Define the debug levels +// +// 1. DBG_TRACE and DBG_LOUD are used for normal cases. +// So that, they can help SW engineer to develope or trace states changed +// and also help HW enginner to trace every operation to and from HW, +// e.g IO, Tx, Rx. +// +// 2. DBG_WARNNING and DBG_SERIOUS are used for unusual or error cases, +// which help us to debug SW or HW. +// +//----------------------------------------------------------------------------- +// +// Never used in a call to ODM_RT_TRACE(pDM_Odm,)! +// +#define DBG_OFF 0 + +// +// Deprecated! Don't use it! +// TODO: fix related debug message! +// +//#define DBG_SEC 1 + +// +// Fatal bug. +// For example, Tx/Rx/IO locked up, OS hangs, memory access violation, +// resource allocation failed, unexpected HW behavior, HW BUG and so on. +// +#define DBG_SERIOUS 2 + +// +// Abnormal, rare, or unexpeted cases. +// For example, IRP/Packet/OID canceled, device suprisely unremoved and so on. +// +#define DBG_WARNING 3 + +// +// Normal case with useful information about current SW or HW state. +// For example, Tx/Rx descriptor to fill, Tx/Rx descriptor completed status, +// SW protocol state change, dynamic mechanism state change and so on. +// +#define DBG_LOUD 4 + +// +// Normal case with detail execution flow or information. +// +#define DBG_TRACE 5 + + + +//----------------------------------------------------------------------------- +// Define the tracing components +// +//----------------------------------------------------------------------------- +#define COMP_TRACE BIT0 // For function call tracing. +#define COMP_DBG BIT1 // Only for temporary debug message. +#define COMP_INIT BIT2 // during driver initialization / halt / reset. +#define COMP_OID_QUERY BIT3 // Query OID. +#define COMP_OID_SET BIT4 // Set OID. +#define COMP_RECV BIT5 // Reveive part data path. +#define COMP_SEND BIT6 // Send part path. +#define COMP_IO BIT7 // I/O Related. Added by Annie, 2006-03-02. +#define COMP_POWER BIT8 // 802.11 Power Save mode or System/Device Power state related. +#define COMP_MLME BIT9 // 802.11 link related: join/start BSS, leave BSS. +#define COMP_SCAN BIT10 // For site survey. +#define COMP_SYSTEM BIT11 // For general platform function. +#define COMP_SEC BIT12 // For Security. +#define COMP_AP BIT13 // For AP mode related. +#define COMP_TURBO BIT14 // For Turbo Mode related. By Annie, 2005-10-21. +#define COMP_QOS BIT15 // For QoS. +#define COMP_AUTHENTICATOR BIT16 // For AP mode Authenticator. Added by Annie, 2006-01-30. +#define COMP_BEACON BIT17 // For Beacon related, by rcnjko. +#define COMP_ANTENNA BIT18 // For Antenna diversity related, by rcnjko. +#define COMP_RATE BIT19 // For Rate Adaptive mechanism, 2006.07.02, by rcnjko. #define COMP_EVENTS 0x00000080 // Event handling +#define COMP_EVENTS BIT20 // Event handling +#define COMP_FPGA BIT21 // For FPGA verfication +#define COMP_RM BIT22 // For Radio Measurement. +#define COMP_MP BIT23 // For mass production test, by shien chang, 2006.07.13 +#define COMP_RXDESC BIT24 // Show Rx desc information for SD3 debug. Added by Annie, 2006-07-15. +#define COMP_CKIP BIT25 // For CCX 1 S13: CKIP. Added by Annie, 2006-08-14. +#define COMP_DIG BIT26 // For DIG, 2006.09.25, by rcnjko. +#define COMP_TXAGC BIT27 // For Tx power, 060928, by rcnjko. +#define COMP_HIPWR BIT28 // For High Power Mechanism, 060928, by rcnjko. +#define COMP_HALDM BIT29 // For HW Dynamic Mechanism, 061010, by rcnjko. +#define COMP_RSNA BIT30 // For RSNA IBSS , 061201, by CCW. +#define COMP_INDIC BIT31 // For link indication +#define COMP_LED BIT32 // For LED. +#define COMP_RF BIT33 // For RF. +//1!!!!!!!!!!!!!!!!!!!!!!!!!!! +//1//1Attention Please!!!<11n or 8190 specific code should be put below this line> +//1!!!!!!!!!!!!!!!!!!!!!!!!!!! + +#define COMP_HT BIT34 // For 802.11n HT related information. by Emily 2006-8-11 +#define COMP_POWER_TRACKING BIT35 //FOR 8190 TX POWER TRACKING +#define COMP_RX_REORDER BIT36 // 8190 Rx Reorder +#define COMP_AMSDU BIT37 // For A-MSDU Debugging +#define COMP_WPS BIT38 //WPS Debug Message +#define COMP_RATR BIT39 +#define COMP_RESET BIT40 +// For debug command to print on dbgview!! +#define COMP_CMD BIT41 +#define COMP_EFUSE BIT42 +#define COMP_MESH_INTERWORKING BIT43 +#define COMP_CCX BIT44 //CCX Debug Flag +#define COMP_IOCTL BIT45 // IO Control +#define COMP_GP BIT46 // For generic parser. +#define COMP_TXAGG BIT47 +#define COMP_HVL BIT48 // For Ndis 6.2 Context Swirch and Hardware Virtualiztion Layer +#define COMP_TEST BIT49 +#define COMP_BB_POWERSAVING BIT50 +#define COMP_SWAS BIT51 // For SW Antenna Switch +#define COMP_P2P BIT52 +#define COMP_MUX BIT53 +#define COMP_FUNC BIT54 +#define COMP_TDLS BIT55 +#define COMP_OMNIPEEK BIT56 +#define COMP_DUALMACSWITCH BIT60 // 2010/12/27 Add for Dual mac mode debug +#define COMP_EASY_CONCURRENT BIT61 // 2010/12/27 Add for easy cncurrent mode debug +#define COMP_PSD BIT63 //2011/3/9 Add for WLAN PSD for BT AFH + +#define COMP_DFS BIT62 + +#define COMP_ALL UINT64_C(0xFFFFFFFFFFFFFFFF) // All components +// For debug print flag to use +/*------------------------------Define structure----------------------------*/ +/* 2007/07/13 MH *//*------For DeBuG Print modeue------*/ + +/* Defnie structure to store different debug flag variable. Every debug flag + is a UINT32 integer and you can assign 32 different events. */ +typedef struct tag_DBGP_Debug_Flag_Structure +{ + u4Byte Mans; /* Main Scheduler module. */ + u4Byte Rtos; /* RTOS module. */ + u4Byte Alarm; /* Alarm module. */ + u4Byte Pm; /* Performance monitor module. */ +}DBGP_FLAG_T; + +/* Define debug print header for every service module.*/ +typedef struct tag_DBGP_Service_Module_Header_Name_Structure +{ + const char *pMANS; + const char *pRTOS; + const char *pALM; + const char *pPEM; + const char *pCMPK; + const char *pRAPD; + const char *pTXPB; + const char *pQUMG; +}DBGP_HEAD_T; + + +/* Define different debug flag for dedicated service modules in debug flag array. */ +// Each module has independt 32 bit debug flag you cnn define the flag as yout require. +typedef enum tag_DBGP_Flag_Type_Definition +{ + FQoS = 0, + FTX = 1, + FRX = 2, + FSEC = 3, + FMGNT = 4, + FMLME = 5, + FRESOURCE = 6, + FBEACON = 7, + FISR = 8, + FPHY = 9, + FMP = 10, + FEEPROM = 11, + FPWR = 12, + FDM = 13, + FDBG_CTRL = 14, + FC2H = 15, + FBT = 16, + FINIT = 17, + FIOCTL = 18, + FSHORT_CUT = 19, + DBGP_TYPE_MAX +}DBGP_FLAG_E; + + +// Define Qos Relative debug flag bit --> FQoS +#define QoS_INIT BIT0 +#define QoS_VISTA BIT1 + +// Define TX relative debug bit --> FTX +#define TX_DESC BIT0 +#define TX_DESC_TID BIT1 +#define TX_PATH BIT2 + +// Define RX relative debug bit --> FRX +#define RX_DATA BIT0 +#define RX_PHY_STS BIT1 +#define RX_PHY_SS BIT2 +#define RX_PHY_SQ BIT3 +#define RX_PHY_ASTS BIT4 +#define RX_ERR_LEN BIT5 +#define RX_DEFRAG BIT6 +#define RX_ERR_RATE BIT7 +#define RX_PATH BIT8 +#define RX_BEACON BIT9 + +// Define Security relative debug bit --> FSEC + +// Define MGNT relative debug bit --> FMGNT + +// Define MLME relative debug bit --> FMLME +#define MEDIA_STS BIT0 +#define LINK_STS BIT1 + +// Define OS resource check module bit --> FRESOURCE +#define OS_CHK BIT0 + +// Define beacon content check module bit --> FBEACON +#define BCN_SHOW BIT0 +#define BCN_PEER BIT1 + +// Define ISR/IMR check module bit --> FISR +#define ISR_CHK BIT0 + +// Define PHY-BB/RF/MAC check module bit --> FPHY +#define PHY_BBR BIT0 +#define PHY_BBW BIT1 +#define PHY_RFR BIT2 +#define PHY_RFW BIT3 +#define PHY_MACR BIT4 +#define PHY_MACW BIT5 +#define PHY_ALLR BIT6 +#define PHY_ALLW BIT7 +#define PHY_TXPWR BIT8 +#define PHY_PWRDIFF BIT9 +#define PHY_SICR BIT10 +#define PHY_SICW BIT11 + +// Define MPT driver check module bit --> FMP +#define MP_RX BIT0 +#define MP_SWICH_CH BIT1 + +// Define EEPROM and EFUSE check module bit --> FEEPROM +#define EEPROM_W BIT0 +#define EFUSE_PG BIT1 +#define EFUSE_READ_ALL BIT2 +#define EFUSE_ANALYSIS BIT3 +#define EFUSE_PG_DETAIL BIT4 + +// Define power save check module bit --> FPWR +#define LPS BIT0 +#define IPS BIT1 +#define PWRSW BIT2 +#define PWRHW BIT3 +#define PWRHAL BIT4 + +// Define Dynamic Mechanism check module bit --> FDM +#define WA_IOT BIT0 +#define DM_PWDB BIT1 +#define DM_Monitor BIT2 +#define DM_DIG BIT3 +#define DM_EDCA_Turbo BIT4 +#define DM_BT30 BIT5 + +// Define Dbg Control module bit --> FDBG_CTRL +#define DBG_CTRL_TRACE BIT0 +#define DBG_CTRL_INBAND_NOISE BIT1 + +// Define FW C2H Cmd check module bit --> FC2H +#define C2H_Summary BIT0 +#define C2H_PacketData BIT1 +#define C2H_ContentData BIT2 +// Define BT Cmd check module bit --> FBT +#define BT_TRACE BIT0 +#define BT_RFPoll BIT1 + +// Define init check for module bit --> FINIT +#define INIT_EEPROM BIT0 +#define INIT_TxPower BIT1 +#define INIT_IQK BIT2 +#define INIT_RF BIT3 + +// Define IOCTL Cmd check module bit --> FIOCTL +// section 1 : IRP related +#define IOCTL_IRP BIT0 +#define IOCTL_IRP_DETAIL BIT1 +#define IOCTL_IRP_STATISTICS BIT2 +#define IOCTL_IRP_HANDLE BIT3 +// section 2 : HCI command/event +#define IOCTL_BT_HCICMD BIT8 +#define IOCTL_BT_HCICMD_DETAIL BIT9 +#define IOCTL_BT_HCICMD_EXT BIT10 +#define IOCTL_BT_EVENT BIT11 +#define IOCTL_BT_EVENT_DETAIL BIT12 +#define IOCTL_BT_EVENT_PERIODICAL BIT13 +// section 3 : BT tx/rx data and throughput +#define IOCTL_BT_TX_ACLDATA BIT16 +#define IOCTL_BT_TX_ACLDATA_DETAIL BIT17 +#define IOCTL_BT_RX_ACLDATA BIT18 +#define IOCTL_BT_RX_ACLDATA_DETAIL BIT19 +#define IOCTL_BT_TP BIT20 +// section 4 : BT connection state machine. +#define IOCTL_STATE BIT21 +#define IOCTL_BT_LOGO BIT22 +// section 5 : BT function trace +#define IOCTL_CALLBACK_FUN BIT24 +#define IOCTL_PARSE_BT_PKT BIT25 +#define IOCTL_BT_TX_PKT BIT26 +#define IOCTL_BT_FLAG_MON BIT27 + +// +// Define init check for module bit --> FSHORT_CUT +// 2011/07/20 MH Add for short but definition. +// +#define SHCUT_TX BIT0 +#define SHCUT_RX BIT1 + + +/* 2007/07/13 MH *//*------For DeBuG Print modeue------*/ +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export Marco Definition---------------------------*/ +#if (DM_ODM_SUPPORT_TYPE != ODM_WIN) +#define RT_PRINTK(fmt, args...) printk( "%s(): " fmt, __FUNCTION__, ## args); + +#if DBG +#define ODM_RT_TRACE(pDM_Odm,comp, level, fmt) \ + if(((comp) & GlobalDebugComponents) && (level <= GlobalDebugLevel)) \ + { \ + RT_PRINTK fmt; \ + } + +#define RT_TRACE_F(comp, level, fmt) \ + if(((comp) & GlobalDebugComponents) && (level <= GlobalDebugLevel)) \ + { \ + RT_PRINTK fmt; \ + } + +#define RT_ASSERT(expr,fmt) \ + if(!(expr)) { \ + printk( "Assertion failed! %s at ......\n", #expr); \ + printk( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \ + } +#define dbg_enter() { printk("==> %s\n", __FUNCTION__); } +#define dbg_exit() { printk("<== %s\n", __FUNCTION__); } +#define dbg_trace(str) { printk("%s:%s\n", __FUNCTION__, str); } +#else +#define ODM_RT_TRACE(pDM_Odm,comp, level, fmt) +#define RT_TRACE_F(comp, level, fmt) +#define RT_ASSERT(expr, fmt) +#define dbg_enter() +#define dbg_exit() +#define dbg_trace(str) +#endif + +#if DBG +#define DbgPrint printk + +#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) \ + { \ + char *szTitle = _TitleString; \ + pu1Byte pbtHexData = _HexData; \ + u4Byte u4bHexDataLen = _HexDataLen; \ + u4Byte __i; \ + DbgPrint("%s", szTitle); \ + for (__i=0;__i=' ' &&_ch<='~' ) // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22. + +#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) \ + if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) \ + { \ + int __i; \ + u1Byte buffer[MAX_STR_LEN]; \ + int length = (_Len\n", _Len, buffer); \ + } + +#else // of #if DBG +#define DbgPrint(...) +#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) +#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) +#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr) +#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum) +#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) +#endif // of #if DBG + + + +#endif // #if (DM_ODM_SUPPORT_TYPE != ODM_WIN) + +#define DEBUG_PRINT 1 + +// Please add new OS's print API by yourself + +//#if (RT_PLATFORM==PLATFORM_WINDOWS) +#if (DEBUG_PRINT == 1) && DBG +#define RT_DISP(dbgtype, dbgflag, printstr)\ +{\ + if (DBGP_Type[dbgtype] & dbgflag)\ + {\ + DbgPrint printstr;\ + }\ +} + +#define RT_DISP_ADDR(dbgtype, dbgflag, printstr, _Ptr)\ +{\ + if (DBGP_Type[dbgtype] & dbgflag)\ + {\ + int __i; \ + pu1Byte ptr = (pu1Byte)_Ptr; \ + DbgPrint printstr; \ + DbgPrint(" "); \ + for( __i=0; __i<6; __i++ ) \ + DbgPrint("%02X%s", ptr[__i], (__i==5)?"":"-"); \ + DbgPrint("\n"); \ + }\ +} + +#define RT_DISP_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)\ +{\ + if (DBGP_Type[dbgtype] & dbgflag)\ + {\ + int __i; \ + pu1Byte ptr = (pu1Byte)_HexData; \ + DbgPrint(_TitleString); \ + for( __i=0; __i<(int)_HexDataLen; __i++ ) \ + { \ + DbgPrint("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?" ":" ");\ + if (((__i + 1) % 16) == 0) DbgPrint("\n");\ + } \ + DbgPrint("\n"); \ + }\ +} + +#define FunctionIn(_comp) ODM_RT_TRACE(pDM_Odm,(_comp), DBG_LOUD, ("==========> %s\n", __FUNCTION__)) +#define FunctionOut(_comp) ODM_RT_TRACE(pDM_Odm,(_comp), DBG_LOUD, ("<========== %s\n", __FUNCTION__)) + + +#else + +#define RT_DISP(dbgtype, dbgflag, printstr) +#define RT_DISP_ADDR(dbgtype, dbgflag, printstr, _Ptr) +#define RT_DISP_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen) + +#define FunctionIn(_comp) +#define FunctionOut(_comp) +#endif +/*------------------------Export Marco Definition---------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +extern u4Byte DBGP_Type[DBGP_TYPE_MAX]; +extern DBGP_HEAD_T DBGP_Head; + +/*------------------------Export global variable----------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ +extern void DBGP_Flag_Init(void); +extern void DBG_PrintAllFlag(void); +extern void DBG_PrintAllComp(void); +extern void DBG_PrintFlagEvent(u1Byte DbgFlag); +extern void DBG_DumpMem(const u1Byte DbgComp, + const u1Byte DbgLevel, + pu1Byte pMem, + u2Byte Len); + +/*--------------------------Exported Function prototype---------------------*/ + + + + + + + + + +extern u4Byte GlobalDebugLevel; +extern u8Byte GlobalDebugComponents; + + +#endif + + +#endif // __ODM_DBG_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_interface.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_interface.h new file mode 100644 index 0000000..d5732ba --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_interface.h @@ -0,0 +1,413 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __ODM_INTERFACE_H__ +#define __ODM_INTERFACE_H__ + + + +// +// =========== Constant/Structure/Enum/... Define +// + + + +// +// =========== Macro Define +// + +#define _reg_all(_name) ODM_##_name +#define _reg_ic(_name, _ic) ODM_##_name##_ic +#define _bit_all(_name) BIT_##_name +#define _bit_ic(_name, _ic) BIT_##_name##_ic + +// _cat: implemented by Token-Pasting Operator. +#if 0 +#define _cat(_name, _ic_type, _func) \ + ( \ + _func##_all(_name) \ + ) +#endif + +/*=================================== + +#define ODM_REG_DIG_11N 0xC50 +#define ODM_REG_DIG_11AC 0xDDD + +ODM_REG(DIG,_pDM_Odm) +=====================================*/ + +#define _reg_11N(_name) ODM_REG_##_name##_11N +#define _reg_11AC(_name) ODM_REG_##_name##_11AC +#define _bit_11N(_name) ODM_BIT_##_name##_11N +#define _bit_11AC(_name) ODM_BIT_##_name##_11AC + +#ifdef __ECOS +#define _rtk_cat(_name, _ic_type, _func) \ + ( \ + ((_ic_type) & ODM_IC_11N_SERIES)? _func##_11N(_name): \ + _func##_11AC(_name) \ + ) +#else + +#define _cat(_name, _ic_type, _func) \ + ( \ + ((_ic_type) & ODM_IC_11N_SERIES)? _func##_11N(_name): \ + _func##_11AC(_name) \ + ) +#endif +/* +// only sample code +//#define _cat(_name, _ic_type, _func) \ +// ( \ +// ((_ic_type) & ODM_RTL8192C)? _func##_ic(_name, _8192C): \ +// ((_ic_type) & ODM_RTL8192D)? _func##_ic(_name, _8192D): \ +// ((_ic_type) & ODM_RTL8192S)? _func##_ic(_name, _8192S): \ +// ((_ic_type) & ODM_RTL8723A)? _func##_ic(_name, _8723A): \ +// ((_ic_type) & ODM_RTL8188E)? _func##_ic(_name, _8188E): \ +// _func##_ic(_name, _8195) \ +// ) +*/ + +// _name: name of register or bit. +// Example: "ODM_REG(R_A_AGC_CORE1, pDM_Odm)" +// gets "ODM_R_A_AGC_CORE1" or "ODM_R_A_AGC_CORE1_8192C", depends on SupportICType. +#ifdef __ECOS +#define ODM_REG(_name, _pDM_Odm) _rtk_cat(_name, _pDM_Odm->SupportICType, _reg) +#define ODM_BIT(_name, _pDM_Odm) _rtk_cat(_name, _pDM_Odm->SupportICType, _bit) +#else +#define ODM_REG(_name, _pDM_Odm) _cat(_name, _pDM_Odm->SupportICType, _reg) +#define ODM_BIT(_name, _pDM_Odm) _cat(_name, _pDM_Odm->SupportICType, _bit) +#endif +typedef enum _ODM_H2C_CMD +{ + /*ODM_H2C_RSSI_REPORT = 0, + ODM_H2C_PSD_RESULT=1, + ODM_H2C_PathDiv = 2, + ODM_H2C_WIFI_CALIBRATION = 3, + ODM_H2C_IQ_CALIBRATION = 4, + ODM_H2C_RA_PARA_ADJUST=5, + ODM_MAX_H2CCMD*/ + PHYDM_H2C_TXBF = 0x41, + ODM_H2C_RSSI_REPORT = 0x42, + ODM_H2C_IQ_CALIBRATION = 0x45, + ODM_H2C_RA_PARA_ADJUST = 0x47, + PHYDM_H2C_DYNAMIC_TX_PATH = 0x48, + PHYDM_H2C_FW_TRACE_EN = 0x49, + ODM_H2C_WIFI_CALIBRATION = 0x6d, + PHYDM_H2C_MU = 0x4a, + ODM_MAX_H2CCMD +}ODM_H2C_CMD; + + +// +// 2012/02/17 MH For non-MP compile pass only. Linux does not support workitem. +// Suggest HW team to use thread instead of workitem. Windows also support the feature. +// +#if (DM_ODM_SUPPORT_TYPE != ODM_WIN) +typedef void *PRT_WORK_ITEM ; +typedef void RT_WORKITEM_HANDLE,*PRT_WORKITEM_HANDLE; +typedef VOID (*RT_WORKITEM_CALL_BACK)(PVOID pContext); + +#if 0 +typedef struct tasklet_struct RT_WORKITEM_HANDLE, *PRT_WORKITEM_HANDLE; + +typedef struct _RT_WORK_ITEM +{ + + RT_WORKITEM_HANDLE Handle; // Platform-dependent handle for this workitem, e.g. Ndis Workitem object. + PVOID Adapter; // Pointer to Adapter object. + PVOID pContext; // Parameter to passed to CallBackFunc(). + RT_WORKITEM_CALL_BACK CallbackFunc; // Callback function of the workitem. + u1Byte RefCount; // 0: driver is going to unload, 1: No such workitem scheduled, 2: one workitem is schedueled. + PVOID pPlatformExt; // Pointer to platform-dependent extension. + BOOLEAN bFree; + char szID[36]; // An identity string of this workitem. +}RT_WORK_ITEM, *PRT_WORK_ITEM; + +#endif + + +#endif + +// +// =========== Extern Variable ??? It should be forbidden. +// + + +// +// =========== EXtern Function Prototype +// + + +u1Byte +ODM_Read1Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ); + +u2Byte +ODM_Read2Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ); + +u4Byte +ODM_Read4Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ); + +VOID +ODM_Write1Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u1Byte Data + ); + +VOID +ODM_Write2Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u2Byte Data + ); + +VOID +ODM_Write4Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte Data + ); + +VOID +ODM_SetMACReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ); + +u4Byte +ODM_GetMACReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask + ); + +VOID +ODM_SetBBReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ); + +u4Byte +ODM_GetBBReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask + ); + +VOID +ODM_SetRFReg( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E eRFPath, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ); + +u4Byte +ODM_GetRFReg( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E eRFPath, + IN u4Byte RegAddr, + IN u4Byte BitMask + ); + + +// +// Memory Relative Function. +// +VOID +ODM_AllocateMemory( + IN PDM_ODM_T pDM_Odm, + OUT PVOID *pPtr, + IN u4Byte length + ); +VOID +ODM_FreeMemory( + IN PDM_ODM_T pDM_Odm, + OUT PVOID pPtr, + IN u4Byte length + ); + +VOID +ODM_MoveMemory( + IN PDM_ODM_T pDM_Odm, + OUT PVOID pDest, + IN PVOID pSrc, + IN u4Byte Length + ); + +s4Byte ODM_CompareMemory( + IN PDM_ODM_T pDM_Odm, + IN PVOID pBuf1, + IN PVOID pBuf2, + IN u4Byte length + ); + +void ODM_Memory_Set + (IN PDM_ODM_T pDM_Odm, + IN PVOID pbuf, + IN s1Byte value, + IN u4Byte length); + +// +// ODM MISC-spin lock relative API. +// +#if( DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL|ODM_CE)) +VOID +ODM_AcquireSpinLock( + IN PDM_ODM_T pDM_Odm, + IN RT_SPINLOCK_TYPE type + ); + +VOID +ODM_ReleaseSpinLock( + IN PDM_ODM_T pDM_Odm, + IN RT_SPINLOCK_TYPE type + ); +#endif + +// +// ODM MISC-workitem relative API. +// +VOID +ODM_InitializeWorkItem( + IN PDM_ODM_T pDM_Odm, + IN PRT_WORK_ITEM pRtWorkItem, + IN RT_WORKITEM_CALL_BACK RtWorkItemCallback, + IN PVOID pContext, + IN const char* szID + ); + +VOID +ODM_StartWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ); + +VOID +ODM_StopWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ); + +VOID +ODM_FreeWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ); + +VOID +ODM_ScheduleWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ); + +VOID +ODM_IsWorkItemScheduled( + IN PRT_WORK_ITEM pRtWorkItem + ); + +// +// ODM Timer relative API. +// +VOID +ODM_StallExecution( + IN u4Byte usDelay + ); + +VOID +ODM_delay_ms(IN u4Byte ms); + + + +VOID +ODM_delay_us(IN u4Byte us); + +VOID +ODM_sleep_ms(IN u4Byte ms); + +VOID +ODM_sleep_us(IN u4Byte us); + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL)) +VOID +ODM_SetTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer, + IN u4Byte msDelay + ); + +VOID +ODM_InitializeTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer, + IN RT_TIMER_CALL_BACK CallBackFunc, + IN PVOID pContext, + IN const char* szID + ); + +VOID +ODM_CancelTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer + ); + +VOID +ODM_ReleaseTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer + ); +#endif + +// +// ODM FW relative API. +// +VOID +ODM_FillH2CCmd( + IN PDM_ODM_T pDM_Odm, + IN u1Byte ElementID, + IN u4Byte CmdLen, + IN pu1Byte pCmdBuffer +); + +u8Byte +ODM_GetCurrentTime( + IN PDM_ODM_T pDM_Odm + ); +u8Byte +ODM_GetProgressingTime( + IN PDM_ODM_T pDM_Odm, + IN u8Byte Start_Time + ); + +#endif // __ODM_INTERFACE_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_precomp.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_precomp.h new file mode 100644 index 0000000..84e0bf4 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_precomp.h @@ -0,0 +1,349 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __ODM_PRECOMP_H__ +#define __ODM_PRECOMP_H__ + +#include "phydm_types.h" + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#include "Precomp.h" // We need to include mp_precomp.h due to batch file setting. + +#else + +#define TEST_FALG___ 1 + +#endif + +//2 Config Flags and Structs - defined by each ODM Type + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) + #include "../8192cd_cfg.h" + #include "../odm_inc.h" + + #include "../8192cd.h" + #include "../8192cd_util.h" + #ifdef _BIG_ENDIAN_ + #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG + #else + #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE + #endif + + #ifdef AP_BUILD_WORKAROUND + #include "../8192cd_headers.h" + #include "../8192cd_debug.h" + #endif + +#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) + // Flags + #include "../8192cd_cfg.h" // OUTSRC needs ADSL config flags. + #include "../odm_inc.h" // OUTSRC needs some extra flags. + // Data Structure + #include "../common_types.h" // OUTSRC and rtl8192cd both needs basic type such as UINT8 and BIT0. + #include "../8192cd.h" // OUTSRC needs basic ADSL struct definition. + #include "../8192cd_util.h" // OUTSRC needs basic I/O function. + #ifdef _BIG_ENDIAN_ + #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG + #else + #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE + #endif + + #ifdef ADSL_AP_BUILD_WORKAROUND + // NESTED_INC: Functions defined outside should not be included!! Marked by Annie, 2011-10-14. + #include "../8192cd_headers.h" + #include "../8192cd_debug.h" + #endif + +#elif (DM_ODM_SUPPORT_TYPE ==ODM_CE) +#define BEAMFORMING_SUPPORT 0 +#elif (DM_ODM_SUPPORT_TYPE ==ODM_IOT) +#define BEAMFORMING_SUPPORT 0 +#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #include "mp_precomp.h" + #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE +#endif + + +//2 Hardware Parameter Files + + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) +#if (RTL8192C_SUPPORT==1) + #include "rtl8192c/Hal8192CEFWImg_AP.h" + #include "rtl8192c/Hal8192CEPHYImg_AP.h" + #include "rtl8192c/Hal8192CEMACImg_AP.h" +#endif +#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) + #include "rtl8192c/Hal8192CEFWImg_ADSL.h" + #include "rtl8192c/Hal8192CEPHYImg_ADSL.h" + #include "rtl8192c/Hal8192CEMACImg_ADSL.h" + +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + #if(RTL8192CE_SUPPORT ==1) + #include "rtl8192c/Hal8192CEFWImg_CE.h" + #include "rtl8192c/Hal8192CEPHYImg_CE.h" + #include "rtl8192c/Hal8192CEMACImg_CE.h" + #endif + + #if(RTL8192CU_SUPPORT ==1) + #include "rtl8192c/Hal8192CUFWImg_CE.h" + #include "rtl8192c/Hal8192CUPHYImg_CE.h" + #include "rtl8192c/Hal8192CUMACImg_CE.h" + #endif + + #if(RTL8192DE_SUPPORT ==1) + #include "rtl8192d/Hal8192DEFWImg_CE.h" + #include "rtl8192d/Hal8192DEPHYImg_CE.h" + #include "rtl8192d/Hal8192DEMACImg_CE.h" + #endif + + #if(RTL8192DU_SUPPORT ==1) + #include "rtl8192d/Hal8192DUFWImg_CE.h" + #include "rtl8192d/Hal8192DUPHYImg_CE.h" + #include "rtl8192d/Hal8192DUMACImg_CE.h" + #endif + + #if(RTL8723AS_SUPPORT==1) + #include "rtl8723a/Hal8723SHWImg_CE.h" + #endif + + #if(RTL8723AU_SUPPORT==1) + #include "rtl8723a/Hal8723UHWImg_CE.h" + #endif + +#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) + +#endif + + +//2 OutSrc Header Files +#if (RTL8188E_SUPPORT==1) +// Old ODM +#include "rtl8188e\odm.h" +#include "rtl8188e\odm_HWConfig.h" +#include "rtl8188e\odm_debug.h" +#include "rtl8188e\odm_RegDefine11AC.h" +#include "rtl8188e\odm_RegDefine11N.h" +#include "rtl8188e\odm_interface.h" +#include "rtl8188e\odm_reg.h" +#include "rtl8188e\Hal8188EAdaptivity.h" +#else +// new ODM +#include "phydm.h" +#include "phydm_HWConfig.h" +#include "phydm_debug.h" +#include "phydm_RegDefine11AC.h" +#include "phydm_RegDefine11N.h" +#include "phydm_AntDiv.h" +#include "phydm_EdcaTurboCheck.h" +#include "phydm_DIG.h" +#include "PhyDM_Adaptivity.h" +#include "phydm_PathDiv.h" +#include "phydm_RaInfo.h" +#include "phydm_DynamicBBPowerSaving.h" +#include "phydm_DynamicTxPower.h" +#include "phydm_CfoTracking.h" +#include "phydm_NoiseMonitor.h" +#include "phydm_interface.h" +#include "phydm_reg.h" +#endif + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) +#if (RTL8192C_SUPPORT==1) + #include "rtl8192c/HalDMOutSrc8192C_AP.h" +#endif +#if (RTL8188E_SUPPORT==1) + #include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training +#endif + +#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) + #include "rtl8192c/HalDMOutSrc8192C_ADSL.h" + +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + //#include "hal_com.h" + #include "HalPhyRf.h" + #if (RTL8192C_SUPPORT==1) + #ifdef CONFIG_INTEL_PROXIM + #include "../proxim/intel_proxim.h" + #endif + #include "rtl8192c/HalDMOutSrc8192C_CE.h" + #include + #endif + + #if (RTL8192D_SUPPORT==1) + #include "rtl8192d/HalDMOutSrc8192D_CE.h" + #include "rtl8192d_hal.h" + #endif + + #if (RTL8723A_SUPPORT==1) + #include "rtl8192c/HalDMOutSrc8192C_CE.h" //for IQK,LCK,Power-tracking + #include "../rtl8723a/rtl8723a_hal.h" + #endif + + #if (RTL8188E_SUPPORT==1) + #include "rtl8188e/HalPhyRf_8188e.h"//for IQK,LCK,Power-tracking + #include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training + #include "../rtl8188e/rtl8188e_hal.h" + #endif + + #if (RTL8192E_SUPPORT==1) + #include "rtl8192e/HalPhyRf_8192e.h"//for IQK,LCK,Power-tracking + #include "rtl8192e_hal.h" + #endif + + #if (RTL8812A_SUPPORT==1) + #include "rtl8812a/HalPhyRf_8812A.h"//for IQK,LCK,Power-tracking + #include "rtl8812a_hal.h" + #endif + + #if (RTL8821A_SUPPORT==1) + #include "rtl8821a/HalPhyRf_8821A.h"//for IQK,LCK,Power-tracking + #include "rtl8812a/HalPhyRf_8812A.h"//for IQK,LCK,Power-tracking + #include "rtl8812a_hal.h" + #endif + + #if (RTL8723B_SUPPORT==1) + #include "rtl8723b/HalPhyRf_8723B.h"//for IQK,LCK,Power-tracking + #include "rtl8723b_hal.h" + #endif + +#elif (DM_ODM_SUPPORT_TYPE == ODM_IOT) + #include "HalPhyRf.h" + #if (RTL8195A_SUPPORT==1) + #include "rtl8195a/HalPhyRf_8195A.h"//for IQK,LCK,Power-tracking + #include "rtl8195a_hal.h" + #endif + + #if (RTL8711B_SUPPORT==1) + #include "rtl8711b/HalPhyRf_8711b.h"//for IQK,LCK,Power-tracking + #include "rtl8711b_hal.h" + #endif +#endif + + +#if (RTL8192C_SUPPORT==1) +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) +#include "rtl8192c/Hal8192CHWImg_MAC.h" +#include "rtl8192c/Hal8192CHWImg_RF.h" +#include "rtl8192c/Hal8192CHWImg_BB.h" +#include "rtl8192c/Hal8192CHWImg_FW.h" +#endif +#include "rtl8192c/phydm_RTL8192C.h" +#endif +#if (RTL8192D_SUPPORT==1) +#include "rtl8192d/phydm_RTL8192D.h" +#endif + +#if (RTL8723A_SUPPORT==1) +#include "rtl8723a/HalHWImg8723A_MAC.h" +#include "rtl8723a/HalHWImg8723A_RF.h" +#include "rtl8723a/HalHWImg8723A_BB.h" +#include "rtl8723a/HalHWImg8723A_FW.h" +#include "rtl8723a/phydm_RegConfig8723A.h" +#endif + +#if (RTL8188E_SUPPORT==1) +#include "rtl8188e/HalHWImg8188E_MAC.h" +#include "rtl8188e/HalHWImg8188E_RF.h" +#include "rtl8188e/HalHWImg8188E_BB.h" +#include "rtl8188e/HalHWImg8188E_FW.h" +#include "rtl8188e/Hal8188EReg.h" + +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) +#include "rtl8188e/HalPhyRf_8188e.h" +#endif + +#if (TEST_CHIP_SUPPORT == 1) +#include "rtl8188e/HalHWImg8188E_TestChip_MAC.h" +#include "rtl8188e/HalHWImg8188E_TestChip_RF.h" +#include "rtl8188e/HalHWImg8188E_TestChip_BB.h" +#endif + + +#include "rtl8188e/odm_RegConfig8188E.h" +#include "rtl8188e/odm_RTL8188E.h" +#endif + +#if (RTL8192E_SUPPORT==1) +#include "rtl8192e/HalHWImg8192E_MAC.h" +#include "rtl8192e/HalHWImg8192E_RF.h" +#include "rtl8192e/HalHWImg8192E_BB.h" +#include "rtl8192e/HalHWImg8192E_FW.h" +#include "rtl8192e/Hal8192EReg.h" +#include "rtl8192e/phydm_RegConfig8192E.h" +#include "rtl8192e/phydm_RTL8192E.h" +#endif + +#if (RTL8723B_SUPPORT==1) +#include "rtl8723b/HalHWImg8723B_MAC.h" +#include "rtl8723b/HalHWImg8723B_RF.h" +#include "rtl8723b/HalHWImg8723B_BB.h" +#include "rtl8723b/HalHWImg8723B_FW.h" +#include "rtl8723b/HalHWImg8723B_MP.h" +#include "rtl8723b/Hal8723BReg.h" +#include "rtl8723b/phydm_RTL8723B.h" +#include "rtl8723b/phydm_RegConfig8723B.h" +#endif + +#if (RTL8812A_SUPPORT==1) +#include "rtl8812a/HalHWImg8812A_MAC.h" +#include "rtl8812a/HalHWImg8812A_RF.h" +#include "rtl8812a/HalHWImg8812A_BB.h" +#include "rtl8812a/HalHWImg8812A_FW.h" +#include "rtl8812a/phydm_RegConfig8812A.h" +#include "rtl8812a/phydm_RTL8812A.h" +#endif + + +#if (RTL8821A_SUPPORT==1) +#include "rtl8821a/HalHWImg8821A_MAC.h" +#include "rtl8821a/HalHWImg8821A_RF.h" +#include "rtl8821a/HalHWImg8821A_BB.h" +#include "rtl8821a/HalHWImg8821A_FW.h" +#include "rtl8821a/phydm_RegConfig8821A.h" +#include "rtl8821a/phydm_RTL8821A.h" +#endif + +#if (RTL8195A_SUPPORT==1) +#include "rtl8195a/halhwimg8195a_mac.h" +#include "rtl8195a/halhwimg8195a_rf.h" +#include "rtl8195a/halhwimg8195a_bb.h" +#include "rtl8195a/Hal8195AReg.h" +#include "rtl8195a/phydm_RTL8195A.h" +#include "rtl8195a/phydm_RegConfig8195A.h" +#include "rtl8195a/ROM_RTL8195A_PHYDM.h" +#include "rtl8195a/Hal8195ARateAdaptive.h" +#endif + +#if (RTL8711B_SUPPORT==1) +#include "rtl8711b/HalHWImg8711B_MAC.h" +#include "rtl8711b/HalHWImg8711B_RF.h" +#include "rtl8711b/HalHWImg8711B_BB.h" +#include "rtl8711b/HalHWImg8711B_FW.h" +#include "rtl8711b/HalHWImg8711B_MP.h" +#include "rtl8711b/Hal8711BReg.h" +#include "rtl8711b/phydm_RTL8711B.h" +#include "rtl8711b/phydm_RegConfig8711B.h" +#include "rtl8711b/ROM_RTL8711B_PHYDM.h" +#include "rtl8711b/Hal8711BRateAdaptive.h" +#endif + +#endif // __ODM_PRECOMP_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_reg.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_reg.h new file mode 100644 index 0000000..e842413 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_reg.h @@ -0,0 +1,208 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +//============================================================ +// File Name: odm_reg.h +// +// Description: +// +// This file is for general register definition. +// +// +//============================================================ +#ifndef __HAL_ODM_REG_H__ +#define __HAL_ODM_REG_H__ + +// +// Register Definition +// + +//MAC REG +#define ODM_BB_RESET 0x002 +#define ODM_DUMMY 0x4fe +#define RF_T_METER_OLD 0x24 +#define RF_T_METER_NEW 0x42 + +#define ODM_EDCA_VO_PARAM 0x500 +#define ODM_EDCA_VI_PARAM 0x504 +#define ODM_EDCA_BE_PARAM 0x508 +#define ODM_EDCA_BK_PARAM 0x50C +#define ODM_TXPAUSE 0x522 + +//BB REG +#define ODM_FPGA_PHY0_PAGE8 0x800 +#define ODM_PSD_SETTING 0x808 +#define ODM_AFE_SETTING 0x818 +#define ODM_TXAGC_B_6_18 0x830 +#define ODM_TXAGC_B_24_54 0x834 +#define ODM_TXAGC_B_MCS32_5 0x838 +#define ODM_TXAGC_B_MCS0_MCS3 0x83c +#define ODM_TXAGC_B_MCS4_MCS7 0x848 +#define ODM_TXAGC_B_MCS8_MCS11 0x84c +#define ODM_ANALOG_REGISTER 0x85c +#define ODM_RF_INTERFACE_OUTPUT 0x860 +#define ODM_TXAGC_B_MCS12_MCS15 0x868 +#define ODM_TXAGC_B_11_A_2_11 0x86c +#define ODM_AD_DA_LSB_MASK 0x874 +#define ODM_ENABLE_3_WIRE 0x88c +#define ODM_PSD_REPORT 0x8b4 +#define ODM_R_ANT_SELECT 0x90c +#define ODM_CCK_ANT_SELECT 0xa07 +#define ODM_CCK_PD_THRESH 0xa0a +#define ODM_CCK_RF_REG1 0xa11 +#define ODM_CCK_MATCH_FILTER 0xa20 +#define ODM_CCK_RAKE_MAC 0xa2e +#define ODM_CCK_CNT_RESET 0xa2d +#define ODM_CCK_TX_DIVERSITY 0xa2f +#define ODM_CCK_FA_CNT_MSB 0xa5b +#define ODM_CCK_FA_CNT_LSB 0xa5c +#define ODM_CCK_NEW_FUNCTION 0xa75 +#define ODM_OFDM_PHY0_PAGE_C 0xc00 +#define ODM_OFDM_RX_ANT 0xc04 +#define ODM_R_A_RXIQI 0xc14 +#define ODM_R_A_AGC_CORE1 0xc50 +#define ODM_R_A_AGC_CORE2 0xc54 +#define ODM_R_B_AGC_CORE1 0xc58 +#define ODM_R_AGC_PAR 0xc70 +#define ODM_R_HTSTF_AGC_PAR 0xc7c +#define ODM_TX_PWR_TRAINING_A 0xc90 +#define ODM_TX_PWR_TRAINING_B 0xc98 +#define ODM_OFDM_FA_CNT1 0xcf0 +#define ODM_OFDM_PHY0_PAGE_D 0xd00 +#define ODM_OFDM_FA_CNT2 0xda0 +#define ODM_OFDM_FA_CNT3 0xda4 +#define ODM_OFDM_FA_CNT4 0xda8 +#define ODM_TXAGC_A_6_18 0xe00 +#define ODM_TXAGC_A_24_54 0xe04 +#define ODM_TXAGC_A_1_MCS32 0xe08 +#define ODM_TXAGC_A_MCS0_MCS3 0xe10 +#define ODM_TXAGC_A_MCS4_MCS7 0xe14 +#define ODM_TXAGC_A_MCS8_MCS11 0xe18 +#define ODM_TXAGC_A_MCS12_MCS15 0xe1c + +//RF REG +#define ODM_GAIN_SETTING 0x00 +#define ODM_CHANNEL 0x18 +#define ODM_RF_T_METER 0x24 +#define ODM_RF_T_METER_92D 0x42 +#define ODM_RF_T_METER_88E 0x42 +#define ODM_RF_T_METER_92E 0x42 +#define ODM_RF_T_METER_8812 0x42 + +//Ant Detect Reg +#define ODM_DPDT 0x300 + +//PSD Init +#define ODM_PSDREG 0x808 + +//92D Path Div +#define PATHDIV_REG 0xB30 +#define PATHDIV_TRI 0xBA0 + + +// +// Bitmap Definition +// +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP)) +// TX AGC +#define rTxAGC_A_CCK11_CCK1_JAguar 0xc20 +#define rTxAGC_A_Ofdm18_Ofdm6_JAguar 0xc24 +#define rTxAGC_A_Ofdm54_Ofdm24_JAguar 0xc28 +#define rTxAGC_A_MCS3_MCS0_JAguar 0xc2c +#define rTxAGC_A_MCS7_MCS4_JAguar 0xc30 +#define rTxAGC_A_MCS11_MCS8_JAguar 0xc34 +#define rTxAGC_A_MCS15_MCS12_JAguar 0xc38 +#define rTxAGC_A_Nss1Index3_Nss1Index0_JAguar 0xc3c +#define rTxAGC_A_Nss1Index7_Nss1Index4_JAguar 0xc40 +#define rTxAGC_A_Nss2Index1_Nss1Index8_JAguar 0xc44 +#define rTxAGC_A_Nss2Index5_Nss2Index2_JAguar 0xc48 +#define rTxAGC_A_Nss2Index9_Nss2Index6_JAguar 0xc4c +#if defined(CONFIG_WLAN_HAL_8814AE) +#define rTxAGC_A_MCS19_MCS16_JAguar 0xcd8 +#define rTxAGC_A_MCS23_MCS20_JAguar 0xcdc +#define rTxAGC_A_Nss3Index3_Nss3Index0_JAguar 0xce0 +#define rTxAGC_A_Nss3Index7_Nss3Index4_JAguar 0xce4 +#define rTxAGC_A_Nss3Index9_Nss3Index8_JAguar 0xce8 +#endif +#define rTxAGC_B_CCK11_CCK1_JAguar 0xe20 +#define rTxAGC_B_Ofdm18_Ofdm6_JAguar 0xe24 +#define rTxAGC_B_Ofdm54_Ofdm24_JAguar 0xe28 +#define rTxAGC_B_MCS3_MCS0_JAguar 0xe2c +#define rTxAGC_B_MCS7_MCS4_JAguar 0xe30 +#define rTxAGC_B_MCS11_MCS8_JAguar 0xe34 +#define rTxAGC_B_MCS15_MCS12_JAguar 0xe38 +#define rTxAGC_B_Nss1Index3_Nss1Index0_JAguar 0xe3c +#define rTxAGC_B_Nss1Index7_Nss1Index4_JAguar 0xe40 +#define rTxAGC_B_Nss2Index1_Nss1Index8_JAguar 0xe44 +#define rTxAGC_B_Nss2Index5_Nss2Index2_JAguar 0xe48 +#define rTxAGC_B_Nss2Index9_Nss2Index6_JAguar 0xe4c +#if defined(CONFIG_WLAN_HAL_8814AE) +#define rTxAGC_B_MCS19_MCS16_JAguar 0xed8 +#define rTxAGC_B_MCS23_MCS20_JAguar 0xedc +#define rTxAGC_B_Nss3Index3_Nss3Index0_JAguar 0xee0 +#define rTxAGC_B_Nss3Index7_Nss3Index4_JAguar 0xee4 +#define rTxAGC_B_Nss3Index9_Nss3Index8_JAguar 0xee8 +#define rTxAGC_C_CCK11_CCK1_JAguar 0x1820 +#define rTxAGC_C_Ofdm18_Ofdm6_JAguar 0x1824 +#define rTxAGC_C_Ofdm54_Ofdm24_JAguar 0x1828 +#define rTxAGC_C_MCS3_MCS0_JAguar 0x182c +#define rTxAGC_C_MCS7_MCS4_JAguar 0x1830 +#define rTxAGC_C_MCS11_MCS8_JAguar 0x1834 +#define rTxAGC_C_MCS15_MCS12_JAguar 0x1838 +#define rTxAGC_C_Nss1Index3_Nss1Index0_JAguar 0x183c +#define rTxAGC_C_Nss1Index7_Nss1Index4_JAguar 0x1840 +#define rTxAGC_C_Nss2Index1_Nss1Index8_JAguar 0x1844 +#define rTxAGC_C_Nss2Index5_Nss2Index2_JAguar 0x1848 +#define rTxAGC_C_Nss2Index9_Nss2Index6_JAguar 0x184c +#define rTxAGC_C_MCS19_MCS16_JAguar 0x18d8 +#define rTxAGC_C_MCS23_MCS20_JAguar 0x18dc +#define rTxAGC_C_Nss3Index3_Nss3Index0_JAguar 0x18e0 +#define rTxAGC_C_Nss3Index7_Nss3Index4_JAguar 0x18e4 +#define rTxAGC_C_Nss3Index9_Nss3Index8_JAguar 0x18e8 +#define rTxAGC_D_CCK11_CCK1_JAguar 0x1a20 +#define rTxAGC_D_Ofdm18_Ofdm6_JAguar 0x1a24 +#define rTxAGC_D_Ofdm54_Ofdm24_JAguar 0x1a28 +#define rTxAGC_D_MCS3_MCS0_JAguar 0x1a2c +#define rTxAGC_D_MCS7_MCS4_JAguar 0x1a30 +#define rTxAGC_D_MCS11_MCS8_JAguar 0x1a34 +#define rTxAGC_D_MCS15_MCS12_JAguar 0x1a38 +#define rTxAGC_D_Nss1Index3_Nss1Index0_JAguar 0x1a3c +#define rTxAGC_D_Nss1Index7_Nss1Index4_JAguar 0x1a40 +#define rTxAGC_D_Nss2Index1_Nss1Index8_JAguar 0x1a44 +#define rTxAGC_D_Nss2Index5_Nss2Index2_JAguar 0x1a48 +#define rTxAGC_D_Nss2Index9_Nss2Index6_JAguar 0x1a4c +#define rTxAGC_D_MCS19_MCS16_JAguar 0x1ad8 +#define rTxAGC_D_MCS23_MCS20_JAguar 0x1adc +#define rTxAGC_D_Nss3Index3_Nss3Index0_JAguar 0x1ae0 +#define rTxAGC_D_Nss3Index7_Nss3Index4_JAguar 0x1ae4 +#define rTxAGC_D_Nss3Index9_Nss3Index8_JAguar 0x1ae8 +#endif + +#define bTxAGC_byte0_Jaguar 0xff +#define bTxAGC_byte1_Jaguar 0xff00 +#define bTxAGC_byte2_Jaguar 0xff0000 +#define bTxAGC_byte3_Jaguar 0xff000000 +#endif + +#define BIT_FA_RESET BIT0 + + + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_types.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_types.h new file mode 100644 index 0000000..71cbafc --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/phydm_types.h @@ -0,0 +1,442 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __ODM_TYPES_H__ +#define __ODM_TYPES_H__ + +#define ODM_RATEMCS15_SG 0x1c +#define ODM_RATEMCS32 0x20 + + +// CCK Rates, TxHT = 0 +#define ODM_RATE1M 0x00 +#define ODM_RATE2M 0x01 +#define ODM_RATE5_5M 0x02 +#define ODM_RATE11M 0x03 +// OFDM Rates, TxHT = 0 +#define ODM_RATE6M 0x04 +#define ODM_RATE9M 0x05 +#define ODM_RATE12M 0x06 +#define ODM_RATE18M 0x07 +#define ODM_RATE24M 0x08 +#define ODM_RATE36M 0x09 +#define ODM_RATE48M 0x0A +#define ODM_RATE54M 0x0B +// MCS Rates, TxHT = 1 +#define ODM_RATEMCS0 0x0C +#define ODM_RATEMCS1 0x0D +#define ODM_RATEMCS2 0x0E +#define ODM_RATEMCS3 0x0F +#define ODM_RATEMCS4 0x10 +#define ODM_RATEMCS5 0x11 +#define ODM_RATEMCS6 0x12 +#define ODM_RATEMCS7 0x13 +#define ODM_RATEMCS8 0x14 +#define ODM_RATEMCS9 0x15 +#define ODM_RATEMCS10 0x16 +#define ODM_RATEMCS11 0x17 +#define ODM_RATEMCS12 0x18 +#define ODM_RATEMCS13 0x19 +#define ODM_RATEMCS14 0x1A +#define ODM_RATEMCS15 0x1B +#define ODM_RATEMCS16 0x1C +#define ODM_RATEMCS17 0x1D +#define ODM_RATEMCS18 0x1E +#define ODM_RATEMCS19 0x1F +#define ODM_RATEMCS20 0x20 +#define ODM_RATEMCS21 0x21 +#define ODM_RATEMCS22 0x22 +#define ODM_RATEMCS23 0x23 +#define ODM_RATEMCS24 0x24 +#define ODM_RATEMCS25 0x25 +#define ODM_RATEMCS26 0x26 +#define ODM_RATEMCS27 0x27 +#define ODM_RATEMCS28 0x28 +#define ODM_RATEMCS29 0x29 +#define ODM_RATEMCS30 0x2A +#define ODM_RATEMCS31 0x2B +#define ODM_RATEVHTSS1MCS0 0x2C +#define ODM_RATEVHTSS1MCS1 0x2D +#define ODM_RATEVHTSS1MCS2 0x2E +#define ODM_RATEVHTSS1MCS3 0x2F +#define ODM_RATEVHTSS1MCS4 0x30 +#define ODM_RATEVHTSS1MCS5 0x31 +#define ODM_RATEVHTSS1MCS6 0x32 +#define ODM_RATEVHTSS1MCS7 0x33 +#define ODM_RATEVHTSS1MCS8 0x34 +#define ODM_RATEVHTSS1MCS9 0x35 +#define ODM_RATEVHTSS2MCS0 0x36 +#define ODM_RATEVHTSS2MCS1 0x37 +#define ODM_RATEVHTSS2MCS2 0x38 +#define ODM_RATEVHTSS2MCS3 0x39 +#define ODM_RATEVHTSS2MCS4 0x3A +#define ODM_RATEVHTSS2MCS5 0x3B +#define ODM_RATEVHTSS2MCS6 0x3C +#define ODM_RATEVHTSS2MCS7 0x3D +#define ODM_RATEVHTSS2MCS8 0x3E +#define ODM_RATEVHTSS2MCS9 0x3F +#define ODM_RATEVHTSS3MCS0 0x40 +#define ODM_RATEVHTSS3MCS1 0x41 +#define ODM_RATEVHTSS3MCS2 0x42 +#define ODM_RATEVHTSS3MCS3 0x43 +#define ODM_RATEVHTSS3MCS4 0x44 +#define ODM_RATEVHTSS3MCS5 0x45 +#define ODM_RATEVHTSS3MCS6 0x46 +#define ODM_RATEVHTSS3MCS7 0x47 +#define ODM_RATEVHTSS3MCS8 0x48 +#define ODM_RATEVHTSS3MCS9 0x49 +#define ODM_RATEVHTSS4MCS0 0x4A +#define ODM_RATEVHTSS4MCS1 0x4B +#define ODM_RATEVHTSS4MCS2 0x4C +#define ODM_RATEVHTSS4MCS3 0x4D +#define ODM_RATEVHTSS4MCS4 0x4E +#define ODM_RATEVHTSS4MCS5 0x4F +#define ODM_RATEVHTSS4MCS6 0x50 +#define ODM_RATEVHTSS4MCS7 0x51 +#define ODM_RATEVHTSS4MCS8 0x52 +#define ODM_RATEVHTSS4MCS9 0x53 + + +// +// Define Different SW team support +// +#define ODM_AP 0x01 //BIT0 +#define ODM_ADSL 0x02 //BIT1 +#define ODM_CE 0x04 //BIT2 +#define ODM_WIN 0x08 //BIT3 +#define ODM_IOT 0x10 //BIT4 + +#define DM_ODM_SUPPORT_TYPE ODM_IOT + +// Deifne HW endian support +#define ODM_ENDIAN_BIG 0 +#define ODM_ENDIAN_LITTLE 1 + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#define GET_PDM_ODM(__pAdapter) ((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->DM_OutSrc))) +#elif (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_IOT)) +#define GET_PDM_ODM(__pAdapter) ((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->odmpriv))) +#endif + +#if (DM_ODM_SUPPORT_TYPE != ODM_WIN) +#define RT_PCI_INTERFACE 1 +#define RT_USB_INTERFACE 2 +#define RT_SDIO_INTERFACE 3 +#define RT_LXBUS_INTERFACE 4 +#endif + +typedef enum _HAL_STATUS{ + HAL_STATUS_SUCCESS, + HAL_STATUS_FAILURE, + /*RT_STATUS_PENDING, + RT_STATUS_RESOURCE, + RT_STATUS_INVALID_CONTEXT, + RT_STATUS_INVALID_PARAMETER, + RT_STATUS_NOT_SUPPORT, + RT_STATUS_OS_API_FAILED,*/ +}HAL_STATUS,*PHAL_STATUS; + + +#if( (DM_ODM_SUPPORT_TYPE == ODM_AP) ||(DM_ODM_SUPPORT_TYPE == ODM_ADSL) || (DM_ODM_SUPPORT_TYPE == ODM_CE)) + +#define VISTA_USB_RX_REVISE 0 + +// +// Declare for ODM spin lock defintion temporarily fro compile pass. +// +typedef enum _RT_SPINLOCK_TYPE{ + RT_TX_SPINLOCK = 1, + RT_RX_SPINLOCK = 2, + RT_RM_SPINLOCK = 3, + RT_CAM_SPINLOCK = 4, + RT_SCAN_SPINLOCK = 5, + RT_LOG_SPINLOCK = 7, + RT_BW_SPINLOCK = 8, + RT_CHNLOP_SPINLOCK = 9, + RT_RF_OPERATE_SPINLOCK = 10, + RT_INITIAL_SPINLOCK = 11, + RT_RF_STATE_SPINLOCK = 12, // For RF state. Added by Bruce, 2007-10-30. +#if VISTA_USB_RX_REVISE + RT_USBRX_CONTEXT_SPINLOCK = 13, + RT_USBRX_POSTPROC_SPINLOCK = 14, // protect data of Adapter->IndicateW/ IndicateR +#endif + //Shall we define Ndis 6.2 SpinLock Here ? + RT_PORT_SPINLOCK=16, + RT_H2C_SPINLOCK = 20, // For H2C cmd. Added by tynli. 2009.11.09. + + RT_BTData_SPINLOCK=25, + + RT_WAPI_OPTION_SPINLOCK=26, + RT_WAPI_RX_SPINLOCK=27, + + // add for 92D CCK control issue + RT_CCK_PAGEA_SPINLOCK = 28, + RT_BUFFER_SPINLOCK = 29, + RT_CHANNEL_AND_BANDWIDTH_SPINLOCK = 30, + RT_GEN_TEMP_BUF_SPINLOCK = 31, + RT_AWB_SPINLOCK = 32, + RT_FW_PS_SPINLOCK = 33, + RT_HW_TIMER_SPIN_LOCK = 34, + RT_MPT_WI_SPINLOCK = 35, + RT_P2P_SPIN_LOCK = 36, // Protect P2P context + RT_DBG_SPIN_LOCK = 37, + RT_IQK_SPINLOCK = 38, + RT_PENDED_OID_SPINLOCK = 39, + RT_CHNLLIST_SPINLOCK = 40, + RT_INDIC_SPINLOCK = 41, //protect indication +}RT_SPINLOCK_TYPE; + +#endif + + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #define STA_INFO_T RT_WLAN_STA + #define PSTA_INFO_T PRT_WLAN_STA + +// typedef unsigned long u4Byte,*pu4Byte; +#define CONFIG_HW_ANTENNA_DIVERSITY +#define CONFIG_SW_ANTENNA_DIVERSITY + +#elif (DM_ODM_SUPPORT_TYPE == ODM_AP) + + // To let ADSL/AP project compile ok; it should be removed after all conflict are solved. Added by Annie, 2011-10-07. + #define ADSL_AP_BUILD_WORKAROUND + #define AP_BUILD_WORKAROUND + // +#ifdef CONFIG_ANT_SWITCH + #define CONFIG_HW_ANTENNA_DIVERSITY + #if ( defined(CONFIG_NO_2G_DIVERSITY) && defined(CONFIG_NO_5G_DIVERSITY) ) + #define CONFIG_NOT_SUPPORT_ANTDIV + #elif( !defined(CONFIG_NO_2G_DIVERSITY) && defined(CONFIG_NO_5G_DIVERSITY) ) + #define CONFIG_2G_SUPPORT_ANTDIV + #elif( defined(CONFIG_NO_2G_DIVERSITY) && !defined(CONFIG_NO_5G_DIVERSITY) ) + #define CONFIG_5G_SUPPORT_ANTDIV + #elif( !defined(CONFIG_NO_2G_DIVERSITY) && !defined(CONFIG_NO_5G_DIVERSITY) ) + #define CONFIG_2G5G_SUPPORT_ANTDIV + #endif +#endif + + #ifdef AP_BUILD_WORKAROUND + #include "../typedef.h" + #else + typedef void VOID,*PVOID; + typedef unsigned char BOOLEAN,*PBOOLEAN; + typedef unsigned char u1Byte,*pu1Byte; + typedef unsigned short u2Byte,*pu2Byte; + typedef unsigned int u4Byte,*pu4Byte; + typedef unsigned long long u8Byte,*pu8Byte; + typedef char s1Byte,*ps1Byte; + typedef short s2Byte,*ps2Byte; + typedef long s4Byte,*ps4Byte; + typedef long long s8Byte,*ps8Byte; + #endif + + typedef struct rtl8192cd_priv *prtl8192cd_priv; + typedef struct stat_info STA_INFO_T,*PSTA_INFO_T; + typedef struct timer_list RT_TIMER, *PRT_TIMER; + typedef void * RT_TIMER_CALL_BACK; + + #define DEV_BUS_TYPE RT_PCI_INTERFACE + + #define _TRUE 1 + #define _FALSE 0 + +#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) + + // To let ADSL/AP project compile ok; it should be removed after all conflict are solved. Added by Annie, 2011-10-07. + #define ADSL_AP_BUILD_WORKAROUND + #define ADSL_BUILD_WORKAROUND + // + + typedef unsigned char BOOLEAN,*PBOOLEAN; + typedef unsigned char u1Byte,*pu1Byte; + typedef unsigned short u2Byte,*pu2Byte; + typedef unsigned int u4Byte,*pu4Byte; + typedef unsigned long long u8Byte,*pu8Byte; + typedef char s1Byte,*ps1Byte; + typedef short s2Byte,*ps2Byte; + typedef long s4Byte,*ps4Byte; + typedef long long s8Byte,*ps8Byte; + + typedef struct rtl8192cd_priv *prtl8192cd_priv; + typedef struct stat_info STA_INFO_T,*PSTA_INFO_T; + typedef struct timer_list RT_TIMER, *PRT_TIMER; + typedef void * RT_TIMER_CALL_BACK; + + #define DEV_BUS_TYPE RT_PCI_INTERFACE + + #define _TRUE 1 + #define _FALSE 0 + +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + #include + +#if 0 + typedef u8 u1Byte, *pu1Byte; + typedef u16 u2Byte,*pu2Byte; + typedef u32 u4Byte,*pu4Byte; + typedef u64 u8Byte,*pu8Byte; + typedef s8 s1Byte,*ps1Byte; + typedef s16 s2Byte,*ps2Byte; + typedef s32 s4Byte,*ps4Byte; + typedef s64 s8Byte,*ps8Byte; +#else + #define u1Byte u8 + #define pu1Byte u8* + + #define u2Byte u16 + #define pu2Byte u16* + + #define u4Byte u32 + #define pu4Byte u32* + + #define u8Byte u64 + #define pu8Byte u64* + + #define s1Byte s8 + #define ps1Byte s8* + + #define s2Byte s16 + #define ps2Byte s16* + + #define s4Byte s32 + #define ps4Byte s32* + + #define s8Byte s64 + #define ps8Byte s64* + +#endif + #ifdef CONFIG_USB_HCI + #define DEV_BUS_TYPE RT_USB_INTERFACE + #elif defined(CONFIG_PCI_HCI) + #define DEV_BUS_TYPE RT_PCI_INTERFACE + #elif defined(CONFIG_SDIO_HCI) + #define DEV_BUS_TYPE RT_SDIO_INTERFACE + #elif defined(CONFIG_GSPI_HCI) + #define DEV_BUS_TYPE RT_SDIO_INTERFACE + #elif defined(CONFIG_LX_HCI) + #define DEV_BUS_TYPE RT_PCI_INTERFACE + #endif + + + #if defined(CONFIG_LITTLE_ENDIAN) + #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE + #elif defined (CONFIG_BIG_ENDIAN) + #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG + #endif + + typedef struct timer_list RT_TIMER, *PRT_TIMER; + typedef void * RT_TIMER_CALL_BACK; + #define STA_INFO_T struct sta_info + #define PSTA_INFO_T struct sta_info * + + + +#ifndef TRUE + #define TRUE _TRUE +#endif +#ifndef FALSE + #define FALSE _FALSE +#endif + + + #define SET_TX_DESC_ANTSEL_A_88E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 1, __Value) + #define SET_TX_DESC_ANTSEL_B_88E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 25, 1, __Value) + #define SET_TX_DESC_ANTSEL_C_88E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 29, 1, __Value) + + //define useless flag to avoid compile warning + #define USE_WORKITEM 0 + #define FOR_BRAZIL_PRETEST 0 + #define FPGA_TWO_MAC_VERIFICATION 0 + #define RTL8881A_SUPPORT 0 + +#elif (DM_ODM_SUPPORT_TYPE == ODM_IOT) + #include + + #define RA_MASK_PHYDMLIZE_CE 1 + + typedef unsigned char u1Byte,*pu1Byte; + typedef unsigned short u2Byte,*pu2Byte; + typedef unsigned int u4Byte,*pu4Byte; + typedef unsigned long long u8Byte,*pu8Byte; + typedef signed char s1Byte,*ps1Byte; /* GCC ROM char = unsigned char */ + typedef signed short s2Byte,*ps2Byte; + typedef signed long s4Byte,*ps4Byte; + typedef long long s8Byte,*ps8Byte; + + typedef struct sta_info STA_INFO_T,*PSTA_INFO_T; + + #if defined(CONFIG_GSPI_HCI) + #define DEV_BUS_TYPE RT_SDIO_INTERFACE + #elif defined(CONFIG_LX_HCI) + #define DEV_BUS_TYPE RT_LXBUS_INTERFACE + #endif + + // Array_MP_8195A_TXPWR_LMT[] + typedef enum _ODM_PW_LMT_REGULATION_TYPE{ + PW_LMT_REGU_NULL = 0, + PW_LMT_REGU_FCC = 1, + PW_LMT_REGU_ETSI = 2, + PW_LMT_REGU_MKK = 3, + PW_LMT_REGU_WW13 = 4 + }ODM_PW_LMT_REGULATION_TYPE; + + typedef enum _ODM_PW_LMT_BAND_TYPE{ + PW_LMT_BAND_NULL = 0, + PW_LMT_BAND_2_4G = 1, + PW_LMT_BAND_5G = 2 + }ODM_PW_LMT_BAND_TYPE; + + typedef enum _ODM_PW_LMT_BANDWIDTH_TYPE{ + PW_LMT_BW_NULL = 0, + PW_LMT_BW_20M = 1, + PW_LMT_BW_40M = 2, + PW_LMT_BW_80M = 3 + }ODM_PW_LMT_BANDWIDTH_TYPE; + + typedef enum _ODM_PW_LMT_RATESECTION_TYPE{ + PW_LMT_RS_NULL = 0, + PW_LMT_RS_CCK = 1, + PW_LMT_RS_OFDM = 2, + PW_LMT_RS_HT = 3, + PW_LMT_RS_VHT = 4 + }ODM_PW_LMT_RATESECTION_TYPE; + + typedef enum _ODM_PW_LMT_RFPATH_TYPE{ + PW_LMT_PH_NULL = 0, + PW_LMT_PH_1T = 1, + PW_LMT_PH_2T = 2, + PW_LMT_PH_3T = 3, + PW_LMT_PH_4T = 4 + }ODM_PW_LMT_RFPATH_TYPE; + + #if defined(CONFIG_LITTLE_ENDIAN) + #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE + #elif defined (CONFIG_BIG_ENDIAN) + #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG + #endif + +#endif + +#define READ_NEXT_PAIR(v1, v2, i) do { if (i+2 >= ArrayLen) break; i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) +#define COND_ELSE 2 +#define COND_ENDIF 3 + +#endif // __ODM_TYPES_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rom_odm_interface.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rom_odm_interface.h new file mode 100644 index 0000000..ddf25cf --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rom_odm_interface.h @@ -0,0 +1,59 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __ROM_ODM_INTERFACE_H__ +#define __ROM_ODM_INTERFACE_H__ + +#include "hal_api.h" + +// +// =========== Macro Define +// +#define ODM_Read1Byte(pDM_Odm, RegAddr) HAL_READ8(WIFI_REG_BASE, RegAddr) +#define ODM_Read2Byte(pDM_Odm, RegAddr) HAL_READ16(WIFI_REG_BASE, RegAddr) +#define ODM_Read4Byte(pDM_Odm, RegAddr) HAL_READ32(WIFI_REG_BASE, RegAddr) +#define ODM_Write1Byte(pDM_Odm, RegAddr, Data) HAL_WRITE8(WIFI_REG_BASE, RegAddr, Data) +#define ODM_Write2Byte(pDM_Odm, RegAddr, Data) HAL_WRITE16(WIFI_REG_BASE, addr, value) +#define ODM_Write4Byte(pDM_Odm, RegAddr, Data) HAL_WRITE32(WIFI_REG_BASE, addr, value) +#if (RTL8195A_SUPPORT == 1) +#define ODM_GetMACReg(pDM_Odm,RegAddr, BitMask) PHY_QueryBBReg_8195A((pDM_Odm->Adapter), (RegAddr), (BitMask)) +#define ODM_SetMACReg(pDM_Odm, RegAddr, BitMask, Data) PHY_SetBBReg_8195A((pDM_Odm->Adapter), (RegAddr), (BitMask), (Data)) +#define ODM_GetBBReg(pDM_Odm, RegAddr, BitMask) PHY_QueryBBReg_8195A((pDM_Odm->Adapter), (RegAddr), (BitMask)) +#define ODM_SetBBReg(pDM_Odm, RegAddr, BitMask, Data) PHY_SetBBReg_8195A((pDM_Odm->Adapter), (RegAddr), (BitMask), (Data)) +#endif + +#if (RTL8711B_SUPPORT ==1) +#define ODM_GetMACReg(pDM_Odm,RegAddr, BitMask) PHY_QueryBBReg_8711B((pDM_Odm->Adapter), (RegAddr), (BitMask)) +#define ODM_SetMACReg(pDM_Odm, RegAddr, BitMask, Data) PHY_SetBBReg_8711B((pDM_Odm->Adapter), (RegAddr), (BitMask), (Data)) +#define ODM_GetBBReg(pDM_Odm, RegAddr, BitMask) PHY_QueryBBReg_8711B((pDM_Odm->Adapter), (RegAddr), (BitMask)) +#define ODM_SetBBReg(pDM_Odm, RegAddr, BitMask, Data) PHY_SetBBReg_8711B((pDM_Odm->Adapter), (RegAddr), (BitMask), (Data)) +#endif +// +// =========== Extern Variable +// + +// +// =========== EXtern Function Prototype +// + + +#endif // __ROM_ODM_INTERFACE_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/Hal8195ARateAdaptive.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/Hal8195ARateAdaptive.h new file mode 100644 index 0000000..b6d240e --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/Hal8195ARateAdaptive.h @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2013-2016 Realtek Semiconductor Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __HALCOM_RATE_ADAPTIVE_RAM_H__ +#define __HALCOM_RATE_ADAPTIVE_RAM_H__ + +#if RATE_ADAPTIVE_SUPPORT + +/*--------------------------Define -------------------------------------------*/ + +#define FIRST_MACID 0 // This is the connection of STA to AP +// Rate index mapping +#define RATE_CCK_1M ODM_RATE1M +#define RATE_CCK_2M ODM_RATE2M +#define RATE_CCK_5M ODM_RATE5_5M +#define RATE_CCK_11M ODM_RATE11M +#define RATE_OFDM_6M ODM_RATE6M +#define RATE_OFDM_9M ODM_RATE9M +#define RATE_OFDM_12M ODM_RATE12M +#define RATE_OFDM_18M ODM_RATE18M +#define RATE_OFDM_24M ODM_RATE24M +#define RATE_OFDM_36M ODM_RATE36M +#define RATE_OFDM_48M ODM_RATE48M +#define RATE_OFDM_54M ODM_RATE54M +#define RATE_HT_MCS0 ODM_RATEMCS0 +#define RATE_HT_MCS1 ODM_RATEMCS1 +#define RATE_HT_MCS2 ODM_RATEMCS2 +#define RATE_HT_MCS3 ODM_RATEMCS3 +#define RATE_HT_MCS4 ODM_RATEMCS4 +#define RATE_HT_MCS5 ODM_RATEMCS5 +#define RATE_HT_MCS6 ODM_RATEMCS6 +#define RATE_HT_MCS7 ODM_RATEMCS7 +#define RATE_HT_MCS8 ODM_RATEMCS8 +#define RATE_HT_MCS9 ODM_RATEMCS9 +#define RATE_HT_MCS10 ODM_RATEMCS10 +#define RATE_HT_MCS11 ODM_RATEMCS11 +#define RATE_HT_MCS12 ODM_RATEMCS12 +#define RATE_HT_MCS13 ODM_RATEMCS13 +#define RATE_HT_MCS14 ODM_RATEMCS14 +#define RATE_HT_MCS15 ODM_RATEMCS15 + +#define MACID_NUM 128 + + + +// TX report format +#define TXRPT_SIZE 16 +//offset 0 +#define TXRPT_DATARATE (BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6) +#define TXRPT_SGI BIT7 +//offset 1 +#define TXRPT_PWRSTS (BIT0|BIT1|BIT2) +#define TXRPT_TRYNESSCNT (BIT3|BIT4|BIT5|BIT6) +#define TXRPT_TRYRATE BIT7 +//offset 2 +#define TXRPT_TRYRESULT BIT6 +#define TXRPT_TRYFINISH BIT7 +//offset 3 +#define TXRPT_PAUSERPT BIT6 +#define TXRPT_RESETRPT BIT7 +//offset 4 + +//offset 5 +#define TXRPT_BW (BIT0|BIT1) +#define TXRPT_PKTDROP BIT2 + + + +#define RATE_UP 1 +#define RATE_DOWN 2 + +#define RSSI_TH1 45 +#define RSSI_TH2 25 + +#define PERENTRY 27 +#define RETRYSIZE 5 +#define RATESIZE 20 +#define RAMASK_SIZE 8 + +#define SS_PT_TH_High 66 +#define SS_PT_TH_low 57 +#define SS_PT_off 48 +#define SS_RA_INIT_RATE_RSSI 30 +#define STEP_DROP 1 +#define CONFIG_SGI 0 +#define TRY_WAITING 10 + +// RA mask +#define Mask_length_REG 8 +#define Rate_id_NUM 9 // 6 rate id from reg +#define ARFB_table_NUM 7 + +#define TRY_NESS_CNT_IDX_SIZE 16 + +/*------------------------------Define Enum-----------------------------------*/ +typedef enum _RTL8195_RATEID_IDX_ { + MODE_BGN_40M_2SS = 0, + MODE_BGN_40M_1SS = 1, + MODE_BGN_20M_2SS_BN = 2, + MODE_BGN_20M_1SS_BN = 3, + MODE_GN_N2SS = 4, + MODE_GN_N1SS = 5, + MODE_BG = 6, + MODE_G = 7, + MODE_B = 8 +} RTL8195_RATEID_IDX, *PRTL8195_RATEID_IDX; + +typedef enum _VHT_HT_SWITCH_ { + TYPE_HT = 0, + TYPE_VHT = 1, + TYPE_MIX1 = 2, + TYPE_MIX2 = 3 +} VHT_SEL_SWITCH, *PVHT_SEL_SWITCH; + +/*--------------------------Define MACRO--------------------------------------*/ +#define TRYING_DISABLE 0 +#define TRYING_ENABLE 1 + +//RA MASK: INIT_RATE_MASK + +//if VHT_HT_SWITCH = 1, it means VHT. +//Bit[51:12] : VHT 1SS ~ VHT 4SS +//if VHT_HT_SWITCH = 0, it means HT. +//Bit[43:12] : HT 1SS ~ HT4SS + +//offset6 +//#define VHT_HT_SWITCH BIT4 + + +// H2C CMD +//offset0 +#define H2CID13_MACID 0x7F +//offset1 +#define H2CID13_RATEID 0x1F +#define H2CID13_SGI BIT7 + + + +//offset2 +#define H2CID13_BW (BIT0|BIT1) +#define H2CID13_enldpc BIT2 +#define H2CID13_NOUPDATE BIT3 +#define H2CID13_VHT_EN (BIT5|BIT4) +#define H2CID13_DISPT BIT6 +#define H2CID13_DISRA BIT7 + +//H2C AP_Req_Tx_Rpt +#define H2CID43_RTY_OK_TOTAL BIT0 +#define H2CID43_RTY_CNT_MACID BIT1 + + +//RAInfo +#define MASK_RA_ULDL_STATE BIT0 +#define MASK_RA_STBC_STATE BIT1 +#define MASK_RA_LDPC_CAP_STATE BIT2 +#define MASK_RA_SHORTCUT_STATE BIT3 +#define MASK_RA_SHORTCUT_FLAG BIT4 +#define MASK_RA_INIT_RATE_RSSI_STATE BIT5 +#define MASK_RA_BF_STATE BIT6 +#define MASK_RA_DELAY_RATE BIT7 + + + +#define RA_ULDL_STATE_SHT 0 +#define RA_STBC_STATE_SHT 1 +#define RA_LDPC_CAP_STATE_SHT 2 +#define RA_SHORTCUT_STATE_SHT 3 +#define RA_SHORTCUT_FLAG_SHT 4 +#define RA_INIT_RATE_RSSI_SHT 5 +#define RA_BF_STATE_SHT 6 +#define RA_DELAY_RATE_SHT 7 + +/*------------------------Export global variable------------------------------*/ +//2 Rate Adaptive +//HW Statistic +//extern MEMTYPE_XDATA u16 TOTAL[MACID_NUM]; +//extern MEMTYPE_XDATA u1Byte DROP[MACID_NUM]; +//extern MEMTYPE_XDATA u16 RTY[MACID_NUM][5]; + +//extern MEMTYPE_XDATA STAINFO_RA stainfo_ra[MACID_NUM]; +//extern MEMTYPE_XDATA u16 Nsc[MACID_NUM]; +//extern MEMTYPE_XDATA u1Byte RSSI[MACID_NUM]; // add by Gary +//extern MEMTYPE_XDATA u1Byte BUPDATE[MACID_NUM]; + +/*------------------------------Function declaration--------------------------*/ +VOID +InitBBNHM( + void +); + +VOID +BBNHM( + void +); + +VOID +ODM_InitRAInfo( + IN PDM_ODM_T pDM_Odm +); + +VOID +H2CHDL_Set_MACID_Config( + IN PDM_ODM_T pDM_Odm, + IN u1Byte *pbuf +); + +VOID +H2CHDL_SetRssiSingle( + u1Byte *pbuf +); + + +VOID +H2CHDL_APReqTxrpt( + u1Byte *pbuf +); + +VOID +H2CHDL_InitRateCollect( + u1Byte *pbuf +); + + +VOID +TryDone( + IN PDM_ODM_T pDM_Odm, + IN PODM_RA_INFO_T pRaInfo +); + +VOID +RateDownTrying( + IN PDM_ODM_T pDM_Odm, + IN PODM_RA_INFO_T pRaInfo +); + +VOID +RateDecisionRAM8195A( + IN PDM_ODM_T pDM_Odm, + IN PODM_RA_INFO_T pRaInfo +); + +VOID +GetRATRfromREG( + IN u16 reg_addr, + IN u1Byte macid +); + +VOID +PHY_DM_RA_SetRSSI_8195A( + IN PDM_ODM_T pDM_Odm, + IN u1Byte MacID, + IN u1Byte Rssi + ); + +#if 0 +extern void +Rate_trying_decision( + IN u1Byte macid, + IN u1Byte rate, + IN u1Byte datarc, + IN u1Byte aggnum +); +#endif + + +//debug +VOID +ArfrRefresh( + IN PDM_ODM_T pDM_Odm, + IN PODM_RA_INFO_T pRaInfo +); + +#endif //#if CONFIG_RATE_ADAPTIVE + +#endif //#ifndef __HALCOM_RATE_ADAPTIVE_RAM_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/Hal8195AReg.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/Hal8195AReg.h new file mode 100644 index 0000000..0ee85a6 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/Hal8195AReg.h @@ -0,0 +1,1371 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ****************************************************************************** + * + * Module: __INC_HAL8723BREG_H + * + * + * Note: 1. Define Mac register address and corresponding bit mask map + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * + *****************************************************************************/ +#ifndef __INC_HAL8195AREG_H +#define __INC_HAL8195AREG_H + + + +//============================================================ +// +//============================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_SYS_ISO_CTRL_8723B 0x0000 // 2 Byte +#define REG_SYS_FUNC_EN_8723B 0x0002 // 2 Byte +#define REG_APS_FSMCO_8723B 0x0004 // 4 Byte +#define REG_SYS_CLKR_8723B 0x0008 // 2 Byte +#define REG_9346CR_8723B 0x000A // 2 Byte +#define REG_EE_VPD_8723B 0x000C // 2 Byte +#define REG_AFE_MISC_8723B 0x0010 // 1 Byte +#define REG_SPS0_CTRL_8723B 0x0011 // 7 Byte +#define REG_SPS_OCP_CFG_8723B 0x0018 // 4 Byte +#define REG_RSV_CTRL_8723B 0x001C // 3 Byte +#define REG_RF_CTRL_8723B 0x001F // 1 Byte +#define REG_LPLDO_CTRL_8723B 0x0023 // 1 Byte +#define REG_AFE_XTAL_CTRL_8723B 0x0024 // 4 Byte +#define REG_AFE_PLL_CTRL_8723B 0x0028 // 4 Byte +#define REG_MAC_PLL_CTRL_EXT_8723B 0x002c // 4 Byte +#define REG_EFUSE_CTRL_8723B 0x0030 +#define REG_EFUSE_TEST_8723B 0x0034 +#define REG_PWR_DATA_8723B 0x0038 +#define REG_CAL_TIMER_8723B 0x003C +#define REG_ACLK_MON_8723B 0x003E +#define REG_GPIO_MUXCFG_8723B 0x0040 +#define REG_GPIO_IO_SEL_8723B 0x0042 +#define REG_MAC_PINMUX_CFG_8723B 0x0043 +#define REG_GPIO_PIN_CTRL_8723B 0x0044 +#define REG_GPIO_INTM_8723B 0x0048 +#define REG_LEDCFG0_8723B 0x004C +#define REG_LEDCFG1_8723B 0x004D +#define REG_LEDCFG2_8723B 0x004E +#define REG_LEDCFG3_8723B 0x004F +#define REG_FSIMR_8723B 0x0050 +#define REG_FSISR_8723B 0x0054 +#define REG_HSIMR_8723B 0x0058 +#define REG_HSISR_8723B 0x005c +#define REG_GPIO_EXT_CTRL 0x0060 +#define REG_MULTI_FUNC_CTRL_8723B 0x0068 +#define REG_GPIO_STATUS_8723B 0x006C +#define REG_SDIO_CTRL_8723B 0x0070 +#define REG_OPT_CTRL_8723B 0x0074 +#define REG_AFE_XTAL_CTRL_EXT_8723B 0x0078 +#define REG_MCUFWDL_8723B 0x0080 +#define REG_BT_PATCH_STATUS_8723B 0x0088 +#define REG_HIMR0_8723B 0x00B0 +#define REG_HISR0_8723B 0x00B4 +#define REG_HIMR1_8723B 0x00B8 +#define REG_HISR1_8723B 0x00BC +#define REG_PMC_DBG_CTRL2_8723B 0x00CC +#define REG_EFUSE_BURN_GNT_8723B 0x00CF +#define REG_HPON_FSM_8723B 0x00EC +#define REG_SYS_CFG_8723B 0x00F0 +#define REG_SYS_CFG1_8723B 0x00FC +#define REG_ROM_VERSION 0x00FD + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_CR_8723B 0x0100 +#define REG_PBP_8723B 0x0104 +#define REG_PKT_BUFF_ACCESS_CTRL_8723B 0x0106 +#define REG_TRXDMA_CTRL_8723B 0x010C +#define REG_TRXFF_BNDY_8723B 0x0114 +#define REG_TRXFF_STATUS_8723B 0x0118 +#define REG_RXFF_PTR_8723B 0x011C +#define REG_CPWM_8723B 0x012F +#define REG_FWIMR_8723B 0x0130 +#define REG_FWISR_8723B 0x0134 +#define REG_FTIMR_8723B 0x0138 +#define REG_PKTBUF_DBG_CTRL_8723B 0x0140 +#define REG_RXPKTBUF_CTRL_8723B 0x0142 +#define REG_PKTBUF_DBG_DATA_L_8723B 0x0144 +#define REG_PKTBUF_DBG_DATA_H_8723B 0x0148 + +#define REG_TC0_CTRL_8723B 0x0150 +#define REG_TC1_CTRL_8723B 0x0154 +#define REG_TC2_CTRL_8723B 0x0158 +#define REG_TC3_CTRL_8723B 0x015C +#define REG_TC4_CTRL_8723B 0x0160 +#define REG_TCUNIT_BASE_8723B 0x0164 +#define REG_RSVD3_8723B 0x0168 +#define REG_C2HEVT_MSG_NORMAL_8723B 0x01A0 +#define REG_C2HEVT_CMD_SEQ_88XX 0x01A1 +#define REG_C2hEVT_CMD_CONTENT_88XX 0x01A2 +#define REG_C2HEVT_CMD_LEN_88XX 0x01AE +#define REG_C2HEVT_CLEAR_8723B 0x01AF +#define REG_MCUTST_1_8723B 0x01C0 +#define REG_MCUTST_WOWLAN_8723B 0x01C7 +#define REG_FMETHR_8723B 0x01C8 +#define REG_HMETFR_8723B 0x01CC +#define REG_HMEBOX_0_8723B 0x01D0 +#define REG_HMEBOX_1_8723B 0x01D4 +#define REG_HMEBOX_2_8723B 0x01D8 +#define REG_HMEBOX_3_8723B 0x01DC +#define REG_LLT_INIT_8723B 0x01E0 +#define REG_HMEBOX_EXT0_8723B 0x01F0 +#define REG_HMEBOX_EXT1_8723B 0x01F4 +#define REG_HMEBOX_EXT2_8723B 0x01F8 +#define REG_HMEBOX_EXT3_8723B 0x01FC + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +#define REG_RQPN_8723B 0x0200 +#define REG_FIFOPAGE_8723B 0x0204 +#define REG_TDECTRL_8723B 0x0208 +#define REG_TXDMA_OFFSET_CHK_8723B 0x020C +#define REG_TXDMA_STATUS_8723B 0x0210 +#define REG_RQPN_NPQ_8723B 0x0214 +#define REG_TDECTRL1_8195A 0x0228 + + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#define REG_RXDMA_AGG_PG_TH_8723B 0x0280 +#define REG_FW_UPD_RDPTR_8723B 0x0284 // FW shall update this register before FW write RXPKT_RELEASE_POLL to 1 +#define REG_RXDMA_CONTROL_8723B 0x0286 // Control the RX DMA. +#define REG_RXPKT_NUM_8723B 0x0287 // The number of packets in RXPKTBUF. +#define REG_RXDMA_STATUS_8723B 0x0288 +#define REG_RXDMA_PRO_8723B 0x0290 +#define REG_EARLY_MODE_CONTROL_8723B 0x02BC +#define REG_RSVD5_8723B 0x02F0 +#define REG_RSVD6_8723B 0x02F4 + + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- +#define REG_PCIE_CTRL_REG_8723B 0x0300 +#define REG_INT_MIG_8723B 0x0304 // Interrupt Migration +#define REG_BCNQ_DESA_8723B 0x0308 // TX Beacon Descriptor Address +#define REG_HQ_DESA_8723B 0x0310 // TX High Queue Descriptor Address +#define REG_MGQ_DESA_8723B 0x0318 // TX Manage Queue Descriptor Address +#define REG_VOQ_DESA_8723B 0x0320 // TX VO Queue Descriptor Address +#define REG_VIQ_DESA_8723B 0x0328 // TX VI Queue Descriptor Address +#define REG_BEQ_DESA_8723B 0x0330 // TX BE Queue Descriptor Address +#define REG_BKQ_DESA_8723B 0x0338 // TX BK Queue Descriptor Address +#define REG_RX_DESA_8723B 0x0340 // RX Queue Descriptor Address +#define REG_DBI_WDATA_8723B 0x0348 // DBI Write Data +#define REG_DBI_RDATA_8723B 0x034C // DBI Read Data +#define REG_DBI_ADDR_8723B 0x0350 // DBI Address +#define REG_DBI_FLAG_8723B 0x0352 // DBI Read/Write Flag +#define REG_MDIO_WDATA_8723B 0x0354 // MDIO for Write PCIE PHY +#define REG_MDIO_RDATA_8723B 0x0356 // MDIO for Reads PCIE PHY +#define REG_MDIO_CTL_8723B 0x0358 // MDIO for Control +#define REG_DBG_SEL_8723B 0x0360 // Debug Selection Register +#define REG_PCIE_HRPWM_8723B 0x0361 //PCIe RPWM +#define REG_PCIE_HCPWM_8723B 0x0363 //PCIe CPWM +#define REG_PCIE_MULTIFET_CTRL_8723B 0x036A //PCIE Multi-Fethc Control + + +// spec version 11 +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +#define REG_VOQ_INFORMATION_8723B 0x0400 +#define REG_VIQ_INFORMATION_8723B 0x0404 +#define REG_BEQ_INFORMATION_8723B 0x0408 +#define REG_BKQ_INFORMATION_8723B 0x040C +#define REG_MGQ_INFORMATION_8723B 0x0410 +#define REG_HGQ_INFORMATION_8723B 0x0414 +#define REG_BCNQ_INFORMATION_8723B 0x0418 +#define REG_TXPKT_EMPTY_8723B 0x041A + +#define REG_FWHW_TXQ_CTRL_8723B 0x0420 +#define REG_HWSEQ_CTRL_8723B 0x0423 +#define REG_TXPKTBUF_BCNQ_BDNY_8723B 0x0424 +#define REG_TXPKTBUF_MGQ_BDNY_8723B 0x0425 +#define REG_LIFECTRL_CTRL_8723B 0x0426 +#define REG_MULTI_BCNQ_OFFSET_8723B 0x0427 +#define REG_SPEC_SIFS_8723B 0x0428 +#define REG_RL_8723B 0x042A +#define REG_TXBF_CTRL_8723B 0x042C +#define REG_DARFRC_8723B 0x0430 +#define REG_RARFRC_8723B 0x0438 +#define REG_RRSR_8723B 0x0440 +#define REG_ARFR0_8723B 0x0444 +#define REG_ARFR1_8723B 0x044C +#define REG_CCK_CHECK_8723B 0x0454 +#define REG_AMPDU_MAX_TIME_8723B 0x0456 +#define REG_TXPKTBUF_BCNQ_BDNY1_8723B 0x0457 + +#define REG_AMPDU_MAX_LENGTH_8195A 0x0458 +#define REG_TXPKTBUF_WMAC_LBK_BF_HD_8723B 0x045D +#define REG_NDPA_OPT_CTRL_8723B 0x045F +#define REG_FAST_EDCA_CTRL_8723B 0x0460 +#define REG_RD_RESP_PKT_TH_8723B 0x0463 +#define REG_SPC_W_PTR 0x47E +#define REG_SPC_R_PTR 0x47F +#define REG_DATA_SC_8723B 0x0483 +#define REG_TXRPT_START_OFFSET 0x04AC +#define REG_POWER_STAGE1_8723B 0x04B4 +#define REG_POWER_STAGE2_8723B 0x04B8 +#define REG_AMPDU_BURST_MODE_8723B 0x04BC +#define REG_PKT_VO_VI_LIFE_TIME_8723B 0x04C0 +#define REG_PKT_BE_BK_LIFE_TIME_8723B 0x04C2 +#define REG_STBC_SETTING_8723B 0x04C4 +#define REG_HT_SINGLE_AMPDU_8723B 0x04C7 +#define REG_PROT_MODE_CTRL_8723B 0x04C8 +#define REG_MAX_AGGR_NUM_8723B 0x04CA +#define REG_RTS_MAX_AGGR_NUM_8723B 0x04CB +#define REG_BAR_MODE_CTRL_8723B 0x04CC +#define REG_RA_TRY_RATE_AGG_LMT_8723B 0x04CF +#define REG_MACID_PKT_DROP0_8723B 0x04D0 + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +#define REG_EDCA_VO_PARAM_8723B 0x0500 +#define REG_EDCA_VI_PARAM_8723B 0x0504 +#define REG_EDCA_BE_PARAM_8723B 0x0508 +#define REG_EDCA_BK_PARAM_8723B 0x050C +#define REG_BCNTCFG_8723B 0x0510 +#define REG_PIFS_8723B 0x0512 +#define REG_RDG_PIFS_8723B 0x0513 +#define REG_SIFS_CTX_8723B 0x0514 +#define REG_SIFS_TRX_8723B 0x0516 +#define REG_AGGR_BREAK_TIME_8723B 0x051A +#define REG_SLOT_8723B 0x051B +#define REG_TX_PTCL_CTRL_8723B 0x0520 +#define REG_TXPAUSE_8723B 0x0522 +#define REG_DIS_TXREQ_CLR_8723B 0x0523 +#define REG_RD_CTRL_8723B 0x0524 +// +// Format for offset 540h-542h: +// [3:0]: TBTT prohibit setup in unit of 32us. The time for HW getting beacon content before TBTT. +// [7:4]: Reserved. +// [19:8]: TBTT prohibit hold in unit of 32us. The time for HW holding to send the beacon packet. +// [23:20]: Reserved +// Description: +// | +// |<--Setup--|--Hold------------>| +// --------------|---------------------- +// | +// TBTT +// Note: We cannot update beacon content to HW or send any AC packets during the time between Setup and Hold. +// Described by Designer Tim and Bruce, 2011-01-14. +// +#define REG_TBTT_PROHIBIT_8723B 0x0540 +#define REG_RD_NAV_NXT_8723B 0x0544 +#define REG_NAV_PROT_LEN_8723B 0x0546 +#define REG_BCN_CTRL_8723B 0x0550 +#define REG_BCN_CTRL_1_8723B 0x0551 +#define REG_MBID_NUM_8723B 0x0552 +#define REG_DUAL_TSF_RST_8723B 0x0553 +#define REG_BCN_INTERVAL_8723B 0x0554 +#define REG_DRVERLYINT_8723B 0x0558 +#define REG_BCNDMATIM_8723B 0x0559 +#define REG_ATIMWND_8723B 0x055A +#define REG_USTIME_TSF_8723B 0x055C +#define REG_BCN_MAX_ERR_8723B 0x055D +#define REG_RXTSF_OFFSET_CCK_8723B 0x055E +#define REG_RXTSF_OFFSET_OFDM_8723B 0x055F +#define REG_TSFTR_8723B 0x0560 +#define REG_CTWND_8723B 0x0572 +#define REG_BCNIVLCUNT_8723B 0x0573 +#define REG_SECONDARY_CCA_CTRL_8723B 0x0577 +#define REG_PSTIMER_8723B 0x0580 +#define REG_TIMER0_8723B 0x0584 +#define REG_TIMER1_8723B 0x0588 +#define REG_ACMHWCTRL_8723B 0x05C0 +#define REG_SCH_TXCMD_8723B 0x05F8 + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +#define REG_MAC_CR_8723B 0x0600 +#define REG_TCR_8723B 0x0604 +#define REG_RCR_8723B 0x0608 +#define REG_RX_PKT_LIMIT_8723B 0x060C +#define REG_RX_DLK_TIME_8723B 0x060D +#define REG_RX_DRVINFO_SZ_8723B 0x060F + +#define REG_MACID_8723B 0x0610 +#define REG_BSSID_8723B 0x0618 +#define REG_MAR_8723B 0x0620 +#define REG_MBIDCAMCFG_8723B 0x0628 + +#define REG_USTIME_EDCA_8723B 0x0638 +#define REG_MAC_SPEC_SIFS_8723B 0x063A +#define REG_RESP_SIFP_CCK_8723B 0x063C +#define REG_RESP_SIFS_OFDM_8723B 0x063E +#define REG_ACKTO_8723B 0x0640 +#define REG_CTS2TO_8723B 0x0641 +#define REG_EIFS_8723B 0x0642 + +#define REG_NAV_UPPER_8723B 0x0652 // unit of 128 +#define REG_RTR_8723B 0x0662 +#define REG_TRXPTCL_CTL_8723B 0x0668 + +// Security +#define REG_CAMCMD_8723B 0x0670 +#define REG_CAMWRITE_8723B 0x0674 +#define REG_CAMREAD_8723B 0x0678 +#define REG_CAMDBG_8723B 0x067C +#define REG_SECCFG_8723B 0x0680 + +// Power +#define REG_WOW_CTRL_8723B 0x0690 +#define REG_PS_RX_INFO_8723B 0x0692 +#define REG_UAPSD_TID_8723B 0x0693 +#define REG_WKFMCAM_CMD_8723B 0x0698 +#define REG_WKFMCAM_NUM_8723B 0x0698 +#define REG_WKFMCAM_RWD_8723B 0x069C +#define REG_RXFLTMAP0_8723B 0x06A0 +#define REG_RXFLTMAP1_8723B 0x06A2 +#define REG_RXFLTMAP2_8723B 0x06A4 +#define REG_BCN_PSR_RPT_8723B 0x06A8 +#define REG_BT_COEX_TABLE_8723B 0x06C0 +#define REG_BFMER0_INFO_8723B 0x06E4 +#define REG_BFMER1_INFO_8723B 0x06EC +#define REG_CSI_RPT_PARAM_BW20_8723B 0x06F4 +#define REG_CSI_RPT_PARAM_BW40_8723B 0x06F8 +#define REG_CSI_RPT_PARAM_BW80_8723B 0x06FC + +// Hardware Port 2 +#define REG_MACID1_8723B 0x0700 +#define REG_BSSID1_8723B 0x0708 +#define REG_BFMEE_SEL_8723B 0x0714 +#define REG_SND_PTCL_CTRL_8723B 0x0718 + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +/* +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + + +// For normal chip +#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61 +#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63 +#define REG_NORMAL_SIE_OPTIONAL 0xFE64 +#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67 +#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B +#define REG_NORMAL_SIE_OPTIONAL2 0xFE6C +#define REG_NORMAL_SIE_GPS_EP 0xFE6D // 0xFE6D, for RTL8723 only. +#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF +*/ + +//----------------------------------------------------- +// +// Redifine 8192C register definition for compatibility +// +//----------------------------------------------------- + +// TODO: use these definition when using REG_xxx naming rule. +// NOTE: DO NOT Remove these definition. Use later. +#define EFUSE_CTRL_8723B REG_EFUSE_CTRL_8723B // E-Fuse Control. +#define EFUSE_TEST_8723B REG_EFUSE_TEST_8723B // E-Fuse Test. +#define MSR_8723B (REG_CR_8723B + 2) // Media Status register +#define ISR_8723B REG_HISR0_8723B +#define TSFR_8723B REG_TSFTR_8723B // Timing Sync Function Timer Register. + +#define PBP_8723B REG_PBP_8723B + +// Redifine MACID register, to compatible prior ICs. +#define IDR0_8723B REG_MACID_8723B // MAC ID Register, Offset 0x0050-0x0053 +#define IDR4_8723B (REG_MACID_8723B + 4) // MAC ID Register, Offset 0x0054-0x0055 + + +// +// 9. Security Control Registers (Offset: ) +// +#define RWCAM_8723B REG_CAMCMD_8723B //IN 8190 Data Sheet is called CAMcmd +#define WCAMI_8723B REG_CAMWRITE_8723B // Software write CAM input content +#define RCAMO_8723B REG_CAMREAD_8723B // Software read/write CAM config +#define CAMDBG_8723B REG_CAMDBG_8723B +#define SECR_8723B REG_SECCFG_8723B //Security Configuration Register + +/* + +// Unused register +#define UnusedRegister 0x1BF +#define DCAM UnusedRegister +#define PSR UnusedRegister +#define BBAddr UnusedRegister +#define PhyDataR UnusedRegister + + + +//---------------------------------------------------------------------------- +// 8192C Cmd9346CR bits (Offset 0xA, 16bit) +//---------------------------------------------------------------------------- +#define CmdEEPROM_En BIT5 // EEPROM enable when set 1 +#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 +#define Cmd9346CR_9356SEL BIT4 + +//---------------------------------------------------------------------------- +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) +//---------------------------------------------------------------------------- +#define GPIOSEL_GPIO BIT0 +#define GPIOSEL_ENBT BIT5 + +//---------------------------------------------------------------------------- +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) +//---------------------------------------------------------------------------- +#define GPIO_IN REG_GPIO_PIN_CTRL_8195 // GPIO pins input value +#define GPIO_OUT (REG_GPIO_PIN_CTRL_8195+1) // GPIO pins output value +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL_8195+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. +#define GPIO_MOD (REG_GPIO_PIN_CTRL_8195+3) +#define HAL_8192C_HW_GPIO_WPS_BIT BIT2 + +//---------------------------------------------------------------------------- +// 8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte) +//---------------------------------------------------------------------------- +#define HSIMR_GPIO12_0_INT_EN BIT0 +#define HSIMR_SPS_OCP_INT_EN BIT5 +#define HSIMR_RON_INT_EN BIT6 +#define HSIMR_PDN_INT_EN BIT7 +#define HSIMR_GPIO9_INT_EN BIT25 + + +//---------------------------------------------------------------------------- +// 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) +//---------------------------------------------------------------------------- +#define HSISR_GPIO12_0_INT BIT0 +#define HSISR_SPS_OCP_INT BIT5 +#define HSISR_RON_INT_EN BIT6 +#define HSISR_PDNINT BIT7 +#define HSISR_GPIO9_INT BIT25 + +//---------------------------------------------------------------------------- +// 8195 (MSR) Media Status Register (Offset 0x4C, 8 bits) +//---------------------------------------------------------------------------- +#define MSR_NOLINK 0x00 +#define MSR_ADHOC 0x01 +#define MSR_INFRA 0x02 +#define MSR_AP 0x03 + +//---------------------------------------------------------------------------- +// 88EU (MSR) Media Status Register (Offset 0x4C, 8 bits) +//---------------------------------------------------------------------------- +#define USB_INTR_CONTENT_HISR_OFFSET 48 +#define USB_INTR_CONTENT_HISRE_OFFSET 52 + + +// +// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF) +// +//---------------------------------------------------------------------------- +// 8192C Response Rate Set Register (offset 0x181, 24bits) +//---------------------------------------------------------------------------- +#define RRSR_1M BIT0 +#define RRSR_2M BIT1 +#define RRSR_5_5M BIT2 +#define RRSR_11M BIT3 +#define RRSR_6M BIT4 +#define RRSR_9M BIT5 +#define RRSR_12M BIT6 +#define RRSR_18M BIT7 +#define RRSR_24M BIT8 +#define RRSR_36M BIT9 +#define RRSR_48M BIT10 +#define RRSR_54M BIT11 +#define RRSR_MCS0 BIT12 +#define RRSR_MCS1 BIT13 +#define RRSR_MCS2 BIT14 +#define RRSR_MCS3 BIT15 +#define RRSR_MCS4 BIT16 +#define RRSR_MCS5 BIT17 +#define RRSR_MCS6 BIT18 +#define RRSR_MCS7 BIT19 + + +//---------------------------------------------------------------------------- +// 8192C Response Rate Set Register (offset 0x1BF, 8bits) +//---------------------------------------------------------------------------- +// WOL bit information +#define HAL92C_WOL_PTK_UPDATE_EVENT BIT0 +#define HAL92C_WOL_GTK_UPDATE_EVENT BIT1 + + +//---------------------------------------------------------------------------- +// 8192C Rate Definition +//---------------------------------------------------------------------------- +//CCK +#define RATR_1M 0x00000001 +#define RATR_2M 0x00000002 +#define RATR_55M 0x00000004 +#define RATR_11M 0x00000008 +//OFDM +#define RATR_6M 0x00000010 +#define RATR_9M 0x00000020 +#define RATR_12M 0x00000040 +#define RATR_18M 0x00000080 +#define RATR_24M 0x00000100 +#define RATR_36M 0x00000200 +#define RATR_48M 0x00000400 +#define RATR_54M 0x00000800 +//MCS 1 Spatial Stream +#define RATR_MCS0 0x00001000 +#define RATR_MCS1 0x00002000 +#define RATR_MCS2 0x00004000 +#define RATR_MCS3 0x00008000 +#define RATR_MCS4 0x00010000 +#define RATR_MCS5 0x00020000 +#define RATR_MCS6 0x00040000 +#define RATR_MCS7 0x00080000 +//MCS 2 Spatial Stream +#define RATR_MCS8 0x00100000 +#define RATR_MCS9 0x00200000 +#define RATR_MCS10 0x00400000 +#define RATR_MCS11 0x00800000 +#define RATR_MCS12 0x01000000 +#define RATR_MCS13 0x02000000 +#define RATR_MCS14 0x04000000 +#define RATR_MCS15 0x08000000 + + +// NOTE: For 92CU - Ziv +//CCK +#define RATE_1M BIT(0) +#define RATE_2M BIT(1) +#define RATE_5_5M BIT(2) +#define RATE_11M BIT(3) +//OFDM +#define RATE_6M BIT(4) +#define RATE_9M BIT(5) +#define RATE_12M BIT(6) +#define RATE_18M BIT(7) +#define RATE_24M BIT(8) +#define RATE_36M BIT(9) +#define RATE_48M BIT(10) +#define RATE_54M BIT(11) +//MCS 1 Spatial Stream +#define RATE_MCS0 BIT(12) +#define RATE_MCS1 BIT(13) +#define RATE_MCS2 BIT(14) +#define RATE_MCS3 BIT(15) +#define RATE_MCS4 BIT(16) +#define RATE_MCS5 BIT(17) +#define RATE_MCS6 BIT(18) +#define RATE_MCS7 BIT(19) +//MCS 2 Spatial Stream +#define RATE_MCS8 BIT(20) +#define RATE_MCS9 BIT(21) +#define RATE_MCS10 BIT(22) +#define RATE_MCS11 BIT(23) +#define RATE_MCS12 BIT(24) +#define RATE_MCS13 BIT(25) +#define RATE_MCS14 BIT(26) +#define RATE_MCS15 BIT(27) + + + + +// ALL CCK Rate +#define RATE_ALL_CCK RATR_1M|RATR_2M|RATR_55M|RATR_11M +#define RATE_ALL_OFDM_AG RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\ + RATR_36M|RATR_48M|RATR_54M +#define RATE_ALL_OFDM_1SS RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\ + RATR_MCS4|RATR_MCS5|RATR_MCS6 |RATR_MCS7 +#define RATE_ALL_OFDM_2SS RATR_MCS8|RATR_MCS9 |RATR_MCS10|RATR_MCS11|\ + RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15 + +#define RATE_BITMAP_ALL 0xFFFFF + +// Only use CCK 1M rate for ACK +#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 +//---------------------------------------------------------------------------- +// 8192C BW_OPMODE bits (Offset 0x203, 8bit) +//---------------------------------------------------------------------------- +#define BW_OPMODE_20MHZ BIT2 +#define BW_OPMODE_5G BIT1 + +// +// 10. Power Save Control Registers (Offset: 0x0260 - 0x02DF) +// +#define WOW_PMEN BIT0 // Power management Enable. +#define WOW_WOMEN BIT1 // WoW function on or off. +#define WOW_MAGIC BIT2 // Magic packet +#define WOW_UWF BIT3 // Unicast Wakeup frame. + +*/ + +//---------------------------------------------------------------------------- +// 8195 IMR/ISR bits (offset 0x80, 8bits) +//---------------------------------------------------------------------------- +#define IMR_WL_FTINT_MSK_8195A BIT31 //The interrupt mask from WL page 1 interrupt source +#define IMR_TSF_BIT32_TOGGLE_MSK_V1_8195A BIT10 //Enable TSF_BIT32_TOGGLE interrupt source +#define IMR_P2P_RFOFF_INT_MSK_8195A BIT9 //P2P NoA RF off time indication interrupt mask +#define IMR_P2P_RFON_INT_MSK_8195A BIT8 //P2P NoA RF on time indication interrupt mask +#define IMR_PSTIMER_MSK_8195A BIT6 //Enable PSTimer interrupt source +#define IMR_TIMEOUT1_MSK_8195A BIT5 //Enable Timer1 interrupt source +#define IMR_TIMEOUT0_MSK_8195A BIT4 //Enable Timer0 interrupt source +#define IMR_MTI_BCNIVLEAR_INT_MSK_8195A BIT1 //Enable MTI_BCNIVLEAR _INT +#define IMR_BCNERLY_MSK_8195A BIT0 //This interrupt is issued at the time set by DRVERLYINT register before TBTT time. + + +//---------------------------------------------------------------------------- +// 8195 IMR/ISR bits (offset 0x134, 8bits) +//---------------------------------------------------------------------------- +#define IMR_SOUND_DONE_MSK_8195A BIT30 //Be a beamformer, this interrupt is issued at the time after sounding finish +#define IMR_TRY_DONE_MSK_8195A BIT29 //When TRY_FINISH is deasserted, this interrupt is issued to inform MCU +#define IMR_TXRPT_CNT_FULL_MSK_8195A BIT28 +#define IMR_WLACTOFF_INT_EN_8195A BIT27 +#define IMR_WLACTON_INT_EN_8195A BIT26 +#define IMR_TXPKTIN_INT_EN_8195A BIT25 +#define IMR_TXBCN0OK_8195A BIT24 // Transmit Beacon0 OK +#define IMR_TXBCN0ERR_8195A BIT23 // Transmit Beacon0 Error +#define IMR_RX_UMD0_EN_8195A BIT22 +#define IMR_RX_UMD1_EN_8195A BIT21 +#define IMR_RX_BMD0_EN_8195A BIT20 +#define IMR_RX_BMD1_EN_8195A BIT19 +#define IMR_BCN_RX_INT_EN_8195A BIT18 +#define IMR_TBTTINT_MSK_8195A BIT17 + +#define IMR_BCNDMA7_MSK_8195A BIT15 //When BCNDMA interval arrives before TBTT7, + //this interrupt informs MCU to prepare related beacon tasks. +#define IMR_BCNDMA6_MSK_8195A BIT14 //When BCNDMA interval arrives before TBTT6, + //this interrupt informs MCU to prepare related beacon tasks. +#define IMR_BCNDMA5_MSK_8195A BIT13 //When BCNDMA interval arrives before TBTT5, + //this interrupt informs MCU to prepare related beacon tasks. +#define IMR_BCNDMA4_MSK_8195A BIT12 //When BCNDMA interval arrives before TBTT4, + //this interrupt informs MCU to prepare related beacon tasks. +#define IMR_BCNDMA3_MSK_8195A BIT11 //When BCNDMA interval arrives before TBTT3, + //this interrupt informs MCU to prepare related beacon tasks. +#define IMR_BCNDMA2_MSK_8195A BIT10 //When BCNDMA interval arrives before TBTT2, + //this interrupt informs MCU to prepare related beacon tasks. +#define IMR_BCNDMA1_MSK_8195A BIT9 //When BCNDMA interval arrives before TBTT1, + //this interrupt informs MCU to prepare related beacon tasks. +#define IMR_BCNDMA0_MSK_8195A BIT8 //When BCNDMA interval arrives before TBTT0, + //this interrupt informs MCU to prepare related beacon tasks. +#define IMR_STBY_MSK_8195A BIT7 //Lower Power Standby Interrupt mask +#define IMR_CTWEndINT_MSK_8195A BIT6 //This bit masks the CTWindow End interrupt. +#define IMR_TXFOVW_MSK_8195A BIT5 //"Transmit packet buffer Overflow.This bit is set to 1 when one or more of the hardware transmit queues is full" +#define IMR_FOVW_MSK_8195A BIT4 //"Rx packet buffer OverflowSet this bit to one when Rx packet buffer write pointer hits read pointer. " +#define IMR_RXDONE_MSK_8195A BIT3 //Rx Packet done for 8051 +#define IMR_ERRORHDL_MSK_8195A BIT2 //FWHW/ TXDMA/ RXDMA/ WMAC error status interrupt +#define IMR_TXCCX_MSK_FW_8195A BIT1 //CCX PKT TX Report Interrupt +#define IMR_TXCLOSE_MSK_8195A BIT0 //TX Finish (Ack/BA process Finish) Interrupt. + + +//---------------------------------------------------------------------------- +// 8195 IMR/ISR bits (offset 0x3EC, 8bits) +//---------------------------------------------------------------------------- +#define IMR_BCNDERR7_8195A BIT31 // Beacon Queue DMA Error +#define IMR_BCNDERR6_8195A BIT30 // Beacon Queue DMA Error +#define IMR_BCNDERR5_8195A BIT29 // Beacon Queue DMA Error +#define IMR_BCNDERR4_8195A BIT28 // Beacon Queue DMA Error +#define IMR_BCNDERR3_8195A BIT27 // Beacon Queue DMA Error +#define IMR_BCNDERR2_8195A BIT26 // Beacon Queue DMA Error +#define IMR_BCNDERR1_8195A BIT25 // Beacon Queue DMA Error +#define IMR_BCNDERR0_8195A BIT24 // Beacon Queue DMA Error +#define IMR_BCNDMAOK7_8195A BIT23 // Beacon DMA OK Interrupt 7 +#define IMR_BCNDMAOK6_8195A BIT22 // Beacon DMA OK Interrupt 6 +#define IMR_BCNDMAOK5_8195A BIT21 // Beacon DMA OK Interrupt 5 +#define IMR_BCNDMAOK4_8195A BIT20 // Beacon DMA OK Interrupt 4 +#define IMR_BCNDMAOK3_8195A BIT19 // Beacon DMA OK Interrupt 3 +#define IMR_BCNDMAOK2_8195A BIT18 // Beacon DMA OK Interrupt 2 +#define IMR_BCNDMAOK1_8195A BIT17 // Beacon DMA OK Interrupt 1 +#define IMR_BCNDMAOK0_8195A BIT16 // Beacon DMA OK Interrupt 0 +#define IMR_H7DOK_8195A BIT15 // High Queue DMA OK Interrup 7 +#define IMR_H6DOK_8195A BIT14 // High Queue DMA OK Interrup 6 +#define IMR_H5DOK_8195A BIT13 // High Queue DMA OK Interrup 5 +#define IMR_H4DOK_8195A BIT12 // High Queue DMA OK Interrup 4 +#define IMR_H3DOK_8195A BIT11 // High Queue DMA OK Interrup 3 +#define IMR_H2DOK_8195A BIT10 // High Queue DMA OK Interrup 2 +#define IMR_H1DOK_8195A BIT9 // High Queue DMA OK Interrup 1 +#define IMR_H0DOK_8195A BIT8 // High Queue DMA OK Interrup 1 +#define IMR_MGNTDOK_8195A BIT6 // Management Queue DMA OK +#define IMR_BKDOK_8195A BIT5 // AC_BK DMA OK +#define IMR_BEDOK_8195A BIT4 // AC_BE DMA OK +#define IMR_VIDOK_8195A BIT3 // AC_VI DMA OK +#define IMR_VODOK_8195A BIT2 // AC_VO DMA OK +#define IMR_RDU_8195A BIT1 // Rx Descriptor Unavailable +#define IMR_ROK_8195A BIT0 // Receive DMA OK + + + + + + + +/*=================================================================== +===================================================================== +Here the register defines are for 92C. When the define is as same with 92C, +we will use the 92C's define for the consistency +So the following defines for 92C is not entire!!!!!! +===================================================================== +=====================================================================*/ +/* +Based on Datasheet V33---090401 +Register Summary +Current IOREG MAP +0x0000h ~ 0x00FFh System Configuration (256 Bytes) +0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) +0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) +0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) +0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) +0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) +0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) +0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) +0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) +*/ +//---------------------------------------------------------------------------- +// 8195 (TXPAUSE) transmission pause (Offset 0x522, 8 bits) +//---------------------------------------------------------------------------- +/* +#define StopBecon BIT6 +#define StopHigh BIT5 +#define StopMgt BIT4 +#define StopVO BIT3 +#define StopVI BIT2 +#define StopBE BIT1 +#define StopBK BIT0 +*/ + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +/*#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + +#define REG_USB_HRPWM 0xFE58 +#define REG_USB_HCPWM 0xFE57 + +//2 USB Information (0xFE17) +#define USB_IS_HIGH_SPEED 0 +#define USB_IS_FULL_SPEED 1 +#define USB_SPEED_MASK BIT(5) + +#define USB_NORMAL_SIE_EP_MASK 0xF +#define USB_NORMAL_SIE_EP_SHIFT 4 + +//2 Special Option +#define USB_AGG_EN BIT(3) + +*/ +//============================================================================ +// 8192C Regsiter Bit and Content definition +//============================================================================ +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +/* +//2 SYS_ISO_CTRL +#define ISO_MD2PP BIT(0) +#define ISO_UA2USB BIT(1) +#define ISO_UD2CORE BIT(2) +#define ISO_PA2PCIE BIT(3) +#define ISO_PD2CORE BIT(4) +#define ISO_IP2MAC BIT(5) +#define ISO_DIOP BIT(6) +#define ISO_DIOE BIT(7) +#define ISO_EB2CORE BIT(8) +#define ISO_DIOR BIT(9) +#define PWC_EV12V BIT(15) + + +//2 SYS_FUNC_EN +#define FEN_BBRSTB BIT(0) +#define FEN_BB_GLB_RSTn BIT(1) +#define FEN_USBA BIT(2) +#define FEN_UPLL BIT(3) +#define FEN_USBD BIT(4) +#define FEN_DIO_PCIE BIT(5) +#define FEN_PCIEA BIT(6) +#define FEN_PPLL BIT(7) +#define FEN_PCIED BIT(8) +#define FEN_DIOE BIT(9) +#define FEN_CPUEN BIT(10) +#define FEN_DCORE BIT(11) +#define FEN_ELDR BIT(12) +#define FEN_DIO_RF BIT(13) +#define FEN_HWPDN BIT(14) +#define FEN_MREGEN BIT(15) + +//2 APS_FSMCO +#define PFM_LDALL BIT(0) +#define PFM_ALDN BIT(1) +#define PFM_LDKP BIT(2) +#define PFM_WOWL BIT(3) +#define EnPDN BIT(4) +#define PDN_PL BIT(5) +#define APFM_ONMAC BIT(8) +#define APFM_OFF BIT(9) +#define APFM_RSM BIT(10) +#define AFSM_HSUS BIT(11) +#define AFSM_PCIE BIT(12) +#define APDM_MAC BIT(13) +#define APDM_HOST BIT(14) +#define APDM_HPDN BIT(15) +#define RDY_MACON BIT(16) +#define SUS_HOST BIT(17) +#define ROP_ALD BIT(20) +#define ROP_PWR BIT(21) +#define ROP_SPS BIT(22) +#define SOP_MRST BIT(25) +#define SOP_FUSE BIT(26) +#define SOP_ABG BIT(27) +#define SOP_AMB BIT(28) +#define SOP_RCK BIT(29) +#define SOP_A8M BIT(30) +#define XOP_BTCK BIT(31) + +//2 SYS_CLKR +#define ANAD16V_EN BIT(0) +#define ANA8M BIT(1) +#define MACSLP BIT(4) +#define LOADER_CLK_EN BIT(5) + + +//2 9346CR + +#define BOOT_FROM_EEPROM BIT(4) +#define EEPROM_EN BIT(5) + + +//2 RF_CTRL +#define RF_EN BIT(0) +#define RF_RSTB BIT(1) +#define RF_SDMRSTB BIT(2) + +//2 LDOV12D_CTRL +#define LDV12_EN BIT(0) +#define LDV12_SDBY BIT(1) +#define LPLDO_HSM BIT(2) +#define LPLDO_LSM_DIS BIT(3) +#define _LDV12_VADJ(x) (((x) & 0xF) << 4) + + +//2 EFUSE_TEST (For RTL8723 partially) +#define EF_TRPT BIT(7) +#define EF_CELL_SEL (BIT(8)|BIT(9)) // 00: Wifi Efuse, 01: BT Efuse0, 10: BT Efuse1, 11: BT Efuse2 +#define LDOE25_EN BIT(31) +#define EFUSE_SEL(x) (((x) & 0x3) << 8) +#define EFUSE_SEL_MASK 0x300 +#define EFUSE_WIFI_SEL_0 0x0 +#define EFUSE_BT_SEL_0 0x1 +#define EFUSE_BT_SEL_1 0x2 +#define EFUSE_BT_SEL_2 0x3 + + +//2 8051FWDL +//2 MCUFWDL +#define MCUFWDL_EN BIT(0) +#define MCUFWDL_RDY BIT(1) +#define FWDL_ChkSum_rpt BIT(2) +#define MACINI_RDY BIT(3) +#define BBINI_RDY BIT(4) +#define RFINI_RDY BIT(5) +#define WINTINI_RDY BIT(6) +#define RAM_DL_SEL BIT(7) +#define ROM_DLEN BIT(19) +#define CPRST BIT(23) + + + +//2 REG_SYS_CFG +#define XCLK_VLD BIT(0) +#define ACLK_VLD BIT(1) +#define UCLK_VLD BIT(2) +#define PCLK_VLD BIT(3) +#define PCIRSTB BIT(4) +#define V15_VLD BIT(5) +#define TRP_B15V_EN BIT(7) +#define SIC_IDLE BIT(8) +#define BD_MAC2 BIT(9) +#define BD_MAC1 BIT(10) +#define IC_MACPHY_MODE BIT(11) +#define CHIP_VER (BIT(12)|BIT(13)|BIT(14)|BIT(15)) +#define BT_FUNC BIT(16) +#define VENDOR_ID BIT(19) +#define PAD_HWPD_IDN BIT(22) +#define TRP_VAUX_EN BIT(23) // RTL ID +#define TRP_BT_EN BIT(24) +#define BD_PKG_SEL BIT(25) +#define BD_HCI_SEL BIT(26) +#define TYPE_ID BIT(27) + +#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15 +#define CHIP_VER_RTL_SHIFT 12 + +*/ +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +/* + +//2 Function Enable Registers +//2 CR 0x0100-0x0103 + + +#define HCI_TXDMA_EN BIT(0) +#define HCI_RXDMA_EN BIT(1) +#define TXDMA_EN BIT(2) +#define RXDMA_EN BIT(3) +#define PROTOCOL_EN BIT(4) +#define SCHEDULE_EN BIT(5) +#define MACTXEN BIT(6) +#define MACRXEN BIT(7) +#define ENSWBCN BIT(8) +#define ENSEC BIT(9) +#define CALTMR_EN BIT(10) // 32k CAL TMR enable + +// Network type +#define _NETTYPE(x) (((x) & 0x3) << 16) +#define MASK_NETTYPE 0x30000 +#define NT_NO_LINK 0x0 +#define NT_LINK_AD_HOC 0x1 +#define NT_LINK_AP 0x2 +#define NT_AS_AP 0x3 + + +//2 PBP - Page Size Register 0x0104 +#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) +#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) +#define _PSRX_MASK 0xF +#define _PSTX_MASK 0xF0 +#define _PSRX(x) (x) +#define _PSTX(x) ((x) << 4) + +#define PBP_64 0x0 +#define PBP_128 0x1 +#define PBP_256 0x2 +#define PBP_512 0x3 +#define PBP_1024 0x4 + + +//2 TX/RXDMA 0x010C +#define RXDMA_ARBBW_EN BIT(0) +#define RXSHFT_EN BIT(1) +#define RXDMA_AGG_EN BIT(2) +#define QS_VO_QUEUE BIT(8) +#define QS_VI_QUEUE BIT(9) +#define QS_BE_QUEUE BIT(10) +#define QS_BK_QUEUE BIT(11) +#define QS_MANAGER_QUEUE BIT(12) +#define QS_HIGH_QUEUE BIT(13) + +#define HQSEL_VOQ BIT(0) +#define HQSEL_VIQ BIT(1) +#define HQSEL_BEQ BIT(2) +#define HQSEL_BKQ BIT(3) +#define HQSEL_MGTQ BIT(4) +#define HQSEL_HIQ BIT(5) + +// For normal driver, 0x10C +#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) +#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) +#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10) +#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 ) +#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 ) +#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 ) + +#define QUEUE_LOW 1 +#define QUEUE_NORMAL 2 +#define QUEUE_HIGH 3 + + +//2 REG_C2HEVT_CLEAR 0x01AF +#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message +#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver. + + + +//2 LLT_INIT 0x01E0 +#define _LLT_NO_ACTIVE 0x0 +#define _LLT_WRITE_ACCESS 0x1 +#define _LLT_READ_ACCESS 0x2 + +#define _LLT_INIT_DATA(x) ((x) & 0xFF) +#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) +#define _LLT_OP(x) (((x) & 0x3) << 30) +#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) + +*/ +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +/* +//2 TDECTL 0x0208 +#define BLK_DESC_NUM_SHIFT 4 +#define BLK_DESC_NUM_MASK 0xF + + +//2 TXDMA_OFFSET_CHK 0x020C +#define DROP_DATA_EN BIT(9) +*/ +//----------------------------------------------------- +// +// 0x0280h ~ 0x028Bh RX DMA Configuration +// +//----------------------------------------------------- +/* +//2 REG_RXDMA_CONTROL, 0x0286h + +// Write only. When this bit is set, RXDMA will decrease RX PKT counter by one. Before +// this bit is polled, FW shall update RXFF_RD_PTR first. This register is write pulse and auto clear. +#define RXPKT_RELEASE_POLL BIT(0) +// Read only. When RXMA finishes on-going DMA operation, RXMDA will report idle state in +// this bit. FW can start releasing packets after RXDMA entering idle mode. +#define RXDMA_IDLE BIT(1) +// When this bit is set, RXDMA will enter this mode after on-going RXDMA packet to host +// completed, and stop DMA packet to host. RXDMA will then report Default: 0; +#define RW_RELEASE_EN BIT(2) +*/ +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +/* +//2 FWHW_TXQ_CTRL 0x0420 +#define EN_AMPDU_RTY_NEW BIT(7) + + +//2 REG_LIFECTRL_CTRL 0x0426 +#define HAL92C_EN_PKT_LIFE_TIME_BK BIT3 +#define HAL92C_EN_PKT_LIFE_TIME_BE BIT2 +#define HAL92C_EN_PKT_LIFE_TIME_VI BIT1 +#define HAL92C_EN_PKT_LIFE_TIME_VO BIT0 + +#define HAL92C_MSDU_LIFE_TIME_UNIT 128 // in us, said by Tim. + + +//2 SPEC SIFS 0x0428 +#define _SPEC_SIFS_CCK(x) ((x) & 0xFF) +#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) + +//2 RL 0x042A +#define RETRY_LIMIT_SHORT_SHIFT 8 +#define RETRY_LIMIT_LONG_SHIFT 0 + +#define _LRL(x) ((x) & 0x3F) +#define _SRL(x) (((x) & 0x3F) << 8) +*/ + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +/* +//2 EDCA setting 0x050C +#define AC_PARAM_TXOP_LIMIT_OFFSET 16 +#define AC_PARAM_ECW_MAX_OFFSET 12 +#define AC_PARAM_ECW_MIN_OFFSET 8 +#define AC_PARAM_AIFS_OFFSET 0 + + +//2 BCN_CTRL 0x0550 +#define EN_TXBCN_RPT BIT(2) +#define EN_BCN_FUNCTION BIT(3) + +//2 TxPause 0x0522 +#define STOP_BCNQ BIT(6) +*/ + + +//2 ACMHWCTRL 0x05C0 +#define AcmHw_HwEn_8723B BIT(0) +#define AcmHw_VoqEn_8723B BIT(1) +#define AcmHw_ViqEn_8723B BIT(2) +#define AcmHw_BeqEn_8723B BIT(3) +#define AcmHw_VoqStatus_8723B BIT(5) +#define AcmHw_ViqStatus_8723B BIT(6) +#define AcmHw_BeqStatus_8723B BIT(7) + + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + + +//2 TCR 0x0604 +#define DIS_GCLK BIT(1) +#define PAD_SEL BIT(2) +#define PWR_ST BIT(6) +#define PWRBIT_OW_EN BIT(7) +#define ACRC BIT(8) +#define CFENDFORM BIT(9) +#define ICV BIT(10) + + +//---------------------------------------------------------------------------- +// 8195 (RCR) Receive Configuration Register (Offset 0x608, 32 bits) +//---------------------------------------------------------------------------- +/* +#define RCR_APPFCS BIT31 // WMAC append FCS after pauload +#define RCR_APP_MIC BIT30 // MACRX will retain the MIC at the bottom of the packet. +#define RCR_APP_ICV BIT29 // MACRX will retain the ICV at the bottom of the packet. +#define RCR_APP_PHYST_RXFF BIT28 // HY Status is appended before RX packet in RXFF +#define RCR_APP_BA_SSN BIT27 // SSN of previous TXBA is appended as after original RXDESC as the 4-th DW of RXDESC. +#define RCR_RSVD_BIT26 BIT26 // Reserved +*/ +#define RCR_TCPOFLD_EN BIT25 // Enable TCP checksum offload +/*#define RCR_ENMBID BIT24 // Enable Multiple BssId. Only response ACK to the packets whose DID(A1) matching to the addresses in the MBSSID CAM Entries. +#define RCR_LSIGEN BIT23 // Enable LSIG TXOP Protection function. Search KEYCAM for each rx packet to check if LSIGEN bit is set. +#define RCR_MFBEN BIT22 // Enable immediate MCS Feedback function. When Rx packet with MRQ = 1'b1, then search KEYCAM to find sender's MCS Feedback function and send response. +*/ +#define RCR_MAC_RESET BIT19 // WMAC clock stop and reset after BB transmitting end, 0: enable, 1: disable. +#define RCR_TIM_PARSER_EN BIT18 // RX Beacon TIM Parser. +#define RCR_BM_DATA_EN BIT17 // Broadcast data packet interrupt enable. +#define RCR_UC_DATA_EN BIT16 // Unicast data packet interrupt enable. + +/*#define RCR_HTC_LOC_CTRL BIT14 // MFC<--HTC=1 MFC-->HTC=0 +#define RCR_AMF BIT13 // Accept management type frame +#define RCR_ACF BIT12 // Accept control type frame. Control frames BA, BAR, and PS-Poll (when in AP mode) are not controlled by this bit. They are controlled by ADF. +#define RCR_ADF BIT11 // Accept data type frame. This bit also regulates BA, BAR, and PS-Poll (AP mode only). +*/ +/*#define RCR_AICV BIT9 // Accept ICV error packet +#define RCR_ACRC32 BIT8 // Accept CRC32 error packet +#define RCR_CBSSID_BCN BIT7 // Accept BSSID match packet (Rx beacon, probe rsp) +#define RCR_CBSSID_DATA BIT6 // Accept BSSID match packet (Data) +#define RCR_CBSSID RCR_CBSSID_DATA // Accept BSSID match packet +#define RCR_APWRMGT BIT5 // Accept power management packet +#define RCR_ADD3 BIT4 // Accept address 3 match packet +#define RCR_AB BIT3 // Accept broadcast packet +#define RCR_AM BIT2 // Accept multicast packet +#define RCR_APM BIT1 // Accept physical match packet +#define RCR_AAP BIT0 // Accept all unicast packet + +#define AAP BIT(0) +#define APM BIT(1) +#define AM BIT(2) +#define AB BIT(3) +#define ADD3 BIT(4) +#define APWRMGT BIT(5) +#define CBSSID BIT(6) +#define CBSSID_DATA BIT(6) +#define CBSSID_BCN BIT(7) +#define ACRC32 BIT(8) +#define AICV BIT(9) +#define ADF BIT(11) +#define ACF BIT(12) +#define AMF BIT(13) +#define HTC_LOC_CTRL BIT(14) +#define UC_DATA_EN BIT(16) +#define BM_DATA_EN BIT(17) +#define MFBEN BIT(22) +#define LSIGEN BIT(23) +#define EnMBID BIT(24) +#define APP_BASSN BIT(27) +#define APP_PHYSTS BIT(28) +#define APP_ICV BIT(29) +#define APP_MIC BIT(30) +*/ + +//---------------------------------------------------------------------------- +// 8195 CAM Config Setting (offset 0x680, 1 byte) +//---------------------------------------------------------------------------- +/* +#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key +#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key +#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption +#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption +#define SCR_SKByA2 BIT(4) //Search kEY BY A2 +#define SCR_NoSKMC BIT(5) //No Key Search Multicast +#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key +#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key + +#define CAM_NONE 0x0 +#define CAM_WEP40 0x01 +#define CAM_TKIP 0x02 +#define CAM_AES 0x04 +#define CAM_WEP104 0x05 +#define CAM_SMS4 0x6 + +#define TOTAL_CAM_ENTRY 32 +#define HALF_CAM_ENTRY 16 + +#define CAM_CONFIG_USEDK TRUE +#define CAM_CONFIG_NO_USEDK FALSE + + +#define SCR_UseDK 0x01 +#define SCR_TxSecEnable 0x02 +#define SCR_RxSecEnable 0x04 +*/ + +//---------------------------------------------------------------------------- +// 8195 REG_BCN_PSR_RPT (Beacon Parser Report Register) (Offset 0x6A8, 32 bits) +//---------------------------------------------------------------------------- + +#define PS_TIM BIT14 +#define PS_DTIM BIT15 + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h RTL8723 SDIO Configuration +// +//----------------------------------------------------- +/* +//SDIO host local register space mapping. +#define SDIO_LOCAL_MSK 0x0FFF +#define WLAN_IOREG_MSK 0x7FFF +#define WLAN_FIFO_MSK 0x1FFF // Aggregation Length[12:0] + +#define SDIO_WITHOUT_REF_DEVICE_ID 0 // Without reference to the SDIO Device ID +#define SDIO_LOCAL_DEVICE_ID 0 // 0b[16], 000b[15:13] +#define WLAN_TX_HIQ_DEVICE_ID 4 // 0b[16], 100b[15:13] +#define WLAN_TX_MIQ_DEVICE_ID 5 // 0b[16], 101b[15:13] +#define WLAN_TX_LOQ_DEVICE_ID 6 // 0b[16], 110b[15:13] +#define WLAN_RX0FF_DEVICE_ID 7 // 0b[16], 111b[15:13] +#define WLAN_IOREG_DEVICE_ID 8 // 1b[16] + +//SDIO Tx Free Page Index +#define HI_QUEUE_IDX 0 +#define MID_QUEUE_IDX 1 +#define LOW_QUEUE_IDX 2 +#define PUBLIC_QUEUE_IDX 3 + +#define SDIO_REG_TX_CTRL 0x0000 // SDIO Tx Control +#define SDIO_REG_HIMR 0x0014 // SDIO Host Interrupt Mask +#define SDIO_REG_HISR 0x0018 // SDIO Host Interrupt Service Routine +#define SDIO_REG_HCPWM 0x0019 // HCI Current Power Mode +#define SDIO_REG_RX0_REQ_LEN 0x001C // RXDMA Request Length +#define SDIO_REG_FREE_TXPG 0x0020 // Free Tx Buffer Page +#define SDIO_REG_HCPWM1 0x0024 // HCI Current Power Mode 1 +#define SDIO_REG_HCPWM2 0x0026 // HCI Current Power Mode 2 +#define SDIO_REG_HTSFR_INFO 0x0030 // HTSF Informaion +#define SDIO_REG_HRPWM1 0x0080 // HCI Request Power Mode 1 +#define SDIO_REG_HRPWM2 0x0082 // HCI Request Power Mode 2 +#define SDIO_REG_HPS_CLKR 0x0084 // HCI Power Save Clock +#define SDIO_REG_HSUS_CTRL 0x0086 // SDIO HCI Suspend Control +#define SDIO_REG_HIMR_ON 0x0090 //SDIO Host Extension Interrupt Mask Always +#define SDIO_REG_HISR_ON 0x0091 //SDIO Host Extension Interrupt Status Always + +#define SDIO_HIMR_DISABLED 0 + +// RTL8723/RTL8188E SDIO Host Interrupt Mask Register +#define SDIO_HIMR_RX_REQUEST_MSK BIT0 +#define SDIO_HIMR_AVAL_MSK BIT1 +#define SDIO_HIMR_TXERR_MSK BIT2 +#define SDIO_HIMR_RXERR_MSK BIT3 +#define SDIO_HIMR_TXFOVW_MSK BIT4 +#define SDIO_HIMR_RXFOVW_MSK BIT5 +#define SDIO_HIMR_TXBCNOK_MSK BIT6 +#define SDIO_HIMR_TXBCNERR_MSK BIT7 +#define SDIO_HIMR_BCNERLY_INT_MSK BIT16 +#define SDIO_HIMR_C2HCMD_MSK BIT17 +#define SDIO_HIMR_CPWM1_MSK BIT18 +#define SDIO_HIMR_CPWM2_MSK BIT19 +#define SDIO_HIMR_HSISR_IND_MSK BIT20 +#define SDIO_HIMR_GTINT3_IND_MSK BIT21 +#define SDIO_HIMR_GTINT4_IND_MSK BIT22 +#define SDIO_HIMR_PSTIMEOUT_MSK BIT23 +#define SDIO_HIMR_OCPINT_MSK BIT24 +#define SDIO_HIMR_ATIMEND_MSK BIT25 +#define SDIO_HIMR_ATIMEND_E_MSK BIT26 +#define SDIO_HIMR_CTWEND_MSK BIT27 + +//RTL8188E SDIO Specific +#define SDIO_HIMR_MCU_ERR_MSK BIT28 +#define SDIO_HIMR_TSF_BIT32_TOGGLE_MSK BIT29 + +// SDIO Host Interrupt Service Routine +#define SDIO_HISR_RX_REQUEST BIT0 +#define SDIO_HISR_AVAL BIT1 +#define SDIO_HISR_TXERR BIT2 +#define SDIO_HISR_RXERR BIT3 +#define SDIO_HISR_TXFOVW BIT4 +#define SDIO_HISR_RXFOVW BIT5 +#define SDIO_HISR_TXBCNOK BIT6 +#define SDIO_HISR_TXBCNERR BIT7 +#define SDIO_HISR_BCNERLY_INT BIT16 +#define SDIO_HISR_C2HCMD BIT17 +#define SDIO_HISR_CPWM1 BIT18 +#define SDIO_HISR_CPWM2 BIT19 +#define SDIO_HISR_HSISR_IND BIT20 +#define SDIO_HISR_GTINT3_IND BIT21 +#define SDIO_HISR_GTINT4_IND BIT22 +#define SDIO_HISR_PSTIMEOUT BIT23 +#define SDIO_HISR_OCPINT BIT24 +#define SDIO_HISR_ATIMEND BIT25 +#define SDIO_HISR_ATIMEND_E BIT26 +#define SDIO_HISR_CTWEND BIT27 + +//RTL8188E SDIO Specific +#define SDIO_HISR_MCU_ERR BIT28 +#define SDIO_HISR_TSF_BIT32_TOGGLE BIT29 + + +// SDIO HCI Suspend Control Register +#define HCI_RESUME_PWR_RDY BIT1 +#define HCI_SUS_CTRL BIT0 + + +#if DEV_BUS_TYPE == RT_SDIO_INTERFACE + #define MAX_TX_AGG_PACKET_NUMBER 0x8 +#else + #define MAX_TX_AGG_PACKET_NUMBER 0xFF +#endif + +*/ +#endif // #ifndef __INC_HAL8195AREG_H diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/HalPhyRf_8195A.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/HalPhyRf_8195A.h new file mode 100644 index 0000000..3f22d3f --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/HalPhyRf_8195A.h @@ -0,0 +1,127 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __HAL_PHY_RF_8195A_H__ +#define __HAL_PHY_RF_8195A_H__ + + +/*--------------------------Define Parameters-------------------------------*/ +#define IQK_DELAY_TIME_8195A 10 //ms +#define IQK_DEFERRED_TIME_8195A 4 +#define index_mapping_NUM_8195A 15 +#define AVG_THERMAL_NUM_8195A 4 +#define RF_T_METER_8195A 0x42 // + + +void ConfigureTxpowerTrack_8195A( + PTXPWRTRACK_CFG pConfig + ); + +void DoIQK_8195A( + PDM_ODM_T pDM_Odm, + u1Byte DeltaThermalIndex, + u1Byte ThermalValue, + u1Byte Threshold + ); + +VOID +ODM_TxPwrTrackSetPwr_8195A( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath, + u1Byte ChannelMappedIndex + ); + +VOID +ODM_TxXtalTrackSetXtal_8195A( + PDM_ODM_T pDM_Odm +); + + +//1 7. IQK + +void +PHY_IQCalibrate_8195A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER Adapter, +#endif + IN BOOLEAN bReCovery, + IN BOOLEAN bRestore); + + +// +// LC calibrate +// +void +PHY_LCCalibrate_8195A( + IN PDM_ODM_T pDM_Odm +); + + +VOID +_PHY_SaveADDARegisters_8195A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte ADDAReg, + IN pu4Byte ADDABackup, + IN u4Byte RegisterNum + ); + +VOID +_PHY_PathADDAOn_8195A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte ADDAReg, + IN BOOLEAN isPathAOn, + IN BOOLEAN is2T + ); + +VOID +_PHY_MACSettingCalibration_8195A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte MACReg, + IN pu4Byte MACBackup + ); + + +VOID +_PHY_PathAStandBy( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm +#else + IN PADAPTER pAdapter +#endif + ); + + +#endif // #ifndef __HAL_PHY_RF_8188E_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/ROM_RTL8195A_PHYDM.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/ROM_RTL8195A_PHYDM.h new file mode 100644 index 0000000..7123055 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/ROM_RTL8195A_PHYDM.h @@ -0,0 +1,128 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __ROM_RTL8195A_PHYDM_H__ +#define __ROM_RTL8195A_PHYDM_H__ + +typedef struct _FALSE_ALARM_STATISTICS{ + u4Byte Cnt_Parity_Fail; + u4Byte Cnt_Rate_Illegal; + u4Byte Cnt_Crc8_fail; + u4Byte Cnt_Mcs_fail; + u4Byte Cnt_Ofdm_fail; + u4Byte Cnt_Ofdm_fail_pre; //For RTL8881A + u4Byte Cnt_Cck_fail; + u4Byte Cnt_all; + u4Byte Cnt_Fast_Fsync; + u4Byte Cnt_SB_Search_fail; + u4Byte Cnt_OFDM_CCA; + u4Byte Cnt_CCK_CCA; + u4Byte Cnt_CCA_all; + u4Byte Cnt_BW_USC; //Gary + u4Byte Cnt_BW_LSC; //Gary +}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; + +typedef struct _CFO_TRACKING_ +{ + BOOLEAN bATCStatus; + BOOLEAN largeCFOHit; + BOOLEAN bAdjust; + u1Byte CrystalCap; + u1Byte DefXCap; + int CFO_tail[2]; + int CFO_ave_pre; + u4Byte packetCount; + u4Byte packetCount_pre; + BOOLEAN bForceXtalCap; + BOOLEAN bReset; + u1Byte CFO_TH_XTAL_HIGH; + u1Byte CFO_TH_XTAL_LOW; + u1Byte CFO_TH_ATC; +}CFO_TRACKING, *PCFO_TRACKING; + +typedef struct _ROM_INFO{ + u1Byte EEPROMVersion; + u1Byte CrystalCap; + u8Byte DebugComponents; + u4Byte DebugLevel; +}ROM_INFO, *PROM_INFO; + +extern FALSE_ALARM_STATISTICS FalseAlmCnt; +extern CFO_TRACKING DM_CfoTrack; +extern ROM_INFO ROMInfo; + +u1Byte +ROM_odm_QueryRxPwrPercentage( + IN s1Byte AntPower +); + + +u1Byte +ROM_odm_EVMdbToPercentage( + IN s1Byte Value +); + +s4Byte +ROM_odm_SignalScaleMapping_8195A( + IN u1Byte SupportInterface, + IN s4Byte CurrSig +); + +VOID +ROM_odm_FalseAlarmCounterStatistics( + IN PVOID pDM_VOID +); + +VOID +ROM_odm_SetEDCCAThreshold( + IN PVOID pDM_VOID, + IN s1Byte H2L, + IN s1Byte L2H +); + +VOID +ROM_odm_SetTRxMux( + IN PVOID pDM_VOID, + IN ODM_Trx_MUX_Type txMode, + IN ODM_Trx_MUX_Type rxMode +); + + +VOID +ROM_odm_SetCrystalCap( + IN PVOID pDM_VOID, + IN u1Byte CrystalCap +); + +u1Byte +ROM_odm_GetDefaultCrytaltalCap( + IN PVOID pDM_VOID +); + +VOID +ROM_ODM_CfoTrackingReset( + IN PVOID pDM_VOID +); + +VOID +ROM_odm_CfoTrackingFlow( + IN PVOID pDM_VOID +); + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_bb.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_bb.h new file mode 100644 index 0000000..e352ab4 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_bb.h @@ -0,0 +1,59 @@ +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +/*Image2HeaderVersion: 2.23*/ +#if (RTL8195A_SUPPORT == 1) +#ifndef __INC_MP_BB_HW_IMG_8195A_H +#define __INC_MP_BB_HW_IMG_8195A_H + + +/****************************************************************************** +* AGC_TAB.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MP_8195A_AGC_TAB(/* TC: Test Chip, MP: MP Chip*/ + IN PDM_ODM_T pDM_Odm +); +u4Byte ODM_GetVersion_MP_8195A_AGC_TAB(void); + +/****************************************************************************** +* PHY_REG.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MP_8195A_PHY_REG(/* TC: Test Chip, MP: MP Chip*/ + IN PDM_ODM_T pDM_Odm +); +u4Byte ODM_GetVersion_MP_8195A_PHY_REG(void); + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MP_8195A_PHY_REG_PG(/* TC: Test Chip, MP: MP Chip*/ + IN PDM_ODM_T pDM_Odm +); +u4Byte ODM_GetVersion_MP_8195A_PHY_REG_PG(void); + +#endif +#endif /* end of HWIMG_SUPPORT*/ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_mac.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_mac.h new file mode 100644 index 0000000..23cdd26 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_mac.h @@ -0,0 +1,39 @@ +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +/*Image2HeaderVersion: 2.23*/ +#if (RTL8195A_SUPPORT == 1) +#ifndef __INC_MP_MAC_HW_IMG_8195A_H +#define __INC_MP_MAC_HW_IMG_8195A_H + + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MP_8195A_MAC_REG(/* TC: Test Chip, MP: MP Chip*/ + IN PDM_ODM_T pDM_Odm +); +u4Byte ODM_GetVersion_MP_8195A_MAC_REG(void); + +#endif +#endif /* end of HWIMG_SUPPORT*/ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_rf.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_rf.h new file mode 100644 index 0000000..fa7b2ed --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/halhwimg8195a_rf.h @@ -0,0 +1,104 @@ +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +/*Image2HeaderVersion: 2.23*/ +#if (RTL8195A_SUPPORT == 1) +#ifndef __INC_MP_RF_HW_IMG_8195A_H +#define __INC_MP_RF_HW_IMG_8195A_H + + +/****************************************************************************** +* RadioA.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MP_8195A_RadioA(/* TC: Test Chip, MP: MP Chip*/ + IN PDM_ODM_T pDM_Odm +); +u4Byte ODM_GetVersion_MP_8195A_RadioA(void); + +/****************************************************************************** +* RADIO_DIFF.TXT +******************************************************************************/ + +extern u4Byte Array_MP_8195A_RADIO_DIFF_LB[50]; +extern u4Byte Array_MP_8195A_RADIO_DIFF_MB[50]; +extern u4Byte Array_MP_8195A_RADIO_DIFF_HB[50]; +void +ODM_ReadAndConfig_MP_8195A_RADIO_DIFF( + IN PDM_ODM_T pDM_Odm, + IN u4Byte Array[], + IN u4Byte ArrayLen +); +u4Byte ODM_GetVersion_MP_8195A_RADIO_DIFF(void); + +/****************************************************************************** +* TxPowerTrack_QFN48.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MP_8195A_TxPowerTrack_QFN48(/* TC: Test Chip, MP: MP Chip*/ + IN PDM_ODM_T pDM_Odm +); +u4Byte ODM_GetVersion_MP_8195A_TxPowerTrack_QFN48(void); + +/****************************************************************************** +* TxPowerTrack_QFN56.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MP_8195A_TxPowerTrack_QFN56(/* TC: Test Chip, MP: MP Chip*/ + IN PDM_ODM_T pDM_Odm +); +u4Byte ODM_GetVersion_MP_8195A_TxPowerTrack_QFN56(void); + +/****************************************************************************** +* TxPowerTrack_TFBGA96.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MP_8195A_TxPowerTrack_TFBGA96(/* TC: Test Chip, MP: MP Chip*/ + IN PDM_ODM_T pDM_Odm +); +u4Byte ODM_GetVersion_MP_8195A_TxPowerTrack_TFBGA96(void); + +/****************************************************************************** +* TXPWR_LMT.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MP_8195A_TXPWR_LMT(/* TC: Test Chip, MP: MP Chip*/ + IN PDM_ODM_T pDM_Odm +); +u4Byte ODM_GetVersion_MP_8195A_TXPWR_LMT(void); + +/****************************************************************************** +* TxXtalTrack.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MP_8195A_TxXtalTrack(/* TC: Test Chip, MP: MP Chip*/ + IN PDM_ODM_T pDM_Odm +); +u4Byte ODM_GetVersion_MP_8195A_TxXtalTrack(void); + +#endif +#endif /* end of HWIMG_SUPPORT*/ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/phydm_RTL8195A.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/phydm_RTL8195A.h new file mode 100644 index 0000000..5b73912 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/phydm_RTL8195A.h @@ -0,0 +1,69 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __ODM_RTL8723B_H__ +#define __ODM_RTL8723B_H__ + +#define DM_DIG_MIN_NIC_8723 0x1C + +#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) + +VOID +ODM_AntennaDiversityInit_8723B( IN PDM_ODM_T pDM_Odm); + +VOID +ODM_AntselStatistics_8723B( + IN PDM_ODM_T pDM_Odm, + IN u1Byte antsel_tr_mux, + IN u4Byte MacId, + IN u4Byte RxPWDBAll); + +VOID +ODM_AntennaDiversity_8723B( IN PDM_ODM_T pDM_Odm); + + +VOID +ODM_UpdateRxIdleAnt_8723B(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant); + +VOID +ODM_SetTxAntByTxInfo_8723B( + IN PDM_ODM_T pDM_Odm, + IN pu1Byte pDesc, + IN u1Byte macId +); + +#endif + +VOID +odm_DIG_8723(IN PDM_ODM_T pDM_Odm); + +s1Byte +odm_CCKRSSI_8723B( + IN u1Byte LNA_idx, + IN u1Byte VGA_idx + ); + +s1Byte +odm_RSSIOFDM_8723B( + IN s1Byte rx_pwr_new + ); + + + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/phydm_RegConfig8195A.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/phydm_RegConfig8195A.h new file mode 100644 index 0000000..4dbf0dd --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/OUTSRC/rtl8195a/phydm_RegConfig8195A.h @@ -0,0 +1,89 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_ODM_REGCONFIG_H_8195A +#define __INC_ODM_REGCONFIG_H_8195A + +#if (RTL8195A_SUPPORT == 1) + +void +odm_ConfigRFReg_8195A( + IN PDM_ODM_T pDM_Odm, + IN u4Byte Addr, + IN u4Byte Data, + IN ODM_RF_RADIO_PATH_E RF_PATH, + IN u4Byte RegAddr + ); + +void +odm_ConfigRF_RadioA_8195A( + IN PDM_ODM_T pDM_Odm, + IN u4Byte Addr, + IN u4Byte Data + ); + +void +odm_ConfigMAC_8195A( + IN PDM_ODM_T pDM_Odm, + IN u4Byte Addr, + IN u1Byte Data + ); + +void +odm_ConfigBB_AGC_8195A( + IN PDM_ODM_T pDM_Odm, + IN u4Byte Addr, + IN u4Byte Bitmask, + IN u4Byte Data + ); + +void +odm_ConfigBB_PHY_REG_PG_8195A( + IN PDM_ODM_T pDM_Odm, + IN u4Byte Band, + IN u4Byte RfPath, + IN u4Byte TxNum, + IN u4Byte Addr, + IN u4Byte Bitmask, + IN u4Byte Data + ); + +void +odm_ConfigBB_PHY_8195A( + IN PDM_ODM_T pDM_Odm, + IN u4Byte Addr, + IN u4Byte Bitmask, + IN u4Byte Data + ); + +void +odm_ConfigBB_TXPWR_LMT_8195A( + IN PDM_ODM_T pDM_Odm, + IN u1Byte Regulation, + IN u1Byte Band, + IN u1Byte Bandwidth, + IN u1Byte RateSection, + IN u1Byte RfPath, + IN u1Byte Channel, + IN u1Byte PowerLimit + ); + +#endif +#endif // end of SUPPORT + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/hal_data.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/hal_data.h new file mode 100644 index 0000000..cb52109 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/hal_data.h @@ -0,0 +1,498 @@ +/****************************************************************************** + * Copyright (c) 2013-2016 Realtek Semiconductor Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +#ifndef __HAL_DATA_H__ +#define __HAL_DATA_H__ + + +#include "hal_com.h" +#ifdef CONFIG_RTL8188F +#include "OUTSRC/rtl8188f/phydm_precomp.h" +#else +#include "OUTSRC/phydm_precomp.h" +#endif + +#ifdef CONFIG_RTL8723A +#include "rtl8723a/rtl8723a_hal.h" +#endif +#ifdef CONFIG_RTL8188E +#include "rtl8188e/rtl8188e_hal.h" +#endif +#ifdef CONFIG_RTL8195A +#include "rtl8195a_hal.h" +#endif +#if (CONFIG_RTL8711B ==1) +#include "rtl8711b_hal.h" +#endif +#ifdef CONFIG_RTL8188F +#include "rtl8188f/rtl8188f_hal.h" +#endif +// +// For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06. +// +typedef enum _RT_MULTI_FUNC{ + RT_MULTI_FUNC_NONE = 0x00, + RT_MULTI_FUNC_WIFI = 0x01, + RT_MULTI_FUNC_BT = 0x02, + RT_MULTI_FUNC_GPS = 0x04, +}RT_MULTI_FUNC,*PRT_MULTI_FUNC; +// +// For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08. +// +typedef enum _RT_POLARITY_CTL { + RT_POLARITY_LOW_ACT = 0, + RT_POLARITY_HIGH_ACT = 1, +} RT_POLARITY_CTL, *PRT_POLARITY_CTL; + +// For RTL8723 regulator mode. by tynli. 2011.01.14. +typedef enum _RT_REGULATOR_MODE { + RT_SWITCHING_REGULATOR = 0, + RT_LDO_REGULATOR = 1, +} RT_REGULATOR_MODE, *PRT_REGULATOR_MODE; + +#define CHANNEL_MAX_NUMBER 14 // 14 is the max channel number +#define CHANNEL_MAX_NUMBER_2G 14 +#define CHANNEL_MAX_NUMBER_5G 54 // Please refer to "phy_GetChnlGroup8812A" and "Hal_ReadTxPowerInfo8812A" +#define CHANNEL_MAX_NUMBER_5G_80M 7 + +// Tx Power Limit Table Size +#define MAX_REGULATION_NUM 3 // FCC, ETSI, MKK +#define MAX_2_4G_BANDWITH_NUM 2 // 20M, 40M +#if defined(NOT_SUPPORT_RF_MULTIPATH) && defined(NOT_SUPPORT_VHT) +#define MAX_RATE_SECTION_NUM 3 // CCk, OFDM, HT +#define MAX_BASE_NUM_IN_PHY_REG_PG_2_4G 3 // CCK:1,OFDM:1, HT:1(MCS0_MCS7) +#else +#define MAX_RATE_SECTION_NUM 10 +#define MAX_BASE_NUM_IN_PHY_REG_PG_2_4G 10 // CCK:1,OFDM:1, HT:4, VHT:4 +#endif +#define MAX_5G_BANDWITH_NUM 4 +#define MAX_BASE_NUM_IN_PHY_REG_PG_5G 9 // OFDM:1, HT:4, VHT:4 + +#define HCI_SUS_ENTER 0 +#define HCI_SUS_LEAVING 1 +#define HCI_SUS_LEAVE 2 +#define HCI_SUS_ENTERING 3 +#define HCI_SUS_ERR 4 + + +struct dm_priv +{ + u8 DM_Type; + u8 DMFlag; + u8 InitDMFlag; + u32 InitODMFlag; + + //* Upper and Lower Signal threshold for Rate Adaptive*/ + int UndecoratedSmoothedPWDB; + int UndecoratedSmoothedCCK; + int EntryMinUndecoratedSmoothedPWDB; + int EntryMaxUndecoratedSmoothedPWDB; + int MinUndecoratedPWDBForDM; + int LastMinUndecoratedPWDBForDM; + + + //for High Power + u8 bDynamicTxPowerEnable; + u8 LastDTPLvl; + u8 DynamicTxHighPowerLvl;//Add by Jacken Tx Power Control for Near/Far Range 2008/03/06 + + //for tx power tracking + u8 bTXPowerTracking; + u8 TXPowercount; + u8 bTXPowerTrackingInit; + u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default + + u8 PowerIndex_backup[6]; + + s32 OFDM_Pkt_Cnt; + + // Add for Reading Initial Data Rate SEL Register 0x484 during watchdog. Using for fill tx desc. 2011.3.21 by Thomas + u8 INIDATA_RATE[32]; +}; + +#ifdef CONFIG_LITTLE_WIFI_MCU_FUNCTION_THREAD +#define MCUCMDQUEUEDEPTH 15 +#define MCUCMDLENGTH 2 +#define MACIDNUM 128 +typedef struct _cmd_queue_{ + u32 FwCmdContent[MCUCMDLENGTH]; +}CMD_QUEUE; +#endif + + +#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RTL8188F +struct kfree_data_t { + u8 flag; + s8 bb_gain[BB_GAIN_NUM][RF_PATH_MAX]; + s8 thermal; +}; + +#define KFREE_FLAG_ON BIT0 +#define KFREE_FLAG_THERMAL_K_ON BIT1 +#endif +#endif + +typedef struct hal_com_data +{ + HAL_VERSION VersionID; +// RT_MULTI_FUNC MultiFunc; // For multi-function consideration. +// RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. + RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO + u16 CustomerID; +#if defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B) ||defined (CONFIG_RTL8188F) + u16 ForcedDataRate;// Force Data Rate. 0: Auto, 0x02: 1M ~ 0x6C: 54M. +#endif + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + u16 FirmwareSignature; +// u8 PGMaxGroup; + //current WIFI_PHY values + u32 ReceiveConfig; +// WIRELESS_MODE CurrentWirelessMode; + CHANNEL_WIDTH CurrentChannelBW; +#if defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B)||defined (CONFIG_RTL8188F) + BAND_TYPE CurrentBandType; //0:2.4G, 1:5G +#endif + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + u8 CurrentCenterFrequencyIndex1; +#if !defined(NOT_SUPPORT_80M) + u8 nCur80MhzPrimeSC; //used for primary 40MHz of 80MHz mode +#endif + + u16 BasicRateSet; + u8 hci_sus_state; + //rf_ctrl + u8 rf_chip; + u8 rf_type; +#if defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B)||defined (CONFIG_RTL8188F) + u8 PackageType; + u8 ChipID; +#endif + u8 NumTotalRFPath; + + u8 BoardType; + + // + // EEPROM setting. + // +// u16 EEPROMVID; +// u16 EEPROMPID; +// u16 EEPROMSVID; +// u16 EEPROMSDID; + u8 EEPROMCustomerID; +// u8 EEPROMSubCustomerID; + u8 EEPROMVersion; + u8 EEPROMRegulatory; + +#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RTL8188F + struct kfree_data_t kfree_data; +#endif +#endif +// u8 bTXPowerDataReadFromEEPORM; + u8 EEPROMThermalMeter; +// u8 bAPKThermalMeterIgnore; + +// BOOLEAN EepromOrEfuse; + //u8 EfuseMap[2][HWSET_MAX_SIZE_512]; //92C:256bytes, 88E:512bytes, we use union set (512bytes) + //u8 EfuseUsedPercentage; +#ifdef HAL_EFUSE_MEMORY + EFUSE_HAL EfuseHal; +#endif + //u8 bIQKInitialized; + + u8 Regulation2_4G; +#if !defined(NOT_SUPPORT_5G) + u8 Regulation5G; +#endif +#if defined(CONFIG_RTL8195A) || defined(CONFIG_RTL8711B)||defined (CONFIG_RTL8188F) + s8 TxPwrByRateOffset[TX_PWR_BY_RATE_NUM_BAND] + [TX_PWR_BY_RATE_NUM_RF] + [TX_PWR_BY_RATE_NUM_RF] + [TX_PWR_BY_RATE_NUM_RATE]; +#endif + //---------------------------------------------------------------------------------// +#if defined(CONFIG_RTL8195A) || defined(CONFIG_RTL8711B)||defined (CONFIG_RTL8188F) + u8 Index24G_CCK_Base[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; + u8 Index24G_BW40_Base[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; + //If only one tx, only BW20 and OFDM are used. + s8 OFDM_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW20_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; +#if !defined(NOT_SUPPORT_RF_MULTIPATH) + s8 CCK_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW40_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; +#endif + + //2 Power Limit Table + // Power Limit Table for 2.4G + s8 TxPwrLimit_2_4G[MAX_REGULATION_NUM] + [MAX_2_4G_BANDWITH_NUM] + [MAX_RATE_SECTION_NUM] + [CHANNEL_MAX_NUMBER_2G] + [MAX_RF_PATH]; + #if !defined(NOT_SUPPORT_5G) + // Power Limit Table for 5G + s8 TxPwrLimit_5G[MAX_REGULATION_NUM] + [MAX_5G_BANDWITH_NUM] + [MAX_RATE_SECTION_NUM] + [CHANNEL_MAX_NUMBER_5G] + [MAX_RF_PATH]; + #endif + + // Store the original power by rate value of the base of each rate section of rf path A & B + u8 TxPwrByRateBase2_4G[TX_PWR_BY_RATE_NUM_RF] + [TX_PWR_BY_RATE_NUM_RF] + [MAX_BASE_NUM_IN_PHY_REG_PG_2_4G]; + #if !defined(NOT_SUPPORT_5G) + u8 TxPwrByRateBase5G[TX_PWR_BY_RATE_NUM_RF] + [TX_PWR_BY_RATE_NUM_RF] + [MAX_BASE_NUM_IN_PHY_REG_PG_5G]; + #endif +#else + u8 TxPwrLevelCck[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; + u8 TxPwrLevelHT40_1S[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[MAX_RF_PATH][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[MAX_RF_PATH][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff +#endif + + // For power group +// u8 PwrGroupHT20[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; +// u8 PwrGroupHT40[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; + +// u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + u8 CurrentBW2024GTxPwrIdx; + u8 CurrentBW4024GTxPwrIdx; + + u8 CrystalCap; + //u32 AntennaTxPath; // Antenna path Tx + //u32 AntennaRxPath; // Antenna path Rx + //u8 BluetoothCoexist; +// u8 ExternalPA; + +#if defined(CONFIG_RTL8188F) + + /* PHY DM & DM Section */ + u8 INIDATA_RATE[32/*MACID_NUM_SW_LIMIT*/]; + /* Upper and Lower Signal threshold for Rate Adaptive*/ + int EntryMinUndecoratedSmoothedPWDB; + int EntryMaxUndecoratedSmoothedPWDB; + int MinUndecoratedPWDBForDM; +#endif + + //u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. + + //u32 LedControlNum; + //u32 LedControlMode; + //u8 b1x1RecvCombine; // for 1T1R receive combining + + //u8 bCurrentTurboEDCA; +#if defined(CONFIG_RTL8195A) || defined(CONFIG_RTL8711B)||defined (CONFIG_RTL8188F) + BOOLEAN bSwChnl; + BOOLEAN bSetChnlBW; + BOOLEAN bChnlBWInitialized; +#endif + +// BOOLEAN bNeedIQK; + + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. +#if defined(NOT_SUPPORT_RF_MULTIPATH) + BB_REGISTER_DEFINITION_T PHYRegDef[1]; //Radio A + u32 RfRegChnlVal[1]; +#else + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + u32 RfRegChnlVal[2]; +#endif + + //RDG enable +// BOOLEAN bRDGEnable; + +#if (defined(CONFIG_RTL8711B) || defined(CONFIG_RTL8188F)) + //for host message to fw + u8 LastHMEBoxNum; +#endif + + u8 fw_ractrl; +// u8 RegTxPause; + // Beacon function related global variable. +// u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; +// u8 RegCR_1; + u16 RegRRSR; + + struct dm_priv dmpriv; + DM_ODM_T odmpriv; + //_lock odm_stainfo_lock; +#ifdef DBG_CONFIG_ERROR_DETECT + struct sreset_priv srestpriv; +#endif + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv bt_coexist; +#endif + +//#ifdef CONFIG_ANTENNA_DIVERSITY + u8 CurAntenna; + u8 AntDivCfg; + u8 TRxAntDivType; +//#endif + +// u8 bDumpRxPkt;//for debug +// u8 bDumpTxPkt;//for debug +// u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + // 2010/08/09 MH Add CU power down mode. +// BOOLEAN pwrdown; + + // Add for dual MAC 0--Mac0 1--Mac1 +// u32 interfaceIndex; + + u8 OutEpQueueSel; + u8 OutEpNumber; + + // 2010/12/10 MH Add for USB aggreation mode dynamic shceme. +// BOOLEAN UsbRxHighSpeedMode; + + // 2010/11/22 MH Add for slim combo debug mode selective. + // This is used for fix the drawback of CU TSMC-A/UMC-A cut. HW auto suspend ability. Close BT clock. + //BOOLEAN SlimComboDbg; + + u16 EfuseUsedBytes; + +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif + + u8 AMPDUDensity; + + // Auto FSM to Turn On, include clock, isolation, power control for MAC only + u8 bMacPwrCtrlOn; + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + + // + // For SDIO Interface HAL related + // + + // + // SDIO ISR Related + // +// u32 IntrMask[1]; +// u32 IntrMaskToSet[1]; +// LOG_INTERRUPT InterruptLog; +// u32 sdio_himr; +// u32 sdio_hisr; + + // + // SDIO Tx FIFO related. + // + // HIQ, MID, LOW, PUB free pages; padapter->xmitpriv.free_txpg +// u8 SdioTxFIFOFreePage[TX_FREE_PG_QUEUE]; +// _lock SdioTxFIFOFreePageLock; +// _thread_hdl_ SdioXmitThread; +// _sema SdioXmitSema; +// _sema SdioXmitTerminateSema; + + // + // SDIO Rx FIFO related. + // +// u8 SdioRxFIFOCnt; +// u16 SdioRxFIFOSize; +#endif //CONFIG_SDIO_HCI + +#ifdef CONFIG_USB_HCI + u32 UsbBulkOutSize; + + // Interrupt relatd register information. + u32 IntArray[3];//HISR0,HISR1,HSISR + u32 IntrMask[3]; + //u8 C2hArray[16]; +#ifdef CONFIG_USB_TX_AGGREGATION + u8 UsbTxAggMode; + u8 UsbTxAggDescNum; +#endif +#ifdef CONFIG_USB_RX_AGGREGATION + u16 HwRxPageSize; // Hardware setting + u32 MaxUsbRxAggBlock; + + USB_RX_AGG_MODE UsbRxAggMode; + u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed + u8 UsbRxAggBlockTimeout; + u8 UsbRxAggPageCount; // 8192C DMA page count + u8 UsbRxAggPageTimeout; +#endif +#endif //CONFIG_USB_HCI + + +#if defined (CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) +// u32 TransmitConfig; + u32 IntArray[3]; + u32 IntrMask[3]; +// u8 bDefaultAntenna; +// u8 bIQKInitialized; + +// u8 bInterruptMigration; +// u8 bDisableTxInt; +#ifdef CONFIG_SUPPORT_HW_WPS_PBC + u8 bGpioHwWpsPbc; +#endif + u16 RxExpectTag; +#ifdef CONFIG_DEBUG_DYNAMIC + struct hal_debug debug_info; +#endif + +#endif //CONFIG_PCI_HCI || CONFIG_LX_HCI + + +#ifdef CONFIG_TX_EARLY_MODE + u8 bEarlyModeEnable; +#endif + +#ifdef CONFIG_LITTLE_WIFI_MCU_FUNCTION_THREAD + struct task_struct littlewifipriv; + //CMD_QUEUE FwCmdQueue[MCUCMDQUEUEDEPTH]; + //fw section + u32 WifiMcuCmdBitMap; + u8 bConnected[MACIDNUM/8]; + BOOLEAN PMUTaskRAEn; + + u8 BcnIgnoreEdccaEn; + + #ifdef CONFIG_POWER_SAVING + struct task_struct enter32kpriv; + + #ifdef TDMA_POWER_SAVING + struct task_struct TDMApriv; + #endif //#ifdef TDMA_POWER_SAVING + + PS_PARM PSParmpriv; + u8 ScanEn; + #endif //#ifdef CONFIG_POWER_SAVING +#endif + +} HAL_DATA_COMMON, *PHAL_DATA_COMMON; + +typedef struct hal_com_data HAL_DATA_TYPE, *PHAL_DATA_TYPE; +#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) + +#endif //__HAL_DATA_H__ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8192CPhyReg.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8192CPhyReg.h new file mode 100644 index 0000000..81b226a --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8192CPhyReg.h @@ -0,0 +1,1125 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/***************************************************************************** + * + * Module: __INC_HAL8192CPHYREG_H + * + * + * Note: 1. Define PMAC/BB register map + * 2. Define RF register map + * 3. PMAC/BB register bit mask. + * 4. RF reg bit mask. + * 5. Other BB/RF relative definition. + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * 09/25/2008 MH 1. Add RL6052 register definition + * + *****************************************************************************/ +#ifndef __INC_HAL8192CPHYREG_H +#define __INC_HAL8192CPHYREG_H + + +/*--------------------------Define Parameters-------------------------------*/ + +//============================================================ +// 8192S Regsiter offset definition +//============================================================ + +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c + +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c + +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 + +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 // Useless now +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c +// +// PageB(0xB00) +// +#define rPdp_AntA 0xb00 +#define rPdp_AntA_4 0xb04 +#define rConfig_Pmpd_AntA 0xb28 +#define rConfig_AntA 0xb68 +#define rConfig_AntB 0xb6c +#define rPdp_AntB 0xb70 +#define rPdp_AntB_4 0xb74 +#define rConfig_Pmpd_AntB 0xb98 +#define rAPK 0xbd8 + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxIQExtAnta 0xca0 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rFPGA0_IQK 0xe28 +#define rTx_IQK_Tone_A 0xe30 +#define rRx_IQK_Tone_A 0xe34 +#define rTx_IQK_PI_A 0xe38 +#define rRx_IQK_PI_A 0xe3c + +#define rTx_IQK 0xe40 +#define rRx_IQK 0xe44 +#define rIQK_AGC_Pts 0xe48 +#define rIQK_AGC_Rsp 0xe4c +#define rTx_IQK_Tone_B 0xe50 +#define rRx_IQK_Tone_B 0xe54 +#define rTx_IQK_PI_B 0xe58 +#define rRx_IQK_PI_B 0xe5c +#define rIQK_AGC_Cont 0xe60 + +#define rBlue_Tooth 0xe6c +#define rRx_Wait_CCA 0xe70 +#define rTx_CCK_RFON 0xe74 +#define rTx_CCK_BBON 0xe78 +#define rTx_OFDM_RFON 0xe7c +#define rTx_OFDM_BBON 0xe80 +#define rTx_To_Rx 0xe84 +#define rTx_To_Tx 0xe88 +#define rRx_CCK 0xe8c + +#define rTx_Power_Before_IQK_A 0xe94 +#define rTx_Power_After_IQK_A 0xe9c + +#define rRx_Power_Before_IQK_A 0xea0 +#define rRx_Power_Before_IQK_A_2 0xea4 +#define rRx_Power_After_IQK_A 0xea8 +#define rRx_Power_After_IQK_A_2 0xeac + +#define rTx_Power_Before_IQK_B 0xeb4 +#define rTx_Power_After_IQK_B 0xebc + +#define rRx_Power_Before_IQK_B 0xec0 +#define rRx_Power_Before_IQK_B_2 0xec4 +#define rRx_Power_After_IQK_B 0xec8 +#define rRx_Power_After_IQK_B_2 0xecc + +#define rRx_OFDM 0xed0 +#define rRx_Wait_RIFS 0xed4 +#define rRx_TO_Rx 0xed8 +#define rStandby 0xedc +#define rSleep 0xee0 +#define rPMPD_ANAEN 0xeec + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +#define rZebra1_Channel 0x7 // RF channel switch + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // +#define RF_BS_PA_APSET_G1_G4 0x03 +#define RF_BS_PA_APSET_G5_G8 0x04 +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_IPA_G 0x09 // +#define RF_TXBIAS_G 0x0A +#define RF_TXPA_AG 0x0B +#define RF_IPA_A 0x0C // +#define RF_TXBIAS_A 0x0D +#define RF_BS_PA_APSET_G9_G11 0x0E +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_TXBIAS 0x16 // +#define RF_POW_ABILITY 0x17 // +#define RF_MODE_AG 0x18 // +#define rRfChannel 0x18 // RF channel and BW switch +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +#define RF_T_METER 0x24 // + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control + +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control + +#define RF_MIXER_BW 0x87 // RF Mixer bandwidth + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bAntennaSelect 0x0300 + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 + +#define bLSSIReadAddress 0x7f800000 // T65 RF + +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal + +#define bLSSIReadBackData 0xfffff // T65 RF + +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + +//for PutRFRegsetting & GetRFRegSetting BitMask +//#define bMask12Bits 0xfffff // RF Reg mask bits +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfffff + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif //__INC_HAL8192SPHYREG_H + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APhyCfg.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APhyCfg.h new file mode 100644 index 0000000..c8e7b4c --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APhyCfg.h @@ -0,0 +1,186 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8195APHYCFG_H__ +#define __INC_HAL8195APHYCFG_H__ + +/*--------------------------Define Parameters-------------------------------*/ +#define LOOP_LIMIT 5 +#define MAX_STALL_TIME 50 //us +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) +#define MAX_TXPWR_IDX_NMODE_92S 63 +#define Reset_Cnt_Limit 3 + +#if defined (CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) +#define MAX_AGGR_NUM 0x0B +#else +#define MAX_AGGR_NUM 0x07 +#endif // CONFIG_PCI_HCI + + +/*--------------------------Define Parameters End-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ + +/* BB/RF related */ + +typedef struct _R_ANTENNA_SELECT_OFDM{ + u32 r_tx_antenna:4; + u32 r_ant_l:4; + u32 r_ant_non_ht:4; + u32 r_ant_ht1:4; + u32 r_ant_ht2:4; + u32 r_ant_ht_s1:4; + u32 r_ant_non_ht_s1:4; + u32 OFDM_TXSC:2; + u32 Reserved:2; +}R_ANTENNA_SELECT_OFDM; + +typedef struct _R_ANTENNA_SELECT_CCK{ + u8 r_cckrx_enable_2:2; + u8 r_cckrx_enable:2; + u8 r_ccktx_enable:4; +}R_ANTENNA_SELECT_CCK; + +/*------------------------------Define structure End----------------------------*/ + +/*--------------------------Exported Function prototype---------------------*/ + +u32 +PHY_QueryBBReg_8195A( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask + ); + +VOID +PHY_SetBBReg_8195A( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); + +u32 +PHY_QueryRFReg_8195A( + IN PADAPTER Adapter, + IN u32 eRFPath, + IN u32 RegAddr, + IN u32 BitMask + ); + +VOID +PHY_SetRFReg_8195A( + IN PADAPTER Adapter, + IN u32 eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); + +u32 PHY_QueryBBReg_8195A_Safe( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask +); + +VOID PHY_SetBBReg_8195A_Safe( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data +); + +#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) PHY_QueryBBReg_8195A_Safe((Adapter), (RegAddr), (BitMask)) +#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) PHY_SetBBReg_8195A_Safe((Adapter), (RegAddr), (BitMask), (Data)) +#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) PHY_QueryRFReg_8195A((Adapter), (eRFPath), (RegAddr), (BitMask)) +#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) PHY_SetRFReg_8195A((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) + +#define PHY_SetMacReg PHY_SetBBReg +#define PHY_QueryMacReg PHY_QueryBBReg +/* MAC/BB/RF HAL config */ +int PHY_BBConfig8195A(PADAPTER Adapter ); + +int PHY_RFConfig8195A(PADAPTER Adapter ); + +s32 PHY_MACConfig8195A(PADAPTER padapter); + +#ifdef CONFIG_SUDO_PHY_SETTING +int PHY_SudoPhyConfig8195A(PADAPTER Adapter); +#endif + +int +PHY_ConfigRFWithParaFile_8195A( + IN PADAPTER Adapter, + IN u8* pFileName, + RF_PATH eRFPath +); +int +PHY_ConfigRFWithHeaderFile_8723B( + IN PADAPTER Adapter, + RF_PATH eRFPath +); + +u8 +PHY_GetTxPowerIndex_8195A( + IN PADAPTER pAdapter, + IN u8 RFPath, + IN u8 Rate, + IN CHANNEL_WIDTH BandWidth, + IN u8 Channel + ); + +VOID +PHY_SetTxPowerLevel8195A( + IN PADAPTER Adapter, + IN u8 channel + ); + +VOID +PHY_SetBWMode8195A( + IN PADAPTER Adapter, + IN CHANNEL_WIDTH Bandwidth, // 20M or 40M + IN unsigned char Offset // Upper, Lower, or Don't care +); + +VOID +PHY_SwChnl8195A( // Call after initialization + IN PADAPTER Adapter, + IN u8 channel + ); + +VOID +PHY_SetSwChnlBWMode8195A( + IN PADAPTER Adapter, + IN u8 channel, + IN CHANNEL_WIDTH Bandwidth, + IN u8 Offset40, + IN u8 Offset80 +); + +VOID PHY_SetRFPathSwitch_8723B( + IN PADAPTER pAdapter, + IN BOOLEAN bMain + ); + +/*--------------------------Exported Function prototype End---------------------*/ + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APhyReg.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APhyReg.h new file mode 100644 index 0000000..1ae9e30 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APhyReg.h @@ -0,0 +1,272 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8195APHYREG_H__ +#define __INC_HAL8195APHYREG_H__ + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// Page1(0x100) +// +#define rPMAC_Reset 0x100 + +// +// Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c +#define rFPGA0_XCD_SwitchControl 0x85c +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback + +// +// Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? +#define rS0S1_PathSwitch 0x948 +#define rRXDFIR_Filter 0x954 + +// +// PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI + +// +// PageB(0xB00) +// +#define rPdp_AntA 0xb00 +#define rPdp_AntA_4 0xb04 +#define rPdp_AntA_8 0xb08 +#define rPdp_AntA_C 0xb0c +#define rPdp_AntA_10 0xb10 +#define rPdp_AntA_14 0xb14 +#define rPdp_AntA_18 0xb18 +#define rPdp_AntA_1C 0xb1c +#define rPdp_AntA_20 0xb20 +#define rPdp_AntA_24 0xb24 + +#define rConfig_Pmpd_AntA 0xb28 +#define rConfig_ram64x16 0xb2c + +#define rBndA 0xb30 +#define rHssiPar 0xb34 + +#define rConfig_AntA 0xb68 +#define rConfig_AntB 0xb6c + +#define rPdp_AntB 0xb70 +#define rPdp_AntB_4 0xb74 +#define rPdp_AntB_8 0xb78 +#define rPdp_AntB_C 0xb7c +#define rPdp_AntB_10 0xb80 +#define rPdp_AntB_14 0xb84 +#define rPdp_AntB_18 0xb88 +#define rPdp_AntB_1C 0xb8c +#define rPdp_AntB_20 0xb90 +#define rPdp_AntB_24 0xb94 + +#define rConfig_Pmpd_AntB 0xb98 + +#define rBndB 0xba0 + +#define rAPK 0xbd8 +#define rPm_Rx0_AntA 0xbdc +#define rPm_Rx1_AntA 0xbe0 +#define rPm_Rx2_AntA 0xbe4 +#define rPm_Rx3_AntA 0xbe8 +#define rPm_Rx0_AntB 0xbec +#define rPm_Rx1_AntB 0xbf0 +#define rPm_Rx2_AntB 0xbf4 +#define rPm_Rx3_AntB 0xbf8 + +// +// PageC(0xC00) +// +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_XARxAFE 0xc10 // RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 // RxIQ imblance matrix +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_RxDetector1 0xc30 // PD,BW & SBD // DM tune init gain +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxAFE 0xc9c +#define rOFDM0_RxIQExtAnta 0xca0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 // Double ADC + +// +// PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +// +// PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c +#define rFPGA0_IQK 0xe28 +#define rTx_IQK_Tone_A 0xe30 +#define rRx_IQK_Tone_A 0xe34 +#define rTx_IQK_PI_A 0xe38 +#define rRx_IQK_PI_A 0xe3c +#define rTx_IQK 0xe40 +#define rRx_IQK 0xe44 +#define rIQK_AGC_Pts 0xe48 +#define rIQK_AGC_Rsp 0xe4c +#define rTx_IQK_Tone_B 0xe50 +#define rRx_IQK_Tone_B 0xe54 +#define rTx_IQK_PI_B 0xe58 +#define rRx_IQK_PI_B 0xe5c +#define rIQK_AGC_Cont 0xe60 +#define rBlue_Tooth 0xe6c +#define rRx_Wait_CCA 0xe70 // Rx ADC clock +#define rTx_CCK_RFON 0xe74 +#define rTx_CCK_BBON 0xe78 +#define rTx_OFDM_RFON 0xe7c +#define rTx_OFDM_BBON 0xe80 +#define rTx_To_Rx 0xe84 +#define rTx_To_Tx 0xe88 +#define rRx_CCK 0xe8c +#define rTx_Power_Before_IQK_A 0xe94 +#define rTx_Power_After_IQK_A 0xe9c +#define rRx_Power_Before_IQK_A_2 0xea4 +#define rRx_Power_After_IQK_A_2 0xeac +#define rTx_Power_Before_IQK_B 0xeb4 +#define rTx_Power_After_IQK_B 0xebc +#define rRx_Power_Before_IQK_B 0xec0 +#define rRx_Power_Before_IQK_B_2 0xec4 +#define rRx_Power_After_IQK_B 0xec8 +#define rRx_Power_After_IQK_B_2 0xecc +#define rRx_OFDM 0xed0 +#define rRx_Wait_RIFS 0xed4 +#define rRx_TO_Rx 0xed8 +#define rStandby 0xedc +#define rSleep 0xee0 +#define rPMPD_ANAEN 0xeec + + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskH3Bytes 0xffffff00 + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // +#define RF_TXM_IDAC 0x08 // +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_RCK_OS 0x30 // RF TX PA control +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_WE_LUT 0xEF + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW +#define bLSSIReadAddress 0x7f800000 // T65 RF +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal +#define bLSSIReadBackData 0xfffff // T65 RF + +// 3. Page9(0x900) + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch +#define bCCKScramble 0x8 +#define bCCKTxRate 0x3000 + + +// 5. PageC(0xC00) + +// 6. PageE(0xE00) +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 + +// +// Other Definition +// + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 + +#define bEnable 0x1 +#define bDisable 0x0 + + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APwrSeq.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APwrSeq.h new file mode 100644 index 0000000..2de0a12 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/Hal8195APwrSeq.h @@ -0,0 +1,397 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef REALTEK_POWER_SEQUENCE_8195A +#define REALTEK_POWER_SEQUENCE_8195A + +#include "HalPwrSeqCmd.h" + +/* + Check document WM-20130111-JackieLau-RTL8723B_Power_Architecture v02.vsd + There are 6 HW Power States: + 0: POFF--Power Off + 1: PDN--Power Down + 2: CARDEMU--Card Emulation + 3: ACT--Active Mode + 4: LPS--Low Power State + 5: SUS--Suspend + + The transision from different states are defined below + TRANS_CARDEMU_TO_ACT + TRANS_ACT_TO_CARDEMU + TRANS_CARDEMU_TO_SUS + TRANS_SUS_TO_CARDEMU + TRANS_CARDEMU_TO_PDN + TRANS_ACT_TO_LPS + TRANS_LPS_TO_ACT + + TRANS_END +*/ +#define RTL8195A_TRANS_CARDEMU_TO_ACT_STEPS 4 +#define RTL8195A_TRANS_ACT_TO_CARDEMU_STEPS 4 +#define RTL8195A_TRANS_CARDEMU_TO_SUS_STEPS 7 +#define RTL8195A_TRANS_SUS_TO_CARDEMU_STEPS 15 +#define RTL8195A_TRANS_CARDEMU_TO_PDN_STEPS 15 +#define RTL8195A_TRANS_PDN_TO_CARDEMU_STEPS 15 +#define RTL8195A_TRANS_ACT_TO_LPS_STEPS 15 +#define RTL8195A_TRANS_LPS_TO_ACT_STEPS 15 +#define RTL8195A_TRANS_ACT_TO_SWLPS_STEPS 22 +#define RTL8195A_TRANS_SWLPS_TO_ACT_STEPS 15 +#define RTL8195A_TRANS_END_STEPS 1 +//1TODO:chris +#if 1 +#define RTL8195A_TRANS_CARDEMU_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \ + {0x0004, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},\ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},\ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ + + +#define RTL8195A_TRANS_ACT_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT0|BIT1|BIT2), 0},/*0x04[24:26] = 0 turn off RF*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT0|BIT1), 0},/*0x04[16:17] = 0 BB reset*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x20[1] = 1 turn off MAC by HW state machine*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x20[1] = 0 polling until return 0 to disable*/ \ + +#define RTL8195A_TRANS_CARDEMU_TO_SUS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8195A_TRANS_SUS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8195A_TRANS_CARDEMU_TO_CARDDIS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + +#define RTL8195A_TRANS_CARDDIS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + + +#define RTL8195A_TRANS_CARDEMU_TO_PDN \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ + +#define RTL8195A_TRANS_PDN_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ + +#define RTL8195A_TRANS_ACT_TO_LPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ + {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ + {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ + + +#define RTL8195A_TRANS_LPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ + {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ + {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ + {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + + + #define RTL8195A_TRANS_ACT_TO_SWLPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0194, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*enable 32 K source*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},/*CCK and OFDM are enable*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},/*CCK and OFDM are enable*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*disable security engine*/ \ + {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x40},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*reset dual TSF*/ \ + {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/*Reset CPU*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*Reset MCUFWDL register*/ \ + {0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*Reset CPU IO Wrapper*/ \ + {0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},/*Reset CPU IO Wrapper*/ \ + {0x0287, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*polling RXFF packet number = 0 */ \ + {0x0286, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/*polling RXDMA idle */ \ + {0x013D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Clear FW RPWM interrupt */\ + {0x0139, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Set FW RPWM interrupt source*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4},/*switch TSF to 32K*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/*polling TSF stable*/\ + {0x0090, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Set FW LPS*/ \ + {0x0090, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/*polling FW LPS ready */ + + +#define RTL8195A_TRANS_SWLPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0},/*switch TSF to 32K*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*polling TSF stable*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1, enable security engine*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x06B7, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x09}, /*. reset MAC rx state machine*/\ + {0x06B4, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x86}, /*. reset MAC rx state machine*/\ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/* set CPU RAM code ready*/ \ + {0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*Reset CPU IO Wrapper*/ \ + {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* Enable CPU*/ \ + {0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*enable CPU IO Wrapper*/ \ + {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2},/* Enable CPU*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, BIT7},/*polling FW init ready */ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT6, BIT6},/*polling FW init ready */ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + + + +#else + +#define RTL8723B_TRANS_CARDEMU_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/ \ + {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/ \ + {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ + {0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/* Enable WL control XTAL setting*/ \ + {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable falling edge triggering interrupt*/\ + {0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable GPIO9 interrupt mode*/\ + {0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable GPIO9 input mode*/\ + {0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Enable HSISR GPIO[C:0] interrupt*/\ + {0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable HSISR GPIO9 interrupt*/\ + {0x0068, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3},/*For GPIO9 internal pull high setting by test chip*/\ + {0x0069, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/*For GPIO9 internal pull high setting*/ + +#define RTL8723B_TRANS_ACT_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ + {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*0x4C[24] = 0x4F[0] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ + {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable rising edge triggering interrupt*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ + {0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/* Enable BT control XTAL setting*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/ \ + + +#define RTL8723B_TRANS_CARDEMU_TO_SUS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8723B_TRANS_SUS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8723B_TRANS_CARDEMU_TO_CARDDIS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ + {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8723B_TRANS_CARDDIS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ + + +#define RTL8723B_TRANS_CARDEMU_TO_PDN \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ + +#define RTL8723B_TRANS_PDN_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ + +#define RTL8723B_TRANS_ACT_TO_LPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ + {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ + {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ + + +#define RTL8723B_TRANS_LPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ + {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ + {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ + {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + + + #define RTL8723B_TRANS_ACT_TO_SWLPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0194, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*enable 32 K source*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},/*CCK and OFDM are enable*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},/*CCK and OFDM are enable*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*disable security engine*/ \ + {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x40},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*reset dual TSF*/ \ + {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/*Reset CPU*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*Reset MCUFWDL register*/ \ + {0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*Reset CPU IO Wrapper*/ \ + {0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},/*Reset CPU IO Wrapper*/ \ + {0x0287, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*polling RXFF packet number = 0 */ \ + {0x0286, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/*polling RXDMA idle */ \ + {0x013D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Clear FW RPWM interrupt */\ + {0x0139, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Set FW RPWM interrupt source*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4},/*switch TSF to 32K*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/*polling TSF stable*/\ + {0x0090, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Set FW LPS*/ \ + {0x0090, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/*polling FW LPS ready */ + + +#define RTL8723B_TRANS_SWLPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0},/*switch TSF to 32K*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*polling TSF stable*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1, enable security engine*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x06B7, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x09}, /*. reset MAC rx state machine*/\ + {0x06B4, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x86}, /*. reset MAC rx state machine*/\ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/* set CPU RAM code ready*/ \ + {0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*Reset CPU IO Wrapper*/ \ + {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* Enable CPU*/ \ + {0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*enable CPU IO Wrapper*/ \ + {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2},/* Enable CPU*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, BIT7},/*polling FW init ready */ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT6, BIT6},/*polling FW init ready */ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + + +#endif + + + +#define RTL8195A_TRANS_END \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // + + +extern WLAN_PWR_CFG rtl8195A_power_on_flow[RTL8195A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8195A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8195A_radio_off_flow[RTL8195A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8195A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8195A_card_disable_flow[RTL8195A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8195A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8195A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8195A_card_enable_flow[RTL8195A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8195A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8195A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8195A_suspend_flow[RTL8195A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8195A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8195A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8195A_resume_flow[RTL8195A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8195A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8195A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8195A_hwpdn_flow[RTL8195A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8195A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8195A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8195A_enter_lps_flow[RTL8195A_TRANS_ACT_TO_LPS_STEPS+RTL8195A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8195A_leave_lps_flow[RTL8195A_TRANS_LPS_TO_ACT_STEPS+RTL8195A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8195A_enter_swlps_flow[RTL8195A_TRANS_ACT_TO_SWLPS_STEPS+RTL8195A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8195A_leave_swlps_flow[RTL8195A_TRANS_SWLPS_TO_ACT_STEPS+RTL8195A_TRANS_END_STEPS]; +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rom_Hal8195APhyCfg.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rom_Hal8195APhyCfg.h new file mode 100644 index 0000000..5dce5ce --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rom_Hal8195APhyCfg.h @@ -0,0 +1,56 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __ROM_HAL8195APHYCFG_H__ +#define __ROM_HAL8195APHYCFG_H__ + +/*--------------------------Define Parameters-------------------------------*/ + +/*--------------------------Define Parameters End-------------------------------*/ + +/*------------------------------Define structure----------------------------*/ + +/*------------------------------Define structure End----------------------------*/ + +/*--------------------------Exported Function prototype---------------------*/ + +u32 +phy_CalculateBitShift( + u32 BitMask + ); + +u32 +PHY_QueryBBReg_8195A( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask + ); + +VOID +PHY_SetBBReg_8195A( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); + +/*--------------------------Exported Function prototype End---------------------*/ + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_cmd.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_cmd.h new file mode 100644 index 0000000..3ef53e9 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_cmd.h @@ -0,0 +1,337 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8195A_CMD_H__ +#define __RTL8195A_CMD_H__ + +//---------------------------------------------------------------------------------------------------------// +//---------------------------------- H2C CMD DEFINITION ------------------------------------------------// +//---------------------------------------------------------------------------------------------------------// + +enum h2c_cmd_8195A{ + //Common Class: 000 + H2C_8195A_RSVD_PAGE = 0x00, + H2C_8195A_MEDIA_STATUS_RPT = 0x01, + H2C_8195A_SCAN_ENABLE = 0x02, + H2C_8195A_KEEP_ALIVE = 0x03, + H2C_8195A_DISCON_DECISION = 0x04, + H2C_8195A_PSD_OFFLOAD = 0x05, + H2C_8195A_AP_OFFLOAD = 0x08, + H2C_8195A_BCN_RSVDPAGE = 0x09, + H2C_8195A_PROBERSP_RSVDPAGE = 0x0A, + H2C_8195A_FCS_RSVDPAGE = 0x10, + H2C_8195A_FCS_INFO = 0x11, + + //PoweSave Class: 001 + H2C_8195A_SET_PWR_MODE = 0x20, + H2C_8195A_PS_TUNING_PARA = 0x21, + H2C_8195A_PS_TUNING_PARA2 = 0x22, + H2C_8195A_P2P_LPS_PARAM = 0x23, + H2C_8195A_P2P_PS_OFFLOAD = 0x24, + H2C_8195A_PS_SCAN_ENABLE = 0x25, + H2C_8195A_SAP_PS_ = 0x26, + H2C_8195A_INACTIVE_PS_ = 0x27, //Inactive_PS + H2C_8195A_FWLPS_IN_IPS_ = 0x28, + + + //Dynamic Mechanism Class: 010 + H2C_8195A_MACID_CFG = 0x40, + H2C_8195A_TXBF = 0x41, + H2C_8195A_RSSI_SETTING = 0x42, + H2C_8195A_AP_REQ_TXRPT = 0x43, + H2C_8195A_INIT_RATE_COLLECT = 0x44, + + //BT Class: 011 + H2C_8195A_B_TYPE_TDMA = 0x60, + H2C_8195A_BT_INFO = 0x61, + H2C_8195A_FORCE_BT_TXPWR = 0x62, + H2C_8195A_BT_IGNORE_WLANACT = 0x63, + H2C_8195A_DAC_SWING_VALUE = 0x64, + H2C_8195A_ANT_SEL_RSV = 0x65, + H2C_8195A_WL_OPMODE = 0x66, + H2C_8195A_BT_MP_OPER = 0x67, + H2C_8195A_BT_CONTROL = 0x68, + H2C_8195A_BT_WIFI_CTRL = 0x69, + H2C_8195A_BT_FW_PATCH = 0x6A, + + //WOWLAN Class: 100 + H2C_8195A_WOWLAN = 0x80, + H2C_8195A_REMOTE_WAKE_CTRL = 0x81, + H2C_8195A_AOAC_GLOBAL_INFO = 0x82, + H2C_8195A_AOAC_RSVD_PAGE = 0x83, + H2C_8195A_AOAC_RSVD_PAGE2 = 0x84, + H2C_8195A_D0_SCAN_OFFLOAD_INFO = 0x85, + H2C_8195A_D0_SCAN_OFFLOAD_CTRL = 0x86, + H2C_8195A_CHNL_SWITCH_OFFLOAD = 0x87, + + H2C_8195A_RESET_TSF = 0xC0, + H2C_8195A_BCN_IGNORE_EDCCA = 0xC2, + + H2C_8195A_MAXID, +}; + +#define H2C_8195A_RSVDPAGE_LOC_LEN 5 +#define H2C_8195A_MEDIA_STATUS_RPT_LEN 3 +#define H2C_8195A_KEEP_ALIVE_CTRL_LEN 2 +#define H2C_8195A_DISCON_DECISION_LEN 3 +//#define H2C_8195A_AP_OFFLOAD_LEN 3 +#define H2C_8195A_PWRMODE_LEN 11 +#define H2C_8195A_PSTUNEPARAM_LEN 4 +#define H2C_8195A_MACID_CFG_LEN 7 +#define H2C_8195A_BTMP_OPER_LEN 4 +#define H2C_8195A_WOWLAN_LEN 3 +#define H2C_8195A_REMOTE_WAKE_CTRL_LEN 1 +#define H2C_8195A_AOAC_GLOBAL_INFO_LEN 2 +#define H2C_8195A_AOAC_RSVDPAGE_LOC_LEN 7 +//#define H2C_8723B_SCAN_OFFLOAD_CTRL_LEN 4 +#define H2C_8195A_BT_FW_PATCH_LEN 6 +#define H2C_8195A_RSSI_SETTING_LEN 4 +#define H2C_8195A_AP_REQ_TXRPT_LEN 2 +#define H2C_8195A_FORCE_BT_TXPWR_LEN 3 +#define H2C_8195A_BCN_IGNORE_EDCCA_LEN 1 + + +#ifdef CONFIG_WOWLAN +#define eqMacAddr(a,b) ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 ) +#define cpMacAddr(des,src) ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3],(des)[4]=(src)[4],(des)[5]=(src)[5]) +#define cpIpAddr(des,src) ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3]) + +// +// ARP packet +// +// LLC Header +#define GET_ARP_PKT_LLC_TYPE(__pHeader) ReadEF2Byte( ((u8*)(__pHeader)) + 6) + +//ARP element +#define GET_ARP_PKT_OPERATION(__pHeader) ReadEF2Byte( ((u8*)(__pHeader)) + 6) +#define GET_ARP_PKT_SENDER_MAC_ADDR(__pHeader, _val) cpMacAddr((u8*)(_val), ((u8*)(__pHeader))+8) +#define GET_ARP_PKT_SENDER_IP_ADDR(__pHeader, _val) cpIpAddr((u8*)(_val), ((u8*)(__pHeader))+14) +#define GET_ARP_PKT_TARGET_MAC_ADDR(__pHeader, _val) cpMacAddr((u8*)(_val), ((u8*)(__pHeader))+18) +#define GET_ARP_PKT_TARGET_IP_ADDR(__pHeader, _val) cpIpAddr((u8*)(_val), ((u8*)(__pHeader))+24) + +#define SET_ARP_PKT_HW(__pHeader, __Value) WriteEF2Byte( ((u8*)(__pHeader)) + 0, __Value) +#define SET_ARP_PKT_PROTOCOL(__pHeader, __Value) WriteEF2Byte( ((u8*)(__pHeader)) + 2, __Value) +#define SET_ARP_PKT_HW_ADDR_LEN(__pHeader, __Value) WriteEF1Byte( ((u8*)(__pHeader)) + 4, __Value) +#define SET_ARP_PKT_PROTOCOL_ADDR_LEN(__pHeader, __Value) WriteEF1Byte( ((u8*)(__pHeader)) + 5, __Value) +#define SET_ARP_PKT_OPERATION(__pHeader, __Value) WriteEF2Byte( ((u8*)(__pHeader)) + 6, __Value) +#define SET_ARP_PKT_SENDER_MAC_ADDR(__pHeader, _val) cpMacAddr(((u8*)(__pHeader))+8, (u8*)(_val)) +#define SET_ARP_PKT_SENDER_IP_ADDR(__pHeader, _val) cpIpAddr(((u8*)(__pHeader))+14, (u8*)(_val)) +#define SET_ARP_PKT_TARGET_MAC_ADDR(__pHeader, _val) cpMacAddr(((u8*)(__pHeader))+18, (u8*)(_val)) +#define SET_ARP_PKT_TARGET_IP_ADDR(__pHeader, _val) cpIpAddr(((u8*)(__pHeader))+24, (u8*)(_val)) + +#define FW_WOWLAN_FUN_EN BIT(0) +#define FW_WOWLAN_PATTERN_MATCH BIT(1) +#define FW_WOWLAN_MAGIC_PKT BIT(2) +#define FW_WOWLAN_UNICAST BIT(3) +#define FW_WOWLAN_ALL_PKT_DROP BIT(4) +#define FW_WOWLAN_GPIO_ACTIVE BIT(5) +#define FW_WOWLAN_REKEY_WAKEUP BIT(6) +#define FW_WOWLAN_DEAUTH_WAKEUP BIT(7) + +#define FW_WOWLAN_GPIO_WAKEUP_EN BIT(0) +#define FW_FW_PARSE_MAGIC_PKT BIT(1) + +#define FW_REMOTE_WAKE_CTRL_EN BIT(0) +#define FW_REALWOWLAN_EN BIT(5) + +#endif //CONFIG_WOWLAN + +//---------------------------------------------------------------------------------------------------------// +//---------------------------------- H2C CMD CONTENT --------------------------------------------------// +//---------------------------------------------------------------------------------------------------------// +//_RSVDPAGE_LOC_CMD_0x00 +#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) +#define SET_8723B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) +#define SET_8723B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) +#define SET_8723B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) + +//_MEDIA_STATUS_RPT_PARM_CMD_0x01 +#define SET_8723B_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value) +#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value) +#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value) +#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value) + +//_KEEP_ALIVE_CMD_0x03 +#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value) +#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value) +#define SET_8723B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value) + +//_DISCONNECT_DECISION_CMD_0x04 +#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value) +#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value) +#define SET_8723B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value) +#define SET_8723B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value) + +// _PWR_MOD_CMD_0x20 +#define SET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value) +#define SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value) +#define SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) +#define SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) +#define SET_8723B_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) +#define SET_8723B_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value) +#define SET_8723B_H2CCMD_PWRMODE_PARM_TDMA_SLOT_LEN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+7, 0, 8, __Value) +#define SET_8723B_H2CCMD_PWRMODE_PARM_TDMA_PERIOD_LEN_1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+8, 0, 8, __Value) +#define SET_8723B_H2CCMD_PWRMODE_PARM_TDMA_PERIOD_LEN_2(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+9, 0, 8, __Value) +#define SET_8723B_H2CCMD_PWRMODE_PARM_TDMA_PERIOD_LEN_3(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+10, 0, 8, __Value) + +#define GET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd) LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8) + +// _PS_TUNE_PARAM_CMD_0x21 +#define SET_8723B_H2CCMD_PSTUNE_PARM_BCN_TO_LIMIT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_8723B_H2CCMD_PSTUNE_PARM_DTIM_TIMEOUT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value) +#define SET_8723B_H2CCMD_PSTUNE_PARM_ADOPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 1, __Value) +#define SET_8723B_H2CCMD_PSTUNE_PARM_PS_TIMEOUT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 1, 7, __Value) +#define SET_8723B_H2CCMD_PSTUNE_PARM_DTIM_PERIOD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value) + +//_MACID_CFG_CMD_0x40 +#define SET_8723B_H2CCMD_MACID_CFG_MACID(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_RAID(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 5, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_SGI_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 7, 1, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_BW(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 2, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_NO_UPDATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 3, 1, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_VHT_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 4, 2, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_DISPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 6, 1, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_DISRA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 7, 1, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_RATE_MASK0(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_RATE_MASK1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+4, 0, 8, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_RATE_MASK2(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+5, 0, 8, __Value) +#define SET_8723B_H2CCMD_MACID_CFG_RATE_MASK3(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+6, 0, 8, __Value) + +//_RSSI_SETTING_CMD_0x42 +#define SET_8723B_H2CCMD_RSSI_SETTING_MACID(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_8723B_H2CCMD_RSSI_SETTING_RSSI(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 7, __Value) +#define SET_8723B_H2CCMD_RSSI_SETTING_ULDL_STATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value) + +// _AP_REQ_TXRPT_CMD_0x43 +#define SET_8723B_H2CCMD_APREQRPT_PARM_MACID1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_8723B_H2CCMD_APREQRPT_PARM_MACID2(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value) + +// _FORCE_BT_TXPWR_CMD_0x62 +#define SET_8723B_H2CCMD_BT_PWR_IDX(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value) + +// _FORCE_BT_MP_OPER_CMD_0x67 +#define SET_8723B_H2CCMD_BT_MPOPER_VER(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 4, __Value) +#define SET_8723B_H2CCMD_BT_MPOPER_REQNUM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 4, __Value) +#define SET_8723B_H2CCMD_BT_MPOPER_IDX(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value) +#define SET_8723B_H2CCMD_BT_MPOPER_PARAM1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value) +#define SET_8723B_H2CCMD_BT_MPOPER_PARAM2(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value) + +// _BT_FW_PATCH_0x6A +#define SET_8723B_H2CCMD_BT_FW_PATCH_SIZE(__pH2CCmd, __Value) SET_BITS_TO_LE_2BYTE((pu1Byte)(__pH2CCmd), 0, 16, __Value) +#define SET_8723B_H2CCMD_BT_FW_PATCH_ADDR0(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) +#define SET_8723B_H2CCMD_BT_FW_PATCH_ADDR1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) +#define SET_8723B_H2CCMD_BT_FW_PATCH_ADDR2(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) +#define SET_8723B_H2CCMD_BT_FW_PATCH_ADDR3(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value) + +// _WoWLAN PARAM_CMD_0x80 +#define SET_8723B_H2CCMD_WOWLAN_FUNC_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value) +#define SET_8723B_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value) +#define SET_8723B_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value) +#define SET_8723B_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value) +#define SET_8723B_H2CCMD_WOWLAN_ALL_PKT_DROP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value) +#define SET_8723B_H2CCMD_WOWLAN_GPIO_ACTIVE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value) +#define SET_8723B_H2CCMD_WOWLAN_REKEY_WAKE_UP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value) +#define SET_8723B_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value) +#define SET_8723B_H2CCMD_WOWLAN_GPIONUM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 7, __Value) +#define SET_8723B_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 7, 1, __Value) +#define SET_8723B_H2CCMD_WOWLAN_GPIO_DURATION(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) + +// _REMOTE_WAKEUP_CMD_0x81 +#define SET_8723B_H2CCMD_REMOTE_WAKECTRL_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value) +#define SET_8723B_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value) +#define SET_8723B_H2CCMD_REMOTE_WAKE_CTRL_NDP_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value) +#define SET_8723B_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value) +#define SET_8723B_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value) +#define SET_8723B_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 1, __Value) + +// AOAC_GLOBAL_INFO_0x82 +#define SET_8723B_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_8723B_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) + +// AOAC_RSVDPAGE_LOC_0x83 +#define SET_8723B_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd), 0, 8, __Value) +#define SET_8723B_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) +#define SET_8723B_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) +#define SET_8723B_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) +#define SET_8723B_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) +#define SET_8723B_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_REQ(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value) +#define SET_8723B_H2CCMD_AOAC_RSVDPAGE_LOC_NETWORK_LIST(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+6, 0, 8, __Value) + +//---------------------------------------------------------------------------------------------------------// +//------------------------------------------- Structure --------------------------------------------------// +//---------------------------------------------------------------------------------------------------------// +typedef struct _RSVDPAGE_LOC { + u8 LocProbeRsp; + u8 LocPsPoll; + u8 LocNullData; + u8 LocQosNull; + u8 LocBTQosNull; +#ifdef CONFIG_WOWLAN + u8 LocRemoteCtrlInfo; + u8 LocArpRsp; + u8 LocNbrAdv; + u8 LocGTKRsp; + u8 LocGTKInfo; + u8 LocProbeReq; + u8 LocNetList; +#endif //CONFIG_WOWLAN +} RSVDPAGE_LOC_8195A, *PRSVDPAGE_LOC_8195A; + + +//---------------------------------------------------------------------------------------------------------// +//---------------------------------- Function Statement --------------------------------------------------// +//---------------------------------------------------------------------------------------------------------// + +// host message to firmware cmd +void rtl8195a_set_FwPwrMode_cmd(PADAPTER padapter, u8 Mode); +void rtl8195a_set_FwJoinBssRpt_cmd(PADAPTER padapter, u8 mstatus); +#ifdef CONFIG_BT_COEXIST +void rtl8195a_set_BTCoex_AP_mode_FwRsvdPkt_cmd(PADAPTER padapter); +#endif +void rtl8195a_set_rssi_cmd(PADAPTER padapter, u8 *param); +void rtl8195a_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8* arg, u8 rssi_level); +void rtl8195a_fw_try_ap_cmd(PADAPTER padapter, u32 need_ack); +//s32 rtl8723b_set_lowpwr_lps_cmd(PADAPTER padapter, u8 enable); +void rtl8195a_set_FwPsTuneParam_cmd(PADAPTER padapter); +void rtl8195a_set_FwMacIdConfig_cmd(_adapter* padapter, u8 mac_id, u8 raid, u8 bw, u8 sgi, u32 mask); +void rtl8195a_set_FwMediaStatusRpt_cmd(PADAPTER padapter, u8 mstatus, u8 macid); +void rtl8195a_set_FwBtMpOper_cmd(PADAPTER padapter, u8 idx, u8 ver, u8 reqnum, u8 *param); +void rtl8195a_download_rsvd_page(PADAPTER padapter, u8 mstatus); +#ifdef CONFIG_P2P +void rtl8195a_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state); +#endif //CONFIG_P2P + +void CheckFwRsvdPageContent(PADAPTER padapter); + +#ifdef CONFIG_WOWLAN +void rtl8195a_set_wowlan_cmd(_adapter* padapter, u8 enable); +void SetFwRelatedForWoWLAN8195a(_adapter* padapter, u8 bHostIsGoingtoSleep); +#endif//CONFIG_WOWLAN + +void rtl8195a_set_FwPwrModeInIPS_cmd(PADAPTER padapter); + +#ifdef CONFIG_TSF_RESET_OFFLOAD +u8 rtl8195a_reset_tsf(_adapter *padapter, u8 reset_port); +#endif // CONFIG_TSF_RESET_OFFLOAD +s32 FillH2CCmd8195A(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer); + +#define FillH2CCmd FillH2CCmd8195A +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_dm.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_dm.h new file mode 100644 index 0000000..3bafb95 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_dm.h @@ -0,0 +1,81 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8195A_DM_H__ +#define __RTL8195A_DM_H__ +enum{ + UP_LINK, + DOWN_LINK, +}; + +enum{ + LLT, + TXRPT, + RXBUFF, + TXBUFF, +}; + +//============================================================ +// Description: +// +// This file is for 8723B dynamic mechanism only +// +// +//============================================================ + +//0x8000: TXRPT:2K +//max macid : 128 +//TXRPT SIZE 16 bytes +//0x8800: Rate Mask:1K +//Ramask size 8bytes + + +#define DYNAMIC_FUNC_BT BIT(0) + + +#define REPORT_OFFSET 0x8100 +#define RAMASK_OFFSET 0x8900 +#define LLT_H_ADDR 0x650 +#define TXREPORT_H_ADDR 0x660 +#define RXBUFF_H_ADDR 0x670 +#define TXBUFF_H_ADDR 0x680 + + + +//============================================================ +// structure and define +//============================================================ + +//============================================================ +// function prototype +//============================================================ + +void rtl8195a_init_dm_priv(PADAPTER padapter); +void rtl8195a_deinit_dm_priv(PADAPTER padapter); + +void rtl8195a_InitHalDm(PADAPTER padapter); +void rtl8195a_HalDmWatchDog(PADAPTER padapter); +void rtl8195a_HalDmWatchDog_in_LPS(PADAPTER padapter); +void rtl8195a_hal_dm_in_lps(PADAPTER padapter); +u8 ReadTxrpt8(IN PADAPTER padapter, IN u8 Macid, IN u8 Offset); +VOID WriteTxrpt8(IN PADAPTER padapter, IN u8 Macid, IN u8 Offset, IN u8 Val); +BOOLEAN GetMediaStatusCommon(IN PADAPTER pAdapter, IN u8 macid); +VOID GetTxrptStatistic(IN PDM_ODM_T pDM_Odm, IN PODM_RA_INFO_T pRaInfo,IN u8 Reset_var); +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_led.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_led.h new file mode 100644 index 0000000..700e32f --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_led.h @@ -0,0 +1,35 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8195A_LED_H__ +#define __RTL8195A_LED_H__ + +#include +#include +#include + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +void rtl8195a_InitSwLeds(PADAPTER padapter); +void rtl8195a_DeInitSwLeds(PADAPTER padapter); + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_pmu_cmd.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_pmu_cmd.h new file mode 100644 index 0000000..eb79ded --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_pmu_cmd.h @@ -0,0 +1,130 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8195A_PMU_CMD_H__ +#define __RTL8195A_PMU_CMD_H__ + +typedef enum _RT_MEDIA_STATUS{ + RT_MEDIA_DISCONNECT = 0, + RT_MEDIA_CONNECT = 1 +}RT_MEDIA_STATUS; + +typedef enum _H2C_CMD_ { + //1 Class1: Common + H2CID_RSVDPAGE = 0x00, + H2CID_JOININFO = 0x01, + H2CID_SCAN = 0x02, + H2CID_KEEP_ALIVE = 0x03, + H2CID_DISCONNECT_DECISION = 0x04, + H2CID_PSD_OFFLOAD = 0x05, + rsvd2 = 0x06, + rsvd3 = 0x07, + H2CID_AP_OFFLOAD = 0x08, + H2CID_BCN_RsvdPage = 0x09, + H2CID_Probersp_RsvdPage = 0x0A, + H2CID_AP_OFFLOAD_STAINFO = 0x0B, + + H2CID_FAST_CS_RSVDPAGE = 0x10, + H2CID_FAST_CHANNEL_SWITCH = 0x11, + H2CID_BB_GAIN_REPORT = 0x12, + H2CID_GPIO_CTRL = 0x13, + H2CID_HW_INFO = 0x14, + + //1 Class2: Power Save + H2CID_SETPWRMODE = 0x20, + H2CID_PSTURNINGPARM = 0x21, + H2CID_PSTURNINGPARM2 = 0x22, + H2CID_PSLPSPARM = 0x23, + H2CID_P2PPS_OFFLOAD = 0x24, + H2CID_PS_SCAN = 0x25, + H2CID_SAPPS = 0x26, + H2CID_INACTIVE_PS = 0x27, + H2CID_NOLINK_PS = 0x28, + + //1 Class3: Dynamic Mechaism + H2CID_MACID_CFG = 0x40, + H2CID_TxBF = 0x41, + H2CID_RSSI_SETTING = 0x42, + H2CID_AP_REQ_TXRPT = 0x43, + H2CID_INIT_RATE_COLLECT = 0x44, + H2CID_IQK_OFFLOAD = 0x45, + + //1 Class4: BT Coex + H2CID_B_TYPE_TDMA = 0x60, + H2CID_BT_INFO = 0x61, + H2CID_FORCE_BT_TXPWR = 0x62, + H2CID_BT_IGNORE_WLANACT = 0x63, + H2CID_DAC_SWING_VALUE = 0x64, + H2CID_ANT_SEL_REVERSE = 0x65, + H2CID_WL_OPMODE = 0x66, + H2CID_BT_MP_OPERATION = 0x67, + H2CID_BT_CONTROL = 0x68, + H2CID_BT_WIFICTRL = 0x69, + H2CID_BT_PATCH_DOWNLOAD = 0x6A, + H2CID_BT_SCO_eSCO_OPERATION = 0x6B, + H2CID_BT_Page_Scan_Interval = 0x6C, + H2CID_WL_Calibraion = 0x6D, + H2CID_GNT_BT_CTRL = 0x6E, + H2CID_BT_ONLY_TEST = 0x6F, + + //1 Class5: WOWLAN + H2CID_WoWLAN = 0x80, + H2CID_RemoteWakeCtrl = 0x81, + H2CID_AOAC_Global_info = 0x82, + H2CID_AOAC_Rsvdpage1 = 0x83, + H2CID_AOAC_Rsvdpage2 = 0x84, + H2CID_D0_Scan_offload_info = 0x85, + H2CID_D0_Scan_offload_ctrl = 0x86, + H2CID_Switch_channel = 0x87, + H2CID_AOAC_Rsvdpage3 = 0x88, + H2CID_GPIO_WF_Customize = 0x89, + H2CID_P2P_RsvdPage = 0x8A, + H2CID_P2P_Offload = 0x8B, + + //1 Class6: LTECOEX + H2CID_LTECOEX_EN = 0xA0, + H2CID_WLAN_High_Priority = 0xA1, + + //1 Class7: Patch + H2CID_TSF_RESET = 0xC0, + H2CID_BB_NHM = 0xC1, + H2CID_BCN_IGNORE_EDCCA = 0xC2, + + //1 Class8: Testing + H2CID_H2C2HLB = 0xE0 + +} H2C_CMD, *PH2C_CMD; + +typedef struct _H2CParam_JoinInfo_ { + BOOLEAN bConnected:1; + BOOLEAN bMacid_ind:1; + u8 rsvd:6; + u8 macid; + u8 macid_end; +}H2CParam_JoinInfo, *PH2CParam_JoinInfo; + +typedef struct _H2CParam_RsvdPage_ { + RSVDPAGE_LOC_8195A RsvdPageLoc; + u8 *ReservedPagePacket; + u32 TotalPacketLen; +} H2CParam_RsvdPage, *PH2CParam_RsvdPage; + +u32 H2CCmdCommon(PADAPTER padapter, u8 ElementID, u8 *pCmdBuffer); + +#endif //__RTL8195A_PMU_CMD_H__ \ No newline at end of file diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_pmu_task.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_pmu_task.h new file mode 100644 index 0000000..c44f33d --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_pmu_task.h @@ -0,0 +1,491 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8195A_PMU_TASK_H__ +#define __RTL8195A_PMU_TASK_H__ +#ifdef CONFIG_LITTLE_WIFI_MCU_FUNCTION_THREAD +//BitMAPDefine +#define RATEADAPTIVE BIT0 +#define H2CEVENT BIT1 +#define C2HEVENT BIT2 +#define RATRYDONE BIT3 +#define REMOTEWAKEEVENT BIT4 +#define APOFFLOADEVENT BIT5 +#define MAILBOXEVENT BIT6 +#define SWTIMEREVENT BIT7 + +#define BBNHMEVENT BIT8 +#define DBGPKTEVENT BIT9 +#define SIDEBANDWoWLAN BIT10 + +#if 0 +#ifdef CONFIG_POWER_SAVING +#define BCNEARLY BIT11 +#define MTIBCNIVLEAR BIT12 +#define BCNRX BIT13 +#define RXBMD1 BIT14 +#define RXBMD0 BIT15 +#define RXUMD1 BIT16 +#define RXUMD0 BIT17 +#define TXPKTIN BIT18 +#define GTIMER6TO BIT19 +#define GTIMER7TO BIT20 +#endif //#ifdef CONFIG_POWER_SAVING +#endif + +//BT mailbox +#define SETDATA BIT2 +#define SETACK BIT1 +#define GETDATA BIT0 + +/*--------------------------Define -------------------------------------------*/ +#ifdef CONFIG_POWER_SAVING +#define MACID_CLIENT 0 +#endif //#ifdef CONFIG_POWER_SAVING + +/*------------------------------Define Enum-----------------------------------*/ +#ifdef CONFIG_POWER_SAVING + +//REGDUMP_FW_ERR0 +typedef enum _FW_ERR0_STATUS_ +{ + FES0_H2C_CMDID = BIT0, + FES0_H2C_PTR = BIT1, + FES0_BB_RW = BIT2, + FES0_TXPKT_TXPAUSE = BIT3, + FES0_TSF_STABLE = BIT4, + FES0_TXSM_STABLE = BIT5, + FES0_RPWM_STABLE = BIT6, + FES0_C2H_TIMEOUT_ERR = BIT7, + +}FW_ERR0_STATUS, *PFW_ERR0_STATUS; + + +//TxPauseReasonCode +typedef enum _TRPC_ { + TPRC_ISSUENULLDATA_1 = 0x26, + TPRC_ISSUENULLDATA_2 = 0x27, + TPRC_PSS2TS3 = 0x2B, + TPRC_PSS0TS1 = 0x2C, + TPRC_PSS2TS4 = 0x2D, + TPRC_PSS2TS5 = 0x2E, + TPRC_PSS0TS6 = 0x2F, +} TRPC, *PTRPC; + + +typedef enum _PS_MODE_SETTING_SELECTION_ +{ + MODE_SETTING_ACTIVE = 0, + MODE_SETTING_LEGACY = 1, + MODE_SETTING_WMMPS = 2, + #ifdef TDMA_POWER_SAVING + MODE_SETTING_TDMA = 3 + #endif //#ifdef TDMA_POWER_SAVING +}PS_MODE_SETTING_SELECTION, *PPS_MODE_SETTING_SELECTION; + +typedef enum _RxListenBeaconMode_ +{ + RLBM_MIN = 0, + RLBM_MAX = 1, + RLBM_SELF_DEFINED = 2 + +}RxListenBeaconMode, *PRxListenBeaconMode; + +typedef enum _SMART_PS_MODE_FOR_LEGACY_ +{ + SMART_PS_MODE_LEGACY_PWR1 = 0, // TRX all use PS_POLL + SMART_PS_MODE_TX_PWR0 = 1, // TX: pwr bit = 0, RX: PS_POLL + SMART_PS_MODE_TRX_PWR0 = 2 // TX: pwr bit = 0, RX: NULL(0) +}SMART_PS_MODE_FOR_LEGACY, *PSMART_PS_MODE_FOR_LEGACY; + +#endif //#ifdef CONFIG_POWER_SAVING + +/*--------------------------Define MACRO--------------------------------------*/ + +#define HAL_WL_READ32(addr) \ + HAL_READ32(WIFI_REG_BASE, addr) +#define HAL_WL_WRITE32(addr, value) \ + HAL_WRITE32(WIFI_REG_BASE, addr, value) +#define HAL_WL_READ16(addr) \ + HAL_READ16(WIFI_REG_BASE, addr) +#define HAL_WL_WRITE16(addr, value) \ + HAL_WRITE16(WIFI_REG_BASE, addr, value) +#define HAL_WL_READ8(addr) \ + HAL_READ8(WIFI_REG_BASE, addr) +#define HAL_WL_WRITE8(addr, value) \ + HAL_WRITE8(WIFI_REG_BASE, addr, value) + +#ifdef CONFIG_POWER_SAVING +#define mtou(x) ((x)<<10) //ms->us + +#define WAIT_TSF_STABLE_BREAK_CNT 5000 +#define WAIT_TSF_STABLE_CNT 50 +#define WAIT_TSF_STABLE_ONCE_TIME 20 +#define TSFIS32K 1 +#define TSFIS40M 0 +#define GET_TSF_STATE() (((HAL_WL_READ16(0xF0) & BIT8) && (HAL_WL_READ16(0xF0) & BIT9)) ? TSFIS32K : TSFIS40M) + + +#define REG_ARFR5_8723B 0x04A4 +#define WAIT_TXSM_STABLE_CNT 1000 +#define WAIT_TXSM_STABLE_ONCE_TIME 50 + +#define MODE_TIMER 1 +#define MODE_COUNTER 0 + + +#define GTIMER6 6 +#define GTIMER7 7 + +#define TIMER_BCNTO GTIMER6 //6 +#define TIMER_DTIM GTIMER6 //6 +#define TIMER_CHECKSTATE GTIMER6 //6 +#define TIMER_PSTRX GTIMER7 //7 +#ifdef TDMA_POWER_SAVING +#define TIMER_TDMA GTIMER7 //7 +#endif //#ifdef TDMA_POWER_SAVING + +#define RTY_LMT_NULLDATA 8 +#define RTY_LMT_PSPOLL 24 +#define RTY_LMT_MORE_NULLDATA 24 + + +/* + PS_RX_INFO[7:0]: Power Save RX Information Register + initial value: 0x00 + REG III.220 (Offset 0x 0692h) PS_RX_INFO Register Definition +*/ +#define RXDATAIN0 BIT0 //PSTX +#define RXDATAIN1 BIT1 //PSRX +#define RXDATAIN2 BIT2 +#define RXMGTIN0 BIT3 +#define RXCTRLIN0 BIT4 + +//CPWM Definition +#define CLK_DOWN_RDY BIT4 + +//Power Save Tuning Parameter +//#if IS_CATEGORY_WOWLAN(CONFIG_CATEGORY_SEL) +//#define DEFAULT_BCN_TO_LIMIT 5 // 1 +//#define DEFAULT_BCN_TO_PERIOD 8 //5 +//#else +#define DEFAULT_BCN_TO_LIMIT 2 // 1 +#define DEFAULT_BCN_TO_PERIOD 4 //5 +//#endif + +#define DEFAULT_BCN_TO_TIMES_LIMIT 2 // 20140806 +#define DEFAULT_DTIM_TIMEOUT 15 // 7 // 7 ms +#define DEFAULT_PS_TIMEOUT 15 // 20 // 20 ms +#define DEFAULT_PS_DTIM_PERIOD 7 +#define DEFAULT_PS_DRV_EARLY 2 +#define DEFAULT_ENTER32K_TIMER 1000 //us +//#define PS_DRV_BCN_SHIFT_MAX DEFAULT_PS_DRV_EARLY-1 + + +#define NULL_DATA0_ALLOW 1 +#define NULL_DATA0_DENY 0 + +#define PS_RF_OFF_8723B 0 +#define PS_GO_ON BIT0 +#define PS_TX_NULL BIT1 +#define PS_RF_ON BIT2 +#define PS_REGISTER_ACTIVE BIT3 +//#define PS_ACK BIT6 +//#define PS_TOGGLE BIT7 + + +#define PS_STATE_MASK (0x0F) +//#define PS_STATE(x) (PS_STATE_MASK & (x)) +#define PS_IS_TX_NULL(x) ((x) & PS_TX_NULL ) +//#define PS_IS_ACK(x) ((x) & PS_ACK ) +#define PS_IS_CLK_ON(x) ((x) & (PS_RF_OFF_8723B |PS_ALL_ON )) +#define PS_IS_RF_OFF(x) ((x)|PS_RF_OFF_8723B) +//#define PS_IS_RF_ON(x) ((x) & (PS_RF_ON)) +//#define PS_IS_ACTIVE(x) ((x) & (PS_REGISTER_ACTIVE)) + +#define PS_STATUS_S0 (PS_REGISTER_ACTIVE | PS_RF_ON) //(1,1,0) all on = register active + rf on +#define PS_STATUS_S1 (PS_REGISTER_ACTIVE | PS_RF_ON | PS_TX_NULL) //(1,1,1) all on + tx null(1) +#define PS_STATUS_S2 (PS_RF_ON) //(0,1,0) register sleep + rf on +#define PS_STATUS_S3 (PS_RF_ON | PS_TX_NULL) //(0,1,1) register sleep + rf on + tx null(0) +#define PS_STATUS_S4 0 //(0,0,0) all OFF +#define PS_STATUS_S5 (PS_TX_NULL ) //(0,0,1) SCAN = register sleep + rf on + scan enable +#define PS_STATUS_S6 (PS_REGISTER_ACTIVE) //(1,0,0) NoA off = register active + rf off + + +/* DATA FIN Condition Flags */ +#define STA_DATA_OPEN BIT0 // indicate that FW open due to TIM = 1 condition. (PS-POLL as trigger frame) +#define BC_DATA_OPEN BIT1 // indicate that FW open due to DTIM = 1 condition. (BC & MC) +#define QOS_DATA_OPEN BIT2 // indicate that FW open due to UAPSD trigger condition. (QNULL) + +#define ALL_80211_DATA_OPEN (STA_DATA_OPEN | BC_DATA_OPEN | QOS_DATA_OPEN) +#define IS_80211_DATA_OPEN(x) ((x) & ALL_80211_DATA_OPEN) + +#define C2H_DATA_OPEN BIT3 // indicate that FW open due to C2H event +#define IS_C2H_DATA_OPEN(x) ((x) & C2H_DATA_OPEN) + +#define BCN_DATA_OPEN BIT4 +#define APP_DATA_OPEN BIT5 + +#define SET_DATA_OPEN(x, type) ((x) |= (type)) +#define CLR_DATA_OPEN(x, type) ((x) &= (~type)) +#define IS_DATA_OPEN(x, type) ((x) & (type)) + +//pwr state +#define PS_TYPE_32KPERMISSION 0 +#define PS_TYPE_CURRENT_PS_STATE 1 +#define PS_TYPE_LASTRPWM 2 + +#define CCXRPT_START_ADDR 0x0000 +#define SW_DEFINE_NULL0 0x123 +#define SW_DEFINE_NULL1 0x321 +#define SW_DEFINE_OFFSET 6 +#define RETRY_OVER BIT7 + +#define CCXRPT_OFFSET(x) (x << 3) + +#define WLAN_ENTERCRITICAL() __disable_irq() +#define WLAN_EXITCRITICAL() __enable_irq() + +#endif //#ifdef CONFIG_POWER_SAVING + +/*------------------------------Define Struct---------------------------------*/ +#ifdef CONFIG_POWER_SAVING +typedef struct _PS_PARM_ { + + u8 Enter32KHzPermission; + u8 bAllQueueUAPSD; + u8 ps_dtim_flag; // indicate dtim of current beacon. + u8 pstrx_rxcnt_period; + u8 NoConnect32k; + u8 ack_last_rpwm; + u8 TxNull0; + u8 TxNull1; + + u8 TxNull0ok; + u8 TxNull1ok; + u8 RfOffLicenseForBCNRx; //filen: After we received ps_bcn_cnt beacons, we can sleep(rf off). + u8 BCNAggEn; + u8 IsGoingTo32K; + u8 bMaxTrackingBcnMode; + u8 BcnTraceDone; + +/* + filen: to indicate whether it is smart power saving or not + 0: Legacy PS + 1: Smart PS(RX use ps_poll) + 2: Smart PS (RX use null_data(0)) +*/ + u8 smart_ps:4; //enum SMART_PS_MODE + u8 RLBM:4; // RX BCN MODE (min, max, active, ...) + u8 AwakeInterval; + u8 ps_mode; // ps type (avtive, legacy, wmmps) + u8 ClkRequestEnable; + u8 last_rpwm; + u8 current_ps_state; + u8 ps_data_open; + u8 ps_bcn_pass_time; // fw will only report one beacon information to driver after ps_bcn_pass_time ms. Unit: 100ms + + u8 ps_dtim_period; + u8 ps_dtim_cnt; + u8 ps_bcn_to; // beacon timeout (ms). + u8 bcn_to_cnt; // indicate the total number of contnuous BCN_TO we have received. + u8 bcn_to_times_cnt; //20140806 + u8 min_rate_in_rrsr; +// u8 lps_control; + u16 ps_drv_early_itv; +// u32 RFECtrl; + u32 null1_ok_cnt; + #ifdef TDMA_POWER_SAVING + u8 SlotPeriod; + u8 FirstOnPeriod; + u8 SecondOnPeriod; + u8 ThirdOnPeriod; + u8 CurrentSlot; + BOOLEAN TDMAOnPeriod; + #endif // #ifdef TDMA_POWER_SAVING + +#if 0 + u8 BcnAheadShift; + u8 BcnEarlyShift; + u8 BcnEarlyShiftMax; + u8 DefaultBcnEarly; + u8 RxBcnCount; + u8 TBTTCount; + u8 CurrentEarly; + u8 CurrentTimeOut; + u8 ReachBcnLimitCount; + u8 BcnDelayInAheadGroupOfAP; + u8 BcnDelayInRearGroupOfAP; + u8 BcnDelay[BCN_CALCULATION_MAX]; + u8 XtalDelay; + + u16 TSFOnTBTT; //unit in TU + u32 TSFOnRxBcn; + u32 TSFOnBcnEarly; +#endif + +#if 0 +#if CONFIG_BCNEARLY_ADJUST + u8 BcnEalyIndex; + u8 BcnEarlyAdjustPosition; + u8 BcnAdjustTogo; + u8 RxBcnArray[BCN_ADJUST_COUNT]; +#endif +#endif +}PS_PARM, *PPS_PARM; + +typedef struct _LEGACY_PS_PPARM_ { + u8 ps_mode:7; + u8 ClkRequestEnable:1; + u8 RLBM:4; //RX Listen BCN Mode + u8 smart_ps:4; + u8 AwakeInterval; //Unit: beacon interval, this field is only valid in PS Self-Defined mode + u8 bAllQueueUAPSD:1; // 1: all queue are uapsd 0: not all queue are uapsd + u8 bMaxTrackingBcnMode:1; + u8 rsvd:6; +//#if CONFIG_FAST_CPWM + u8 PwrState; +//#else +// u8 permission32k:1; +// u8 rsvd1:7; +//#endif + + u8 LowPwrRxBCN :1; + u8 AntAutoSwitch :1; + u8 PSAllowBTHighPri:1; + u8 ProtectBCN :1; + u8 SilencePeriod :1; + u8 FastBTConnect :1; + u8 TwoAntennaEn :1; + u8 rsvd2 :1; + u8 AdoptUserSetting:1; + u8 DrvBcnEarlyShift :3; + u8 DrvBcnTimeOut :4; + #ifdef TDMA_POWER_SAVING + u8 SlotPeriod; + u8 FirstOnPeriod; + u8 SecondOnPeriod; + u8 ThirdOnPeriod; + #endif //#ifdef TDMA_POWER_SAVING +}LEGACY_PS_PARM, *PLEGACY_PS_PARM; + +//H2C Index: 0x20 +typedef struct _H2CParam_SetPwrMode_parm_ { + LEGACY_PS_PARM PwrModeParm; +}H2CParam_PwrMode, *PH2CParam_PwrMode; + +#endif //#ifdef CONFIG_POWER_SAVING + +/*------------------------------Function declaration--------------------------*/ + +#ifdef CONFIG_POWER_SAVING +#if 0 +extern void ClockDown(PADAPTER padapter); +extern void ClockUp(PADAPTER padapter); +extern void PrintBcnFunction(void); +extern void DisDbgMsg(void); +extern void EnDbgMsg(void); +extern void UpChGain(void); +extern void StartCount(PADAPTER padapter); +extern void StopCount(PADAPTER padapter); +extern void IssueNullDataTest(PADAPTER padapter); +extern void ShowPowerState(PADAPTER padapter); +#endif +#ifdef TDMA_POWER_SAVING +extern void TDMAChangeStateTask(PADAPTER padapter); +#endif //#ifdef TDMA_POWER_SAVING +extern void EnterPS(PADAPTER padapter); +extern void GTimer6Handle(VOID *Data); +extern void GTimer7Handle(VOID *Data); +extern void InitGTimer1ms(PADAPTER padapter, u8 IRQDis, u8 TimerID, u32 Period); +extern void DeInitGTimer1ms(PADAPTER padapter, u8 TimerID); +extern void ChangeTransmiteRate(u16 offset, u8 rate); +extern void PowerBitSetting(BOOLEAN bPowerBit, u16 offset); +extern void ChkandChangePS(PPS_PARM pPSParm, BOOLEAN bPowerBit); +extern u16 IssueRsvdPagePacketSetting(u8 PageNum, BOOLEAN bHwSEQEn, u8 RtyLmt); +extern void InitRsvdPgPkt(void); +extern BOOLEAN IssueNullData(PPS_PARM pPSParm, BOOLEAN bPowerBit, u8 RtyLmt); +extern void IssuePSPoll(void); +extern BOOLEAN WaitTxStateMachineOk(void); +extern void WriteTxPause(u8 value, u8 rcode); +extern void PsCloseRF(void); +extern void PsOpenRF(void); +extern void SetPwrStateReg(PPS_PARM pPSParm, u8 PwrStateType, u8 value); +extern BOOLEAN ChkTxQueueIsEmpty(void); +extern void InitPS(PADAPTER padapter); +extern void ResetPSParm(PADAPTER padapter); +extern void Legacy_PS_Setting(PADAPTER padapter); +extern void PSModeSetting(PADAPTER padapter, u8 on); +extern void ConfigListenBeaconPeriod(PPS_PARM pPSParm, u8 RLBM, u8 AwakeInterval); +extern void PSSetMode(PADAPTER padapter, PLEGACY_PS_PARM pparm); +extern BOOLEAN PS_S2_Condition_Match(PPS_PARM pPSParm); +extern BOOLEAN PS_S4_Condition_Match(PADAPTER padapter); +extern BOOLEAN PS_32K_Condition_Match(void); +extern void PS_S2ToS3ToS0State(PADAPTER padapter, u8 nulldata0Allow); +extern void PS_S2ToS0State(PPS_PARM pPSParm); +extern void PS_S3ToS2orS0State(PPS_PARM pPSParm); +extern void PS_S0ToS1ToS2State(PADAPTER padapter); +extern void PS_S1ToS0orS2State(PPS_PARM pPSParm); +extern void PS_S2ToS4State(PADAPTER padapter); +extern void PS_S2ToS5State(PPS_PARM pPSParm); +extern void PS_S4ToS2State(PPS_PARM pPSParm, u8 ReleaseTxPause); +extern void PS_S5ToS2State(PPS_PARM pPSParm); +extern void PS_S0ToS6State(PADAPTER padapter); +extern void PS_S6ToS0State(PPS_PARM pPSParm); +extern void CheckTSFIsStable(u8 ReqState); +extern void WaitHWStateReady(void); +extern void SysClkDown(PPS_PARM pPSParm); +extern void SysClkUp(PPS_PARM pPSParm); +extern void SleepTo32K(PPS_PARM pPSParm); +extern void Change_PS_State(PADAPTER padapter, u8 request_ps_state, u8 nulldata0Allow); +extern void ChangePSStateByRPWM(PADAPTER padapter); +extern void SetSmartPSTimer(PADAPTER padapter); +extern void SmartPS2InitTimerAndToGetRxPkt(PADAPTER padapter); +extern void PS_OnBeacon(PADAPTER padapter); +extern void PSBcnEarlyProcess(PADAPTER padapter); +extern void PSMtiBcnEarlyProcess(PADAPTER padapter); +extern void PSRxBcnProcess(PADAPTER padapter); +extern void TxPktInPSOn(PADAPTER padapter); +extern void PsBcnToProcess(PADAPTER padapter); +extern BOOL RPWMProcess(PADAPTER padapter, BOOLEAN benter32k); +extern void ISR_MtiBcnEarly(PADAPTER padapter); +extern void ISR_BcnEarly(PADAPTER padapter); +extern void ISR_RxBcn(PADAPTER padapter); +extern void ISR_RxBCMD1(PADAPTER padapter); +extern void ISR_RxBCMD0(PADAPTER padapter); +extern void ISR_RxUCMD1(PADAPTER padapter); +extern void ISR_RxUCMD0(PADAPTER padapter); +extern void ISR_TxPktIn(PADAPTER padapter); +extern void ISR_TXCCX(PADAPTER padapter); +extern void H2CHDL_SetPwrMode(PADAPTER padapter, u8* pCmdBuffer); +extern void CheckInReqStateTask(PADAPTER padapter); +extern void HalSetRPWM(PADAPTER padapter, BOOLEAN benter32k); +extern u32 HalGetNullTxRpt(PADAPTER padapter); +//extern thread_return HalEnter32KThreadRtl8195a(thread_context context); +#endif //#ifdef CONFIG_POWER_SAVING + +extern void ISR_TBTT(PADAPTER padapter); +extern void H2CHDL_BcnIgnoreEDCCA(PADAPTER padapter, u8* pCmdBuffer); + +void PMUTask(PADAPTER padapter); +void PMUInitial(PADAPTER padapter); + +#endif //CONFIG_LITTLE_WIFI_MCU_FUNCTION_THREAD +#endif //__RTL8195A_PMU_TASK_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_recv.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_recv.h new file mode 100644 index 0000000..7fad730 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_recv.h @@ -0,0 +1,232 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8195A_RECV_H__ +#define __RTL8195A_RECV_H__ + +#ifdef CONFIG_WLAN_HAL_TEST +#define MAX_RECVBUF_SZ 1200//(RX_DMA_SIZE_8195A - RX_DMA_RESERVED_SIZE_8195A) +#else +#if (SKB_PRE_ALLOCATE_RX==1) +#define MAX_RECVBUF_SZ MAX_SKB_BUF_SIZE //1650 //(RX_DMA_SIZE_8195A - RX_DMA_RESERVED_SIZE_8195A) +#else +#define MAX_RECVBUF_SZ (HAL_INTERFACE_OVERHEAD_SKB_DATA+RX_DRIVER_INFO+\ + RXDESC_SIZE +\ + (MAX_RX_PKT_LIMIT * 512) +\ + SKB_RESERVED_FOR_SAFETY) // 0+32+24+512*4+0 = 2104 +#endif +#endif + +//DWORD 0 +#define SET_RX_STATUS_DESC_PKT_LEN_8812(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value) +#define SET_RX_STATUS_DESC_EOR_8812(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value) +#define SET_RX_STATUS_DESC_OWN_8812(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value) + +#define GET_RX_STATUS_DESC_PKT_LEN_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14) +#define GET_RX_STATUS_DESC_CRC32_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1) +#define GET_RX_STATUS_DESC_ICV_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1) +#define GET_RX_STATUS_DESC_DRVINFO_SIZE_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4) +#define GET_RX_STATUS_DESC_SECURITY_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3) +#define GET_RX_STATUS_DESC_QOS_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1) +#define GET_RX_STATUS_DESC_SHIFT_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2) +#define GET_RX_STATUS_DESC_PHY_STATUS_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1) +#define GET_RX_STATUS_DESC_SWDEC_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1) +#define GET_RX_STATUS_DESC_LAST_SEG_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 28, 1) +#define GET_RX_STATUS_DESC_FIRST_SEG_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 29, 1) +#define GET_RX_STATUS_DESC_EOR_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1) +#define GET_RX_STATUS_DESC_OWN_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1) + +//DWORD 1 +#define GET_RX_STATUS_DESC_MACID_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7) +#define GET_RX_STATUS_DESC_TID_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4) +#define GET_RX_STATUS_DESC_AMSDU_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1) +#define GET_RX_STATUS_DESC_RXID_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 14, 1) +#define GET_RX_STATUS_DESC_PAGGR_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 15, 1) +#define GET_RX_STATUS_DESC_A1_FIT_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 16, 4) +#define GET_RX_STATUS_DESC_CHKERR_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 20, 1) +#define GET_RX_STATUS_DESC_IPVER_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 21, 1) +#define GET_RX_STATUS_DESC_IS_TCPUDP__8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 22, 1) +#define GET_RX_STATUS_DESC_CHK_VLD_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 23, 1) +#define GET_RX_STATUS_DESC_PAM_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 24, 1) +#define GET_RX_STATUS_DESC_PWR_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 25, 1) +#define GET_RX_STATUS_DESC_MORE_DATA_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 26, 1) +#define GET_RX_STATUS_DESC_MORE_FRAG_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 27, 1) +#define GET_RX_STATUS_DESC_TYPE_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 28, 2) +#define GET_RX_STATUS_DESC_MC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 30, 1) +#define GET_RX_STATUS_DESC_BC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 31, 1) + +//DWORD 2 +#define GET_RX_STATUS_DESC_SEQ_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12) +#define GET_RX_STATUS_DESC_FRAG_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4) +#define GET_RX_STATUS_DESC_RX_IS_QOS_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1) +#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6) +#define GET_RX_STATUS_DESC_RPT_SEL_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1) + +//DWORD 3 +#define GET_RX_STATUS_DESC_RX_RATE_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7) +#define GET_RX_STATUS_DESC_HTC_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1) +#define GET_RX_STATUS_DESC_EOSP_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1) +#define GET_RX_STATUS_DESC_BSSID_FIT_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2) +#ifdef CONFIG_USB_RX_AGGREGATION +#define GET_RX_STATUS_DESC_USB_AGG_PKTNUM_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8) +#endif +#define GET_RX_STATUS_DESC_PATTERN_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1) +#define GET_RX_STATUS_DESC_UNICAST_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1) +#define GET_RX_STATUS_DESC_MAGIC_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1) + +//DWORD 6 +#define GET_RX_STATUS_DESC_SPLCP_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 0, 1) +#define GET_RX_STATUS_DESC_LDPC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 1, 1) +#define GET_RX_STATUS_DESC_STBC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 2, 1) +#define GET_RX_STATUS_DESC_BW_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 4, 2) + +//DWORD 5 +#define GET_RX_STATUS_DESC_TSFL_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32) + +#define GET_RX_STATUS_DESC_BUFF_ADDR_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32) +#define GET_RX_STATUS_DESC_BUFF_ADDR64_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32) + +#define SET_RX_STATUS_DESC_BUFF_ADDR_8812(__pRxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value) + +typedef struct rxreport_8723b +{ + //DWORD 0 + u32 pktlen:14; + u32 crc32:1; + u32 icverr:1; + u32 drvinfosize:4; + u32 security:3; + u32 qos:1; + u32 shift:2; + u32 physt:1; + u32 swdec:1; + u32 rsvd0028:2; + u32 eor:1; + u32 rsvd0031:1; + + //DWORD 1 + u32 macid:7; + u32 rsvd0407:1; + u32 tid:4; + u32 macid_vld:1; + u32 amsdu:1; + u32 rxid_match:1; + u32 paggr:1; + u32 a1fit:4; + u32 chkerr:1; //20 + u32 rx_ipv:1; + u32 rx_is_tcp_udp:1; + u32 chk_vld:1; //23 + u32 pam:1; + u32 pwr:1; + u32 md:1; + u32 mf:1; + u32 type:2; + u32 mc:1; + u32 bc:1; + + //DWORD 2 + u32 seq:12; + u32 frag:4; + u32 rx_is_qos:1; + u32 rsvd0817:1; + u32 wlanhd_iv_len:6; + u32 hwrsvd0824:4; + u32 c2h_ind:1; + u32 rsvd0829:2; + u32 fcs_ok:1; + + //DWORD 3 + u32 rx_rate:7; + u32 rsvd1207:3; + u32 htc:1; + u32 esop:1; + u32 bssid_fit:2; + u32 rsvd1214:2; + u32 dma_agg_num:8; + u32 rsvd1224:5; + u32 patternmatch:1; + u32 unicastwake:1; + u32 magicwake:1; + + //DWORD 4 + u32 splcp:1; //Ofdm sgi or cck_splcp + u32 ldpc:1; + u32 stbc:1; + u32 not_sounding:1; + u32 bw:2; + u32 rsvd1606:26; + + //DWORD 5 + u32 tsfl; +} RXREPORT, *PRXREPORT; + +typedef struct phystatus_8723b +{ + u32 rxgain_a:7; + u32 trsw_a:1; + u32 rxgain_b:7; + u32 trsw_b:1; + u32 chcorr_l:16; + + u32 sigqualcck:8; + u32 cfo_a:8; + u32 cfo_b:8; + u32 chcorr_h:8; + + u32 noisepwrdb_h:8; + u32 cfo_tail_a:8; + u32 cfo_tail_b:8; + u32 rsvd0824:8; + + u32 rsvd1200:8; + u32 rxevm_a:8; + u32 rxevm_b:8; + u32 rxsnr_a:8; + + u32 rxsnr_b:8; + u32 noisepwrdb_l:8; + u32 rsvd1616:8; + u32 postsnr_a:8; + + u32 postsnr_b:8; + u32 csi_a:8; + u32 csi_b:8; + u32 targetcsi_a:8; + + u32 targetcsi_b:8; + u32 sigevm:8; + u32 maxexpwr:8; + u32 exintflag:1; + u32 sgien:1; + u32 rxsc:2; + u32 idlelong:1; + u32 anttrainen:1; + u32 antselb:1; + u32 antsel:1; +} PHYSTATUS, *PPHYSTATUS; + + +s32 rtl8195a_init_recv_priv(PADAPTER padapter); +void rtl8195a_free_recv_priv(PADAPTER padapter); +void rtl8195a_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc); +void rtl8195a_query_rx_phy_status(union recv_frame *precvframe, u8 *pphy_status); + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_rf.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_rf.h new file mode 100644 index 0000000..f02cdea --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_rf.h @@ -0,0 +1,32 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8195A_RF_H__ +#define __RTL8195A_RF_H__ + + +int PHY_RF6052_Config8195A( IN PADAPTER Adapter ); + +VOID +PHY_RF6052SetBandwidth8195A( + IN PADAPTER Adapter, + IN CHANNEL_WIDTH Bandwidth); + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_spec.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_spec.h new file mode 100644 index 0000000..e6136e7 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_spec.h @@ -0,0 +1,345 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#ifndef __RTL8195A_SPEC_H__ +#define __RTL8195A_SPEC_H__ + +#include + + +#define HAL_NAV_UPPER_UNIT_8723B 128 // micro-second + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_BT_WIFI_ANTENNA_SWITCH_8723B 0x0038 +#define REG_PAD_CTRL1_8723B 0x0064 +#define REG_AFE_CTRL_4_8723B 0x0078 +#define REG_HMEBOX_DBG_0_8723B 0x0088 +#define REG_HMEBOX_DBG_1_8723B 0x008A +#define REG_HMEBOX_DBG_2_8723B 0x008C +#define REG_HMEBOX_DBG_3_8723B 0x008E + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_C2HEVT_CMD_ID_8723B 0x01A0 +#define REG_C2HEVT_CMD_LEN_8723B 0x01AE +#ifdef CONFIG_WOWLAN +#define REG_WOWLAN_WAKE_REASON 0x01C7 +#endif + +#define REG_HMEBOX_EXT0_8723B 0x01F0 +#define REG_HMEBOX_EXT1_8723B 0x01F4 +#define REG_HMEBOX_EXT2_8723B 0x01F8 +#define REG_HMEBOX_EXT3_8723B 0x01FC + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#define REG_RXDMA_MODE_CTRL_8723B 0x0290 + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +#define REG_TXPKTBUF_BCNQ_BDNY_8195A 0x0424 +#define REG_TXPKTBUF_MGQ_BDNY_8195A 0x0425 +#define REG_TXPKTBUF_WMAC_LBK_BF_HD_8195A 0x045D +#ifdef CONFIG_WOWLAN +#define REG_TXPKTBUF_IV_LOW 0x0484 +#define REG_TXPKTBUF_IV_HIGH 0x0488 +#endif + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +#define REG_SECONDARY_CCA_CTRL_8723B 0x0577 + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + + +//============================================================ +// SDIO Bus Specification +//============================================================ + +//----------------------------------------------------- +// SDIO CMD Address Mapping +//----------------------------------------------------- + +//----------------------------------------------------- +// I/O bus domain (Host) +//----------------------------------------------------- + +//----------------------------------------------------- +// SDIO register +//----------------------------------------------------- +#define SDIO_REG_HCPWM1_8723B 0x025 // HCI Current Power Mode 1 + + +//============================================================================ +// 8723 Regsiter Bit and Content definition +//============================================================================ + +//2 HSISR +// interrupt mask which needs to clear +#define MASK_HSISR_CLEAR (HSISR_GPIO12_0_INT |\ + HSISR_SPS_OCP_INT |\ + HSISR_RON_INT |\ + HSISR_PDNINT |\ + HSISR_GPIO9_INT) + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- + +#define RXDMA_AGG_MODE_EN BIT(1) +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#ifdef CONFIG_WOWLAN +#define RXPKT_RELEASE_POLL BIT(16) +#define RXDMA_IDLE BIT(17) +#define RW_RELEASE_EN BIT(18) +#endif + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + +#endif + +//==================================================== +// EEPROM/Efuse PG Offset for 8195A +//==================================================== +// 0x10 ~ 0x63 = TX power area. +#define EEPROM_TX_PWR_INX_8195A 0x20 +#define EEPROM_ChannelPlan_8195A 0xC8 +#define EEPROM_XTAL_8195A 0xC9 +#define EEPROM_THERMAL_METER_8195A 0xCA + +#define EEPROM_IQK_LCK_8195A 0xCB +#define EEPROM_2G_5G_PA_TYPE_8195A 0xCC +#define EEPROM_2G_LNA_TYPE_GAIN_SEL_8195A 0xCD +#define EEPROM_5G_LNA_TYPE_GAIN_SEL_8195A 0xCE + +#define EEPROM_RF_BOARD_OPTION_8195A 0x131 + +#define EEPROM_FEATURE_OPTION_8195A 0x132 +#define EEPROM_RF_BT_SETTING_8195A 0x133 + +#define EEPROM_VERSION_8195A 0x134 +#define EEPROM_CustomID_8195A 0x135 + +#define EEPROM_TX_BBSWING_2G_8195A 0x136 +#define EEPROM_TX_PWR_CAL_RATE_8195A 0x138 +#define EEPROM_RF_ANTENNA_OPT_8195A 0x139 +#define EEPROM_RFE_OPTION_8195A 0x13A + +//RTL8723BU +#define EEPROM_MAC_ADDR_8723BU 0x107 +#define EEPROM_VID_8723BU 0x100 +#define EEPROM_PID_8723BU 0x102 +#define EEPROM_PA_TYPE_8723BU 0xBC +#define EEPROM_LNA_TYPE_2G_8723BU 0xBD + +//RTL8723BS +#define EEPROM_MAC_ADDR_8723BS 0x11A +#define EEPROM_MAC_ADDR_8195A 0x11A + +#define EEPROM_Voltage_ADDR_8723B 0x8 + +#define EEPROM_TX_KFREE_8195A 0xEE + +#define EEPROM_PACKAGE_TYPE_8195A 0xF8 + +//==================================================== +// EEPROM/Efuse Value Type +//==================================================== +#define EETYPE_TX_PWR 0x0 +//==================================================== +// EEPROM/Efuse Default Value +//==================================================== +#define EEPROM_CID_DEFAULT 0x0 +#define EEPROM_CID_DEFAULT_EXT 0xFF // Reserved for Realtek +#define EEPROM_CID_TOSHIBA 0x4 +#define EEPROM_CID_CCX 0x10 +#define EEPROM_CID_QMI 0x0D +#define EEPROM_CID_WHQL 0xFE + +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_NCC_TAIWAN 0xB +#define EEPROM_CHANNEL_PLAN_CHIAN 0XC +#define EEPROM_CHANNEL_PLAN_SINGAPORE_INDIA_MEXICO 0XD +#define EEPROM_CHANNEL_PLAN_KOREA 0xE +#define EEPROM_CHANNEL_PLAN_TURKEY 0xF +#define EEPROM_CHANNEL_PLAN_JAPAN 0x10 +#define EEPROM_CHANNEL_PLAN_FCC_NO_DFS 0x11 +#define EEPROM_CHANNEL_PLAN_JAPAN_NO_DFS 0x12 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_5G 0x13 +#define EEPROM_CHANNEL_PLAN_TAIWAN_NO_DFS 0x14 + +#define EEPROM_USB_OPTIONAL1 0xE +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + +#define RTL_EEPROM_ID 0x8129 +#define EEPROM_Default_TSSI 0x0 +#define EEPROM_Default_BoardType 0x02 +#define EEPROM_Default_ThermalMeter 0x12 +#define EEPROM_Default_ThermalMeter_92SU 0x7 +#define EEPROM_Default_ThermalMeter_88E 0x18 +#define EEPROM_Default_ThermalMeter_8812 0x18 +#define EEPROM_Default_ThermalMeter_8192E 0x1A +#define EEPROM_Default_ThermalMeter_8723B 0x18 +#define EEPROM_Default_ThermalMeter_8195A 0x1A + + +#define EEPROM_Default_CrystalCap 0x0 +#define EEPROM_Default_CrystalCap_8723B 0x20 +#define EEPROM_Default_CrystalCap_8195A 0x20 +#define EEPROM_Default_CrystalFreq 0x0 +#define EEPROM_Default_TxPowerLevel_92C 0x22 +#define EEPROM_Default_TxPowerLevel_2G 0x2C +#define EEPROM_Default_TxPowerLevel_5G 0x22 +#define EEPROM_Default_TxPowerLevel 0x22 +#define EEPROM_Default_HT40_2SDiff 0x0 +#define EEPROM_Default_HT20_Diff 2 +#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 +#define EEPROM_Default_LegacyHTTxPowerDiff_92C 0x3 +#define EEPROM_Default_LegacyHTTxPowerDiff_92D 0x4 +#define EEPROM_Default_HT40_PwrMaxOffset 0 +#define EEPROM_Default_HT20_PwrMaxOffset 0 + +#define EEPROM_Default_PID 0x1234 +#define EEPROM_Default_VID 0x5678 +#define EEPROM_Default_CustomerID 0xAB +#define EEPROM_Default_CustomerID_8188E 0x00 +#define EEPROM_Default_SubCustomerID 0xCD +#define EEPROM_Default_Version 0 + +#define EEPROM_Default_externalPA_C9 0x00 +#define EEPROM_Default_externalPA_CC 0xFF +#define EEPROM_Default_internalPA_SP3T_C9 0xAA +#define EEPROM_Default_internalPA_SP3T_CC 0xAF +#define EEPROM_Default_internalPA_SPDT_C9 0xAA +#ifdef CONFIG_PCI_HCI +#define EEPROM_Default_internalPA_SPDT_CC 0xA0 +#else +#define EEPROM_Default_internalPA_SPDT_CC 0xFA +#endif +#define EEPROM_Default_PAType 0 +#define EEPROM_Default_LNAType 0 + +//New EFUSE deafult value +#define EEPROM_DEFAULT_24G_CCK_INDEX 0x20 +#define EEPROM_DEFAULT_24G_40M_INDEX 0x20 +#define EEPROM_DEFAULT_24G_HT20_DIFF 0X00 +#define EEPROM_DEFAULT_24G_OFDM_DIFF 0X02 + +#define EEPROM_DEFAULT_5G_INDEX 0X2A +#define EEPROM_DEFAULT_5G_HT20_DIFF 0X00 +#define EEPROM_DEFAULT_5G_OFDM_DIFF 0X04 + +#define EEPROM_DEFAULT_DIFF 0XFE +#define EEPROM_DEFAULT_CHANNEL_PLAN 0x7F +#define EEPROM_DEFAULT_BOARD_OPTION 0x01 // Enable power by rate and power limit +#define EEPROM_DEFAULT_RFE_OPTION 0x04 +#define EEPROM_DEFAULT_FEATURE_OPTION 0x00 +#define EEPROM_DEFAULT_BT_OPTION 0x10 +#define EEPROM_DEFAULT_TX_CALIBRATE_RATE 0x00 + + + + + + +#ifdef CONFIG_USB_HCI +//should be renamed and moved to another file +typedef enum _BOARD_TYPE_8192CUSB{ + BOARD_USB_DONGLE = 0, // USB dongle + BOARD_USB_High_PA = 1, // USB dongle with high power PA + BOARD_MINICARD = 2, // Minicard + BOARD_USB_SOLO = 3, // USB solo-Slim module + BOARD_USB_COMBO = 4, // USB Combo-Slim module +} BOARD_TYPE_8723BUSB, *PBOARD_TYPE_8723BUSB; + +#endif + +#if defined (CONFIG_PCI_HCI) || defined(CONFIG_LX_HCI) +#define RT_BCN_INT_MASKS (IMR_BcnInt | IMR_TBDOK | IMR_TBDER) +#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK) +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_sreset.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_sreset.h new file mode 100644 index 0000000..e990627 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_sreset.h @@ -0,0 +1,30 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTL8195A_SRESET_H_ +#define _RTL8195A_SRESET_H_ + +#include + +#ifdef DBG_CONFIG_ERROR_DETECT +extern void rtl8723b_sreset_xmit_status_check(_adapter *padapter); +extern void rtl8723b_sreset_linked_status_check(_adapter *padapter); +#endif +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_xmit.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_xmit.h new file mode 100644 index 0000000..c5925fb --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hal/rtl8195a/rtl8195a_xmit.h @@ -0,0 +1,473 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8195A_XMIT_H__ +#define __RTL8195A_XMIT_H__ + +// +// Queue Select Value in TxDesc +// +#define QSLT_BK 0x2//0x01 +#define QSLT_BE 0x0 +#define QSLT_VI 0x5//0x4 +#define QSLT_VO 0x7//0x6 +#define QSLT_BEACON 0x10 +#define QSLT_HIGH 0x11 +#define QSLT_MGNT 0x12 +#define QSLT_CMD 0x13 + +#define MAX_TID (15) + +//OFFSET 0 +#define OFFSET_SZ 0 +#define OFFSET_SHT 16 +#define BMC BIT(24) +#define LSG BIT(26) +#define FSG BIT(27) +#define OWN BIT(31) + + +//OFFSET 4 +#define PKT_OFFSET_SZ 0 +#define BK BIT(6) +#define QSEL_SHT 8 +#define Rate_ID_SHT 16 +#define NAVUSEHDR BIT(20) +#define PKT_OFFSET_SHT 26 +#define HWPC BIT(31) + +//OFFSET 8 +#define AGG_EN BIT(29) + +//OFFSET 12 +#define SEQ_SHT 16 + +//OFFSET 16 +#define QoS BIT(6) +#define HW_SEQ_EN BIT(7) +#define USERATE BIT(8) +#define DISDATAFB BIT(10) +#define DATA_SHORT BIT(24) +#define DATA_BW BIT(25) + +//OFFSET 20 +#define SGI BIT(6) + +// +//defined for TX DESC Operation +// +typedef struct txdesc_8723b +{ + // Offset 0 + u32 pktlen:16; + u32 offset:8; + u32 bmc:1; + u32 htc:1; + u32 rsvd0026:1; + u32 rsvd0027:1; + u32 linip:1; + u32 noacm:1; + u32 gf:1; + u32 rsvd0031:1; + + // Offset 4 + u32 macid:7; + u32 rsvd0407:1; + u32 qsel:5; + u32 rdg_nav_ext:1; + u32 lsig_txop_en:1; + u32 pifs:1; + u32 rate_id:5; + u32 en_desc_id:1; + u32 sectype:2; + u32 pkt_offset:5; // unit: 8 bytes + u32 moredata:1; + u32 txop_ps_cap:1; + u32 txop_ps_mode:1; + + // Offset 8 + u32 p_aid:9; + u32 rsvd0809:1; + u32 cca_rts:2; + u32 agg_en:1; + u32 rdg_en:1; + u32 null_0:1; + u32 null_1:1; + u32 bk:1; + u32 morefrag:1; + u32 raw:1; + u32 spe_rpt:1; + u32 ampdu_density:3; + u32 bt_null:1; + u32 g_id:6; + u32 rsvd0830:2; + + // Offset 12 + u32 wheader_len:4; + u32 chk_en:1; + u32 early_rate:1; + u32 hw_ssn_sel:2; + u32 userate:1; + u32 disrtsfb:1; + u32 disdatafb:1; + u32 cts2self:1; + u32 rtsen:1; + u32 hw_rts_en:1; + u32 port_id:1; + u32 navusehdr:1; + u32 use_max_len:1; + u32 max_agg_num:5; + u32 ndpa:2; + u32 ampdu_max_time:8; + + // Offset 16 + u32 datarate:7; + u32 try_rate:1; + u32 data_ratefb_lmt:5; + u32 rts_ratefb_lmt:4; + u32 rty_lmt_en:1; + u32 data_rt_lmt:6; + u32 rtsrate:5; + u32 pcts_en:1; + u32 pcts_mask_idx:2; + + // Offset 20 + u32 data_sc:4; + u32 data_short:1; + u32 data_bw:2; + u32 data_ldpc:1; + u32 data_stbc:2; + u32 vcs_stbc:2; + u32 rts_short:1; + u32 rts_sc:4; + u32 rsvd2016:7; + u32 tx_ant:4; + u32 txpwr_offset:3; + u32 rsvd2031:1; + + // Offset 24 + u32 sw_define:12; + u32 mbssid:4; + u32 antsel_A:3; + u32 antsel_B:3; + u32 antsel_C:3; + u32 antsel_D:3; + u32 rsvd2428:4; + + // Offset 28 + u32 checksum:16; + u32 rsvd2816:8; + u32 usb_txagg_num:8; + + // Offset 32 + u32 rts_rc:6; + u32 bar_rty_th:2; + u32 data_rc:6; + u32 rsvd3214:1; + u32 en_hwseq:1; + u32 nextneadpage:8; + u32 tailpage:8; + + // Offset 36 + u32 padding_len:11; + u32 txbf_path:1; + u32 seq:12; + u32 final_data_rate:8; +}TXDESC_8723B, *PTXDESC_8723B; + +#ifndef __INC_HAL8723BDESC_H +#define __INC_HAL8723BDESC_H + +#define RX_STATUS_DESC_SIZE_8723B 24 +#define RX_DRV_INFO_SIZE_UNIT_8723B 8 + + +//DWORD 0 +#define SET_RX_STATUS_DESC_PKT_LEN_8723B(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value) +#define SET_RX_STATUS_DESC_EOR_8723B(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value) +#define SET_RX_STATUS_DESC_OWN_8723B(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value) + +#define GET_RX_STATUS_DESC_PKT_LEN_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14) +#define GET_RX_STATUS_DESC_CRC32_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1) +#define GET_RX_STATUS_DESC_ICV_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1) +#define GET_RX_STATUS_DESC_DRVINFO_SIZE_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4) +#define GET_RX_STATUS_DESC_SECURITY_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3) +#define GET_RX_STATUS_DESC_QOS_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1) +#define GET_RX_STATUS_DESC_SHIFT_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2) +#define GET_RX_STATUS_DESC_PHY_STATUS_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1) +#define GET_RX_STATUS_DESC_SWDEC_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1) +#define GET_RX_STATUS_DESC_LAST_SEG_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 28, 1) +#define GET_RX_STATUS_DESC_FIRST_SEG_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 29, 1) +#define GET_RX_STATUS_DESC_EOR_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1) +#define GET_RX_STATUS_DESC_OWN_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1) + +//DWORD 1 +#define GET_RX_STATUS_DESC_MACID_8723B(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7) +#define GET_RX_STATUS_DESC_TID_8723B(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4) +#define GET_RX_STATUS_DESC_AMSDU_8723B(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1) +#define GET_RX_STATUS_DESC_RXID_MATCH_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 14, 1) +#define GET_RX_STATUS_DESC_PAGGR_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 15, 1) +#define GET_RX_STATUS_DESC_A1_FIT_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 16, 4) +#define GET_RX_STATUS_DESC_CHKERR_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 20, 1) +#define GET_RX_STATUS_DESC_IPVER_8723B(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 21, 1) +#define GET_RX_STATUS_DESC_IS_TCPUDP__8723B(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 22, 1) +#define GET_RX_STATUS_DESC_CHK_VLD_8723B(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 23, 1) +#define GET_RX_STATUS_DESC_PAM_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 24, 1) +#define GET_RX_STATUS_DESC_PWR_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 25, 1) +#define GET_RX_STATUS_DESC_MORE_DATA_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 26, 1) +#define GET_RX_STATUS_DESC_MORE_FRAG_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 27, 1) +#define GET_RX_STATUS_DESC_TYPE_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 28, 2) +#define GET_RX_STATUS_DESC_MC_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 30, 1) +#define GET_RX_STATUS_DESC_BC_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 31, 1) + +//DWORD 2 +#define GET_RX_STATUS_DESC_SEQ_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12) +#define GET_RX_STATUS_DESC_FRAG_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4) +#define GET_RX_STATUS_DESC_RX_IS_QOS_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1) +#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6) +#define GET_RX_STATUS_DESC_RPT_SEL_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1) + +//DWORD 3 +#define GET_RX_STATUS_DESC_RX_RATE_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7) +#define GET_RX_STATUS_DESC_HTC_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1) +#define GET_RX_STATUS_DESC_EOSP_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1) +#define GET_RX_STATUS_DESC_BSSID_FIT_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2) +#ifdef CONFIG_USB_RX_AGGREGATION +#define GET_RX_STATUS_DESC_USB_AGG_PKTNUM_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8) +#endif +#define GET_RX_STATUS_DESC_PATTERN_MATCH_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1) +#define GET_RX_STATUS_DESC_UNICAST_MATCH_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1) +#define GET_RX_STATUS_DESC_MAGIC_MATCH_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1) + +//DWORD 6 +#define GET_RX_STATUS_DESC_SPLCP_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 0, 1) +#define GET_RX_STATUS_DESC_LDPC_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 1, 1) +#define GET_RX_STATUS_DESC_STBC_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 2, 1) +#define GET_RX_STATUS_DESC_BW_8723B(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 4, 2) + +//DWORD 5 +#define GET_RX_STATUS_DESC_TSFL_8723B(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32) + +#define GET_RX_STATUS_DESC_BUFF_ADDR_8723B(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32) +#define GET_RX_STATUS_DESC_BUFF_ADDR64_8723B(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32) + +#define SET_RX_STATUS_DESC_BUFF_ADDR_8723B(__pRxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value) + + +// Dword 0 +#define GET_TX_DESC_OWN_8723B(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc, 31, 1) + +#define SET_TX_DESC_PKT_SIZE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value) +#define SET_TX_DESC_OFFSET_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value) +#define SET_TX_DESC_BMC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value) +#define SET_TX_DESC_HTC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value) +#define SET_TX_DESC_LAST_SEG_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value) +#define SET_TX_DESC_FIRST_SEG_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value) +#define SET_TX_DESC_LINIP_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value) +#define SET_TX_DESC_NO_ACM_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value) +#define SET_TX_DESC_GF_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value) +#define SET_TX_DESC_OWN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value) + +// Dword 1 +#define SET_TX_DESC_MACID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value) +#define SET_TX_DESC_QUEUE_SEL_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value) +#define SET_TX_DESC_RDG_NAV_EXT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value) +#define SET_TX_DESC_LSIG_TXOP_EN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value) +#define SET_TX_DESC_PIFS_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value) +#define SET_TX_DESC_RATE_ID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value) +#define SET_TX_DESC_EN_DESC_ID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value) +#define SET_TX_DESC_SEC_TYPE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value) +#define SET_TX_DESC_PKT_OFFSET_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value) + + +// Dword 2 +#define SET_TX_DESC_PAID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 9, __Value) +#define SET_TX_DESC_CCA_RTS_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value) +#define SET_TX_DESC_AGG_ENABLE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value) +#define SET_TX_DESC_RDG_ENABLE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value) +#define SET_TX_DESC_AGG_BREAK_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value) +#define SET_TX_DESC_MORE_FRAG_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value) +#define SET_TX_DESC_RAW_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value) +#define SET_TX_DESC_SPE_RPT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value) +#define SET_TX_DESC_AMPDU_DENSITY_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value) +#define SET_TX_DESC_BT_INT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value) +#define SET_TX_DESC_GID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value) + + +// Dword 3 +#define SET_TX_DESC_WHEADER_LEN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value) +#define SET_TX_DESC_CHK_EN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value) +#define SET_TX_DESC_EARLY_MODE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value) +#define SET_TX_DESC_HWSEQ_SEL_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value) +#define SET_TX_DESC_USE_RATE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value) +#define SET_TX_DESC_DISABLE_RTS_FB_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value) +#define SET_TX_DESC_DISABLE_FB_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value) +#define SET_TX_DESC_CTS2SELF_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value) +#define SET_TX_DESC_RTS_ENABLE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value) +#define SET_TX_DESC_HW_RTS_ENABLE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value) +#define SET_TX_DESC_NAV_USE_HDR_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value) +#define SET_TX_DESC_USE_MAX_LEN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value) +#define SET_TX_DESC_MAX_AGG_NUM_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value) +#define SET_TX_DESC_NDPA_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value) +#define SET_TX_DESC_AMPDU_MAX_TIME_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value) + +// Dword 4 +#define SET_TX_DESC_TX_RATE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value) +#define SET_TX_DESC_DATA_RATE_FB_LIMIT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value) +#define SET_TX_DESC_RTS_RATE_FB_LIMIT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value) +#define SET_TX_DESC_RETRY_LIMIT_ENABLE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value) +#define SET_TX_DESC_DATA_RETRY_LIMIT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value) +#define SET_TX_DESC_RTS_RATE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value) + + +// Dword 5 +#define SET_TX_DESC_DATA_SC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value) +#define SET_TX_DESC_DATA_SHORT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value) +#define SET_TX_DESC_DATA_BW_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value) +#define SET_TX_DESC_DATA_LDPC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value) +#define SET_TX_DESC_DATA_STBC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value) +#define SET_TX_DESC_CTROL_STBC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value) +#define SET_TX_DESC_RTS_SHORT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value) +#define SET_TX_DESC_RTS_SC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value) + + +// Dword 6 +#define SET_TX_DESC_SW_DEFINE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value) +#define SET_TX_DESC_ANTSEL_A_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value) +#define SET_TX_DESC_ANTSEL_B_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value) +#define SET_TX_DESC_ANTSEL_C_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value) +#define SET_TX_DESC_ANTSEL_D_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value) + +// Dword 7 +#if(DEV_BUS_TYPE == RT_PCI_INTERFACE) +#define SET_TX_DESC_TX_BUFFER_SIZE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) +#else +#define SET_TX_DESC_TX_DESC_CHECKSUM_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) +#endif +#define SET_TX_DESC_USB_TXAGG_NUM_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value) +#if(DEV_BUS_TYPE == RT_SDIO_INTERFACE) +#define SET_TX_DESC_SDIO_TXSEQ_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value) +#endif + +// Dword 8 +#define SET_TX_DESC_HWSEQ_EN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value) + +// Dword 9 +#define SET_TX_DESC_SEQ_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value) + +// Dword 10 +#define SET_TX_DESC_TX_BUFFER_ADDRESS_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value) + + +// Dword 11 +#define SET_TX_DESC_NEXT_DESC_ADDRESS_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value) + + +#define SET_EARLYMODE_PKTNUM_8723B(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value) +#define SET_EARLYMODE_LEN0_8723B(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value) +#define SET_EARLYMODE_LEN1_1_8723B(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value) +#define SET_EARLYMODE_LEN1_2_8723B(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value) +#define SET_EARLYMODE_LEN2_8723B(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15, __Value) +#define SET_EARLYMODE_LEN3_8723B(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value) + +#endif +//----------------------------------------------------------- +// +// Rate +// +//----------------------------------------------------------- +// CCK Rates, TxHT = 0 +#define DESC8723B_RATE1M 0x00 +#define DESC8723B_RATE2M 0x01 +#define DESC8723B_RATE5_5M 0x02 +#define DESC8723B_RATE11M 0x03 + +// OFDM Rates, TxHT = 0 +#define DESC8723B_RATE6M 0x04 +#define DESC8723B_RATE9M 0x05 +#define DESC8723B_RATE12M 0x06 +#define DESC8723B_RATE18M 0x07 +#define DESC8723B_RATE24M 0x08 +#define DESC8723B_RATE36M 0x09 +#define DESC8723B_RATE48M 0x0a +#define DESC8723B_RATE54M 0x0b + +// MCS Rates, TxHT = 1 +#define DESC8723B_RATEMCS0 0x0c +#define DESC8723B_RATEMCS1 0x0d +#define DESC8723B_RATEMCS2 0x0e +#define DESC8723B_RATEMCS3 0x0f +#define DESC8723B_RATEMCS4 0x10 +#define DESC8723B_RATEMCS5 0x11 +#define DESC8723B_RATEMCS6 0x12 +#define DESC8723B_RATEMCS7 0x13 +#define DESC8723B_RATEMCS8 0x14 +#define DESC8723B_RATEMCS9 0x15 +#define DESC8723B_RATEMCS10 0x16 +#define DESC8723B_RATEMCS11 0x17 +#define DESC8723B_RATEMCS12 0x18 +#define DESC8723B_RATEMCS13 0x19 +#define DESC8723B_RATEMCS14 0x1a +#define DESC8723B_RATEMCS15 0x1b +#define DESC8723B_RATEVHTSS1MCS0 0x2c +#define DESC8723B_RATEVHTSS1MCS1 0x2d +#define DESC8723B_RATEVHTSS1MCS2 0x2e +#define DESC8723B_RATEVHTSS1MCS3 0x2f +#define DESC8723B_RATEVHTSS1MCS4 0x30 +#define DESC8723B_RATEVHTSS1MCS5 0x31 +#define DESC8723B_RATEVHTSS1MCS6 0x32 +#define DESC8723B_RATEVHTSS1MCS7 0x33 +#define DESC8723B_RATEVHTSS1MCS8 0x34 +#define DESC8723B_RATEVHTSS1MCS9 0x35 +#define DESC8723B_RATEVHTSS2MCS0 0x36 +#define DESC8723B_RATEVHTSS2MCS1 0x37 +#define DESC8723B_RATEVHTSS2MCS2 0x38 +#define DESC8723B_RATEVHTSS2MCS3 0x39 +#define DESC8723B_RATEVHTSS2MCS4 0x3a +#define DESC8723B_RATEVHTSS2MCS5 0x3b +#define DESC8723B_RATEVHTSS2MCS6 0x3c +#define DESC8723B_RATEVHTSS2MCS7 0x3d +#define DESC8723B_RATEVHTSS2MCS8 0x3e +#define DESC8723B_RATEVHTSS2MCS9 0x3f + + +#define RX_HAL_IS_CCK_RATE_8723B(pDesc)\ + (GET_RX_STATUS_DESC_RX_RATE_8723B(pDesc) == DESC8723B_RATE1M ||\ + GET_RX_STATUS_DESC_RX_RATE_8723B(pDesc) == DESC8723B_RATE2M ||\ + GET_RX_STATUS_DESC_RX_RATE_8723B(pDesc) == DESC8723B_RATE5_5M ||\ + GET_RX_STATUS_DESC_RX_RATE_8723B(pDesc) == DESC8723B_RATE11M) + + +void rtl8195a_update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem); +void rtl8195a_fill_fake_txdesc(PADAPTER padapter, u8 *pDesc, u32 BufferLen, u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame); + +s32 rtl8195ab_init_xmit_priv(PADAPTER padapter); +void rtl8195ab_free_xmit_priv(PADAPTER padapter); +s32 rtl8195ab_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtl8195ab_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); +s32 rtl8195ab_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +void rtl8195ab_xmitframe_resume(_adapter *padapter); +u32 GetDmaTxbdIdx(u32 ff_hwaddr); +struct xmit_buf * rtl8195a_dequeue_xmitbuf(struct rtw_tx_ring *ring); +BOOLEAN FreeXimtBuf(struct xmit_buf *pxmitbuf); +u8 check_tx_desc_resource(_adapter *padapter, int prio); + + +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_intf.c b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_intf.c new file mode 100644 index 0000000..4bbb072 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_intf.c @@ -0,0 +1,493 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _GSPI_INTF_C_ + +#include + +#ifdef CONFIG_GSPI_HCI + +struct dvobj_priv *gspi_dvobj_init(void) +{ +// int status = _FAIL; + struct dvobj_priv *dvobj = NULL; + PGSPI_DATA pgspi_data; + +_func_enter_; + + dvobj = (struct dvobj_priv*)rtw_zmalloc(sizeof(*dvobj)); + if (NULL == dvobj) { + goto exit; + } + + pgspi_data = &dvobj->intf_data; + + rtw_mutex_init(&pgspi_data->spi_mutex); + //pgspi_data->block_transfer_len = 512; //512 blocks r/w is not required for GSPI interface + //pgspi_data->tx_block_mode = 0; + //pgspi_data->rx_block_mode = 0; + +// status = _SUCCESS; + +#if 0 +free_dvobj: + if (status != _SUCCESS && dvobj) { + rtw_mfree((u8*)dvobj, sizeof(*dvobj)); + dvobj = NULL; + } +#endif +exit: +_func_exit_; + + return dvobj; +} + +void gspi_dvobj_deinit(struct dvobj_priv *dvobj) +{ +//TODO +// struct dvobj_priv *dvobj = spi_get_drvdata(spi); + +_func_enter_; +//TODO +// spi_set_drvdata(spi, NULL); + if (dvobj) { +//TODO +// gspi_deinit(dvobj); + rtw_mutex_free(&dvobj->intf_data.spi_mutex); + rtw_mfree((u8*)dvobj, sizeof(*dvobj)); + } + +_func_exit_; +} + +s32 gspi_dvobj_xmit_mgnt(_adapter * padapter, struct xmit_frame *pmgntframe) +{ + s32 ret = _SUCCESS; + struct pkt_attrib *pattrib; + struct xmit_buf *pxmitbuf; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); + u8 *pframe = NULL; + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("+rtw_xmit_mgnt()\n")); + + pattrib = &pmgntframe->attrib; + pxmitbuf = pmgntframe->pxmitbuf; + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + rtw_hal_update_txdesc(padapter, pmgntframe, pmgntframe->buf_addr); + + pxmitbuf->len = TXDESC_SIZE + pattrib->last_txcmdsz; + //pxmitbuf->pg_num = (pxmitbuf->len + 127)/128; // 128 is tx page size + //pxmitbuf->ptail = pmgntframe->buf_addr + pxmitbuf->len; + pxmitbuf->ff_hwaddr = rtw_get_ff_hwaddr(pmgntframe); + + rtw_count_tx_stats(padapter, pmgntframe, pattrib->last_txcmdsz); + + //RT_TRACE(_module_rtl871x_xmit_c_, _drv_always_, ("+rtw_xmit_mgnt(): type=%d\n", GetFrameSubType(pframe))); + if(GetFrameSubType(pframe)==WIFI_BEACON) //dump beacon directly + { +//When using dedicated xmit frame for issue bcn on ap mode +//free xmit frame for bcn reserved page on station mode - Alex Fang +#if USE_DEDICATED_BCN_TX + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) { + rtw_free_xmitframe(pxmitpriv, pmgntframe); + pxmitbuf->priv_data = NULL; + } + rtw_write_port(padapter, ffaddr2deviceId(pdvobjpriv, pxmitbuf->ff_hwaddr), pxmitbuf->len, pxmitbuf->pbuf); + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); +#else + rtw_free_xmitframe(pxmitpriv, pmgntframe); + pxmitbuf->priv_data = NULL; + rtw_xmit_xmitbuf(padapter, pxmitbuf); +#endif + } + else + { + rtw_free_xmitframe(pxmitpriv, pmgntframe); + pxmitbuf->priv_data = NULL; + rtw_xmit_xmitbuf(padapter, pxmitbuf); + } + + if (ret != _SUCCESS) + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN); + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("-rtw_xmit_mgnt\n")); + return ret; +} + +//#include +s32 gspi_dvobj_xmit_data(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + _irqL irql; + s32 err; + +#ifdef CONFIG_80211N_HT + if ((pxmitframe->frame_tag == DATA_FRAMETAG) && + (pxmitframe->attrib.ether_type != 0x0806) && + (pxmitframe->attrib.ether_type != 0x888e) && + (pxmitframe->attrib.dhcp_pkt != 1)) + { + if (padapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE) + rtw_issue_addbareq_cmd(padapter, pxmitframe); + } +#endif + +#if USE_SKB_AS_XMITBUF + rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); +#endif + + rtw_enter_critical_bh(&pxmitpriv->lock, &irql); +#if 1 //FIX_XMITFRAME_FAULT, move from rtw_xmit(). +#ifdef CONFIG_AP_MODE + if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE) + { + rtw_exit_critical_bh(&pxmitpriv->lock, &irql); + return 1; + } +#endif +#endif + err = rtw_xmitframe_enqueue(padapter, pxmitframe); + rtw_exit_critical_bh(&pxmitpriv->lock, &irql); + + if (err != _SUCCESS) { + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmit_data(): enqueue xmitframe fail\n")); + rtw_free_xmitframe(pxmitpriv, pxmitframe); + + // Trick, make the statistics correct + pxmitpriv->tx_pkts--; + pxmitpriv->tx_drop++; + return _TRUE; + } + + rtw_count_tx_stats(padapter, pxmitframe, pxmitframe->attrib.last_txcmdsz); +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->adapter_type > PRIMARY_ADAPTER){ + padapter = padapter->pbuddy_adapter; + } +#endif + + rtw_wakeup_task(&padapter->xmitThread); + + return _FALSE; +} + +const struct host_ctrl_intf_ops hci_ops = { + gspi_dvobj_init, + gspi_dvobj_deinit, + NULL, + NULL +}; + + +//TODO +#if 0 + +unsigned int oob_irq; +static irqreturn_t spi_interrupt_thread(int irq, void *data) +{ + struct dvobj_priv *dvobj; + PGSPI_DATA pgspi_data; + + + dvobj = (struct dvobj_priv*)data; + pgspi_data = &dvobj->intf_data; + + //spi_int_hdl(padapter); + if (pgspi_data->priv_wq) + queue_delayed_work(pgspi_data->priv_wq, &pgspi_data->irq_work, 0); + + return IRQ_HANDLED; +} + +static u8 gspi_alloc_irq(struct dvobj_priv *dvobj) +{ + PGSPI_DATA pgspi_data; + struct spi_device *spi; + int err; + + + pgspi_data = &dvobj->intf_data; + spi = pgspi_data->func; + + err = request_irq(oob_irq, spi_interrupt_thread, + IRQF_TRIGGER_FALLING,//IRQF_TRIGGER_HIGH;//|IRQF_ONESHOT, + DRV_NAME, dvobj); + //err = request_threaded_irq(oob_irq, NULL, spi_interrupt_thread, + // IRQF_TRIGGER_FALLING, + // DRV_NAME, dvobj); + if (err < 0) { + DBG_871X("Oops: can't allocate irq %d err:%d\n", oob_irq, err); + goto exit; + } + enable_irq_wake(oob_irq); + disable_irq(oob_irq); + +exit: + return err?_FAIL:_SUCCESS; +} + +#endif //#if 0 +//TODO +#if 0 + +static void spi_irq_work(void *data) +{ + struct delayed_work *dwork; + PGSPI_DATA pgspi; + struct dvobj_priv *dvobj; + + + dwork = container_of(data, struct delayed_work, work); + pgspi = container_of(dwork, GSPI_DATA, irq_work); + + dvobj = spi_get_drvdata(pgspi->func); + if (!dvobj->if1) { + DBG_871X("%s if1 == NULL !!\n", __FUNCTION__); + return; + } + spi_int_hdl(dvobj->if1); +} + +#endif //#if 0 + + +//TODO +#if 0 + +static int rtw_gspi_suspend(struct spi_device *spi, pm_message_t mesg) +{ + struct dvobj_priv *dvobj = spi_get_drvdata(spi); + PADAPTER padapter = (_adapter *)dvobj->if1; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct net_device *pnetdev = padapter->pnetdev; + int ret = 0; + + u32 start_time = rtw_get_current_time(); + + _func_enter_; + + DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); + + pwrpriv->bInSuspend = _TRUE; + + while (pwrpriv->bips_processing == _TRUE) + rtw_msleep_os(1); + + if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) + { + DBG_871X("%s bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", __FUNCTION__ + ,padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); + goto exit; + } + + rtw_cancel_all_timer(padapter); + LeaveAllPowerSaveMode(padapter); + + //padapter->net_closed = _TRUE; + //s1. + if(pnetdev) + { + netif_carrier_off(pnetdev); + rtw_netif_stop_queue(pnetdev); + } +#ifdef CONFIG_WOWLAN + padapter->pwrctrlpriv.bSupportWakeOnWlan=_TRUE; +#else + //s2. + //s2-1. issue rtw_disassoc_cmd to fw + disconnect_hdl(padapter, NULL); + //rtw_disassoc_cmd(padapter); +#endif + +#ifdef CONFIG_LAYER2_ROAMING_RESUME + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED) ) + { + DBG_871X("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__, + pmlmepriv->cur_network.network.Ssid.Ssid, + MAC_ARG(pmlmepriv->cur_network.network.MacAddress), + pmlmepriv->cur_network.network.Ssid.SsidLength, + pmlmepriv->assoc_ssid.SsidLength); + + pmlmepriv->to_roaming = 1; + } +#endif + + //s2-2. indicate disconnect to os + rtw_indicate_disconnect(padapter); + //s2-3. + rtw_free_assoc_resources(padapter, 1); + + //s2-4. + rtw_free_network_queue(padapter, _TRUE); + + rtw_led_control(padapter, LED_CTL_POWER_OFF); + + rtw_dev_unload(padapter); + + if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) + rtw_indicate_scan_done(padapter, 1); + + if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) + rtw_indicate_disconnect(padapter); + + // interface deinit + gspi_deinit(dvobj); + RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("%s: deinit GSPI complete!\n", __FUNCTION__)); + + rtw_wifi_gpio_wlan_ctrl(WLAN_PWDN_OFF); + rtw_mdelay_os(1); +exit: + DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__ + , ret, rtw_get_passing_time_ms(start_time)); + + _func_exit_; + return ret; +} + +extern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal); +int rtw_resume_process(_adapter *padapter) +{ + struct net_device *pnetdev; + struct pwrctrl_priv *pwrpriv; + u8 is_pwrlock_hold_by_caller; + u8 is_directly_called_by_auto_resume; + int ret = 0; + u32 start_time = rtw_get_current_time(); + + _func_enter_; + + DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); + + rtw_wifi_gpio_wlan_ctrl(WLAN_PWDN_ON); + rtw_mdelay_os(1); + + rtw_set_chip_endian(adapter); + + if (padapter) { + pnetdev = padapter->pnetdev; + pwrpriv = &padapter->pwrctrlpriv; + } else { + ret = -1; + goto exit; + } + + // interface init + if (gspi_init(adapter_to_dvobj(padapter)) != _SUCCESS) + { + ret = -1; + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__)); + goto exit; + } + rtw_hal_disable_interrupt(padapter); + if (gspi_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) + { + ret = -1; + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: gspi_alloc_irq Failed!!\n", __FUNCTION__)); + goto exit; + } + + rtw_reset_drv_sw(padapter); + pwrpriv->bkeepfwalive = _FALSE; + + DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive); + if(pm_netdev_open(pnetdev,_TRUE) != 0) { + ret = -1; + goto exit; + } + + netif_device_attach(pnetdev); + netif_carrier_on(pnetdev); + + if( padapter->pid[1]!=0) { + DBG_871X("pid[1]:%d\n",padapter->pid[1]); + rtw_signal_process(padapter->pid[1], SIGUSR2); + } + + #ifdef CONFIG_LAYER2_ROAMING_RESUME + rtw_roaming(padapter, NULL); + #endif + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + rtw_unlock_suspend(); + #endif //CONFIG_RESUME_IN_WORKQUEUE + + pwrpriv->bInSuspend = _FALSE; +exit: + DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__ + , ret, rtw_get_passing_time_ms(start_time)); + + _func_exit_; + + return ret; +} + +static int rtw_gspi_resume(struct spi_device *spi) +{ + struct dvobj_priv *dvobj = spi_get_drvdata(spi); + PADAPTER padapter = (_adapter *)dvobj->if1; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + int ret = 0; + + + DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); + + if(pwrpriv->bInternalAutoSuspend ){ + ret = rtw_resume_process(padapter); + } else { +#ifdef CONFIG_RESUME_IN_WORKQUEUE + rtw_resume_in_workqueue(pwrpriv); +#elif defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) + if(rtw_is_earlysuspend_registered(pwrpriv)) { + //jeff: bypass resume here, do in late_resume + pwrpriv->do_late_resume = _TRUE; + } else { + ret = rtw_resume_process(padapter); + } +#else // Normal resume process + ret = rtw_resume_process(padapter); +#endif //CONFIG_RESUME_IN_WORKQUEUE + } + + DBG_871X("<======== %s return %d\n", __FUNCTION__, ret); + return ret; + +} + + +static struct spi_driver rtw_spi_drv = { + .probe = rtw_drv_probe, + .remove = rtw_dev_remove, + .suspend = rtw_gspi_suspend, + .resume = rtw_gspi_resume, + .driver = { + .name = "wlan_spi", + .bus = &spi_bus_type, + .owner = THIS_MODULE, + } + +}; + +#endif //#if 0 +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_io.c b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_io.c new file mode 100644 index 0000000..f042c3f --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_io.c @@ -0,0 +1,566 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#define _GSPI_IO_C_ + +#include + +#ifdef CONFIG_GSPI_HCI + +u8 spi_read8(struct dvobj_priv *pdvobj, u32 addr, s32 *err); +u16 spi_read16(struct dvobj_priv *pdvobj, u32 addr, s32 *err); +u32 spi_read32(struct dvobj_priv *pdvobj, u32 addr, s32 *err); +s32 spi_write8(struct dvobj_priv *pdvobj, u32 addr, u8 buf, s32 *err); +s32 spi_write16(struct dvobj_priv *pdvobj, u32 addr, u16 buf, s32 *err); +s32 spi_write32(struct dvobj_priv *pdvobj, u32 addr, u32 buf, s32 *err); + +static u32 rtw_spi_transfer( + struct dvobj_priv *pdvobj, + bool pool, + u8* buf, + u32 buf_len) +{ + _mutex *spi_mutex; + u32 ret_value = _SUCCESS; + + spi_mutex = &(pdvobj->intf_data.spi_mutex); + + rtw_enter_critical_mutex(spi_mutex, NULL); + if(!WLAN_BSP_Transfer(buf, buf_len)) + ret_value = _FAIL; + rtw_exit_critical_mutex(spi_mutex, NULL); + + return ret_value; +} +static int addr_convert(u32 addr) +{ + u32 domain_id = 0 ; + u32 temp_addr = addr&0xffff0000; + + if (temp_addr == 0 ) { + domain_id = WLAN_IOREG_DOMAIN; + return domain_id; + } + + switch (temp_addr) { + case WLAN_LOCAL_OFFSET: + domain_id = SPI_LOCAL_DOMAIN; + break; + case WLAN_IOREG_OFFSET: + domain_id = WLAN_IOREG_DOMAIN; + break; + case FW_FIFO_OFFSET: + domain_id = FW_FIFO_DOMAIN; + break; + case TX_HIQ_OFFSET: + domain_id = TX_HIQ_DOMAIN; + break; + case TX_MIQ_OFFSET: + domain_id = TX_MIQ_DOMAIN; + break; + case TX_LOQ_OFFSET: + domain_id = TX_LOQ_DOMAIN; + break; + case RX_RXOFF_OFFSET: + domain_id = RX_RXFIFO_DOMAIN; + break; + default: + break; + } + + return domain_id; +} + +/* + * Description: + * Translate sdio fifo address to Domain ID in each WLAN FIFO + */ +static u32 hwaddr2txfifo(u32 addr) +{ + u32 fifo_domain_id; + switch (addr) + { + case WLAN_TX_HIQ_DEVICE_ID: + fifo_domain_id = TX_HIQ_DOMAIN; + break; + + case WLAN_TX_MIQ_DEVICE_ID: + fifo_domain_id = TX_MIQ_DOMAIN; + break; + + case WLAN_TX_LOQ_DEVICE_ID: + fifo_domain_id = TX_LOQ_DOMAIN; + break; + default: + fifo_domain_id = TX_LOQ_DOMAIN; + break; + } + + return fifo_domain_id; +} + +static u32 buf_endian_reverse(u32 src) +{ + return (((src&0x000000ff)<<24)|((src&0x0000ff00)<<8)| + ((src&0x00ff0000)>>8)|((src&0xff000000)>>24)); +} + +// +// Description: +// Query SDIO Local register to query current the number of Free TxPacketBuffer page. +// +// Assumption: +// 1. Running at PASSIVE_LEVEL +// 2. RT_TX_SPINLOCK is NOT acquired. +// +// Created by Roger, 2011.01.28. +// +#ifdef CONFIG_RTL8188F +u8 spi_query_status_info(struct dvobj_priv *pdvobj) +{ + pdvobj->SdioTxFIFOFreePage[HI_QUEUE_IDX] = spi_read8(pdvobj, LOCAL_REG_FREE_TXPG, NULL); + pdvobj->SdioTxFIFOFreePage[MID_QUEUE_IDX] =spi_read8(pdvobj, LOCAL_REG_FREE_TXPG+2, NULL); + pdvobj->SdioTxFIFOFreePage[LOW_QUEUE_IDX] = spi_read8(pdvobj, LOCAL_REG_FREE_TXPG+4, NULL); + pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] = spi_read8(pdvobj, LOCAL_REG_FREE_TXPG+6, NULL); + RT_TRACE(_module_hci_ops_c_, _drv_notice_, + ("%s: Free page for HIQ(%x),MIDQ(%x),LOWQ(%x),PUBQ(%x)\n", + __FUNCTION__, + pdvobj->SdioTxFIFOFreePage[HI_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[MID_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[LOW_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX])); + //_exit_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql); + + return _TRUE; +} +#else +u8 spi_query_status_info(struct dvobj_priv *pdvobj) +{ + u32 NumOfFreePage; + + NumOfFreePage = spi_read32(pdvobj, LOCAL_REG_FREE_TXPG, NULL); + +// _enter_critical_bh(&pdvobj->SdioTxFIFOFreePageLock, &irql); + rtw_memcpy(pdvobj->SdioTxFIFOFreePage, &NumOfFreePage, 4); + + RT_TRACE(_module_hci_ops_c_, _drv_notice_, + ("%s: Free page for HIQ(%x),MIDQ(%x),LOWQ(%x),PUBQ(%x)\n", + __FUNCTION__, + pdvobj->SdioTxFIFOFreePage[HI_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[MID_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[LOW_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX])); +// _exit_critical_bh(&pdvobj->SdioTxFIFOFreePageLock, &irql); + + return _TRUE; +} + +#endif +static void spi_get_status_info(struct dvobj_priv *pdvobj, unsigned char *status) +{ +#ifdef CONFIG_MEMORY_ACCESS_ALIGNED + u32 local_status[2]; + u8 *pstatus = (u8*)(&local_status[0]); + + memcpy(pstatus, status, GSPI_STATUS_LEN); +#else + u8 *pstatus = status; +#endif + +#ifdef CONFIG_RTL8188F + pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] = GET_STATUS_PUB_PAGE_NUM(pstatus)*2; +#else + pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] = GET_STATUS_PUB_PAGE_NUM(pstatus); +#endif + + pdvobj->SdioTxFIFOFreePage[HI_QUEUE_IDX] = GET_STATUS_HI_PAGE_NUM(pstatus); + pdvobj->SdioTxFIFOFreePage[MID_QUEUE_IDX] = GET_STATUS_MID_PAGE_NUM(pstatus); + pdvobj->SdioTxFIFOFreePage[LOW_QUEUE_IDX] = GET_STATUS_LOW_PAGE_NUM(pstatus); + + RT_TRACE(_module_hci_ops_c_, _drv_dump_, + ("%s: Free page for HIQ(%x),MIDQ(%x),LOWQ(%x),PUBQ(%x)\n", + __FUNCTION__, + pdvobj->SdioTxFIFOFreePage[HI_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[MID_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[LOW_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX])); +} + +static int spi_read_write_reg(struct dvobj_priv *pdvobj, int write_flag, u32 addr, char * buf, int len, u32 eddien) +{ + int fun = 1, domain_id = 0x0; //LOCAL + unsigned int cmd = 0 ; + int byte_en = 0 ;//,i = 0 ; + int ret = 1; + unsigned char status[8] = {0}; + unsigned int data_tmp = 0; + u32 force_bigendian = eddien; + + u32 spi_buf[4] = {0}; + bool polled = TRUE; + + if (len!=1 && len!=2 && len != 4) { + return -1; + } + + domain_id = addr_convert(addr); + + addr &= 0x7fff; + len &= 0xff; + if (write_flag) //write register + { + int remainder = addr % 4; + u32 val32 = *(u32 *)buf; + switch(len) { + case 1: + byte_en = (0x1 << remainder); + data_tmp = (val32& 0xff)<< (remainder*8); + break; + case 2: + byte_en = (0x3 << remainder); + data_tmp = (val32 & 0xffff)<< (remainder*8); + break; + case 4: + byte_en = 0xf; + data_tmp = val32 & 0xffffffff; + break; + default: + byte_en = 0xf; + data_tmp = val32 & 0xffffffff; + break; + } + } + else //read register + { + switch(len) { + case 1: + byte_en = 0x1; + break; + case 2: + byte_en = 0x3; + break; + case 4: + byte_en = 0xf; + break; + default: + byte_en = 0xf; + break; + } + + if(domain_id == SPI_LOCAL_DOMAIN) + byte_en = 0; + } + + //addr = 0xF0 4byte: 0x2800f00f + REG_LEN_FORMAT(&cmd, byte_en); + REG_ADDR_FORMAT(&cmd, (addr&0xfffffffc)); + REG_DOMAIN_ID_FORMAT(&cmd, domain_id); + REG_FUN_FORMAT(&cmd, fun); + REG_RW_FORMAT(&cmd, write_flag); + + if (force_bigendian) { + cmd = buf_endian_reverse(cmd); + } + + if (!write_flag && (domain_id!= RX_RXFIFO_DOMAIN)) { + u32 read_data = 0; + + rtw_memset(spi_buf, 0x00, sizeof(spi_buf)); + + spi_buf[0] = cmd; + spi_buf[1] = 0; + spi_buf[2] = 0; + spi_buf[3] = 0; + + rtw_spi_transfer(pdvobj, polled, (u8*)spi_buf, sizeof(spi_buf)); + + rtw_memcpy(status, (u8 *) &spi_buf[1], sizeof(status)); + read_data = EF4Byte(spi_buf[3]); + + //add for 8810 +#ifdef CONFIG_BIG_ENDIAN + if (!force_bigendian) + read_data = buf_endian_reverse(read_data); +#else + if (force_bigendian) + read_data = buf_endian_reverse(read_data); +#endif + *(u32*)buf = read_data; + } else if (write_flag ) { + +#ifdef CONFIG_BIG_ENDIAN + if (!force_bigendian) + data_tmp = buf_endian_reverse(data_tmp); +#else + if (force_bigendian) + data_tmp = buf_endian_reverse(data_tmp); +#endif + + spi_buf[0] = cmd; + spi_buf[1] = data_tmp; + spi_buf[2] = 0; + spi_buf[3] = 0; + + rtw_spi_transfer(pdvobj, polled, (u8*)spi_buf, sizeof(spi_buf)); + + rtw_memcpy(status, (u8 *) &spi_buf[2], sizeof(status)); + } + + spi_get_status_info(pdvobj, (unsigned char*)status); + + return ret; +} + +static int spi_io_priv(struct dvobj_priv *pdvobj) +{ + //struct dvobj_priv *pdvobj = &Adapter->dvobjpriv; + + return _SUCCESS; +} + +static int spi_write8_endian(struct dvobj_priv *pdvobj, u32 addr, u32 buf, u32 big) +{ + return spi_read_write_reg(pdvobj,1,addr,(char *)&buf,1, big); +} + +u8 spi_read8(struct dvobj_priv *pdvobj, u32 addr, s32 *err) +{ + u32 ret = 0; + int val32 = 0 , remainder = 0 ; + s32 _err = 0; + + _err = spi_read_write_reg(pdvobj,0,addr&0xFFFFFFFC,(char *)&ret,4,0); + remainder = addr % 4; + val32 = ret; + val32 = (val32& (0xff<< (remainder<<3)))>>(remainder<<3); + + if (err) + *err = _err; + + return (u8)val32; + +} + +u16 spi_read16(struct dvobj_priv *pdvobj, u32 addr, s32 *err) +{ + u32 ret = 0; + int val32 = 0 , remainder = 0 ; + s32 _err = 0; + + _err = spi_read_write_reg(pdvobj,0,addr&0xFFFFFFFC,(char *)&ret,4,0); + remainder = addr % 4; + val32 = ret; + val32 = (val32& (0xffff<< (remainder<<3)))>>(remainder<<3); + + if (err) + *err = _err; + + return (u16)val32; +} + +u32 spi_read32(struct dvobj_priv *pdvobj, u32 addr, s32 *err) +{ + u32 ret = 0; + s32 _err = 0; + + _err = spi_read_write_reg(pdvobj,0,addr&0xFFFFFFFC,(char *)&ret,4,0); + if (err) + *err = _err; + + return ret; +} + +s32 spi_write8(struct dvobj_priv *pdvobj, u32 addr, u8 buf, s32 *err) +{ + int ret = 0; + + ret = spi_read_write_reg(pdvobj,1,addr,(char *)&buf,1,0); + if (err) + *err = ret; + return ret; +} + +s32 spi_write16(struct dvobj_priv *pdvobj, u32 addr, u16 buf, s32 *err) +{ + int ret = 0; + + ret = spi_read_write_reg(pdvobj,1,addr,(char *)&buf,2,0); + if (err) + *err = ret; + return ret; +} + +s32 spi_write32(struct dvobj_priv *pdvobj, u32 addr, u32 buf, s32 *err) +{ + int ret = 0; + + ret = spi_read_write_reg(pdvobj, 1,addr,(char *)&buf,4,0); + if (err) + *err = ret; + return ret; +} + +static int spi_read_rx_fifo(struct dvobj_priv *pdvobj, u32 addr, u8 *buf, u32 len, struct fifo_more_data *pmore_data) +{ + int fun = 1, domain_id = RX_RXFIFO_DOMAIN; + unsigned int cmd = 0; + unsigned char *status = buf + len; + u8 *spi_buf = (u8 *) (buf - GSPI_CMD_LEN); + int spi_buf_len = 0; + bool polled = TRUE; + bool use_alloc = FALSE; + u32 max_skb_len = 0; + +#ifndef CONFIG_DONT_CARE_TP + max_skb_len = MAX_SKB_BUF_SIZE; +#else + max_skb_len = MAX_RX_SKB_BUF_SIZE; +#endif + + if(((GSPI_CMD_LEN + len + GSPI_STATUS_LEN) > max_skb_len) || (!buf)) { + #if !defined(CONFIG_MP_INCLUDED) || !defined(CONFIG_MP_IWPRIV_SUPPORT) // Cloud 2013/09/06 + DBG_871X("data len=%d, MAX_SKB_BUF_SIZE(%d) is not enough, change to dynamic alloc\n", len, max_skb_len); + #endif + use_alloc = TRUE; + spi_buf_len = GSPI_CMD_LEN + len + GSPI_STATUS_LEN; + spi_buf = rtw_malloc(spi_buf_len); + + if(spi_buf == NULL) { + DBG_871X("Failed to alloc %d bytes\n", len); + return _FAIL; + } + else { + buf = spi_buf + GSPI_CMD_LEN; + status = spi_buf + GSPI_CMD_LEN + len; + } + } + + FIFO_LEN_FORMAT(&cmd, len); //TX Agg len + FIFO_DOMAIN_ID_FORMAT(&cmd, domain_id); + FIFO_FUN_FORMAT(&cmd, fun); + FIFO_RW_FORMAT(&cmd, 0); //read + + rtw_memset(status, 0x00, GSPI_STATUS_LEN); + rtw_memset(buf, 0x0, len); + +#ifdef CONFIG_MEMORY_ACCESS_ALIGNED + memcpy(spi_buf, (u8 *)&cmd, sizeof(int)); +#else + *((u32 *) spi_buf) = cmd; +#endif + + rtw_spi_transfer(pdvobj, polled, (u8 *) spi_buf, GSPI_CMD_LEN + len + GSPI_STATUS_LEN); + + spi_get_status_info(pdvobj, status); + pmore_data->more_data = GET_STATUS_HISR_LOW8BIT(status) & BIT(0); + pmore_data->len = GET_STATUS_RX_LENGTH(status); + + if(use_alloc) { + //Drop the data + rtw_mfree(spi_buf, spi_buf_len); + return _FAIL; + } + + return _SUCCESS; +} + +static int spi_write_tx_fifo(struct dvobj_priv *pdvobj, u32 addr, u8 *buf, u32 len) +{ + int fun = 1; //TX_HIQ_FIFO + unsigned int cmd = 0; + unsigned char *status = buf + len; + u8 *spi_buf = (u8 *) (buf - GSPI_CMD_LEN); + u32 page_num = 0; + u32 wait_num = 100; + bool polled = TRUE; + u32 fifo = 0; + +_func_enter_; + fifo = hwaddr2txfifo(addr); + + spi_query_status_info(pdvobj); + if (fifo == TX_HIQ_DOMAIN) + page_num = pdvobj->SdioTxFIFOFreePage[HI_QUEUE_IDX]; + else if (fifo == TX_LOQ_DOMAIN) + page_num = pdvobj->SdioTxFIFOFreePage[LOW_QUEUE_IDX]; + else + page_num = pdvobj->SdioTxFIFOFreePage[MID_QUEUE_IDX]; + + while (page_num + pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] < 15) { + DBG_871X("Oops: spi_write_tx_fifo(): page_num is %d, padapter->pub_page is %d, wait_num is %d", + page_num, pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX], wait_num); + + rtw_msleep_os(1); + //rtw_udelay_os(20); + spi_read32(pdvobj, 0x608, NULL); + + if (fifo == TX_HIQ_DOMAIN) + page_num = pdvobj->SdioTxFIFOFreePage[HI_QUEUE_IDX]; + else if (fifo == TX_LOQ_DOMAIN) + page_num = pdvobj->SdioTxFIFOFreePage[LOW_QUEUE_IDX]; + else + page_num = pdvobj->SdioTxFIFOFreePage[MID_QUEUE_IDX]; + + if (wait_num <= 2) { + DBG_871X("%s(): wait_num is <= 2 drop", __FUNCTION__); + return _FAIL; + } + wait_num --; + } + + FIFO_LEN_FORMAT(&cmd, len); //TX Agg len + FIFO_DOMAIN_ID_FORMAT(&cmd, fifo); + FIFO_FUN_FORMAT(&cmd, fun); + FIFO_RW_FORMAT(&cmd, (unsigned int) 1); //write + + //DBG_871X("%s(): len = %d\n", __FUNCTION__, len); + //RT_PRINT_DATA(_module_hal_xmit_c_, _drv_always_, "Tx:\n", buf, GSPI_CMD_LEN + len); + rtw_memset(status, 0x00, GSPI_STATUS_LEN); + +#ifdef CONFIG_MEMORY_ACCESS_ALIGNED + memcpy(spi_buf, (u8 *)&cmd, sizeof(int)); +#else + *((u32 *) spi_buf) = cmd; +#endif + + rtw_spi_transfer(pdvobj, polled, (u8 *) spi_buf, GSPI_CMD_LEN + len + GSPI_STATUS_LEN); + + spi_get_status_info(pdvobj, status); + +_func_exit_; + + return _SUCCESS; +} + +void spi_set_intf_ops(struct _io_ops *pops) +{ + pops->init_io_priv = &spi_io_priv; + pops->write8_endian = &spi_write8_endian; + + pops->_read8 = &spi_read8; + pops->_read16 = &spi_read16; + pops->_read32 = &spi_read32; + + pops->_write8 = &spi_write8; + pops->_write16 = &spi_write16; + pops->_write32 = &spi_write32; + + pops->read_rx_fifo = &spi_read_rx_fifo; + pops->write_tx_fifo = &spi_write_tx_fifo; +} +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_isr.c b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_isr.c new file mode 100644 index 0000000..741a879 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_isr.c @@ -0,0 +1,236 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + ******************************************************************************/ +#define _GSPI_ISR_C_ + +#include + +#ifdef CONFIG_GSPI_HCI + +extern struct recv_buf* rtw_recv_rxfifo(_adapter * padapter, u32 size, struct fifo_more_data* more_data); +u8 spi_read8(struct dvobj_priv *pdvobj, u32 addr, s32 *err); +u16 spi_read16(struct dvobj_priv *pdvobj, u32 addr, s32 *err); +u32 spi_read32(struct dvobj_priv *pdvobj, u32 addr, s32 *err); +s32 spi_write8(struct dvobj_priv *pdvobj, u32 addr, u8 buf, s32 *err); +s32 spi_write16(struct dvobj_priv *pdvobj, u32 addr, u16 buf, s32 *err); +s32 spi_write32(struct dvobj_priv *pdvobj, u32 addr, u32 buf, s32 *err); + +void spi_int_dpc(PADAPTER padapter, u32 sdio_hisr) +{ + struct dvobj_priv *pdvobj = padapter->dvobj; + +#ifdef CONFIG_LPS_LCLK + if (sdio_hisr & HCI_HISR_CPWM1) + { + struct reportpwrstate_parm report; + + report.state = spi_read8(pdvobj, LOCAL_REG_HCPWM1, NULL); + if(report.state == 0xEA) + report.state = PS_STATE_S0; + else + report.state = PS_STATE_S2; + cpwm_int_hdl(padapter, &report); + } +#endif + + if (sdio_hisr & HCI_HISR_TXERR) + { + u32 status; + + status = rtw_read32(padapter, REG_TXDMA_STATUS); + rtw_write32(padapter, REG_TXDMA_STATUS, status); + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s: SDIO_HISR_TXERR (0x%08x)\n", __func__, status)); + } + +#ifdef CONFIG_INTERRUPT_BASED_TXBCN + + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + if (sdio_hisr & HCI_HISR_BCNERLY_INT) + #endif + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + if (sdio_hisr & (HCI_HISR_TXBCNOK|HCI_HISR_TXBCNERR)) + #endif + { + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + #if 0 //for debug + if (sdio_hisr & SDIO_HISR_BCNERLY_INT) + DBG_8192C("%s: SDIO_HISR_BCNERLY_INT\n", __func__); + + if (sdio_hisr & SDIO_HISR_TXBCNOK) + DBG_8192C("%s: SDIO_HISR_TXBCNOK\n", __func__); + + if (sdio_hisr & SDIO_HISR_TXBCNERR) { + u1Byte v422, v550, v419; + v422 = rtw_read8(padapter, 0x422); + v419 = rtw_read8(padapter, 0x419); + v550 = rtw_read8(padapter, 0x550); + + DBG_8192C("%s: SDIO_HISR_TXBCNERR 422=%02x, 419=%02x, 550=%02x\n", __func__, v422, v419, v550); + } + #endif + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) + { + //send_beacon(padapter); + if(pmlmepriv->update_bcn == _TRUE) + { + //tx_beacon_hdl(padapter, NULL); + set_tx_beacon_cmd(padapter); + } + } + +#if 0//def CONFIG_CONCURRENT_MODE + if(check_buddy_fwstate(padapter, WIFI_AP_STATE)) + { + //send_beacon(padapter); + if(padapter->pbuddy_adapter->mlmepriv.update_bcn == _TRUE) + { + //tx_beacon_hdl(padapter, NULL); + set_tx_beacon_cmd(padapter->pbuddy_adapter); + } + } +#endif + } +#endif //CONFIG_INTERRUPT_BASED_TXBCN + + if (sdio_hisr & HCI_HISR_C2HCMD) + { + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s: C2H Command\n", __func__)); +//TODO +// rtw_c2h_wk_cmd(padapter); + } + + if (sdio_hisr & HCI_HISR_RX_REQUEST)// || sdio_hisr & SPI_HISR_RXFOVW) + { + struct recv_buf *precvbuf; + struct fifo_more_data more_data = {0}; + + //RT_TRACE(_module_hci_ops_c_,_drv_info_, ("%s: RX Request, size=%d\n", __func__, pdvobj->SdioRxFIFOSize)); + + sdio_hisr ^= HCI_HISR_RX_REQUEST; + + do { + more_data.more_data = 0; + more_data.len = 0; + + if (pdvobj->SdioRxFIFOSize == 0) + { + u16 val = 0; + s32 ret; + + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s, %d, read RXFIFOsize again size=%d\n", __FUNCTION__, __LINE__, pdvobj->SdioRxFIFOSize)); + + val = spi_read16(pdvobj, LOCAL_REG_RX0_REQ_LEN_1_BYTE, &ret); + if (!ret) { + pdvobj->SdioRxFIFOSize = val; + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s: RX_REQUEST, read RXFIFOsize again size=%d\n", __func__, pdvobj->SdioRxFIFOSize)); + } else { + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s: RX_REQUEST, read RXFIFOsize ERROR!!\n", __func__)); + } + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s, %d, read RXFIFOsize again size=%d\n", __FUNCTION__, __LINE__, pdvobj->SdioRxFIFOSize)); + } + + if (pdvobj->SdioRxFIFOSize != 0) + { +#ifdef RTL8723A_SDIO_LOOPBACK + sd_recv_loopback(padapter, pdvobj->SdioRxFIFOSize); +#else + if (sdio_hisr & HCI_HISR_RXFOVW) + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s RXFOVW RX\n", __func__)); + + precvbuf = rtw_recv_rxfifo(padapter, pdvobj->SdioRxFIFOSize, &more_data); + if (precvbuf) + rtw_rxhandler(padapter, precvbuf); + + if (more_data.more_data) { + pdvobj->SdioRxFIFOSize = more_data.len; + } else { + pdvobj->SdioRxFIFOSize = 0; + } +#endif + //If Rx_request ISR is set, execute receive tasklet (sdio_hisr & SPI_HISR_RX_REQUEST) +#if defined(CONFIG_ISR_THREAD_MODE_INTERRUPT) && defined(CONFIG_RECV_TASKLET_THREAD) + rtw_wakeup_task(&padapter->recvtasklet_thread); +#endif + } + +#ifdef CONFIG_INTERRUPT_BASED_TXBCN +{ + //Prevent BCN update not realtime in ap mode - Alex Fang + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + if((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) && (pmlmepriv->update_bcn == _TRUE)) + break; +} +#endif + } while (more_data.more_data); +#ifdef PLATFORM_LINUX +#ifdef CONFIG_GSPI_HCI + tasklet_schedule(&padapter->recvpriv.recv_tasklet); +#endif +#endif + } +} + + +void spi_int_hdl(PADAPTER padapter) +{ + struct dvobj_priv *pdvobj = padapter->dvobj; + u32 sdio_hisr = 0; + s32 ret; + + if ((padapter->bDriverStopped == _TRUE) || + (padapter->bSurpriseRemoved == _TRUE)) + return; + + sdio_hisr = spi_read32(pdvobj, LOCAL_REG_HISR, &ret); + if (!ret) { + RT_TRACE(_module_hci_ops_c_, _drv_err_, ("%s: read SDIO_REG_HISR FAIL!!\n", __func__)); + return; + } + pdvobj->SdioRxFIFOSize = spi_read16(pdvobj, LOCAL_REG_RX0_REQ_LEN_1_BYTE, &ret); + + if (!ret) { + RT_TRACE(_module_hci_ops_c_, _drv_err_, ("%s: read SPI_REG_RX0_REQ_LEN FAIL!!\n", __func__)); + return; + } + + if (sdio_hisr & pdvobj->sdio_himr) + { + u32 v32; + + sdio_hisr &= pdvobj->sdio_himr; + + // clear HISR + v32 = sdio_hisr & MASK_SPI_HISR_CLEAR; + if (v32) { + spi_write32(pdvobj, LOCAL_REG_HISR, v32, &ret); + } + + spi_int_dpc(padapter, sdio_hisr); + } else { + RT_TRACE(_module_hci_ops_c_, _drv_err_, + ("%s: HISR(0x%08x) and HIMR(0x%08x) not match!\n", + __FUNCTION__, sdio_hisr, pdvobj->sdio_himr)); + if(sdio_hisr) + spi_write32(pdvobj, LOCAL_REG_HISR, sdio_hisr, &ret); + } +} + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_spec.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_spec.h new file mode 100644 index 0000000..1018d94 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/gspi/gspi_spec.h @@ -0,0 +1,257 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ + +#ifndef __GSPI_SPEC_H__ +#define __GSPI_SPEC_H__ + + +#define SPI_LOCAL_DOMAIN 0x0 +#define WLAN_IOREG_DOMAIN 0x8 +#define FW_FIFO_DOMAIN 0x4 +#define TX_HIQ_DOMAIN 0xc +#define TX_MIQ_DOMAIN 0xd +#define TX_LOQ_DOMAIN 0xe +#define RX_RXFIFO_DOMAIN 0x1f + +//IO Bus domain address mapping +#define DEFUALT_OFFSET 0x0 +#define LOCAL_OFFSET 0x10250000 +#define SPI_LOCAL_OFFSET 0x10250000 +#define WLAN_IOREG_OFFSET 0x10260000 +#define FW_FIFO_OFFSET 0x10270000 +#define TX_HIQ_OFFSET 0x10310000 +#define TX_MIQ_OFFSET 0x1032000 +#define TX_LOQ_OFFSET 0x10330000 +#define RX_RXOFF_OFFSET 0x10340000 + +#define WLAN_TX_HIQ_DEVICE_ID 4 // 0b[16], 100b[15:13] +#define WLAN_TX_MIQ_DEVICE_ID 5 // 0b[16], 101b[15:13] +#define WLAN_TX_LOQ_DEVICE_ID 6 // 0b[16], 110b[15:13] +#define WLAN_TX_EXQ_DEVICE_ID 3 // 0b[16], 011b[15:13] +#define WLAN_RX0FF_DEVICE_ID 7 // 0b[16], 111b[15:13] +#define WLAN_IOREG_DEVICE_ID 8 // 1b[16] + +//SPI Tx Free Page Index +#define HI_QUEUE_IDX 0 +#define MID_QUEUE_IDX 1 +#define LOW_QUEUE_IDX 2 +#define PUBLIC_QUEUE_IDX 3 + +#define MAX_TX_QUEUE 3 // HIQ, MIQ and LOQ +#define MAX_RX_QUEUE 1 + +//SPI Local registers +#ifdef CONFIG_RTL8188F +#define SPI_REG_TX_CTRL 0x0000 // SPI Tx Control +#define SPI_REG_STATUS_RECOVERY 0x0004 +#define SPI_REG_INT_TIMEOUT 0x0006 +#define SPI_REG_HIMR 0x0014 // SPI Host Interrupt Mask +#define SPI_REG_HISR 0x0018 // SPI Host Interrupt Service Routine +#define SPI_REG_RX0_REQ_LEN 0x001C // RXDMA Request Length +#define SPI_REG_FREE_TXPG 0x0020 // Free Tx Buffer Page +#define SPI_REG_HTSFR_INFO 0x0030 // HTSF Informaion +#define SPI_REG_HCPWM1 0x0038 // HCI Current Power Mode 1 +#define SPI_REG_HCPWM2 0x003A // HCI Current Power Mode 2 +#define SPI_REG_HRPWM1 0x0080 // HCI Request Power Mode 1 need check for 8188f??? +#define SPI_REG_HPS_CLKR 0x0084 // HCI Power Save Clock +#define SPI_REG_HSUS_CTRL 0x0086 // SPI HCI Suspend Control +#else +#define SPI_REG_TX_CTRL 0x0000 // SPI Tx Control +#define SPI_REG_STATUS_RECOVERY 0x0004 +#define SPI_REG_INT_TIMEOUT 0x0006 +#define SPI_REG_HIMR 0x0014 // SPI Host Interrupt Mask +#define SPI_REG_HISR 0x0018 // SPI Host Interrupt Service Routine +#define SPI_REG_RX0_REQ_LEN 0x001C // RXDMA Request Length +#define SPI_REG_FREE_TXPG 0x0020 // Free Tx Buffer Page +#define SPI_REG_HCPWM1 0x0024 // HCI Current Power Mode 1 +#define SPI_REG_HCPWM2 0x0026 // HCI Current Power Mode 2 +#define SPI_REG_HTSFR_INFO 0x0030 // HTSF Informaion +#define SPI_REG_HRPWM1 0x0080 // HCI Request Power Mode 1 +#define SPI_REG_HRPWM2 0x0082 // HCI Request Power Mode 2 +#define SPI_REG_HPS_CLKR 0x0084 // HCI Power Save Clock +#define SPI_REG_HSUS_CTRL 0x0086 // SPI HCI Suspend Control +#define SPI_REG_HIMR_ON 0x0090 //SPI Host Extension Interrupt Mask Always +#define SPI_REG_HISR_ON 0x0091 //SPI Host Extension Interrupt Status Always +#define SPI_REG_CFG 0x00F0 //SPI Configuration Register +#endif + +#define LOCAL_REG_TX_CTRL (SPI_REG_TX_CTRL |SPI_LOCAL_OFFSET) +#define LOCAL_REG_STATUS_RECOVERY (SPI_REG_STATUS_RECOVERY |SPI_LOCAL_OFFSET) +#define LOCAL_REG_INT_TIMEOUT (SPI_REG_INT_TIMEOUT |SPI_LOCAL_OFFSET) +#define LOCAL_REG_HIMR (SPI_REG_HIMR |SPI_LOCAL_OFFSET) +#define LOCAL_REG_HISR (SPI_REG_HISR |SPI_LOCAL_OFFSET) +#define LOCAL_REG_RX0_REQ_LEN_1_BYTE (SPI_REG_RX0_REQ_LEN |SPI_LOCAL_OFFSET) +#define LOCAL_REG_FREE_TXPG (SPI_REG_FREE_TXPG |SPI_LOCAL_OFFSET) +#define LOCAL_REG_HRPWM1 (SPI_REG_HRPWM1 |SPI_LOCAL_OFFSET) +#define LOCAL_REG_HCPWM1 (SPI_REG_HCPWM1 |SPI_LOCAL_OFFSET) +#define LOCAL_REG_SUSPEND_NORMAL (SPI_REG_HSUS_CTRL|SPI_LOCAL_OFFSET) +#define HCI_HIMR_DISABLED 0 + +//SPI HIMR MASK diff with SDIO +#ifdef CONFIG_RTL8188F +#define HCI_HISR_RX_REQUEST BIT(0) +#define HCI_HISR_AVAL BIT(1) +#define HCI_HISR_TXERR BIT(2) +#define HCI_HISR_RXERR BIT(3) +#define HCI_HISR_TXFOVW BIT(4) +#define HCI_HISR_RXFOVW BIT(5) +#define HCI_HISR_TXBCNOK BIT(6) +#define HCI_HISR_TXBCNERR BIT(7) +#define HCI_HISR_BCNERLY_INT BIT(16) +#define HCI_HISR_C2HCMD BIT(17) +#define HCI_HISR_CPWM1 BIT(18) +#define HCI_HISR_CPWM2 BIT(19) +#define HCI_HISR_HSISR_IND BIT(20) +#define HCI_HISR_GTINT3_IND BIT(21) +#define HCI_HISR_GTINT4_IND BIT(22) +#define HCI_HISR_PSTIMEOUT BIT(23) +#define HCI_HISR_OCPINT BIT(24) +#define HCI_HISR_ATIMEND BIT(25) +#define HCI_HISR_ATIMEND_E BIT(26) +#define HCI_HISR_CTWEND BIT(27) +#define HCI_HISR_TSF_BIT32_TOGGLE BIT(29) +#define HCI_HISR_PSTIMEOUT_E BIT(30) +//SPI HIMR MASK diff with SDIO +#define HCI_HIMR_RX_REQUEST BIT(0) +#define HCI_HIMR_AVAL BIT(1) +#define HCI_HIMR_TXERR BIT(2) +#define HCI_HIMR_RXERR BIT(3) +#define HCI_HIMR_TXFOVW BIT(4) +#define HCI_HIMR_RXFOVW BIT(5) +#define HCI_HIMR_TXBCNOK BIT(6) +#define HCI_HIMR_TXBCNERR BIT(7) +#define HCI_HIMR_BCNERLY_INT BIT(16) +#define HCI_HIMR_C2HCMD BIT(17) +#define HCI_HIMR_CPWM1 BIT(18) +#define HCI_HIMR_CPWM2 BIT(19) +#define HCI_HIMR_HSISR_IND BIT(20) +#define HCI_HIMR_GTINT3_IND BIT(21) +#define HCI_HIMR_GTINT4_IND BIT(22) +#define HCI_HIMR_PSTIMEOUT BIT(23) +#define HCI_HIMR_OCPINT BIT(24) +#define HCI_HIMR_ATIMEND BIT(25) +#define HCI_HIMR_ATIMEND_E BIT(26) +#define HCI_HIMR_CTWEND BIT(27) +#define HCI_HIMR_TSF_BIT32_TOGGLE BIT(29) +#define HCI_HIMR_PSTIMEOUT_E BIT(30) +#else +#define HCI_HISR_RX_REQUEST BIT(0) +#define HCI_HISR_AVAL BIT(1) +#define HCI_HISR_TXERR BIT(2) +#define HCI_HISR_RXERR BIT(3) +#define HCI_HISR_TXFOVW BIT(4) +#define HCI_HISR_RXFOVW BIT(5) +#define HCI_HISR_TXBCNOK BIT(6) +#define HCI_HISR_TXBCNERR BIT(7) +#define HCI_HISR_BCNERLY_INT BIT(16) +#define HCI_HISR_ATIMEND BIT(17) +#define HCI_HISR_ATIMEND_E BIT(18) +#define HCI_HISR_CTWEND BIT(19) +#define HCI_HISR_C2HCMD BIT(20) +#define HCI_HISR_CPWM1 BIT(21) +#define HCI_HISR_CPWM2 BIT(22) +#define HCI_HISR_HSISR_IND BIT(23) +#define HCI_HISR_GTINT3_IND BIT(24) +#define HCI_HISR_GTINT4_IND BIT(25) +#define HCI_HISR_PSTIMEOUT BIT(26) +#define HCI_HISR_OCPINT BIT(27) +#define HCI_HISR_TSF_BIT32_TOGGLE BIT(29) +//SPI HIMR MASK diff with SDIO +#define HCI_HIMR_RX_REQUEST BIT(0) +#define HCI_HIMR_AVAL BIT(1) +#define HCI_HIMR_TXERR BIT(2) +#define HCI_HIMR_RXERR BIT(3) +#define HCI_HIMR_TXFOVW BIT(4) +#define HCI_HIMR_RXFOVW BIT(5) +#define HCI_HIMR_TXBCNOK BIT(6) +#define HCI_HIMR_TXBCNERR BIT(7) +#define HCI_HIMR_BCNERLY_INT BIT(16) +#define HCI_HIMR_ATIMEND BIT(17) +#define HCI_HIMR_ATIMEND_E BIT(18) +#define HCI_HIMR_CTWEND BIT(19) +#define HCI_HIMR_C2HCMD BIT(20) +#define HCI_HIMR_CPWM1 BIT(21) +#define HCI_HIMR_CPWM2 BIT(22) +#define HCI_HIMR_HSISR_IND BIT(23) +#define HCI_HIMR_GTINT3_IND BIT(24) +#define HCI_HIMR_GTINT4_IND BIT(25) +#define HCI_HIMR_PSTIMEOUT BIT(26) +#define HCI_HIMR_OCPINT BIT(27) +#define HCI_HIMR_TSF_BIT32_TOGGLE BIT(29) +#endif +#define MASK_SPI_HISR_CLEAR (HCI_HIMR_TXERR |\ + HCI_HIMR_RXERR |\ + HCI_HIMR_TXFOVW |\ + HCI_HIMR_RXFOVW |\ + HCI_HIMR_TXBCNOK |\ + HCI_HIMR_TXBCNERR |\ + HCI_HIMR_C2HCMD |\ + HCI_HIMR_CPWM1 |\ + HCI_HIMR_CPWM2 |\ + HCI_HIMR_HSISR_IND |\ + HCI_HIMR_GTINT3_IND |\ + HCI_HIMR_GTINT4_IND |\ + HCI_HIMR_PSTIMEOUT |\ + HCI_HIMR_OCPINT) + +#define REG_LEN_FORMAT(pcmd, x) SET_BITS_TO_LE_4BYTE(pcmd, 0, 8, x)//(x<<(unsigned int)24) +#define REG_ADDR_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 8, 16, x)//(x<<(unsigned int)16) +#define REG_DOMAIN_ID_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 24, 5, x)//(x<<(unsigned int)0) +#define REG_FUN_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 29, 2, x)//(x<<(unsigned int)5) +#define REG_RW_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 31, 1, x)//(x<<(unsigned int)7) + +#define FIFO_LEN_FORMAT(pcmd, x) SET_BITS_TO_LE_4BYTE(pcmd, 0, 16, x)//(x<<(unsigned int)24) +//#define FIFO_ADDR_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 8, 16, x)//(x<<(unsigned int)16) +#define FIFO_DOMAIN_ID_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 24, 5, x)//(x<<(unsigned int)0) +#define FIFO_FUN_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 29, 2, x)//(x<<(unsigned int)5) +#define FIFO_RW_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 31, 1, x)//(x<<(unsigned int)7) + + +//get status dword0 +#define GET_STATUS_PUB_PAGE_NUM(status) LE_BITS_TO_4BYTE(status, 24, 8) +#define GET_STATUS_HI_PAGE_NUM(status) LE_BITS_TO_4BYTE(status, 18, 6) +#define GET_STATUS_MID_PAGE_NUM(status) LE_BITS_TO_4BYTE(status, 12, 6) +#define GET_STATUS_LOW_PAGE_NUM(status) LE_BITS_TO_4BYTE(status, 6, 6) +#define GET_STATUS_HISR_HI6BIT(status) LE_BITS_TO_4BYTE(status, 0, 6) + +//get status dword1 +#define GET_STATUS_HISR_MID8BIT(status) LE_BITS_TO_4BYTE(status + 4, 24, 8) +#define GET_STATUS_HISR_LOW8BIT(status) LE_BITS_TO_4BYTE(status + 4, 16, 8) +#define GET_STATUS_ERROR(status) LE_BITS_TO_4BYTE(status + 4, 17, 1) +#define GET_STATUS_INT(status) LE_BITS_TO_4BYTE(status + 4, 16, 1) +#define GET_STATUS_RX_LENGTH(status) LE_BITS_TO_4BYTE(status + 4, 0, 16) + + +#define RXDESC_SIZE 24 + +#define TX_FREE_PG_QUEUE 4 // The number of Tx FIFO free page +#define TX_FIFO_PAGE_SZ 128 + +struct spi_more_data { + unsigned long more_data; + unsigned long len; +}; + +extern BUS_DRV_OPS_T bus_driver_ops; + +extern u8 spi_query_status_info(struct dvobj_priv *pdvobj); + +extern void spi_set_intf_ops(struct _io_ops *pops); + +#endif //__GSPI_SPEC_H__ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/hci_intfs.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/hci_intfs.h new file mode 100644 index 0000000..bc205b5 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/hci_intfs.h @@ -0,0 +1,68 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _HCI_INTFS_H_ +#define _HCI_INTFS_H_ + +#include + +struct host_ctrl_intf_ops +{ + struct dvobj_priv * (*dvobj_init)(void); + void (*dvobj_deinit)(struct dvobj_priv *dvobj); + void (*dvobj_request_irq)(struct dvobj_priv *dvobj); + void (*dvobj_free_irq)(struct dvobj_priv *dvobj); +}; + +extern struct dvobj_priv *hci_dvobj_init(void); +extern void hci_dvobj_deinit(struct dvobj_priv *dvobj); +extern void hci_dvobj_request_irq(struct dvobj_priv *dvobj); +extern void hci_dvobj_free_irq(struct dvobj_priv *dvobj); + +#if defined(CONFIG_GSPI_HCI) +#define hci_bus_intf_type RTW_GSPI +#define hci_set_intf_ops spi_set_intf_ops +#define hci_intf_start rtw_hal_enable_interrupt +#define hci_intf_stop rtw_hal_disable_interrupt +extern s32 gspi_dvobj_xmit_mgnt(_adapter * padapter, struct xmit_frame *pmgntframe); +extern s32 gspi_dvobj_xmit_data(_adapter *padapter, struct xmit_frame *pxmitframe); +#endif + +#if defined(CONFIG_SDIO_HCI) +#define hci_bus_intf_type RTW_SDIO +#define hci_set_intf_ops sdio_set_intf_ops +#define hci_intf_start rtw_hal_enable_interrupt +#define hci_intf_stop rtw_hal_disable_interrupt +extern s32 sdio_dvobj_xmit_mgnt(_adapter * padapter, struct xmit_frame *pmgntframe); +extern s32 sdio_dvobj_xmit_data(_adapter *padapter, struct xmit_frame *pxmitframe); + +#endif + +#if defined(CONFIG_LX_HCI) +#define hci_bus_intf_type RTW_LXBUS +#define hci_set_intf_ops lxbus_set_intf_ops +#define hci_intf_start rtw_hal_enable_interrupt +#define hci_intf_stop hci_lxbus_intf_stop +void hci_lxbus_intf_stop(_adapter *padapter); +u32 lextra_bus_dma_Interrupt (void* data); +#endif + + +#endif //_HCI_INTFS_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/hci_spec.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/hci_spec.h new file mode 100644 index 0000000..8843305 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/hci_spec.h @@ -0,0 +1,433 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HCI_SPEC_H__ +#define __HCI_SPEC_H__ + + +#if defined(CONFIG_GSPI_HCI) +#include "gspi/gspi_spec.h" + +// SPI Header Files +#ifdef PLATFORM_LINUX +#include +#endif + +#define GSPI_CMD_LEN 4 +#define HAL_INTERFACE_CMD_LEN GSPI_CMD_LEN +#define GSPI_STATUS_LEN 8 +#define HAL_INTERFACE_CMD_STATUS_LEN GSPI_STATUS_LEN +#define HAL_INTERFACE_OVERHEAD (HAL_INTERFACE_CMD_LEN+HAL_INTERFACE_OVERHEAD) +//reserve tx headroom in case of softap forwarding unicase packet +#define RX_RESERV_HEADROOM (SKB_WLAN_TX_EXTRA_LEN>RX_DRIVER_INFO+RXDESC_SIZE)?(SKB_WLAN_TX_EXTRA_LEN-RX_DRIVER_INFO-RXDESC_SIZE):0 +typedef struct gspi_data +{ + //u8 func_number; + + //u8 tx_block_mode; + //u8 rx_block_mode; + u16 block_transfer_len; //u32 block_transfer_len; + +#ifdef PLATFORM_LINUX + struct spi_device *func; + + struct workqueue_struct *priv_wq; + struct delayed_work irq_work; +#endif + +#if defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) + _mutex spi_mutex; +#endif +} GSPI_DATA, *PGSPI_DATA; + +#define INTF_DATA GSPI_DATA + +//extern void spi_set_intf_ops(struct _io_ops *pops); +extern void spi_int_hdl(PADAPTER padapter); +#define rtw_hci_interrupt_handler(__adapter) spi_int_hdl(__adapter) + +#elif defined(CONFIG_SDIO_HCI) +#include "sdio/sdio_spec.h" + +#define GSPI_CMD_LEN 0 +#define HAL_INTERFACE_CMD_LEN GSPI_CMD_LEN +#define GSPI_STATUS_LEN 8 +#define HAL_INTERFACE_CMD_STATUS_LEN GSPI_STATUS_LEN +#define HAL_INTERFACE_OVERHEAD (HAL_INTERFACE_CMD_LEN+HAL_INTERFACE_OVERHEAD) +#define RX_RESERV_HEADROOM (SKB_WLAN_TX_EXTRA_LEN>RX_DRIVER_INFO+RXDESC_SIZE)?(SKB_WLAN_TX_EXTRA_LEN-RX_DRIVER_INFO-RXDESC_SIZE):0 + +typedef struct gspi_data +{ + //u8 func_number; + + //u8 tx_block_mode; + //u8 rx_block_mode; + u16 block_transfer_len; //u32 block_transfer_len; + +#ifdef PLATFORM_LINUX + struct spi_device *func; + + struct workqueue_struct *priv_wq; + struct delayed_work irq_work; +#endif + + struct sdio_func *func; + +#if defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) + _mutex spi_mutex; +#endif +} GSPI_DATA, *PGSPI_DATA; + +#define INTF_DATA GSPI_DATA + +//extern void spi_set_intf_ops(struct _io_ops *pops); +extern void spi_int_hdl(PADAPTER padapter); +#define rtw_hci_interrupt_handler(__adapter) spi_int_hdl(__adapter) + +#elif defined(CONFIG_USB_HCI) +#include +#include + +#elif defined(CONFIG_PCI_HCI) +#include +#ifdef PLATFORM_LINUX +#include +#endif + +#define INTF_CMD_LEN 0 + +#define INTEL_VENDOR_ID 0x8086 +#define SIS_VENDOR_ID 0x1039 +#define ATI_VENDOR_ID 0x1002 +#define ATI_DEVICE_ID 0x7914 +#define AMD_VENDOR_ID 0x1022 + +#define PCI_MAX_BRIDGE_NUMBER 255 +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 + +#define PCI_CONF_ADDRESS 0x0CF8 // PCI Configuration Space Address +#define PCI_CONF_DATA 0x0CFC // PCI Configuration Space Data + +#define PCI_CLASS_BRIDGE_DEV 0x06 +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 + +#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 + +#define U1DONTCARE 0xFF +#define U2DONTCARE 0xFFFF +#define U4DONTCARE 0xFFFFFFFF + +#define PCI_VENDER_ID_REALTEK 0x10ec + +#define HAL_HW_PCI_8180_DEVICE_ID 0x8180 +#define HAL_HW_PCI_8185_DEVICE_ID 0x8185 //8185 or 8185b +#define HAL_HW_PCI_8188_DEVICE_ID 0x8188 //8185b +#define HAL_HW_PCI_8198_DEVICE_ID 0x8198 //8185b +#define HAL_HW_PCI_8190_DEVICE_ID 0x8190 //8190 +#define HAL_HW_PCI_8723E_DEVICE_ID 0x8723 //8723E +#define HAL_HW_PCI_8192_DEVICE_ID 0x8192 //8192 PCI-E +#define HAL_HW_PCI_8192SE_DEVICE_ID 0x8192 //8192 SE +#define HAL_HW_PCI_8174_DEVICE_ID 0x8174 //8192 SE +#define HAL_HW_PCI_8173_DEVICE_ID 0x8173 //8191 SE Crab +#define HAL_HW_PCI_8172_DEVICE_ID 0x8172 //8191 SE RE +#define HAL_HW_PCI_8171_DEVICE_ID 0x8171 //8191 SE Unicron +#define HAL_HW_PCI_0045_DEVICE_ID 0x0045 //8190 PCI for Ceraga +#define HAL_HW_PCI_0046_DEVICE_ID 0x0046 //8190 Cardbus for Ceraga +#define HAL_HW_PCI_0044_DEVICE_ID 0x0044 //8192e PCIE for Ceraga +#define HAL_HW_PCI_0047_DEVICE_ID 0x0047 //8192e Express Card for Ceraga +#define HAL_HW_PCI_700F_DEVICE_ID 0x700F +#define HAL_HW_PCI_701F_DEVICE_ID 0x701F +#define HAL_HW_PCI_DLINK_DEVICE_ID 0x3304 +#define HAL_HW_PCI_8192CET_DEVICE_ID 0x8191 //8192ce +#define HAL_HW_PCI_8192CE_DEVICE_ID 0x8178 //8192ce +#define HAL_HW_PCI_8191CE_DEVICE_ID 0x8177 //8192ce +#define HAL_HW_PCI_8188CE_DEVICE_ID 0x8176 //8192ce +#define HAL_HW_PCI_8192CU_DEVICE_ID 0x8191 //8192ce +#define HAL_HW_PCI_8192DE_DEVICE_ID 0x8193 //8192de +#define HAL_HW_PCI_002B_DEVICE_ID 0x002B //8192de, provided by HW SD +#define HAL_HW_PCI_8188EE_DEVICE_ID 0x8179 + +#define HAL_MEMORY_MAPPED_IO_RANGE_8190PCI 0x1000 //8190 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8190PCI 0x00 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192PCIE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192PCIE 0x01 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192SE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192SE 0x10 +#define HAL_HW_PCI_REVISION_ID_8192CE 0x1 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192CE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192DE 0x0 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192DE 0x4000 //8192 support 16 pages of IO registers + +enum pci_bridge_vendor { + PCI_BRIDGE_VENDOR_INTEL = 0x0,//0b'0000,0001 + PCI_BRIDGE_VENDOR_ATI, //= 0x02,//0b'0000,0010 + PCI_BRIDGE_VENDOR_AMD, //= 0x04,//0b'0000,0100 + PCI_BRIDGE_VENDOR_SIS ,//= 0x08,//0b'0000,1000 + PCI_BRIDGE_VENDOR_UNKNOWN, //= 0x40,//0b'0100,0000 + PCI_BRIDGE_VENDOR_MAX ,//= 0x80 +} ; + +// copy this data structor defination from MSDN SDK +typedef struct _PCI_COMMON_CONFIG { + u16 VendorID; + u16 DeviceID; + u16 Command; + u16 Status; + u8 RevisionID; + u8 ProgIf; + u8 SubClass; + u8 BaseClass; + u8 CacheLineSize; + u8 LatencyTimer; + u8 HeaderType; + u8 BIST; + + union { + struct _PCI_HEADER_TYPE_0 { + u32 BaseAddresses[6]; + u32 CIS; + u16 SubVendorID; + u16 SubSystemID; + u32 ROMBaseAddress; + u8 CapabilitiesPtr; + u8 Reserved1[3]; + u32 Reserved2; + + u8 InterruptLine; + u8 InterruptPin; + u8 MinimumGrant; + u8 MaximumLatency; + } type0; +#if 0 + struct _PCI_HEADER_TYPE_1 { + u32 BaseAddresses[PCI_TYPE1_ADDRESSES]; + u8 PrimaryBusNumber; + u8 SecondaryBusNumber; + u8 SubordinateBusNumber; + u8 SecondaryLatencyTimer; + u8 IOBase; + u8 IOLimit; + u16 SecondaryStatus; + u16 MemoryBase; + u16 MemoryLimit; + u16 PrefetchableMemoryBase; + u16 PrefetchableMemoryLimit; + u32 PrefetchableMemoryBaseUpper32; + u32 PrefetchableMemoryLimitUpper32; + u16 IOBaseUpper; + u16 IOLimitUpper; + u32 Reserved2; + u32 ExpansionROMBase; + u8 InterruptLine; + u8 InterruptPin; + u16 BridgeControl; + } type1; + + struct _PCI_HEADER_TYPE_2 { + u32 BaseAddress; + u8 CapabilitiesPtr; + u8 Reserved2; + u16 SecondaryStatus; + u8 PrimaryBusNumber; + u8 CardbusBusNumber; + u8 SubordinateBusNumber; + u8 CardbusLatencyTimer; + u32 MemoryBase0; + u32 MemoryLimit0; + u32 MemoryBase1; + u32 MemoryLimit1; + u16 IOBase0_LO; + u16 IOBase0_HI; + u16 IOLimit0_LO; + u16 IOLimit0_HI; + u16 IOBase1_LO; + u16 IOBase1_HI; + u16 IOLimit1_LO; + u16 IOLimit1_HI; + u8 InterruptLine; + u8 InterruptPin; + u16 BridgeControl; + u16 SubVendorID; + u16 SubSystemID; + u32 LegacyBaseAddress; + u8 Reserved3[56]; + u32 SystemControl; + u8 MultiMediaControl; + u8 GeneralStatus; + u8 Reserved4[2]; + u8 GPIO0Control; + u8 GPIO1Control; + u8 GPIO2Control; + u8 GPIO3Control; + u32 IRQMuxRouting; + u8 RetryStatus; + u8 CardControl; + u8 DeviceControl; + u8 Diagnostic; + } type2; +#endif + } u; + + u8 DeviceSpecific[108]; +} PCI_COMMON_CONFIG , *PPCI_COMMON_CONFIG; + +typedef struct _RT_PCI_CAPABILITIES_HEADER { + u8 CapabilityID; + u8 Next; +} RT_PCI_CAPABILITIES_HEADER, *PRT_PCI_CAPABILITIES_HEADER; + +struct pci_priv{ + BOOLEAN pci_clk_req; + + u8 pciehdr_offset; + // PCIeCap is only differece between B-cut and C-cut. + // Configuration Space offset 72[7:4] + // 0: A/B cut + // 1: C cut and later. + u8 pcie_cap; + u8 linkctrl_reg; + + u8 busnumber; + u8 devnumber; + u8 funcnumber; + + u8 pcibridge_busnum; + u8 pcibridge_devnum; + u8 pcibridge_funcnum; + u8 pcibridge_vendor; + u16 pcibridge_vendorid; + u16 pcibridge_deviceid; + u8 pcibridge_pciehdr_offset; + u8 pcibridge_linkctrlreg; + + u8 amd_l1_patch; +}; + +typedef struct _RT_ISR_CONTENT +{ + union{ + u32 IntArray[2]; + u32 IntReg4Byte; + u16 IntReg2Byte; + }; +}RT_ISR_CONTENT, *PRT_ISR_CONTENT; + +//#define RegAddr(addr) (addr + 0xB2000000UL) +//some platform macros will def here +static inline void NdisRawWritePortUlong(u32 port, u32 val) +{ + outl(val, port); + //writel(val, (u8 *)RegAddr(port)); +} + +static inline void NdisRawWritePortUchar(u32 port, u8 val) +{ + outb(val, port); + //writeb(val, (u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUchar(u32 port, u8 *pval) +{ + *pval = inb(port); + //*pval = readb((u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUshort(u32 port, u16 *pval) +{ + *pval = inw(port); + //*pval = readw((u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUlong(u32 port, u32 *pval) +{ + *pval = inl(port); + //*pval = readl((u8 *)RegAddr(port)); +} +#elif defined(CONFIG_LX_HCI) +#define GSPI_CMD_LEN 0 +#define GSPI_STATUS_LEN 0 +#include "lxbus/lxbus_spec.h" +#endif // interface define + +#if 0 //TODO +struct intf_priv { + + u8 *intf_dev; + u32 max_iosz; //USB2.0: 128, USB1.1: 64, SDIO:64 + u32 max_xmitsz; //USB2.0: unlimited, SDIO:512 + u32 max_recvsz; //USB2.0: unlimited, SDIO:512 + + volatile u8 *io_rwmem; + volatile u8 *allocated_io_rwmem; + u32 io_wsz; //unit: 4bytes + u32 io_rsz;//unit: 4bytes + u8 intf_status; + + void (*_bus_io)(u8 *priv); + +/* +Under Sync. IRP (SDIO/USB) +A protection mechanism is necessary for the io_rwmem(read/write protocol) + +Under Async. IRP (SDIO/USB) +The protection mechanism is through the pending queue. +*/ + + _mutex ioctl_mutex; + + +#ifdef PLATFORM_LINUX + #ifdef CONFIG_USB_HCI + // when in USB, IO is through interrupt in/out endpoints + struct usb_device *udev; + PURB piorw_urb; + u8 io_irp_cnt; + u8 bio_irp_pending; + _sema io_retevt; + _timer io_timer; + u8 bio_irp_timeout; + u8 bio_timer_cancel; + #endif +#endif + +#ifdef PLATFORM_OS_XP + #ifdef CONFIG_SDIO_HCI + // below is for io_rwmem... + PMDL pmdl; + PSDBUS_REQUEST_PACKET sdrp; + PSDBUS_REQUEST_PACKET recv_sdrp; + PSDBUS_REQUEST_PACKET xmit_sdrp; + + PIRP piorw_irp; + + #endif + #ifdef CONFIG_USB_HCI + PURB piorw_urb; + PIRP piorw_irp; + u8 io_irp_cnt; + u8 bio_irp_pending; + _sema io_retevt; + #endif +#endif + +}; +#endif +#endif //__HCI_SPEC_H__ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/lxbus/lxbus_spec.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/lxbus/lxbus_spec.h new file mode 100644 index 0000000..e12b099 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/lxbus/lxbus_spec.h @@ -0,0 +1,55 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __LXBUS_SPEC_H__ +#define __LXBUS_SPEC_H__ + +#include +//#include + + +#define HAL_INTERFACE_CMD_LEN 0 +#define HAL_INTERFACE_CMD_STATUS_LEN 0 +#define HAL_INTERFACE_OVERHEAD (HAL_INTERFACE_CMD_LEN+HAL_INTERFACE_CMD_STATUS_LEN) + +/* + * The following data structure is used for 8195a debug, and should not + * declared this parameter in release version to save sram usage + * It is used for debugging tx/rx and r/w pointer + */ +struct hal_debug +{ + unsigned int int_count; + unsigned int crc_err; + u16 last_write_be; + u16 last_write_mgt; + u16 last_closed_be; + u16 last_closed_mgt; + +}; + + +// The following section should be removed? +#define WLAN_TX_HIQ_DEVICE_ID 4 // 0b[16], 100b[15:13] +#define WLAN_TX_MIQ_DEVICE_ID 5 // 0b[16], 101b[15:13] +#define WLAN_TX_LOQ_DEVICE_ID 6 // 0b[16], 110b[15:13] +#define SDIO_MAX_TX_QUEUE 3 // HIQ, MIQ and LOQ + +#endif //__LXBUS_SPEC_H__ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_drvio.c b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_drvio.c new file mode 100644 index 0000000..2909340 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_drvio.c @@ -0,0 +1,818 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#define _GSPI_IO_C_ + +#include + +#ifdef CONFIG_SDIO_HCI +#include "wifi_io.h" //from sdio_host driver +//#include +//#include +//#define SDIO_CMD52_IO + +//SDIO host local register space mapping. +#define SDIO_LOCAL_MSK 0x0FFF +#define WLAN_IOREG_MSK 0x7FFF +#define WLAN_FIFO_MSK 0x1FFF // Aggregation Length[12:0] +#define WLAN_RX0FF_MSK 0x0003 + +#define SDIO_WITHOUT_REF_DEVICE_ID 0 // Without reference to the SDIO Device ID +#define SDIO_LOCAL_DEVICE_ID 0 // 0b[16], 000b[15:13] +#define WLAN_TX_HIQ_DEVICE_ID 4 // 0b[16], 100b[15:13] +#define WLAN_TX_MIQ_DEVICE_ID 5 // 0b[16], 101b[15:13] +#define WLAN_TX_LOQ_DEVICE_ID 6 // 0b[16], 110b[15:13] +#define WLAN_RX0FF_DEVICE_ID 7 // 0b[16], 111b[15:13] +#define WLAN_IOREG_DEVICE_ID 8 // 1b[16] + +// +// Description: +// Query SDIO Local register to query current the number of Free TxPacketBuffer page. +// +// Assumption: +// 1. Running at PASSIVE_LEVEL +// 2. RT_TX_SPINLOCK is NOT acquired. +// +// Created by Roger, 2011.01.28. +// +#ifdef CONFIG_RTL8188F +u8 spi_query_status_info(struct dvobj_priv *pdvobj) +{ + + ADAPTER *padapter = pdvobj->if1; + pdvobj->SdioTxFIFOFreePage[HI_QUEUE_IDX] = rtw_read8(padapter, LOCAL_REG_FREE_TXPG); + pdvobj->SdioTxFIFOFreePage[MID_QUEUE_IDX] = rtw_read8(padapter, LOCAL_REG_FREE_TXPG+2); + pdvobj->SdioTxFIFOFreePage[LOW_QUEUE_IDX] = rtw_read8(padapter, LOCAL_REG_FREE_TXPG+4); + pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] = rtw_read8(padapter, LOCAL_REG_FREE_TXPG+6); + RT_TRACE(_module_hci_ops_c_, _drv_notice_, + ("%s: Free page for HIQ(%x),MIDQ(%x),LOWQ(%x),PUBQ(%x)\n", + __FUNCTION__, + pdvobj->SdioTxFIFOFreePage[HI_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[MID_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[LOW_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX])); + //_exit_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql); + + return _TRUE; +} +#else +u8 spi_query_status_info(struct dvobj_priv *pdvobj) +{ + u32 NumOfFreePage; + ADAPTER *padapter = pdvobj->if1; + + NumOfFreePage = rtw_read32(padapter, LOCAL_REG_FREE_TXPG); + +// _enter_critical_bh(&pdvobj->SdioTxFIFOFreePageLock, &irql); + rtw_memcpy(pdvobj->SdioTxFIFOFreePage, &NumOfFreePage, 4); + + RT_TRACE(_module_hci_ops_c_, _drv_notice_, + ("%s: Free page for HIQ(%x),MIDQ(%x),LOWQ(%x),PUBQ(%x)\n", + __FUNCTION__, + pdvobj->SdioTxFIFOFreePage[HI_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[MID_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[LOW_QUEUE_IDX], + pdvobj->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX])); +// _exit_critical_bh(&pdvobj->SdioTxFIFOFreePageLock, &irql); + + return _TRUE; +} +#endif +static unsigned char get_deviceid(unsigned int addr) +{ + unsigned char devideId; + unsigned short pseudoId; + + + pseudoId = (unsigned short)(addr >> 16); + switch (pseudoId) + { + case 0x1025: + devideId = SDIO_LOCAL_DEVICE_ID; + break; + + case 0x1026: + devideId = WLAN_IOREG_DEVICE_ID; + break; + +// case 0x1027: +// devideId = SDIO_FIRMWARE_FIFO; +// break; + + case 0x1031: + devideId = WLAN_TX_HIQ_DEVICE_ID; + break; + + case 0x1032: + devideId = WLAN_TX_MIQ_DEVICE_ID; + break; + + case 0x1033: + devideId = WLAN_TX_LOQ_DEVICE_ID; + break; + + case 0x1034: + devideId = WLAN_RX0FF_DEVICE_ID; + break; + + default: +// devideId = (u8)((addr >> 13) & 0xF); + devideId = WLAN_IOREG_DEVICE_ID; + break; + } + + return devideId; +} + +static unsigned int _cvrt2ftaddr(const unsigned int addr, unsigned char *pdeviceId, unsigned short *poffset) +{ + unsigned char deviceId; + unsigned short offset; + unsigned int ftaddr; + + + deviceId = get_deviceid(addr); + offset = 0; + + switch (deviceId) + { + case SDIO_LOCAL_DEVICE_ID: + offset = addr & SDIO_LOCAL_MSK; + break; + + case WLAN_TX_HIQ_DEVICE_ID: + case WLAN_TX_MIQ_DEVICE_ID: + case WLAN_TX_LOQ_DEVICE_ID: + offset = addr & WLAN_FIFO_MSK; + break; + + case WLAN_RX0FF_DEVICE_ID: + offset = addr & WLAN_RX0FF_MSK; + break; + + case WLAN_IOREG_DEVICE_ID: + default: + deviceId = WLAN_IOREG_DEVICE_ID; + offset = addr & WLAN_IOREG_MSK; + break; + } + ftaddr = (deviceId << 13) | offset; + + if (pdeviceId) *pdeviceId = deviceId; + if (poffset) *poffset = offset; + + return ftaddr; +} + +unsigned char sdio_read8(ADAPTER *Adapter, unsigned int addr, int *err) +{ + struct dvobj_priv *psdiodev; + unsigned int ftaddr; + unsigned char val; + +_func_enter_; + + psdiodev = adapter_to_dvobj(Adapter); + ftaddr = _cvrt2ftaddr(addr, NULL, NULL); + + rtw_sdio_bus_ops.claim_host(psdiodev->intf_data.func); + val = rtw_sdio_bus_ops.readb(psdiodev->intf_data.func, ftaddr, err); + rtw_sdio_bus_ops.release_host(psdiodev->intf_data.func); + + if(err && *err) + DBG_871X( "%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr); + +_func_exit_; + + return val; + +} + +unsigned short sdio_read16(ADAPTER *Adapter, unsigned int addr, int *err) +{ + struct dvobj_priv *psdiodev; + unsigned int ftaddr; + unsigned short val; + +_func_enter_; + + psdiodev = adapter_to_dvobj(Adapter); + + if (addr & 1) + DBG_871X( "sdio_read16 addr is wrong addr:0x%08x\n", addr); + + ftaddr = _cvrt2ftaddr(addr, NULL, NULL); + rtw_sdio_bus_ops.claim_host(psdiodev->intf_data.func); + val = rtw_sdio_bus_ops.readw(psdiodev->intf_data.func, ftaddr, err); + rtw_sdio_bus_ops.release_host(psdiodev->intf_data.func); + + if(err && *err) + DBG_871X( "%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr); + +_func_exit_; + + return val; +} + +unsigned int sdio_read32(ADAPTER *Adapter, unsigned int addr, int *err) +{ + struct dvobj_priv *psdiodev; + unsigned int ftaddr; + unsigned int val; + +_func_enter_; + + psdiodev = adapter_to_dvobj(Adapter); + + if (addr & 3) + DBG_871X( "sdio_read32 addr is wrong addr:0x%08x\n", addr); + + ftaddr = _cvrt2ftaddr(addr, NULL, NULL); + rtw_sdio_bus_ops.claim_host(psdiodev->intf_data.func); + val = rtw_sdio_bus_ops.readl(psdiodev->intf_data.func, ftaddr, err); + rtw_sdio_bus_ops.release_host(psdiodev->intf_data.func); + if(err && *err) + DBG_871X( "%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr); + +_func_exit_; + + return val; + +} + + +unsigned int sdio_write8(ADAPTER *Adapter, unsigned int addr, unsigned int buf, int*err) +{ + struct dvobj_priv *psdiodev; + unsigned int ftaddr; + unsigned int val = 0; + +_func_enter_; + + psdiodev = adapter_to_dvobj(Adapter); + + ftaddr = _cvrt2ftaddr(addr, NULL, NULL); + + rtw_sdio_bus_ops.claim_host(psdiodev->intf_data.func); + rtw_sdio_bus_ops.writeb(psdiodev->intf_data.func, buf&0xFF,ftaddr, err); + rtw_sdio_bus_ops.release_host(psdiodev->intf_data.func); + + if(err && *err) + DBG_871X( "%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr); + +_func_exit_; + + return val; +} + +unsigned int sdio_write16(ADAPTER *Adapter, unsigned int addr,unsigned int buf, int *err) +{ + struct dvobj_priv *psdiodev; + unsigned int ftaddr; + unsigned int val = 0; + +_func_enter_; + + psdiodev = adapter_to_dvobj(Adapter); + + if (addr & 1) + DBG_871X( "sdio_write16 addr is wrong addr:0x%08x\n", addr); + + ftaddr = _cvrt2ftaddr(addr, NULL, NULL); + rtw_sdio_bus_ops.claim_host(psdiodev->intf_data.func); + rtw_sdio_bus_ops.writew(psdiodev->intf_data.func, buf&0xFFFF,ftaddr, err); + rtw_sdio_bus_ops.release_host(psdiodev->intf_data.func); + if(err && *err) + DBG_871X( "%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr); + +_func_exit_; + + return val; +} + +unsigned int sdio_write32(ADAPTER *Adapter, unsigned int addr, unsigned int buf, int *err) +{ + struct dvobj_priv *psdiodev; + unsigned int ftaddr; + unsigned int val = 0; + +_func_enter_; + + psdiodev = adapter_to_dvobj(Adapter); + + if (addr & 3) + DBG_871X( "sdio_write32 addr is wrong addr:0x%08x\n", addr); + + ftaddr = _cvrt2ftaddr(addr, NULL, NULL); + rtw_sdio_bus_ops.claim_host(psdiodev->intf_data.func); + rtw_sdio_bus_ops.writel(psdiodev->intf_data.func, buf&0xFFFFFFFF,ftaddr, err); + rtw_sdio_bus_ops.release_host(psdiodev->intf_data.func); + + if(err && *err) + DBG_871X( "%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr); + +_func_exit_; + + return val; +} + +unsigned int _fifoqueue2ftaddr(unsigned int fifo, unsigned int addr) +{ + unsigned int cmdaddr = TX_HIQ_DOMAIN; + + switch(fifo) { + case TX_LOQ_DOMAIN: + cmdaddr = ((WLAN_TX_LOQ_DEVICE_ID << 13) | (addr & WLAN_FIFO_MSK)); + break; + case TX_HIQ_DOMAIN: + cmdaddr = ((WLAN_TX_HIQ_DEVICE_ID << 13) | (addr & WLAN_FIFO_MSK)); + break; + case TX_MIQ_DOMAIN: + cmdaddr = ((WLAN_TX_MIQ_DEVICE_ID << 13) | (addr & WLAN_FIFO_MSK)); + break; + case RX_RXFIFO_DOMAIN: + cmdaddr = ((WLAN_RX0FF_DEVICE_ID << 13) | (addr & WLAN_RX0FF_MSK)); + break; + default: + cmdaddr = ((WLAN_TX_MIQ_DEVICE_ID << 13) | (addr & WLAN_FIFO_MSK)); + break; + + } + return cmdaddr; +} + +void sdio_write_tx_fifo(ADAPTER *Adapter, unsigned char *buf, int reallen, unsigned int fifo) +{ + struct dvobj_priv *psdiodev; + unsigned int ftaddr; + unsigned char *mem = buf; + int free_mem = 0; + int status; + unsigned int cnt = (unsigned int)reallen; + unsigned int page_num = 0; + unsigned int wait_num = 100; + unsigned int use_page = 0; + +_func_enter_; + use_page = (cnt + TX_FIFO_PAGE_SZ - 1) / TX_FIFO_PAGE_SZ; + + if (cnt > 512) + cnt = _RND(cnt, 512); + else + cnt = _RND(cnt, 4); + + if (((u32)buf) % 4) { + mem = rtw_zmalloc(cnt); + while(!mem) { + DBG_871X("rtw_zmalloc fail, cannot write tx fifo now\n"); + rtw_yield_os(); + mem = rtw_zmalloc(cnt); + } + + free_mem = 1; + //DBG_871X("sdio_write_tx_fifo tem_buf:%p ", mem); + rtw_memcpy(mem, buf, reallen); + + } else { + mem = buf; + } + + if (((u32)mem) % 4) { + DBG_871X("sdio_write_tx_fifo: Oops mem %p not 4 byte Alignment this will cause DMA wrong \n", mem); + } + + psdiodev = adapter_to_dvobj(Adapter); + + + if (fifo == TX_HIQ_DOMAIN) + page_num = psdiodev->SdioTxFIFOFreePage[HI_QUEUE_IDX]; + else if (fifo == TX_LOQ_DOMAIN) + page_num = psdiodev->SdioTxFIFOFreePage[LOW_QUEUE_IDX]; + else + page_num = psdiodev->SdioTxFIFOFreePage[MID_QUEUE_IDX]; + + if (page_num + psdiodev->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] < use_page) { + spi_query_status_info(Adapter->dvobj); + } + + while (page_num + psdiodev->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] < use_page) { + DBG_871X("Oops: spi_write_tx_fifo(): page_num is %d, padapter->pub_page is %d, wait_num is %d", + page_num, psdiodev->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX], wait_num); + + rtw_msleep_os(1); + //rtw_udelay_os(20); + spi_query_status_info(Adapter->dvobj); + + if (fifo == TX_HIQ_DOMAIN) + page_num = psdiodev->SdioTxFIFOFreePage[HI_QUEUE_IDX]; + else if (fifo == TX_LOQ_DOMAIN) + page_num = psdiodev->SdioTxFIFOFreePage[LOW_QUEUE_IDX]; + else + page_num = psdiodev->SdioTxFIFOFreePage[MID_QUEUE_IDX]; + + if (wait_num <= 2) { + DBG_871X("%s(): wait_num is <= 2 drop", __FUNCTION__); + return; + } + wait_num --; + } + + if (fifo == TX_HIQ_DOMAIN) { + if (use_page <= page_num) { + psdiodev->SdioTxFIFOFreePage[HI_QUEUE_IDX] -= page_num; + } else { + psdiodev->SdioTxFIFOFreePage[HI_QUEUE_IDX] = 0; + psdiodev->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] -= use_page - psdiodev->SdioTxFIFOFreePage[HI_QUEUE_IDX]; + } + } else if (fifo == TX_LOQ_DOMAIN) { + if (use_page <= page_num) { + psdiodev->SdioTxFIFOFreePage[LOW_QUEUE_IDX] -= page_num; + } else { + psdiodev->SdioTxFIFOFreePage[LOW_QUEUE_IDX] = 0; + psdiodev->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] -= use_page - psdiodev->SdioTxFIFOFreePage[LOW_QUEUE_IDX]; + } + } else { + if (use_page <= page_num) { + psdiodev->SdioTxFIFOFreePage[MID_QUEUE_IDX] -= page_num; + } else { + psdiodev->SdioTxFIFOFreePage[MID_QUEUE_IDX] = 0; + psdiodev->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] -= use_page - psdiodev->SdioTxFIFOFreePage[MID_QUEUE_IDX]; + } + } + + //must reallen here or tx will wrong when RND(512) + ftaddr = _fifoqueue2ftaddr(fifo, reallen >> 2); + + rtw_sdio_bus_ops.claim_host(psdiodev->intf_data.func); + status = rtw_sdio_bus_ops.memcpy_toio(psdiodev->intf_data.func, ftaddr, mem, cnt); + rtw_sdio_bus_ops.release_host(psdiodev->intf_data.func); + + if (free_mem) { + rtw_mfree(mem, cnt); + } + + if (status) { + DBG_871X("sdio_write_tx_fifo:status:%x ftaddr:%x Length:%d fifo:%x ", status, ftaddr, cnt, fifo); + } + +_func_exit_; + + return; +} + +void sdio_read_rx_fifo(ADAPTER *Adapter, unsigned char *buf, int reallen) +{ + struct dvobj_priv *psdiodev; + unsigned int ftaddr; + unsigned char *mem = buf; + int free_mem = 0; + int status; + unsigned int cnt = (unsigned int)reallen; + static unsigned int sdio_rxfifo_cnt = 0; + unsigned int fifo = RX_RXFIFO_DOMAIN; + +_func_enter_; + + if (cnt > 512) + cnt = _RND(cnt, 512); + else + cnt = _RND(cnt, 4); + + mem = rtw_zmalloc(cnt); + if (mem) { + free_mem = 1; + //DBG_871X("sdio_read_rx_fifo tem_buf:%p ", mem); + } else { + //DBG_871X("sdio_read_rx_fifo tem_buf:Oops %p ", mem); + mem = buf; + } + + if (mem == NULL) { + DBG_871X("sdio_read_rx_fifo: Oops mem is NULL \n"); + return; + } + + if (((u32)mem) % 4) { + DBG_871X("sdio_read_rx_fifo: Oops mem %p not 4 byte Alignment this will cause DMA wrong \n", mem); + } + + psdiodev = adapter_to_dvobj(Adapter); + + ftaddr = _fifoqueue2ftaddr(fifo, sdio_rxfifo_cnt++); + + rtw_sdio_bus_ops.claim_host(psdiodev->intf_data.func); + status = rtw_sdio_bus_ops.memcpy_fromio(psdiodev->intf_data.func, mem, ftaddr, cnt); + rtw_sdio_bus_ops.release_host(psdiodev->intf_data.func); + + if (free_mem) { + if (buf) + rtw_memcpy(buf, mem, reallen); + rtw_mfree(mem, cnt); + } + + if (status) { + //error + DBG_871X("rtw_sdio_read_rx_fifo error 0x%x\n" + "***** Addr = %x *****\n" + "***** Length = %d *****\n", status, ftaddr, cnt); + } + + +_func_exit_; + + return; +} + + +void sdio_cmd52_read(ADAPTER *Adapter, u32 addr, u32 cnt, u8 *pdata, int *err) +{ + int i = 0; + + for (i = 0; i < cnt; i++) { + pdata[i] = sdio_read8(Adapter, addr + i, err); + if (err && *err) + break; + } +} + +void sdio_cmd52_write(ADAPTER *Adapter, u32 addr, u32 cnt, u8 *pdata, int *err) +{ + int i = 0; + + for (i = 0; i < cnt; i++) { + sdio_write8(Adapter, addr + i, pdata[i], err); + if (err && *err) + break; + } +} + +u8 _sdio_read8(struct dvobj_priv *pdvobj, u32 addr, s32 *err) +{ + u8 val; + ADAPTER *Adapter = pdvobj->if1; + +_func_enter_; + + val = sdio_read8(Adapter, addr, err); + +_func_exit_; + + return val; +} + +u16 _sdio_read16(struct dvobj_priv *pdvobj, u32 addr, s32 *err) +{ + u8 bMacPwrCtrlOn = _FALSE; + u16 val; + u8 cmd52_io = 0; + ADAPTER *Adapter = pdvobj->if1; + +_func_enter_; + /* we should use CMD 52 before bMacPwrCtrlOn */ + rtw_hal_get_hwreg(Adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); + cmd52_io = !bMacPwrCtrlOn; +#ifdef SDIO_CMD52_IO + cmd52_io = 1; +#endif + if (cmd52_io) { + sdio_cmd52_read(Adapter, addr, 2, (u8*)&val, err); + val = le16_to_cpu(val); + return val; + } + + val = sdio_read16(Adapter, addr, err); + +_func_exit_; + + return val; +} + +u32 _sdio_read32(struct dvobj_priv *pdvobj, u32 addr, s32 *err) +{ + u8 bMacPwrCtrlOn = _FALSE; + u32 val; + u8 cmd52_io = 0; + ADAPTER *Adapter = pdvobj->if1; + +_func_enter_; + + /* we should use CMD 52 before bMacPwrCtrlOn */ + rtw_hal_get_hwreg(Adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); + cmd52_io = !bMacPwrCtrlOn; +#ifdef SDIO_CMD52_IO + cmd52_io = 1; +#endif + if (cmd52_io) { + sdio_cmd52_read(Adapter, addr, 4, (u8*)&val, err); + val = le32_to_cpu(val); + return val; + } + + val = sdio_read32(Adapter, addr, err); + +_func_exit_; + + return val; +} + +s32 _sdio_write8(struct dvobj_priv *pdvobj, u32 addr, u8 val, s32 *err) +{ + ADAPTER *Adapter = pdvobj->if1; + +_func_enter_; + + sdio_write8(Adapter, addr, (u32)val, err); + +_func_exit_; + + return _SUCCESS; +} + +s32 _sdio_write16(struct dvobj_priv *pdvobj, u32 addr, u16 val, s32 *err) +{ + u8 bMacPwrCtrlOn = _FALSE; + u8 cmd52_io = 0; + ADAPTER *Adapter = pdvobj->if1; + +_func_enter_; + /* we should use CMD 52 before bMacPwrCtrlOn */ + rtw_hal_get_hwreg(Adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); + cmd52_io = !bMacPwrCtrlOn; +#ifdef SDIO_CMD52_IO + cmd52_io = 1; +#endif + if (cmd52_io) { + val = cpu_to_le16(val); + sdio_cmd52_write(Adapter, addr, 2, (u8*)&val, err); + return _SUCCESS; + } + + sdio_write16(Adapter, addr, (u32)val, err); + +_func_exit_; + + return _SUCCESS; +} + +s32 _sdio_write32(struct dvobj_priv *pdvobj, u32 addr, u32 val, s32 *err) +{ + u8 bMacPwrCtrlOn = _FALSE; + u8 cmd52_io = 0; + ADAPTER *Adapter = pdvobj->if1; + +_func_enter_; + /* we should use CMD 52 before bMacPwrCtrlOn */ + rtw_hal_get_hwreg(Adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); + cmd52_io = !bMacPwrCtrlOn; +#ifdef SDIO_CMD52_IO + cmd52_io = 1; +#endif + if (cmd52_io) { + val = cpu_to_le32(val); + sdio_cmd52_write(Adapter, addr, 4, (u8*)&val, err); + return _SUCCESS; + } + + sdio_write32(Adapter, addr, val, err); + +_func_exit_; + + return _SUCCESS; +} + +/* + * Description: + * Read from RX FIFO + * Round read size to block size, + * and make sure data transfer will be done in one command. + * + * Parameters: + * pintfhdl a pointer of intf_hdl + * addr port ID + * cnt size to read + * rmem address to put data + * + * Return: + * _SUCCESS(1) Success + * _FAIL(0) Fail + */ +static int _sdio_read_rx_fifo(struct dvobj_priv *pdvobj, u32 addr, u8 *mem, u32 cnt, struct fifo_more_data *pmore_data) +{ + ADAPTER *Adapter = pdvobj->if1; + + //struct spi_more_data more_data = {0}; + + //DBG_8192C("%s \n", __func__); + rtw_memset(pmore_data, 0, sizeof(struct fifo_more_data)); + + sdio_read_rx_fifo(Adapter, mem, cnt); + + return _SUCCESS; +} + +/* + * Description: + * Translate sdio fifo address to Domain ID in each WLAN FIFO + */ +static u32 hwaddr2txfifo(u32 addr) +{ + u32 fifo_domain_id; + switch (addr) + { + case WLAN_TX_HIQ_DEVICE_ID: + fifo_domain_id = TX_HIQ_DOMAIN; + break; + + case WLAN_TX_MIQ_DEVICE_ID: + fifo_domain_id = TX_MIQ_DOMAIN; + break; + + case WLAN_TX_LOQ_DEVICE_ID: + fifo_domain_id = TX_LOQ_DOMAIN; + break; + default: + fifo_domain_id = TX_LOQ_DOMAIN; + break; + } + + return fifo_domain_id; +} + + +static int _sdio_write_tx_fifo(struct dvobj_priv *pdvobj, u32 addr, u8 *mem, u32 cnt) +{ + u8 remain_len = 0; + u32 w_sz = cnt; + ADAPTER *Adapter = pdvobj->if1; + + remain_len = w_sz%4; + if (remain_len != 0) + w_sz += 4 -remain_len; + +#if 0//ndef LZM_TEST + if (1) { + int i = 0; + for(i = 0; i < w_sz; i += 4) { + DBG_871X("_sdio_write_port[%d]: 0x%08x ", i, *(u32*)(mem + i)); + } + } +#endif + +#if 0 + { + static u32 write_test = 0; + u32 now_time = 0; + write_test++; + if(write_test==1000) { + now_time = xTaskGetTickCount() * portTICK_RATE_MS; + DBG_8192C("%s fifo:%d cnt:%d w_sz:%d mem:%p, now time:%d\n", __func__, addr, cnt, w_sz, mem, now_time); + write_test = 0; + } + } +#endif + sdio_write_tx_fifo(Adapter, mem, w_sz, hwaddr2txfifo(addr)); + + return _SUCCESS; +} + +static int sdio_io_priv(struct dvobj_priv *pdvobj) +{ + ADAPTER *Adapter = pdvobj->if1; + //struct dvobj_priv *pdvobj = &Adapter->dvobjpriv; + + return _SUCCESS; +} + +void sdio_set_intf_ops(struct _io_ops *pops) +{ + pops->init_io_priv = &sdio_io_priv; + pops->write8_endian = NULL; + + pops->_read8 = &_sdio_read8; + pops->_read16 = &_sdio_read16; + pops->_read32 = &_sdio_read32; + + pops->_write8 = &_sdio_write8; + pops->_write16 = &_sdio_write16; + pops->_write32 = &_sdio_write32; + + pops->read_rx_fifo = &_sdio_read_rx_fifo; + pops->write_tx_fifo = &_sdio_write_tx_fifo; +} + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_intf.c b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_intf.c new file mode 100644 index 0000000..3a83d9b --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_intf.c @@ -0,0 +1,264 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _GSPI_INTF_C_ + +#include + +#ifdef CONFIG_SDIO_HCI +#include "wifi_io.h" //from sdio_driver + +#ifndef CONFIG_SDIO_HCI +#error "CONFIG_SDIO_HCI should be on!\n" +#endif + +struct dvobj_priv *gspi_dvobj_init(void) +{ +// int status = _FAIL; + struct dvobj_priv *dvobj = NULL; + PGSPI_DATA pgspi_data; + +_func_enter_; + + dvobj = (struct dvobj_priv*)rtw_zmalloc(sizeof(*dvobj)); + if (NULL == dvobj) { + goto exit; + } + + pgspi_data = &dvobj->intf_data; + + rtw_mutex_init(&pgspi_data->spi_mutex); + //pgspi_data->block_transfer_len = 512; //512 blocks r/w is not required for GSPI interface + //pgspi_data->tx_block_mode = 0; + //pgspi_data->rx_block_mode = 0; + +// status = _SUCCESS; + + if(wifi_sdio_func) { + DBG_871X("[gspi_dvobj_init] get wifi_func:%p\n", wifi_sdio_func); + dvobj->intf_data.func = wifi_sdio_func; + } else { + DBG_871X("[gspi_dvobj_init] Oops: get wifi sdio function fail"); + } + +exit: +_func_exit_; + + return dvobj; +} + +void gspi_dvobj_deinit(struct dvobj_priv *dvobj) +{ +//TODO +// struct dvobj_priv *dvobj = spi_get_drvdata(spi); + +_func_enter_; +//TODO +// spi_set_drvdata(spi, NULL); + if (dvobj) { +//TODO +// gspi_deinit(dvobj); + rtw_mutex_free(&dvobj->intf_data.spi_mutex); + rtw_mfree((u8*)dvobj, sizeof(*dvobj)); + } + +_func_exit_; +} + +void sdio_dvobj_interrupt_entry(struct sdio_func *func) +{ + //DBG_871X("[sdio_wifi_interrupt_entry] func :%p\n", func); + + //sdio irq have claim host, we should release it + //and claim it after SDIO IO, or SDIO IO will deadlock + rtw_sdio_bus_ops.release_host(func); + rtw_hci_interrupt_handler(func->drv_priv); + rtw_sdio_bus_ops.claim_host(func); +} + +void sdio_dvobj_request_irq(struct dvobj_priv *dvobj) +{ +_func_enter_; + if(dvobj->intf_data.func) { + dvobj->intf_data.func->drv_priv = (void*)dvobj->if1; + + rtw_sdio_bus_ops.claim_host(dvobj->intf_data.func); + rtw_sdio_bus_ops.claim_irq(dvobj->intf_data.func, sdio_dvobj_interrupt_entry); + rtw_sdio_bus_ops.release_host(dvobj->intf_data.func); + } + +_func_exit_; +} + +void sdio_dvobj_free_irq(struct dvobj_priv *dvobj) +{ +_func_enter_; + if(dvobj->intf_data.func) { + dvobj->intf_data.func->drv_priv = (void*)dvobj->if1; + + rtw_sdio_bus_ops.claim_host(dvobj->intf_data.func); + rtw_sdio_bus_ops.release_irq(dvobj->intf_data.func); + rtw_sdio_bus_ops.release_host(dvobj->intf_data.func); + } + +_func_exit_; +} + + +static inline u32 ffaddr2deviceId(struct dvobj_priv *pdvobj, u32 addr) +{ + return pdvobj->Queue2Pipe[addr]; +} + +static s32 rtw_xmit_xmitbuf(_adapter * padapter, struct xmit_buf *pxmitbuf) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); + u32 deviceId; + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("@@@rtw_xmit_xmitbuf(): pxmitbuf->len=%d\n", pxmitbuf->len)); + //translate queue index to Device Id + deviceId = ffaddr2deviceId(pdvobjpriv, pxmitbuf->ff_hwaddr); + + rtw_write_port(padapter, deviceId, pxmitbuf->len, (u8*)pxmitbuf->pbuf); + + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + return _SUCCESS; +} + +s32 sdio_dvobj_xmit_mgnt(_adapter * padapter, struct xmit_frame *pmgntframe) +{ + s32 ret = _SUCCESS; + struct pkt_attrib *pattrib; + struct xmit_buf *pxmitbuf; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); + u8 *pframe = NULL; + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("+rtw_xmit_mgnt()\n")); + + pattrib = &pmgntframe->attrib; + pxmitbuf = pmgntframe->pxmitbuf; + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + //rtw_hal_update_txdesc(padapter, pmgntframe, pmgntframe->buf_addr); + + pxmitbuf->len = TXDESC_SIZE + pattrib->last_txcmdsz; + //pxmitbuf->pg_num = (pxmitbuf->len + 127)/128; // 128 is tx page size + //pxmitbuf->ptail = pmgntframe->buf_addr + pxmitbuf->len; + pxmitbuf->ff_hwaddr = rtw_get_ff_hwaddr(pmgntframe); + + rtw_count_tx_stats(padapter, pmgntframe, pattrib->last_txcmdsz); + + //RT_TRACE(_module_rtl871x_xmit_c_, _drv_always_, ("+rtw_xmit_mgnt(): type=%d\n", GetFrameSubType(pframe))); + if(GetFrameSubType(pframe)==WIFI_BEACON) //dump beacon directly + { +//When using dedicated xmit frame for issue bcn on ap mode +//free xmit frame for bcn reserved page on station mode - Alex Fang +#if USE_DEDICATED_BCN_TX + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) { + rtw_free_xmitframe(pxmitpriv, pmgntframe); + pxmitbuf->priv_data = NULL; + } + rtw_write_port(padapter, ffaddr2deviceId(pdvobjpriv, pxmitbuf->ff_hwaddr), pxmitbuf->len, pxmitbuf->pbuf); + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); +#else + rtw_free_xmitframe(pxmitpriv, pmgntframe); + pxmitbuf->priv_data = NULL; + rtw_xmit_xmitbuf(padapter, pxmitbuf); +#endif + } + else + { + rtw_free_xmitframe(pxmitpriv, pmgntframe); + pxmitbuf->priv_data = NULL; + rtw_xmit_xmitbuf(padapter, pxmitbuf); + } + + if (ret != _SUCCESS) + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN); + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("-rtw_xmit_mgnt\n")); + return ret; +} + +s32 sdio_dvobj_xmit_data(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + _irqL irql; + s32 err; + +#ifdef CONFIG_80211N_HT + if ((pxmitframe->frame_tag == DATA_FRAMETAG) && + (pxmitframe->attrib.ether_type != 0x0806) && + (pxmitframe->attrib.ether_type != 0x888e) && + (pxmitframe->attrib.dhcp_pkt != 1)) + { + if (padapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE) + rtw_issue_addbareq_cmd(padapter, pxmitframe); + } +#endif + +#if USE_SKB_AS_XMITBUF + rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); +#endif + + rtw_enter_critical_bh(&pxmitpriv->lock, &irql); +#if 1 //FIX_XMITFRAME_FAULT, move from rtw_xmit(). +#ifdef CONFIG_AP_MODE + if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE) + { + rtw_exit_critical_bh(&pxmitpriv->lock, &irql); + return 1; + } +#endif +#endif + err = rtw_xmitframe_enqueue(padapter, pxmitframe); + rtw_exit_critical_bh(&pxmitpriv->lock, &irql); + + if (err != _SUCCESS) { + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmit_data(): enqueue xmitframe fail\n")); + rtw_free_xmitframe(pxmitpriv, pxmitframe); + + // Trick, make the statistics correct + pxmitpriv->tx_pkts--; + pxmitpriv->tx_drop++; + return _TRUE; + } +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->adapter_type > PRIMARY_ADAPTER){ + padapter = padapter->pbuddy_adapter; + } +#endif + + rtw_wakeup_task(&padapter->xmitThread); + + return _FALSE; +} + +const struct host_ctrl_intf_ops hci_ops = { + gspi_dvobj_init, + gspi_dvobj_deinit, + sdio_dvobj_request_irq, + sdio_dvobj_free_irq +}; +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_isr.c b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_isr.c new file mode 100644 index 0000000..870008f --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_isr.c @@ -0,0 +1,223 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#define _GSPI_ISR_C_ + +#include + +#ifdef CONFIG_SDIO_HCI +extern struct recv_buf* rtw_recv_rxfifo(_adapter * padapter, u32 size, struct fifo_more_data* more_data); + +void spi_int_dpc(PADAPTER padapter, u32 sdio_hisr) +{ + struct dvobj_priv *pdvobj = padapter->dvobj; + +#ifdef CONFIG_LPS_LCLK + if (sdio_hisr & HCI_HISR_CPWM1) + { + struct reportpwrstate_parm report; + + report.state = rtw_read8(padapter, LOCAL_REG_HCPWM1); + cpwm_int_hdl(padapter, &report); + } +#endif + + if (sdio_hisr & HCI_HISR_TXERR) + { + u32 status; + + status = rtw_read32(padapter, REG_TXDMA_STATUS); + rtw_write32(padapter, REG_TXDMA_STATUS, status); + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s: SDIO_HISR_TXERR (0x%08x)\n", __func__, status)); + } + +#ifdef CONFIG_INTERRUPT_BASED_TXBCN + + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + if (sdio_hisr & HCI_HISR_BCNERLY_INT) + #endif + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + if (sdio_hisr & (HCI_HISR_TXBCNOK|HCI_HISR_TXBCNERR)) + #endif + { + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + #if 0 //for debug + if (sdio_hisr & SDIO_HISR_BCNERLY_INT) + DBG_8192C("%s: SDIO_HISR_BCNERLY_INT\n", __func__); + + if (sdio_hisr & SDIO_HISR_TXBCNOK) + DBG_8192C("%s: SDIO_HISR_TXBCNOK\n", __func__); + + if (sdio_hisr & SDIO_HISR_TXBCNERR) { + u1Byte v422, v550, v419; + v422 = rtw_read8(padapter, 0x422); + v419 = rtw_read8(padapter, 0x419); + v550 = rtw_read8(padapter, 0x550); + + DBG_8192C("%s: SDIO_HISR_TXBCNERR 422=%02x, 419=%02x, 550=%02x\n", __func__, v422, v419, v550); + } + #endif + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) + { + //send_beacon(padapter); + if(pmlmepriv->update_bcn == _TRUE) + { + //tx_beacon_hdl(padapter, NULL); + set_tx_beacon_cmd(padapter); + } + } + +#ifdef CONFIG_CONCURRENT_MODE + if(check_buddy_fwstate(padapter, WIFI_AP_STATE)) + { + //send_beacon(padapter); + if(padapter->pbuddy_adapter->mlmepriv.update_bcn == _TRUE) + { + //tx_beacon_hdl(padapter, NULL); + set_tx_beacon_cmd(padapter->pbuddy_adapter); + } + } +#endif + } +#endif //CONFIG_INTERRUPT_BASED_TXBCN + + if (sdio_hisr & HCI_HISR_C2HCMD) + { + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s: C2H Command\n", __func__)); +//TODO +// rtw_c2h_wk_cmd(padapter); + } + + if (sdio_hisr & HCI_HISR_RX_REQUEST)// || sdio_hisr & SPI_HISR_RXFOVW) + { + struct recv_buf *precvbuf; + struct fifo_more_data more_data = {0}; + + //RT_TRACE(_module_hci_ops_c_,_drv_info_, ("%s: RX Request, size=%d\n", __func__, pdvobj->SdioRxFIFOSize)); + + sdio_hisr ^= HCI_HISR_RX_REQUEST; + + do { + more_data.more_data = 0; + more_data.len = 0; + + if (pdvobj->SdioRxFIFOSize == 0) + { + u16 val = 0; + //s32 ret; //LZM_TODO + + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s, %d, read RXFIFOsize again size=%d\n", __FUNCTION__, __LINE__, pdvobj->SdioRxFIFOSize)); + + val = rtw_read16(padapter, LOCAL_REG_RX0_REQ_LEN_1_BYTE); + //if (!ret) { + pdvobj->SdioRxFIFOSize = val; + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s: RX_REQUEST, read RXFIFOsize again size=%d\n", __func__, pdvobj->SdioRxFIFOSize)); + //} else { + // RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s: RX_REQUEST, read RXFIFOsize ERROR!!\n", __func__)); + //} + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s, %d, read RXFIFOsize again size=%d\n", __FUNCTION__, __LINE__, pdvobj->SdioRxFIFOSize)); + } + + if (pdvobj->SdioRxFIFOSize != 0) + { +#ifdef RTL8723A_SDIO_LOOPBACK + sd_recv_loopback(padapter, pdvobj->SdioRxFIFOSize); +#else + if (sdio_hisr & HCI_HISR_RXFOVW) + RT_TRACE(_module_hci_ops_c_, _drv_info_, ("%s RXFOVW RX\n", __func__)); + + precvbuf = rtw_recv_rxfifo(padapter, pdvobj->SdioRxFIFOSize, &more_data); + if (precvbuf) + rtw_rxhandler(padapter, precvbuf); + + if (more_data.more_data) { + pdvobj->SdioRxFIFOSize = more_data.len; + } else { + pdvobj->SdioRxFIFOSize = 0; + } +#endif + //If Rx_request ISR is set, execute receive tasklet (sdio_hisr & SPI_HISR_RX_REQUEST) +#if defined(CONFIG_ISR_THREAD_MODE_INTERRUPT) && defined(CONFIG_RECV_TASKLET_THREAD) + rtw_wakeup_task(&padapter->recvtasklet_thread); +#endif + } + +#ifdef CONFIG_INTERRUPT_BASED_TXBCN +{ + //Prevent BCN update not realtime in ap mode - Alex Fang + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + if((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) && (pmlmepriv->update_bcn == _TRUE)) + break; +} +#endif + } while (more_data.more_data || pdvobj->SdioRxFIFOSize); +#ifdef PLATFORM_LINUX +#ifdef CONFIG_GSPI_HCI + tasklet_schedule(&padapter->recvpriv.recv_tasklet); +#endif +#endif + } +} + + +void spi_int_hdl(PADAPTER padapter) +{ + struct dvobj_priv *pdvobj = padapter->dvobj; + u32 sdio_hisr = 0; + //s32 ret; + + if ((padapter->bDriverStopped == _TRUE) || + (padapter->bSurpriseRemoved == _TRUE)) + return; + + sdio_hisr = rtw_read32(padapter, LOCAL_REG_HISR);//, &ret); + //if (!ret) { + // RT_TRACE(_module_hci_ops_c_, _drv_err_, ("%s: read SDIO_REG_HISR FAIL!!\n", __func__)); + // return; + //} + pdvobj->SdioRxFIFOSize = rtw_read16(padapter, LOCAL_REG_RX0_REQ_LEN_1_BYTE);//, &ret); + + //if (!ret) { + // RT_TRACE(_module_hci_ops_c_, _drv_err_, ("%s: read SPI_REG_RX0_REQ_LEN FAIL!!\n", __func__)); + // return; + //} + + if (sdio_hisr & pdvobj->sdio_himr) + { + u32 v32; + + sdio_hisr &= pdvobj->sdio_himr; + + // clear HISR + v32 = sdio_hisr & MASK_SPI_HISR_CLEAR; + if (v32) { + rtw_write32(padapter, LOCAL_REG_HISR, v32);//, &ret); + } + + spi_int_dpc(padapter, sdio_hisr); + } else { + //RT_TRACE(_module_hci_ops_c_, _drv_err_, + // ("%s: HISR(0x%08x) and HIMR(0x%08x) not match!\n", + // __FUNCTION__, sdio_hisr, pdvobj->sdio_himr)); + } +} + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_spec.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_spec.h new file mode 100644 index 0000000..5b3b8d5 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/hci/sdio/sdio_spec.h @@ -0,0 +1,193 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ + +#ifndef __GSDIO_SPEC_H__ +#define __GSDIO_SPEC_H__ + + +#define SPI_LOCAL_DOMAIN 0x0 +#define WLAN_IOREG_DOMAIN 0x8 +#define FW_FIFO_DOMAIN 0x4 +#define TX_HIQ_DOMAIN 0xc +#define TX_MIQ_DOMAIN 0xd +#define TX_LOQ_DOMAIN 0xe +#define RX_RXFIFO_DOMAIN 0x1f + +//IO Bus domain address mapping +#define DEFUALT_OFFSET 0x0 +#define SPI_LOCAL_OFFSET 0x10250000 +#define WLAN_IOREG_OFFSET 0x10260000 +#define FW_FIFO_OFFSET 0x10270000 +#define TX_HIQ_OFFSET 0x10310000 +#define TX_MIQ_OFFSET 0x1032000 +#define TX_LOQ_OFFSET 0x10330000 +#define RX_RXOFF_OFFSET 0x10340000 + +#define WLAN_TX_HIQ_DEVICE_ID 4 // 0b[16], 100b[15:13] +#define WLAN_TX_MIQ_DEVICE_ID 5 // 0b[16], 101b[15:13] +#define WLAN_TX_LOQ_DEVICE_ID 6 // 0b[16], 110b[15:13] +#define WLAN_TX_EXQ_DEVICE_ID 3 // 0b[16], 011b[15:13] +#define WLAN_RX0FF_DEVICE_ID 7 // 0b[16], 111b[15:13] +#define WLAN_IOREG_DEVICE_ID 8 // 1b[16] + +//SPI Tx Free Page Index +#define HI_QUEUE_IDX 0 +#define MID_QUEUE_IDX 1 +#define LOW_QUEUE_IDX 2 +#define PUBLIC_QUEUE_IDX 3 + +#define MAX_TX_QUEUE 3 // HIQ, MIQ and LOQ +#define MAX_RX_QUEUE 1 + +//SPI Local registers +#define SPI_REG_TX_CTRL (SPI_LOCAL_OFFSET | 0x0000) // SPI Tx Control +#define SPI_REG_STATUS_RECOVERY (SPI_LOCAL_OFFSET | 0x0004) +#define SPI_REG_INT_TIMEOUT (SPI_LOCAL_OFFSET | 0x0006) +#define SPI_REG_HIMR (SPI_LOCAL_OFFSET | 0x0014) // SPI Host Interrupt Mask +#define SPI_REG_HISR (SPI_LOCAL_OFFSET | 0x0018) // SPI Host Interrupt Service Routine +#define SPI_REG_RX0_REQ_LEN (SPI_LOCAL_OFFSET | 0x001C) // RXDMA Request Length +#define SPI_REG_FREE_TXPG (SPI_LOCAL_OFFSET | 0x0020) // Free Tx Buffer Page +#define SPI_REG_HCPWM1 (SPI_LOCAL_OFFSET | 0x0024) // HCI Current Power Mode 1 +#define SPI_REG_HCPWM2 (SPI_LOCAL_OFFSET | 0x0026) // HCI Current Power Mode 2 +#define SPI_REG_HTSFR_INFO (SPI_LOCAL_OFFSET | 0x0030) // HTSF Informaion +#define SPI_REG_HRPWM1 (SPI_LOCAL_OFFSET | 0x0080) // HCI Request Power Mode 1 +#define SPI_REG_HRPWM2 (SPI_LOCAL_OFFSET | 0x0082) // HCI Request Power Mode 2 +#define SPI_REG_HPS_CLKR (SPI_LOCAL_OFFSET | 0x0084) // HCI Power Save Clock +#define SPI_REG_HSUS_CTRL (SPI_LOCAL_OFFSET | 0x0086) // SPI HCI Suspend Control +#define SPI_REG_HIMR_ON (SPI_LOCAL_OFFSET | 0x0090) //SPI Host Extension Interrupt Mask Always +#define SPI_REG_HISR_ON (SPI_LOCAL_OFFSET | 0x0091) //SPI Host Extension Interrupt Status Always +#define SPI_REG_CFG (SPI_LOCAL_OFFSET | 0x00F0) //SPI Configuration Register + +#define LOCAL_REG_TX_CTRL (SPI_REG_TX_CTRL |SPI_LOCAL_OFFSET) +#define LOCAL_REG_STATUS_RECOVERY (SPI_REG_STATUS_RECOVERY |SPI_LOCAL_OFFSET) +#define LOCAL_REG_INT_TIMEOUT (SPI_REG_INT_TIMEOUT |SPI_LOCAL_OFFSET) +#define LOCAL_REG_HIMR (SPI_REG_HIMR |SPI_LOCAL_OFFSET) +#define LOCAL_REG_HISR (SPI_REG_HISR |SPI_LOCAL_OFFSET) +#define LOCAL_REG_RX0_REQ_LEN_1_BYTE (SPI_REG_RX0_REQ_LEN |SPI_LOCAL_OFFSET) +#define LOCAL_REG_FREE_TXPG (SPI_REG_FREE_TXPG |SPI_LOCAL_OFFSET) +#define LOCAL_REG_HRPWM1 (SPI_REG_HRPWM1 |SPI_LOCAL_OFFSET) +#define LOCAL_REG_HCPWM1 (SPI_REG_HCPWM1 |SPI_LOCAL_OFFSET) + +#define HCI_HIMR_DISABLED 0 + +//SPI HIMR MASK diff with SDIO +#define HCI_HISR_RX_REQUEST BIT(0) +#define HCI_HISR_AVAL BIT(1) +#define HCI_HISR_TXERR BIT(2) +#define HCI_HISR_RXERR BIT(3) +#define HCI_HISR_TXFOVW BIT(4) +#define HCI_HISR_RXFOVW BIT(5) +#define HCI_HISR_TXBCNOK BIT(6) +#define HCI_HISR_TXBCNERR BIT(7) +#define HCI_HISR_BCNERLY_INT BIT(16) +#define HCI_HISR_C2HCMD BIT(17) +#define HCI_HISR_CPWM1 BIT(18) +#define HCI_HISR_CPWM2 BIT(19) +#define HCI_HISR_HSISR_IND BIT(20) +#define HCI_HISR_GTINT3_IND BIT(21) +#define HCI_HISR_GTINT4_IND BIT(22) +#define HCI_HISR_PSTIMEOUT BIT(23) +#define HCI_HISR_OCPINT BIT(24) +#define HCI_HISR_ATIMEND BIT(25) +#define HCI_HISR_ATIMEND_E BIT(26) +#define HCI_HISR_CTWEND BIT(27) + +//SPI HIMR MASK diff with SDIO +#define HCI_HIMR_RX_REQUEST BIT(0) +#define HCI_HIMR_AVAL BIT(1) +#define HCI_HIMR_TXERR BIT(2) +#define HCI_HIMR_RXERR BIT(3) +#define HCI_HIMR_TXFOVW BIT(4) +#define HCI_HIMR_RXFOVW BIT(5) +#define HCI_HIMR_TXBCNOK BIT(6) +#define HCI_HIMR_TXBCNERR BIT(7) +#define HCI_HIMR_BCNERLY_INT BIT(16) +#define HCI_HIMR_ATIMEND BIT(17) +#define HCI_HIMR_ATIMEND_E BIT(18) +#define HCI_HIMR_CTWEND BIT(19) +#define HCI_HIMR_C2HCMD BIT(20) +#define HCI_HIMR_CPWM1 BIT(21) +#define HCI_HIMR_CPWM2 BIT(22) +#define HCI_HIMR_HSISR_IND BIT(23) +#define HCI_HIMR_GTINT3_IND BIT(24) +#define HCI_HIMR_GTINT4_IND BIT(25) +#define HCI_HIMR_PSTIMEOUT BIT(26) +#define HCI_HIMR_OCPINT BIT(27) +#define HCI_HIMR_TSF_BIT32_TOGGLE BIT(29) + +#define MASK_SPI_HISR_CLEAR (HCI_HIMR_TXERR |\ + HCI_HIMR_RXERR |\ + HCI_HIMR_TXFOVW |\ + HCI_HIMR_RXFOVW |\ + HCI_HIMR_TXBCNOK |\ + HCI_HIMR_TXBCNERR |\ + HCI_HIMR_C2HCMD |\ + HCI_HIMR_CPWM1 |\ + HCI_HIMR_CPWM2 |\ + HCI_HIMR_HSISR_IND |\ + HCI_HIMR_GTINT3_IND |\ + HCI_HIMR_GTINT4_IND |\ + HCI_HIMR_PSTIMEOUT |\ + HCI_HIMR_OCPINT) + +#define REG_LEN_FORMAT(pcmd, x) SET_BITS_TO_LE_4BYTE(pcmd, 0, 8, x)//(x<<(unsigned int)24) +#define REG_ADDR_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 8, 16, x)//(x<<(unsigned int)16) +#define REG_DOMAIN_ID_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 24, 5, x)//(x<<(unsigned int)0) +#define REG_FUN_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 29, 2, x)//(x<<(unsigned int)5) +#define REG_RW_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 31, 1, x)//(x<<(unsigned int)7) + +#define FIFO_LEN_FORMAT(pcmd, x) SET_BITS_TO_LE_4BYTE(pcmd, 0, 16, x)//(x<<(unsigned int)24) +//#define FIFO_ADDR_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 8, 16, x)//(x<<(unsigned int)16) +#define FIFO_DOMAIN_ID_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 24, 5, x)//(x<<(unsigned int)0) +#define FIFO_FUN_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 29, 2, x)//(x<<(unsigned int)5) +#define FIFO_RW_FORMAT(pcmd,x) SET_BITS_TO_LE_4BYTE(pcmd, 31, 1, x)//(x<<(unsigned int)7) + + +//get status dword0 +#define GET_STATUS_PUB_PAGE_NUM(status) LE_BITS_TO_4BYTE(status, 24, 8) +#define GET_STATUS_HI_PAGE_NUM(status) LE_BITS_TO_4BYTE(status, 18, 6) +#define GET_STATUS_MID_PAGE_NUM(status) LE_BITS_TO_4BYTE(status, 12, 6) +#define GET_STATUS_LOW_PAGE_NUM(status) LE_BITS_TO_4BYTE(status, 6, 6) +#define GET_STATUS_HISR_HI6BIT(status) LE_BITS_TO_4BYTE(status, 0, 6) + +//get status dword1 +#define GET_STATUS_HISR_MID8BIT(status) LE_BITS_TO_4BYTE(status + 4, 24, 8) +#define GET_STATUS_HISR_LOW8BIT(status) LE_BITS_TO_4BYTE(status + 4, 16, 8) +#define GET_STATUS_ERROR(status) LE_BITS_TO_4BYTE(status + 4, 17, 1) +#define GET_STATUS_INT(status) LE_BITS_TO_4BYTE(status + 4, 16, 1) +#define GET_STATUS_RX_LENGTH(status) LE_BITS_TO_4BYTE(status + 4, 0, 16) + + +#define RXDESC_SIZE 24 + +#define TX_FREE_PG_QUEUE 4 // The number of Tx FIFO free page +#define TX_FIFO_PAGE_SZ 128 + +struct spi_more_data { + unsigned long more_data; + unsigned long len; +}; + +extern BUS_DRV_OPS_T bus_driver_ops; + +extern u8 spi_query_status_info(struct dvobj_priv *pdvobj); + +extern void sdio_set_intf_ops(struct _io_ops *pops); + +#endif //__GSPI_SPEC_H__ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_intfs.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_intfs.h new file mode 100644 index 0000000..46b3453 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_intfs.h @@ -0,0 +1,161 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __FREERTOS_INTFS_H_ +#define __FREERTOS_INTFS_H_ + +//TODO +#if 0 + +struct intf_priv { + + u8 *intf_dev; + u32 max_iosz; //USB2.0: 128, USB1.1: 64, SDIO:64 + u32 max_xmitsz; //USB2.0: unlimited, SDIO:512 + u32 max_recvsz; //USB2.0: unlimited, SDIO:512 + + volatile u8 *io_rwmem; + volatile u8 *allocated_io_rwmem; + u32 io_wsz; //unit: 4bytes + u32 io_rsz;//unit: 4bytes + u8 intf_status; + + void (*_bus_io)(u8 *priv); + +/* +Under Sync. IRP (SDIO/USB) +A protection mechanism is necessary for the io_rwmem(read/write protocol) + +Under Async. IRP (SDIO/USB) +The protection mechanism is through the pending queue. +*/ + + _mutex ioctl_mutex; + + +#ifdef PLATFORM_LINUX + #ifdef CONFIG_USB_HCI + // when in USB, IO is through interrupt in/out endpoints + struct usb_device *udev; + PURB piorw_urb; + u8 io_irp_cnt; + u8 bio_irp_pending; + _sema io_retevt; + _timer io_timer; + u8 bio_irp_timeout; + u8 bio_timer_cancel; + #endif +#endif + +#ifdef PLATFORM_OS_XP + #ifdef CONFIG_SDIO_HCI + // below is for io_rwmem... + PMDL pmdl; + PSDBUS_REQUEST_PACKET sdrp; + PSDBUS_REQUEST_PACKET recv_sdrp; + PSDBUS_REQUEST_PACKET xmit_sdrp; + + PIRP piorw_irp; + + #endif + #ifdef CONFIG_USB_HCI + PURB piorw_urb; + PIRP piorw_irp; + u8 io_irp_cnt; + u8 bio_irp_pending; + _sema io_retevt; + #endif +#endif + +}; + + +#ifdef CONFIG_R871X_TEST +int rtw_start_pseudo_adhoc(_adapter *padapter); +int rtw_stop_pseudo_adhoc(_adapter *padapter); +#endif + +#endif //#if 0 + +typedef struct _driver_priv { + int drv_registered; + + _mutex hw_init_mutex; +#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_DUALMAC_CONCURRENT) + //global variable + _mutex h2c_fwcmd_mutex; + _mutex setch_mutex; + _mutex setbw_mutex; +#endif +} drv_priv, *pdrv_priv; + + +struct net_device *rtw_init_netdev(_adapter *padapter); +void rtw_os_indicate_disconnect( _adapter *adapter ); + +#ifdef CONFIG_PROC_DEBUG +void rtw_proc_init_one(struct net_device *dev); +void rtw_proc_remove_one(struct net_device *dev); +#else +//static void should be declared in .c file +//proc is not supported in freertos +//static void rtw_proc_init_one(struct net_device *dev){} +//static void rtw_proc_remove_one(struct net_device *dev){} +#define rtw_proc_init_one(dev) +#define rtw_proc_remove_one(dev) +#endif + +extern int rtw_set_wpa_ie(_adapter *padapter, char *pie, unsigned short ielen); +extern void rtw_os_indicate_connect(_adapter *adapter); +extern void indicate_wx_custom_event(_adapter *padapter, char *msg); +extern int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname); +extern void netdev_lwip_post_sleep_processing(void); +extern void wireless_send_event(struct net_device *dev, unsigned int cmd, union iwreq_data *wrqu, char *extra); + +#ifdef CONFIG_CONCURRENT_MODE +struct _io_ops; +_adapter *rtw_drv_if2_init(_adapter *primary_padapter, char *name, void (*set_intf_ops)(struct _io_ops *pops)); +void rtw_drv_if2_free(_adapter *pbuddy_padapter); +#endif + +#if defined(CONFIG_ISR_THREAD_MODE_POLLING) || defined(CONFIG_ISR_THREAD_MODE_INTERRUPT) +extern thread_return rtw_interrupt_thread(thread_context context); +#endif + +#ifdef CONFIG_RECV_TASKLET_THREAD +extern thread_return rtw_recv_tasklet(thread_context context); +#endif + +#ifdef CONFIG_XMIT_TASKLET_THREAD +extern thread_return rtw_xmit_tasklet(thread_context context); +#endif + +extern struct net_device *rtw_drv_probe(struct net_device* parent_dev, u32 mode); //Wlan driver init entry +extern void rtw_drv_entry(void); +extern void rtw_drv_halt(void); +extern int rtw_dev_remove(struct net_device *pnetdev); +extern int rtw_ioctl(struct net_device *dev, struct iwreq *rq, int cmd); + +#if defined(CONFIG_LX_HCI) +u32 lextra_bus_dma_Interrupt (void* data); +#endif + +#endif //__FREERTOS_INTFS_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_recv.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_recv.h new file mode 100644 index 0000000..3cd391c --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_recv.h @@ -0,0 +1,55 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __FREERTOS_RECV_H_ +#define __FREERTOS_RECV_H_ + +extern sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter); +extern void _rtw_free_recv_priv (struct recv_priv *precvpriv); + + +extern s32 rtw_recv_entry(union recv_frame *precv_frame); +extern int rtw_recv_indicatepkt(_adapter *adapter, union recv_frame *precv_frame); +extern void rtw_recv_returnpacket(IN _nic_hdl cnxt, IN _pkt *preturnedpkt); + +extern void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame); +#if BAD_MIC_COUNTERMEASURE +extern void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup); +#endif + +int rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter); +void rtw_free_recv_priv (struct recv_priv *precvpriv); + + +int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter); +int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe); +void rtw_os_recv_resource_free(struct recv_priv *precvpriv); + + +int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf); +int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf); + +void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf); + +void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl); + +void rltk_netif_rx(struct sk_buff *skb); + +#endif //__FREERTOS_RECV_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_skbuff.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_skbuff.h new file mode 100644 index 0000000..1daf180 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_skbuff.h @@ -0,0 +1,72 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _FREERTOS_SKBUFF_H_ +#define _FREERTOS_SKBUFF_H_ + +#if (RTL8195A_SUPPORT == 1) +// For Lextra(PCI-E like interface), RX buffer along with its skb is required to be +// pre-allocation and set into rx buffer descriptor ring during initialization. + #if (SKB_PRE_ALLOCATE_RX==1) + #define MAX_SKB_BUF_NUM (8 + 4) //tx+rx (8 + RX_Q_DESC_NUM) Reduce rx skb number due to memory limitation + #define MAX_LOCAL_SKB_NUM (10 + 18) //tx+rx + #else + #if WIFI_LOGO_CERTIFICATION + #define MAX_SKB_BUF_NUM 10 //tx+rx, ping 10k test + #elif defined(CONFIG_INIC_EN)&&(CONFIG_INIC_EN==1) //For iNIC throughput request + #define MAX_SKB_BUF_NUM 59 + #else + #define MAX_SKB_BUF_NUM 8 //tx+rx + #endif + #define MAX_LOCAL_SKB_NUM (MAX_SKB_BUF_NUM + 2) //tx+rx, +2: AP mode broadcast + #endif +#elif (RTL8711B_SUPPORT == 1) + #if (SKB_PRE_ALLOCATE_RX==1) + #define MAX_SKB_BUF_NUM (8 + 4) //tx+rx (8 + RX_Q_DESC_NUM) Reduce rx skb number due to memory limitation + #define MAX_LOCAL_SKB_NUM (10 + 18) //tx+rx + #else + #if WIFI_LOGO_CERTIFICATION + #define MAX_SKB_BUF_NUM 10 //tx+rx, ping 10k test + #elif defined(CONFIG_INIC_EN)&&(CONFIG_INIC_EN==1) //For iNIC throughput request + #define MAX_SKB_BUF_NUM 59 + #else + #define MAX_SKB_BUF_NUM 8 //tx+rx + #endif + #define MAX_LOCAL_SKB_NUM (MAX_SKB_BUF_NUM + 2) //tx+rx, +2: AP mode broadcast + #endif +#else +#ifndef CONFIG_DONT_CARE_TP +#ifndef CONFIG_HIGH_TP +#define MAX_LOCAL_SKB_NUM 10 +#define MAX_SKB_BUF_NUM 7 +#else +#define MAX_LOCAL_SKB_NUM 100 +#define MAX_SKB_BUF_NUM 100 +#endif +#else +#define MAX_LOCAL_SKB_NUM 10 +#define MAX_TX_SKB_BUF_NUM 6 +#define MAX_RX_SKB_BUF_NUM 1 +#endif +#endif + +extern int max_local_skb_num; +extern int max_skb_buf_num; + +#endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_xmit.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_xmit.h new file mode 100644 index 0000000..279c012 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/freertos_xmit.h @@ -0,0 +1,62 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __FREERTOS_XMIT_H_ +#define __FREERTOS_XMIT_H_ + +struct pkt_file { + _pkt *pkt; + SIZE_T pkt_len; //the remainder length of the open_file + _buffer *cur_buffer; + u8 *buf_start; + u8 *cur_addr; + SIZE_T buf_len; +}; + +//Decrease xmit frame due to memory limitation - Alex Fang +#if USE_XMIT_EXTBUFF +#define NR_XMITFRAME 16 //NR_XMITBUFF + NR_XMIT_EXTBUFF +#else +#ifndef CONFIG_HIGH_TP +//#define NR_XMITFRAME 8 +#define NR_XMITFRAME 6 //Decrease recv frame due to memory limitation - YangJue +#else +#define NR_XMITFRAME 100 +#endif +#endif + +extern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev); +extern void rtw_os_xmit_schedule(_adapter *padapter); + +extern int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 alloc_sz); +extern void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 free_sz); + +extern void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib); + +extern uint rtw_remainder_len(struct pkt_file *pfile); +extern void _rtw_open_pktfile(_pkt *pkt, struct pkt_file *pfile); +extern uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen); +extern sint rtw_endofpktfile (struct pkt_file *pfile); + +extern void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt); +extern void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe); + + +#endif //__FREERTOS_XMIT_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/wrapper.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/wrapper.h index bc4dbf4..c58d89f 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/wrapper.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/wrapper.h @@ -1,10 +1,27 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ****************************************************************************** + * Wrapper provide a linux-like interface + ************************************************************************/ #ifndef __WRAPPER_H__ #define __WRAPPER_H__ -/************************************************************************** - * Wrapper provide a linux-like interface - * - * Copyright (c) 2013 Realtek Semiconductor Corp. - ************************************************************************/ + //----- ------------------------------------------------------------------ // Include Files @@ -13,8 +30,11 @@ #include #include "wireless.h" #include +#ifdef PLATFORM_FREERTOS #include "freertos_service.h" - +#elif defined(PLATFORM_CMSIS_RTOS) +#include "rtx_service.h" +#endif #ifndef __LIST_H #warning "DLIST_NOT_DEFINE!!!!!!" //----- ------------------------------------------------------------------ @@ -392,27 +412,27 @@ struct net_device_stats { }; struct net_device { - char name[16]; //+0 - void *priv; //+16 _adapter /* pointer to private data */ - unsigned char dev_addr[6]; //+20 /* set during bootup */ - int (*init)(void); //+28 - int (*open)(struct net_device *dev); //+32 - int (*stop)(struct net_device *dev); //+36 - int (*hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); //+40 - int (*do_ioctl)(struct net_device *dev, struct iwreq *ifr, int cmd); //+44 - struct net_device_stats* (*get_stats)(struct net_device *dev); //+48 + char name[16]; + void *priv; /* pointer to private data */ + unsigned char dev_addr[6]; /* set during bootup */ + int (*init)(void); + int (*open)(struct net_device *dev); + int (*stop)(struct net_device *dev); + int (*hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); + int (*do_ioctl)(struct net_device *dev, struct iwreq *ifr, int cmd); + struct net_device_stats* (*get_stats)(struct net_device *dev); }; typedef struct { - struct net_device *dev; //+0 /* Binding wlan driver netdev */ - void *skb; //+4 /* pending Rx packet */ - unsigned int tx_busy; //+8 - unsigned int rx_busy; //+12 - unsigned char enable; //+16 - unsigned char mac[6]; //+17..23 + struct net_device *dev; /* Binding wlan driver netdev */ + void *skb; /* pending Rx packet */ + unsigned int tx_busy; + unsigned int rx_busy; + unsigned char enable; + unsigned char mac[6]; } Rltk_wlan_t; -#define netdev_priv(dev) dev->priv +#define netdev_priv(dev) dev->priv extern struct net_device *alloc_etherdev(int sizeof_priv); void free_netdev(struct net_device *dev); @@ -424,13 +444,13 @@ int dev_alloc_name(struct net_device *net_dev, const char *ifname); //----- ------------------------------------------------------------------ void init_timer(struct timer_list *timer); void mod_timer(struct timer_list *timer, u32 delay_time_ms); -void cancel_timer_ex(struct timer_list * timer); +void cancel_timer_ex(struct timer_list * timer); void del_timer_sync(struct timer_list * timer); void init_timer_wrapper(void); void deinit_timer_wrapper(void); void rtw_init_timer(_timer *ptimer, void *adapter, TIMER_FUN pfunc,void* cntx, const char *name); -void rtw_set_timer(_timer *ptimer, u32 delay_time); +void rtw_set_timer(_timer *ptimer,u32 delay_time); u8 rtw_cancel_timer(_timer *ptimer); void rtw_del_timer(_timer *ptimer); diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/lwip_intf.c b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/lwip_intf.c index 3ebfe7f..249b007 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/lwip_intf.c +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/lwip_intf.c @@ -22,16 +22,24 @@ #include #include #include +#if !DEVICE_EMAC #include #include +#endif #include #include + //----- ------------------------------------------------------------------ // External Reference //----- ------------------------------------------------------------------ #if (CONFIG_LWIP_LAYER == 1) -extern struct netif xnetif[]; //LWIP netif +#if DEVICE_EMAC + extern struct netif *xnetif[]; +#else + extern struct netif xnetif[]; //LWIP netif #endif +#endif + /** * rltk_wlan_set_netif_info - set netif hw address and register dev pointer to netif device @@ -46,9 +54,13 @@ extern struct netif xnetif[]; //LWIP netif void rltk_wlan_set_netif_info(int idx_wlan, void * dev, unsigned char * dev_addr) { #if (CONFIG_LWIP_LAYER == 1) +#if DEVICE_EMAC + rtw_memcpy(xnetif[idx_wlan]->hwaddr, dev_addr, 6); +#else rtw_memcpy(xnetif[idx_wlan].hwaddr, dev_addr, 6); xnetif[idx_wlan].state = dev; #endif +#endif } /** @@ -62,45 +74,47 @@ void rltk_wlan_set_netif_info(int idx_wlan, void * dev, unsigned char * dev_addr */ int rltk_wlan_send(int idx, struct eth_drv_sg *sg_list, int sg_len, int total_len) { +#if (CONFIG_LWIP_LAYER == 1) struct eth_drv_sg *last_sg; - struct sk_buff *skb = NULL; - int ret = 0; + struct sk_buff *skb = NULL; + int ret = 0; if(idx == -1){ DBG_ERR("netif is DOWN"); return -1; } DBG_TRACE("%s is called", __FUNCTION__); - - save_and_cli(); + + save_and_cli(); if(rltk_wlan_check_isup(idx)) - rltk_wlan_tx_inc(idx); + rltk_wlan_tx_inc(idx); else { DBG_ERR("netif is DOWN"); restore_flags(); return -1; } - restore_flags(); + restore_flags(); - skb = rltk_wlan_alloc_skb(total_len); - if (skb == NULL) { + skb = rltk_wlan_alloc_skb(total_len); + if (skb == NULL) { //DBG_ERR("rltk_wlan_alloc_skb() for data len=%d failed!", total_len); - ret = -1; - goto exit; - } + ret = -1; + goto exit; + } for (last_sg = &sg_list[sg_len]; sg_list < last_sg; ++sg_list) { rtw_memcpy(skb->tail, (void *)(sg_list->buf), sg_list->len); - skb_put(skb, sg_list->len); - } + skb_put(skb, sg_list->len); + } - rltk_wlan_send_skb(idx, skb); + rltk_wlan_send_skb(idx, skb); exit: - save_and_cli(); - rltk_wlan_tx_dec(idx); - restore_flags(); - return ret; + save_and_cli(); + rltk_wlan_tx_dec(idx); + restore_flags(); + return ret; +#endif } /** @@ -113,43 +127,56 @@ exit: */ void rltk_wlan_recv(int idx, struct eth_drv_sg *sg_list, int sg_len) { +#if (CONFIG_LWIP_LAYER == 1) struct eth_drv_sg *last_sg; - struct sk_buff *skb; - + struct sk_buff *skb; + DBG_TRACE("%s is called", __FUNCTION__); + + if (!rltk_wlan_check_isup(idx)) + return; + if(idx == -1){ DBG_ERR("skb is NULL"); return; } - skb = rltk_wlan_get_recv_skb(idx); + + skb = rltk_wlan_get_recv_skb(idx); DBG_ASSERT(skb, "No pending rx skb"); for (last_sg = &sg_list[sg_len]; sg_list < last_sg; ++sg_list) { - if (sg_list->buf != 0) { + if (sg_list->buf != 0) { rtw_memcpy((void *)(sg_list->buf), skb->data, sg_list->len); - skb_pull(skb, sg_list->len); - } - } + skb_pull(skb, sg_list->len); + } + } +#endif } int netif_is_valid_IP(int idx, unsigned char *ip_dest) { #if CONFIG_LWIP_LAYER == 1 - struct netif * pnetif = &xnetif[idx]; - struct ip_addr addr = { 0 }; -#ifdef CONFIG_MEMORY_ACCESS_ALIGNED - unsigned int temp; - memcpy(&temp, ip_dest, sizeof(unsigned int)); - u32_t *ip_dest_addr = &temp; +#if DEVICE_EMAC + struct netif *pnetif = xnetif[idx]; #else - u32_t *ip_dest_addr = (u32_t*)ip_dest; + struct netif *pnetif = &xnetif[idx]; #endif - addr.addr = *ip_dest_addr; - + + ip_addr_t addr = { 0 }; + +#ifdef CONFIG_MEMORY_ACCESS_ALIGNED + unsigned int temp; + memcpy(&temp, ip_dest, sizeof(unsigned int)); + u32_t *ip_dest_addr = &temp; +#else + u32_t *ip_dest_addr = (u32_t*)ip_dest; +#endif + addr.addr = *ip_dest_addr; + if(pnetif->ip_addr.addr == 0) - return 1; + return 1; - if(ip_addr_ismulticast(&addr) || ip_addr_isbroadcast(&addr,pnetif)){ + if(ip_addr_ismulticast(&addr) || ip_addr_isbroadcast(&addr,pnetif)){ return 1; } @@ -163,34 +190,43 @@ int netif_is_valid_IP(int idx, unsigned char *ip_dest) #endif #ifdef CONFIG_DONT_CARE_TP if(pnetif->flags & NETIF_FLAG_IPSWITCH) - return 1; + return 1; else #endif - return 0; + return 0; } -int netif_get_idx(struct netif* pnetif) +int netif_get_idx(struct netif *pnetif) { -#if CONFIG_LWIP_LAYER == 1 - int idx = pnetif - xnetif; - - switch(idx) { - case 0: - return 0; - case 1: - return 1; - default: - return -1; - } +#if (CONFIG_LWIP_LAYER == 1) +#if DEVICE_EMAC + if (pnetif == xnetif[0]) + return 0; +#else + int idx = pnetif - xnetif; + + switch(idx) { + case 0: + return 0; + case 1: + return 1; + default: + return -1; + } +#endif #else - return -1; + return -1; #endif } unsigned char *netif_get_hwaddr(int idx_wlan) { #if (CONFIG_LWIP_LAYER == 1) +#if DEVICE_EMAC + return xnetif[idx_wlan]->hwaddr; +#else return xnetif[idx_wlan].hwaddr; +#endif #else return NULL; #endif @@ -199,7 +235,11 @@ unsigned char *netif_get_hwaddr(int idx_wlan) void netif_rx(int idx, unsigned int len) { #if (CONFIG_LWIP_LAYER == 1) - ethernetif_recv(&xnetif[idx], len); +#if DEVICE_EMAC + wlan_emac_recv(xnetif[idx], len); +#else + ethernetif_recv(&xnetif[idx], len); +#endif #endif #if (CONFIG_INIC_EN == 1) inic_netif_rx(idx, len); @@ -209,14 +249,30 @@ void netif_rx(int idx, unsigned int len) void netif_post_sleep_processing(void) { #if (CONFIG_LWIP_LAYER == 1) +#if DEVICE_EMAC +#else lwip_POST_SLEEP_PROCESSING(); //For FreeRTOS tickless to enable Lwip ARP timer when leaving IPS - Alex Fang #endif +#endif } void netif_pre_sleep_processing(void) { #if (CONFIG_LWIP_LAYER == 1) - lwip_PRE_SLEEP_PROCESSING(); +#if DEVICE_EMAC +#else + lwip_PRE_SLEEP_PROCESSING(); +#endif #endif } +#ifdef CONFIG_WOWLAN +unsigned char *rltk_wlan_get_ip(int idx){ +#if (CONFIG_LWIP_LAYER == 1) + return LwIP_GetIP(&xnetif[idx]); +#else + return NULL; +#endif +} +#endif + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/lwip_intf.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/lwip_intf.h index 16107d2..2553c99 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/lwip_intf.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/lwip_intf.h @@ -1,3 +1,18 @@ +/* mbed Microcontroller Library + * Copyright (c) 2013-2016 Realtek Semiconductor Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #ifndef __LWIP_INTF_H__ #define __LWIP_INTF_H__ @@ -7,18 +22,23 @@ extern "C" { #include #include -#include "ethernetif.h" -#if 0 // moved to ethernetif.h by jimmy 12/2/2015 + +struct netif; + //----- ------------------------------------------------------------------ // Ethernet Buffer //----- ------------------------------------------------------------------ +#if DEVICE_EMAC struct eth_drv_sg { - unsigned int buf; - unsigned int len; + unsigned int buf; + unsigned int len; }; #define MAX_ETH_DRV_SG 32 #define MAX_ETH_MSG 1540 +extern void wlan_emac_recv(struct netif *netif, int len); +#else +#include "ethernetif.h" // moved to ethernetif.h by jimmy 12/2/2015 #endif //----- ------------------------------------------------------------------ // Wlan Interface Provided @@ -37,7 +57,7 @@ unsigned char rltk_wlan_running(unsigned char idx); // interface is up. 0: inte //----- ------------------------------------------------------------------ // Network Interface provided //----- ------------------------------------------------------------------ -struct netif; + int netif_is_valid_IP(int idx,unsigned char * ip_dest); int netif_get_idx(struct netif *pnetif); unsigned char *netif_get_hwaddr(int idx_wlan); @@ -45,11 +65,18 @@ void netif_rx(int idx, unsigned int len); void netif_post_sleep_processing(void); void netif_pre_sleep_processing(void); #if (CONFIG_LWIP_LAYER == 1) +#if !DEVICE_EMAC extern void ethernetif_recv(struct netif *netif, int total_len); +#endif extern void lwip_PRE_SLEEP_PROCESSING(void); extern void lwip_POST_SLEEP_PROCESSING(void); #endif //CONFIG_LWIP_LAYER == 1 + +#ifdef CONFIG_WOWLAN +extern unsigned char *rltk_wlan_get_ip(int idx); +#endif + #ifdef __cplusplus } #endif diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/netdev.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/netdev.h new file mode 100644 index 0000000..ae5046a --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/netdev.h @@ -0,0 +1,113 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __NETDEV_H_ +#define __NETDEV_H_ + +/* Define compilor specific symbol */ +// +// inline function +// + +#if defined ( __ICCARM__ ) +#define __inline__ inline +#define __inline inline +#define __inline_definition //In dialect C99, inline means that a function's definition is provided + //only for inlining, and that there is another definition + //(without inline) somewhere else in the program. + //That means that this program is incomplete, because if + //add isn't inlined (for example, when compiling without optimization), + //then main will have an unresolved reference to that other definition. + + // Do not inline function is the function body is defined .c file and this + // function will be called somewhere else, otherwise there is compile error +#elif defined ( __CC_ARM ) +#define __inline__ __inline //__linine__ is not supported in keil compilor, use __inline instead +#define inline __inline +#define __inline_definition // for dialect C99 +#elif defined ( __GNUC__ ) +#define __inline__ inline +#define __inline inline +#define __inline_definition inline +#endif + +#include +#include +#if defined( PLATFORM_FREERTOS) +#include "freertos_service.h" +#elif defined( PLATFORM_ECOS) +#include "ecos/ecos_service.h" +#elif defined(PLATFORM_CMSIS_RTOS) +#include "rtx_service.h" +#endif + + +// rtl8195a uses receive_tasklet for wps +// 8189em uses interrupt_thread for wps +#if defined(CONFIG_WPS) +#define RECV_STACK_FOR_WPS 448//512//384 //Change to 512 for WPS (IAR STM32) stack overflow +#else +#define RECV_STACK_FOR_WPS 0 +#endif + +#ifdef CONFIG_DONT_CARE_TP +#define XMIT_STACKSIZE 192 //256 +#define CMD_STACKSIZE 384 //512 +#else +#define XMIT_STACKSIZE 256 +#define CMD_STACKSIZE 512 //1024 +#endif //CONFIG_DONT_CARE_TP + +#if defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B) +#define RECV_STACKSIZE 256 +#else //CONFIG_PLATFORM_8195A +#ifdef CONFIG_INCLUDE_WPA_PSK +#if PSK_SUPPORT_TKIP +#define RECV_STACKSIZE (512 + 256 + 128 + RECV_STACK_FOR_WPS) +#else +#define RECV_STACKSIZE (512 + 256 + RECV_STACK_FOR_WPS ) +#endif +#else +#define RECV_STACKSIZE (512 + 256 + RECV_STACK_FOR_WPS) //Can be reduced +#endif +#endif //CONFIG_PLATFORM_8195A + +#define XMIT_TASKLET_STACKSIZE 256 +#define RECV_TASKLET_STACKSIZE (1024 + RECV_STACK_FOR_WPS) +#define SDIOXMIT_STACKSIZE 256 + + +struct rtw_netdev_priv_indicator { + void *priv; + u32 sizeof_priv; +}; + +#define rtw_netdev_priv(netdev) ( ((struct rtw_netdev_priv_indicator *)netdev_priv(netdev))->priv ) + +#define ADPT_FMT "%s" +#define ADPT_ARG(adapter) adapter->pnetdev->name +#define FUNC_NDEV_FMT "%s" +#define FUNC_NDEV_ARG(ndev) __func__ +#define FUNC_ADPT_FMT "%s(%s)" +#define FUNC_ADPT_ARG(adapter) __func__, adapter->pnetdev->name + +#include "wifi_constants.h" +#include "wifi_structures.h" +int rtw_if_wifi_thread(char *name); +#endif //#ifndef __OSDEP_SERVICE_H_ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/osdep_intf.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/osdep_intf.h new file mode 100644 index 0000000..3096bb8 --- /dev/null +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/osdep_intf.h @@ -0,0 +1,116 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __OSDEP_INTF_H_ +#define __OSDEP_INTF_H_ + +typedef struct net_device * _nic_hdl; +struct iw_request_info { + u16 cmd; /* Wireless Extension command */ + u16 flags; /* More to come ;-) */ +}; +typedef int (*iw_handler)(struct net_device *dev, struct iw_request_info *info, + union iwreq_data *wrqu, char *extra); + +struct pkt_buff { + _list list; + u32 len; + unsigned char *data; +}; + +#if defined(PLATFORM_FREERTOS) || defined (PLATFORM_CMSIS_RTOS) + +#include "freertos/wrapper.h" +#include "freertos/freertos_intfs.h" +#include "freertos/freertos_xmit.h" +#include "freertos/freertos_recv.h" + +#elif defined(PLATFORM_ECOS) + +#include "ecos/ecos_xmit.h" +#include "ecos/ecos_recv.h" +#include "ecos/ecos_mlme.h" +#include "ecos/ecos_intfs.h" + +#ifdef CONFIG_PROC_DEBUG //need move to ecos/ecos_intfs.h +void rtw_proc_init_one(struct net_device *dev); +void rtw_proc_remove_one(struct net_device *dev); +#else +static void rtw_proc_init_one(struct net_device *dev){} +static void rtw_proc_remove_one(struct net_device *dev){} +#endif //CONFIG_PROC_DEBUG + +#elif defined(PLATFORM_LINUX) +int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); + +int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname); +struct net_device *rtw_init_netdev(_adapter *padapter); + +#ifdef CONFIG_PROC_DEBUG +void rtw_proc_init_one(struct net_device *dev); +void rtw_proc_remove_one(struct net_device *dev); +#else +static void rtw_proc_init_one(struct net_device *dev){} +static void rtw_proc_remove_one(struct net_device *dev){} +#endif //CONFIG_PROC_DEBUG +#endif + +#ifdef CONFIG_CONCURRENT_MODE +struct _io_ops; +_adapter *rtw_drv_if2_init(_adapter *primary_padapter, char *name, void (*set_intf_ops)(struct _io_ops *pops)); +void rtw_drv_if2_free(_adapter *pbuddy_padapter); +#endif + +struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv); +struct net_device * rtw_alloc_etherdev(int sizeof_priv); +void rtw_free_netdev(struct net_device * netdev); + +int rtw_netif_queue_stopped(struct net_device *pnetdev); +void rtw_netif_wake_queue(struct net_device *pnetdev); +void rtw_netif_start_queue(struct net_device *pnetdev); +void rtw_netif_stop_queue(struct net_device *pnetdev); + +struct pkt_buff *rtw_alloc_pktbuf(unsigned int size); +void rtw_free_pktbuf(struct pkt_buff *skb); + +#if 0 +int RTW_STATUS_CODE(int error_code); + +//flags used for rtw_update_mem_stat() +enum { + MEM_STAT_VIR_ALLOC_SUCCESS, + MEM_STAT_VIR_ALLOC_FAIL, + MEM_STAT_VIR_FREE, + MEM_STAT_PHY_ALLOC_SUCCESS, + MEM_STAT_PHY_ALLOC_FAIL, + MEM_STAT_PHY_FREE, + MEM_STAT_TX, //used to distinguish TX/RX, asigned from caller + MEM_STAT_TX_ALLOC_SUCCESS, + MEM_STAT_TX_ALLOC_FAIL, + MEM_STAT_TX_FREE, + MEM_STAT_RX, //used to distinguish TX/RX, asigned from caller + MEM_STAT_RX_ALLOC_SUCCESS, + MEM_STAT_RX_ALLOC_FAIL, + MEM_STAT_RX_FREE +}; +#endif + +#endif //_OSDEP_INTF_H_ + diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/skbuff.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/skbuff.h index e1e224c..aab44fe 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/skbuff.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/skbuff.h @@ -1,3 +1,18 @@ +/****************************************************************************** + * Copyright (c) 2013-2016 Realtek Semiconductor Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ #ifndef __SKBUFF_H__ #define __SKBUFF_H__ @@ -27,9 +42,9 @@ struct sk_buff { const char *funcname[TRACE_SKB_DEPTH]; unsigned int list_idx; /* Trace the List we are on */ #endif -#ifdef CONFIG_DONT_CARE_TP +//#ifdef CONFIG_DONT_CARE_TP int dyalloc_flag; -#endif +//#endif }; unsigned char *skb_put(struct sk_buff *skb, unsigned int len); diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wireless.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wireless.h index c3865a6..ac98859 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wireless.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wireless.h @@ -268,43 +268,43 @@ typedef long long __i64; /* Wireless Identification */ #define SIOCSIWCOMMIT 0x8B00 /* Commit pending changes to driver */ -#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ +#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ /* SIOCGIWNAME is used to verify the presence of Wireless Extensions. * Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"... * Don't put the name of your driver there, it's useless. */ /* Basic operations */ -#define SIOCSIWNWID 0x8B02 /* set network id (pre-802.11) */ -#define SIOCGIWNWID 0x8B03 /* get network id (the cell) */ -#define SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */ -#define SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */ -#define SIOCSIWMODE 0x8B06 /* set operation mode */ -#define SIOCGIWMODE 0x8B07 /* get operation mode */ -#define SIOCSIWSENS 0x8B08 /* set sensitivity (dBm) */ -#define SIOCGIWSENS 0x8B09 /* get sensitivity (dBm) */ +#define SIOCSIWNWID 0x8B02 /* set network id (pre-802.11) */ +#define SIOCGIWNWID 0x8B03 /* get network id (the cell) */ +#define SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */ +#define SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */ +#define SIOCSIWMODE 0x8B06 /* set operation mode */ +#define SIOCGIWMODE 0x8B07 /* get operation mode */ +#define SIOCSIWSENS 0x8B08 /* set sensitivity (dBm) */ +#define SIOCGIWSENS 0x8B09 /* get sensitivity (dBm) */ /* Informative stuff */ #define SIOCSIWRANGE 0x8B0A /* Unused */ #define SIOCGIWRANGE 0x8B0B /* Get range of parameters */ -#define SIOCSIWPRIV 0x8B0C /* Unused */ -#define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */ +#define SIOCSIWPRIV 0x8B0C /* Unused */ +#define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */ #define SIOCSIWSTATS 0x8B0E /* Unused */ #define SIOCGIWSTATS 0x8B0F /* Get /proc/net/wireless stats */ /* SIOCGIWSTATS is strictly used between user space and the kernel, and * is never passed to the driver (i.e. the driver will never see it). */ /* Spy support (statistics per MAC address - used for Mobile IP support) */ -#define SIOCSIWSPY 0x8B10 /* set spy addresses */ -#define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */ +#define SIOCSIWSPY 0x8B10 /* set spy addresses */ +#define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */ #define SIOCSIWTHRSPY 0x8B12 /* set spy threshold (spy event) */ #define SIOCGIWTHRSPY 0x8B13 /* get spy threshold */ /* Access Point manipulation */ -#define SIOCSIWAP 0x8B14 /* set access point MAC addresses */ -#define SIOCGIWAP 0x8B15 /* get access point MAC addresses */ +#define SIOCSIWAP 0x8B14 /* set access point MAC addresses */ +#define SIOCGIWAP 0x8B15 /* get access point MAC addresses */ #define SIOCGIWAPLIST 0x8B17 /* Deprecated in favor of scanning */ -#define SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */ -#define SIOCGIWSCAN 0x8B19 /* get scanning results */ +#define SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */ +#define SIOCGIWSCAN 0x8B19 /* get scanning results */ /* 802.11 specific support */ #define SIOCSIWESSID 0x8B1A /* set ESSID (network name) */ @@ -316,12 +316,12 @@ typedef long long __i64; * point to a string in user space, like it is done for RANGE... */ /* Other parameters useful in 802.11 and some other devices */ -#define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */ -#define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */ -#define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */ -#define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */ -#define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */ -#define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */ +#define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */ +#define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */ +#define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */ +#define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */ +#define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */ +#define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */ #define SIOCSIWTXPOW 0x8B26 /* set transmit power (dBm) */ #define SIOCGIWTXPOW 0x8B27 /* get transmit power (dBm) */ #define SIOCSIWRETRY 0x8B28 /* set retry limits and lifetime */ @@ -348,11 +348,11 @@ typedef long long __i64; #define SIOCGIWGENIE 0x8B31 /* get generic IE */ /* WPA : IEEE 802.11 MLME requests */ -#define SIOCSIWMLME 0x8B16 /* request MLME operation; uses +#define SIOCSIWMLME 0x8B16 /* request MLME operation; uses * struct iw_mlme */ /* WPA : Authentication mode parameters */ -#define SIOCSIWAUTH 0x8B32 /* set authentication mode params */ -#define SIOCGIWAUTH 0x8B33 /* get authentication mode params */ +#define SIOCSIWAUTH 0x8B32 /* set authentication mode params */ +#define SIOCGIWAUTH 0x8B33 /* get authentication mode params */ /* WPA : Extended version of encoding configuration */ #define SIOCSIWENCODEEXT 0x8B34 /* set encoding token & mode */ @@ -375,8 +375,8 @@ typedef long long __i64; * If you don't follow those rules, DaveM is going to hate you (reason : * it make mixed 32/64bit operation impossible). */ -#define SIOCIWFIRSTPRIV 0x8BE0 -#define SIOCIWLASTPRIV 0x8BFF +#define SIOCIWFIRSTPRIV 0x8BE0 +#define SIOCIWLASTPRIV 0x8BFF #define SIOCSIWPRIVADAPTIVITY 0x8BFB #define SIOCGIWPRIVPASSPHRASE 0x8BFC @@ -412,7 +412,7 @@ typedef long long __i64; #define IWEVTXDROP 0x8C00 /* Packet dropped to excessive retry */ #define IWEVQUAL 0x8C01 /* Quality part of statistics (scan) */ #define IWEVCUSTOM 0x8C02 /* Driver specific ascii string */ -#define IWEVREGISTERED 0x8C03 /* Discovered a new node (AP mode) */ +#define IWEVREGISTERED 0x8C03 /* Discovered a new node (AP mode) */ #define IWEVEXPIRED 0x8C04 /* Expired a node (AP mode) */ #define IWEVGENIE 0x8C05 /* Generic IE (WPA, RSN, WMM, ..) * (scan results); This includes id and @@ -443,7 +443,7 @@ typedef long long __i64; * pre-authentication * (struct iw_pmkid_cand) */ -#define IWEVFIRST 0x8C00 +#define IWEVFIRST 0x8C00 #define IW_EVENT_IDX(cmd) ((cmd) - IWEVFIRST) /* Indicate Mgnt Frame and Action Frame to uplayer*/ @@ -490,11 +490,11 @@ typedef long long __i64; * a few of them in the struct iw_range. */ /* Maximum of address that you may set with SPY */ -#define IW_MAX_SPY 8 +#define IW_MAX_SPY 8 /* Maximum of address that you may get in the list of access points in range */ -#define IW_MAX_AP 64 +#define IW_MAX_AP 64 /* Maximum size of the ESSID and NICKN strings */ #define IW_ESSID_MAX_SIZE 32 @@ -503,7 +503,7 @@ typedef long long __i64; #define IW_MODE_AUTO 0 /* Let the driver decides */ #define IW_MODE_ADHOC 1 /* Single cell network */ #define IW_MODE_INFRA 2 /* Multi cell network, roaming, ... */ -#define IW_MODE_MASTER 3 /* Synchronization master or Access Point */ +#define IW_MODE_MASTER 3 /* Synchronisation master or Access Point */ #define IW_MODE_REPEAT 4 /* Wireless Repeater (forwarder) */ #define IW_MODE_SECOND 5 /* Secondary master/repeater (backup) */ #define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */ @@ -512,13 +512,13 @@ typedef long long __i64; #define IW_QUAL_QUAL_UPDATED 0x01 /* Value was updated since last read */ #define IW_QUAL_LEVEL_UPDATED 0x02 #define IW_QUAL_NOISE_UPDATED 0x04 -#define IW_QUAL_ALL_UPDATED 0x07 -#define IW_QUAL_DBM 0x08 /* Level + Noise are dBm */ +#define IW_QUAL_ALL_UPDATED 0x07 +#define IW_QUAL_DBM 0x08 /* Level + Noise are dBm */ #define IW_QUAL_QUAL_INVALID 0x10 /* Driver doesn't provide value */ #define IW_QUAL_LEVEL_INVALID 0x20 #define IW_QUAL_NOISE_INVALID 0x40 -#define IW_QUAL_RCPI 0x80 /* Level + Noise are 802.11k RCPI */ -#define IW_QUAL_ALL_INVALID 0x70 +#define IW_QUAL_RCPI 0x80 /* Level + Noise are 802.11k RCPI */ +#define IW_QUAL_ALL_INVALID 0x70 /* Frequency flags */ #define IW_FREQ_AUTO 0x00 /* Let the driver decides */ @@ -532,32 +532,32 @@ typedef long long __i64; #define IW_ENCODING_TOKEN_MAX 64 /* 512 bits (for now) */ /* Flags for encoding (along with the token) */ -#define IW_ENCODE_INDEX 0x00FF /* Token index (if needed) */ -#define IW_ENCODE_FLAGS 0xFF00 /* Flags defined below */ -#define IW_ENCODE_MODE 0xF000 /* Modes defined below */ -#define IW_ENCODE_DISABLED 0x8000 /* Encoding disabled */ -#define IW_ENCODE_ENABLED 0x0000 /* Encoding enabled */ +#define IW_ENCODE_INDEX 0x00FF /* Token index (if needed) */ +#define IW_ENCODE_FLAGS 0xFF00 /* Flags defined below */ +#define IW_ENCODE_MODE 0xF000 /* Modes defined below */ +#define IW_ENCODE_DISABLED 0x8000 /* Encoding disabled */ +#define IW_ENCODE_ENABLED 0x0000 /* Encoding enabled */ #define IW_ENCODE_RESTRICTED 0x4000 /* Refuse non-encoded packets */ -#define IW_ENCODE_OPEN 0x2000 /* Accept non-encoded packets */ -#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */ -#define IW_ENCODE_TEMP 0x0400 /* Temporary key */ +#define IW_ENCODE_OPEN 0x2000 /* Accept non-encoded packets */ +#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */ +#define IW_ENCODE_TEMP 0x0400 /* Temporary key */ /* Power management flags available (along with the value, if any) */ -#define IW_POWER_ON 0x0000 /* No details... */ -#define IW_POWER_TYPE 0xF000 /* Type of parameter */ -#define IW_POWER_PERIOD 0x1000 /* Value is a period/duration of */ -#define IW_POWER_TIMEOUT 0x2000 /* Value is a timeout (to go asleep) */ -#define IW_POWER_SAVING 0x4000 /* Value is relative (how aggressive)*/ -#define IW_POWER_MODE 0x0F00 /* Power Management mode */ -#define IW_POWER_UNICAST_R 0x0100 /* Receive only unicast messages */ +#define IW_POWER_ON 0x0000 /* No details... */ +#define IW_POWER_TYPE 0xF000 /* Type of parameter */ +#define IW_POWER_PERIOD 0x1000 /* Value is a period/duration of */ +#define IW_POWER_TIMEOUT 0x2000 /* Value is a timeout (to go asleep) */ +#define IW_POWER_SAVING 0x4000 /* Value is relative (how aggressive)*/ +#define IW_POWER_MODE 0x0F00 /* Power Management mode */ +#define IW_POWER_UNICAST_R 0x0100 /* Receive only unicast messages */ #define IW_POWER_MULTICAST_R 0x0200 /* Receive only multicast messages */ -#define IW_POWER_ALL_R 0x0300 /* Receive all messages though PM */ -#define IW_POWER_FORCE_S 0x0400 /* Force PM procedure for sending unicast */ -#define IW_POWER_REPEATER 0x0800 /* Repeat broadcast messages in PM period */ -#define IW_POWER_MODIFIER 0x000F /* Modify a parameter */ -#define IW_POWER_MIN 0x0001 /* Value is a minimum */ -#define IW_POWER_MAX 0x0002 /* Value is a maximum */ -#define IW_POWER_RELATIVE 0x0004 /* Value is not in seconds/ms/us */ +#define IW_POWER_ALL_R 0x0300 /* Receive all messages though PM */ +#define IW_POWER_FORCE_S 0x0400 /* Force PM procedure for sending unicast */ +#define IW_POWER_REPEATER 0x0800 /* Repeat broadcast messages in PM period */ +#define IW_POWER_MODIFIER 0x000F /* Modify a parameter */ +#define IW_POWER_MIN 0x0001 /* Value is a minimum */ +#define IW_POWER_MAX 0x0002 /* Value is a maximum */ +#define IW_POWER_RELATIVE 0x0004 /* Value is not in seconds/ms/us */ /* Transmit Power flags available */ #define IW_TXPOW_TYPE 0x00FF /* Type of value */ @@ -567,7 +567,7 @@ typedef long long __i64; #define IW_TXPOW_RANGE 0x1000 /* Range of value between min/max */ /* Retry limits and lifetime flags available */ -#define IW_RETRY_ON 0x0000 /* No details... */ +#define IW_RETRY_ON 0x0000 /* No details... */ #define IW_RETRY_TYPE 0xF000 /* Type of parameter */ #define IW_RETRY_LIMIT 0x1000 /* Maximum number of retries*/ #define IW_RETRY_LIFETIME 0x2000 /* Maximum duration of retries in us */ @@ -589,8 +589,8 @@ typedef long long __i64; #define IW_SCAN_ALL_RATE 0x0040 /* Scan all Bit-Rates */ #define IW_SCAN_THIS_RATE 0x0080 /* Scan only this Bit-Rate */ /* struct iw_scan_req scan_type */ -#define IW_SCAN_TYPE_ACTIVE 0 -#define IW_SCAN_TYPE_PASSIVE 1 +#define IW_SCAN_TYPE_ACTIVE 0 +#define IW_SCAN_TYPE_PASSIVE 1 /* Maximum size of returned data */ #define IW_SCAN_MAX_DATA 4096 /* In bytes */ @@ -627,14 +627,14 @@ typedef long long __i64; /* IW_AUTH_WPA_VERSION values (bit field) */ #define IW_AUTH_WPA_VERSION_DISABLED 0x00000001 -#define IW_AUTH_WPA_VERSION_WPA 0x00000002 -#define IW_AUTH_WPA_VERSION_WPA2 0x00000004 +#define IW_AUTH_WPA_VERSION_WPA 0x00000002 +#define IW_AUTH_WPA_VERSION_WPA2 0x00000004 /* IW_AUTH_PAIRWISE_CIPHER and IW_AUTH_GROUP_CIPHER values (bit field) */ -#define IW_AUTH_CIPHER_NONE 0x00000001 +#define IW_AUTH_CIPHER_NONE 0x00000001 #define IW_AUTH_CIPHER_WEP40 0x00000002 -#define IW_AUTH_CIPHER_TKIP 0x00000004 -#define IW_AUTH_CIPHER_CCMP 0x00000008 +#define IW_AUTH_CIPHER_TKIP 0x00000004 +#define IW_AUTH_CIPHER_CCMP 0x00000008 #define IW_AUTH_CIPHER_WEP104 0x00000010 /* IW_AUTH_KEY_MGMT values (bit field) */ @@ -644,7 +644,7 @@ typedef long long __i64; /* IW_AUTH_80211_AUTH_ALG values (bit field) */ #define IW_AUTH_ALG_OPEN_SYSTEM 0x00000001 #define IW_AUTH_ALG_SHARED_KEY 0x00000002 -#define IW_AUTH_ALG_LEAP 0x00000004 +#define IW_AUTH_ALG_LEAP 0x00000004 /* IW_AUTH_ROAMING_CONTROL values */ #define IW_AUTH_ROAMING_ENABLE 0 /* driver/firmware based roaming */ @@ -666,15 +666,15 @@ typedef long long __i64; /* IWEVMICHAELMICFAILURE : struct iw_michaelmicfailure ->flags */ #define IW_MICFAILURE_KEY_ID 0x00000003 /* Key ID 0..3 */ -#define IW_MICFAILURE_GROUP 0x00000004 +#define IW_MICFAILURE_GROUP 0x00000004 #define IW_MICFAILURE_PAIRWISE 0x00000008 #define IW_MICFAILURE_STAKEY 0x00000010 -#define IW_MICFAILURE_COUNT 0x00000060 /* 1 or 2 (0 = count not supported) +#define IW_MICFAILURE_COUNT 0x00000060 /* 1 or 2 (0 = count not supported) */ /* Bit field values for enc_capa in struct iw_range */ -#define IW_ENC_CAPA_WPA 0x00000001 -#define IW_ENC_CAPA_WPA2 0x00000002 +#define IW_ENC_CAPA_WPA 0x00000001 +#define IW_ENC_CAPA_WPA2 0x00000002 #define IW_ENC_CAPA_CIPHER_TKIP 0x00000004 #define IW_ENC_CAPA_CIPHER_CCMP 0x00000008 @@ -698,8 +698,8 @@ typedef long long __i64; /* Modulations bitmasks */ #define IW_MODUL_ALL 0x00000000 /* Everything supported */ -#define IW_MODUL_FH 0x00000001 /* Frequency Hopping */ -#define IW_MODUL_DS 0x00000002 /* Original Direct Sequence */ +#define IW_MODUL_FH 0x00000001 /* Frequency Hopping */ +#define IW_MODUL_DS 0x00000002 /* Original Direct Sequence */ #define IW_MODUL_CCK 0x00000004 /* 802.11b : 5.5 + 11 Mb/s */ #define IW_MODUL_11B (IW_MODUL_DS | IW_MODUL_CCK) #define IW_MODUL_PBCC 0x00000008 /* TI : 5.5 + 11 + 22 Mb/s */ @@ -714,8 +714,8 @@ typedef long long __i64; #define IW_MODUL_CUSTOM 0x40000000 /* Driver specific */ /* Bitrate flags available */ -#define IW_BITRATE_TYPE 0x00FF /* Type of value */ -#define IW_BITRATE_UNICAST 0x0001 /* Maximum/Fixed unicast bitrate */ +#define IW_BITRATE_TYPE 0x00FF /* Type of value */ +#define IW_BITRATE_UNICAST 0x0001 /* Maximum/Fixed unicast bitrate */ #define IW_BITRATE_BROADCAST 0x0002 /* Fixed broadcast bitrate */ /****************************** TYPES ******************************/ @@ -808,7 +808,7 @@ struct iw_missed */ struct iw_thrspy { - struct sockaddr_t addr; /* Source address (hw/mac) */ + struct sockaddr_t addr; /* Source address (hw/mac) */ struct iw_quality qual; /* Quality of the link */ struct iw_quality low; /* Low threshold */ struct iw_quality high; /* High threshold */ diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wlan_intf.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wlan_intf.h index 02d6def..b586e0c 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wlan_intf.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wlan_intf.h @@ -1,3 +1,18 @@ +/****************************************************************************** + * Copyright (c) 2013-2016 Realtek Semiconductor Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ #ifndef __WLAN_INTF_H__ #define __WLAN_INTF_H__ @@ -37,15 +52,13 @@ struct sk_buff { */ /************************************************************/ -// #include "wrapper.h" -//extern Rltk_wlan_t rltk_wlan_info[2]; - //----- ------------------------------------------------------------------ // Wlan Interface opened for upper layer //----- ------------------------------------------------------------------ int rltk_wlan_init(int idx_wlan, rtw_mode_t mode); //return 0: success. -1:fail void rltk_wlan_deinit(void); -void rltk_wlan_start(int idx_wlan); +void rltk_wlan_deinit_fastly(void); +int rltk_wlan_start(int idx_wlan); void rltk_wlan_statistic(unsigned char idx); unsigned char rltk_wlan_running(unsigned char idx); // interface is up. 0: interface is down int rltk_wlan_control(unsigned long cmd, void *data); @@ -58,6 +71,7 @@ int rltk_wlan_set_wps_phase(unsigned char is_trigger_wps); int rtw_ps_enable(int enable); int rltk_wlan_is_connected_to_ap(void); + #ifdef __cplusplus } #endif diff --git a/RTL00_SDKV35a/component/os/rtx/rtx_service.c b/RTL00_SDKV35a/component/os/rtx/rtx_service.c new file mode 100644 index 0000000..4946662 --- /dev/null +++ b/RTL00_SDKV35a/component/os/rtx/rtx_service.c @@ -0,0 +1,1109 @@ +/* RTX includes */ +#include "osdep_service.h" +#include "tcm_heap.h" +#include +//#include //malloc(), free() +//#include //memcpy(), memcmp(), memset() +#include "platform_stdlib.h" +//#include +//#include +/********************* os depended utilities ********************/ + +#ifndef USE_MUTEX_FOR_SPINLOCK +#define USE_MUTEX_FOR_SPINLOCK 1 +#endif + +#define USE_HEAP_INFO 0 + +#define OS_TICK 1000 +#define OS_TICK_RATE_MS (1000/OS_TICK) + +//----------------------------------------------------------------------- +// Private Variables +//----------------------------------------------------------------------- +static unsigned long CriticalNesting = 0; + +//----------------------------------------------------------------------- +// Misc Function +//----------------------------------------------------------------------- +int osdep_print = 0; +#define _func_enter_ do{\ + if(osdep_print)\ + printf("enter %s\r\n", __FUNCTION__);\ + }while(0) +#define _func_exit_ do{\ + if(osdep_print)\ + printf("exit %s\r\n", __FUNCTION__);\ + }while(0) + +void save_and_cli() +{ +_func_enter_; + __disable_irq(); +_func_exit_; +} + +void restore_flags() +{ +_func_enter_; + __enable_irq(); +_func_exit_; +} + +void cli() +{ +_func_enter_; + __disable_irq(); +_func_exit_; +} + +/* Not needed on 64bit architectures */ +static unsigned int __div64_32(u64 *n, unsigned int base) +{ + u64 rem = *n; + u64 b = base; + u64 res, d = 1; + unsigned int high = rem >> 32; +_func_enter_; + /* Reduce the thing a bit first */ + res = 0; + if (high >= base) { + high /= base; + res = (u64) high << 32; + rem -= (u64) (high * base) << 32; + } + + while ((u64)b > 0 && b < rem) { + b = b+b; + d = d+d; + } + + do { + if (rem >= b) { + rem -= b; + res += d; + } + b >>= 1; + d >>= 1; + } while (d); +_func_exit_; + *n = res; + return rem; +} + +/********************* os depended service ********************/ +#if USE_HEAP_INFO +static uint32_t osFreeBytesRemaining=0x400; +#endif +static void _rtx_memset(void *pbuf, int c, u32 sz); +u8* _rtx_malloc(u32 sz) +{ +_func_enter_; + void *p = NULL; + p = malloc(sz); + if(p != NULL){ +#if USE_HEAP_INFO + osFreeBytesRemaining-=sz; +#endif + } +_func_exit_; + return p; +} + +u8* _rtx_zmalloc(u32 sz) +{ +_func_enter_; + u8 *pbuf = _rtx_malloc(sz); + + if (pbuf != NULL){ +#if USE_HEAP_INFO + osFreeBytesRemaining-=sz; +#endif + _rtx_memset(pbuf, 0, sz); + } +_func_exit_; + return pbuf; +} + +static void (*ext_free)( void *p ) = NULL; +static uint32_t ext_upper = 0; +static uint32_t ext_lower = 0; +void rtw_set_mfree_ext( void (*free)( void *p ), uint32_t upper, uint32_t lower ) +{ + ext_free = free; + ext_upper = upper; + ext_lower = lower; +} + +void _rtx_mfree(u8 *pbuf, u32 sz) +{ +_func_enter_; + if( ((uint32_t)pbuf >= ext_lower) && ((uint32_t)pbuf < ext_upper) ){ + if(ext_free) + ext_free(pbuf); + }else{ + free(pbuf); + } +#if USE_HEAP_INFO + osFreeBytesRemaining+=sz; +#endif +} + +static void _rtx_memcpy(void* dst, void* src, u32 sz) +{ +_func_enter_; + memcpy(dst, src, sz); +_func_exit_; +} + +static int _rtx_memcmp(void *dst, void *src, u32 sz) +{ +_func_enter_; +//under Linux/GNU/GLibc, the return value of memcmp for two same mem. chunk is 0 + if (!(memcmp(dst, src, sz))) + return _SUCCESS; +_func_exit_; + return _FAIL; +} + +static void _rtx_memset(void *pbuf, int c, u32 sz) +{ +_func_enter_; + memset(pbuf, c, sz); +_func_exit_; +} + +static void _rtx_init_sema(_sema *sem, int init_val) +{ +_func_enter_; + rtx_sema_t *p_sem = (rtx_sema_t *)_rtx_zmalloc(sizeof(rtx_sema_t)); + if(p_sem == NULL){ + goto err_exit; + } +#ifdef CMSIS_OS_RTX + p_sem->def.semaphore = p_sem->data; +#endif + *sem = (_sema)p_sem; + p_sem->id = osSemaphoreCreate(&p_sem->def, init_val); + if (p_sem->id == NULL){ + goto err_exit; + } +_func_exit_; + return; +err_exit: + DBG_ERR("error"); + if(p_sem) + _rtx_mfree((u8 *)p_sem, sizeof(rtx_sema_t)); + *sem = NULL; + return; +} + +static void _rtx_free_sema(_sema *sema) +{ +_func_enter_; + if(*sema){ + rtx_sema_t *p_sem = (rtx_sema_t *)(*sema); + osSemaphoreDelete(p_sem->id); + if(p_sem) + _rtx_mfree((u8 *)p_sem, sizeof(rtx_sema_t)); + *sema = NULL; + }else + DBG_ERR("NULL pointer get"); +_func_exit_; +} + +static void _rtx_up_sema(_sema *sema) +{ + if(*sema){ + rtx_sema_t *p_sem = (rtx_sema_t *)(*sema); + osStatus status = osSemaphoreRelease(p_sem->id); + if ( status != osOK){ + DBG_ERR("error %d", status); + } + }else + DBG_ERR("NULL pointer get"); +_func_exit_; +} + +static void _rtx_up_sema_from_isr(_sema *sema) +{ +_func_enter_; + if(*sema){ + rtx_sema_t *p_sem = (rtx_sema_t *)*sema; + osStatus status = osSemaphoreRelease(p_sem->id); + if (status != osOK){ + DBG_ERR("error %d", status); + } + }else + DBG_ERR("NULL pointer get"); +_func_exit_; +} + +static u32 _rtx_down_sema(_sema *sema, u32 timeout_ms) +{ + if(*sema){ + rtx_sema_t *p_sem = (rtx_sema_t *)*sema; + if(timeout_ms == RTW_MAX_DELAY) { + timeout_ms = osWaitForever; + } else { + timeout_ms = rtw_ms_to_systime(timeout_ms); + } + + if (osSemaphoreWait(p_sem->id, (timeout_ms != 0)?(timeout_ms):(osWaitForever)) >= 0) + return _TRUE; + } + return _FALSE; +} + +static void _rtx_mutex_init(_mutex *mutex) +{ +_func_enter_; + rtx_mutex_t *p_mut = (rtx_mutex_t *)_rtx_zmalloc(sizeof(rtx_mutex_t)); + if(p_mut == NULL) + goto err_exit; +#ifdef CMSIS_OS_RTX + p_mut->def.mutex = (void *)p_mut->data; +#endif + *mutex = (_mutex)p_mut; + p_mut->id = osMutexCreate(&p_mut->def); + if (p_mut->id == NULL) + goto err_exit; +_func_exit_; + return; +err_exit: + DBG_ERR("error"); + if(p_mut) + _rtx_mfree((u8 *)p_mut, sizeof(rtx_mutex_t)); + *mutex = NULL; + return; +} + +static void _rtx_mutex_free(_mutex *pmutex) +{ +_func_enter_; + if(*pmutex){ + rtx_mutex_t *p_mut = (rtx_mutex_t *)(*pmutex); + osMutexDelete(p_mut->id); + if(p_mut) + _rtx_mfree((u8 *)p_mut, sizeof(rtx_mutex_t)); + } +_func_exit_; +} + +static void _rtx_mutex_get(_mutex *pmutex) +{ +_func_enter_; + if(*pmutex){ + rtx_mutex_t *p_mut = (rtx_mutex_t *)(*pmutex); + if (osMutexWait(p_mut->id, 60 * 1000 / OS_TICK_RATE_MS) != osOK) + DBG_ERR("%s(%p) failed, retry\n", __FUNCTION__, p_mut); + } +_func_exit_; +} + +static int _rtx_mutex_get_timeout(_mutex *pmutex, u32 timeout_ms) +{ +_func_enter_; + if(*pmutex){ + rtx_mutex_t *p_mut = (rtx_mutex_t *)(*pmutex); + if(timeout_ms == RTW_MAX_DELAY) { + timeout_ms = osWaitForever; + } else { + timeout_ms = rtw_ms_to_systime(timeout_ms); + } + if(osMutexWait(p_mut->id, timeout_ms / OS_TICK_RATE_MS) == osOK){ + return _SUCCESS; + } + } +_func_exit_; + DBG_ERR("%s(%p) failed, retry\n", __FUNCTION__, pmutex); + return _FAIL; +} + +static void _rtx_mutex_put(_mutex *pmutex) +{ +_func_enter_; + if(*pmutex){ + rtx_mutex_t *p_mut = (rtx_mutex_t *)(*pmutex); + if (osMutexRelease(p_mut->id) != osOK) + DBG_ERR("\r\ninternal counter of mutex is 0 or calling task is not the owner of the mutex"); + } +_func_exit_; +} + +static void _rtx_enter_critical(_lock *plock, _irqL *pirqL) +{ +_func_enter_; + CriticalNesting++; + if(CriticalNesting == 1){ + rt_tsk_lock();//tsk_lock & tsk_unlock should not be called nested + } +_func_exit_; +} + +void mbed_die(void){ + DBG_ERR(" %p die here", osThreadGetId()); + __disable_irq(); + while(1); +} + +static void _rtx_exit_critical(_lock *plock, _irqL *pirqL) +{ +_func_enter_; + if(CriticalNesting == 0){ + DBG_ERR("die here"); + HALT(); + } + CriticalNesting--; + if(CriticalNesting == 0){ + rt_tsk_unlock(); + } +_func_exit_; +} + +static void _rtx_enter_critical_from_isr(_lock *plock, _irqL *pirqL) +{ +_func_enter_; + __disable_irq(); +_func_exit_; +} + +static void _rtx_exit_critical_from_isr(_lock *plock, _irqL *pirqL) +{ +_func_enter_; + __enable_irq(); +_func_exit_; +} + +static int _rtx_enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ +_func_enter_; + while(_rtx_mutex_get_timeout(pmutex, 60 * 1000 / OS_TICK_RATE_MS) != _SUCCESS) + DBG_ERR("\n\r[%p] %s(%p) failed, retry\n", osThreadGetId(), __FUNCTION__, pmutex); +_func_exit_; + return _SUCCESS; +} + +static void _rtx_exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ +_func_enter_; + _rtx_mutex_put(pmutex); +_func_exit_; +} + +static void _rtx_spinlock_init(_lock *plock) +{ +_func_enter_; +#if USE_MUTEX_FOR_SPINLOCK + _rtx_mutex_init(plock); +#endif +_func_exit_; +} + +static void _rtx_spinlock_free(_lock *plock) +{ +_func_enter_; +#if USE_MUTEX_FOR_SPINLOCK + if(plock != NULL){ + _rtx_mutex_free(plock); + } +#endif +_func_exit_; +} + +static void _rtx_spinlock(_lock *plock) +{ +_func_enter_; +#if USE_MUTEX_FOR_SPINLOCK + _rtx_mutex_get(plock); +#endif +_func_exit_; +} + +static void _rtx_spinunlock(_lock *plock) +{ +_func_enter_; +#if USE_MUTEX_FOR_SPINLOCK + _rtx_mutex_put(plock); +#endif +_func_exit_; +} + +static void _rtx_spinlock_irqsave(_lock *plock, _irqL *irqL) +{ +_func_enter_; + _rtx_enter_critical(plock, irqL); +#if USE_MUTEX_FOR_SPINLOCK + _rtx_spinlock(plock); +#endif +_func_exit_; +} + +static void _rtx_spinunlock_irqsave(_lock *plock, _irqL *irqL) +{ +_func_enter_; +#if USE_MUTEX_FOR_SPINLOCK + _rtx_spinunlock(plock); +#endif + _rtx_exit_critical(plock, irqL); +_func_exit_; +} + +static int _rtx_init_xqueue( _xqueue* queue, const char* name, u32 message_size, u32 number_of_messages ) +{ +_func_enter_; + rtx_mbox_t *mbox = (rtx_mbox_t *)_rtx_zmalloc(sizeof(rtx_mbox_t)); + if (mbox == NULL ){ + goto err_exit; + } +#ifdef CMSIS_OS_RTX + mbox->os_mailQ_q = (uint32_t)_rtx_zmalloc((4+number_of_messages)*sizeof(uint32_t)); + mbox->os_mailQ_m = (uint32_t)_rtx_zmalloc((3 + (message_size+3)/4)*number_of_messages); + if((mbox->os_mailQ_q == 0) || (mbox->os_mailQ_m == 0)) + goto err_exit; + mbox->os_mailQ_p[0] = (void *)mbox->os_mailQ_q; + mbox->os_mailQ_p[1] = (void *)mbox->os_mailQ_m; + mbox->def.pool = mbox->os_mailQ_p; + mbox->def.queue_sz = number_of_messages; + mbox->def.item_sz = message_size; +#endif + *queue = (_xqueue)mbox; + mbox->id = osMailCreate(&mbox->def, NULL); + if(mbox->id == NULL) + goto err_exit; +_func_exit_; + return _SUCCESS; +err_exit: + DBG_ERR("%s error\r\n", __FUNCTION__); + if(mbox){ + if(mbox->os_mailQ_q) + _rtx_mfree((u8 *)mbox->os_mailQ_q, ((4+number_of_messages)*sizeof(uint32_t))); + if(mbox->os_mailQ_m) + _rtx_mfree((u8 *)mbox->os_mailQ_m, ((3 + (message_size+3)/4)*number_of_messages)); + _rtx_mfree((u8 *)mbox, sizeof(rtx_mbox_t)); + *queue = NULL; + } + return _FAIL; +} + +static int _rtx_push_to_xqueue( _xqueue* queue, void* message, u32 timeout_ms ) +{ +_func_enter_; + void *mptr; + rtx_mbox_t *mbox; + if(timeout_ms == RTW_MAX_DELAY) { + timeout_ms = osWaitForever; + } else { + timeout_ms = rtw_ms_to_systime(timeout_ms); + } + + if (*queue != NULL){ + mbox = (rtx_mbox_t *)(*queue); + mptr = osMailAlloc(mbox->id, timeout_ms); // Allocate memory + _rtx_memcpy(mptr, message, mbox->def.item_sz); + if(osMailPut(mbox->id, mptr) != osOK ){ + DBG_ERR("%s error\n", __FUNCTION__); + return _FAIL; + } + } +_func_exit_; + return _SUCCESS; +} + +static int _rtx_pop_from_xqueue( _xqueue* queue, void* message, u32 timeout_ms ) +{ +_func_enter_; + if(timeout_ms == RTW_WAIT_FOREVER) { + timeout_ms = osWaitForever; + } else { + timeout_ms = rtw_ms_to_systime(timeout_ms); + } + if (*queue != NULL){ + rtx_mbox_t *mbox = (rtx_mbox_t *)(*queue); + osEvent evt; + evt = osMailGet(mbox->id, timeout_ms ); + if (evt.status == osEventMail) { + _rtx_memcpy(message, evt.value.p, mbox->def.item_sz); + osMailFree(mbox->id, evt.value.p); +_func_exit_; + return _SUCCESS; + } + } + DBG_ERR("[%p] %s error", osThreadGetId(), __FUNCTION__); + return _FAIL; +} + +static int _rtx_deinit_xqueue( _xqueue* queue ) +{ +_func_enter_; + if(*queue != NULL){ + rtx_mbox_t *mbox = (rtx_mbox_t *)(*queue); + + if(mbox->os_mailQ_q) + _rtx_mfree((u8 *)mbox->os_mailQ_q, ((4+mbox->def.queue_sz)*sizeof(uint32_t))); + if(mbox->os_mailQ_m) + _rtx_mfree((u8 *)mbox->os_mailQ_m, ((3 + (mbox->def.item_sz+3)/4)*mbox->def.queue_sz)); + _rtx_mfree((u8 *)mbox, sizeof(rtx_mbox_t)); + *queue = NULL; + } +_func_exit_; + return 0; +} + +static u32 _rtx_get_current_time(void) +{ +_func_enter_; + return rt_time_get(); +_func_exit_; +} + +static u32 _rtx_systime_to_ms(u32 systime) +{ + return systime * OS_TICK_RATE_MS; +} + +static u32 _rtx_systime_to_sec(u32 systime) +{ + return systime / OS_TICK; +} + +static u32 _rtx_ms_to_systime(u32 ms) +{ + return ms / OS_TICK_RATE_MS; +} + +static u32 _rtx_sec_to_systime(u32 sec) +{ + return sec * OS_TICK; +} + +static void _rtx_msleep_os(int ms) +{ +_func_enter_; + osDelay(ms); +_func_exit_; +} + +static void _rtx_usleep_os(int us) +{ +_func_enter_; +#if defined(STM32F2XX) || defined(STM32F4XX) || defined(STM32F10X_XL) + // FreeRTOS does not provide us level delay. Use busy wait + WLAN_BSP_UsLoop(us); +#elif defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B) + //DBG_ERR("%s: Please Implement micro-second delay\n", __FUNCTION__); + HalDelayUs(us); +#else +// #error "Please implement hardware dependent micro second level sleep here" +#endif +_func_exit_; +} + +static void _rtx_mdelay_os(int ms) +{ +_func_enter_; + osDelay(ms); +_func_exit_; +} + +static void _rtx_udelay_os(int us) +{ +_func_enter_; +#if defined(STM32F2XX) || defined(STM32F4XX) || defined(STM32F10X_XL) + // FreeRTOS does not provide us level delay. Use busy wait + WLAN_BSP_UsLoop(us); +#elif defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B) + //RtlUdelayOS(us); + HalDelayUs(us); +#else +// #error "Please implement hardware dependent micro second level sleep here" +#endif +_func_exit_; +} + +static void _rtx_yield_os(void) +{ +_func_enter_; + osThreadYield(); +_func_exit_; +} + +static void _rtx_ATOMIC_SET(ATOMIC_T *v, int i) +{ + atomic_set(v,i); +} + +static int _rtx_ATOMIC_READ(ATOMIC_T *v) +{ + return atomic_read(v); +} + +static void _rtx_ATOMIC_ADD(ATOMIC_T *v, int i) +{ + save_and_cli(); + v->counter += i; + restore_flags(); +} + +static void _rtx_ATOMIC_SUB(ATOMIC_T *v, int i) +{ + save_and_cli(); + v->counter -= i; + restore_flags(); +} + +static void _rtx_ATOMIC_INC(ATOMIC_T *v) +{ + save_and_cli(); + v->counter++; + restore_flags(); +} + +static void _rtx_ATOMIC_DEC(ATOMIC_T *v) +{ + save_and_cli(); + v->counter--; + restore_flags(); +} + +static int _rtx_ATOMIC_ADD_RETURN(ATOMIC_T *v, int i) +{ + int temp; + + save_and_cli(); + temp = v->counter; + temp += i; + v->counter = temp; + restore_flags(); + + return temp; +} + +static int _rtx_ATOMIC_SUB_RETURN(ATOMIC_T *v, int i) +{ + int temp; + + save_and_cli(); + temp = v->counter; + temp -= i; + v->counter = temp; + restore_flags(); + + return temp; +} + +static int _rtx_ATOMIC_INC_RETURN(ATOMIC_T *v) +{ + return _rtx_ATOMIC_ADD_RETURN(v, 1); +} + +static int _rtx_ATOMIC_DEC_RETURN(ATOMIC_T *v) +{ + return _rtx_ATOMIC_SUB_RETURN(v, 1); +} + +static u64 _rtx_modular64(u64 n, u64 base) +{ + unsigned int __base = (base); + unsigned int __rem; +_func_enter_; + if (((n) >> 32) == 0) { + __rem = (unsigned int)(n) % __base; + (n) = (unsigned int)(n) / __base; + } + else + __rem = __div64_32(&(n), __base); +_func_exit_; + return __rem; +} + +/* Refer to ecos bsd tcpip codes */ +static int _rtx_arc4random(void) +{ +_func_enter_; + u32 res = _rtx_get_current_time(); + static unsigned long seed = 0xDEADB00B; + seed = ((seed & 0x007F00FF) << 7) ^ + ((seed & 0x0F80FF00) >> 8) ^ // be sure to stir those low bits + (res << 13) ^ (res >> 9); // using the clock too! +_func_exit_; + return (int)seed; +} + +static int _rtx_get_random_bytes(void *buf, u32 len) +{ +#if 1 //becuase of 4-byte align, we use the follow code style. + unsigned int ranbuf; + unsigned int *lp; + int i, count; + count = len / sizeof(unsigned int); + lp = (unsigned int *) buf; +_func_enter_; + for(i = 0; i < count; i ++) { + lp[i] = _rtx_arc4random(); + len -= sizeof(unsigned int); + } + + if(len > 0) { + ranbuf = _rtx_arc4random(); + _rtx_memcpy(&lp[i], &ranbuf, len); + } +_func_exit_; + return 0; +#else + unsigned long ranbuf, *lp; + lp = (unsigned long *)buf; + while (len > 0) { + ranbuf = _rtx_arc4random(); + *lp++ = ranbuf; //this op need the pointer is 4Byte-align! + len -= sizeof(ranbuf); + } + return 0; +#endif +} + +static u32 _rtx_GetFreeHeapSize(void) +{ +#if USE_HEAP_INFO + return osFreeBytesRemaining; +#else + return 0; +#endif +} + + +#if CONFIG_USE_TCM_HEAP +void *tcm_heap_malloc(int size); +#endif +static int _rtx_create_task(struct task_struct *ptask, const char *name, + u32 stack_size, u32 priority, thread_func_t func, void *thctx) +{ +_func_enter_; + rtx_thread_data_t *thread_hdl = NULL; + u32 stacksize = stack_size * 4; //sizeof(DWORD) + if(!func) + goto err_exit; + thread_hdl = (rtx_thread_data_t *)_rtx_zmalloc(sizeof(rtx_thread_data_t)); + if(thread_hdl == NULL) + goto err_exit; +#ifdef CMSIS_OS_RTX +#ifndef __MBED_CMSIS_RTOS_CA9 + thread_hdl->def.stack_pointer = (void *)_rtx_malloc(stacksize); + if(thread_hdl->def.stack_pointer == NULL) + goto err_exit; +#endif + if(priority > osPriorityRealtime){ + DBG_ERR("[%s]priority is higher than osPriorityRealtime", name); + priority = osPriorityRealtime; + } + thread_hdl->def.pthread = (os_pthread)func; + thread_hdl->def.tpriority = (osPriority)priority; + thread_hdl->def.stacksize = stacksize; +#endif + ptask->task = (_thread_hdl_)thread_hdl; + ptask->task_name = name; + ptask->blocked = 0; + ptask->callback_running = 0; + + _rtx_init_sema(&ptask->wakeup_sema, 0); + _rtx_init_sema(&ptask->terminate_sema, 0); + //rtw_init_queue(&wq->work_queue); + + thread_hdl->id = osThreadCreate(&thread_hdl->def, thctx); + if(thread_hdl->id == NULL) + goto err_exit; + return _SUCCESS; +err_exit: + if(thread_hdl){ + _rtx_free_sema(&ptask->wakeup_sema); + _rtx_free_sema(&ptask->terminate_sema); + _rtx_memset((u8 *)ptask, 0, sizeof(*ptask)); +#ifndef __MBED_CMSIS_RTOS_CA9 + if(thread_hdl->def.stack_pointer) + _rtx_mfree((void *)thread_hdl->def.stack_pointer, thread_hdl->def.stacksize); +#endif + _rtx_mfree((u8 *)thread_hdl, sizeof(rtx_thread_data_t)); + } + DBG_ERR("Create Task \"%s\" Failed! \n", ptask->task_name); + return _FAIL; +} + +static void _rtx_delete_task(struct task_struct *ptask) +{ +_func_enter_; + rtx_thread_data_t *thread_hdl = (rtx_thread_data_t *)ptask->task; + if (!thread_hdl){ + DBG_ERR("_rtx_delete_task(): ptask is NULL!\n"); + return; + } + + ptask->blocked = 1; + + _rtx_up_sema(&ptask->wakeup_sema); + _rtx_down_sema(&ptask->terminate_sema, TIMER_MAX_DELAY); + + osThreadTerminate(thread_hdl->id); +#ifndef __MBED_CMSIS_RTOS_CA9 + if(thread_hdl->def.stack_pointer) + _rtx_mfree((void *)thread_hdl->def.stack_pointer, thread_hdl->def.stacksize); +#endif + _rtx_mfree((u8 *)thread_hdl, sizeof(rtx_thread_data_t)); + + //rtw_deinit_queue(&wq->work_queue); + _rtx_free_sema(&ptask->wakeup_sema); + _rtx_free_sema(&ptask->terminate_sema); + + ptask->task = NULL; + + DBG_TRACE("Delete Task \"%s\"\n", ptask->task_name); +_func_exit_; +} + +void _rtx_wakeup_task(struct task_struct *ptask) +{ +_func_enter_; + if(ptask) + _rtx_up_sema(&ptask->wakeup_sema); +_func_exit_; +} + +static void _rtx_thread_enter(char *name) +{ +_func_enter_; + DBG_INFO("\n\rRTKTHREAD %s\n", name); +_func_exit_; +} + +static void _rtx_thread_exit(void) +{ +_func_enter_; + osThreadId id = osThreadGetId(); + osThreadTerminate(id); +_func_exit_; +} + +/***************************************************** +************timer data block, defined in rt_CMSIS.c********* + +// Timer definitions +#define osTimerInvalid 0 +#define osTimerStopped 1 +#define osTimerRunning 2 + +// Timer structures + +typedef struct os_timer_cb_ { // Timer Control Block + struct os_timer_cb_ *next; // Pointer to next active Timer, (u8 *)data[0:3] + uint8_t state; // Timer State, (u8 *)data[4] + uint8_t type; // Timer Type (Periodic/One-shot), (u8 *)data[5] + uint16_t reserved; // Reserved, (u8 *)data[6:7] + uint16_t tcnt; // Timer Delay Count, (u8 *)data[8:9] + uint16_t icnt; // Timer Initial Count, (u8 *)data[10:11] + void *arg; // Timer Function Argument, (u8 *)data[12:15] + osTimerDef_t *timer; // Pointer to Timer definition, (u8 *)data[16:19] +} os_timer_cb; +*****************************************************/ +_timerHandle _rtx_timerCreate( const signed char *pcTimerName, + osdepTickType xTimerPeriodInTicks, + u32 uxAutoReload, + void * pvTimerID, + TIMER_FUN pxCallbackFunction ) +{ +_func_enter_; + rtx_tmr_t *tmr = (rtx_tmr_t *)_rtx_zmalloc(sizeof(rtx_tmr_t)); + os_timer_type type = (uxAutoReload == _TRUE)?osTimerPeriodic:osTimerOnce; + if(tmr == NULL) + goto err_exit; +#ifdef CMSIS_OS_RTX + tmr->def.ptimer = (os_ptimer)pxCallbackFunction; + tmr->def.timer = (void *)tmr->data; +#endif + if(pvTimerID == NULL) + pvTimerID = (void *)tmr; + tmr->id = osTimerCreate(&tmr->def, type, pvTimerID); + if(tmr->id == NULL) + goto err_exit; +_func_exit_; + return (_timerHandle)tmr; +err_exit: + DBG_ERR("error"); + if(tmr) + _rtx_mfree((u8 *)tmr, sizeof(rtx_tmr_t)); + return NULL; +} + +u32 _rtx_timerDelete( _timerHandle xTimer, + osdepTickType xBlockTime ) +{ +_func_enter_; + rtx_tmr_t *tmr = (rtx_tmr_t *) xTimer; + osStatus status = osTimerDelete(tmr->id); + _rtx_mfree((u8 *)tmr, sizeof(rtx_tmr_t)); + if(status != osOK){ + DBG_ERR("error %d", status); + return _FAIL; + } +_func_exit_; + return _SUCCESS; +} + +u32 _rtx_timerIsTimerActive( _timerHandle xTimer ) +{ +_func_enter_; + rtx_tmr_t *tmr = (rtx_tmr_t *) xTimer; + u8 *data = (u8 *)tmr->data; +_func_exit_; + switch(data[4]){ + case 2U: + return _TRUE; + default: + return _FALSE; + } +} + +u32 _rtx_timerStop( _timerHandle xTimer, + osdepTickType xBlockTime ) +{ +_func_enter_; + rtx_tmr_t *tmr = (rtx_tmr_t *) xTimer; + osStatus status = osTimerStop(tmr->id); +_func_exit_; + if(status == osOK) + return _SUCCESS; + + DBG_ERR("error %d\n", status); + return _FAIL; +} + +u32 _rtx_timerChangePeriod( _timerHandle xTimer, + osdepTickType xNewPeriod, + osdepTickType xBlockTime ) +{ +_func_enter_; + rtx_tmr_t *tmr = (rtx_tmr_t *) xTimer; + osStatus ret; + + if(xNewPeriod == 0) + xNewPeriod += 1; + xNewPeriod = _rtx_systime_to_ms(xNewPeriod); + ret = osTimerStart(tmr->id, xNewPeriod); +_func_exit_; + if(ret == osOK) + return _SUCCESS; + + DBG_ERR("%s error\n", __FUNCTION__); + return _FAIL; +} + +//void _rtx_acquire_wakelock() +//{ +//#if defined(configUSE_WAKELOCK_PMU) && (configUSE_WAKELOCK_PMU == 1) +// acquire_wakelock(WAKELOCK_WLAN); +//#endif +//} + +//void _rtx_release_wakelock() +//{ +//#if defined(configUSE_WAKELOCK_PMU) && (configUSE_WAKELOCK_PMU == 1) +// release_wakelock(WAKELOCK_WLAN); +//#endif +//} + +u8 _rtx_get_scheduler_state(void) +{ +_func_enter_; + int32_t state = osKernelRunning(); + u8 state_out = OS_SCHEDULER_NOT_STARTED; + switch(state){ + case 1: state = OS_SCHEDULER_RUNNING; break; + case 0: state = OS_SCHEDULER_SUSPENDED; break; + default: break; + } +_func_exit_; + return state_out; +} + +const struct osdep_service_ops osdep_service = { + _rtx_malloc, //rtw_vmalloc + _rtx_zmalloc, //rtw_zvmalloc + _rtx_mfree, //rtw_vmfree + _rtx_malloc, //rtw_malloc + _rtx_zmalloc, //rtw_zmalloc + _rtx_mfree, //rtw_mfree + _rtx_memcpy, //rtw_memcpy + _rtx_memcmp, //rtw_memcmp + _rtx_memset, //rtw_memset + _rtx_init_sema, //rtw_init_sema + _rtx_free_sema, //rtw_free_sema + _rtx_up_sema, //rtw_up_sema + _rtx_up_sema_from_isr,//rtw_up_sema_from_isr + _rtx_down_sema, //rtw_down_sema + _rtx_mutex_init, //rtw_mutex_init + _rtx_mutex_free, //rtw_mutex_free + _rtx_mutex_get, //rtw_mutex_get + _rtx_mutex_get_timeout, //rtw_mutex_get_timeout + _rtx_mutex_put, //rtw_mutex_put + _rtx_enter_critical, //rtw_enter_critical + _rtx_exit_critical, //rtw_exit_critical + _rtx_enter_critical_from_isr, //rtw_enter_critical_from_isr + _rtx_exit_critical_from_isr, //rtw_exit_critical_from_isr + NULL, //rtw_enter_critical_bh + NULL, //rtw_exit_critical_bh + _rtx_enter_critical_mutex, //rtw_enter_critical_mutex + _rtx_exit_critical_mutex, //rtw_exit_critical_mutex + _rtx_spinlock_init, //rtw_spinlock_init + _rtx_spinlock_free, //rtw_spinlock_free + _rtx_spinlock, //rtw_spin_lock + _rtx_spinunlock, //rtw_spin_unlock + _rtx_spinlock_irqsave, //rtw_spinlock_irqsave + _rtx_spinunlock_irqsave, //rtw_spinunlock_irqsave + _rtx_init_xqueue,//rtw_init_xqueue + _rtx_push_to_xqueue,//rtw_push_to_xqueue + _rtx_pop_from_xqueue,//rtw_pop_from_xqueue + _rtx_deinit_xqueue,//rtw_deinit_xqueue + _rtx_get_current_time, //rtw_get_current_time + _rtx_systime_to_ms, //rtw_systime_to_ms + _rtx_systime_to_sec, //rtw_systime_to_sec + _rtx_ms_to_systime, //rtw_ms_to_systime + _rtx_sec_to_systime, //rtw_sec_to_systime + _rtx_msleep_os, //rtw_msleep_os + _rtx_usleep_os, //rtw_usleep_os + _rtx_mdelay_os, //rtw_mdelay_os + _rtx_udelay_os, //rtw_udelay_os + _rtx_yield_os, //rtw_yield_os + + _rtx_ATOMIC_SET, //ATOMIC_SET + _rtx_ATOMIC_READ, //ATOMIC_READ + _rtx_ATOMIC_ADD, //ATOMIC_ADD + _rtx_ATOMIC_SUB, //ATOMIC_SUB + _rtx_ATOMIC_INC, //ATOMIC_INC + _rtx_ATOMIC_DEC, //ATOMIC_DEC + _rtx_ATOMIC_ADD_RETURN, //ATOMIC_ADD_RETURN + _rtx_ATOMIC_SUB_RETURN, //ATOMIC_SUB_RETURN + _rtx_ATOMIC_INC_RETURN, //ATOMIC_INC_RETURN + _rtx_ATOMIC_DEC_RETURN, //ATOMIC_DEC_RETURN + + _rtx_modular64, //rtw_modular64 + _rtx_get_random_bytes, //rtw_get_random_bytes + _rtx_GetFreeHeapSize, //rtw_getFreeHeapSize + + _rtx_create_task, //rtw_create_task + _rtx_delete_task, //rtw_delete_task + _rtx_wakeup_task, //rtw_wakeup_task + + _rtx_thread_enter, //rtw_thread_enter + _rtx_thread_exit, //rtw_thread_exit + + _rtx_timerCreate, //rtw_timerCreate, + _rtx_timerDelete, //rtw_timerDelete, + _rtx_timerIsTimerActive, //rtw_timerIsTimerActive, + _rtx_timerStop, //rtw_timerStop, + _rtx_timerChangePeriod, //rtw_timerChangePeriod + + NULL, // rtw_acquire_wakelock + NULL, // rtw_release_wakelock + NULL, //rtw_wakelock_timeout + + _rtx_get_scheduler_state // rtw_get_scheduler_state +}; + diff --git a/RTL00_SDKV35a/component/os/rtx/rtx_service.h b/RTL00_SDKV35a/component/os/rtx/rtx_service.h new file mode 100644 index 0000000..4396aea --- /dev/null +++ b/RTL00_SDKV35a/component/os/rtx/rtx_service.h @@ -0,0 +1,309 @@ +#ifndef _RTX_SERVICE_H_ +#define _RTX_SERVICE_H_ + +//----------------------------------------------------------------------- +// Include Files +//----------------------------------------------------------------------- +#include "wireless.h" +#include "dlist.h" +#include +#include +#include "RTX_Config.h" +#include +#include +#include + +// -------------------------------------------- +// Platform dependent include file +// -------------------------------------------- +#if defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B) +//#include "platform_stdlib.h" +//#include "basic_types.h" +#include +#else +// other MCU may use standard library +#include +#endif + + +#if (defined CONFIG_GSPI_HCI || defined CONFIG_SDIO_HCI) || defined(CONFIG_LX_HCI) +/* For SPI interface transfer and us delay implementation */ +#if !defined(CONFIG_PLATFORM_8195A) && !defined(CONFIG_PLATFORM_8711B) +#include +#endif +#endif + + +// -------------------------------------------- +// Platform dependent type define +// -------------------------------------------- +#if !defined(CONFIG_PLATFORM_8195A) && !defined(CONFIG_PLATFORM_8711B) +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef signed char s8; +typedef signed short s16; +typedef signed int s32; +typedef signed long long s64; +typedef unsigned long long u64; +typedef unsigned int uint; +typedef signed int sint; + +#ifndef bool +typedef int bool; +#define true 1 +#define false 0 +#endif + +#define IN +#define OUT +#define VOID void +#define NDIS_OID uint +#define NDIS_STATUS uint +#ifndef PVOID +typedef void * PVOID; +#endif + +typedef unsigned int __kernel_size_t; +typedef int __kernel_ssize_t; +typedef __kernel_size_t SIZE_T; +typedef __kernel_ssize_t SSIZE_T; + +#endif //CONFIG_PLATFORM_8195A + +// === SEMAPHORE === +typedef struct { + osSemaphoreId id; + osSemaphoreDef_t def; +#ifdef CMSIS_OS_RTX + uint32_t data[2]; +#endif +} rtx_sema_t; + +// === THREAD === +typedef struct { + osThreadId id; + osThreadDef_t def; +} rtx_thread_data_t; + +// === MUTEX === +typedef struct { + osMutexId id; + osMutexDef_t def; +#ifdef CMSIS_OS_RTX +#if defined(__MBED_CMSIS_RTOS_CA9) || defined(__MBED_CMSIS_RTOS_CM) + int32_t data[4]; +#else + int32_t data[3]; +#endif +#endif +} rtx_mutex_t; + +// === MAIL BOX === +#define RTX_MB_SIZE 8 + +typedef struct { + osMessageQId id; + osMessageQDef_t def; +#ifdef CMSIS_OS_RTX + uint32_t queue; /* The (queue_size+4)*sizeof(uint32_t) is required for RTX OS_MCB overhead. */ +#endif +} rtx_mqueue_t; + +typedef struct { + osMailQId id; + osMailQDef_t def; +#ifdef CMSIS_OS_RTX + uint32_t os_mailQ_q; /* memory block, (4+queue_size)*sizeof(uint32_t)*/ + uint32_t os_mailQ_m; /* memory block, (3 + (item_size+3)/4)*queue_size*/ + void * os_mailQ_p[2]; +#endif +} rtx_mbox_t; + +typedef struct{ + osTimerId id; + osTimerDef_t def; +#if defined(CMSIS_OS_RTX) && !defined(__MBED_CMSIS_RTOS_CM) + uint32_t data[5]; +#else + uint32_t data[6]; +#endif +}rtx_tmr_t; + +#define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field) + +// os types +typedef char osdepCHAR; +typedef float osdepFLOAT; +typedef double osdepDOUBLE; +typedef long osdepLONG; +typedef short osdepSHORT; +typedef unsigned long osdepSTACK_TYPE; +typedef long osdepBASE_TYPE; +typedef unsigned long osdepTickType; + +typedef void * _timerHandle; +typedef void * _sema; +typedef void * _mutex; +typedef void * _lock; +typedef void * _queueHandle; +typedef void * _xqueue; +typedef struct timer_list _timer; + +typedef struct sk_buff _pkt; +typedef unsigned char _buffer; + +#ifndef __LIST_H +#warning "DLIST_NOT_DEFINE!!!!!!" +struct list_head { + struct list_head *next, *prev; +}; +#endif + +struct __queue { + struct list_head queue; + _lock lock; +}; + +typedef struct __queue _queue; +typedef struct list_head _list; +typedef unsigned long _irqL; + +typedef void* _thread_hdl_; +typedef void thread_return; +typedef void* thread_context; + +#define ATOMIC_T atomic_t +#define HZ configTICK_RATE_HZ + +#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) +/* emulate a modern version */ +#define LINUX_VERSION_CODE KERNEL_VERSION(2, 6, 17) + +static __inline _list *get_next(_list *list) +{ + return list->next; +} + +static __inline _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + +#define LIST_CONTAINOR(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)((char *)&((type *)ptr)->member - (char *)ptr))) +//#define container_of(p,t,n) (t*)((p)-&(((t*)0)->n)) +#define container_of(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) +#define TASK_PRORITY_LOW osPriorityAboveNormal//osPriorityNormal +#define TASK_PRORITY_MIDDLE osPriorityHigh//osPriorityAboveNormal +#define TASK_PRORITY_HIGH osPriorityRealtime//osPriorityHigh +#define TASK_PRORITY_SUPER osPriorityRealtime +#define TASK_PRORITY_IDEL osPriorityIdle + + +#define TIMER_MAX_DELAY 0xFFFFFFFF +void save_and_cli(void); +void restore_flags(void); +void cli(void); + +//----- ------------------------------------------------------------------ +// Common Definition +//----- ------------------------------------------------------------------ + +#define __init +#define __exit +#define __devinit +#define __devexit + +#define KERN_ERR +#define KERN_INFO +#define KERN_NOTICE + +#define GFP_KERNEL 1 +#define GFP_ATOMIC 1 + +#define SET_MODULE_OWNER(some_struct) do { } while (0) +#define SET_NETDEV_DEV(dev, obj) do { } while (0) +#define register_netdev(dev) (0) +#define unregister_netdev(dev) do { } while (0) +#define netif_queue_stopped(dev) (0) +#define netif_wake_queue(dev) do { } while (0) +#define printk printf + +#define DBG_ERR(fmt, args...) printf("\n\r[%s] " fmt, __FUNCTION__, ## args) +#if WLAN_INTF_DBG +#define DBG_TRACE(fmt, args...) printf("\n\r[%s] " fmt, __FUNCTION__, ## args) +#define DBG_INFO(fmt, args...) printf("\n\r[%s] " fmt, __FUNCTION__, ## args) +#else +#define DBG_TRACE(fmt, args...) +#define DBG_INFO(fmt, args...) +#endif +#define HALT() do { cli(); for(;;);} while(0) +#define ASSERT(x) do { \ + if((x) == 0) \ + printf("\n\rAssert(" #x ") failed on line %d in file %s", __LINE__, __FILE__); \ + HALT(); \ + } while(0) + +#undef DBG_ASSERT +#define DBG_ASSERT(x, msg) do { \ + if((x) == 0) \ + printf("\n\r%s, Assert(" #x ") failed on line %d in file %s", msg, __LINE__, __FILE__); \ + } while(0) + +//----- ------------------------------------------------------------------ +// Atomic Operation +//----- ------------------------------------------------------------------ +#if !defined(CONFIG_PLATFORM_8195A) && !defined(CONFIG_PLATFORM_8711B) // for 8195A, it is defined in ..system../basic_types.h +typedef struct { volatile int counter; } atomic_t; +#endif + + +/* + * atomic_read - read atomic variable + * @v: pointer of type atomic_t + * + * Atomically reads the value of @v. Note that the guaranteed + * useful range of an atomic_t is only 24 bits. + */ +#define atomic_read(v) ((v)->counter) + +/* + * atomic_set - set atomic variable + * @v: pointer of type atomic_t + * @i: required value + * + * Atomically sets the value of @v to @i. Note that the guaranteed + * useful range of an atomic_t is only 24 bits. + */ +#define atomic_set(v,i) ((v)->counter = (i)) + + /* + * These inlines deal with timer wrapping correctly. You are + * strongly encouraged to use them + * 1. Because people otherwise forget + * 2. Because if the timer wrap changes in future you wont have to + * alter your driver code. + * + * time_after(a,b) returns true if the time a is after time b. + * + * Do this with "<0" and ">=0" to only test the sign of the result. A + * good compiler would generate better code (and a really good compiler + * wouldn't care). Gcc is currently neither. + */ + #define time_after(a,b) ((long)(b) - (long)(a) < 0) + #define time_before(a,b) time_after(b,a) + + #define time_after_eq(a,b) ((long)(a) - (long)(b) >= 0) + #define time_before_eq(a,b) time_after_eq(b,a) + + +extern void rtw_init_listhead(_list *list); +extern u32 rtw_is_list_empty(_list *phead); +extern void rtw_list_insert_head(_list *plist, _list *phead); +extern void rtw_list_insert_tail(_list *plist, _list *phead); +extern void rtw_list_delete(_list *plist); +#define vPortExitCritical save_and_cli +#endif /* _RTX_SERVICE_H_ */ + diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/include/rtl_lib.h b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/include/rtl_lib.h index 5d81df9..13c7e8f 100644 --- a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/include/rtl_lib.h +++ b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/include/rtl_lib.h @@ -10,6 +10,7 @@ #include #include +#include extern int __rtl_errno; @@ -23,10 +24,10 @@ void init_rom_libgloss_ram_map(void); // extern int rtl_printf(IN const char* fmt, ...); -extern int rtl_vprintf(const char *fmt, void *param); +extern int rtl_vprintf(const char *fmt, va_list param); extern int rtl_sprintf(char* str, const char* fmt, ...); extern int rtl_snprintf(char* str, size_t size, const char* fmt, ...); -extern int rtl_vsnprintf(char *str, size_t size, const char *fmt, void *param); +extern int rtl_vsnprintf(char *str, size_t size, const char *fmt, va_list param); // // RTL library functions for string diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/include/rtl_rr_libc.h b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/include/rtl_rr_libc.h new file mode 100644 index 0000000..e548044 --- /dev/null +++ b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/include/rtl_rr_libc.h @@ -0,0 +1,166 @@ +/* +* RAM->ROM Calls +*/ + +#ifndef _INC_RTL_RR_LIBC_ +#define _INC_RTL_RR_LIBC_ + +//#undef malloc +#define malloc(size) pvPortMalloc(size) +//#undef free +#define free(pbuf) vPortFree(pbuf) +//extern void* pvPortReAlloc( void *pv, size_t xWantedSize ) +#define realloc(pv, xWantedSize) pvPortReAlloc(pv, xWantedSize) + +#define calloc(nelements, elementSize) calloc_freertos(nelements, elementSize) + +#define snprintf rtl_snprintf +#define sprintf rtl_sprintf +#define printf rtl_printf +#define vprintf rtl_vprintf +#define vsnprintf rtl_vsnprintf +#define vfprintf rtl_vfprintf +#define memchr rtl_memchr +#define memcmp rtl_memcmp +#define memcpy rtl_memcpy +#define memmove rtl_memmove +#define memset rtl_memset +#define strcat rtl_strcat +#define strchr rtl_strchr +#define strcmp rtl_strcmp +#define strcpy rtl_strcpy +#define strlen rtl_strlen +#define strncat rtl_strncat +#define strncmp rtl_strncmp +#define strncpy rtl_strncpy +#define strstr rtl_strstr +#define strsep rtl_strsep +#define strtok rtl_strtok + +#if 0 // __aeabi_ +#define dtoi rtl_dtoi +#define dtoui rtl_dtoui +#define i2f rtl_i2f +#define i2d rtl_i2d +#define ui2f rtl_ui2f +#define ui2d rtl_ui2d +#define itoa rtl_itoa +#define ltoa rtl_ltoa +#define utoa rtl_utoa +#define ultoa rtl_ultoa +#define ftol rtl_ftol +#define ftod rtl_ftod +#define dtof rtl_dtof +#define fadd rtl_fadd +#define fsub rtl_fsub +#define fmul rtl_fmul +#define fdiv rtl_fdiv +#define dadd rtl_dadd +#define dsub rtl_dsub +#define dmul rtl_dmul +#define ddiv rtl_ddiv +#define dcmpeq rtl_dcmpeq +#define dcmplt rtl_dcmplt +#define dcmple rtl_dcmple +#define dcmpgt rtl_dcmpgt +#define fcmplt rtl_fcmplt +#define fcmpgt rtl_fcmpgt + +#define fabsf rtl_fabsf +#define fabs rtl_fabs +#define cos_f32 rtl_cos_f32 +#define sin_f32 rtl_sin_f32 +#endif + +#if 0 +extern void *calloc_freertos(size_t nelements, size_t elementSize); +// ram_libc.c +extern void rtl_libc_init(void); +extern int rtl_snprintf(char *str, size_t size, const char *fmt, ...); +extern int rtl_sprintf(char *str, const char *fmt, ...); +extern int rtl_printf(const char *fmt, ...); +extern int rtl_vprintf(const char *fmt, void *param); +extern int rtl_vsnprintf(char *str, size_t size, const char *fmt, void *param); +extern int rtl_vfprintf(FILE *fp, const char *fmt0, va_list ap); +extern void * rtl_memchr(const void * src_void , int c , size_t length); +extern int rtl_memcmp(const void *m1, const void *m2, size_t n); +extern void * rtl_memcpy(void *dst0, const void *src0, size_t len0); +extern void * rtl_memmove(void *dst_void, const void *src_void, size_t length); +extern void * rtl_memset(void *m, int c, size_t n); +extern char * rtl_strcat(char *s1, const char *s2); +extern char * rtl_strchr(const char *s1, int i); +extern int rtl_strcmp(const char *s1, const char *s2); +extern char * rtl_strcpy(char *dst0, const char *src0); +extern size_t rtl_strlen(const char *str); +extern char * rtl_strncat(char *s1, const char *s2, size_t n); +extern int rtl_strncmp(const char *s1, const char *s2, size_t n); +extern char * rtl_strncpy(char *dst0, const char *src0, size_t count); +extern char * rtl_strstr(const char *searchee, const char *lookfor); +extern char * rtl_strsep(char **source_ptr, const char *delim); +extern char * rtl_strtok(char *s, const char *delim); + +//rtl_eabi_cast_ram.c +extern int rtl_dtoi(double d); +extern int rtl_dtoui(double d); +extern float rtl_i2f(int val); +extern int rtl_i2d(int val); +extern float rtl_ui2f(unsigned int val); +extern int rtl_ui2d(unsigned int val); +extern char *rtl_itoa(int value, char *string, int radix); +extern char *rtl_ltoa(int value, char *string, int radix); +extern char *rtl_utoa(unsigned int value, char *string, int radix); +extern char *rtl_ultoa(unsigned int value, char *string, int radix); +extern int rtl_ftol(float f); +extern int rtl_ftod(float f); +extern float rtl_dtof(double d); +extern float rtl_fadd(float a, float b); +extern float rtl_fsub(float a, float b); +extern float rtl_fmul(float a, float b); +extern float rtl_fdiv(float a, float b); +extern int rtl_dadd(double a, double b); +extern int rtl_dsub(double a, double b); +extern int rtl_dmul(double a, double b); +extern int rtl_ddiv(double a, double b); +extern int rtl_dcmpeq(double a, double b); +extern int rtl_dcmplt(double a, double b); +extern int rtl_dcmple(double a, double b); +extern int rtl_dcmpgt(double a, double b); +extern int rtl_fcmplt(float a, float b); +extern int rtl_fcmpgt(float a, float b); + +// rtl_math_ram.c +extern float rtl_fabsf(float a); +extern int rtl_fabs(double a); +extern float rtl_cos_f32(float a); +extern float rtl_sin_f32(float a); + +// ram_pvvx_libc.c +extern int snprintf(char *str, size_t size, const char *fmt, ...); +extern int sprintf(char *str, const char *fmt, ...); +extern int printf(const char *fmt, ...); +extern int vprintf(const char * fmt, __VALIST param); +extern int vsnprintf(char *str, size_t size, const char *fmt, __VALIST param); +extern int vfprintf(FILE *fp, const char *fmt0, va_list ap); +extern void * memchr(const void * src_void , int c , size_t length); +extern int memcmp(const void *m1, const void *m2, size_t n); +extern void * memcpy(void *dst0, const void *src0, size_t len0); +extern void * memmove(void *dst_void, const void *src_void, size_t length); +extern void * memset(void *m, int c, size_t n); +extern char * strcat(char *s1, const char *s2); +extern char * strchr(const char *s1, int i); +extern int strcmp(const char *s1, const char *s2); +extern char * strcpy(char *dst0, const char *src0); +extern size_t strlen(const char *str); +extern char * strncat(char *s1, const char *s2, size_t n); +extern int strncmp(const char *s1, const char *s2, size_t n); +extern char * strncpy(char *dst0, const char *src0, size_t count); +extern char * strstr(const char *searchee, const char *lookfor); +extern char * strsep(char **source_ptr, const char *delim); +extern char * strtok(char *s, const char *delim); +extern int sscanf(const char *buf, const char *fmt, ...); +extern char toupper(char ch); +extern int _stricmp (const char *s1, const char *s2); +extern unsigned long long __aeabi_llsr(unsigned long long val, unsigned int shift); +#endif + +#endif // _INC_RTL_RR_LIBC_ \ No newline at end of file diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/c_stdio.c b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/c_stdio.c new file mode 100644 index 0000000..4ff3a67 --- /dev/null +++ b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/c_stdio.c @@ -0,0 +1,1093 @@ + +#include "platform_autoconf.h" +#if 1 //def ENAC_FLOAT +#include +#include +#include "libc/rom/string/rom_libc_string.h" + +#define memchr __rtl_memchr_v1_00 +#define memcmp __rtl_memcmp_v1_00 +#define memcpy __rtl_memcpy_v1_00 +#define memmove __rtl_memmove_v1_00 +#define memset __rtl_memset_v1_00 +#define strcat __rtl_strcat_v1_00 +#define strchr __rtl_strchr_v1_00 +#define strcmp __rtl_strcmp_v1_00 +#define strcpy __rtl_strcpy_v1_00 +#define strlen __rtl_strlen_v1_00 +#define strncat __rtl_strncat_v1_00 +#define strncmp __rtl_strncmp_v1_00 +#define strncpy __rtl_strncpy_v1_00 +#define strstr __rtl_strstr_v1_00 +#define strsep __rtl_strsep_v1_00 +#define strtok __rtl_strtok_v1_00 + +static char toupper(char ch) { + return ((ch >= 'a' && ch <= 'z') ? ch - 'a' + 'A' : ch); +}; + +#define NEWFP 1 +#define ENDIAN_LITTLE 1234 +#define ENDIAN_BIG 4321 +#define ENDIAN_PDP 3412 +#define ENDIAN ENDIAN_LITTLE + +/* $Id: strichr.c,v 1.1.1.1 2006/08/23 17:03:06 pefo Exp $ */ + +/* + * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Opsycon AB. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +//#include + +char * +strichr(char *p, int c) +{ + char *t; + + if (p != NULL) { + for(t = p; *t; t++); + for (; t >= p; t--) { + *(t + 1) = *t; + } + *p = c; + } + return (p); +} + +/* $Id: str_fmt.c,v 1.1.1.1 2006/08/23 17:03:06 pefo Exp $ */ + +/* + * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Opsycon AB. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +//#include + +#define FMT_RJUST 0 +#define FMT_LJUST 1 +#define FMT_RJUST0 2 +#define FMT_CENTER 3 + +/* + * Format string by inserting blanks. + */ + +void +str_fmt(char *p, int size, int fmt) +{ + int n, m, len; + + len = strlen (p); + switch (fmt) { + case FMT_RJUST: + for (n = size - len; n > 0; n--) + strichr (p, ' '); + break; + case FMT_LJUST: + for (m = size - len; m > 0; m--) + strcat (p, " "); + break; + case FMT_RJUST0: + for (n = size - len; n > 0; n--) + strichr (p, '0'); + break; + case FMT_CENTER: + m = (size - len) / 2; + n = size - (len + m); + for (; m > 0; m--) + strcat (p, " "); + for (; n > 0; n--) + strichr (p, ' '); + break; + } +} + +/* $Id: strtoupp.c,v 1.1.1.1 2006/08/23 17:03:06 pefo Exp $ */ + +/* + * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Opsycon AB. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +//#include +//#include +/* + * strtoupper() + */ +void +strtoupper(char *p) +{ + if(!p) + return; + for (; *p; p++) + *p = toupper (*p); +} + +/* $Id: atob.c,v 1.1.1.1 2006/08/23 17:03:06 pefo Exp $ */ + +/* + * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Opsycon AB. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +//#include +//#include +//#include + +//typedef int int32_t; +typedef unsigned int u_int32_t; +typedef unsigned int u_int; +typedef unsigned long u_long; +typedef int32_t register_t; +typedef long long quad_t; +typedef unsigned long long u_quad_t; +typedef double rtype; + +#ifndef __P +#define __P(args) args +#endif + +static char * _getbase __P((char *, int *)); +static int _atob __P((unsigned long long *, char *p, int)); + +static char * +_getbase(char *p, int *basep) +{ + if (p[0] == '0') { + switch (p[1]) { + case 'x': + *basep = 16; + break; + case 't': case 'n': + *basep = 10; + break; + case 'o': + *basep = 8; + break; + default: + *basep = 10; + return (p); + } + return (p + 2); + } + *basep = 10; + return (p); +} + + +/* + * _atob(vp,p,base) + */ +static int +_atob (u_quad_t *vp, char *p, int base) +{ + u_quad_t value, v1, v2; + char *q, tmp[20]; + int digit; + + if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { + base = 16; + p += 2; + } + + if (base == 16 && (q = strchr (p, '.')) != 0) { + if (q - p > sizeof(tmp) - 1) + return (0); + + strncpy (tmp, p, q - p); + tmp[q - p] = '\0'; + if (!_atob (&v1, tmp, 16)) + return (0); + + q++; + if (strchr (q, '.')) + return (0); + + if (!_atob (&v2, q, 16)) + return (0); + *vp = (v1 << 16) + v2; + return (1); + } + + value = *vp = 0; + for (; *p; p++) { + if (*p >= '0' && *p <= '9') + digit = *p - '0'; + else if (*p >= 'a' && *p <= 'f') + digit = *p - 'a' + 10; + else if (*p >= 'A' && *p <= 'F') + digit = *p - 'A' + 10; + else + return (0); + + if (digit >= base) + return (0); + value *= base; + value += digit; + } + *vp = value; + return (1); +} + +/* + * atob(vp,p,base) + * converts p to binary result in vp, rtn 1 on success + */ +int +atob(u_int32_t *vp, char *p, int base) +{ + u_quad_t v; + + if (base == 0) + p = _getbase (p, &base); + if (_atob (&v, p, base)) { + *vp = v; + return (1); + } + return (0); +} + + +/* + * llatob(vp,p,base) + * converts p to binary result in vp, rtn 1 on success + */ +int +llatob(u_quad_t *vp, char *p, int base) +{ + if (base == 0) + p = _getbase (p, &base); + return _atob(vp, p, base); +} + + +/* + * char *btoa(dst,value,base) + * converts value to ascii, result in dst + */ +char * +btoa(char *dst, u_int value, int base) +{ + char buf[34], digit; + int i, j, rem, neg; + + if (value == 0) { + dst[0] = '0'; + dst[1] = 0; + return (dst); + } + + neg = 0; + if (base == -10) { + base = 10; + if (value & (1L << 31)) { + value = (~value) + 1; + neg = 1; + } + } + + for (i = 0; value != 0; i++) { + rem = value % base; + value /= base; + if (rem >= 0 && rem <= 9) + digit = rem + '0'; + else if (rem >= 10 && rem <= 36) + digit = (rem - 10) + 'a'; + buf[i] = digit; + } + + buf[i] = 0; + if (neg) + strcat (buf, "-"); + + /* reverse the string */ + for (i = 0, j = strlen (buf) - 1; j >= 0; i++, j--) + dst[i] = buf[j]; + dst[i] = 0; + return (dst); +} + +/* + * char *btoa(dst,value,base) + * converts value to ascii, result in dst + */ +char * +llbtoa(char *dst, u_quad_t value, int base) +{ + char buf[66], digit; + int i, j, rem, neg; + + if (value == 0) { + dst[0] = '0'; + dst[1] = 0; + return (dst); + } + + neg = 0; + if (base == -10) { + base = 10; + if (value & (1LL << 63)) { + value = (~value) + 1; + neg = 1; + } + } + + for (i = 0; value != 0; i++) { + rem = value % base; + value /= base; + if (rem >= 0 && rem <= 9) + digit = rem + '0'; + else if (rem >= 10 && rem <= 36) + digit = (rem - 10) + 'a'; + buf[i] = digit; + } + + buf[i] = 0; + if (neg) + strcat (buf, "-"); + + /* reverse the string */ + for (i = 0, j = strlen (buf) - 1; j >= 0; i++, j--) + dst[i] = buf[j]; + dst[i] = 0; + return (dst); +} + +/* + * gethex(vp,p,n) + * convert n hex digits from p to binary, result in vp, + * rtn 1 on success + */ +int +gethex(int32_t *vp, char *p, int n) +{ + u_long v; + int digit; + + for (v = 0; n > 0; n--) { + if (*p == 0) + return (0); + if (*p >= '0' && *p <= '9') + digit = *p - '0'; + else if (*p >= 'a' && *p <= 'f') + digit = *p - 'a' + 10; + else if (*p >= 'A' && *p <= 'F') + digit = *p - 'A' + 10; + else + return (0); + + v <<= 4; + v |= digit; + p++; + } + *vp = v; + return (1); +} + +/* $Id: vsprintf.c,v 1.1.1.1 2006/08/23 17:03:06 pefo Exp $ */ + +/* + * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Opsycon AB. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +//#include +//#include +//#include +//#include +//#include + +void dtoa (char *dbuf, rtype arg, int fmtch, int width, int prec); + +/* + * int vsprintf(d,s,ap) + */ +int +c_vsprintf (char *d, const char *s, va_list ap) +{ + const char *t; + char *p, *dst, tmp[40]; + unsigned int n; + int fmt, trunc, haddot, width, base, longlong; + double dbl; +#ifndef NEWFP + EP ex; +#endif + + dst = d; + for (; *s;) { + if (*s == '%') { + s++; + fmt = FMT_RJUST; + width = trunc = haddot = longlong = 0; + for (; *s; s++) { + if (strchr("bcdefgilopPrRsuxX%", *s)) + break; + else if (*s == '-') + fmt = FMT_LJUST; + else if (*s == '0') + fmt = FMT_RJUST0; + else if (*s == '~') + fmt = FMT_CENTER; + else if (*s == '*') { + if (haddot) + trunc = va_arg(ap, int); + else + width = va_arg(ap, int); + } else if (*s >= '1' && *s <= '9') { + for (t = s; isdigit(*s); s++); + strncpy(tmp, t, s - t); + tmp[s - t] = '\0'; + atob(&n, tmp, 10); + if (haddot) + trunc = n; + else + width = n; + s--; + } else if (*s == '.') + haddot = 1; + } + if (*s == '%') { + *d++ = '%'; + *d = 0; + } else if (*s == 's') { + p = va_arg(ap, char *); + + if (p) + strcpy(d, p); + else + strcpy(d, "(null)"); + } else if (*s == 'c') { + n = va_arg (ap, int); + *d = n; + d[1] = 0; + } else { + if (*s == 'l') { + if (*++s == 'l') { + longlong = 1; + ++s; + } + } + if (strchr("bdiopPrRxXu", *s)) { + if (*s == 'd' || *s == 'i') + base = -10; + else if (*s == 'u') + base = 10; + else if (*s == 'x' || *s == 'X') + base = 16; + else if(*s == 'p' || *s == 'P') { + base = 16; + if (*s == 'p') { + *d++ = '0'; + *d++ = 'x'; + } + fmt = FMT_RJUST0; + if (sizeof(long) > 4) { + width = 16; + longlong = 1; + } else { + width = 8; + } + } + else if(*s == 'r' || *s == 'R') { + base = 16; + if (*s == 'r') { + *d++ = '0'; + *d++ = 'x'; + } + fmt = FMT_RJUST0; + if (sizeof(register_t) > 4) { + width = 16; + longlong = 1; + } else { + width = 8; + } + } + else if (*s == 'o') + base = 8; + else if (*s == 'b') + base = 2; + if (longlong) + llbtoa(d, va_arg (ap, quad_t), + base); + else + btoa(d, va_arg (ap, int), base); + + if (*s == 'X') + strtoupper(d); + } + else if (strchr ("eEfgG", *s)) { + dbl = va_arg(ap, double); + dtoa(d, dbl, *s, width, trunc); + trunc = 0; + } + } + if (trunc) + d[trunc] = 0; + if (width) + str_fmt (d, width, fmt); + for (; *d; d++); + s++; + } else + *d++ = *s++; + } + *d = 0; + return (d - dst); +} + +/* + * Floating point output, cvt() onward lifted from BSD sources: + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + + +#define MAX_FCONVERSION 512 /* largest possible real conversion */ +#define MAX_EXPT 5 /* largest possible exponent field */ +#define MAX_FRACT 39 /* largest possible fraction field */ + +#define TESTFLAG(x) 0 + + +typedef double rtype; + +extern double modf(double, double *); +#define to_char(n) ((n) + '0') +#define to_digit(c) ((c) - '0') +#define _isNan(arg) ((arg) != (arg)) + +static int cvt (rtype arg, int prec, char *signp, int fmtch, + char *startp, char *endp); +static char *c_round (double fract, int *exp, char *start, char *end, + char ch, char *signp); +static char *exponent(char *p, int exp, int fmtch); + + +/* + * _finite arg not Infinity or Nan + */ +static int _finite(rtype d) +{ +#if ENDIAN == ENDIAN_LITTLE + struct IEEEdp { + unsigned manl:32; + unsigned manh:20; + unsigned exp:11; + unsigned sign:1; + } *ip; +#else + struct IEEEdp { + unsigned sign:1; + unsigned exp:11; + unsigned manh:20; + unsigned manl:32; + } *ip; +#endif + + ip = (struct IEEEdp *)&d; + return (ip->exp != 0x7ff); +} + + +void dtoa (char *dbuf, rtype arg, int fmtch, int width, int prec) +{ + char buf[MAX_FCONVERSION+1], *cp; + char sign; + int size; + + if( !_finite(arg) ) { + if( _isNan(arg) ) + strcpy (dbuf, "NaN"); + else if( arg < 0) + strcpy (dbuf, "-Infinity"); + else + strcpy (dbuf, "Infinity"); + return; + } + + if (prec == 0) + prec = 6; + else if (prec > MAX_FRACT) + prec = MAX_FRACT; + + /* leave room for sign at start of buffer */ + cp = buf + 1; + + /* + * cvt may have to round up before the "start" of + * its buffer, i.e. ``intf("%.2f", (double)9.999);''; + * if the first character is still NUL, it did. + * softsign avoids negative 0 if _double < 0 but + * no significant digits will be shown. + */ + *cp = '\0'; + size = cvt (arg, prec, &sign, fmtch, cp, buf + sizeof(buf)); + if (*cp == '\0') + cp++; + + if (sign) + *--cp = sign, size++; + + cp[size] = 0; + memcpy (dbuf, cp, size + 1); +} + + +static int +cvt(rtype number, int prec, char *signp, int fmtch, char *startp, char *endp) +{ + register char *p, *t; + register double fract; + double integer, tmp; + int dotrim, expcnt, gformat; + + dotrim = expcnt = gformat = 0; + if (number < 0) { + number = -number; + *signp = '-'; + } else + *signp = 0; + + fract = modf(number, &integer); + + /* get an extra slot for rounding. */ + t = ++startp; + + /* + * get integer portion of number; put into the end of the buffer; the + * .01 is added for modf(356.0 / 10, &integer) returning .59999999... + */ + for (p = endp - 1; integer; ++expcnt) { + tmp = modf(integer / 10, &integer); + *p-- = to_char((int)((tmp + .01) * 10)); + } + switch (fmtch) { + case 'f': + /* reverse integer into beginning of buffer */ + if (expcnt) + for (; ++p < endp; *t++ = *p); + else + *t++ = '0'; + /* + * if precision required or alternate flag set, add in a + * decimal point. + */ + if (prec || TESTFLAG(ALTERNATE_FORM)) + *t++ = '.'; + /* if requires more precision and some fraction left */ + if (fract) { + if (prec) + do { + fract = modf(fract * 10, &tmp); + *t++ = to_char((int)tmp); + } while (--prec && fract); + if (fract) + startp = c_round(fract, (int *)NULL, startp, + t - 1, (char)0, signp); + } + for (; prec--; *t++ = '0'); + break; + case 'e': + case 'E': +eformat: if (expcnt) { + *t++ = *++p; + if (prec || TESTFLAG(ALTERNATE_FORM)) + *t++ = '.'; + /* if requires more precision and some integer left */ + for (; prec && ++p < endp; --prec) + *t++ = *p; + /* + * if done precision and more of the integer component, + * round using it; adjust fract so we don't re-round + * later. + */ + if (!prec && ++p < endp) { + fract = 0; + startp = c_round((double)0, &expcnt, startp, + t - 1, *p, signp); + } + /* adjust expcnt for digit in front of decimal */ + --expcnt; + } + /* until first fractional digit, decrement exponent */ + else if (fract) { + /* adjust expcnt for digit in front of decimal */ + for (expcnt = -1;; --expcnt) { + fract = modf(fract * 10, &tmp); + if (tmp) + break; + } + *t++ = to_char((int)tmp); + if (prec || TESTFLAG(ALTERNATE_FORM)) + *t++ = '.'; + } + else { + *t++ = '0'; + if (prec || TESTFLAG(ALTERNATE_FORM)) + *t++ = '.'; + } + /* if requires more precision and some fraction left */ + if (fract) { + if (prec) + do { + fract = modf(fract * 10, &tmp); + *t++ = to_char((int)tmp); + } while (--prec && fract); + if (fract) + startp = c_round(fract, &expcnt, startp, + t - 1, (char)0, signp); + } + /* if requires more precision */ + for (; prec--; *t++ = '0'); + + /* unless alternate flag, trim any g/G format trailing 0's */ + if (gformat && !TESTFLAG(ALTERNATE_FORM)) { + while (t > startp && *--t == '0'); + if (*t == '.') + --t; + ++t; + } + t = exponent(t, expcnt, fmtch); + break; + case 'g': + case 'G': + /* a precision of 0 is treated as a precision of 1. */ + if (!prec) + ++prec; + /* + * ``The style used depends on the value converted; style e + * will be used only if the exponent resulting from the + * conversion is less than -4 or greater than the precision.'' + * -- ANSI X3J11 + */ + if (expcnt > prec || (!expcnt && fract && fract < .0001)) { + /* + * g/G format counts "significant digits, not digits of + * precision; for the e/E format, this just causes an + * off-by-one problem, i.e. g/G considers the digit + * before the decimal point significant and e/E doesn't + * count it as precision. + */ + --prec; + fmtch -= 2; /* G->E, g->e */ + gformat = 1; + goto eformat; + } + /* + * reverse integer into beginning of buffer, + * note, decrement precision + */ + if (expcnt) + for (; ++p < endp; *t++ = *p, --prec); + else + *t++ = '0'; + /* + * if precision required or alternate flag set, add in a + * decimal point. If no digits yet, add in leading 0. + */ + if (prec || TESTFLAG(ALTERNATE_FORM)) { + dotrim = 1; + *t++ = '.'; + } + else + dotrim = 0; + /* if requires more precision and some fraction left */ + if (fract) { + if (prec) { + do { + fract = modf(fract * 10, &tmp); + *t++ = to_char((int)tmp); + } while(!tmp && !expcnt); + while (--prec && fract) { + fract = modf(fract * 10, &tmp); + *t++ = to_char((int)tmp); + } + } + if (fract) + startp = c_round(fract, (int *)NULL, startp, + t - 1, (char)0, signp); + } + /* alternate format, adds 0's for precision, else trim 0's */ + if (TESTFLAG(ALTERNATE_FORM)) + for (; prec--; *t++ = '0'); + else if (dotrim) { + while (t > startp && *--t == '0'); + if (*t != '.') + ++t; + } + } + return (t - startp); +} + + +static char * +c_round(double fract, int *exp, char *start, char *end, char ch, char *signp) +{ + double tmp; + + if (fract) + (void)modf(fract * 10, &tmp); + else + tmp = to_digit(ch); + if (tmp > 4) + for (;; --end) { + if (*end == '.') + --end; + if (++*end <= '9') + break; + *end = '0'; + if (end == start) { + if (exp) { /* e/E; increment exponent */ + *end = '1'; + ++*exp; + } + else { /* f; add extra digit */ + *--end = '1'; + --start; + } + break; + } + } + /* ``"%.3f", (double)-0.0004'' gives you a negative 0. */ + else if (*signp == '-') + for (;; --end) { + if (*end == '.') + --end; + if (*end != '0') + break; + if (end == start) + *signp = 0; + } + return (start); +} + +static char * +exponent(char *p, int exp, int fmtch) +{ + char *t; + char expbuf[MAX_FCONVERSION]; + + *p++ = fmtch; + if (exp < 0) { + exp = -exp; + *p++ = '-'; + } + else + *p++ = '+'; + t = expbuf + MAX_FCONVERSION; + if (exp > 9) { + do { + *--t = to_char(exp % 10); + } while ((exp /= 10) > 9); + *--t = to_char(exp); + for (; t < expbuf + MAX_FCONVERSION; *p++ = *t++); + } + else { + *p++ = '0'; + *p++ = to_char(exp); + } + return (p); +} + +int c_sprintf(char *str, const char *fmt, ...) +{ + va_list arg; + va_start(arg, fmt); + int ret = c_vsprintf(str, fmt, arg); + va_end(arg); + return ret; +} + +extern char AvaWds[]; +extern int ram_libgloss_write(int file, const char *ptr, int len); + +int c_printf(const char *fmt, ...) +{ + va_list arg; + va_start(arg, fmt); + int ret = c_vsprintf((char *)&AvaWds, fmt, arg); + va_end(arg); + return ram_libgloss_write(0, (char *)&AvaWds, ret); +} + +#endif // ENAC_FLOAT + +int puts (const char *s) +{ + while(*s) { + HalSerialPutcRtl8195a(*s++); + } +} + +void vTaskDelete(void *); + +void abort(void) +{ + + puts("Abort!\n"); + vTaskDelete(0); + while(1); +} + + + diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_libc.c b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_libc.c index 1b9132d..704a9d2 100644 --- a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_libc.c +++ b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_libc.c @@ -10,30 +10,31 @@ //------------------------------------------------------------------------- // Function declarations - -//void rtl_libc_init(); -//int rtl_snprintf(char *str, size_t size, const char *fmt, ...); -//int rtl_sprintf(char *str, const char *fmt, ...); -//int rtl_printf(const char *fmt, ...); -//int rtl_vprintf(const char *fmt, void *param); -//int rtl_vsnprintf(char *str, size_t size, const char *fmt, void *param); -//int rtl_vfprintf(FILE *fp, const char *fmt0, va_list ap); -//int rtl_memchr(const void *src_void, int c, size_t length); -//int rtl_memcmp(const void *m1, const void *m2, size_t n); -//int rtl_memcpy(void *dst0, const void *src0, size_t len0); -//int rtl_memmove(void *dst_void, const void *src_void, size_t length); -//int rtl_memset(void *m, int c, size_t n); -//char * rtl_strcat(char *s1, const char *s2); -//char * rtl_strchr(const char *s1, int i); -//int rtl_strcmp(const char *s1, const char *s2); -//char * rtl_strcpy(char *dst0, const char *src0); -//int rtl_strlen(const char *str); -//char * rtl_strncat(char *s1, const char *s2, size_t n); -//int rtl_strncmp(const char *s1, const char *s2, size_t n); -//char * rtl_strncpy(char *dst0, const char *src0, size_t count); -//char * rtl_strstr(const char *searchee, const char *lookfor); -//char * rtl_strsep(char **source_ptr, const char *delim); -//char * rtl_strtok(char *s, const char *delim); +#if 0 +void rtl_libc_init(void); +int rtl_snprintf(char *str, size_t size, const char *fmt, ...); +int rtl_sprintf(char *str, const char *fmt, ...); +int rtl_printf(const char *fmt, ...); +int rtl_vprintf(const char *fmt, void *param); +int rtl_vsnprintf(char *str, size_t size, const char *fmt, void *param); +int rtl_vfprintf(FILE *fp, const char *fmt0, va_list ap); +void * rtl_memchr(const void * src_void , int c , size_t length); +int rtl_memcmp(const void *m1, const void *m2, size_t n); +void * rtl_memcpy(void *dst0, const void *src0, size_t len0); +void * rtl_memmove(void *dst_void, const void *src_void, size_t length); +void * rtl_memset(void *m, int c, size_t n); +char * rtl_strcat(char *s1, const char *s2); +char * rtl_strchr(const char *s1, int i); +int rtl_strcmp(const char *s1, const char *s2); +char * rtl_strcpy(char *dst0, const char *src0); +size_t rtl_strlen(const char *str); +char * rtl_strncat(char *s1, const char *s2, size_t n); +int rtl_strncmp(const char *s1, const char *s2, size_t n); +char * rtl_strncpy(char *dst0, const char *src0, size_t count); +char * rtl_strstr(const char *searchee, const char *lookfor); +char * rtl_strsep(char **source_ptr, const char *delim); +char * rtl_strtok(char *s, const char *delim); +#endif // Extern Calls: // extern int init_rom_libgloss_ram_map(_DWORD) // extern int _rom_mallocr_init_v1_00(void) @@ -149,20 +150,20 @@ int rtl_printf(const char *fmt, ...) { } //----- rtl_vprintf() -int rtl_vprintf(const char *fmt, void *param) { +int rtl_vprintf(const char *fmt, va_list param) { #if CHECK_LIBC_INIT if (!libc_has_init) { rtl_libc_init(); } #endif int result = __rtl_vfprintf_r_v1_00(_rtl_impure_ptr, - _rtl_impure_ptr->_stdout, fmt, *(va_list *)param); + _rtl_impure_ptr->_stdout, fmt, param); __rtl_fflush_r_v1_00(_rtl_impure_ptr, _rtl_impure_ptr->_stdout); return result; } //----- rtl_vsnprintf() -int rtl_vsnprintf(char *str, size_t size, const char *fmt, void *param) { +int rtl_vsnprintf(char *str, size_t size, const char *fmt, va_list param) { int result; int w; int v11; @@ -183,7 +184,7 @@ int rtl_vsnprintf(char *str, size_t size, const char *fmt, void *param) { f._w = w; f._bf._size = w; f._file = -1; - result = __rtl_vfprintf_r_v1_00(_rtl_impure_ptr, &f, fmt, *(va_list *)param); + result = __rtl_vfprintf_r_v1_00(_rtl_impure_ptr, &f, fmt, param); if (result + 1 < 0) _rtl_impure_ptr->_errno = 139; if (size) diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_pvvx_libc.c b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_pvvx_libc.c index d1ec84a..026201a 100644 --- a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_pvvx_libc.c +++ b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_pvvx_libc.c @@ -8,33 +8,38 @@ #include "va_list.h" #define CHECK_LIBC_INIT 0 - //------------------------------------------------------------------------- // Function declarations //void libc_init(); -//int snprintf(char *str, size_t size, const char *fmt, ...); -//int sprintf(char *str, const char *fmt, ...); -//int printf(const char *fmt, ...); -//int vprintf(const char *fmt, void *param); -//int vsnprintf(char *str, size_t size, const char *fmt, void *param); -//int vfprintf(FILE *fp, const char *fmt0, va_list ap); -//int memchr(const void *src_void, int c, size_t length); -//int memcmp(const void *m1, const void *m2, size_t n); -//int memcpy(void *dst0, const void *src0, size_t len0); -//int memmove(void *dst_void, const void *src_void, size_t length); -//int memset(void *m, int c, size_t n); -//char * strcat(char *s1, const char *s2); -//char * strchr(const char *s1, int i); -//int strcmp(const char *s1, const char *s2); -//char * strcpy(char *dst0, const char *src0); -//int strlen(const char *str); -//char * strncat(char *s1, const char *s2, size_t n); -//int strncmp(const char *s1, const char *s2, size_t n); -//char * strncpy(char *dst0, const char *src0, size_t count); -//char * strstr(const char *searchee, const char *lookfor); -//char * strsep(char **source_ptr, const char *delim); -//char * strtok(char *s, const char *delim); +#if 0 +int snprintf(char *str, size_t size, const char *fmt, ...); +int sprintf(char *str, const char *fmt, ...); +int printf(const char *fmt, ...); +int vprintf(const char * fmt, __VALIST param); +int vsnprintf(char *str, size_t size, const char *fmt, __VALIST param); +int vfprintf(FILE *fp, const char *fmt0, va_list ap); +void * memchr(const void * src_void , int c , size_t length); +int memcmp(const void *m1, const void *m2, size_t n); +void * memcpy(void *dst0, const void *src0, size_t len0); +void * memmove(void *dst_void, const void *src_void, size_t length); +void * memset(void *m, int c, size_t n); +char * strcat(char *s1, const char *s2); +char * strchr(const char *s1, int i); +int strcmp(const char *s1, const char *s2); +char * strcpy(char *dst0, const char *src0); +size_t strlen(const char *str); +char * strncat(char *s1, const char *s2, size_t n); +int strncmp(const char *s1, const char *s2, size_t n); +char * strncpy(char *dst0, const char *src0, size_t count); +char * strstr(const char *searchee, const char *lookfor); +char * strsep(char **source_ptr, const char *delim); +char * strtok(char *s, const char *delim); +int sscanf(const char *buf, const char *fmt, ...); +char toupper(char ch); +int _stricmp (const char *s1, const char *s2); +unsigned long long __aeabi_llsr(unsigned long long val, unsigned int shift); +#endif // Extern Calls: // extern int init_rom_libgloss_ram_map(_DWORD) // extern int _rom_mallocr_init_v1_00(void) @@ -68,7 +73,6 @@ extern int libc_has_init; //------------------------------------------------------------------------- // Function - //----- snprintf() int snprintf(char *str, size_t size, const char *fmt, ...) { va_list args; @@ -104,6 +108,7 @@ int snprintf(char *str, size_t size, const char *fmt, ...) { return result; } +#ifndef ENAC_FLOAT //----- sprintf() int sprintf(char *str, const char *fmt, ...) { FILE f; @@ -145,17 +150,17 @@ int printf(const char *fmt, ...) { //----- vprintf() int vprintf(const char * fmt, __VALIST param) { -//int vprintf(const char *fmt, void *param) { #if CHECK_LIBC_INIT if (!libc_has_init) { rtl_libc_init(); } -#endif +#endif int result = __rtl_vfprintf_r_v1_00(_rtl_impure_ptr, _rtl_impure_ptr->_stdout, fmt, param); __rtl_fflush_r_v1_00(_rtl_impure_ptr, _rtl_impure_ptr->_stdout); return result; } +#endif // ENAC_FLOAT //----- vsnprintf() int vsnprintf(char *str, size_t size, const char *fmt, __VALIST param) { @@ -310,3 +315,226 @@ unsigned long long __aeabi_llsr(unsigned long long val, unsigned int shift) return ((unsigned long long)hi << 32) | lo; } + +/* +#undef __VFP_FP__ + +#if defined(__VFP_FP__) +typedef long __jmp_buf[10 + 8 + 1]; // d8-d15 fpu + fpscr +#else +typedef long __jmp_buf[10]; +#endif + +int setjmp(__jmp_buf buf) __attribute__ ((noinline)); +int setjmp(__jmp_buf buf) +{ + register void * r0 __asm__("r0") = buf; + __asm__( + "mov %%ip, %%sp\n" + "stmia %[store]!, {%%r4-%%r9, %%sl, %%fp, %%ip, %%lr}\n" +#if defined(__VFP_FP__) + "vstmia %[store]!, {%%d8-%%d15}\n" + "vmrs %%r1, fpscr\n" + "str %%r1, [%[store]], #4\n" +#endif + "mov.w %r0, #0\n" + : : [store] "r" (r0) :); +} + +void longjmp(__jmp_buf buf, long value) __attribute__((noreturn)); +void longjmp(__jmp_buf buf, long value) +{ + __asm__( + "ldmia %[load]!, {%%r4-%%r9, %%sl, %%fp, %%ip, %%lr}\n" +#if defined(__VFP_FP__) + "vldmia %[load]!, {%%d8-%%d15}\n" + "ldr %%r0, [%[load]], #4\n" + "vmsr fpscr, %%r0\n" +#endif + "mov %%sp, %%ip\n" + "movs %%r0, %%r1\n" + "it eq\n" + "moveq %%r0, #1\n" + "bx lr\n" + : : [load] "r" (buf), [value] "r" (value):); + __builtin_unreachable(); +} +*/ + +extern __attribute__ ((long_call)) unsigned int Rand(void); + +unsigned int rand(void) +{ + return Rand(); +} + + + +//----- rtl_dtoi() +int __aeabi_dtoi(double d) +{ + return __rtl_dtoi_v1_00(d); +} + +//----- __aeabi_dtoui() +int __aeabi_dtoui(double d) +{ + return __rtl_dtoui_v1_00(d); +} + +//----- __aeabi_i2f() +float __aeabi_i2f(int val) +{ + return __rtl_itof_v1_00(val); +} + +//----- __aeabi_i2d() +int __aeabi_i2d(int val) +{ + return __rtl_itod_v1_00(val); +} + +//----- __aeabi_ui2f() +float __aeabi_ui2f(unsigned int val) +{ + return __rtl_uitof_v1_00(val); +} + +//----- __aeabi_ui2d() +int __aeabi_ui2d(unsigned int val) +{ + return __rtl_uitod_v1_00(val); +} + +//----- __aeabi_itoa() +char * __aeabi_itoa(int value, char *string, int radix) +{ + return (char *)__rtl_ltoa_v1_00(value, string, radix); +} + +//----- __aeabi_ltoa() +char * __aeabi_ltoa(int value, char *string, int radix) +{ + return (char *)__rtl_ltoa_v1_00(value, string, radix); +} + +//----- __aeabi_utoa() +char * __aeabi_utoa(unsigned int value, char *string, int radix) +{ + return (char *)__rtl_ultoa_v1_00(value, string, radix); +} + +//----- __aeabi_ultoa() +char * __aeabi_ultoa(unsigned int value, char *string, int radix) +{ + return (char *)__rtl_ultoa_v1_00(value, string, radix); +} + +//----- __aeabi_ftol() +int __aeabi_ftol(float f) +{ + return __rtl_ftol_v1_00(f); +} + +//----- __aeabi_ftod() +int __aeabi_ftod(float f) +{ + return __rtl_ftod_v1_00(f); +} + +//----- __aeabi_dtof() +float __aeabi_dtof(double d) +{ + return __rtl_dtof_v1_00(d); +} + +//----- __aeabi_fadd() +float __aeabi_fadd(float a, float b) +{ + return __rtl_fadd_v1_00(a, b); +} + +//----- __aeabi_fsub() +float __aeabi_fsub(float a, float b) +{ + return __rtl_fsub_v1_00(a, b); +} + +//----- __aeabi_fmul() +float __aeabi_fmul(float a, float b) +{ + return __rtl_fmul_v1_00(a, b); +} + +//----- __aeabi_fdiv() +float __aeabi_fdiv(float a, float b) +{ + return __rtl_fdiv_v1_00(a, b); +} + +//----- __aeabi_dadd() +int __aeabi_dadd(double a, double b) +{ + return __rtl_dadd_v1_00(a, b); +} + +//----- __aeabi_dsub() +int __aeabi_dsub(double a, double b) +{ + return __rtl_dsub_v1_00(a, b); +} + +//----- __aeabi_dmul() +int __aeabi_dmul(double a, double b) +{ + return __rtl_dmul_v1_00(a, b); +} + +//----- __aeabi_ddiv() +int __aeabi_ddiv(double a, double b) +{ + return __rtl_ddiv_v1_00(a, b); +} + +//----- __aeabi_dcmpeq() +int __aeabi_dcmpeq(double a, double b) +{ + return __rtl_dcmpeq_v1_00(a, b); +} + +//----- __aeabi_dcmplt() +int __aeabi_dcmplt(double a, double b) +{ + return __rtl_dcmplt_v1_00(a, b); +} + +//----- __aeabi_dcmple() +int __aeabi_dcmple(double a, double b) +{ + return __rtl_dcmple_v1_00(a, b); +} + +//----- __aeabi_dcmpgt() +int __aeabi_dcmpgt(double a, double b) +{ + return __rtl_dcmpgt_v1_00(a, b); +} + +//----- __aeabi_fcmplt() +int __aeabi_fcmplt(float a, float b) +{ + return __rtl_fcmplt_v1_00(a, b); +} + +//----- __aeabi_fcmpgt() +int __aeabi_fcmpgt(float a, float b) +{ + return __rtl_fcmpgt_v1_00(a, b); +} + + + + + + + diff --git a/build/bin/ota.bin b/build/bin/ota.bin index ba9de9741f9c1f2eb368934701aea8bfa346bce0..514ff01e1d384423d52644e3d6df84289e87d464 100644 GIT binary patch delta 30362 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 Q%}UA}(iAU=J-s3R8=$@AHvj+t delta 30122 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 diff --git a/build/bin/ram_2.p.bin b/build/bin/ram_2.p.bin index bcf8cfca8370ef81190f590fe02483c2bd3669bf..db370c1cf6a7bba81ff9a27a6ce336350f960bea 100644 GIT binary patch delta 30357 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 diff --git a/build/bin/ram_all.bin b/build/bin/ram_all.bin index 3ebfe04f427dbd0aad6b04ab0c8d520bacc92fd2..665f37d4ae6e50bee9d9309eb146fd6e70227e75 100644 GIT binary patch delta 30616 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 H6FmO|^noCN delta 30374 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 diff --git a/build/obj/build.nmap b/build/obj/build.nmap index 0f5b9a0..6628a2d 100644 --- a/build/obj/build.nmap +++ b/build/obj/build.nmap @@ -1,24 +1,6 @@ U __aeabi_d2iz - U __aeabi_dadd - U __aeabi_dcmpge - U __aeabi_dcmpgt - U __aeabi_dcmple - U __aeabi_dcmplt - U __aeabi_dmul - U __aeabi_dsub U __aeabi_f2d - U __aeabi_fdiv - U __aeabi_i2d - U __aeabi_i2f - U __aeabi_ui2f - U __ctype_ptr__ - U cmd_update - U floor - U free - U localtime - U malloc U mfl_code_to_length - U pow 00000000 A __vectors_table 00000000 D __rom_image_end__ 00000000 D __rom_image_start__ @@ -911,19 +893,19 @@ 10008758 T rtl_strncmp 10008760 T rtl_strncpy 10008768 T rtl_strsep -10008770 T memcpy -10008778 T memset -10008780 T sscanf -1000879a T __aeabi_llsr -100087b0 T ram_libgloss_close -100087c0 T ram_libgloss_fstat -100087e0 T ram_libgloss_isatty -100087ec T ram_libgloss_lseek -100087fc T ram_libgloss_read -1000880c T ram_libgloss_sbrk -10008828 T ram_libgloss_write -10008848 T ram_libgloss_open -10008884 T init_rom_libgloss_ram_map +10008770 T ram_libgloss_close +10008780 T ram_libgloss_fstat +100087a0 T ram_libgloss_isatty +100087ac T ram_libgloss_lseek +100087bc T ram_libgloss_read +100087cc T ram_libgloss_sbrk +100087e8 T ram_libgloss_write +10008808 T ram_libgloss_open +10008844 T init_rom_libgloss_ram_map +1000888c T memcpy +10008894 T memset +1000889c T sscanf +100088b6 T __aeabi_llsr 100088cc T wlan_init_done_callback 100088d0 T read_wifi_cfg 10008918 T write_wifi_cfg @@ -934,2267 +916,2267 @@ 100089c0 T StartStDHCPClient 10008a4c T _wifi_on 10008af8 T _LwIP_Init -10008ba4 T translate_rtw_security -10008bc8 T show_wifi_ap_ip -10008bfc T wifi_run_ap -10008d1c T show_wifi_st_ip -10008d50 T wifi_run_st -10008e0c T wifi_run -10008ef8 T wifi_init_thrd -10008f54 T fATWR -10008f70 T show_wifi_st_cfg -10008fc0 T fATPN -10009090 T show_wifi_ap_cfg -100090fc T fATPA -100091d8 T show_wifi_cfg -10009238 T fATWI -1000934c t mp3_cfg_read -100093ac T tskmad -100095c8 T render_sample_block -1000963c T set_dac_sample_rate -10009680 T getIpForHost -100096a4 T openConn -100097c8 T http_head_read -10009900 T tskreader -10009ac8 T connect_close -10009af0 T connect_start -10009b90 T fATWS -10009c70 T ShowMemInfo -10009c9c T main -10009cf4 T fATST -10009d64 T fATSD -10009d6c T fATSW -10009d74 T fATDS -10009d98 T print_hex_dump -10009dc8 T dump_bytes -10009e5c T fATSB -10009e94 T print_udp_pcb -10009f00 T print_tcp_pcb -10009fd8 T fATLW -10009fe8 T RamFifoClose -1000a044 T RamFifoInit -1000a198 T RamFifoRead -1000a254 T RamFifoWrite -1000a308 T RamFifoFill -1000a334 T RamFifoFree -1000a348 T RamFifoLen -1000a354 t decode_header -1000a4c4 T mad_header_init -1000a4f0 T mad_frame_finish -1000a508 T mad_header_decode -1000a7a4 T mad_frame_decode -1000a828 T mad_frame_mute -1000a872 T mad_frame_init -1000a890 t III_requantize -1000a90c t III_aliasreduce -1000a974 t fastsdct -1000aaac t III_imdct_l -1000aec4 t III_imdct_s -1000b018 t III_overlap -1000b042 t III_freqinver -1000b08c t III_decode -1000c0a8 T mad_layer_III -1000c50c T mad_bit_init -1000c518 T mad_bit_length -1000c530 T mad_bit_nextbyte -1000c53c T mad_bit_skip -1000c56c T mad_bit_read -1000c5d8 T mad_bit_crc -1000c6cc t scale -1000c6d8 t dct32 -1000cf6c t synth_half -1000d3b0 t synth_full -1000d804 T mad_synth_mute -1000d83c T mad_synth_init -1000d860 T mad_synth_frame -1000d8f4 t scale_rational -1000d968 T mad_timer_set -1000da50 T mad_stream_init -1000da82 T mad_stream_finish -1000da94 T mad_stream_buffer -1000daa8 T mad_stream_sync -1000daf0 T mad_stream_errorstr -1000dc4c t i2s_test_tx_complete -1000dc64 T i2sClose -1000dcf0 T i2sInit -1000de64 T i2sSetRate -1000deec T i2sPushPWMSamples -1000e054 T SystemCoreClockUpdate -1000e068 W console_help -1000e0a8 T GetArgvRam -1000e160 T get_eap_phase -1000e16c T get_eap_method -1000e178 T eap_autoreconnect_hdl -1000e17c t wifi_no_network_hdl -1000e194 t wifi_ap_sta_disassoc_hdl -1000e198 t wifi_handshake_done_hdl -1000e1b4 t wifi_disconn_hdl -1000e21c t wifi_connected_hdl -1000e250 t wifi_connect_local -1000e364 T wifi_autoreconnect_hdl -1000e3a0 t wifi_ap_sta_assoc_hdl -1000e3a2 T wifi_rx_beacon_hdl -1000e3a4 T wifi_connect -1000e628 t wifi_autoreconnect_thread -1000e690 T wifi_set_country -1000e69c T wifi_off -1000e708 T wifi_start_ap -1000e7e8 T wifi_get_setting -1000e898 T wifi_show_setting -1000e95c T wifi_config_autoreconnect -1000e980 T wifi_indication -1000e9bc T wifi_reg_event_handler -1000ea10 T wifi_unreg_event_handler -1000ea54 T init_event_callback_list -1000ea64 T promisc_deinit -1000ea68 T promisc_recv_func -1000ea6c T promisc_set -1000ea70 T is_promisc_enabled -1000ea7a T iw_ioctl -1000ea96 T wext_get_ssid -1000eae0 T wext_set_ssid -1000eb14 T is_broadcast_ether_addr -1000eb36 T wext_set_auth_param -1000eb64 T wext_set_key_ext -1000ec64 T wext_get_enc_ext -1000ecc6 T wext_set_passphrase -1000ecfa T wext_get_passphrase -1000ed2a T wext_set_mode -1000ed4e T wext_get_mode -1000ed78 T wext_set_ap_ssid -1000edac T wext_set_country -1000edd0 T wext_set_channel -1000edfe T wext_get_channel -1000ee2c T wext_wlan_indicate -1000ef74 T wext_set_autoreconnect -1000efc4 T wext_set_adaptivity -1000efec T wext_set_sta_num -1000eff0 T LwIP_DHCP -1000f0e4 T LwIP_GetIP -1000f0e8 T LwIP_AUTOIP -1000f164 t netconn_recv_data -1000f234 T netconn_new_with_proto_and_callback -1000f294 T netconn_delete -1000f2b8 T netconn_getaddr -1000f2fc T netconn_connect -1000f33c T netconn_recv_tcp_pbuf -1000f350 T netconn_recv -1000f3d8 T netconn_recved -1000f404 T netconn_send -1000f440 T netconn_write_partly -1000f4d0 T netconn_gethostbyname -1000f528 t recv_udp -1000f598 t recv_raw -1000f61c t setup_tcp -1000f660 t err_tcp -1000f6f8 t do_connected -1000f764 t do_writemore -1000f864 t do_close_internal -1000f950 t poll_tcp -1000f9a0 t do_dns_found -1000f9cc t sent_tcp -1000fa1a t recv_tcp -1000fa94 T do_newconn -1000fb24 T netconn_alloc -1000fb90 T netconn_free -1000fbbc t netconn_drain -1000fc4c T do_delconn -1000fcd8 T do_connect -1000fd6c T do_send -1000fddc T do_recv -1000fe1c T do_write -1000fe56 T do_getaddr -1000fecc T do_gethostbyname -1000fef8 T netbuf_delete -1000ff18 T netbuf_free -1000ff2e T netbuf_ref -1000ff68 T lwip_gethostbyname -1000ffb4 t get_socket -1000ffd4 t alloc_socket -10010044 t event_callback -10010174 T lwip_socket_init -10010176 T lwip_close -100101c8 T lwip_connect -10010224 T lwip_recvfrom -100103dc T lwip_read -100103f0 T lwip_sendto -1001049c T lwip_send -10010514 T lwip_socket -10010588 T lwip_write -10010590 t tcpip_thread -10010614 T tcpip_input -1001065c T tcpip_callback_with_block -100106b0 T tcpip_timeout -100106f4 T tcpip_apimsg -1001074c T tcpip_init -10010790 t autoip_start_probing -100107dc t autoip_arp_announce -10010808 T autoip_start -1001089c T autoip_tmr -100109ac T autoip_arp_reply -10010a54 t icmp_send_response.isra.0 -10010ac4 T icmp_input -10010be8 T icmp_dest_unreach -10010bf2 T icmp_time_exceeded -10010bfc t igmp_send -10010ca0 t igmp_delaying_member -10010cd8 t igmp_lookup_group.part.1 -10010d10 T igmp_init -10010d2c T igmp_report_groups -10010d50 T igmp_lookfor_group -10010d70 T igmp_start -10010dac T igmp_input -10010e70 T igmp_tmr -10010e9c t lwip_standard_chksum -10010ef4 T inet_chksum_pseudo -10010f7a T inet_chksum -10010f86 T inet_chksum_pbuf -10010fcc T ip_route -10011008 T ip_input -100111e0 T ip_output_if_opt -10011334 T ip_output_if -10011356 T ip_output -1001138e T ip4_addr_isbroadcast -100113c6 T ipaddr_aton -100114dc T ipaddr_addr -100114f4 T ipaddr_ntoa_r -1001158c T ipaddr_ntoa -10011598 t ipfrag_free_pbuf_custom -100115b0 t ip_reass_free_complete_datagram -10011630 t ip_reass_remove_oldest_datagram -100116a4 T ip_reass_tmr -100116cc T ip_reass -1001197c T ip_frag -10011ae8 T lwip_htons -10011aee T lwip_ntohs -10011af4 T lwip_htonl -10011af8 T lwip_ntohl -10011afc t dhcp_set_state -10011b0c t dhcp_option -10011b2c t dhcp_option_byte -10011b3e t dhcp_option_short -10011b60 t dhcp_option_long -10011ba4 t dhcp_create_msg -10011cf4 t dhcp_delete_msg -10011d0a t dhcp_check -10011d30 t dhcp_bind -10011e04 t dhcp_option_trailer -10011e30 t dhcp_discover -10011ee4 t dhcp_reboot -10011f88 t dhcp_option_hostname.isra.1 -10011fc8 t dhcp_rebind -1001205c t dhcp_select -10012148 t dhcp_recv -1001254c T dhcp_arp_reply -100125cc T dhcp_renew -10012660 T dhcp_release -10012708 T dhcp_coarse_tmr -10012794 T dhcp_fine_tmr -10012830 T dhcp_release_unicast -100128f4 T dhcp_stop -10012924 T dhcp_start -100129c4 t dns_parse_name -100129e0 t dns_recv -10012b74 t dns_send -10012c44 t dns_check_entry -10012cf4 T dns_setserver -10012d14 T dns_init -10012d6c T dns_tmr -10012d98 T dns_gethostbyname -10012ed8 T lwip_init -10012f00 T sys_timeout -10012f60 T tcp_timer_needed -10012f94 t tcpip_tcp_timer -10012fcc T sys_timeouts_init -10013040 t dns_timer -1001305c t igmp_timer -10013074 t autoip_timer -1001308c t dhcp_timer_fine -100130a8 t dhcp_timer_coarse -100130c4 t arp_timer -100130e0 t ip_reass_timer -100130fc T sys_untimeout -10013144 T sys_timeouts_mbox_fetch -100131a8 T netif_init -100131ac T netif_set_ipaddr -10013204 T netif_set_addr -10013220 T netif_add -10013284 T netif_set_gw -1001328c T netif_set_netmask -10013294 T netif_set_default -100132a0 T netif_set_up -100132d6 T netif_set_down -100132f0 t pbuf_free_ooseq_callback -10013324 t pbuf_pool_is_empty -10013360 T pbuf_alloced_custom -100133b4 T pbuf_header -1001340c T pbuf_free -1001344c T pbuf_alloc -10013570 T pbuf_realloc -100135a4 T pbuf_clen -100135b4 T pbuf_ref -100135ce T pbuf_cat -100135ea T pbuf_chain -100135fa T pbuf_copy -10013696 T pbuf_copy_partial -100136fe T pbuf_coalesce -1001372c T raw_input -100137a4 T raw_connect -100137ae T raw_recv -100137b4 T raw_sendto -10013844 T raw_send -1001384c T raw_remove -10013874 T raw_new -100138a8 t tcp_new_port -100138f8 T tcp_init -10013910 T tcp_update_rcv_ann_wnd -10013946 T tcp_recved -10013980 T tcp_seg_free -1001399a T tcp_segs_free -100139ac T tcp_seg_copy -100139d4 T tcp_arg -100139d8 T tcp_recv -100139de T tcp_sent -100139e4 T tcp_err -100139ea T tcp_accept -100139ee T tcp_poll -100139f8 T tcp_pcb_purge -10013a38 T tcp_slowtmr -10013cf4 T tcp_pcb_remove -10013d5c t tcp_close_shutdown -10013e8c T tcp_close -10013ea4 T tcp_recv_null -10013ec8 T tcp_process_refused_data -10013f28 T tcp_fasttmr -10013fa0 T tcp_tmr -10013fc4 T tcp_shutdown -10014014 T tcp_abandon -100140ac T tcp_abort -100140b4 T tcp_next_iss -100140cc T tcp_alloc -100141ec T tcp_new -100141f2 T tcp_eff_send_mss -10014210 T tcp_connect -1001436c t tcp_oos_insert_segment -100143ec t tcp_receive -10014bc4 t tcp_parseopt.isra.0 -10014c48 T tcp_input -100154a0 t tcp_pbuf_prealloc -100154f4 t tcp_create_segment -100155bc t tcp_output_alloc_header.constprop.0 -10015626 T tcp_write -10015976 T tcp_enqueue_flags -10015a1e T tcp_send_fin -10015a66 T tcp_send_empty_ack -10015ac4 T tcp_output -10015d3c T tcp_rst -10015dd4 T tcp_rexmit_rto -10015e02 T tcp_rexmit -10015e52 T tcp_rexmit_fast -10015ea8 T tcp_keepalive -10015efa T tcp_zero_window_probe -10015fa4 T udp_init -10015fbc T udp_input -10016144 T udp_bind -100161ec T udp_sendto_if -100162ea T udp_sendto -10016320 T udp_send -1001632c T udp_connect -10016374 T udp_disconnect -10016384 T udp_recv -1001638c T udp_remove -100163b4 T udp_new -100163d8 t etharp_free_entry -10016408 t etharp_find_entry -100164e4 t etharp_send_ip -10016518 T etharp_tmr -10016558 T etharp_cleanup_netif -10016580 T etharp_raw -1001663c T etharp_request -10016668 t etharp_output_to_arp_index -100166b0 T etharp_query -100167b4 T etharp_output -100168ac T ethernet_input -10016a9c t low_level_output -10016af8 t arp_timer -10016b14 T ethernetif_recv -10016b8c T ethernetif_init -10016bd0 T lwip_POST_SLEEP_PROCESSING -10016bec T rltk_wlan_set_netif_info -10016c0c T rltk_wlan_send -10016ca0 T rltk_wlan_recv -10016d00 T netif_is_valid_IP -10016d34 T netif_get_idx -10016d4c T netif_rx -10016d5c T netif_post_sleep_processing -10016d60 T sys_mbox_new -10016d7a T sys_mbox_free -10016d8e T sys_mbox_post -10016dae T sys_mbox_trypost -10016dd0 T sys_arch_mbox_fetch -10016e1a T sys_arch_mbox_tryfetch -10016e3a T sys_mbox_valid -10016e44 T sys_mbox_set_invalid -10016e4a T sys_sem_new -10016e86 T sys_arch_sem_wait -10016ec6 T sys_sem_signal -10016ed2 T sys_sem_free -10016ed8 T sys_sem_valid -10016ee2 T sys_sem_set_invalid -10016ee8 T sys_init -10016f0c T sys_thread_new_tcm -10016f74 T sys_arch_protect -10016f7e T sys_arch_unprotect -10016f84 t add_offer_options -10017040 t mark_ip_in_table -10017084 t dhcps_initialize_message -10017134 T dhcps_handle_state_machine_change -10017204 t dhcps_receive_udp_packet_handler -100174d0 T dhcps_deinit -100174f8 T dhcps_init -10017600 t prvInsertBlockIntoFreeList -10017648 t vPortDefineHeapRegions.constprop.1 -100176e8 T pvPortMalloc -100177c8 T __vPortFree -1001780c T vPortSetExtFree -10017828 T vPortFree -10017858 T xPortGetFreeHeapSize -10017864 t prvPortStartFirstTask -10017884 T pxPortInitialiseStack -100178a0 T vPortSVCHandler -100178c0 t pxCurrentTCBConst2 -100178c4 T vPortYield -100178dc T ulPortSetInterruptMask -100178ec t prvTaskExitError -100178f4 T vPortEnterCritical -10017910 T vPortClearInterruptMask -10017918 T vPortExitCritical -1001792c T xPortPendSVHandler -1001796c t pxCurrentTCBConst -10017970 T xPortSysTickHandler -10017994 W vPortSuppressTicksAndSleep -10017aac W vPortSetupTimerInterrupt -10017afc T xPortStartScheduler -10017b2c T vApplicationIdleHook -10017b30 T vApplicationStackOverflowHook -10017b4c T osKernelSysTick -10017b50 T vListInitialise -10017b66 T vListInitialiseItem -10017b6c T vListInsertEnd -10017b84 T vListInsert -10017bb4 T uxListRemove -10017bd4 t prvCopyDataToQueue -10017c3e t prvCopyDataFromQueue -10017c66 t prvUnlockQueue -10017cce T xQueueGenericReset -10017d28 T xQueueGenericCreate -10017d74 T xQueueCreateCountingSemaphore -10017d86 T xQueueGenericSend -10017e64 T xQueueCreateMutex -10017eae T xQueueGenericSendFromISR -10017f12 T xQueueGenericReceive -10018016 T uxQueueMessagesWaiting -10018028 T vQueueDelete -1001803e T vQueueWaitForMessageRestricted -10018078 t prvGenerateRunTimeOfPeroid -100180b8 t prvGetExpectedIdleTime -100180e8 t prvListTaskWithinSingleList -100181d0 t prvResetNextTaskUnblockTime -100181f4 t prvAddCurrentTaskToDelayedList -10018244 T xTaskGenericCreate -100183f8 T vTaskDelete -10018498 T uxTaskPriorityGet -100184b4 T vTaskPrioritySet -1001856c T vTaskStartScheduler -100185c4 T vTaskSuspendAll -100185d4 T xTaskGetTickCount -100185ec T pcTaskGetTaskName -100185fc T vTaskStepTick -1001860c T xTaskIncrementTick -1001878c T xTaskResumeAll -10018854 T vTaskDelay -100188a4 t prvIdleTask -1001892c T uxTaskGetSystemState -100189dc T vTaskSwitchContext -10018a94 T vTaskPlaceOnEventList -10018af0 T vTaskPlaceOnEventListRestricted -10018b34 T xTaskRemoveFromEventList -10018ba4 T vTaskSetTimeOutState -10018bbc T xTaskCheckForTimeOut -10018c08 T vTaskMissedYield -10018c14 T eTaskConfirmSleepModeStatus -10018c34 T xTaskGetSchedulerState -10018c54 T vTaskPriorityInherit -10018ce8 T xTaskPriorityDisinherit -10018d58 T sprintf_pcTaskName -10018d78 T vTaskList -10018e28 T vTaskGetRunTimeStats -10018ee8 T pvTaskIncrementMutexHeldCount -10018f00 T vTaskGetCurrentTCB -10018f0c t prvCheckForValidListAndQueue -10018f58 t prvInsertTimerInActiveList -10018f94 T xTimerCreateTimerTask -10018fd0 T xTimerCreate -1001900c T xTimerGenericCommand -100190a0 t prvSwitchTimerLists -10019110 t prvTimerTask -10019274 T xTimerIsTimerActive -1001928c t device_mutex_init -100192d0 T device_mutex_lock -10019300 T device_mutex_unlock -1001931c t _freertos_systime_to_sec -10019326 t _freertos_ms_to_systime -10019328 t _freertos_sec_to_systime -10019330 t _freertos_usleep_os -10019332 t _freertos_ATOMIC_SET -10019336 t _freertos_ATOMIC_READ -1001933a t _freertos_modular64 -100193ae t _freertos_thread_enter -100193b0 t _freertos_enter_critical -100193b4 t _freertos_exit_critical -100193b8 t _freertos_ATOMIC_SUB_RETURN -100193d0 t _freertos_ATOMIC_DEC_RETURN -100193e6 t _freertos_ATOMIC_ADD_RETURN -100193fe t _freertos_ATOMIC_INC_RETURN -10019414 t _freertos_ATOMIC_SUB -1001942c t _freertos_ATOMIC_DEC -10019432 t _freertos_ATOMIC_ADD -1001944a t _freertos_ATOMIC_INC -10019450 t _freertos_enter_critical_from_isr -10019460 T _freertos_malloc -10019464 T _freertos_zmalloc -1001947c t _freertos_memset -10019480 T _freertos_mfree -10019484 t _freertos_get_current_time -10019488 t _freertos_spinunlock_irqsave -1001949e t _freertos_spinunlock -100194aa t _freertos_mutex_put -100194ae T _freertos_wakeup_task -100194b4 t _freertos_up_sema -100194b8 t _freertos_exit_critical_mutex -100194c4 T _freertos_timerCreate -100194c8 T _freertos_timerDelete -100194dc T _freertos_timerStop -100194f0 T _freertos_timerChangePeriod -1001950a T _freertos_timerIsTimerActive -1001950e T _freertos_acquire_wakelock -10019514 T _freertos_release_wakelock -1001951a T _freertos_get_scheduler_state -1001953a t _freertos_thread_exit -10019540 t _freertos_GetFreeHeapSize -10019544 t _freertos_yield_os -10019548 t _freertos_udelay_os -1001954c t _freertos_mdelay_os -10019550 t _freertos_deinit_xqueue -1001956a t _freertos_spinlock_free -1001957c t _freertos_mutex_free -10019580 t _freertos_free_sema -10019584 t _freertos_push_to_xqueue -100195ac t _freertos_pop_from_xqueue -100195d4 t _freertos_down_sema -100195f6 t _freertos_init_xqueue -10019610 t _freertos_spinlock_irqsave -1001964c t _freertos_spinlock -10019684 t _freertos_enter_critical_mutex -100196bc t _freertos_mutex_get -100196f4 t _freertos_spinlock_init -10019702 t _freertos_mutex_init -10019708 t _freertos_exit_critical_from_isr -10019714 t _freertos_up_sema_from_isr -1001973c t _freertos_init_sema -1001974c t _freertos_create_task -100197c4 t _freertos_memcmp -100197d2 t _freertos_memcpy -100197d8 t _freertos_delete_task -10019824 t _freertos_mutex_get_timeout -10019860 t _freertos_systime_to_ms -10019862 t _freertos_msleep_os -10019866 T save_and_cli -1001986a T restore_flags -1001986e T cli -10019874 T _freertos_arc4random -100198a4 t _freertos_get_random_bytes -100198e2 T RtlInitSema -100198f0 T RtlUpSemaFromISR -10019910 T RtlDownSema -10019924 T RtlUdelayOS -10019928 T _htons -1001992e T _ntohs -10019934 T _rtw_zvmalloc -10019954 T _rtw_vmfree -10019978 T _rtw_malloc -10019988 T _rtw_zmalloc -10019998 T _rtw_mfree -100199a8 T deinit_mem_monitor -100199aa T rtw_vmfree -100199ae T rtw_mfree -100199b4 T rtw_memcpy -100199c4 T rtw_memcmp -100199d4 T rtw_memset -100199e4 T rtw_init_listhead -100199ea T rtw_is_list_empty -100199f4 T rtw_list_insert_head -10019a00 T rtw_list_insert_tail -10019a0c T rtw_list_delete -10019a1c T rtw_init_sema -10019a2c T rtw_free_sema -10019a3c T rtw_up_sema -10019a4c T rtw_up_sema_from_isr -10019a5c T rtw_down_timeout_sema -10019a6c T rtw_down_sema -10019a80 T rtw_mutex_init -10019a90 T rtw_mutex_free -10019aa0 T rtw_mutex_put -10019ab0 T rtw_mutex_get_timeout -10019ac4 T rtw_enter_critical_from_isr -10019ad4 T rtw_enter_critical -10019ad8 T rtw_exit_critical_from_isr -10019ae8 T rtw_exit_critical -10019aec T rtw_enter_critical_mutex -10019afc T rtw_exit_critical_mutex -10019b0c T rtw_queue_empty -10019b16 T rtw_end_of_queue_search -10019b20 T rtw_spinlock_init -10019b30 T rtw_init_queue -10019b3c T rtw_spinlock_free -10019b4c T rtw_spin_lock -10019b5c T rtw_enter_critical_bh -10019b60 T rtw_spin_unlock -10019b70 T rtw_exit_critical_bh -10019b74 T rtw_get_current_time -10019b84 T rtw_systime_to_ms -10019b98 T rtw_systime_to_sec -10019bac T rtw_ms_to_systime -10019bc0 T rtw_sec_to_systime -10019bd4 T rtw_get_passing_time_ms -10019be8 T rtw_msleep_os -10019bf8 T rtw_usleep_os -10019c08 T rtw_mdelay_os -10019c18 T rtw_udelay_os -10019c28 T ATOMIC_SET -10019c38 T ATOMIC_INC -10019c48 T ATOMIC_INC_RETURN -10019c5c T ATOMIC_DEC_RETURN -10019c70 T ATOMIC_DEC_AND_TEST -10019c80 T rtw_modular64 -10019c9c T rtw_get_random_bytes -10019cb0 T rtw_getFreeHeapSize -10019cc0 T init_mem_monitor -10019cd0 T add_mem_usage -10019d04 T rtw_zvmalloc -10019d24 T rtw_malloc -10019d44 T rtw_zmalloc -10019d64 T rtw_netif_queue_stopped -10019d68 T rtw_netif_wake_queue -10019d6a T rtw_netif_start_queue -10019d6c T rtw_netif_stop_queue -10019d6e T flush_signals_thread -10019d70 T rtw_acquire_wakelock -10019d80 T rtw_release_wakelock -10019d90 T rtw_create_task -10019dac T rtw_delete_task -10019dbc T rtw_wakeup_task -10019dcc T rtw_timerCreate -10019de8 T rtw_timerDelete -10019dfc T rtw_timerIsTimerActive -10019e10 T rtw_timerStop -10019e24 T rtw_timerChangePeriod -10019e38 T rtw_thread_enter -10019e48 T rtw_thread_exit -10019e58 T tcm_heap_free -10019ed8 T tcm_heap_init -10019f28 T tcm_heap_freeSpace -10019f68 T tcm_heap_malloc -1001a008 T tcm_heap_calloc -1001a020 T flash_init -1001a0bc T flash_turnon -1001a0d4 T flash_erase_sector -1001a100 T flash_stream_read -1001a1d0 T flash_stream_write -1001a328 T i2s_init -1001a400 T i2s_set_dma_buffer -1001a452 T i2s_tx_irq_handler -1001a458 T i2s_set_param -1001a48c T i2s_deinit -1001a490 T i2s_enable -1001a494 T i2s_disable -1001a498 W pinmap_merge -1001a4d4 W pinmap_find_peripheral -1001a4ec W pinmap_peripheral -1001a524 T sleep_ex_selective -1001a538 T deepsleep_ex -1001a55c T us_ticker_read -1001a588 T En32KCalibration -1001a61c T WDGInitial -1001a6a8 T WDGStart -1001a6c0 T WDGRefresh -1001a6dc T I2SISRHandle -1001a798 T RtkI2SDeInit -1001a878 T RtkI2SEnable -1001a8b4 T RtkI2SDisable -1001a8f0 T RtkI2SLoadDefault -1001a954 T HalI2SOpInit -1001a9d0 T RtkI2SInit -1001ab94 T HalI2SInit -1001abd2 T HalI2SDisable -1001abf8 T HalI2SEnable -1001ac1c T HalI2SDeInit -1001ac74 T HalTimerOpInit_Patch -1001acb0 T freertos_ready_to_sleep -1001acc0 T freertos_pre_sleep_processing -1001ad84 T freertos_post_sleep_processing -1001ada8 T acquire_wakelock -1001ade8 T release_wakelock -1001ae44 T HalI2SInitRtl8195a_Patch -1001af46 T HalI2SSetRateRtl8195a -1001af8c T HalI2SSetWordLenRtl8195a -1001afb4 T HalI2SSetChNumRtl8195a -1001afdc T HalI2SSetPageNumRtl8195a -1001b004 T HalI2SSetPageSizeRtl8195a -1001b02e T HalI2SSetDMABufRtl8195a -1001b098 T HalI2SGetTxPageRtl8195a -1001b0b8 T HalI2SPageSendRtl8195a -1001b104 T HalI2SClearAllOwnBitRtl8195a -1001b138 T HalI2SDMACtrlRtl8195a -1001b13c T HalTimerIrq2To7Handle_Patch -1001b190 T HalTimerIrqRegisterRtl8195a_Patch -1001b20c T HalTimerIrqUnRegisterRtl8195a_Patch -1001b284 T HalTimerDeInitRtl8195a_Patch -1001b2b8 T HalTimerReadCountRtl8195a_Patch -1001b2d0 T HalTimerReLoadRtl8195a_Patch -1001b304 T HalTimerInitRtl8195a_Patch -1001b3d8 T HalTimerIrqEnRtl8195a -1001b3ec T HalTimerEnRtl8195a_Patch -1001b400 T HalTimerDisRtl8195a_Patch -1001b414 t rtw_ht_operation_update -1001b4c6 t associated_clients_update.part.11 -1001b502 T chk_sta_is_alive -1001b540 T add_RATid -1001b648 T update_sta_info_apmode -1001b700 T update_beacon -1001b9c0 T rtw_check_beacon_data -1001c0c0 T associated_clients_update -1001c0ca T bss_cap_update_on_sta_join -1001c27a T bss_cap_update_on_sta_leave -1001c376 T ap_free_sta -1001c428 T expire_timeout_chk -1001c564 T rtw_sta_flush -1001c5e8 T free_mlme_ap_info -1001c634 T sta_info_update -1001c670 T ap_sta_info_defer_update -1001c6a0 T start_ap_mode -1001c6e0 T init_mlme_ap_info -1001c6f6 T stop_ap_mode -1001c744 T rtw_generate_bcn_ie -1001ca68 T _rtw_init_evt_priv -1001ca7a T _rtw_free_cmd_priv -1001ca84 T _rtw_enqueue_cmd -1001cab0 T _rtw_dequeue_cmd -1001cae4 T _rtw_observequeue_cmd -1001caf8 T rtw_init_cmd_priv -1001cb02 T rtw_init_evt_priv -1001cb06 T rtw_free_evt_priv -1001cb08 T rtw_free_cmd_priv -1001cb0c T rtw_cmd_filter -1001cb2a T rtw_free_cmd_obj -1001cb54 T rtw_enqueue_cmd -1001cbaa T rtw_set_channel_plan_cmd_callback -1001cbc2 T rtw_survey_cmd_callback -1001cbde T rtw_disassoc_cmd_callback -1001cc0e T rtw_joinbss_cmd_callback -1001cc2a T rtw_setstaKey_cmdrsp_callback -1001cc44 T rtw_cmd_thread -1001cda0 T rtw_joinbss_cmd -1001d04a T rtw_disassoc_cmd -1001d098 T rtw_setstakey_cmd -1001d188 T rtw_clearstakey_cmd -1001d228 T rtw_dynamic_chk_wk_cmd -1001d27a T rtw_set_chplan_cmd -1001d2fa T dynamic_chk_wk_hdl -1001d3c2 T lps_ctrl_wk_hdl -1001d426 T rtw_lps_ctrl_wk_cmd -1001d490 T rtw_sitesurvey_cmd -1001d558 T rpt_timer_setting_wk_hdl -1001d56c T rtw_ps_cmd -1001d5c8 T rtw_chk_hi_queue_cmd -1001d61c T rtw_drvextra_cmd_hdl -1001d6f8 t rtw_free_mlme_ie_data -1001d710 T rtw_init_mlme_timer -1001d76c T rtw_del_mlme_timer -1001d78c T reconnect_timer_hdl -1001d82c T _rtw_init_mlme_priv -1001d8ae T rtw_mfree_mlme_priv_lock -1001d8ca T rtw_free_mlme_priv_ie_data -1001d902 T _rtw_free_mlme_priv -1001d92a T _rtw_alloc_network -1001d97a T _rtw_free_network -1001d9da T _rtw_free_network_nolock -1001da00 T _rtw_find_network -1001da3c T _rtw_free_network_queue -1001da84 T rtw_if_up -1001daa4 T rtw_get_capability_from_ie -1001daa8 T rtw_get_capability -1001dac2 T rtw_get_beacon_interval_from_ie -1001dac6 T rtw_init_mlme_priv -1001dade T rtw_free_mlme_priv -1001dae2 T rtw_free_network_queue -1001dae6 T rtw_is_same_ibss -1001dafc T is_same_network -1001db60 T update_network -1001dbfa T rtw_update_scanned_network -1001dd0c T rtw_add_network -1001dd4a T rtw_survey_event_callback -1001ddf6 T rtw_dummy_event_callback -1001ddf8 T rtw_free_assoc_resources -1001dec2 T rtw_indicate_connect -1001ded2 T rtw_indicate_disconnect -1001def4 T rtw_indicate_scan_done -1001def8 T rtw_joinbss_event_callback -1001df16 T search_max_mac_id -1001df5e T rtw_stassoc_hw_rpt -1001df96 T rtw_stassoc_event_callback -1001dfc4 T rtw_stadel_event_callback -1001e06a T _rtw_join_timeout_handler -1001e0f4 T rtw_join_timeout_handler -1001e14c T rtw_scan_timeout_handler -1001e17c T _rtw_scan_timeout_handler -1001e180 T rtw_dynamic_check_timer_handlder -1001e1d8 T _dynamic_check_timer_handlder -1001e21c T rtw_select_and_join_from_scanned_queue -1001e2f0 T rtw_surveydone_event_callback -1001e408 T rtw_set_auth -1001e458 T rtw_set_key -1001e51a T rtw_restruct_wmm_ie -1001e580 T rtw_restruct_sec_ie -1001e5ec T rtw_joinbss_reset -1001e5fc T rtw_restructure_ht_ie -1001e6dc T rtw_update_ht_cap -1001e766 T rtw_joinbss_event_prehandle -1001e992 T rtw_linked_check -1001e9ae T rtw_buddy_adapter_up -1001e9e6 T check_buddy_fwstate -1001ea04 t get_da -1001ea24 t get_sa -1001ea4e T OnAction -1001ea60 T DoReserved -1001ea64 t _mgt_dispatcher.isra.2 -1001eab0 T rtw_is_channel_set_contains_channel -1001ead2 T init_hw_mlme_ext -1001eae8 T init_channel_set -1001eb80 T free_mlme_ext_priv -1001eba8 T mgt_dispatcher -1001ec30 T alloc_mgtxmitframe -1001ec68 T update_mgnt_tx_rate -1001ec6e T update_mgntframe_attrib -1001ecca T rtw_build_mgnt_frame -1001ed20 T dump_mgntframe -1001ed3a T rtw_send_mgnt -1001ed58 t issue_action_BSSCoexistPacket -1001ef64 T update_hidden_ssid -1001efb8 T issue_beacon -1001f1d0 T issue_probersp -1001f460 T OnProbeReq -1001f528 T issue_probereq -1001f6e0 T issue_auth -1001f948 T OnAuth -1001fbec T issue_asocrsp -1001fe60 T issue_assocreq -1002019c T issue_nulldata -10020286 T issue_qos_nulldata -100203b8 T issue_deauth -100204a0 T issue_action_BA -1002071c T OnAction_back -100207ea T collect_bss_info -10020a1c T start_clnt_auth -10020aac T start_clnt_assoc -10020ae0 T OnAuthClient -10020bc0 T report_scan_result_one -10020d80 T add_site_survey -10020f06 T report_survey_event -10021144 T OnProbeRsp -10021178 T report_surveydone_event -100211dc T report_join_res -1002124c T OnAssocRsp -10021398 T report_del_sta_event -1002142a T receive_disconnect -10021480 T OnBeacon -10021608 T OnDeAuth -10021760 T OnDisassoc -100218d0 T report_add_sta_event -10021944 T OnAssocReq -10021f34 T rtw_port_switch_chk -10021fb8 T update_sta_info -10022038 T mlmeext_sta_del_event_callback -100220b8 T _linked_info_dump -1002211a T _linked_rx_signal_strehgth_display -10022154 T linked_status_chk -100223c8 T survey_timer_hdl -100224a8 T _survey_timer_hdl -100224ac T link_timer_hdl -1002252a T _link_timer_hdl -1002252e T addba_timer_hdl -1002254e T NULL_hdl -10022552 T setopmode_hdl -10022598 T disconnect_hdl -10022644 T setauth_hdl -10022654 T setkey_hdl -100226ac T set_stakey_hdl -100227b0 T set_tx_beacon_cmd -10022824 T mlme_evt_hdl -10022870 T tx_beacon_hdl -1002292a T check_buddy_mlmeinfo_state -10022944 T site_survey -10022b14 T sitesurvey_cmd_hdl -10022c22 T concurrent_chk_start_clnt_join -10022cb8 T start_clnt_join -10022d8c T join_cmd_hdl -10022eb0 T concurrent_chk_joinbss_done -10023078 T mlmeext_joinbss_event_callback -100231b4 T set_chplan_hdl -100231d0 T init_mlme_ext_timer -1002322c T init_mlme_ext_priv -10023368 t get_hdr_bssid -10023390 t filter_packet -10023418 t promisc_get_encrypt -1002346a t promisc_info_get -1002350e t promisc_set_enable -100235aa T _promisc_deinit -100235fc T _promisc_recv_func -10023b48 T _promisc_set -10023bd8 T _is_promisc_enabled -10023bf0 t SetEAPOL_KEYIV -10023c8e t ToDrv_SetPTK -10023d36 t Message_ReplayCounter_OC2LI.isra.2 -10023d64 t Message_SmallerEqualReplayCounter.isra.4 -10023d96 t Message_setReplayCounter.isra.5 -10023db4 t INCLargeInteger -10023dd4 t INCOctet16_INTEGER -10023e1c t INCOctet32_INTEGER -10023e7c t ToDrv_DisconnectSTA -10023f40 t CheckMIC.constprop.14 -10023fc0 t CalcMIC.constprop.15 -10024020 T DecWPA2KeyData -100240d4 T DecGTK -10024190 T ToDrv_SetGTK -10024220 T init_wpa_sta_info -1002430c T SendEAPOL -100249c4 T ClientSendEAPOL -10024eac t ResendTimeout -10024f34 T EAPOLKeyRecvd -100250ac T ClientEAPOLKeyRecvd -1002546c T psk_derive -10025520 T psk_init -10025610 T psk_strip_rsn_pairwise -10025690 T psk_strip_wpa_pairwise -10025710 T tkip_send_mic_failure_report -10025884 T pwr_state_check_handler -10025888 T ips_enter -10025930 T ips_leave -10025a48 T rtw_pwr_unassociated_idle -10025a92 T rtw_ps_processor -10025aea T PS_RDY_CHECK -10025b52 T rtw_set_ps_mode -10025bc0 T LPS_RF_ON_check -10025c16 T LPS_Enter -10025c84 T LPS_Leave -10025cc0 T LeaveAllPowerSaveMode -10025cd0 T rtw_init_pwrctrl_priv -10025da4 T rtw_free_pwrctrl_priv -10025db8 T _rtw_pwr_wakeup -10025e94 T rtw_pm_set_lps -10025edc T rtw_pm_set_ips -10025f20 T rtw_pm_set_tdma_param -10025f3c T rtw_pm_set_lps_dtim -10025f48 T rtw_pm_get_lps_dtim -10025f54 t recvframe_pull -10025f76 t recvframe_pull_tail -10025f98 T rtw_signal_stat_timer_hdl -10026036 T _rtw_init_sta_recv_priv -10026054 T _rtw_init_recv_priv -100260fc T rtw_mfree_recv_priv_lock -10026130 T _rtw_alloc_recvframe -10026162 T rtw_alloc_recvframe -10026188 T rtw_free_recvframe -10026224 T _rtw_enqueue_recvframe -10026250 T rtw_enqueue_recvframe -1002627a T rtw_free_recvframe_queue -100262b2 T rtw_free_uc_swdec_pending_queue -100262da T _rtw_free_recv_priv -1002630a T rtw_free_buf_pending_queue -1002630e T recvframe_chkmic -1002640c T decryptor -100264a8 T portctrl -1002651e T recv_decache -1002654c T process_pwrbit_data -1002658c T process_wmmps_data -10026614 T count_rx_stats -10026688 T sta2sta_data_frame -100267c4 T ap2sta_data_frame -100268f0 T sta2ap_data_frame -10026978 T validate_recv_ctrl_frame -10026b12 T validate_recv_data_frame -10026d6c T wlanhdr_to_ethhdr -10026ea8 T recvframe_defrag -10026f52 T recvframe_chk_defrag -10027008 T validate_recv_mgnt_frame -10027044 T validate_recv_frame -1002710c T recv_indicatepkt_reorder -1002712e T process_recv_indicatepkts -10027186 T recv_func_prehandle -100271ae T recv_func_posthandle -10027212 T recv_func -1002729c T rtw_recv_entry -100272cc T rtw_recv_tasklet -10027324 T rtw_wep_encrypt -1002736a T rtw_wep_decrypt -100273b0 T rtw_tkip_encrypt -1002741c T rtw_tkip_decrypt -10027488 T rtw_aes_encrypt -100274f4 T rtw_aes_decrypt -10027558 T rtw_init_sec_priv -100275ca T rtw_free_sec_priv -100275ea t wifi_mac_hash -10027614 T _addba_timer_hdl -10027618 T _rtw_init_stainfo -10027692 T _rtw_init_sta_priv -1002777a T _rtw_free_sta_xmit_priv_lock -100277a6 T rtw_mfree_stainfo -100277d2 T rtw_mfree_sta_priv_lock -10027808 T _rtw_free_sta_priv -10027828 T init_addba_retry_timer -10027850 T rtw_alloc_stainfo -1002791a T rtw_free_stainfo -10027abc T rtw_get_stainfo -10027b38 T rtw_init_bcmc_stainfo -10027b68 T rtw_get_bcmc_stainfo -10027b8c T rtw_free_all_stainfo -10027be6 T cckrates_included -10027c0e T cckratesonly_included -10027c36 T networktype_to_raid_ex -10027c94 T judge_network_type -10027ce4 T ratetbl_val_2wifirate -10027cf8 T is_basicrate -10027d24 T ratetbl2rateset -10027d68 T get_rate_set -10027d92 T UpdateBrateTbl -10027dc4 T UpdateBrateTblForSoftAP -10027df8 T Save_DM_Func_Flag -10027e0e T Restore_DM_Func_Flag -10027e24 T Switch_DM_Func -10027e40 T Set_MSR -10027e64 T set_opmode -10027ea8 T SelectChannel -10027edc T SetBWMode -10027f18 T set_channel_bwmode -10027f6e T get_my_bssid -10027f72 T get_beacon_interval -10027f90 T is_client_associated_to_ap -10027fa8 T is_client_associated_to_ibss -10027fc4 T is_IBSS_empty -10027fe6 T decide_wait_for_beacon_timeout -10028002 T invalidate_cam_all -1002800a T write_cam -10028080 T clear_cam_entry -100280ae T flush_all_cam_entry -1002810c T WMM_param_handler -10028132 T WMMOnAssocRsp -10028200 T HT_caps_handler -100282a0 T HT_info_handler -100282c4 T HTOnAssocRsp -100282fc T ERP_IE_handler -10028318 T VCS_update -1002836a T rtw_check_bcn_info -1002857a T update_beacon_info -100285d0 T is_ap_in_tkip -10028648 T wifirate2_ratetbl_inx -100286b4 T update_basic_rate -100286e2 T update_supported_rate -1002870c T update_MCS_rate -10028718 T support_short_GI -10028746 T get_highest_rate_idx -10028760 T Update_RA_Entry -10028768 T set_sta_rate -10028770 T update_tx_basic_rate -100287c8 T check_assoc_AP -100288bc T update_IOT_info -1002891a T update_capinfo -10028998 T update_wireless_mode -10028a38 T update_bmc_sta_support_rate -10028a60 T update_TSF -10028a72 T correct_TSF -10028a7a t _init_txservq -10028a90 t set_qos -10028ae0 T _rtw_init_sta_xmit_priv -10028b26 T rtw_mfree_xmit_priv_lock -10028b72 T qos_acm -10028bac T xmitframe_addmic -10028d0a T xmitframe_swencrypt -10028d36 T rtw_make_wlanhdr -10028f16 T rtw_txframes_pending -10028f52 T rtw_txframes_sta_ac_pending -10028f88 T rtw_txframes_update_attrib_vcs_info -10029028 T rtw_put_snap -1002906c T rtw_update_protection -100290b2 T rtw_count_tx_stats -10029102 T rtw_free_xmitbuf_ext -10029144 T rtw_alloc_xmitframe -1002919c T rtw_free_xmitframe -100291ee T rtw_free_xmitframe_queue -1002922c T rtw_get_sta_pending -1002926c T rtw_xmit_classifier -100292d2 T rtw_xmitframe_enqueue -100292e0 T rtw_alloc_hwxmits -1002933a T rtw_free_hwxmits -10029350 T _rtw_free_xmit_priv -1002941c T rtw_init_hwxmits -10029434 T _rtw_init_xmit_priv -100295ec T rtw_get_ff_hwaddr -10029600 T xmitframe_enqueue_for_sleeping_sta -100297c0 t dequeue_xmitframes_to_sleeping_queue -10029816 T stop_sta_xmit -100298fe T wakeup_sta_to_xmit -10029b14 T xmit_delivery_enabled_frames -10029c30 T rtw_xmit_tasklet -10029c88 T rtw_xmit_mgnt -10029c8c T rtw_xmit -10029fb6 T rtw_sctx_done_err -10029fc2 T rtw_alloc_xmitbuf -1002a01c T rtw_free_xmitbuf -1002a08e T rtw_alloc_xmitbuf_ext -1002a114 T rtw_sctx_done -1002a11a t rtl8195a_free_rx_ring -1002a128 t bus_write32 -1002a184 t bus_write16 -1002a1e0 t bus_write8 -1002a23c t bus_read32 -1002a296 t bus_read16 -1002a2f2 t bus_read8 -1002a34e t rtl8195a_free_tx_ring -1002a3dc T rtl8195a_init_desc_ring -1002a51c T rtl8195a_free_desc_ring -1002a538 T rtl8195a_reset_desc_ring -1002a5ce T InitLxDmaRtl8195a -1002a730 T rtl8195a_check_txdesc_closed -1002a7a8 t rtl8195a_tx_isr -1002a88c T InterruptRecognized8195a -1002a91c T InitInterrupt8195a -1002a93c T EnableDMA8195a -1002a964 T EnableInterrupt8195a -1002a9a4 T DisableDMA8195a -1002a9b0 T DisableInterrupt8195a -1002a9c8 T UpdateInterruptMask8195a -1002aa2a T CheckRxTgRtl8195a -1002aa64 T rtl8192ee_check_rxdesc_remain -1002aa94 T rtl8195a_recv_tasklet -1002ada8 T rtl8195a_tx_int_handler -1002add4 T InterruptHandle8195a -1002b048 T rtl8195a_xmit_tasklet -1002b070 T lxbus_set_intf_ops -1002b0b0 t GetTxBufDesc -1002b0fa t UpdateFirstTxbdtoXmitBuf.isra.3 -1002b12c t check_nic_enough_desc.isra.4 -1002b17c T rtl8195ab_init_xmit_priv -1002b18a T rtl8195ab_free_xmit_priv -1002b192 T GetDmaTxbdIdx -1002b1ae T rtl8195a_enqueue_xmitbuf -1002b1d2 T rtl8195a_dequeue_xmitbuf -1002b1f6 T SetTxbdForLxDMARtl8195ab -1002b276 T UpdateTxbdHostIndex -1002b2b4 T rtw_dump_xframe -1002b486 T check_tx_desc_resource -1002b4c0 T rtw_dequeue_xframe -1002b554 T rtw_xmitframe_coalesce -1002b808 T rtl8195ab_xmitframe_resume -1002b8fe T rtl8195ab_mgnt_xmit -1002b93a T rtl8195ab_hal_xmit -1002ba48 t Hal_GetEfuseDefinition -1002ba78 t ResumeTxBeacon -1002babc T UpdateHalRAMask8195A -1002bc54 T HalLittleWifiMCUThreadRtl8195a -1002bca8 T HalCheckInReqStateThreadRtl8195a -1002bcf4 T HalTDMAChangeStateThreadRtl8195a -1002bd40 t rtl8195a_read_chip_version -1002bdb4 t Hal_EfuseWordEnableDataWrite -1002bff8 t Hal_EfusePowerSwitch -1002c00c t rtl8195a_free_hal_data -1002c026 t StopTxBeacon -1002c070 T SetHalODMVar8195A -1002c128 T rtl8195a_start_thread -1002c190 T rtl8195a_stop_thread -1002c1b4 t Hal_ReadEFuse -1002c324 T GetHalODMVar8195A -1002c338 t rtw_flash_map_update.part.12 -1002c3d8 t rtw_flash_map_erase -1002c41c t Hal_EfusePgPacketWrite -1002c698 t Hal_EfuseGetCurrentSize -1002c778 t rtw_flash_map_write -1002c946 T rtl8195a_InitBeaconParameters -1002c9b6 T _InitBurstPktLen_8195AB -1002c9c0 T rtl8195a_set_hal_ops -1002caa0 T rtl8195a_init_default_value -1002caa2 T rtl8195a_InitLLTTable -1002caec T Hal_GetChnlGroup8195A -1002cb28 T rtw_config_map_read -1002cc14 T rtw_config_map_write -1002ccc0 T Hal_InitPGData -1002cd1e T Hal_EfuseParseIDCode -1002cd36 T Hal_ReadPowerValueFromPROM_8195A -1002cdd4 T Hal_EfuseParseTxPowerInfo_8195A -1002ce6c T Hal_EfuseParseEEPROMVer_8195A -1002ce82 T Hal_EfuseParsePackageType_8195A -1002ceec T Hal_EfuseParseChnlPlan_8195A -1002cf1c T Hal_EfuseParseCustomerID_8195A -1002cf32 T Hal_EfuseParseXtal_8195A -1002cf4a T Hal_EfuseParseThermalMeter_8195A -1002cf72 T Hal_ReadRFGainOffset -1002cfc2 T BWMapping_8195A -1002cfe2 T SCMapping_8195A -1002d00a T rtl8195a_update_txdesc -1002d2da T rtl8195a_fill_fake_txdesc -1002d398 T SetHwReg8195A -1002e058 T GetHwReg8195A -1002e0ec T SetHalDefVar8195A -1002e1cc T GetHalDefVar8195A -1002e1f0 T PHY_QueryBBReg_8195A_Safe -1002e21c T PHY_SetBBReg_8195A_Safe -1002e248 t phy_RFSerialRead_8195A -1002e2fc T PHY_QueryRFReg_8195A -1002e314 T PHY_SetRFReg_8195A -1002e36c T PHY_MACConfig8195A -1002e386 T PHY_BBConfig8195A -1002e496 T PHY_RFConfig8195A -1002e49a T PHY_SetTxPowerIndex_8195A -1002e5a4 T phy_TxPwrAdjInPercentage -1002e5e4 T PHY_GetTxPowerIndex_8195A -1002e6d4 T PHY_SetTxPowerLevel8195A -1002e6da T phy_SpurCalibration_8195A -1002e992 T phy_SetRegBW_8195A -1002e9d0 T phy_PostSetBwMode8195A -1002eb2c T phy_SwChnl8195A -1002ebd4 T phy_SwChnlAndSetBwMode8195A -1002ec24 T PHY_HandleSwChnlAndSetBW8195A -1002ecd4 T PHY_SetBWMode8195A -1002ecf6 T PHY_SwChnl8195A -1002ed10 T PHY_SetSwChnlBWMode8195A -1002ed2e t HalTimerEnable -1002ed40 T InitTDMATimer -1002ed68 T ChangeStateByTDMA -1002ed78 T GetMinRateInRRSR -1002edac T CheckInReqState -1002edbc T InitCheckStateTimer -1002edec T InitGTimer1ms -1002ee38 T DeInitGTimer1ms -1002ee80 T ChangeTransmiteRate -1002eebc T PowerBitSetting -1002ef38 T ChkandChangePS -1002ef9c T IssueRsvdPagePacketSetting -1002f010 T IssuePSPoll -1002f03c T WaitTxStateMachineOk -1002f090 T IssueNullData -1002f120 T PsCloseRF -1002f154 T PsOpenRF -1002f184 T ChkTxQueueIsEmpty -1002f19c T InitPS -1002f20c T ConfigListenBeaconPeriod -1002f230 T PS_S2_Condition_Match -1002f264 T PS_S4_Condition_Match -1002f2e0 T PS_32K_Condition_Match -1002f31c T PS_S2ToS3ToS0State -1002f384 T PS_S2ToS0State -1002f3a0 T PS_S3ToS2orS0State -1002f3d0 T PS_S0ToS1ToS2State -1002f42c T PS_S1ToS0orS2State -1002f45c T PS_S2ToS4State -1002f4a8 T PS_S0ToS6State -1002f4c8 T PS_S6ToS0State -1002f4e0 T CheckTSFIsStable -1002f530 T WaitHWStateReady -1002f540 T SysClkDown -1002f5b0 T SysClkUp -1002f5fc T ResetPSParm -1002f670 T PS_S4ToS2State -1002f694 T SleepTo32K -1002f6f4 T Change_PS_State -1002f8a0 T Legacy_PS_Setting -1002f914 T PSModeSetting -1002f9b8 T ChangePSStateByRPWM -1002f9fc T ChangeTDMAState -1002fb1c T TDMAChangeStateTask -1002fb46 T EnterPS -1002fb68 T SetSmartPSTimer -1002fba4 T GTimer7Handle -1002fc00 T SmartPS2InitTimerAndToGetRxPkt -1002fc3c T PS_OnBeacon -1002fcec T PSBcnEarlyProcess -1002fda8 T PSMtiBcnEarlyProcess -1002fe54 T PSRxBcnProcess -1002ffa4 T TxPktInPSOn -1002ffe2 T PsBcnToProcess -1003009c T GTimer6Handle -100300e8 T RPWMProcess -10030124 T PSSetMode -1003019c T SpeRPT -100302bc T ISR_BcnEarly -10030328 T ISR_MtiBcnEarly -1003035c T ISR_RxBcn -10030378 T ISR_RxBCMD1 -100303a8 T ISR_RxBCMD0 -100303fc T ISR_RxUCMD1 -1003043a T ISR_RxUCMD0 -10030476 T ISR_TxPktIn -10030488 T ISR_TXCCX -1003048c T H2CHDL_SetPwrMode -100305b4 T CheckInReqStateTask -100305fa T HalGetNullTxRpt -10030618 T ISR_TBTT -10030690 T H2CHDL_BcnIgnoreEDCCA -100306a0 T PMUInitial -100306f0 T PMUTask -100307fc T PHY_RF6052SetBandwidth8195A -10030840 T PHY_RF6052_Config8195A -100308f8 t process_rssi -1003092e T rtl8195a_query_rx_desc_status -100309de T rtl8195a_query_rx_phy_status -10030b36 T hal_com_get_channel_plan -10030b6a T HAL_IsLegalChannel -10030b88 T MRateToHwRate -10030b9c T HwRateToMRate -10030bb0 T HalSetBrateCfg -10030c5c T Hal_MappingOutPipe -10030c78 T hal_init_macaddr -10030ca4 T hw_var_port_switch -10030f2c T SetHwReg -10030f36 T GetHwReg -10030f38 T switch_power_saving_mode -10030f7c T rtw_bb_rf_gain_offset -10030fc4 T PHY_GetRateValuesOfTxPowerByRate -1003115c T PHY_StoreTxPowerByRateNew -100311f8 T PHY_InitTxPowerByRate -10031210 T PHY_StoreTxPowerByRate -10031228 T PHY_GetTxPowerIndexBase -100312c8 T PHY_GetTxPowerTrackingOffset -100312f4 T PHY_GetRateIndexOfTxPowerByRate -10031308 T PHY_GetTxPowerByRate -10031368 T phy_StoreTxPowerByRateBase -100313b4 T PHY_SetTxPowerByRate -100313f0 T phy_ConvertTxPowerByRateInDbmToRelativeValues -100314f0 T PHY_TxPowerByRateConfiguration -10031502 T PHY_SetTxPowerIndexByRateArray -10031540 T PHY_SetTxPowerIndexByRateSection -100315a4 T PHY_SetTxPowerLevelByPath -100315da T phy_GetWorldWideLimit -10031606 T PHY_GetTxPowerLimit -10031730 T PHY_ConvertTxPowerLimitToPowerIndex -10031880 T PHY_InitTxPowerLimit -100318c8 T PHY_SetTxPowerLimit -10031944 T PHY_GetTxPowerIndex -10031954 T rtw_hal_chip_configure -1003196a T rtw_hal_read_chip_info -10031980 T rtw_hal_read_chip_version -10031996 T rtw_hal_def_value_init -100319ac T rtw_hal_free_data -100319c2 T rtw_hal_dm_init -100319d8 T rtw_hal_dm_deinit -100319ee T rtw_hal_init -10031a18 T rtw_hal_deinit -10031a32 T rtw_hal_set_hwreg -10031a40 T rtw_hal_get_hwreg -10031a4e T rtw_hal_set_def_var -10031a60 T rtw_hal_get_def_var -10031a72 T rtw_hal_set_odm_var -10031a80 T rtw_hal_get_odm_var -10031a8e T rtw_hal_enable_interrupt -10031ab0 T rtw_hal_disable_interrupt -10031ad2 T rtw_hal_inirp_init -10031ae4 T rtw_hal_inirp_deinit -10031af6 T rtw_hal_irp_reset -10031b04 T rtw_hal_xmit -10031b16 T rtw_hal_mgnt_xmit -10031b28 T rtw_hal_init_xmit_priv -10031b3a T rtw_hal_free_xmit_priv -10031b48 T rtw_hal_update_ra_mask -10031b76 T rtw_hal_add_ra_tid -10031b84 T rtw_hal_clone_data -10031b92 T rtw_hal_start_thread -10031ba0 T rtw_hal_stop_thread -10031bae T rtw_hal_read_bbreg -10031be2 T rtw_hal_write_bbreg -10031c0e T rtw_hal_read_rfreg -10031c20 T rtw_hal_write_rfreg -10031c34 T rtw_hal_interrupt_handler -10031c46 T rtw_hal_set_bwmode -10031c54 T rtw_hal_set_chan -10031c62 T rtw_hal_set_chnl_bw -10031c78 T rtw_hal_dm_watchdog -10031c8e T rtw_hal_macid_sleep -10031cae T rtw_hal_macid_wakeup -10031cce T decide_chip_type_by_device_id -10031cd4 t rtw_net_get_stats -10031d24 t netdev_if2_close -10031d44 t netdev_close -10031da0 t rtw_if1_deinit -10031e3a T rtw_os_indicate_connect -10031e3e T rtw_os_indicate_scan_done -10031e42 T rtw_reset_securitypriv -10031f36 T rtw_os_indicate_disconnect -10031f80 T rtw_init_netdev -100320d0 T rtw_drv_if2_init -100322d8 T rtw_drv_if2_stop -1003232e T rtw_drv_if2_free -1003237c T _netdev_open -10032498 T _netdev_if2_open -10032554 T netdev_if2_open -1003257c T netdev_open -100325a4 T rtw_drv_probe -10032724 T rtw_dev_remove -10032768 T rtw_drv_entry -10032794 T rtw_drv_halt -100327c4 t rtw_wx_set_autoreconnect -100327f2 t rtw_wx_get_autoreconnect -10032800 t rtw_forwarding_set -10032822 t rtw_set_ch_deauth -10032844 t get_priv_size -10032858 t rtw_wx_del_custome_ie -100328a4 t rtw_wx_set_pscan_freq -10032926 t rtw_wx_update_custome_ie -10032998 t rtw_set_tos_value -100329b8 t rtw_get_tx_power -10032afc t rtw_wx_set_custome_ie -10032ba8 t rtw_pm_get -10032bec t rtw_pm_set -10032ca0 t rtw_wx_read32 -10032d4c t rtw_wx_write32 -10032db0 t rtw_wx_set_freq.isra.10 -10032e58 T rtw_ex_set -10032f18 T wireless_send_event -10032f22 T indicate_wx_custom_event -10032f7e T indicate_wx_scan_result_present -10032fa6 T indicate_wx_scan_complete_event -10032fd0 T rtw_indicate_sta_assoc -10033020 T rtw_indicate_sta_disassoc -10033078 T rtw_indicate_wx_assoc_event -100330aa T rtw_indicate_wx_disassoc_event -100330da T rtw_set_wpa_ie -100331f0 T strtopsk -1003325c T rtw_wx_get_passphrase -100332a8 T rtw_wx_set_ap_essid -10033398 T mac_reg_dump -10033444 T bb_reg_dump -100334a0 T rf_reg_dump -10033518 t rtw_dbg_port -10033b80 T rtw_set_sta_num -10033b9c T rtw_ex_get_drv_ability -10033c5c T rtw_ex_get -10033ef4 T rtw_ioctl -10034e80 T rtw_os_recv_resource_init -10034e84 T rtw_os_recv_resource_alloc -10034e8e T rtw_os_recv_resource_free -10034e90 T rtw_tkip_countermeasure -10034f30 T rtw_handle_tkip_mic_err -10034fd8 T rtw_recv_indicatepkt -10035228 T skb_fail_inc -10035244 T skb_fail_get_and_rst -10035260 T init_skb_pool -100352b8 T init_skb_data_pool -10035310 T alloc_skb -10035410 T kfree_skb -10035478 T kfree_skb_chk_key -1003547c T skb_put -100354b0 T skb_reserve -100354be T dev_alloc_skb -100354da T skb_end_pointer -100354de T skb_set_tail_pointer -100354e6 T skb_pull -100354fe T skb_copy -10035526 T rtw_remainder_len -10035532 T _rtw_open_pktfile -10035544 T _rtw_pktfile_read -10035572 T rtw_set_tx_chksum_offload -10035574 T rtw_os_xmit_resource_alloc -1003557e T rtw_os_xmit_resource_free -10035580 T rtw_os_pkt_complete -10035588 T rtw_os_xmit_complete -1003559a T rtw_os_xmit_schedule -100355d6 T rtw_xmit_entry -10035622 T rtw_alloc_etherdev_with_old_priv -10035638 T rtw_alloc_etherdev -10035664 T rtw_free_netdev -10035684 T timer_wrapper -100356d8 T alloc_etherdev -10035734 T free_netdev -1003574e T dev_alloc_name -10035758 T init_timer_wrapper -10035778 T deinit_timer_wrapper -100357c4 T init_timer -1003587c T mod_timer -1003595c T cancel_timer_ex -100359a4 T del_timer_sync -10035a08 T rtw_init_timer -10035a10 T rtw_set_timer -10035a14 T rtw_cancel_timer -10035a1e T rtw_del_timer -10035a24 T rltk_get_idx_bydev -10035a34 T rltk_wlan_init -10035abc T rltk_wlan_deinit -10035b80 T rltk_wlan_start -10035bb4 T rltk_wlan_check_isup -10035bc4 T rltk_wlan_tx_inc -10035bd8 T rltk_wlan_tx_dec -10035bec T rltk_wlan_get_recv_skb -10035bfc T rltk_wlan_alloc_skb -10035c3c T rltk_wlan_send_skb -10035c70 T rltk_netif_rx -10035d1c T rltk_set_sta_num -10035d20 T rltk_set_tx_power_percentage -10035d54 T rltk_wlan_control -10035de8 T rltk_wlan_running -10035e00 T rltk_wlan_handshake_done -10035e34 T rltk_wlan_is_connected_to_ap -10035e78 T Efuse_PowerSwitch -10035e84 T Efuse_GetCurrentSize -10035e90 T Efuse_CalculateWordCnts -10035eb4 T EFUSE_GetEfuseDefinition -10035ec8 T efuse_OneByteRead -10035efc T efuse_OneByteWrite -10035f30 T Efuse_PgPacketWrite -10035f44 T efuse_WordEnableDataRead -10035f76 T Efuse_WordEnableDataWrite -10035f8a T efuse_GetCurrentSize -10035fb2 T rtw_efuse_map_read -10036014 T rtw_efuse_map_write -10036194 T rtw_macaddr_cfg -10036258 T rtw_get_cipher_info -100362d2 T rtw_get_bcn_info -100363a2 T rtw_init_default_value -10036410 T rtw_cancel_all_timer -1003647a T rtw_free_drv_sw -100364f0 T rtw_reset_drv_sw -1003654c T rtw_init_drv_sw -100365d4 T rtw_start_drv_threads -10036690 T rtw_stop_drv_threads -100366c4 T rtw_read8 -100366d2 T rtw_read16 -100366e0 T rtw_read32 -100366ee T rtw_write8 -100366fc T rtw_write16 -1003670a T rtw_write32 -10036718 T rtw_do_join -100367bc T rtw_set_802_11_bssid -10036940 T rtw_set_802_11_ssid -10036a48 T rtw_set_802_11_infrastructure_mode -10036aea T rtw_set_802_11_bssid_list_scan -10036b3a T rtw_set_802_11_authentication_mode -10036b5c T rtw_set_802_11_add_wep -10036bbc T ODM_InitRAInfo -10036c5c T InitialRateUpdate -10036d5c T RateUp_search_RateMask -10036d8e T RateDown_search_RateMask -10036de0 T StartRateByRSSI -10036e0a T RateUpRAM8195A -10036e9e T RateDownTrying -10036edc T TryDone -10036f74 T RateDownStepRAM8195A -10037014 T RateDecisionRAM8195A -100370f8 T ArfrRefresh -10037300 T H2CHDL_Set_MACID_Config -100373c4 T PHY_DM_RA_SetRSSI_8195A -100373f2 t CheckPositive.isra.0 -100374d4 T ODM_ReadAndConfig_MP_8195A_AGC_TAB -1003754c T ODM_ReadAndConfig_MP_8195A_PHY_REG -100375c4 T ODM_GetVersion_MP_8195A_PHY_REG -100375c8 T ODM_ReadAndConfig_MP_8195A_PHY_REG_PG -100375fc T odm_ConfigRFReg_8195A -10037634 T odm_ConfigRF_RadioA_8195A -10037644 T odm_ConfigMAC_8195A -10037648 T odm_ConfigBB_AGC_8195A -10037658 T odm_ConfigBB_PHY_REG_PG_8195A -10037686 T odm_ConfigBB_PHY_8195A -100376ce T odm_ConfigBB_TXPWR_LMT_8195A -100376f4 T ODM_CmnInfoInit -100377e8 T ODM_CmnInfoHook -1003788c T ODM_CmnInfoPtrArrayHook -1003789c T ODM_CmnInfoUpdate -1003796c T odm_CommonInfoSelfInit -100379e0 T ODM_DMInit -10037a2e T odm_CommonInfoSelfUpdate -10037a80 T ODM_DMWatchdog -10037aec T PhyDM_Get_Structure -10037b10 T Phydm_CheckAdaptivity -10037b3e T Phydm_NHMCounterStatisticsInit -10037bb4 T Phydm_SetEDCCAThreshold -10037bec T Phydm_MACEDCCAState -10037c2a T Phydm_AdaptivityInit -10037d08 T Phydm_Adaptivity -10037e28 T ODM_CfoTrackingInit -10037e52 T ODM_CfoTracking -10037e72 T ODM_ParsingCFO -10037ea4 T ODM_InitDebugSetting -10037eb8 T ODM_Write_DIG -10037f58 T odm_ForbiddenIGICheck -10037fea T ODM_Write_CCK_CCA_Thres -10038024 T odm_DIGInit -100380be T odm_DigAbort -100380e0 T odm_DIGbyRSSI_LPS -1003818c T odm_FAThresholdCheck -100381b8 T odm_DIG -10038418 T odm_FalseAlarmCounterStatistics -10038444 T odm_CCKPacketDetectionThresh -1003849c T odm_RxPhyStatus8195A_Parsing -100385a0 T odm_Process_RSSIForDM_8195A -100386e2 T ODM_PhyStatusQuery_8195A -1003870e T ODM_PhyStatusQuery -10038712 T ODM_ConfigRFWithHeaderFile -10038730 T ODM_ConfigRFWithTxPwrTrackHeaderFile -10038762 T ODM_ConfigBBWithHeaderFile -1003878a T ODM_ConfigMACWithHeaderFile -1003879c T ODM_Read1Byte -100387a2 T ODM_Read4Byte -100387a8 T ODM_Write1Byte -100387ae T ODM_Write2Byte -100387b4 T ODM_Write4Byte -100387ba T ODM_SetMACReg -100387c0 T ODM_SetBBReg -100387c6 T ODM_GetBBReg -100387cc T ODM_SetRFReg -100387d2 T ODM_GetRFReg -100387d8 T ODM_MoveMemory -100387e2 T ODM_delay_ms -100387e6 T ODM_delay_us -100387ec T getSwingIndex -10038844 T odm_TXPowerTrackingThermalMeterInit -100388f6 T odm_TXPowerTrackingInit -100388fa T odm_TXPowerTrackingCheckIOT -1003892e T ODM_TXPowerTrackingCheck -1003893c T odm_RSSIMonitorInit -10038944 T ODM_RAPostActionOnAssoc -1003894c T odm_RSSIMonitorCheckIOT -10038a20 T odm_RSSIMonitorCheck -10038a34 T odm_RateAdaptiveMaskInit -10038a5c T ODM_RAStateCheck -10038a9e T odm_RefreshRateAdaptiveMaskIOT -10038aee T odm_RefreshRateAdaptiveMask -10038b04 T ODM_Get_Rate_Bitmap -10038bf4 t _ReadEfuseInfo8195a -10038cbc t rtl8195a_interface_configure -10038cf0 t rtl8195a_hal_deinit -10038d2c T _InitPowerOn -10038dac t ReadAdapterInfo8195a -10038ddc T _InitDriverInfoSize -10038de6 T _InitNetworkType -10038e08 T _InitWMACSetting -10038e78 T _InitAdaptiveCtrl -10038ebc T _InitEDCA -10038f38 T _InitRateFallback -10038f7c T _InitRetryFunction -10038fa8 T _InitOperationMode -10038ff0 T _InitInterrupt -10039030 t rtl8195a_hal_init -10039308 T rtl8195ab_set_hal_ops -100393e0 T FillH2CCmd8195A -10039400 T CheckFwRsvdPageContent -10039402 T rtl8195a_set_FwRsvdPage_cmd -1003940c T rtl8195a_set_FwMediaStatusRpt_cmd -10039438 T rtl8195a_set_FwMacIdConfig_cmd -100394f8 T rtl8195a_set_FwPwrMode_cmd -10039588 T rtl8195a_download_rsvd_page -10039890 T rtl8195a_set_FwJoinBssRpt_cmd -1003989a T rtl8195a_Add_RateATid -100398ec T rtw_rpt_h_addr -10039938 T rtw_txrpt_read8 -10039956 T rtw_txrpt_write8 -1003997a T rtw_ratemask_read8 -10039998 T rtw_ratemask_write8 -100399bc T ReadRateMask8 -100399c6 T WriteRateMask8 -100399ca T ReadTxrpt8 -100399d4 T WriteTxrpt8 -100399d8 T ResetTxrpt -10039a10 T PsuseTxrpt -10039a30 T CheckMaxMacidNum -10039a68 T GetMediaStatusCommon -10039a82 T GetTxrptStatistic -10039b38 T rtl8195a_InitHalDm -10039c5c T rtl8195a_HalDmWatchDog -10039d40 T rtl8195a_init_dm_priv -10039e18 T rtl8195a_deinit_dm_priv -10039e1a T MediaConnection -10039e38 T MediaDisconnection -10039e58 T RATaskEnable -10039e82 T SetMediaStatus -10039ec0 T H2CHDL_JoinInfo -10039ef8 T H2CHDL_SetRsvdPage -10039f90 T H2CCmdCommon -10039fd4 T HalPwrSeqCmdParsing -1003a094 T hci_dvobj_init -1003a0a4 T hci_dvobj_deinit -1003a0b4 T hci_dvobj_request_irq -1003a0c4 T hci_dvobj_free_irq -1003a0d4 T hci_lxbus_dvobj_init -1003a110 T hci_lxbus_dvobj_deinit -1003a150 T hci_lxbus_dvobj_request_irq -1003a1a4 T hci_lxbus_free_irq -1003a1fc T hci_lxbus_intf_stop -1003a234 T rtw_interrupt_thread -1003a2a8 T lextra_bus_dma_Interrupt -1003a2f0 T init_rom_wlan_ram_map -1003a308 T ODM_ReadAndConfig_MP_8195A_MAC_REG -1003a464 t CheckPositive.isra.0 -1003a548 T ODM_ReadAndConfig_MP_8195A_RadioA -1003a5c0 T ODM_ReadAndConfig_MP_8195A_TxPowerTrack_QFN48 -1003a610 T ODM_ReadAndConfig_MP_8195A_TxPowerTrack_QFN56 -1003a660 T ODM_ReadAndConfig_MP_8195A_TxPowerTrack_TFBGA96 -1003a6b0 T ODM_ReadAndConfig_MP_8195A_TXPWR_LMT -1003a6e8 T ODM_ReadAndConfig_MP_8195A_TxXtalTrack -1003a714 T GetDeltaSwingTable_8195A -1003a744 T GetDeltaSwingXtalTable_8195A -1003a754 T ODM_TxXtalTrackSetXtal_8195A -1003a774 T Hal_MPT_CCKTxPowerAdjust -1003a844 T ODM_TxPwrTrackSetPwr_8195A -1003a954 T ConfigureTxpowerTrack_8195A -1003a9a0 T phy_PathA_IQK_8195A -1003ab54 T phy_PathA_RxIQK8195A -1003aee8 T _PHY_PathAFillIQKMatrix8195A -1003b07e T _PHY_PathBFillIQKMatrix8195A -1003b1fa T _PHY_SaveADDARegisters8195A -1003b22e T _PHY_SaveMACRegisters8195A -1003b25c T _PHY_ReloadADDARegisters8195A -1003b290 T _PHY_ReloadMACRegisters8195A -1003b2c0 T _PHY_PathADDAOn8195A -1003b2fc T _PHY_MACSettingCalibration8195A -1003b344 T _PHY_PIModeSwitch8195A -1003b380 T phy_SimularityCompare_8195A -1003b4b4 T phy_IQCalibrate_8195A -1003b82c T phy_LCCalibrate_8195A -1003b89c T PHY_LCCalibrate_8195A -1003b8fc T PHY_IQCalibrate_8195A -1003bbb0 T DoIQK_8195A -1003bbce T ConfigureTxpowerTrack -1003bbe0 T ODM_TXPowerTrackingCallback_ThermalMeter -1003bfec T ODM_ResetIQKResult -1003c034 T ODM_GetRightChnlPlaceforIQK -1003c088 t __rtw_get_wpa_ie_veneer -1003c098 t __rtw_get_sec_ie_veneer -1003c0a8 t __rom_psk_CalcPTK_veneer -1003c0b8 t __rtw_ieee802_11_parse_elems_veneer -1003c0c8 t __rtw_set_supported_rate_veneer -1003c0d8 t ___vsscanf_veneer -1003c0e8 t __rtw_get_rateset_len_veneer -1003c0f8 t __AES_UnWRAP_veneer -1003c108 t __rt_arc4_crypt_veneer -1003c118 t __rtw_secmicsetkey_veneer -1003c128 t __rtw_parse_wpa_ie_veneer -1003c138 t __rom_psk_CalcGTK_veneer -1003c148 t __PHY_QueryBBReg_8195A_veneer -1003c158 t __Strtoul_veneer -1003c168 t __wep_80211_encrypt_veneer -1003c178 t __rt_md5_hmac_veneer -1003c188 t __AES_WRAP_veneer -1003c198 t __ROM_odm_CfoTrackingFlow_veneer -1003c1a8 t __ROM_odm_EVMdbToPercentage_veneer -1003c1b8 t __tkip_80211_decrypt_veneer -1003c1c8 t __rt_hmac_sha1_veneer -1003c1d8 t __rt_arc4_init_veneer -1003c1e8 t __rtw_parse_wpa2_ie_veneer -1003c1f8 t __ROM_odm_GetDefaultCrytaltalCap_veneer -1003c208 t __SpicWaitBusyDoneRtl8195A_veneer -1003c218 t __rtw_check_network_type_veneer -1003c228 t __HalI2SIntrCtrlRtl8195a_veneer -1003c238 t __rtw_set_fixed_ie_veneer -1003c248 t __rom_psk_PasswordHash_veneer +10008bac T translate_rtw_security +10008bd0 T show_wifi_ap_ip +10008c04 T wifi_run_ap +10008d24 T show_wifi_st_ip +10008d58 T wifi_run_st +10008e14 T wifi_run +10008f04 T wifi_init_thrd +10008f50 T fATWR +10008f6c T show_wifi_st_cfg +10008fbc T fATPN +1000908c T show_wifi_ap_cfg +100090f8 T fATPA +100091d4 T show_wifi_cfg +10009234 T fATWI +10009348 t mp3_cfg_read +100093a8 T tskmad +100095c4 T render_sample_block +10009638 T set_dac_sample_rate +1000967c T getIpForHost +100096a0 T openConn +100097c4 T http_head_read +100098fc T tskreader +10009ac4 T connect_close +10009aec T connect_start +10009b8c T fATWS +10009c6c T ShowMemInfo +10009c98 T main +10009cf0 T fATST +10009d60 T fATSD +10009d68 T fATSW +10009d70 T fATDS +10009d94 T print_hex_dump +10009dc4 T dump_bytes +10009e58 T fATSB +10009e90 T print_udp_pcb +10009efc T print_tcp_pcb +10009fd4 T fATLW +10009fe4 T RamFifoClose +1000a040 T RamFifoInit +1000a194 T RamFifoRead +1000a250 T RamFifoWrite +1000a304 T RamFifoFill +1000a330 T RamFifoFree +1000a344 T RamFifoLen +1000a350 t decode_header +1000a4c0 T mad_header_init +1000a4ec T mad_frame_finish +1000a504 T mad_header_decode +1000a7a0 T mad_frame_decode +1000a824 T mad_frame_mute +1000a86e T mad_frame_init +1000a88c t III_requantize +1000a908 t III_aliasreduce +1000a970 t fastsdct +1000aaa8 t III_imdct_l +1000aec0 t III_imdct_s +1000b014 t III_overlap +1000b03e t III_freqinver +1000b088 t III_decode +1000c0a4 T mad_layer_III +1000c508 T mad_bit_init +1000c514 T mad_bit_length +1000c52c T mad_bit_nextbyte +1000c538 T mad_bit_skip +1000c568 T mad_bit_read +1000c5d4 T mad_bit_crc +1000c6c8 t scale +1000c6d4 t dct32 +1000cf68 t synth_half +1000d3ac t synth_full +1000d800 T mad_synth_mute +1000d838 T mad_synth_init +1000d85c T mad_synth_frame +1000d8f0 t scale_rational +1000d964 T mad_timer_set +1000da4c T mad_stream_init +1000da7e T mad_stream_finish +1000da90 T mad_stream_buffer +1000daa4 T mad_stream_sync +1000daec T mad_stream_errorstr +1000dc48 t i2s_test_tx_complete +1000dc60 T i2sClose +1000dcec T i2sInit +1000de60 T i2sSetRate +1000dee8 T i2sPushPWMSamples +1000e050 T SystemCoreClockUpdate +1000e064 W console_help +1000e0a4 T GetArgvRam +1000e15c T get_eap_phase +1000e168 T get_eap_method +1000e174 T eap_autoreconnect_hdl +1000e178 t wifi_no_network_hdl +1000e190 t wifi_ap_sta_disassoc_hdl +1000e194 t wifi_handshake_done_hdl +1000e1b0 t wifi_disconn_hdl +1000e218 t wifi_connected_hdl +1000e24c t wifi_connect_local +1000e360 T wifi_autoreconnect_hdl +1000e39c t wifi_ap_sta_assoc_hdl +1000e39e T wifi_rx_beacon_hdl +1000e3a0 T wifi_connect +1000e624 t wifi_autoreconnect_thread +1000e68c T wifi_set_country +1000e698 T wifi_off +1000e704 T wifi_start_ap +1000e7e4 T wifi_get_setting +1000e8c4 T wifi_show_setting +1000e98c T wifi_config_autoreconnect +1000e9b0 T wifi_indication +1000e9ec T wifi_reg_event_handler +1000ea40 T wifi_unreg_event_handler +1000ea84 T init_event_callback_list +1000ea94 T promisc_deinit +1000ea98 T promisc_recv_func +1000ea9c T promisc_set +1000eaa0 T is_promisc_enabled +1000eaaa T iw_ioctl +1000eac6 T wext_get_ssid +1000eb10 T wext_set_ssid +1000eb44 T is_broadcast_ether_addr +1000eb66 T wext_set_auth_param +1000eb94 T wext_set_key_ext +1000ec94 T wext_get_enc_ext +1000ecf6 T wext_set_passphrase +1000ed2a T wext_get_passphrase +1000ed5a T wext_set_mode +1000ed7e T wext_get_mode +1000eda8 T wext_set_ap_ssid +1000eddc T wext_set_country +1000ee00 T wext_set_channel +1000ee2e T wext_get_channel +1000ee5c T wext_wlan_indicate +1000efa4 T wext_set_autoreconnect +1000eff4 T wext_set_adaptivity +1000f01c T wext_set_sta_num +1000f020 T LwIP_DHCP +1000f114 T LwIP_GetIP +1000f118 T LwIP_AUTOIP +1000f194 t netconn_recv_data +1000f264 T netconn_new_with_proto_and_callback +1000f2c4 T netconn_delete +1000f2e8 T netconn_getaddr +1000f32c T netconn_connect +1000f36c T netconn_recv_tcp_pbuf +1000f380 T netconn_recv +1000f408 T netconn_recved +1000f434 T netconn_send +1000f470 T netconn_write_partly +1000f500 T netconn_gethostbyname +1000f558 t recv_udp +1000f5c8 t recv_raw +1000f64c t setup_tcp +1000f690 t err_tcp +1000f728 t do_connected +1000f794 t do_writemore +1000f894 t do_close_internal +1000f980 t poll_tcp +1000f9d0 t do_dns_found +1000f9fc t sent_tcp +1000fa4a t recv_tcp +1000fac4 T do_newconn +1000fb54 T netconn_alloc +1000fbc0 T netconn_free +1000fbec t netconn_drain +1000fc7c T do_delconn +1000fd08 T do_connect +1000fd9c T do_send +1000fe0c T do_recv +1000fe4c T do_write +1000fe86 T do_getaddr +1000fefc T do_gethostbyname +1000ff28 T netbuf_delete +1000ff48 T netbuf_free +1000ff5e T netbuf_ref +1000ff98 T lwip_gethostbyname +1000ffe4 t get_socket +10010004 t alloc_socket +10010074 t event_callback +100101a4 T lwip_socket_init +100101a6 T lwip_close +100101f8 T lwip_connect +10010254 T lwip_recvfrom +1001040c T lwip_read +10010420 T lwip_sendto +100104cc T lwip_send +10010544 T lwip_socket +100105b8 T lwip_write +100105c0 t tcpip_thread +10010644 T tcpip_input +1001068c T tcpip_callback_with_block +100106e0 T tcpip_timeout +10010724 T tcpip_apimsg +1001077c T tcpip_init +100107c0 t autoip_start_probing +1001080c t autoip_arp_announce +10010838 T autoip_start +100108cc T autoip_tmr +100109dc T autoip_arp_reply +10010a84 t icmp_send_response.isra.0 +10010af4 T icmp_input +10010c18 T icmp_dest_unreach +10010c22 T icmp_time_exceeded +10010c2c t igmp_send +10010cd0 t igmp_delaying_member +10010d08 t igmp_lookup_group.part.1 +10010d40 T igmp_init +10010d5c T igmp_report_groups +10010d80 T igmp_lookfor_group +10010da0 T igmp_start +10010ddc T igmp_input +10010ea0 T igmp_tmr +10010ecc t lwip_standard_chksum +10010f24 T inet_chksum_pseudo +10010faa T inet_chksum +10010fb6 T inet_chksum_pbuf +10010ffc T ip_route +10011038 T ip_input +10011210 T ip_output_if_opt +10011364 T ip_output_if +10011386 T ip_output +100113be T ip4_addr_isbroadcast +100113f6 T ipaddr_aton +1001150c T ipaddr_addr +10011524 T ipaddr_ntoa_r +100115bc T ipaddr_ntoa +100115c8 t ipfrag_free_pbuf_custom +100115e0 t ip_reass_free_complete_datagram +10011660 t ip_reass_remove_oldest_datagram +100116d4 T ip_reass_tmr +100116fc T ip_reass +100119ac T ip_frag +10011b18 T lwip_htons +10011b1e T lwip_ntohs +10011b24 T lwip_htonl +10011b28 T lwip_ntohl +10011b2c t dhcp_set_state +10011b3c t dhcp_option +10011b5c t dhcp_option_byte +10011b6e t dhcp_option_short +10011b90 t dhcp_option_long +10011bd4 t dhcp_create_msg +10011d24 t dhcp_delete_msg +10011d3a t dhcp_check +10011d60 t dhcp_bind +10011e34 t dhcp_option_trailer +10011e60 t dhcp_discover +10011f14 t dhcp_reboot +10011fb8 t dhcp_option_hostname.isra.1 +10011ff8 t dhcp_rebind +1001208c t dhcp_select +10012178 t dhcp_recv +1001257c T dhcp_arp_reply +100125fc T dhcp_renew +10012690 T dhcp_release +10012738 T dhcp_coarse_tmr +100127c4 T dhcp_fine_tmr +10012860 T dhcp_release_unicast +10012924 T dhcp_stop +10012954 T dhcp_start +100129f4 t dns_parse_name +10012a10 t dns_recv +10012ba4 t dns_send +10012c74 t dns_check_entry +10012d24 T dns_setserver +10012d44 T dns_init +10012d9c T dns_tmr +10012dc8 T dns_gethostbyname +10012f08 T lwip_init +10012f30 T sys_timeout +10012f90 T tcp_timer_needed +10012fc4 t tcpip_tcp_timer +10012ffc T sys_timeouts_init +10013070 t dns_timer +1001308c t igmp_timer +100130a4 t autoip_timer +100130bc t dhcp_timer_fine +100130d8 t dhcp_timer_coarse +100130f4 t arp_timer +10013110 t ip_reass_timer +1001312c T sys_untimeout +10013174 T sys_timeouts_mbox_fetch +100131d8 T netif_init +100131dc T netif_set_ipaddr +10013234 T netif_set_addr +10013250 T netif_add +100132b4 T netif_set_gw +100132bc T netif_set_netmask +100132c4 T netif_set_default +100132d0 T netif_set_up +10013306 T netif_set_down +10013320 t pbuf_free_ooseq_callback +10013354 t pbuf_pool_is_empty +10013390 T pbuf_alloced_custom +100133e4 T pbuf_header +1001343c T pbuf_free +1001347c T pbuf_alloc +100135a0 T pbuf_realloc +100135d4 T pbuf_clen +100135e4 T pbuf_ref +100135fe T pbuf_cat +1001361a T pbuf_chain +1001362a T pbuf_copy +100136c6 T pbuf_copy_partial +1001372e T pbuf_coalesce +1001375c T raw_input +100137d4 T raw_connect +100137de T raw_recv +100137e4 T raw_sendto +10013874 T raw_send +1001387c T raw_remove +100138a4 T raw_new +100138d8 t tcp_new_port +10013928 T tcp_init +10013940 T tcp_update_rcv_ann_wnd +10013976 T tcp_recved +100139b0 T tcp_seg_free +100139ca T tcp_segs_free +100139dc T tcp_seg_copy +10013a04 T tcp_arg +10013a08 T tcp_recv +10013a0e T tcp_sent +10013a14 T tcp_err +10013a1a T tcp_accept +10013a1e T tcp_poll +10013a28 T tcp_pcb_purge +10013a68 T tcp_slowtmr +10013d24 T tcp_pcb_remove +10013d8c t tcp_close_shutdown +10013ebc T tcp_close +10013ed4 T tcp_recv_null +10013ef8 T tcp_process_refused_data +10013f58 T tcp_fasttmr +10013fd0 T tcp_tmr +10013ff4 T tcp_shutdown +10014044 T tcp_abandon +100140dc T tcp_abort +100140e4 T tcp_next_iss +100140fc T tcp_alloc +1001421c T tcp_new +10014222 T tcp_eff_send_mss +10014240 T tcp_connect +1001439c t tcp_oos_insert_segment +1001441c t tcp_receive +10014bf4 t tcp_parseopt.isra.0 +10014c78 T tcp_input +100154d0 t tcp_pbuf_prealloc +10015524 t tcp_create_segment +100155ec t tcp_output_alloc_header.constprop.0 +10015656 T tcp_write +100159a6 T tcp_enqueue_flags +10015a4e T tcp_send_fin +10015a96 T tcp_send_empty_ack +10015af4 T tcp_output +10015d6c T tcp_rst +10015e04 T tcp_rexmit_rto +10015e32 T tcp_rexmit +10015e82 T tcp_rexmit_fast +10015ed8 T tcp_keepalive +10015f2a T tcp_zero_window_probe +10015fd4 T udp_init +10015fec T udp_input +10016174 T udp_bind +1001621c T udp_sendto_if +1001631a T udp_sendto +10016350 T udp_send +1001635c T udp_connect +100163a4 T udp_disconnect +100163b4 T udp_recv +100163bc T udp_remove +100163e4 T udp_new +10016408 t etharp_free_entry +10016438 t etharp_find_entry +10016514 t etharp_send_ip +10016548 T etharp_tmr +10016588 T etharp_cleanup_netif +100165b0 T etharp_raw +1001666c T etharp_request +10016698 t etharp_output_to_arp_index +100166e0 T etharp_query +100167e4 T etharp_output +100168dc T ethernet_input +10016acc t low_level_output +10016b28 t arp_timer +10016b44 T ethernetif_recv +10016bbc T ethernetif_init +10016c00 T lwip_POST_SLEEP_PROCESSING +10016c1c T rltk_wlan_set_netif_info +10016c3c T rltk_wlan_send +10016cd0 T rltk_wlan_recv +10016d3c T netif_is_valid_IP +10016d70 T netif_get_idx +10016d88 T netif_rx +10016d98 T netif_post_sleep_processing +10016d9c T sys_mbox_new +10016db6 T sys_mbox_free +10016dca T sys_mbox_post +10016dea T sys_mbox_trypost +10016e0c T sys_arch_mbox_fetch +10016e56 T sys_arch_mbox_tryfetch +10016e76 T sys_mbox_valid +10016e80 T sys_mbox_set_invalid +10016e86 T sys_sem_new +10016ec2 T sys_arch_sem_wait +10016f02 T sys_sem_signal +10016f0e T sys_sem_free +10016f14 T sys_sem_valid +10016f1e T sys_sem_set_invalid +10016f24 T sys_init +10016f48 T sys_thread_new_tcm +10016fb0 T sys_arch_protect +10016fba T sys_arch_unprotect +10016fc0 t add_offer_options +1001707c t mark_ip_in_table +100170c0 t dhcps_initialize_message +10017170 T dhcps_handle_state_machine_change +10017240 t dhcps_receive_udp_packet_handler +1001750c T dhcps_deinit +10017534 T dhcps_init +1001763c t prvInsertBlockIntoFreeList +10017684 t vPortDefineHeapRegions.constprop.1 +10017724 T pvPortMalloc +10017804 T __vPortFree +10017848 T vPortSetExtFree +10017864 T vPortFree +10017894 T xPortGetFreeHeapSize +100178a0 t prvPortStartFirstTask +100178c0 T pxPortInitialiseStack +100178dc T vPortSVCHandler +100178fc t pxCurrentTCBConst2 +10017900 T vPortYield +10017918 T ulPortSetInterruptMask +10017928 t prvTaskExitError +10017930 T vPortEnterCritical +1001794c T vPortClearInterruptMask +10017954 T vPortExitCritical +10017968 T xPortPendSVHandler +100179a8 t pxCurrentTCBConst +100179ac T xPortSysTickHandler +100179d0 W vPortSuppressTicksAndSleep +10017ae8 W vPortSetupTimerInterrupt +10017b38 T xPortStartScheduler +10017b68 T vApplicationIdleHook +10017b6c T vApplicationStackOverflowHook +10017b88 T osKernelSysTick +10017b8c T vListInitialise +10017ba2 T vListInitialiseItem +10017ba8 T vListInsertEnd +10017bc0 T vListInsert +10017bf0 T uxListRemove +10017c10 t prvCopyDataToQueue +10017c7a t prvCopyDataFromQueue +10017ca2 t prvUnlockQueue +10017d0a T xQueueGenericReset +10017d64 T xQueueGenericCreate +10017db0 T xQueueCreateCountingSemaphore +10017dc2 T xQueueGenericSend +10017ea0 T xQueueCreateMutex +10017eea T xQueueGenericSendFromISR +10017f4e T xQueueGenericReceive +10018052 T uxQueueMessagesWaiting +10018064 T vQueueDelete +1001807a T vQueueWaitForMessageRestricted +100180b4 t prvGenerateRunTimeOfPeroid +100180f4 t prvGetExpectedIdleTime +10018124 t prvListTaskWithinSingleList +1001820c t prvResetNextTaskUnblockTime +10018230 t prvAddCurrentTaskToDelayedList +10018280 T xTaskGenericCreate +10018434 T vTaskDelete +100184d4 T uxTaskPriorityGet +100184f0 T vTaskPrioritySet +100185a8 T vTaskStartScheduler +10018600 T vTaskSuspendAll +10018610 T xTaskGetTickCount +10018628 T pcTaskGetTaskName +10018638 T vTaskStepTick +10018648 T xTaskIncrementTick +100187c8 T xTaskResumeAll +10018890 T vTaskDelay +100188e0 t prvIdleTask +10018968 T uxTaskGetSystemState +10018a18 T vTaskSwitchContext +10018ad0 T vTaskPlaceOnEventList +10018b2c T vTaskPlaceOnEventListRestricted +10018b70 T xTaskRemoveFromEventList +10018be0 T vTaskSetTimeOutState +10018bf8 T xTaskCheckForTimeOut +10018c44 T vTaskMissedYield +10018c50 T eTaskConfirmSleepModeStatus +10018c70 T xTaskGetSchedulerState +10018c90 T vTaskPriorityInherit +10018d24 T xTaskPriorityDisinherit +10018d94 T sprintf_pcTaskName +10018db4 T vTaskList +10018e64 T vTaskGetRunTimeStats +10018f24 T pvTaskIncrementMutexHeldCount +10018f3c T vTaskGetCurrentTCB +10018f48 t prvCheckForValidListAndQueue +10018f94 t prvInsertTimerInActiveList +10018fd0 T xTimerCreateTimerTask +1001900c T xTimerCreate +10019048 T xTimerGenericCommand +100190dc t prvSwitchTimerLists +1001914c t prvTimerTask +100192b0 T xTimerIsTimerActive +100192c8 t device_mutex_init +1001930c T device_mutex_lock +1001933c T device_mutex_unlock +10019358 t _freertos_systime_to_sec +10019362 t _freertos_ms_to_systime +10019364 t _freertos_sec_to_systime +1001936c t _freertos_usleep_os +1001936e t _freertos_ATOMIC_SET +10019372 t _freertos_ATOMIC_READ +10019376 t _freertos_modular64 +100193ea t _freertos_thread_enter +100193ec t _freertos_enter_critical +100193f0 t _freertos_exit_critical +100193f4 t _freertos_ATOMIC_SUB_RETURN +1001940c t _freertos_ATOMIC_DEC_RETURN +10019422 t _freertos_ATOMIC_ADD_RETURN +1001943a t _freertos_ATOMIC_INC_RETURN +10019450 t _freertos_ATOMIC_SUB +10019468 t _freertos_ATOMIC_DEC +1001946e t _freertos_ATOMIC_ADD +10019486 t _freertos_ATOMIC_INC +1001948c t _freertos_enter_critical_from_isr +1001949c T _freertos_malloc +100194a0 T _freertos_zmalloc +100194b8 t _freertos_memset +100194bc T _freertos_mfree +100194c0 t _freertos_get_current_time +100194c4 t _freertos_spinunlock_irqsave +100194da t _freertos_spinunlock +100194e6 t _freertos_mutex_put +100194ea T _freertos_wakeup_task +100194f0 t _freertos_up_sema +100194f4 t _freertos_exit_critical_mutex +10019500 T _freertos_timerCreate +10019504 T _freertos_timerDelete +10019518 T _freertos_timerStop +1001952c T _freertos_timerChangePeriod +10019546 T _freertos_timerIsTimerActive +1001954a T _freertos_acquire_wakelock +10019550 T _freertos_release_wakelock +10019556 T _freertos_get_scheduler_state +10019576 t _freertos_thread_exit +1001957c t _freertos_GetFreeHeapSize +10019580 t _freertos_yield_os +10019584 t _freertos_udelay_os +10019588 t _freertos_mdelay_os +1001958c t _freertos_deinit_xqueue +100195a6 t _freertos_spinlock_free +100195b8 t _freertos_mutex_free +100195bc t _freertos_free_sema +100195c0 t _freertos_push_to_xqueue +100195e8 t _freertos_pop_from_xqueue +10019610 t _freertos_down_sema +10019632 t _freertos_init_xqueue +1001964c t _freertos_spinlock_irqsave +10019688 t _freertos_spinlock +100196c0 t _freertos_enter_critical_mutex +100196f8 t _freertos_mutex_get +10019730 t _freertos_spinlock_init +1001973e t _freertos_mutex_init +10019744 t _freertos_exit_critical_from_isr +10019750 t _freertos_up_sema_from_isr +10019778 t _freertos_init_sema +10019788 t _freertos_create_task +10019800 t _freertos_memcmp +1001980e t _freertos_memcpy +10019814 t _freertos_delete_task +10019860 t _freertos_mutex_get_timeout +1001989c t _freertos_systime_to_ms +1001989e t _freertos_msleep_os +100198a2 T save_and_cli +100198a6 T restore_flags +100198aa T cli +100198b0 T _freertos_arc4random +100198e0 t _freertos_get_random_bytes +1001991e T RtlInitSema +1001992c T RtlUpSemaFromISR +1001994c T RtlDownSema +10019960 T RtlUdelayOS +10019964 T _htons +1001996a T _ntohs +10019970 T _rtw_zvmalloc +10019990 T _rtw_vmfree +100199b4 T _rtw_malloc +100199c4 T _rtw_zmalloc +100199d4 T _rtw_mfree +100199e4 T deinit_mem_monitor +100199e6 T rtw_vmfree +100199ea T rtw_mfree +100199f0 T rtw_memcpy +10019a00 T rtw_memcmp +10019a10 T rtw_memset +10019a20 T rtw_init_listhead +10019a26 T rtw_is_list_empty +10019a30 T rtw_list_insert_head +10019a3c T rtw_list_insert_tail +10019a48 T rtw_list_delete +10019a58 T rtw_init_sema +10019a68 T rtw_free_sema +10019a78 T rtw_up_sema +10019a88 T rtw_up_sema_from_isr +10019a98 T rtw_down_timeout_sema +10019aa8 T rtw_down_sema +10019abc T rtw_mutex_init +10019acc T rtw_mutex_free +10019adc T rtw_mutex_put +10019aec T rtw_mutex_get_timeout +10019b00 T rtw_enter_critical_from_isr +10019b10 T rtw_enter_critical +10019b14 T rtw_exit_critical_from_isr +10019b24 T rtw_exit_critical +10019b28 T rtw_enter_critical_mutex +10019b38 T rtw_exit_critical_mutex +10019b48 T rtw_queue_empty +10019b52 T rtw_end_of_queue_search +10019b5c T rtw_spinlock_init +10019b6c T rtw_init_queue +10019b78 T rtw_spinlock_free +10019b88 T rtw_spin_lock +10019b98 T rtw_enter_critical_bh +10019b9c T rtw_spin_unlock +10019bac T rtw_exit_critical_bh +10019bb0 T rtw_get_current_time +10019bc0 T rtw_systime_to_ms +10019bd4 T rtw_systime_to_sec +10019be8 T rtw_ms_to_systime +10019bfc T rtw_sec_to_systime +10019c10 T rtw_get_passing_time_ms +10019c24 T rtw_msleep_os +10019c34 T rtw_usleep_os +10019c44 T rtw_mdelay_os +10019c54 T rtw_udelay_os +10019c64 T ATOMIC_SET +10019c74 T ATOMIC_INC +10019c84 T ATOMIC_INC_RETURN +10019c98 T ATOMIC_DEC_RETURN +10019cac T ATOMIC_DEC_AND_TEST +10019cbc T rtw_modular64 +10019cd8 T rtw_get_random_bytes +10019cec T rtw_getFreeHeapSize +10019cfc T init_mem_monitor +10019d0c T add_mem_usage +10019d40 T rtw_zvmalloc +10019d60 T rtw_malloc +10019d80 T rtw_zmalloc +10019da0 T rtw_netif_queue_stopped +10019da4 T rtw_netif_wake_queue +10019da6 T rtw_netif_start_queue +10019da8 T rtw_netif_stop_queue +10019daa T flush_signals_thread +10019dac T rtw_acquire_wakelock +10019dbc T rtw_release_wakelock +10019dcc T rtw_create_task +10019de8 T rtw_delete_task +10019df8 T rtw_wakeup_task +10019e08 T rtw_timerCreate +10019e24 T rtw_timerDelete +10019e38 T rtw_timerIsTimerActive +10019e4c T rtw_timerStop +10019e60 T rtw_timerChangePeriod +10019e74 T rtw_thread_enter +10019e84 T rtw_thread_exit +10019e94 T tcm_heap_free +10019f14 T tcm_heap_init +10019f64 T tcm_heap_freeSpace +10019fa4 T tcm_heap_malloc +1001a044 T tcm_heap_calloc +1001a05c T flash_init +1001a0f8 T flash_turnon +1001a110 T flash_erase_sector +1001a13c T flash_stream_read +1001a20c T flash_stream_write +1001a364 T i2s_init +1001a43c T i2s_set_dma_buffer +1001a48e T i2s_tx_irq_handler +1001a494 T i2s_set_param +1001a4c8 T i2s_deinit +1001a4cc T i2s_enable +1001a4d0 T i2s_disable +1001a4d4 W pinmap_merge +1001a510 W pinmap_find_peripheral +1001a528 W pinmap_peripheral +1001a560 T sleep_ex_selective +1001a574 T deepsleep_ex +1001a598 T us_ticker_read +1001a5c4 T En32KCalibration +1001a658 T WDGInitial +1001a6e4 T WDGStart +1001a6fc T WDGRefresh +1001a718 T I2SISRHandle +1001a7d4 T RtkI2SDeInit +1001a8b4 T RtkI2SEnable +1001a8f0 T RtkI2SDisable +1001a92c T RtkI2SLoadDefault +1001a990 T HalI2SOpInit +1001aa0c T RtkI2SInit +1001abd0 T HalI2SInit +1001ac0e T HalI2SDisable +1001ac34 T HalI2SEnable +1001ac58 T HalI2SDeInit +1001acb0 T HalTimerOpInit_Patch +1001acec T freertos_ready_to_sleep +1001acfc T freertos_pre_sleep_processing +1001adc0 T freertos_post_sleep_processing +1001ade4 T acquire_wakelock +1001ae24 T release_wakelock +1001ae80 T HalI2SInitRtl8195a_Patch +1001af82 T HalI2SSetRateRtl8195a +1001afc8 T HalI2SSetWordLenRtl8195a +1001aff0 T HalI2SSetChNumRtl8195a +1001b018 T HalI2SSetPageNumRtl8195a +1001b040 T HalI2SSetPageSizeRtl8195a +1001b06a T HalI2SSetDMABufRtl8195a +1001b0d4 T HalI2SGetTxPageRtl8195a +1001b0f4 T HalI2SPageSendRtl8195a +1001b140 T HalI2SClearAllOwnBitRtl8195a +1001b174 T HalI2SDMACtrlRtl8195a +1001b178 T HalTimerIrq2To7Handle_Patch +1001b1cc T HalTimerIrqRegisterRtl8195a_Patch +1001b248 T HalTimerIrqUnRegisterRtl8195a_Patch +1001b2c0 T HalTimerDeInitRtl8195a_Patch +1001b2f4 T HalTimerReadCountRtl8195a_Patch +1001b30c T HalTimerReLoadRtl8195a_Patch +1001b340 T HalTimerInitRtl8195a_Patch +1001b414 T HalTimerIrqEnRtl8195a +1001b428 T HalTimerEnRtl8195a_Patch +1001b43c T HalTimerDisRtl8195a_Patch +1001b450 t rtw_ht_operation_update +1001b502 t associated_clients_update.part.11 +1001b53e T chk_sta_is_alive +1001b57c T add_RATid +1001b684 T update_sta_info_apmode +1001b73c T update_beacon +1001b9fc T rtw_check_beacon_data +1001c0fc T associated_clients_update +1001c106 T bss_cap_update_on_sta_join +1001c2b6 T bss_cap_update_on_sta_leave +1001c3b2 T ap_free_sta +1001c464 T expire_timeout_chk +1001c5a0 T rtw_sta_flush +1001c624 T free_mlme_ap_info +1001c670 T sta_info_update +1001c6ac T ap_sta_info_defer_update +1001c6dc T start_ap_mode +1001c71c T init_mlme_ap_info +1001c732 T stop_ap_mode +1001c780 T rtw_generate_bcn_ie +1001caa4 T _rtw_init_evt_priv +1001cab6 T _rtw_free_cmd_priv +1001cac0 T _rtw_enqueue_cmd +1001caec T _rtw_dequeue_cmd +1001cb20 T _rtw_observequeue_cmd +1001cb34 T rtw_init_cmd_priv +1001cb3e T rtw_init_evt_priv +1001cb42 T rtw_free_evt_priv +1001cb44 T rtw_free_cmd_priv +1001cb48 T rtw_cmd_filter +1001cb66 T rtw_free_cmd_obj +1001cb90 T rtw_enqueue_cmd +1001cbe6 T rtw_set_channel_plan_cmd_callback +1001cbfe T rtw_survey_cmd_callback +1001cc1a T rtw_disassoc_cmd_callback +1001cc4a T rtw_joinbss_cmd_callback +1001cc66 T rtw_setstaKey_cmdrsp_callback +1001cc80 T rtw_cmd_thread +1001cddc T rtw_joinbss_cmd +1001d086 T rtw_disassoc_cmd +1001d0d4 T rtw_setstakey_cmd +1001d1c4 T rtw_clearstakey_cmd +1001d264 T rtw_dynamic_chk_wk_cmd +1001d2b6 T rtw_set_chplan_cmd +1001d336 T dynamic_chk_wk_hdl +1001d3fe T lps_ctrl_wk_hdl +1001d462 T rtw_lps_ctrl_wk_cmd +1001d4cc T rtw_sitesurvey_cmd +1001d594 T rpt_timer_setting_wk_hdl +1001d5a8 T rtw_ps_cmd +1001d604 T rtw_chk_hi_queue_cmd +1001d658 T rtw_drvextra_cmd_hdl +1001d734 t rtw_free_mlme_ie_data +1001d74c T rtw_init_mlme_timer +1001d7a8 T rtw_del_mlme_timer +1001d7c8 T reconnect_timer_hdl +1001d868 T _rtw_init_mlme_priv +1001d8ea T rtw_mfree_mlme_priv_lock +1001d906 T rtw_free_mlme_priv_ie_data +1001d93e T _rtw_free_mlme_priv +1001d966 T _rtw_alloc_network +1001d9b6 T _rtw_free_network +1001da16 T _rtw_free_network_nolock +1001da3c T _rtw_find_network +1001da78 T _rtw_free_network_queue +1001dac0 T rtw_if_up +1001dae0 T rtw_get_capability_from_ie +1001dae4 T rtw_get_capability +1001dafe T rtw_get_beacon_interval_from_ie +1001db02 T rtw_init_mlme_priv +1001db1a T rtw_free_mlme_priv +1001db1e T rtw_free_network_queue +1001db22 T rtw_is_same_ibss +1001db38 T is_same_network +1001db9c T update_network +1001dc36 T rtw_update_scanned_network +1001dd48 T rtw_add_network +1001dd86 T rtw_survey_event_callback +1001de32 T rtw_dummy_event_callback +1001de34 T rtw_free_assoc_resources +1001defe T rtw_indicate_connect +1001df0e T rtw_indicate_disconnect +1001df30 T rtw_indicate_scan_done +1001df34 T rtw_joinbss_event_callback +1001df52 T search_max_mac_id +1001df9a T rtw_stassoc_hw_rpt +1001dfd2 T rtw_stassoc_event_callback +1001e000 T rtw_stadel_event_callback +1001e0a6 T _rtw_join_timeout_handler +1001e130 T rtw_join_timeout_handler +1001e188 T rtw_scan_timeout_handler +1001e1b8 T _rtw_scan_timeout_handler +1001e1bc T rtw_dynamic_check_timer_handlder +1001e214 T _dynamic_check_timer_handlder +1001e258 T rtw_select_and_join_from_scanned_queue +1001e32c T rtw_surveydone_event_callback +1001e444 T rtw_set_auth +1001e494 T rtw_set_key +1001e556 T rtw_restruct_wmm_ie +1001e5bc T rtw_restruct_sec_ie +1001e628 T rtw_joinbss_reset +1001e638 T rtw_restructure_ht_ie +1001e718 T rtw_update_ht_cap +1001e7a2 T rtw_joinbss_event_prehandle +1001e9ce T rtw_linked_check +1001e9ea T rtw_buddy_adapter_up +1001ea22 T check_buddy_fwstate +1001ea40 t get_da +1001ea60 t get_sa +1001ea8a T OnAction +1001ea9c T DoReserved +1001eaa0 t _mgt_dispatcher.isra.2 +1001eaec T rtw_is_channel_set_contains_channel +1001eb0e T init_hw_mlme_ext +1001eb24 T init_channel_set +1001ebbc T free_mlme_ext_priv +1001ebe4 T mgt_dispatcher +1001ec6c T alloc_mgtxmitframe +1001eca4 T update_mgnt_tx_rate +1001ecaa T update_mgntframe_attrib +1001ed06 T rtw_build_mgnt_frame +1001ed5c T dump_mgntframe +1001ed76 T rtw_send_mgnt +1001ed94 t issue_action_BSSCoexistPacket +1001efa0 T update_hidden_ssid +1001eff4 T issue_beacon +1001f20c T issue_probersp +1001f49c T OnProbeReq +1001f564 T issue_probereq +1001f71c T issue_auth +1001f984 T OnAuth +1001fc28 T issue_asocrsp +1001fe9c T issue_assocreq +100201d8 T issue_nulldata +100202c2 T issue_qos_nulldata +100203f4 T issue_deauth +100204dc T issue_action_BA +10020758 T OnAction_back +10020826 T collect_bss_info +10020a58 T start_clnt_auth +10020ae8 T start_clnt_assoc +10020b1c T OnAuthClient +10020bfc T report_scan_result_one +10020dbc T add_site_survey +10020f42 T report_survey_event +10021180 T OnProbeRsp +100211b4 T report_surveydone_event +10021218 T report_join_res +10021288 T OnAssocRsp +100213d4 T report_del_sta_event +10021466 T receive_disconnect +100214bc T OnBeacon +10021644 T OnDeAuth +1002179c T OnDisassoc +1002190c T report_add_sta_event +10021980 T OnAssocReq +10021f70 T rtw_port_switch_chk +10021ff4 T update_sta_info +10022074 T mlmeext_sta_del_event_callback +100220f4 T _linked_info_dump +10022156 T _linked_rx_signal_strehgth_display +10022190 T linked_status_chk +10022404 T survey_timer_hdl +100224e4 T _survey_timer_hdl +100224e8 T link_timer_hdl +10022566 T _link_timer_hdl +1002256a T addba_timer_hdl +1002258a T NULL_hdl +1002258e T setopmode_hdl +100225d4 T disconnect_hdl +10022680 T setauth_hdl +10022690 T setkey_hdl +100226e8 T set_stakey_hdl +100227ec T set_tx_beacon_cmd +10022860 T mlme_evt_hdl +100228ac T tx_beacon_hdl +10022966 T check_buddy_mlmeinfo_state +10022980 T site_survey +10022b50 T sitesurvey_cmd_hdl +10022c5e T concurrent_chk_start_clnt_join +10022cf4 T start_clnt_join +10022dc8 T join_cmd_hdl +10022eec T concurrent_chk_joinbss_done +100230b4 T mlmeext_joinbss_event_callback +100231f0 T set_chplan_hdl +1002320c T init_mlme_ext_timer +10023268 T init_mlme_ext_priv +100233a4 t get_hdr_bssid +100233cc t filter_packet +10023454 t promisc_get_encrypt +100234a6 t promisc_info_get +1002354a t promisc_set_enable +100235e6 T _promisc_deinit +10023638 T _promisc_recv_func +10023b84 T _promisc_set +10023c14 T _is_promisc_enabled +10023c2c t SetEAPOL_KEYIV +10023cca t ToDrv_SetPTK +10023d72 t Message_ReplayCounter_OC2LI.isra.2 +10023da0 t Message_SmallerEqualReplayCounter.isra.4 +10023dd2 t Message_setReplayCounter.isra.5 +10023df0 t INCLargeInteger +10023e10 t INCOctet16_INTEGER +10023e58 t INCOctet32_INTEGER +10023eb8 t ToDrv_DisconnectSTA +10023f7c t CheckMIC.constprop.14 +10023ffc t CalcMIC.constprop.15 +1002405c T DecWPA2KeyData +10024110 T DecGTK +100241cc T ToDrv_SetGTK +1002425c T init_wpa_sta_info +10024348 T SendEAPOL +10024a00 T ClientSendEAPOL +10024ee8 t ResendTimeout +10024f70 T EAPOLKeyRecvd +100250e8 T ClientEAPOLKeyRecvd +100254a8 T psk_derive +1002555c T psk_init +1002564c T psk_strip_rsn_pairwise +100256cc T psk_strip_wpa_pairwise +1002574c T tkip_send_mic_failure_report +100258c0 T pwr_state_check_handler +100258c4 T ips_enter +1002596c T ips_leave +10025a84 T rtw_pwr_unassociated_idle +10025ace T rtw_ps_processor +10025b26 T PS_RDY_CHECK +10025b8e T rtw_set_ps_mode +10025bfc T LPS_RF_ON_check +10025c52 T LPS_Enter +10025cc0 T LPS_Leave +10025cfc T LeaveAllPowerSaveMode +10025d0c T rtw_init_pwrctrl_priv +10025de0 T rtw_free_pwrctrl_priv +10025df4 T _rtw_pwr_wakeup +10025ed0 T rtw_pm_set_lps +10025f18 T rtw_pm_set_ips +10025f5c T rtw_pm_set_tdma_param +10025f78 T rtw_pm_set_lps_dtim +10025f84 T rtw_pm_get_lps_dtim +10025f90 t recvframe_pull +10025fb2 t recvframe_pull_tail +10025fd4 T rtw_signal_stat_timer_hdl +10026072 T _rtw_init_sta_recv_priv +10026090 T _rtw_init_recv_priv +10026138 T rtw_mfree_recv_priv_lock +1002616c T _rtw_alloc_recvframe +1002619e T rtw_alloc_recvframe +100261c4 T rtw_free_recvframe +10026260 T _rtw_enqueue_recvframe +1002628c T rtw_enqueue_recvframe +100262b6 T rtw_free_recvframe_queue +100262ee T rtw_free_uc_swdec_pending_queue +10026316 T _rtw_free_recv_priv +10026346 T rtw_free_buf_pending_queue +1002634a T recvframe_chkmic +10026448 T decryptor +100264e4 T portctrl +1002655a T recv_decache +10026588 T process_pwrbit_data +100265c8 T process_wmmps_data +10026650 T count_rx_stats +100266c4 T sta2sta_data_frame +10026800 T ap2sta_data_frame +1002692c T sta2ap_data_frame +100269b4 T validate_recv_ctrl_frame +10026b4e T validate_recv_data_frame +10026da8 T wlanhdr_to_ethhdr +10026ee4 T recvframe_defrag +10026f8e T recvframe_chk_defrag +10027044 T validate_recv_mgnt_frame +10027080 T validate_recv_frame +10027148 T recv_indicatepkt_reorder +1002716a T process_recv_indicatepkts +100271c2 T recv_func_prehandle +100271ea T recv_func_posthandle +1002724e T recv_func +100272d8 T rtw_recv_entry +10027308 T rtw_recv_tasklet +10027360 T rtw_wep_encrypt +100273a6 T rtw_wep_decrypt +100273ec T rtw_tkip_encrypt +10027458 T rtw_tkip_decrypt +100274c4 T rtw_aes_encrypt +10027530 T rtw_aes_decrypt +10027594 T rtw_init_sec_priv +10027606 T rtw_free_sec_priv +10027626 t wifi_mac_hash +10027650 T _addba_timer_hdl +10027654 T _rtw_init_stainfo +100276ce T _rtw_init_sta_priv +100277b6 T _rtw_free_sta_xmit_priv_lock +100277e2 T rtw_mfree_stainfo +1002780e T rtw_mfree_sta_priv_lock +10027844 T _rtw_free_sta_priv +10027864 T init_addba_retry_timer +1002788c T rtw_alloc_stainfo +10027956 T rtw_free_stainfo +10027af8 T rtw_get_stainfo +10027b74 T rtw_init_bcmc_stainfo +10027ba4 T rtw_get_bcmc_stainfo +10027bc8 T rtw_free_all_stainfo +10027c22 T cckrates_included +10027c4a T cckratesonly_included +10027c72 T networktype_to_raid_ex +10027cd0 T judge_network_type +10027d20 T ratetbl_val_2wifirate +10027d34 T is_basicrate +10027d60 T ratetbl2rateset +10027da4 T get_rate_set +10027dce T UpdateBrateTbl +10027e00 T UpdateBrateTblForSoftAP +10027e34 T Save_DM_Func_Flag +10027e4a T Restore_DM_Func_Flag +10027e60 T Switch_DM_Func +10027e7c T Set_MSR +10027ea0 T set_opmode +10027ee4 T SelectChannel +10027f18 T SetBWMode +10027f54 T set_channel_bwmode +10027faa T get_my_bssid +10027fae T get_beacon_interval +10027fcc T is_client_associated_to_ap +10027fe4 T is_client_associated_to_ibss +10028000 T is_IBSS_empty +10028022 T decide_wait_for_beacon_timeout +1002803e T invalidate_cam_all +10028046 T write_cam +100280bc T clear_cam_entry +100280ea T flush_all_cam_entry +10028148 T WMM_param_handler +1002816e T WMMOnAssocRsp +1002823c T HT_caps_handler +100282dc T HT_info_handler +10028300 T HTOnAssocRsp +10028338 T ERP_IE_handler +10028354 T VCS_update +100283a6 T rtw_check_bcn_info +100285b6 T update_beacon_info +1002860c T is_ap_in_tkip +10028684 T wifirate2_ratetbl_inx +100286f0 T update_basic_rate +1002871e T update_supported_rate +10028748 T update_MCS_rate +10028754 T support_short_GI +10028782 T get_highest_rate_idx +1002879c T Update_RA_Entry +100287a4 T set_sta_rate +100287ac T update_tx_basic_rate +10028804 T check_assoc_AP +100288f8 T update_IOT_info +10028956 T update_capinfo +100289d4 T update_wireless_mode +10028a74 T update_bmc_sta_support_rate +10028a9c T update_TSF +10028aae T correct_TSF +10028ab6 t _init_txservq +10028acc t set_qos +10028b1c T _rtw_init_sta_xmit_priv +10028b62 T rtw_mfree_xmit_priv_lock +10028bae T qos_acm +10028be8 T xmitframe_addmic +10028d46 T xmitframe_swencrypt +10028d72 T rtw_make_wlanhdr +10028f52 T rtw_txframes_pending +10028f8e T rtw_txframes_sta_ac_pending +10028fc4 T rtw_txframes_update_attrib_vcs_info +10029064 T rtw_put_snap +100290a8 T rtw_update_protection +100290ee T rtw_count_tx_stats +1002913e T rtw_free_xmitbuf_ext +10029180 T rtw_alloc_xmitframe +100291d8 T rtw_free_xmitframe +1002922a T rtw_free_xmitframe_queue +10029268 T rtw_get_sta_pending +100292a8 T rtw_xmit_classifier +1002930e T rtw_xmitframe_enqueue +1002931c T rtw_alloc_hwxmits +10029376 T rtw_free_hwxmits +1002938c T _rtw_free_xmit_priv +10029458 T rtw_init_hwxmits +10029470 T _rtw_init_xmit_priv +10029628 T rtw_get_ff_hwaddr +1002963c T xmitframe_enqueue_for_sleeping_sta +100297fc t dequeue_xmitframes_to_sleeping_queue +10029852 T stop_sta_xmit +1002993a T wakeup_sta_to_xmit +10029b50 T xmit_delivery_enabled_frames +10029c6c T rtw_xmit_tasklet +10029cc4 T rtw_xmit_mgnt +10029cc8 T rtw_xmit +10029ff2 T rtw_sctx_done_err +10029ffe T rtw_alloc_xmitbuf +1002a058 T rtw_free_xmitbuf +1002a0ca T rtw_alloc_xmitbuf_ext +1002a150 T rtw_sctx_done +1002a156 t rtl8195a_free_rx_ring +1002a164 t bus_write32 +1002a1c0 t bus_write16 +1002a21c t bus_write8 +1002a278 t bus_read32 +1002a2d2 t bus_read16 +1002a32e t bus_read8 +1002a38a t rtl8195a_free_tx_ring +1002a418 T rtl8195a_init_desc_ring +1002a558 T rtl8195a_free_desc_ring +1002a574 T rtl8195a_reset_desc_ring +1002a60a T InitLxDmaRtl8195a +1002a76c T rtl8195a_check_txdesc_closed +1002a7e4 t rtl8195a_tx_isr +1002a8c8 T InterruptRecognized8195a +1002a958 T InitInterrupt8195a +1002a978 T EnableDMA8195a +1002a9a0 T EnableInterrupt8195a +1002a9e0 T DisableDMA8195a +1002a9ec T DisableInterrupt8195a +1002aa04 T UpdateInterruptMask8195a +1002aa66 T CheckRxTgRtl8195a +1002aaa0 T rtl8192ee_check_rxdesc_remain +1002aad0 T rtl8195a_recv_tasklet +1002ade4 T rtl8195a_tx_int_handler +1002ae10 T InterruptHandle8195a +1002b084 T rtl8195a_xmit_tasklet +1002b0ac T lxbus_set_intf_ops +1002b0ec t GetTxBufDesc +1002b136 t UpdateFirstTxbdtoXmitBuf.isra.3 +1002b168 t check_nic_enough_desc.isra.4 +1002b1b8 T rtl8195ab_init_xmit_priv +1002b1c6 T rtl8195ab_free_xmit_priv +1002b1ce T GetDmaTxbdIdx +1002b1ea T rtl8195a_enqueue_xmitbuf +1002b20e T rtl8195a_dequeue_xmitbuf +1002b232 T SetTxbdForLxDMARtl8195ab +1002b2b2 T UpdateTxbdHostIndex +1002b2f0 T rtw_dump_xframe +1002b4c2 T check_tx_desc_resource +1002b4fc T rtw_dequeue_xframe +1002b590 T rtw_xmitframe_coalesce +1002b844 T rtl8195ab_xmitframe_resume +1002b93a T rtl8195ab_mgnt_xmit +1002b976 T rtl8195ab_hal_xmit +1002ba84 t Hal_GetEfuseDefinition +1002bab4 t ResumeTxBeacon +1002baf8 T UpdateHalRAMask8195A +1002bc90 T HalLittleWifiMCUThreadRtl8195a +1002bce4 T HalCheckInReqStateThreadRtl8195a +1002bd30 T HalTDMAChangeStateThreadRtl8195a +1002bd7c t rtl8195a_read_chip_version +1002bdf0 t Hal_EfuseWordEnableDataWrite +1002c034 t Hal_EfusePowerSwitch +1002c048 t rtl8195a_free_hal_data +1002c062 t StopTxBeacon +1002c0ac T SetHalODMVar8195A +1002c164 T rtl8195a_start_thread +1002c1cc T rtl8195a_stop_thread +1002c1f0 t Hal_ReadEFuse +1002c360 T GetHalODMVar8195A +1002c374 t rtw_flash_map_update.part.12 +1002c414 t rtw_flash_map_erase +1002c458 t Hal_EfusePgPacketWrite +1002c6d4 t Hal_EfuseGetCurrentSize +1002c7b4 t rtw_flash_map_write +1002c982 T rtl8195a_InitBeaconParameters +1002c9f2 T _InitBurstPktLen_8195AB +1002c9fc T rtl8195a_set_hal_ops +1002cadc T rtl8195a_init_default_value +1002cade T rtl8195a_InitLLTTable +1002cb28 T Hal_GetChnlGroup8195A +1002cb64 T rtw_config_map_read +1002cc50 T rtw_config_map_write +1002ccfc T Hal_InitPGData +1002cd5a T Hal_EfuseParseIDCode +1002cd72 T Hal_ReadPowerValueFromPROM_8195A +1002ce10 T Hal_EfuseParseTxPowerInfo_8195A +1002cea8 T Hal_EfuseParseEEPROMVer_8195A +1002cebe T Hal_EfuseParsePackageType_8195A +1002cf28 T Hal_EfuseParseChnlPlan_8195A +1002cf58 T Hal_EfuseParseCustomerID_8195A +1002cf6e T Hal_EfuseParseXtal_8195A +1002cf86 T Hal_EfuseParseThermalMeter_8195A +1002cfae T Hal_ReadRFGainOffset +1002cffe T BWMapping_8195A +1002d01e T SCMapping_8195A +1002d046 T rtl8195a_update_txdesc +1002d316 T rtl8195a_fill_fake_txdesc +1002d3d4 T SetHwReg8195A +1002e094 T GetHwReg8195A +1002e128 T SetHalDefVar8195A +1002e208 T GetHalDefVar8195A +1002e22c T PHY_QueryBBReg_8195A_Safe +1002e258 T PHY_SetBBReg_8195A_Safe +1002e284 t phy_RFSerialRead_8195A +1002e338 T PHY_QueryRFReg_8195A +1002e350 T PHY_SetRFReg_8195A +1002e3a8 T PHY_MACConfig8195A +1002e3c2 T PHY_BBConfig8195A +1002e4d2 T PHY_RFConfig8195A +1002e4d6 T PHY_SetTxPowerIndex_8195A +1002e5e0 T phy_TxPwrAdjInPercentage +1002e620 T PHY_GetTxPowerIndex_8195A +1002e710 T PHY_SetTxPowerLevel8195A +1002e716 T phy_SpurCalibration_8195A +1002e9ce T phy_SetRegBW_8195A +1002ea0c T phy_PostSetBwMode8195A +1002eb68 T phy_SwChnl8195A +1002ec10 T phy_SwChnlAndSetBwMode8195A +1002ec60 T PHY_HandleSwChnlAndSetBW8195A +1002ed10 T PHY_SetBWMode8195A +1002ed32 T PHY_SwChnl8195A +1002ed4c T PHY_SetSwChnlBWMode8195A +1002ed6a t HalTimerEnable +1002ed7c T InitTDMATimer +1002eda4 T ChangeStateByTDMA +1002edb4 T GetMinRateInRRSR +1002ede8 T CheckInReqState +1002edf8 T InitCheckStateTimer +1002ee28 T InitGTimer1ms +1002ee74 T DeInitGTimer1ms +1002eebc T ChangeTransmiteRate +1002eef8 T PowerBitSetting +1002ef74 T ChkandChangePS +1002efd8 T IssueRsvdPagePacketSetting +1002f04c T IssuePSPoll +1002f078 T WaitTxStateMachineOk +1002f0cc T IssueNullData +1002f15c T PsCloseRF +1002f190 T PsOpenRF +1002f1c0 T ChkTxQueueIsEmpty +1002f1d8 T InitPS +1002f248 T ConfigListenBeaconPeriod +1002f26c T PS_S2_Condition_Match +1002f2a0 T PS_S4_Condition_Match +1002f31c T PS_32K_Condition_Match +1002f358 T PS_S2ToS3ToS0State +1002f3c0 T PS_S2ToS0State +1002f3dc T PS_S3ToS2orS0State +1002f40c T PS_S0ToS1ToS2State +1002f468 T PS_S1ToS0orS2State +1002f498 T PS_S2ToS4State +1002f4e4 T PS_S0ToS6State +1002f504 T PS_S6ToS0State +1002f51c T CheckTSFIsStable +1002f56c T WaitHWStateReady +1002f57c T SysClkDown +1002f5ec T SysClkUp +1002f638 T ResetPSParm +1002f6ac T PS_S4ToS2State +1002f6d0 T SleepTo32K +1002f730 T Change_PS_State +1002f8dc T Legacy_PS_Setting +1002f950 T PSModeSetting +1002f9f4 T ChangePSStateByRPWM +1002fa38 T ChangeTDMAState +1002fb58 T TDMAChangeStateTask +1002fb82 T EnterPS +1002fba4 T SetSmartPSTimer +1002fbe0 T GTimer7Handle +1002fc3c T SmartPS2InitTimerAndToGetRxPkt +1002fc78 T PS_OnBeacon +1002fd28 T PSBcnEarlyProcess +1002fde4 T PSMtiBcnEarlyProcess +1002fe90 T PSRxBcnProcess +1002ffe0 T TxPktInPSOn +1003001e T PsBcnToProcess +100300d8 T GTimer6Handle +10030124 T RPWMProcess +10030160 T PSSetMode +100301d8 T SpeRPT +100302f8 T ISR_BcnEarly +10030364 T ISR_MtiBcnEarly +10030398 T ISR_RxBcn +100303b4 T ISR_RxBCMD1 +100303e4 T ISR_RxBCMD0 +10030438 T ISR_RxUCMD1 +10030476 T ISR_RxUCMD0 +100304b2 T ISR_TxPktIn +100304c4 T ISR_TXCCX +100304c8 T H2CHDL_SetPwrMode +100305f0 T CheckInReqStateTask +10030636 T HalGetNullTxRpt +10030654 T ISR_TBTT +100306cc T H2CHDL_BcnIgnoreEDCCA +100306dc T PMUInitial +1003072c T PMUTask +10030838 T PHY_RF6052SetBandwidth8195A +1003087c T PHY_RF6052_Config8195A +10030934 t process_rssi +1003096a T rtl8195a_query_rx_desc_status +10030a1a T rtl8195a_query_rx_phy_status +10030b72 T hal_com_get_channel_plan +10030ba6 T HAL_IsLegalChannel +10030bc4 T MRateToHwRate +10030bd8 T HwRateToMRate +10030bec T HalSetBrateCfg +10030c98 T Hal_MappingOutPipe +10030cb4 T hal_init_macaddr +10030ce0 T hw_var_port_switch +10030f68 T SetHwReg +10030f72 T GetHwReg +10030f74 T switch_power_saving_mode +10030fb8 T rtw_bb_rf_gain_offset +10031000 T PHY_GetRateValuesOfTxPowerByRate +10031198 T PHY_StoreTxPowerByRateNew +10031234 T PHY_InitTxPowerByRate +1003124c T PHY_StoreTxPowerByRate +10031264 T PHY_GetTxPowerIndexBase +10031304 T PHY_GetTxPowerTrackingOffset +10031330 T PHY_GetRateIndexOfTxPowerByRate +10031344 T PHY_GetTxPowerByRate +100313a4 T phy_StoreTxPowerByRateBase +100313f0 T PHY_SetTxPowerByRate +1003142c T phy_ConvertTxPowerByRateInDbmToRelativeValues +1003152c T PHY_TxPowerByRateConfiguration +1003153e T PHY_SetTxPowerIndexByRateArray +1003157c T PHY_SetTxPowerIndexByRateSection +100315e0 T PHY_SetTxPowerLevelByPath +10031616 T phy_GetWorldWideLimit +10031642 T PHY_GetTxPowerLimit +1003176c T PHY_ConvertTxPowerLimitToPowerIndex +100318bc T PHY_InitTxPowerLimit +10031904 T PHY_SetTxPowerLimit +10031980 T PHY_GetTxPowerIndex +10031990 T rtw_hal_chip_configure +100319a6 T rtw_hal_read_chip_info +100319bc T rtw_hal_read_chip_version +100319d2 T rtw_hal_def_value_init +100319e8 T rtw_hal_free_data +100319fe T rtw_hal_dm_init +10031a14 T rtw_hal_dm_deinit +10031a2a T rtw_hal_init +10031a54 T rtw_hal_deinit +10031a6e T rtw_hal_set_hwreg +10031a7c T rtw_hal_get_hwreg +10031a8a T rtw_hal_set_def_var +10031a9c T rtw_hal_get_def_var +10031aae T rtw_hal_set_odm_var +10031abc T rtw_hal_get_odm_var +10031aca T rtw_hal_enable_interrupt +10031aec T rtw_hal_disable_interrupt +10031b0e T rtw_hal_inirp_init +10031b20 T rtw_hal_inirp_deinit +10031b32 T rtw_hal_irp_reset +10031b40 T rtw_hal_xmit +10031b52 T rtw_hal_mgnt_xmit +10031b64 T rtw_hal_init_xmit_priv +10031b76 T rtw_hal_free_xmit_priv +10031b84 T rtw_hal_update_ra_mask +10031bb2 T rtw_hal_add_ra_tid +10031bc0 T rtw_hal_clone_data +10031bce T rtw_hal_start_thread +10031bdc T rtw_hal_stop_thread +10031bea T rtw_hal_read_bbreg +10031c1e T rtw_hal_write_bbreg +10031c4a T rtw_hal_read_rfreg +10031c5c T rtw_hal_write_rfreg +10031c70 T rtw_hal_interrupt_handler +10031c82 T rtw_hal_set_bwmode +10031c90 T rtw_hal_set_chan +10031c9e T rtw_hal_set_chnl_bw +10031cb4 T rtw_hal_dm_watchdog +10031cca T rtw_hal_macid_sleep +10031cea T rtw_hal_macid_wakeup +10031d0a T decide_chip_type_by_device_id +10031d10 t rtw_net_get_stats +10031d60 t netdev_if2_close +10031d80 t netdev_close +10031ddc t rtw_if1_deinit +10031e76 T rtw_os_indicate_connect +10031e7a T rtw_os_indicate_scan_done +10031e7e T rtw_reset_securitypriv +10031f72 T rtw_os_indicate_disconnect +10031fbc T rtw_init_netdev +1003210c T rtw_drv_if2_init +10032314 T rtw_drv_if2_stop +1003236a T rtw_drv_if2_free +100323b8 T _netdev_open +100324d4 T _netdev_if2_open +10032590 T netdev_if2_open +100325b8 T netdev_open +100325e0 T rtw_drv_probe +10032760 T rtw_dev_remove +100327a4 T rtw_drv_entry +100327d0 T rtw_drv_halt +10032800 t rtw_wx_set_autoreconnect +1003282e t rtw_wx_get_autoreconnect +1003283c t rtw_forwarding_set +1003285e t rtw_set_ch_deauth +10032880 t get_priv_size +10032894 t rtw_wx_del_custome_ie +100328e0 t rtw_wx_set_pscan_freq +10032962 t rtw_wx_update_custome_ie +100329d4 t rtw_set_tos_value +100329f4 t rtw_get_tx_power +10032b38 t rtw_wx_set_custome_ie +10032be4 t rtw_pm_get +10032c28 t rtw_pm_set +10032cdc t rtw_wx_read32 +10032d88 t rtw_wx_write32 +10032dec t rtw_wx_set_freq.isra.10 +10032e94 T rtw_ex_set +10032f54 T wireless_send_event +10032f5e T indicate_wx_custom_event +10032fba T indicate_wx_scan_result_present +10032fe2 T indicate_wx_scan_complete_event +1003300c T rtw_indicate_sta_assoc +1003305c T rtw_indicate_sta_disassoc +100330b4 T rtw_indicate_wx_assoc_event +100330e6 T rtw_indicate_wx_disassoc_event +10033116 T rtw_set_wpa_ie +1003322c T strtopsk +10033298 T rtw_wx_get_passphrase +100332e4 T rtw_wx_set_ap_essid +100333d4 T mac_reg_dump +10033480 T bb_reg_dump +100334dc T rf_reg_dump +10033554 t rtw_dbg_port +10033bbc T rtw_set_sta_num +10033bd8 T rtw_ex_get_drv_ability +10033c98 T rtw_ex_get +10033f30 T rtw_ioctl +10034ebc T rtw_os_recv_resource_init +10034ec0 T rtw_os_recv_resource_alloc +10034eca T rtw_os_recv_resource_free +10034ecc T rtw_tkip_countermeasure +10034f6c T rtw_handle_tkip_mic_err +10035014 T rtw_recv_indicatepkt +10035264 T skb_fail_inc +10035280 T skb_fail_get_and_rst +1003529c T init_skb_pool +100352f4 T init_skb_data_pool +1003534c T alloc_skb +1003544c T kfree_skb +100354b4 T kfree_skb_chk_key +100354b8 T skb_put +100354ec T skb_reserve +100354fa T dev_alloc_skb +10035516 T skb_end_pointer +1003551a T skb_set_tail_pointer +10035522 T skb_pull +1003553a T skb_copy +10035562 T rtw_remainder_len +1003556e T _rtw_open_pktfile +10035580 T _rtw_pktfile_read +100355ae T rtw_set_tx_chksum_offload +100355b0 T rtw_os_xmit_resource_alloc +100355ba T rtw_os_xmit_resource_free +100355bc T rtw_os_pkt_complete +100355c4 T rtw_os_xmit_complete +100355d6 T rtw_os_xmit_schedule +10035612 T rtw_xmit_entry +1003565e T rtw_alloc_etherdev_with_old_priv +10035674 T rtw_alloc_etherdev +100356a0 T rtw_free_netdev +100356c0 T timer_wrapper +10035714 T alloc_etherdev +10035770 T free_netdev +1003578a T dev_alloc_name +10035794 T init_timer_wrapper +100357b4 T deinit_timer_wrapper +10035800 T init_timer +100358b8 T mod_timer +10035998 T cancel_timer_ex +100359e0 T del_timer_sync +10035a44 T rtw_init_timer +10035a4c T rtw_set_timer +10035a50 T rtw_cancel_timer +10035a5a T rtw_del_timer +10035a60 T rltk_get_idx_bydev +10035a70 T rltk_wlan_init +10035af8 T rltk_wlan_deinit +10035bbc T rltk_wlan_start +10035bf0 T rltk_wlan_check_isup +10035c00 T rltk_wlan_tx_inc +10035c14 T rltk_wlan_tx_dec +10035c28 T rltk_wlan_get_recv_skb +10035c38 T rltk_wlan_alloc_skb +10035c78 T rltk_wlan_send_skb +10035cac T rltk_netif_rx +10035d58 T rltk_set_sta_num +10035d5c T rltk_set_tx_power_percentage +10035d90 T rltk_wlan_control +10035e24 T rltk_wlan_running +10035e3c T rltk_wlan_handshake_done +10035e70 T rltk_wlan_is_connected_to_ap +10035eb4 T Efuse_PowerSwitch +10035ec0 T Efuse_GetCurrentSize +10035ecc T Efuse_CalculateWordCnts +10035ef0 T EFUSE_GetEfuseDefinition +10035f04 T efuse_OneByteRead +10035f38 T efuse_OneByteWrite +10035f6c T Efuse_PgPacketWrite +10035f80 T efuse_WordEnableDataRead +10035fb2 T Efuse_WordEnableDataWrite +10035fc6 T efuse_GetCurrentSize +10035fee T rtw_efuse_map_read +10036050 T rtw_efuse_map_write +100361d0 T rtw_macaddr_cfg +10036294 T rtw_get_cipher_info +1003630e T rtw_get_bcn_info +100363de T rtw_init_default_value +1003644c T rtw_cancel_all_timer +100364b6 T rtw_free_drv_sw +1003652c T rtw_reset_drv_sw +10036588 T rtw_init_drv_sw +10036610 T rtw_start_drv_threads +100366cc T rtw_stop_drv_threads +10036700 T rtw_read8 +1003670e T rtw_read16 +1003671c T rtw_read32 +1003672a T rtw_write8 +10036738 T rtw_write16 +10036746 T rtw_write32 +10036754 T rtw_do_join +100367f8 T rtw_set_802_11_bssid +1003697c T rtw_set_802_11_ssid +10036a84 T rtw_set_802_11_infrastructure_mode +10036b26 T rtw_set_802_11_bssid_list_scan +10036b76 T rtw_set_802_11_authentication_mode +10036b98 T rtw_set_802_11_add_wep +10036bf8 T ODM_InitRAInfo +10036c98 T InitialRateUpdate +10036d98 T RateUp_search_RateMask +10036dca T RateDown_search_RateMask +10036e1c T StartRateByRSSI +10036e46 T RateUpRAM8195A +10036eda T RateDownTrying +10036f18 T TryDone +10036fb0 T RateDownStepRAM8195A +10037050 T RateDecisionRAM8195A +10037134 T ArfrRefresh +1003733c T H2CHDL_Set_MACID_Config +10037400 T PHY_DM_RA_SetRSSI_8195A +1003742e t CheckPositive.isra.0 +10037510 T ODM_ReadAndConfig_MP_8195A_AGC_TAB +10037588 T ODM_ReadAndConfig_MP_8195A_PHY_REG +10037600 T ODM_GetVersion_MP_8195A_PHY_REG +10037604 T ODM_ReadAndConfig_MP_8195A_PHY_REG_PG +10037638 T odm_ConfigRFReg_8195A +10037670 T odm_ConfigRF_RadioA_8195A +10037680 T odm_ConfigMAC_8195A +10037684 T odm_ConfigBB_AGC_8195A +10037694 T odm_ConfigBB_PHY_REG_PG_8195A +100376c2 T odm_ConfigBB_PHY_8195A +1003770a T odm_ConfigBB_TXPWR_LMT_8195A +10037730 T ODM_CmnInfoInit +10037824 T ODM_CmnInfoHook +100378c8 T ODM_CmnInfoPtrArrayHook +100378d8 T ODM_CmnInfoUpdate +100379a8 T odm_CommonInfoSelfInit +10037a1c T ODM_DMInit +10037a6a T odm_CommonInfoSelfUpdate +10037abc T ODM_DMWatchdog +10037b28 T PhyDM_Get_Structure +10037b4c T Phydm_CheckAdaptivity +10037b7a T Phydm_NHMCounterStatisticsInit +10037bf0 T Phydm_SetEDCCAThreshold +10037c28 T Phydm_MACEDCCAState +10037c66 T Phydm_AdaptivityInit +10037d44 T Phydm_Adaptivity +10037e64 T ODM_CfoTrackingInit +10037e8e T ODM_CfoTracking +10037eae T ODM_ParsingCFO +10037ee0 T ODM_InitDebugSetting +10037ef4 T ODM_Write_DIG +10037f94 T odm_ForbiddenIGICheck +10038026 T ODM_Write_CCK_CCA_Thres +10038060 T odm_DIGInit +100380fa T odm_DigAbort +1003811c T odm_DIGbyRSSI_LPS +100381c8 T odm_FAThresholdCheck +100381f4 T odm_DIG +10038454 T odm_FalseAlarmCounterStatistics +10038480 T odm_CCKPacketDetectionThresh +100384d8 T odm_RxPhyStatus8195A_Parsing +100385dc T odm_Process_RSSIForDM_8195A +1003871e T ODM_PhyStatusQuery_8195A +1003874a T ODM_PhyStatusQuery +1003874e T ODM_ConfigRFWithHeaderFile +1003876c T ODM_ConfigRFWithTxPwrTrackHeaderFile +1003879e T ODM_ConfigBBWithHeaderFile +100387c6 T ODM_ConfigMACWithHeaderFile +100387d8 T ODM_Read1Byte +100387de T ODM_Read4Byte +100387e4 T ODM_Write1Byte +100387ea T ODM_Write2Byte +100387f0 T ODM_Write4Byte +100387f6 T ODM_SetMACReg +100387fc T ODM_SetBBReg +10038802 T ODM_GetBBReg +10038808 T ODM_SetRFReg +1003880e T ODM_GetRFReg +10038814 T ODM_MoveMemory +1003881e T ODM_delay_ms +10038822 T ODM_delay_us +10038828 T getSwingIndex +10038880 T odm_TXPowerTrackingThermalMeterInit +10038932 T odm_TXPowerTrackingInit +10038936 T odm_TXPowerTrackingCheckIOT +1003896a T ODM_TXPowerTrackingCheck +10038978 T odm_RSSIMonitorInit +10038980 T ODM_RAPostActionOnAssoc +10038988 T odm_RSSIMonitorCheckIOT +10038a5c T odm_RSSIMonitorCheck +10038a70 T odm_RateAdaptiveMaskInit +10038a98 T ODM_RAStateCheck +10038ada T odm_RefreshRateAdaptiveMaskIOT +10038b2a T odm_RefreshRateAdaptiveMask +10038b40 T ODM_Get_Rate_Bitmap +10038c30 t _ReadEfuseInfo8195a +10038cf8 t rtl8195a_interface_configure +10038d2c t rtl8195a_hal_deinit +10038d68 T _InitPowerOn +10038de8 t ReadAdapterInfo8195a +10038e18 T _InitDriverInfoSize +10038e22 T _InitNetworkType +10038e44 T _InitWMACSetting +10038eb4 T _InitAdaptiveCtrl +10038ef8 T _InitEDCA +10038f74 T _InitRateFallback +10038fb8 T _InitRetryFunction +10038fe4 T _InitOperationMode +1003902c T _InitInterrupt +1003906c t rtl8195a_hal_init +10039344 T rtl8195ab_set_hal_ops +1003941c T FillH2CCmd8195A +1003943c T CheckFwRsvdPageContent +1003943e T rtl8195a_set_FwRsvdPage_cmd +10039448 T rtl8195a_set_FwMediaStatusRpt_cmd +10039474 T rtl8195a_set_FwMacIdConfig_cmd +10039534 T rtl8195a_set_FwPwrMode_cmd +100395c4 T rtl8195a_download_rsvd_page +100398cc T rtl8195a_set_FwJoinBssRpt_cmd +100398d6 T rtl8195a_Add_RateATid +10039928 T rtw_rpt_h_addr +10039974 T rtw_txrpt_read8 +10039992 T rtw_txrpt_write8 +100399b6 T rtw_ratemask_read8 +100399d4 T rtw_ratemask_write8 +100399f8 T ReadRateMask8 +10039a02 T WriteRateMask8 +10039a06 T ReadTxrpt8 +10039a10 T WriteTxrpt8 +10039a14 T ResetTxrpt +10039a4c T PsuseTxrpt +10039a6c T CheckMaxMacidNum +10039aa4 T GetMediaStatusCommon +10039abe T GetTxrptStatistic +10039b74 T rtl8195a_InitHalDm +10039c98 T rtl8195a_HalDmWatchDog +10039d7c T rtl8195a_init_dm_priv +10039e54 T rtl8195a_deinit_dm_priv +10039e56 T MediaConnection +10039e74 T MediaDisconnection +10039e94 T RATaskEnable +10039ebe T SetMediaStatus +10039efc T H2CHDL_JoinInfo +10039f34 T H2CHDL_SetRsvdPage +10039fcc T H2CCmdCommon +1003a010 T HalPwrSeqCmdParsing +1003a0d0 T hci_dvobj_init +1003a0e0 T hci_dvobj_deinit +1003a0f0 T hci_dvobj_request_irq +1003a100 T hci_dvobj_free_irq +1003a110 T hci_lxbus_dvobj_init +1003a14c T hci_lxbus_dvobj_deinit +1003a18c T hci_lxbus_dvobj_request_irq +1003a1e0 T hci_lxbus_free_irq +1003a238 T hci_lxbus_intf_stop +1003a270 T rtw_interrupt_thread +1003a2e4 T lextra_bus_dma_Interrupt +1003a32c T init_rom_wlan_ram_map +1003a344 T ODM_ReadAndConfig_MP_8195A_MAC_REG +1003a4a0 t CheckPositive.isra.0 +1003a584 T ODM_ReadAndConfig_MP_8195A_RadioA +1003a5fc T ODM_ReadAndConfig_MP_8195A_TxPowerTrack_QFN48 +1003a64c T ODM_ReadAndConfig_MP_8195A_TxPowerTrack_QFN56 +1003a69c T ODM_ReadAndConfig_MP_8195A_TxPowerTrack_TFBGA96 +1003a6ec T ODM_ReadAndConfig_MP_8195A_TXPWR_LMT +1003a724 T ODM_ReadAndConfig_MP_8195A_TxXtalTrack +1003a750 T GetDeltaSwingTable_8195A +1003a780 T GetDeltaSwingXtalTable_8195A +1003a790 T ODM_TxXtalTrackSetXtal_8195A +1003a7b0 T Hal_MPT_CCKTxPowerAdjust +1003a880 T ODM_TxPwrTrackSetPwr_8195A +1003a990 T ConfigureTxpowerTrack_8195A +1003a9dc T phy_PathA_IQK_8195A +1003ab90 T phy_PathA_RxIQK8195A +1003af24 T _PHY_PathAFillIQKMatrix8195A +1003b0ba T _PHY_PathBFillIQKMatrix8195A +1003b236 T _PHY_SaveADDARegisters8195A +1003b26a T _PHY_SaveMACRegisters8195A +1003b298 T _PHY_ReloadADDARegisters8195A +1003b2cc T _PHY_ReloadMACRegisters8195A +1003b2fc T _PHY_PathADDAOn8195A +1003b338 T _PHY_MACSettingCalibration8195A +1003b380 T _PHY_PIModeSwitch8195A +1003b3bc T phy_SimularityCompare_8195A +1003b4f0 T phy_IQCalibrate_8195A +1003b868 T phy_LCCalibrate_8195A +1003b8d8 T PHY_LCCalibrate_8195A +1003b938 T PHY_IQCalibrate_8195A +1003bbec T DoIQK_8195A +1003bc0a T ConfigureTxpowerTrack +1003bc1c T ODM_TXPowerTrackingCallback_ThermalMeter +1003c028 T ODM_ResetIQKResult +1003c070 T ODM_GetRightChnlPlaceforIQK +1003c0c8 t __CmdDumpWord_veneer +1003c0d8 t __rtw_get_sec_ie_veneer +1003c0e8 t __rtw_set_fixed_ie_veneer +1003c0f8 t __Strtoul_veneer +1003c108 t __rtw_set_supported_rate_veneer +1003c118 t __rtw_set_ie_veneer +1003c128 t __AES_UnWRAP_veneer +1003c138 t __rtw_get_wps_attr_content_veneer +1003c148 t __AES_WRAP_veneer +1003c158 t __rt_arc4_init_veneer +1003c168 t __phy_CalculateBitShift_veneer +1003c178 t __aes_80211_decrypt_veneer +1003c188 t ___vsscanf_veneer +1003c198 t __rtw_get_rateset_len_veneer +1003c1a8 t __prvStrCmp_veneer +1003c1b8 t __HalI2SClrAllIntrRtl8195a_veneer +1003c1c8 t __rtw_get_wps_ie_veneer +1003c1d8 t __rtw_get_wpa2_ie_veneer +1003c1e8 t __wep_80211_decrypt_veneer +1003c1f8 t __PHY_SetBBReg_8195A_veneer +1003c208 t __ROM_odm_QueryRxPwrPercentage_veneer +1003c218 t __HalI2SRead32_veneer +1003c228 t __wep_80211_encrypt_veneer +1003c238 t __rtw_get_bit_value_from_ieee_value_veneer +1003c248 t __rtw_check_network_type_veneer 1003c258 t __ROM_odm_FalseAlarmCounterStatistics_veneer -1003c268 t __PHY_SetBBReg_8195A_veneer -1003c278 t __rtw_set_ie_veneer -1003c288 t __tkip_80211_encrypt_veneer -1003c298 t __HalI2SClrAllIntrRtl8195a_veneer -1003c2a8 t __rtw_get_ie_veneer -1003c2b8 t __ROM_odm_SetCrystalCap_veneer -1003c2c8 t __ROM_ODM_CfoTrackingReset_veneer -1003c2d8 t __rtw_seccalctkipmic_veneer -1003c2e8 t __HalI2SRead32_veneer -1003c2f8 t __HalI2SWrite32_veneer -1003c308 t __rtw_secgetmic_veneer -1003c318 t __rtw_get_wps_attr_content_veneer -1003c328 t __aes_80211_decrypt_veneer -1003c338 t __prvStrCmp_veneer -1003c348 t __rtw_secmicappend_veneer -1003c358 t __phy_CalculateBitShift_veneer -1003c368 t __StrUpr_veneer -1003c378 t __CmdWriteWord_veneer -1003c388 t __CmdDumpWord_veneer -1003c398 t __key_2char2num_veneer -1003c3a8 t __ROM_odm_QueryRxPwrPercentage_veneer -1003c3b8 t __wep_80211_decrypt_veneer -1003c3c8 t __rtw_get_wpa2_ie_veneer -1003c3d8 t __rtw_get_bit_value_from_ieee_value_veneer -1003c3e8 t __Rand_veneer -1003c3f8 t __rtw_get_wps_ie_veneer -1003c408 t __aes_80211_encrypt_veneer -1003c418 t __HalDelayUs_veneer -1003c8fd d __func__.21274 -1003c909 d __FUNCTION__.14173 -1003ce64 d bitrate_table -1003cf90 d samplerate_table -1003cf9c d decoder_table -1003cfa8 d imdct_s -1003d038 d scale.6899 -1003d080 d sfb_8000_short -1003d0a7 d sfb_32000_short -1003d0d0 d is_table -1003d0ec d rq_table -10045128 d root_table -10045144 d sfb_44100_mixed -1004516c d is_lsf_table -100451e4 d sflen_table -10045204 d sfb_16000_mixed -10045228 d ca -10045248 d sfb_44100_short -1004526f d sfb_44100_long -10045285 d sfb_48000_mixed -100452ab d sfb_24000_long -100452c1 d sfb_32000_mixed -100452e7 d sfb_16000_short -1004530e d sfb_8000_long -10045324 d sfb_22050_mixed -10045348 d window_l -100453d8 d sfb_48000_long -100453f0 d cs -10045410 d sfb_24000_mixed -10045434 d pretab -1004544a d sfb_48000_short -10045471 d sfb_22050_short -10045498 d sfb_8000_mixed -100454c0 d sfbwidth_table -1004552c d sfb_24000_short -10045553 d sfb_32000_long -10045569 d sfb_22050_long -10045580 d window_s -100455b0 d nsfb_table -100455f8 d hufftab24 -10045c00 d hufftab10 -10045d98 d hufftab11 -10045f38 d hufftab12 -100460b8 d hufftab13 -100466f0 d hufftab3 -10046730 d hufftab15 -10046d20 d hufftab16 -10047368 d hufftab6 -100473d8 d hufftab7 -100474d8 D mad_huff_pair_table -10047658 d hufftab9 -10047730 d hufftab1 -10047750 d hufftabA -100477c0 d hufftab2 -10047800 d hufftabB -10047840 D mad_huff_quad_table -10047848 d hufftab0 -1004784c d hufftab5 -100478b4 d hufftab8 -100479bc d crc_table -10047bbc d D -1004843c D mad_timer_zero -1004875e d __func__.20805 -10048d6c d err_to_errno_table -10048db4 D ip_addr_broadcast -10048db8 D ip_addr_any -10048dcc D memp_sizes -10048dec D tcp_pcb_lists -10048dfc D tcp_state_str -10048e28 D tcp_backoff -10048e9d D tcp_persist_backoff -10048ea4 D ethbroadcast -10048eaa D ethzero -10048f8c d __FUNCTION__.8702 -10048f9b d __FUNCTION__.8714 -10048faa d dhcp_option_interface_mtu_576 -10048fd1 d dhcp_magic_cookie -10048fd5 d dhcp_option_lease_time_one_day -10049032 d __FUNCTION__.4594 -10049075 d CSWTCH.270 -100490e1 d ucExpectedStackBytes.6559 -10049118 D osdep_service -1004923c d __FUNCTION__.11772 -10049252 d __FUNCTION__.11768 -10049268 d __FUNCTION__.11606 -10049301 d __FUNCTION__.11572 -10049315 d __FUNCTION__.11623 -10049328 d __FUNCTION__.11580 -10049344 d __FUNCTION__.11634 -1004935f d __FUNCTION__.6810 -1004947c d PinMap_I2S_RX -1004955c d PinMap_I2S_TX -100495bc d I2SDefaultSetting -100495d0 d PinMap_I2S_CLK -10049630 d __FUNCTION__.8781 -1004963c d PinMap_I2S_WS -100496eb d __FUNCTION__.8597 -100496f8 d __FUNCTION__.8610 -1004999d d __FUNCTION__.8459 -100499b8 d __FUNCTION__.8466 -10049ab3 d __FUNCTION__.8452 -10049ad5 d __func__.8808 -10049af4 d __func__.8818 -10049b12 d __func__.8830 -10049b2c d __func__.8840 -10049b4e d __func__.8835 -10049f17 d __func__.8603 -10049f31 d __func__.8686 -10049f44 d __func__.8825 -10049f5d d __func__.8631 -10049fa0 D wlancmds -1004a198 D rtw_cmd_callback -1004a424 d RTW_ChannelPlan2G -1004a49c D WPS_OUI -1004a4a0 D RSN_TKIP_CIPHER -1004a4a4 D MCS_rate_1R -1004a4b4 D P2P_OUI -1004a4e0 D WMM_INFO_OUI -1004a4e6 D RTW_WPA_OUI -1004a4ea D WMM_PARA_OUI -1004a4f0 d RTW_ChannelPlanMap -1004a508 D null_addr -1004a50e D WMM_OUI -1004a514 d wlanevents -1004a5d4 D zero_bssid -1004a611 d __FUNCTION__.17681 -1004a627 D SNAP_ETH_TYPE_APPLETALK_AARP -1004a629 d __FUNCTION__.17495 -1004a63c D SNAP_ETH_TYPE_IPX -1004a63e D rtw_bridge_tunnel_header -1004a665 D rtw_rfc1042_header -1004a683 d CSWTCH.36 -1004a68f D ARTHEROS_OUI1 -1004a692 D ARTHEROS_OUI2 -1004a695 D REALTEK_OUI -1004a698 D RALINK_OUI -1004a69b D MARVELL_OUI -1004a69e D CISCO_OUI -1004a6a1 d rtw_basic_rate_cck -1004a6a5 D BROADCOM_OUI1 -1004a6a8 D BROADCOM_OUI2 -1004a6ab D REALTEK_96B_IE -1004a6b1 d rtw_basic_rate_mix -1004a6b8 d rtw_basic_rate_ofdm -1004a6bb D AIRGOCAP_OUI -1004a6cf d CSWTCH.66 -1004a6e8 d CSWTCH.48 -1004a72a d CSWTCH.28 -1004a73c D efuse_map_mask -1004a74c D flash_map_mask -1004a7e8 d __func__.21107 -1004ab2e d CSWTCH.15 -1004abb2 d CSWTCH.17 -1004ac21 d CSWTCH.14 -1004acb6 d __FUNCTION__.21257 -1004acc8 d rtw_private_args -1004b0e8 d __FUNCTION__.21057 -1004b0fb d __FUNCTION__.21294 -1004b10c d __FUNCTION__.21241 -1004b11b d __FUNCTION__.21126 -1004b12b d iw_priv_type_size -1004b209 d __FUNCTION__.17334 -1004b213 d __FUNCTION__.17736 -1004b223 d __FUNCTION__.17760 -1004b236 d __FUNCTION__.17712 -1004b245 d __FUNCTION__.17649 -1004b253 d __FUNCTION__.17661 -1004b62a d __FUNCTION__.17827 -1004b643 d __FUNCTION__.17654 -1004b64e d __FUNCTION__.17615 -1004b65d d __FUNCTION__.17811 -1004b66f d __FUNCTION__.17765 -1004b67d d __FUNCTION__.17724 -1004b68e d __FUNCTION__.17637 -1004ca2f D CCKFCCTable_Ch14_8195A -1004ca3f D CCKFCCTable_8195A -1004ca50 D OFDMSwingTable_New -1004cafc D CCKCETable_8195A -1004cb12 d CSWTCH.39 -1004cb27 d __func__.20571 -1004cb48 D hci_ops -1004cb6d V Array_MP_8195A_TXPWR_LMT -1004d0e0 D xHeapRegions -1004d100 D UartLogRamCmdTable -1004d100 D console_cmd_wifi_api -1004d160 D console_commands_main -1004d170 D console_commands1 -1004d1d0 D console_commands -1004d1e0 d UartLogRamCmdTable_end -1004d1e4 D __data_start__ -1004d1e4 D wlan_st_name -1004d1ec D wifi_st_dhcp -1004d1fc D wlan_ap_name -1004d204 D wifi_ap_dhcp -1004d214 D feep_tab -1004d244 D wifi_st_cfg -1004d2b0 D wifi_cfg -1004d2b7 D wlan_ap_netifn -1004d2b8 D wifi_ap_cfg -1004d324 D oversampling -1004d328 D SystemCoreClock -1004d32c D error_flag -1004d330 d tcp_port -1004d334 d iss.7348 -1004d338 d udp_port -1004d33a D lwip_host_name -1004d35a d dhcp_server_state_machine -1004d35b d dhcp_recorded_xid -1004d360 d uxCriticalNesting -1004d364 d xNextTaskUnblockTime -1004d368 d seed.11739 -1004d36c d wakeup_event -1004d370 d wakelock -1004d374 d last_wakelock_state -1004d394 D mlme_sta_tbl -1004d404 d PMKID_KDE_TYPE.17744 -1004d40c V nr_xmitbuff -1004d410 V nr_xmitframe -1004d414 d P802_1H_OUI -1004d417 D rtw_adaptivity_mode -1004d418 D g_user_ap_sta_num -1004d41c d rtw_private_handler -1004d460 V max_local_skb_num -1004d464 V max_skb_buf_num -1004d468 D rom_e_rtw_msgp_str_ -1004d644 D ARFB_table -1004d683 D TRYING_NECESSARY_idx -1004d697 D DROPING_NECESSARY -1004d6ab D PER_RATE_UP -1004d6bf D PER_RATE_DOWN -1004d6d4 V Array_MP_8195A_PHY_REG_PG -1004d764 D Array_MP_8195A_AGC_TAB -1004d974 D Array_MP_8195A_PHY_REG -1004dfec D rtl8195A_card_disable_flow -1004e08c D rtl8195A_card_enable_flow -1004e12c D Array_MP_8195A_MAC_REG -1004e434 D gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_TFBGA96_8195A -1004e454 D gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_TFBGA96_8195A -1004e474 D gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_QFN48_8195A -1004e492 D gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_QFN56_8195A -1004e4b0 D gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_QFN48_8195A -1004e4ce D gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_QFN56_8195A -1004e4ec D gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_TFBGA96_8195A -1004e50c D gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_QFN56_8195A -1004e52a D gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_QFN48_8195A -1004e548 D gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_QFN56_8195A -1004e568 D Array_MP_8195A_RadioA -1004eb30 D gDeltaSwingTableXtal_MP_P_TxXtalTrack_8195A -1004eb4e D gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_TFBGA96_8195A -1004eb6e D gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_QFN48_8195A -1004eb8c D .ram.bss$$Base -1004eb8c D __bss_start__ -1004eb8c D __data_end__ -1004eb8c D __ram_image2_text_end__ -1004eb8c d skbdata_list -1004eb94 V skb_data_pool -10051f94 d ucIdleTaskHeap -100520ac D HalI2SOpSAL -100520e8 D SYSAdapte -100520ec D PwrAdapter -10052378 D libc_has_init -1005237c d rheap_end -10052380 d event_init.21281 -10052384 D wifi_run_mode -10052388 D wlan_st_netifn -10052389 d sampCntAdd -1005238c d sampCnt -10052390 D mp3_serv -10052412 D tskreader_enable -10052414 D readBuf -10052418 D tskmad_enable -1005241c d bufUnderrunCt -10052420 d oldRate -10052424 d sampDelCnt -10052428 D pbuf_fifo -1005242c D pi2s -10052434 D I2sTxSema -10052438 D eap_method -10052439 D eap_phase -1005243c D rtw_join_status -10052440 D wifi_mode -10052444 d param.21254 -1005245c d join_user_data -10052460 d event_callback_list -100525e0 D paff_array -10052658 D lwip_init_done -1005265c D xnetif -100526dc d s_aliases.6960 -100526e0 D h_errno -100526e4 d s_hostent.6959 -100526f8 d s_hostent_addr.6961 -100526fc d s_phostent_addr.6962 -10052704 d select_cb_list -10052708 d sockets -100527c8 d select_cb_ctr -100527cc d mbox -100527d0 d tcpip_init_done_arg -100527d4 d tcpip_init_done -100527d8 d allsystems -100527dc d allrouters -100527e0 d igmp_group_list -100527e4 D current_header -100527e8 d ip_id -100527ec D current_iphdr_src -100527f0 D current_iphdr_dest -100527f4 D current_netif -100527f8 d str.6325 -10052808 d reassdatagrams -1005280c d ip_reass_pbufcount -1005280e D dhcp_rx_options_given -10052818 D dhcp_rx_options_val -10052840 d xid.7275 -10052844 d dns_seqno -10052848 d dns_table -10052ca8 d dns_servers -10052cb0 d dns_payload_buffer -10052eb4 d dns_pcb -10052eb8 d dns_payload -10052ebc d tcpip_tcp_timer_active -10052ec0 d next_timeout -10052ec4 D netif_list -10052ec8 D netif_default -10052ecc d netif_num -10052ecd D pbuf_free_ooseq_pending -10052ed0 d raw_pcbs -10052ed4 D tcp_active_pcbs_changed -10052ed8 D tcp_ticks -10052edc d tcp_timer -10052ee0 D tcp_listen_pcbs -10052ee4 D tcp_active_pcbs -10052ee8 d tcp_timer_ctr -10052eec D tcp_tw_pcbs -10052ef0 D tcp_tmp_pcb -10052ef4 D tcp_bound_pcbs -10052ef8 d seqno -10052efc d tcplen -10052f00 d ackno -10052f04 d flags -10052f05 d recv_flags -10052f08 d tcphdr -10052f0c d recv_data -10052f10 d inseg -10052f24 D tcp_input_pcb -10052f28 D udp_pcbs -10052f2c d etharp_cached_entry -10052f30 d arp_table -10052ff8 D lwip_tickless_used -10052ffc d s_timeoutlist -1005302c d s_nextthread -10053030 d dhcps_ip_table_semaphore -10053034 d dhcps_send_broadcast_address -10053038 D dhcps_ip4addr_pool_end -10053039 d dhcp_client_ethernet_address -1005304c d dhcps_subnet_broadcast -10053050 d bound_client_ethernet_address -10053060 d ip_table -10053080 d dhcps_pcb -10053084 d dhcp_message_total_options_lenth -10053088 d dhcps_local_address -1005308c d dhcps_netif -10053090 d client_request_ip -10053094 d dhcps_allocated_client_address -10053098 d dhcps_local_mask -1005309c d dhcps_local_gateway -100530a0 d dhcps_network_id -100530a4 D dhcps_ip4addr_pool_start -100530a8 d dhcp_message_repository -100530ac D ext_upper -100530b0 d xFreeBytesRemaining -100530b4 d ext_free -100530b8 D ext_lower -100530bc d pxEnd -100530c0 d xStart -100530c8 d xMinimumEverFreeBytesRemaining -100530cc d ulTimerCountsForOneTick -100530d0 d ulStoppedTimerCompensation -100530d4 d xMaximumPossibleSuppressedTicks -100530d8 d xPendingReadyList -100530ec d uxTopReadyPriority -100530f0 d uxTasksDeleted -100530f4 d xTickCount -100530f8 d pxReadyTasksLists -100531d4 d pxOverflowDelayedTaskList -100531d8 d xTasksWaitingTermination -100531ec d pxDelayedTaskList -100531f0 d xSchedulerRunning -100531f4 d ulTaskSwitchedInTime -100531f8 D pxCurrentTCB -100531fc d uxPendedTicks -10053200 d xSuspendedTaskList -10053214 d uxCurrentNumberOfTasks -10053218 d ulDeltaTotalRunTime -1005321c d xDelayedTaskList2 -10053230 d xDelayedTaskList1 -10053244 d uxTaskNumber -10053248 d xYieldPending -1005324c d uxSchedulerSuspended -10053250 d xNumOfOverflows -10053254 d pxCurrentTimerList -10053258 d xActiveTimerList1 -1005326c d xActiveTimerList2 -10053280 d xLastTime.5284 -10053284 d xTimerQueue -10053288 d pxOverflowTimerList -1005328c d xTimerTaskHandle -10053290 d device_mutex -1005329c d mutex_init -100532a0 d uxSavedInterruptStatus -100532a4 D min_free_heap_size -100532a8 d g_heap_inited -100532ac d tcm_lock -100532b0 D g_tcm_heap -100532b4 D flashobj -100532c0 D fspic_isinit -100532c4 D WDGAdapter -10053300 d last_acquire_wakelock_time -10053380 D post_sleep_callback -10053400 D pre_sleep_callback -10053480 D reserve_pll -10053484 d sys_sleep_time -10053488 d hold_wakelock_time -10053508 D missing_tick -1005350c D Timer2To7HandlerData -10053524 D auto_reconnect_running -10053528 D p_wlan_autoreconnect_hdl -1005352c D mac_monitor_callback -10053530 D mf_list_head -10053534 d pscan_retry_cnt.21430 -10053538 D promisc_callback_all -1005353c D promisc_sema -10053540 D promisc_callback -10053544 D psk_essid -1005358c D psk_passphrase -1005360e D psk_passphrase64 -1005364f D wpa_global_PSK -1005369f d RFC1042_OUI -100536a4 d rx_ring_pool -10055784 d stop_report_count.20629 -10055785 D bCheckStateTIMER -10055788 d WifiMcuCmdBitMap.20974 -1005578c D p_wlan_init_done_callback -10055790 D rtw_power_percentage_idx -10055794 D p_wlan_uart_adapter_callback -10055798 D rtw_adaptivity_en -1005579c D p_wlan_mgmt_filter -100557a0 D rtw_initmac -100557a4 D rtw_adaptivity_th_l2h_ini -100557a8 d drvpriv -100557bc D skbbuf_used_num -100557c0 V skb_pool -10055978 D skbdata_used_num -1005597c d wrapper_skbbuf_list -10055984 D max_skbdata_used_num -10055988 D max_skbbuf_used_num -1005598c d skb_fail_count -10055990 D timer_table -10055998 D rltk_wlan_info -100559c8 d timer_used_num -100559cc D max_timer_used_num -100559d0 D Noisy_State -100559d4 D pExportWlanIrqSemaphore -100559d8 D gDeltaSwingTableXtal_MP_N_TxXtalTrack_8195A -100559f6 D .ram.bss$$Limit -100559f6 D __bss_end__ -100559f8 B __ram_heap2_start__ +1003c268 t __rt_arc4_crypt_veneer +1003c278 t __CmdWriteWord_veneer +1003c288 t __rt_md5_hmac_veneer +1003c298 t __PHY_QueryBBReg_8195A_veneer +1003c2a8 t __rom_psk_CalcGTK_veneer +1003c2b8 t __tkip_80211_encrypt_veneer +1003c2c8 t __rom_psk_CalcPTK_veneer +1003c2d8 t __rtw_secgetmic_veneer +1003c2e8 t __rtw_parse_wpa_ie_veneer +1003c2f8 t __rtw_seccalctkipmic_veneer +1003c308 t __rtw_secmicsetkey_veneer +1003c318 t __tkip_80211_decrypt_veneer +1003c328 t __StrUpr_veneer +1003c338 t __ROM_odm_CfoTrackingFlow_veneer +1003c348 t __aes_80211_encrypt_veneer +1003c358 t __rt_hmac_sha1_veneer +1003c368 t __ROM_odm_SetCrystalCap_veneer +1003c378 t __HalDelayUs_veneer +1003c388 t __rtw_get_ie_veneer +1003c398 t __HalI2SIntrCtrlRtl8195a_veneer +1003c3a8 t __SpicWaitBusyDoneRtl8195A_veneer +1003c3b8 t __HalI2SWrite32_veneer +1003c3c8 t __ROM_odm_EVMdbToPercentage_veneer +1003c3d8 t __rtw_secmicappend_veneer +1003c3e8 t __rtw_parse_wpa2_ie_veneer +1003c3f8 t __ROM_ODM_CfoTrackingReset_veneer +1003c408 t __ROM_odm_GetDefaultCrytaltalCap_veneer +1003c418 t __rtw_get_wpa_ie_veneer +1003c428 t __rom_psk_PasswordHash_veneer +1003c438 t __rtw_ieee802_11_parse_elems_veneer +1003c448 t __key_2char2num_veneer +1003c458 t __Rand_veneer +1003c93d d __func__.21276 +1003c949 d __FUNCTION__.14658 +1003cea4 d bitrate_table +1003cfd0 d samplerate_table +1003cfdc d decoder_table +1003cfe8 d imdct_s +1003d078 d sfb_8000_short +1003d09f d sfb_32000_short +1003d0c8 d is_table +1003d0e4 d sfb_24000_long +1003d0fc d rq_table +10045138 d root_table +10045154 d sfb_44100_mixed +1004517c d is_lsf_table +100451f4 d sflen_table +10045214 d sfb_16000_mixed +10045238 d ca +10045258 d sfb_44100_short +1004527f d sfb_44100_long +10045295 d sfb_48000_mixed +100452bc d scale.7383 +10045304 d sfb_32000_mixed +1004532a d sfb_16000_short +10045351 d sfb_8000_long +10045367 d sfb_22050_mixed +1004538c d window_l +1004541c d sfb_48000_long +10045434 d cs +10045454 d sfb_24000_mixed +10045478 d pretab +1004548e d sfb_48000_short +100454b5 d sfb_22050_short +100454dc d sfb_8000_mixed +10045504 d sfbwidth_table +10045570 d sfb_24000_short +10045597 d sfb_32000_long +100455ad d sfb_22050_long +100455c4 d window_s +100455f4 d nsfb_table +1004563c d hufftab24 +10045c44 d hufftab10 +10045ddc d hufftab11 +10045f7c d hufftab12 +100460fc d hufftab13 +10046734 d hufftab3 +10046774 d hufftab15 +10046d64 d hufftab16 +100473ac d hufftab6 +1004741c d hufftab7 +1004751c D mad_huff_pair_table +1004769c d hufftab9 +10047774 d hufftab1 +10047794 d hufftabA +10047804 d hufftab2 +10047844 d hufftabB +10047884 D mad_huff_quad_table +1004788c d hufftab0 +10047890 d hufftab5 +100478f8 d hufftab8 +10047a00 d crc_table +10047c00 d D +10048480 D mad_timer_zero +100487a2 d __func__.20807 +10048db0 d err_to_errno_table +10048df8 D ip_addr_broadcast +10048dfc D ip_addr_any +10048e10 D memp_sizes +10048e30 D tcp_pcb_lists +10048e40 D tcp_state_str +10048e6c D tcp_backoff +10048ee1 D tcp_persist_backoff +10048ee8 D ethbroadcast +10048eee D ethzero +10048f1d d __FUNCTION__.9188 +10048fdf d __FUNCTION__.9200 +10048fee d dhcp_option_interface_mtu_576 +10049015 d dhcp_magic_cookie +10049019 d dhcp_option_lease_time_one_day +10049076 d __FUNCTION__.4594 +100490b9 d ucExpectedStackBytes.7043 +100490cd d CSWTCH.270 +1004915a d __FUNCTION__.12256 +10049170 D osdep_service +10049294 d __FUNCTION__.12056 +10049322 d __FUNCTION__.12064 +1004933e d __FUNCTION__.12118 +10049359 d __FUNCTION__.12107 +1004936c d __FUNCTION__.12090 +1004938b d __FUNCTION__.12252 +100493a1 d __FUNCTION__.7294 +100494c0 d PinMap_I2S_RX +100495a0 d PinMap_I2S_TX +10049600 d I2SDefaultSetting +10049614 d PinMap_I2S_CLK +10049674 d __FUNCTION__.8781 +10049680 d PinMap_I2S_WS +1004972f d __FUNCTION__.8597 +1004973c d __FUNCTION__.8610 +100499e1 d __FUNCTION__.8459 +100499fc d __FUNCTION__.8466 +10049af7 d __FUNCTION__.8452 +10049b19 d __func__.8808 +10049b38 d __func__.8818 +10049b56 d __func__.8830 +10049b70 d __func__.8840 +10049b92 d __func__.8835 +10049f5b d __func__.8603 +10049f75 d __func__.8686 +10049f88 d __func__.8825 +10049fa1 d __func__.8631 +10049fe4 D wlancmds +1004a1dc D rtw_cmd_callback +1004a468 d RTW_ChannelPlan2G +1004a4e0 D WPS_OUI +1004a4e4 D RSN_TKIP_CIPHER +1004a4e8 D MCS_rate_1R +1004a4f8 D P2P_OUI +1004a524 D WMM_INFO_OUI +1004a52a D RTW_WPA_OUI +1004a52e D WMM_PARA_OUI +1004a534 d RTW_ChannelPlanMap +1004a54c D null_addr +1004a552 D WMM_OUI +1004a558 d wlanevents +1004a618 D zero_bssid +1004a655 d __FUNCTION__.17681 +1004a66b D SNAP_ETH_TYPE_APPLETALK_AARP +1004a66d d __FUNCTION__.17495 +1004a680 D SNAP_ETH_TYPE_IPX +1004a682 D rtw_bridge_tunnel_header +1004a6a9 D rtw_rfc1042_header +1004a6c7 d CSWTCH.36 +1004a6d3 D ARTHEROS_OUI1 +1004a6d6 D ARTHEROS_OUI2 +1004a6d9 D REALTEK_OUI +1004a6dc D RALINK_OUI +1004a6df D MARVELL_OUI +1004a6e2 D CISCO_OUI +1004a6e5 d rtw_basic_rate_cck +1004a6e9 D BROADCOM_OUI1 +1004a6ec D BROADCOM_OUI2 +1004a6ef D REALTEK_96B_IE +1004a6f5 d rtw_basic_rate_mix +1004a6fc d rtw_basic_rate_ofdm +1004a6ff D AIRGOCAP_OUI +1004a713 d CSWTCH.66 +1004a72c d CSWTCH.48 +1004a76e d CSWTCH.28 +1004a780 D efuse_map_mask +1004a790 D flash_map_mask +1004a82c d __func__.21107 +1004ab72 d CSWTCH.15 +1004abf6 d CSWTCH.17 +1004ac65 d CSWTCH.14 +1004acfa d __FUNCTION__.21257 +1004ad0c d rtw_private_args +1004b12c d __FUNCTION__.21057 +1004b13f d __FUNCTION__.21294 +1004b150 d __FUNCTION__.21241 +1004b15f d __FUNCTION__.21126 +1004b16f d iw_priv_type_size +1004b24d d __FUNCTION__.17334 +1004b257 d __FUNCTION__.17736 +1004b267 d __FUNCTION__.17760 +1004b27a d __FUNCTION__.17712 +1004b289 d __FUNCTION__.17649 +1004b297 d __FUNCTION__.17661 +1004b66e d __FUNCTION__.17827 +1004b687 d __FUNCTION__.17654 +1004b692 d __FUNCTION__.17615 +1004b6a1 d __FUNCTION__.17811 +1004b6b3 d __FUNCTION__.17765 +1004b6c1 d __FUNCTION__.17724 +1004b6d2 d __FUNCTION__.17637 +1004ca73 D CCKFCCTable_Ch14_8195A +1004ca83 D CCKFCCTable_8195A +1004ca94 D OFDMSwingTable_New +1004cb40 D CCKCETable_8195A +1004cb56 d CSWTCH.39 +1004cb6b d __func__.20571 +1004cb8c D hci_ops +1004cbb1 V Array_MP_8195A_TXPWR_LMT +1004d124 D xHeapRegions +1004d144 D UartLogRamCmdTable +1004d144 D console_cmd_wifi_api +1004d1a4 D console_commands_main +1004d1b4 D console_commands1 +1004d214 D console_commands +1004d224 d UartLogRamCmdTable_end +1004d228 D __data_start__ +1004d228 D wlan_st_name +1004d230 D wifi_st_dhcp +1004d240 D wlan_ap_name +1004d248 D wifi_ap_dhcp +1004d258 D feep_tab +1004d288 D wifi_st_cfg +1004d2f4 D wifi_cfg +1004d2fb D wlan_ap_netifn +1004d2fc D wifi_ap_cfg +1004d368 D oversampling +1004d36c D SystemCoreClock +1004d370 D error_flag +1004d374 d tcp_port +1004d378 d iss.7832 +1004d37c d udp_port +1004d37e D lwip_host_name +1004d39e d dhcp_server_state_machine +1004d39f d dhcp_recorded_xid +1004d3a4 d uxCriticalNesting +1004d3a8 d xNextTaskUnblockTime +1004d3ac d seed.12223 +1004d3b0 d wakeup_event +1004d3b4 d wakelock +1004d3b8 d last_wakelock_state +1004d3d8 D mlme_sta_tbl +1004d448 d PMKID_KDE_TYPE.17744 +1004d450 V nr_xmitbuff +1004d454 V nr_xmitframe +1004d458 d P802_1H_OUI +1004d45b D rtw_adaptivity_mode +1004d45c D g_user_ap_sta_num +1004d460 d rtw_private_handler +1004d4a4 V max_local_skb_num +1004d4a8 V max_skb_buf_num +1004d4ac D rom_e_rtw_msgp_str_ +1004d688 D ARFB_table +1004d6c7 D TRYING_NECESSARY_idx +1004d6db D DROPING_NECESSARY +1004d6ef D PER_RATE_UP +1004d703 D PER_RATE_DOWN +1004d718 V Array_MP_8195A_PHY_REG_PG +1004d7a8 D Array_MP_8195A_AGC_TAB +1004d9b8 D Array_MP_8195A_PHY_REG +1004e030 D rtl8195A_card_disable_flow +1004e0d0 D rtl8195A_card_enable_flow +1004e170 D Array_MP_8195A_MAC_REG +1004e478 D gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_TFBGA96_8195A +1004e498 D gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_TFBGA96_8195A +1004e4b8 D gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_QFN48_8195A +1004e4d6 D gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_QFN56_8195A +1004e4f4 D gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_QFN48_8195A +1004e512 D gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_QFN56_8195A +1004e530 D gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_TFBGA96_8195A +1004e550 D gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_QFN56_8195A +1004e56e D gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_QFN48_8195A +1004e58c D gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_QFN56_8195A +1004e5ac D Array_MP_8195A_RadioA +1004eb74 D gDeltaSwingTableXtal_MP_P_TxXtalTrack_8195A +1004eb92 D gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_TFBGA96_8195A +1004ebb2 D gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_QFN48_8195A +1004ebd0 D .ram.bss$$Base +1004ebd0 D __bss_start__ +1004ebd0 D __data_end__ +1004ebd0 D __ram_image2_text_end__ +1004ebd0 d skbdata_list +1004ebd8 V skb_data_pool +10051fd8 d ucIdleTaskHeap +100520f0 D HalI2SOpSAL +1005212c D SYSAdapte +10052130 D PwrAdapter +100523bc D libc_has_init +100523c0 d rheap_end +100523c4 D wifi_run_mode +100523c8 D wlan_st_netifn +100523cc d event_init.21283 +100523d0 d sampCntAdd +100523d4 d sampCnt +100523d8 D mp3_serv +1005245a D tskreader_enable +1005245c D readBuf +10052460 D tskmad_enable +10052464 d bufUnderrunCt +10052468 d oldRate +1005246c d sampDelCnt +10052470 D pbuf_fifo +10052474 D pi2s +1005247c D I2sTxSema +10052480 D eap_method +10052481 D eap_phase +10052484 d param.21256 +1005249c D rtw_join_status +100524a0 D wifi_mode +100524a4 d join_user_data +100524a8 d event_callback_list +10052628 D paff_array +100526a0 D lwip_init_done +100526a4 D xnetif +10052724 d s_aliases.7444 +10052728 d s_hostent.7443 +1005273c d s_hostent_addr.7445 +10052740 D h_errno +10052744 d s_phostent_addr.7446 +1005274c d select_cb_list +10052750 d sockets +10052810 d select_cb_ctr +10052814 d mbox +10052818 d tcpip_init_done_arg +1005281c d tcpip_init_done +10052820 d allsystems +10052824 d allrouters +10052828 d igmp_group_list +1005282c D current_header +10052830 d ip_id +10052834 D current_iphdr_src +10052838 D current_iphdr_dest +1005283c D current_netif +10052840 d str.6809 +10052850 d reassdatagrams +10052854 d ip_reass_pbufcount +10052856 D dhcp_rx_options_given +10052860 d xid.7759 +10052864 D dhcp_rx_options_val +1005288c d dns_seqno +10052890 d dns_table +10052cf0 d dns_servers +10052cf8 d dns_payload_buffer +10052efc d dns_pcb +10052f00 d dns_payload +10052f04 d tcpip_tcp_timer_active +10052f08 d next_timeout +10052f0c D netif_list +10052f10 D netif_default +10052f14 d netif_num +10052f15 D pbuf_free_ooseq_pending +10052f18 d raw_pcbs +10052f1c D tcp_active_pcbs_changed +10052f20 D tcp_ticks +10052f24 d tcp_timer +10052f28 D tcp_listen_pcbs +10052f2c D tcp_active_pcbs +10052f30 d tcp_timer_ctr +10052f34 D tcp_tw_pcbs +10052f38 D tcp_tmp_pcb +10052f3c D tcp_bound_pcbs +10052f40 d seqno +10052f44 d tcplen +10052f48 d ackno +10052f4c d flags +10052f4d d recv_flags +10052f50 d tcphdr +10052f54 d recv_data +10052f58 d inseg +10052f6c D tcp_input_pcb +10052f70 D udp_pcbs +10052f74 d etharp_cached_entry +10052f78 d arp_table +10053040 D lwip_tickless_used +10053044 d s_timeoutlist +10053074 d s_nextthread +10053078 d dhcps_ip_table_semaphore +1005307c d dhcps_send_broadcast_address +10053080 D dhcps_ip4addr_pool_end +10053081 d dhcp_client_ethernet_address +10053094 d dhcps_subnet_broadcast +10053098 d bound_client_ethernet_address +100530a8 d ip_table +100530c8 d dhcps_pcb +100530cc d dhcp_message_total_options_lenth +100530d0 d dhcps_local_address +100530d4 d dhcps_netif +100530d8 d client_request_ip +100530dc d dhcps_allocated_client_address +100530e0 d dhcps_local_mask +100530e4 d dhcps_local_gateway +100530e8 d dhcps_network_id +100530ec D dhcps_ip4addr_pool_start +100530f0 d dhcp_message_repository +100530f4 D ext_upper +100530f8 d xFreeBytesRemaining +100530fc d ext_free +10053100 D ext_lower +10053104 d pxEnd +10053108 d xStart +10053110 d xMinimumEverFreeBytesRemaining +10053114 d ulTimerCountsForOneTick +10053118 d ulStoppedTimerCompensation +1005311c d xMaximumPossibleSuppressedTicks +10053120 d xPendingReadyList +10053134 d uxTopReadyPriority +10053138 d uxTasksDeleted +1005313c d xTickCount +10053140 d pxReadyTasksLists +1005321c d pxOverflowDelayedTaskList +10053220 d xTasksWaitingTermination +10053234 d pxDelayedTaskList +10053238 d xSchedulerRunning +1005323c d ulTaskSwitchedInTime +10053240 D pxCurrentTCB +10053244 d uxPendedTicks +10053248 d xSuspendedTaskList +1005325c d uxCurrentNumberOfTasks +10053260 d ulDeltaTotalRunTime +10053264 d xDelayedTaskList2 +10053278 d xDelayedTaskList1 +1005328c d uxTaskNumber +10053290 d xYieldPending +10053294 d uxSchedulerSuspended +10053298 d xNumOfOverflows +1005329c d pxCurrentTimerList +100532a0 d xActiveTimerList1 +100532b4 d xActiveTimerList2 +100532c8 d xLastTime.5284 +100532cc d xTimerQueue +100532d0 d pxOverflowTimerList +100532d4 d xTimerTaskHandle +100532d8 d device_mutex +100532e4 d mutex_init +100532e8 d uxSavedInterruptStatus +100532ec D min_free_heap_size +100532f0 d g_heap_inited +100532f4 d tcm_lock +100532f8 D g_tcm_heap +100532fc D flashobj +10053308 D fspic_isinit +1005330c D WDGAdapter +10053348 d last_acquire_wakelock_time +100533c8 D post_sleep_callback +10053448 D pre_sleep_callback +100534c8 D reserve_pll +100534cc d sys_sleep_time +100534d0 d hold_wakelock_time +10053550 D missing_tick +10053554 D Timer2To7HandlerData +1005356c D auto_reconnect_running +10053570 D p_wlan_autoreconnect_hdl +10053574 D mac_monitor_callback +10053578 D mf_list_head +1005357c d pscan_retry_cnt.21430 +10053580 D promisc_callback_all +10053584 D promisc_sema +10053588 D promisc_callback +1005358c D psk_essid +100535d4 D psk_passphrase +10053656 D psk_passphrase64 +10053697 D wpa_global_PSK +100536e7 d RFC1042_OUI +100536ec d rx_ring_pool +100557cc d stop_report_count.20629 +100557cd D bCheckStateTIMER +100557d0 d WifiMcuCmdBitMap.20974 +100557d4 D p_wlan_init_done_callback +100557d8 D rtw_power_percentage_idx +100557dc D p_wlan_uart_adapter_callback +100557e0 D rtw_adaptivity_en +100557e4 D p_wlan_mgmt_filter +100557e8 D rtw_initmac +100557ec D rtw_adaptivity_th_l2h_ini +100557f0 d drvpriv +10055804 D skbbuf_used_num +10055808 V skb_pool +100559c0 D skbdata_used_num +100559c4 d wrapper_skbbuf_list +100559cc D max_skbdata_used_num +100559d0 D max_skbbuf_used_num +100559d4 d skb_fail_count +100559d8 D timer_table +100559e0 D rltk_wlan_info +10055a10 d timer_used_num +10055a14 D max_timer_used_num +10055a18 D Noisy_State +10055a1c D pExportWlanIrqSemaphore +10055a20 D gDeltaSwingTableXtal_MP_N_TxXtalTrack_8195A +10055a3e D .ram.bss$$Limit +10055a3e D __bss_end__ +10055a40 B __ram_heap2_start__ 10070000 A __ram_heap2_end__ 1fff0000 D __ram_tcm_start__ 1fff0000 D __tcm_heap_start__ diff --git a/sdkset.mk b/sdkset.mk index 0b5bf49..8201901 100644 --- a/sdkset.mk +++ b/sdkset.mk @@ -1,6 +1,6 @@ # FLAGS # ------------------------------------------------------------------- -CFLAGS = -DM3 -DCONFIG_PLATFORM_8195A -DGCC_ARMCM3 -DARDUINO_SDK -DF_CPU=166666666L +CFLAGS = -DM3 -DCONFIG_PLATFORM_8195A -DGCC_ARMCM3 -DARDUINO_SDK -DF_CPU=166666666L -DNDEBUG CFLAGS += -mcpu=cortex-m3 -mthumb -g2 -Os -std=gnu99 CFLAGS += -fno-common -fmessage-length=0 -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-short-enums -fsigned-char CFLAGS += -w -Wno-pointer-sign @@ -97,8 +97,9 @@ SRC_C += sdk/component/soc/realtek/8195a/cmsis/device/system_8195a.c #DRAM_C += sdk/component/common/api/at_cmd/atcmd_wifi.c #SRC_C += sdk/component/common/api/at_cmd/log_service.c #SRC_C += sdk/component/soc/realtek/8195a/misc/driver/low_level_io.c -#SRC_C += sdk/component/soc/realtek/8195a/misc/driver/rtl_consol.c +#console new/old SRC_C += sdk/component/soc/realtek/8195a/misc/driver/rtl_console_new.c +#SRC_C += sdk/component/soc/realtek/8195a/misc/driver/rtl_consol.c #network - api SRC_C += sdk/component/common/api/wifi/rtw_wpa_supplicant/wpa_supplicant/wifi_eap_config.c @@ -114,13 +115,13 @@ SRC_C += sdk/component/common/api/lwip_netconf.c #network - app #SRC_C += sdk/component/common/utilities/ssl_client.c #SRC_C += sdk/component/common/utilities/ssl_client_ext.c -SRC_C += sdk/component/common/utilities/tcptest.c -SRC_C += sdk/component/common/utilities/uart_ymodem.c +#SRC_C += sdk/component/common/utilities/tcptest.c +#SRC_C += sdk/component/common/utilities/uart_ymodem.c #SRC_C += sdk/component/common/utilities/update.c #SRC_C += sdk/component/common/application/uart_adapter/uart_adapter.c SRC_C += sdk/component/common/api/network/src/wlan_network.c -SRC_C += sdk/component/common/api/wifi_interactive_mode.c -SRC_C += sdk/component/common/api/network/src/ping_test.c +#SRC_C += sdk/component/common/api/wifi_interactive_mode.c +#SRC_C += sdk/component/common/api/network/src/ping_test.c #network - lwip SRC_C += sdk/component/common/network/lwip/lwip_v1.4.1/src/api/api_lib.c @@ -160,7 +161,7 @@ SRC_C += sdk/component/common/network/lwip/lwip_v1.4.1/port/realtek/freertos/eth SRC_C += sdk/component/common/drivers/wlan/realtek/src/osdep/lwip_intf.c SRC_C += sdk/component/common/network/lwip/lwip_v1.4.1/port/realtek/freertos/sys_arch.c SRC_C += sdk/component/common/network/dhcp/dhcps.c -SRC_C += sdk/component/common/network/sntp/sntp.c +#SRC_C += sdk/component/common/network/sntp/sntp.c #network - mdns #SRC_C += sdk/component/common/network/mDNS/mDNSPlatform.c @@ -330,11 +331,11 @@ DRAM_C += sdk/component/common/network/ssl/ssl_ram_map/ssl_ram_map.c #DRAM_C += sdk/component/common/application/wigadget/wigadget.c #utilities -SRC_C += sdk/component/common/utilities/cJSON.c -SRC_C += sdk/component/common/utilities/http_client.c -SRC_C += sdk/component/common/utilities/uart_socket.c -SRC_C += sdk/component/common/utilities/webserver.c -SRC_C += sdk/component/common/utilities/xml.c +#SRC_C += sdk/component/common/utilities/cJSON.c +#SRC_C += sdk/component/common/utilities/http_client.c +#SRC_C += sdk/component/common/utilities/uart_socket.c +#SRC_C += sdk/component/common/utilities/webserver.c +#SRC_C += sdk/component/common/utilities/xml.c #utilities - FatFS SRC_C += sdk/component/common/file_system/fatfs/fatfs_ext/src/ff_driver.c @@ -344,10 +345,7 @@ SRC_C += sdk/component/common/file_system/fatfs/r0.10c/src/option/ccsbcs.c SRC_C += sdk/component/common/file_system/fatfs/disk_if/src/sdcard.c #utilities - xmodem update -SRC_C += sdk/component/common/application/xmodem/uart_fw_update.c -#user -#SRC_C += project/src/main.c - +#SRC_C += sdk/component/common/application/xmodem/uart_fw_update.c # ------------------------------------------------------------------- # My Source file list # ------------------------------------------------------------------- @@ -366,10 +364,13 @@ ADD_SRC_C += sdk/component/soc/realtek/8195a/fwlib/src/hal_misc.c ADD_SRC_C += sdk/component/soc/realtek/8195a/fwlib/ram_lib/startup.c ADD_SRC_C += sdk/component/common/mbed/targets/hal/rtl8195a/flash_eep.c ADD_SRC_C += sdk/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_libc.c -ADD_SRC_C += sdk/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_pvvx_libc.c ADD_SRC_C += sdk/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_libgloss_retarget.c ADD_SRC_C += sdk/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/rtl_eabi_cast_ram.c ADD_SRC_C += sdk/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/rtl_math_ram.c +#if +- nostdlib.. +ADD_SRC_C += sdk/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/ram_pvvx_libc.c +#if c_printf() float +#ADD_SRC_C += sdk/component/soc/realtek/8195a/misc/rtl_std_lib/lib_rtlstd/c_stdio.c # ------------------------------------------------------------------- # SAMPLES # -------------------------------------------------------------------