wifi.h 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2009-2010 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. * The full GNU General Public License is included in this distribution in the
  19. * file called LICENSE.
  20. *
  21. * Contact Information:
  22. * wlanfae <wlanfae@realtek.com>
  23. * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  24. * Hsinchu 300, Taiwan.
  25. *
  26. * Larry Finger <Larry.Finger@lwfinger.net>
  27. *
  28. *****************************************************************************/
  29. #ifndef __RTL_WIFI_H__
  30. #define __RTL_WIFI_H__
  31. #include <linux/sched.h>
  32. #include <linux/firmware.h>
  33. #include <linux/version.h>
  34. #include <linux/etherdevice.h>
  35. #include <linux/usb.h>
  36. #include <net/mac80211.h>
  37. #include "debug.h"
  38. #define RF_CHANGE_BY_INIT 0
  39. #define RF_CHANGE_BY_IPS BIT(28)
  40. #define RF_CHANGE_BY_PS BIT(29)
  41. #define RF_CHANGE_BY_HW BIT(30)
  42. #define RF_CHANGE_BY_SW BIT(31)
  43. #define IQK_ADDA_REG_NUM 16
  44. #define IQK_MAC_REG_NUM 4
  45. #define MAX_KEY_LEN 61
  46. #define KEY_BUF_SIZE 5
  47. /* QoS related. */
  48. /*aci: 0x00 Best Effort*/
  49. /*aci: 0x01 Background*/
  50. /*aci: 0x10 Video*/
  51. /*aci: 0x11 Voice*/
  52. /*Max: define total number.*/
  53. #define AC0_BE 0
  54. #define AC1_BK 1
  55. #define AC2_VI 2
  56. #define AC3_VO 3
  57. #define AC_MAX 4
  58. #define QOS_QUEUE_NUM 4
  59. #define RTL_MAC80211_NUM_QUEUE 5
  60. #define QBSS_LOAD_SIZE 5
  61. #define MAX_WMMELE_LENGTH 64
  62. /*slot time for 11g. */
  63. #define RTL_SLOT_TIME_9 9
  64. #define RTL_SLOT_TIME_20 20
  65. /*related with tcp/ip. */
  66. /*if_ehther.h*/
  67. #define ETH_P_PAE 0x888E /*Port Access Entity (IEEE 802.1X) */
  68. #define ETH_P_IP 0x0800 /*Internet Protocol packet */
  69. #define ETH_P_ARP 0x0806 /*Address Resolution packet */
  70. #define SNAP_SIZE 6
  71. #define PROTOC_TYPE_SIZE 2
  72. /*related with 802.11 frame*/
  73. #define MAC80211_3ADDR_LEN 24
  74. #define MAC80211_4ADDR_LEN 30
  75. enum intf_type {
  76. INTF_PCI = 0,
  77. INTF_USB = 1,
  78. };
  79. enum radio_path {
  80. RF90_PATH_A = 0,
  81. RF90_PATH_B = 1,
  82. RF90_PATH_C = 2,
  83. RF90_PATH_D = 3,
  84. };
  85. enum rt_eeprom_type {
  86. EEPROM_93C46,
  87. EEPROM_93C56,
  88. EEPROM_BOOT_EFUSE,
  89. };
  90. enum rtl_status {
  91. RTL_STATUS_INTERFACE_START = 0,
  92. };
  93. enum hardware_type {
  94. HARDWARE_TYPE_RTL8192E,
  95. HARDWARE_TYPE_RTL8192U,
  96. HARDWARE_TYPE_RTL8192SE,
  97. HARDWARE_TYPE_RTL8192SU,
  98. HARDWARE_TYPE_RTL8192CE,
  99. HARDWARE_TYPE_RTL8192CU,
  100. HARDWARE_TYPE_RTL8192DE,
  101. HARDWARE_TYPE_RTL8192DU,
  102. /*keep it last*/
  103. HARDWARE_TYPE_NUM
  104. };
  105. #define IS_HARDWARE_TYPE_8192CE(rtlhal) \
  106. (rtlhal->hw_type == HARDWARE_TYPE_RTL8192CE)
  107. enum scan_operation_backup_opt {
  108. SCAN_OPT_BACKUP = 0,
  109. SCAN_OPT_RESTORE,
  110. SCAN_OPT_MAX
  111. };
  112. /*RF state.*/
  113. enum rf_pwrstate {
  114. ERFON,
  115. ERFSLEEP,
  116. ERFOFF
  117. };
  118. struct bb_reg_def {
  119. u32 rfintfs;
  120. u32 rfintfi;
  121. u32 rfintfo;
  122. u32 rfintfe;
  123. u32 rf3wire_offset;
  124. u32 rflssi_select;
  125. u32 rftxgain_stage;
  126. u32 rfhssi_para1;
  127. u32 rfhssi_para2;
  128. u32 rfswitch_control;
  129. u32 rfagc_control1;
  130. u32 rfagc_control2;
  131. u32 rfrxiq_imbalance;
  132. u32 rfrx_afe;
  133. u32 rftxiq_imbalance;
  134. u32 rftx_afe;
  135. u32 rflssi_readback;
  136. u32 rflssi_readbackpi;
  137. };
  138. enum io_type {
  139. IO_CMD_PAUSE_DM_BY_SCAN = 0,
  140. IO_CMD_RESUME_DM_BY_SCAN = 1,
  141. };
  142. enum hw_variables {
  143. HW_VAR_ETHER_ADDR,
  144. HW_VAR_MULTICAST_REG,
  145. HW_VAR_BASIC_RATE,
  146. HW_VAR_BSSID,
  147. HW_VAR_MEDIA_STATUS,
  148. HW_VAR_SECURITY_CONF,
  149. HW_VAR_BEACON_INTERVAL,
  150. HW_VAR_ATIM_WINDOW,
  151. HW_VAR_LISTEN_INTERVAL,
  152. HW_VAR_CS_COUNTER,
  153. HW_VAR_DEFAULTKEY0,
  154. HW_VAR_DEFAULTKEY1,
  155. HW_VAR_DEFAULTKEY2,
  156. HW_VAR_DEFAULTKEY3,
  157. HW_VAR_SIFS,
  158. HW_VAR_DIFS,
  159. HW_VAR_EIFS,
  160. HW_VAR_SLOT_TIME,
  161. HW_VAR_ACK_PREAMBLE,
  162. HW_VAR_CW_CONFIG,
  163. HW_VAR_CW_VALUES,
  164. HW_VAR_RATE_FALLBACK_CONTROL,
  165. HW_VAR_CONTENTION_WINDOW,
  166. HW_VAR_RETRY_COUNT,
  167. HW_VAR_TR_SWITCH,
  168. HW_VAR_COMMAND,
  169. HW_VAR_WPA_CONFIG,
  170. HW_VAR_AMPDU_MIN_SPACE,
  171. HW_VAR_SHORTGI_DENSITY,
  172. HW_VAR_AMPDU_FACTOR,
  173. HW_VAR_MCS_RATE_AVAILABLE,
  174. HW_VAR_AC_PARAM,
  175. HW_VAR_ACM_CTRL,
  176. HW_VAR_DIS_Req_Qsize,
  177. HW_VAR_CCX_CHNL_LOAD,
  178. HW_VAR_CCX_NOISE_HISTOGRAM,
  179. HW_VAR_CCX_CLM_NHM,
  180. HW_VAR_TxOPLimit,
  181. HW_VAR_TURBO_MODE,
  182. HW_VAR_RF_STATE,
  183. HW_VAR_RF_OFF_BY_HW,
  184. HW_VAR_BUS_SPEED,
  185. HW_VAR_SET_DEV_POWER,
  186. HW_VAR_RCR,
  187. HW_VAR_RATR_0,
  188. HW_VAR_RRSR,
  189. HW_VAR_CPU_RST,
  190. HW_VAR_CECHK_BSSID,
  191. HW_VAR_LBK_MODE,
  192. HW_VAR_AES_11N_FIX,
  193. HW_VAR_USB_RX_AGGR,
  194. HW_VAR_USER_CONTROL_TURBO_MODE,
  195. HW_VAR_RETRY_LIMIT,
  196. HW_VAR_INIT_TX_RATE,
  197. HW_VAR_TX_RATE_REG,
  198. HW_VAR_EFUSE_USAGE,
  199. HW_VAR_EFUSE_BYTES,
  200. HW_VAR_AUTOLOAD_STATUS,
  201. HW_VAR_RF_2R_DISABLE,
  202. HW_VAR_SET_RPWM,
  203. HW_VAR_H2C_FW_PWRMODE,
  204. HW_VAR_H2C_FW_JOINBSSRPT,
  205. HW_VAR_FW_PSMODE_STATUS,
  206. HW_VAR_1X1_RECV_COMBINE,
  207. HW_VAR_STOP_SEND_BEACON,
  208. HW_VAR_TSF_TIMER,
  209. HW_VAR_IO_CMD,
  210. HW_VAR_RF_RECOVERY,
  211. HW_VAR_H2C_FW_UPDATE_GTK,
  212. HW_VAR_WF_MASK,
  213. HW_VAR_WF_CRC,
  214. HW_VAR_WF_IS_MAC_ADDR,
  215. HW_VAR_H2C_FW_OFFLOAD,
  216. HW_VAR_RESET_WFCRC,
  217. HW_VAR_HANDLE_FW_C2H,
  218. HW_VAR_DL_FW_RSVD_PAGE,
  219. HW_VAR_AID,
  220. HW_VAR_HW_SEQ_ENABLE,
  221. HW_VAR_CORRECT_TSF,
  222. HW_VAR_BCN_VALID,
  223. HW_VAR_FWLPS_RF_ON,
  224. HW_VAR_DUAL_TSF_RST,
  225. HW_VAR_SWITCH_EPHY_WoWLAN,
  226. HW_VAR_INT_MIGRATION,
  227. HW_VAR_INT_AC,
  228. HW_VAR_RF_TIMING,
  229. HW_VAR_MRC,
  230. HW_VAR_MGT_FILTER,
  231. HW_VAR_CTRL_FILTER,
  232. HW_VAR_DATA_FILTER,
  233. };
  234. enum _RT_MEDIA_STATUS {
  235. RT_MEDIA_DISCONNECT = 0,
  236. RT_MEDIA_CONNECT = 1
  237. };
  238. enum rt_oem_id {
  239. RT_CID_DEFAULT = 0,
  240. RT_CID_8187_ALPHA0 = 1,
  241. RT_CID_8187_SERCOMM_PS = 2,
  242. RT_CID_8187_HW_LED = 3,
  243. RT_CID_8187_NETGEAR = 4,
  244. RT_CID_WHQL = 5,
  245. RT_CID_819x_CAMEO = 6,
  246. RT_CID_819x_RUNTOP = 7,
  247. RT_CID_819x_Senao = 8,
  248. RT_CID_TOSHIBA = 9,
  249. RT_CID_819x_Netcore = 10,
  250. RT_CID_Nettronix = 11,
  251. RT_CID_DLINK = 12,
  252. RT_CID_PRONET = 13,
  253. RT_CID_COREGA = 14,
  254. RT_CID_819x_ALPHA = 15,
  255. RT_CID_819x_Sitecom = 16,
  256. RT_CID_CCX = 17,
  257. RT_CID_819x_Lenovo = 18,
  258. RT_CID_819x_QMI = 19,
  259. RT_CID_819x_Edimax_Belkin = 20,
  260. RT_CID_819x_Sercomm_Belkin = 21,
  261. RT_CID_819x_CAMEO1 = 22,
  262. RT_CID_819x_MSI = 23,
  263. RT_CID_819x_Acer = 24,
  264. RT_CID_819x_HP = 27,
  265. RT_CID_819x_CLEVO = 28,
  266. RT_CID_819x_Arcadyan_Belkin = 29,
  267. RT_CID_819x_SAMSUNG = 30,
  268. RT_CID_819x_WNC_COREGA = 31,
  269. RT_CID_819x_Foxcoon = 32,
  270. RT_CID_819x_DELL = 33,
  271. };
  272. enum hw_descs {
  273. HW_DESC_OWN,
  274. HW_DESC_RXOWN,
  275. HW_DESC_TX_NEXTDESC_ADDR,
  276. HW_DESC_TXBUFF_ADDR,
  277. HW_DESC_RXBUFF_ADDR,
  278. HW_DESC_RXPKT_LEN,
  279. HW_DESC_RXERO,
  280. };
  281. enum prime_sc {
  282. PRIME_CHNL_OFFSET_DONT_CARE = 0,
  283. PRIME_CHNL_OFFSET_LOWER = 1,
  284. PRIME_CHNL_OFFSET_UPPER = 2,
  285. };
  286. enum rf_type {
  287. RF_1T1R = 0,
  288. RF_1T2R = 1,
  289. RF_2T2R = 2,
  290. };
  291. enum ht_channel_width {
  292. HT_CHANNEL_WIDTH_20 = 0,
  293. HT_CHANNEL_WIDTH_20_40 = 1,
  294. };
  295. /* Ref: 802.11i sepc D10.0 7.3.2.25.1
  296. Cipher Suites Encryption Algorithms */
  297. enum rt_enc_alg {
  298. NO_ENCRYPTION = 0,
  299. WEP40_ENCRYPTION = 1,
  300. TKIP_ENCRYPTION = 2,
  301. RSERVED_ENCRYPTION = 3,
  302. AESCCMP_ENCRYPTION = 4,
  303. WEP104_ENCRYPTION = 5,
  304. };
  305. enum rtl_hal_state {
  306. _HAL_STATE_STOP = 0,
  307. _HAL_STATE_START = 1,
  308. };
  309. enum rtl_var_map {
  310. /*reg map */
  311. SYS_ISO_CTRL = 0,
  312. SYS_FUNC_EN,
  313. SYS_CLK,
  314. MAC_RCR_AM,
  315. MAC_RCR_AB,
  316. MAC_RCR_ACRC32,
  317. MAC_RCR_ACF,
  318. MAC_RCR_AAP,
  319. /*efuse map */
  320. EFUSE_TEST,
  321. EFUSE_CTRL,
  322. EFUSE_CLK,
  323. EFUSE_CLK_CTRL,
  324. EFUSE_PWC_EV12V,
  325. EFUSE_FEN_ELDR,
  326. EFUSE_LOADER_CLK_EN,
  327. EFUSE_ANA8M,
  328. EFUSE_HWSET_MAX_SIZE,
  329. /*CAM map */
  330. RWCAM,
  331. WCAMI,
  332. RCAMO,
  333. CAMDBG,
  334. SECR,
  335. SEC_CAM_NONE,
  336. SEC_CAM_WEP40,
  337. SEC_CAM_TKIP,
  338. SEC_CAM_AES,
  339. SEC_CAM_WEP104,
  340. /*IMR map */
  341. RTL_IMR_BCNDMAINT6, /*Beacon DMA Interrupt 6 */
  342. RTL_IMR_BCNDMAINT5, /*Beacon DMA Interrupt 5 */
  343. RTL_IMR_BCNDMAINT4, /*Beacon DMA Interrupt 4 */
  344. RTL_IMR_BCNDMAINT3, /*Beacon DMA Interrupt 3 */
  345. RTL_IMR_BCNDMAINT2, /*Beacon DMA Interrupt 2 */
  346. RTL_IMR_BCNDMAINT1, /*Beacon DMA Interrupt 1 */
  347. RTL_IMR_BCNDOK8, /*Beacon Queue DMA OK Interrup 8 */
  348. RTL_IMR_BCNDOK7, /*Beacon Queue DMA OK Interrup 7 */
  349. RTL_IMR_BCNDOK6, /*Beacon Queue DMA OK Interrup 6 */
  350. RTL_IMR_BCNDOK5, /*Beacon Queue DMA OK Interrup 5 */
  351. RTL_IMR_BCNDOK4, /*Beacon Queue DMA OK Interrup 4 */
  352. RTL_IMR_BCNDOK3, /*Beacon Queue DMA OK Interrup 3 */
  353. RTL_IMR_BCNDOK2, /*Beacon Queue DMA OK Interrup 2 */
  354. RTL_IMR_BCNDOK1, /*Beacon Queue DMA OK Interrup 1 */
  355. RTL_IMR_TIMEOUT2, /*Timeout interrupt 2 */
  356. RTL_IMR_TIMEOUT1, /*Timeout interrupt 1 */
  357. RTL_IMR_TXFOVW, /*Transmit FIFO Overflow */
  358. RTL_IMR_PSTIMEOUT, /*Power save time out interrupt */
  359. RTL_IMR_BcnInt, /*Beacon DMA Interrupt 0 */
  360. RTL_IMR_RXFOVW, /*Receive FIFO Overflow */
  361. RTL_IMR_RDU, /*Receive Descriptor Unavailable */
  362. RTL_IMR_ATIMEND, /*For 92C,ATIM Window End Interrupt */
  363. RTL_IMR_BDOK, /*Beacon Queue DMA OK Interrup */
  364. RTL_IMR_HIGHDOK, /*High Queue DMA OK Interrupt */
  365. RTL_IMR_TBDOK, /*Transmit Beacon OK interrup */
  366. RTL_IMR_MGNTDOK, /*Management Queue DMA OK Interrupt */
  367. RTL_IMR_TBDER, /*For 92C,Transmit Beacon Error Interrupt */
  368. RTL_IMR_BKDOK, /*AC_BK DMA OK Interrupt */
  369. RTL_IMR_BEDOK, /*AC_BE DMA OK Interrupt */
  370. RTL_IMR_VIDOK, /*AC_VI DMA OK Interrupt */
  371. RTL_IMR_VODOK, /*AC_VO DMA Interrupt */
  372. RTL_IMR_ROK, /*Receive DMA OK Interrupt */
  373. RTL_IBSS_INT_MASKS, /*(RTL_IMR_BcnInt|RTL_IMR_TBDOK|RTL_IMR_TBDER)*/
  374. /*CCK Rates, TxHT = 0 */
  375. RTL_RC_CCK_RATE1M,
  376. RTL_RC_CCK_RATE2M,
  377. RTL_RC_CCK_RATE5_5M,
  378. RTL_RC_CCK_RATE11M,
  379. /*OFDM Rates, TxHT = 0 */
  380. RTL_RC_OFDM_RATE6M,
  381. RTL_RC_OFDM_RATE9M,
  382. RTL_RC_OFDM_RATE12M,
  383. RTL_RC_OFDM_RATE18M,
  384. RTL_RC_OFDM_RATE24M,
  385. RTL_RC_OFDM_RATE36M,
  386. RTL_RC_OFDM_RATE48M,
  387. RTL_RC_OFDM_RATE54M,
  388. RTL_RC_HT_RATEMCS7,
  389. RTL_RC_HT_RATEMCS15,
  390. /*keep it last */
  391. RTL_VAR_MAP_MAX,
  392. };
  393. /*Firmware PS mode for control LPS.*/
  394. enum _fw_ps_mode {
  395. FW_PS_ACTIVE_MODE = 0,
  396. FW_PS_MIN_MODE = 1,
  397. FW_PS_MAX_MODE = 2,
  398. FW_PS_DTIM_MODE = 3,
  399. FW_PS_VOIP_MODE = 4,
  400. FW_PS_UAPSD_WMM_MODE = 5,
  401. FW_PS_UAPSD_MODE = 6,
  402. FW_PS_IBSS_MODE = 7,
  403. FW_PS_WWLAN_MODE = 8,
  404. FW_PS_PM_Radio_Off = 9,
  405. FW_PS_PM_Card_Disable = 10,
  406. };
  407. enum rt_psmode {
  408. EACTIVE, /*Active/Continuous access. */
  409. EMAXPS, /*Max power save mode. */
  410. EFASTPS, /*Fast power save mode. */
  411. EAUTOPS, /*Auto power save mode. */
  412. };
  413. /*LED related.*/
  414. enum led_ctl_mode {
  415. LED_CTL_POWER_ON = 1,
  416. LED_CTL_LINK = 2,
  417. LED_CTL_NO_LINK = 3,
  418. LED_CTL_TX = 4,
  419. LED_CTL_RX = 5,
  420. LED_CTL_SITE_SURVEY = 6,
  421. LED_CTL_POWER_OFF = 7,
  422. LED_CTL_START_TO_LINK = 8,
  423. LED_CTL_START_WPS = 9,
  424. LED_CTL_STOP_WPS = 10,
  425. };
  426. enum rtl_led_pin {
  427. LED_PIN_GPIO0,
  428. LED_PIN_LED0,
  429. LED_PIN_LED1,
  430. LED_PIN_LED2
  431. };
  432. /*QoS related.*/
  433. /*acm implementation method.*/
  434. enum acm_method {
  435. eAcmWay0_SwAndHw = 0,
  436. eAcmWay1_HW = 1,
  437. eAcmWay2_SW = 2,
  438. };
  439. /*aci/aifsn Field.
  440. Ref: WMM spec 2.2.2: WME Parameter Element, p.12.*/
  441. union aci_aifsn {
  442. u8 char_data;
  443. struct {
  444. u8 aifsn:4;
  445. u8 acm:1;
  446. u8 aci:2;
  447. u8 reserved:1;
  448. } f; /* Field */
  449. };
  450. /*mlme related.*/
  451. enum wireless_mode {
  452. WIRELESS_MODE_UNKNOWN = 0x00,
  453. WIRELESS_MODE_A = 0x01,
  454. WIRELESS_MODE_B = 0x02,
  455. WIRELESS_MODE_G = 0x04,
  456. WIRELESS_MODE_AUTO = 0x08,
  457. WIRELESS_MODE_N_24G = 0x10,
  458. WIRELESS_MODE_N_5G = 0x20
  459. };
  460. enum ratr_table_mode {
  461. RATR_INX_WIRELESS_NGB = 0,
  462. RATR_INX_WIRELESS_NG = 1,
  463. RATR_INX_WIRELESS_NB = 2,
  464. RATR_INX_WIRELESS_N = 3,
  465. RATR_INX_WIRELESS_GB = 4,
  466. RATR_INX_WIRELESS_G = 5,
  467. RATR_INX_WIRELESS_B = 6,
  468. RATR_INX_WIRELESS_MC = 7,
  469. RATR_INX_WIRELESS_A = 8,
  470. };
  471. enum rtl_link_state {
  472. MAC80211_NOLINK = 0,
  473. MAC80211_LINKING = 1,
  474. MAC80211_LINKED = 2,
  475. MAC80211_LINKED_SCANNING = 3,
  476. };
  477. enum act_category {
  478. ACT_CAT_QOS = 1,
  479. ACT_CAT_DLS = 2,
  480. ACT_CAT_BA = 3,
  481. ACT_CAT_HT = 7,
  482. ACT_CAT_WMM = 17,
  483. };
  484. enum ba_action {
  485. ACT_ADDBAREQ = 0,
  486. ACT_ADDBARSP = 1,
  487. ACT_DELBA = 2,
  488. };
  489. struct octet_string {
  490. u8 *octet;
  491. u16 length;
  492. };
  493. struct rtl_hdr_3addr {
  494. __le16 frame_ctl;
  495. __le16 duration_id;
  496. u8 addr1[ETH_ALEN];
  497. u8 addr2[ETH_ALEN];
  498. u8 addr3[ETH_ALEN];
  499. __le16 seq_ctl;
  500. u8 payload[0];
  501. } __packed;
  502. struct rtl_info_element {
  503. u8 id;
  504. u8 len;
  505. u8 data[0];
  506. } __packed;
  507. struct rtl_probe_rsp {
  508. struct rtl_hdr_3addr header;
  509. u32 time_stamp[2];
  510. __le16 beacon_interval;
  511. __le16 capability;
  512. /*SSID, supported rates, FH params, DS params,
  513. CF params, IBSS params, TIM (if beacon), RSN */
  514. struct rtl_info_element info_element[0];
  515. } __packed;
  516. /*LED related.*/
  517. /*ledpin Identify how to implement this SW led.*/
  518. struct rtl_led {
  519. void *hw;
  520. enum rtl_led_pin ledpin;
  521. bool b_ledon;
  522. };
  523. struct rtl_led_ctl {
  524. bool bled_opendrain;
  525. struct rtl_led sw_led0;
  526. struct rtl_led sw_led1;
  527. };
  528. struct rtl_qos_parameters {
  529. __le16 cw_min;
  530. __le16 cw_max;
  531. u8 aifs;
  532. u8 flag;
  533. __le16 tx_op;
  534. } __packed;
  535. struct rt_smooth_data {
  536. u32 elements[100]; /*array to store values */
  537. u32 index; /*index to current array to store */
  538. u32 total_num; /*num of valid elements */
  539. u32 total_val; /*sum of valid elements */
  540. };
  541. struct false_alarm_statistics {
  542. u32 cnt_parity_fail;
  543. u32 cnt_rate_illegal;
  544. u32 cnt_crc8_fail;
  545. u32 cnt_mcs_fail;
  546. u32 cnt_ofdm_fail;
  547. u32 cnt_cck_fail;
  548. u32 cnt_all;
  549. };
  550. struct init_gain {
  551. u8 xaagccore1;
  552. u8 xbagccore1;
  553. u8 xcagccore1;
  554. u8 xdagccore1;
  555. u8 cca;
  556. };
  557. struct wireless_stats {
  558. unsigned long txbytesunicast;
  559. unsigned long txbytesmulticast;
  560. unsigned long txbytesbroadcast;
  561. unsigned long rxbytesunicast;
  562. long rx_snr_db[4];
  563. /*Correct smoothed ss in Dbm, only used
  564. in driver to report real power now. */
  565. long recv_signal_power;
  566. long signal_quality;
  567. long last_sigstrength_inpercent;
  568. u32 rssi_calculate_cnt;
  569. /*Transformed, in dbm. Beautified signal
  570. strength for UI, not correct. */
  571. long signal_strength;
  572. u8 rx_rssi_percentage[4];
  573. u8 rx_evm_percentage[2];
  574. struct rt_smooth_data ui_rssi;
  575. struct rt_smooth_data ui_link_quality;
  576. };
  577. struct rate_adaptive {
  578. u8 rate_adaptive_disabled;
  579. u8 ratr_state;
  580. u16 reserve;
  581. u32 high_rssi_thresh_for_ra;
  582. u32 high2low_rssi_thresh_for_ra;
  583. u8 low2high_rssi_thresh_for_ra40m;
  584. u32 low_rssi_thresh_for_ra40M;
  585. u8 low2high_rssi_thresh_for_ra20m;
  586. u32 low_rssi_thresh_for_ra20M;
  587. u32 upper_rssi_threshold_ratr;
  588. u32 middleupper_rssi_threshold_ratr;
  589. u32 middle_rssi_threshold_ratr;
  590. u32 middlelow_rssi_threshold_ratr;
  591. u32 low_rssi_threshold_ratr;
  592. u32 ultralow_rssi_threshold_ratr;
  593. u32 low_rssi_threshold_ratr_40m;
  594. u32 low_rssi_threshold_ratr_20m;
  595. u8 ping_rssi_enable;
  596. u32 ping_rssi_ratr;
  597. u32 ping_rssi_thresh_for_ra;
  598. u32 last_ratr;
  599. u8 pre_ratr_state;
  600. };
  601. struct regd_pair_mapping {
  602. u16 reg_dmnenum;
  603. u16 reg_5ghz_ctl;
  604. u16 reg_2ghz_ctl;
  605. };
  606. struct rtl_regulatory {
  607. char alpha2[2];
  608. u16 country_code;
  609. u16 max_power_level;
  610. u32 tp_scale;
  611. u16 current_rd;
  612. u16 current_rd_ext;
  613. int16_t power_limit;
  614. struct regd_pair_mapping *regpair;
  615. };
  616. struct rtl_rfkill {
  617. bool rfkill_state; /*0 is off, 1 is on */
  618. };
  619. struct rtl_phy {
  620. struct bb_reg_def phyreg_def[4]; /*Radio A/B/C/D */
  621. struct init_gain initgain_backup;
  622. enum io_type current_io_type;
  623. u8 rf_mode;
  624. u8 rf_type;
  625. u8 current_chan_bw;
  626. u8 set_bwmode_inprogress;
  627. u8 sw_chnl_inprogress;
  628. u8 sw_chnl_stage;
  629. u8 sw_chnl_step;
  630. u8 current_channel;
  631. u8 h2c_box_num;
  632. u8 set_io_inprogress;
  633. /*record for power tracking*/
  634. s32 reg_e94;
  635. s32 reg_e9c;
  636. s32 reg_ea4;
  637. s32 reg_eac;
  638. s32 reg_eb4;
  639. s32 reg_ebc;
  640. s32 reg_ec4;
  641. s32 reg_ecc;
  642. u8 rfpienable;
  643. u8 reserve_0;
  644. u16 reserve_1;
  645. u32 reg_c04, reg_c08, reg_874;
  646. u32 adda_backup[16];
  647. u32 iqk_mac_backup[IQK_MAC_REG_NUM];
  648. u32 iqk_bb_backup[10];
  649. bool b_rfpi_enable;
  650. u8 pwrgroup_cnt;
  651. u8 bcck_high_power;
  652. /* 3 groups of pwr diff by rates*/
  653. u32 mcs_txpwrlevel_origoffset[4][16];
  654. u8 default_initialgain[4];
  655. /*the current Tx power level*/
  656. u8 cur_cck_txpwridx;
  657. u8 cur_ofdm24g_txpwridx;
  658. u32 rfreg_chnlval[2];
  659. bool b_apk_done;
  660. /*fsync*/
  661. u8 framesync;
  662. u32 framesync_c34;
  663. u8 num_total_rfpath;
  664. };
  665. #define MAX_TID_COUNT 9
  666. #define RTL_AGG_OFF 0
  667. #define RTL_AGG_ON 1
  668. #define RTL_AGG_EMPTYING_HW_QUEUE_ADDBA 2
  669. #define RTL_AGG_EMPTYING_HW_QUEUE_DELBA 3
  670. struct rtl_ht_agg {
  671. u16 txq_id;
  672. u16 wait_for_ba;
  673. u16 start_idx;
  674. u64 bitmap;
  675. u32 rate_n_flags;
  676. u8 agg_state;
  677. };
  678. struct rtl_tid_data {
  679. u16 seq_number;
  680. struct rtl_ht_agg agg;
  681. };
  682. struct rtl_priv;
  683. struct rtl_io {
  684. struct device *dev;
  685. struct mutex bb_mutex;
  686. /*PCI MEM map */
  687. unsigned long pci_mem_end; /*shared mem end */
  688. unsigned long pci_mem_start; /*shared mem start */
  689. /*PCI IO map */
  690. unsigned long pci_base_addr; /*device I/O address */
  691. void (*write8_async) (struct rtl_priv *rtlpriv, u32 addr, u8 val);
  692. void (*write16_async) (struct rtl_priv *rtlpriv, u32 addr, u16 val);
  693. void (*write32_async) (struct rtl_priv *rtlpriv, u32 addr, u32 val);
  694. int (*writeN_async) (struct rtl_priv *rtlpriv, u32 addr, u16 len,
  695. u8 *pdata);
  696. u8(*read8_sync) (struct rtl_priv *rtlpriv, u32 addr);
  697. u16(*read16_sync) (struct rtl_priv *rtlpriv, u32 addr);
  698. u32(*read32_sync) (struct rtl_priv *rtlpriv, u32 addr);
  699. int (*readN_sync) (struct rtl_priv *rtlpriv, u32 addr, u16 len,
  700. u8 *pdata);
  701. };
  702. struct rtl_mac {
  703. u8 mac_addr[ETH_ALEN];
  704. u8 mac80211_registered;
  705. u8 beacon_enabled;
  706. u32 tx_ss_num;
  707. u32 rx_ss_num;
  708. struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS];
  709. struct ieee80211_hw *hw;
  710. struct ieee80211_vif *vif;
  711. enum nl80211_iftype opmode;
  712. /*Probe Beacon management */
  713. struct rtl_tid_data tids[MAX_TID_COUNT];
  714. enum rtl_link_state link_state;
  715. int n_channels;
  716. int n_bitrates;
  717. /*filters */
  718. u32 rx_conf;
  719. u16 rx_mgt_filter;
  720. u16 rx_ctrl_filter;
  721. u16 rx_data_filter;
  722. bool act_scanning;
  723. u8 cnt_after_linked;
  724. /*RDG*/ bool rdg_en;
  725. /*AP*/ u8 bssid[6];
  726. u8 mcs[16]; /*16 bytes mcs for HT rates.*/
  727. u32 basic_rates; /*b/g rates*/
  728. u8 ht_enable;
  729. u8 sgi_40;
  730. u8 sgi_20;
  731. u8 bw_40;
  732. u8 mode; /*wireless mode*/
  733. u8 slot_time;
  734. u8 short_preamble;
  735. u8 use_cts_protect;
  736. u8 cur_40_prime_sc;
  737. u8 cur_40_prime_sc_bk;
  738. u64 tsf;
  739. u8 retry_short;
  740. u8 retry_long;
  741. u16 assoc_id;
  742. /*IBSS*/ int beacon_interval;
  743. /*AMPDU*/ u8 min_space_cfg; /*For Min spacing configurations */
  744. u8 max_mss_density;
  745. u8 current_ampdu_factor;
  746. u8 current_ampdu_density;
  747. /*QOS & EDCA */
  748. struct ieee80211_tx_queue_params edca_param[RTL_MAC80211_NUM_QUEUE];
  749. struct rtl_qos_parameters ac[AC_MAX];
  750. };
  751. struct rtl_hal {
  752. struct ieee80211_hw *hw;
  753. enum intf_type interface;
  754. u16 hw_type; /*92c or 92d or 92s and so on */
  755. u8 oem_id;
  756. u8 version; /*version of chip */
  757. u8 state; /*stop 0, start 1 */
  758. /*firmware */
  759. u8 *pfirmware;
  760. bool b_h2c_setinprogress;
  761. u8 last_hmeboxnum;
  762. bool bfw_ready;
  763. /*Reserve page start offset except beacon in TxQ. */
  764. u8 fw_rsvdpage_startoffset;
  765. };
  766. struct rtl_security {
  767. /*default 0 */
  768. bool use_sw_sec;
  769. bool being_setkey;
  770. bool use_defaultkey;
  771. /*Encryption Algorithm for Unicast Packet */
  772. enum rt_enc_alg pairwise_enc_algorithm;
  773. /*Encryption Algorithm for Brocast/Multicast */
  774. enum rt_enc_alg group_enc_algorithm;
  775. /*local Key buffer, indx 0 is for
  776. pairwise key 1-4 is for agoup key. */
  777. u8 key_buf[KEY_BUF_SIZE][MAX_KEY_LEN];
  778. u8 key_len[KEY_BUF_SIZE];
  779. /*The pointer of Pairwise Key,
  780. it always points to KeyBuf[4] */
  781. u8 *pairwise_key;
  782. };
  783. struct rtl_dm {
  784. /*PHY status for DM (dynamic management) */
  785. long entry_min_undecoratedsmoothed_pwdb;
  786. long undecorated_smoothed_pwdb; /*out dm */
  787. long entry_max_undecoratedsmoothed_pwdb;
  788. bool b_dm_initialgain_enable;
  789. bool bdynamic_txpower_enable;
  790. bool bcurrent_turbo_edca;
  791. bool bis_any_nonbepkts; /*out dm */
  792. bool bis_cur_rdlstate;
  793. bool btxpower_trackingInit;
  794. bool b_disable_framebursting;
  795. bool b_cck_inch14;
  796. bool btxpower_tracking;
  797. bool b_useramask;
  798. bool brfpath_rxenable[4];
  799. u8 thermalvalue_iqk;
  800. u8 thermalvalue_lck;
  801. u8 thermalvalue;
  802. u8 last_dtp_lvl;
  803. u8 dynamic_txhighpower_lvl; /*Tx high power level */
  804. u8 dm_flag; /*Indicate if each dynamic mechanism's status. */
  805. u8 dm_type;
  806. u8 txpower_track_control;
  807. char ofdm_index[2];
  808. char cck_index;
  809. };
  810. #define EFUSE_MAX_LOGICAL_SIZE 128
  811. struct rtl_efuse {
  812. bool bautoLoad_ok;
  813. bool bootfromefuse;
  814. u16 max_physical_size;
  815. u8 contents[EFUSE_MAX_LOGICAL_SIZE];
  816. u8 efuse_map[2][EFUSE_MAX_LOGICAL_SIZE];
  817. u16 efuse_usedbytes;
  818. u8 efuse_usedpercentage;
  819. u8 autoload_failflag;
  820. short epromtype;
  821. u16 eeprom_vid;
  822. u16 eeprom_did;
  823. u16 eeprom_svid;
  824. u16 eeprom_smid;
  825. u8 eeprom_oemid;
  826. u16 eeprom_channelplan;
  827. u8 eeprom_version;
  828. u8 dev_addr[6];
  829. bool b_txpwr_fromeprom;
  830. u8 eeprom_tssi[2];
  831. u8 eeprom_pwrlimit_ht20[3];
  832. u8 eeprom_pwrlimit_ht40[3];
  833. u8 eeprom_chnlarea_txpwr_cck[2][3];
  834. u8 eeprom_chnlarea_txpwr_ht40_1s[2][3];
  835. u8 eeprom_chnlarea_txpwr_ht40_2sdiif[2][3];
  836. u8 txpwrlevel_cck[2][14];
  837. u8 txpwrlevel_ht40_1s[2][14]; /*For HT 40MHZ pwr */
  838. u8 txpwrlevel_ht40_2s[2][14]; /*For HT 40MHZ pwr */
  839. /*For power group */
  840. u8 pwrgroup_ht20[2][14];
  841. u8 pwrgroup_ht40[2][14];
  842. char txpwr_ht20diff[2][14]; /*HT 20<->40 Pwr diff */
  843. u8 txpwr_legacyhtdiff[2][14]; /*For HT<->legacy pwr diff */
  844. u8 eeprom_regulatory;
  845. u8 eeprom_thermalmeter;
  846. /*ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 */
  847. u8 thermalmeter[2];
  848. u8 legacy_ht_txpowerdiff; /*Legacy to HT rate power diff */
  849. bool b_apk_thermalmeterignore;
  850. };
  851. struct rtl_ps_ctl {
  852. bool set_rfpowerstate_inprogress;
  853. bool b_in_powersavemode;
  854. bool rfchange_inprogress;
  855. bool b_swrf_processing;
  856. bool b_hwradiooff;
  857. u32 last_sleep_jiffies;
  858. u32 last_awake_jiffies;
  859. u32 last_delaylps_stamp_jiffies;
  860. /*
  861. * just for PCIE ASPM
  862. * If it supports ASPM, Offset[560h] = 0x40,
  863. * otherwise Offset[560h] = 0x00.
  864. * */
  865. bool b_support_aspm;
  866. bool b_support_backdoor;
  867. /*for LPS */
  868. enum rt_psmode dot11_psmode; /*Power save mode configured. */
  869. bool b_leisure_ps;
  870. bool b_fwctrl_lps;
  871. u8 fwctrl_psmode;
  872. /*For Fw control LPS mode */
  873. u8 b_reg_fwctrl_lps;
  874. /*Record Fw PS mode status. */
  875. bool b_fw_current_inpsmode;
  876. u8 reg_max_lps_awakeintvl;
  877. bool report_linked;
  878. /*for IPS */
  879. bool b_inactiveps;
  880. u32 rfoff_reason;
  881. /*RF OFF Level */
  882. u32 cur_ps_level;
  883. u32 reg_rfps_level;
  884. /*just for PCIE ASPM */
  885. u8 const_amdpci_aspm;
  886. enum rf_pwrstate inactive_pwrstate;
  887. enum rf_pwrstate rfpwr_state; /*cur power state */
  888. };
  889. struct rtl_stats {
  890. u32 mac_time[2];
  891. s8 rssi;
  892. u8 signal;
  893. u8 noise;
  894. u16 rate; /*in 100 kbps */
  895. u8 received_channel;
  896. u8 control;
  897. u8 mask;
  898. u8 freq;
  899. u16 len;
  900. u64 tsf;
  901. u32 beacon_time;
  902. u8 nic_type;
  903. u16 length;
  904. u8 signalquality; /*in 0-100 index. */
  905. /*
  906. * Real power in dBm for this packet,
  907. * no beautification and aggregation.
  908. * */
  909. s32 recvsignalpower;
  910. s8 rxpower; /*in dBm Translate from PWdB */
  911. u8 signalstrength; /*in 0-100 index. */
  912. u16 b_hwerror:1;
  913. u16 b_crc:1;
  914. u16 b_icv:1;
  915. u16 b_shortpreamble:1;
  916. u16 antenna:1;
  917. u16 decrypted:1;
  918. u16 wakeup:1;
  919. u32 timestamp_low;
  920. u32 timestamp_high;
  921. u8 rx_drvinfo_size;
  922. u8 rx_bufshift;
  923. bool b_isampdu;
  924. bool rx_is40Mhzpacket;
  925. u32 rx_pwdb_all;
  926. u8 rx_mimo_signalstrength[4]; /*in 0~100 index */
  927. s8 rx_mimo_signalquality[2];
  928. bool b_packet_matchbssid;
  929. bool b_is_cck;
  930. bool b_packet_toself;
  931. bool b_packet_beacon; /*for rssi */
  932. char cck_adc_pwdb[4]; /*for rx path selection */
  933. };
  934. struct rt_link_detect {
  935. u32 num_tx_in4period[4];
  936. u32 num_rx_in4period[4];
  937. u32 num_tx_inperiod;
  938. u32 num_rx_inperiod;
  939. bool b_busytraffic;
  940. bool b_higher_busytraffic;
  941. bool b_higher_busyrxtraffic;
  942. };
  943. struct rtl_tcb_desc {
  944. u8 b_packet_bw:1;
  945. u8 b_multicast:1;
  946. u8 b_broadcast:1;
  947. u8 b_rts_stbc:1;
  948. u8 b_rts_enable:1;
  949. u8 b_cts_enable:1;
  950. u8 b_rts_use_shortpreamble:1;
  951. u8 b_rts_use_shortgi:1;
  952. u8 rts_sc:1;
  953. u8 b_rts_bw:1;
  954. u8 rts_rate;
  955. u8 use_shortgi:1;
  956. u8 use_shortpreamble:1;
  957. u8 use_driver_rate:1;
  958. u8 disable_ratefallback:1;
  959. u8 ratr_index;
  960. u8 mac_id;
  961. u8 hw_rate;
  962. };
  963. struct rtl_hal_ops {
  964. int (*init_sw_vars) (struct ieee80211_hw *hw);
  965. void (*deinit_sw_vars) (struct ieee80211_hw *hw);
  966. void (*read_chip_version)(struct ieee80211_hw *hw);
  967. void (*read_eeprom_info) (struct ieee80211_hw *hw);
  968. void (*interrupt_recognized) (struct ieee80211_hw *hw,
  969. u32 *p_inta, u32 *p_intb);
  970. int (*hw_init) (struct ieee80211_hw *hw);
  971. void (*hw_disable) (struct ieee80211_hw *hw);
  972. void (*enable_interrupt) (struct ieee80211_hw *hw);
  973. void (*disable_interrupt) (struct ieee80211_hw *hw);
  974. int (*set_network_type) (struct ieee80211_hw *hw,
  975. enum nl80211_iftype type);
  976. void (*set_bw_mode) (struct ieee80211_hw *hw,
  977. enum nl80211_channel_type ch_type);
  978. u8(*switch_channel) (struct ieee80211_hw *hw);
  979. void (*set_qos) (struct ieee80211_hw *hw, int aci);
  980. void (*set_bcn_reg) (struct ieee80211_hw *hw);
  981. void (*set_bcn_intv) (struct ieee80211_hw *hw);
  982. void (*update_interrupt_mask) (struct ieee80211_hw *hw,
  983. u32 add_msr, u32 rm_msr);
  984. void (*get_hw_reg) (struct ieee80211_hw *hw, u8 variable, u8 *val);
  985. void (*set_hw_reg) (struct ieee80211_hw *hw, u8 variable, u8 *val);
  986. void (*update_rate_table) (struct ieee80211_hw *hw);
  987. void (*update_rate_mask) (struct ieee80211_hw *hw, u8 rssi_level);
  988. void (*fill_tx_desc) (struct ieee80211_hw *hw,
  989. struct ieee80211_hdr *hdr, u8 *pdesc_tx,
  990. struct ieee80211_tx_info *info,
  991. struct sk_buff *skb, unsigned int queue_index);
  992. void (*fill_tx_cmddesc) (struct ieee80211_hw *hw, u8 *pdesc,
  993. bool b_firstseg, bool b_lastseg,
  994. struct sk_buff *skb);
  995. bool (*cmd_send_packet)(struct ieee80211_hw *hw, struct sk_buff *skb);
  996. bool(*query_rx_desc) (struct ieee80211_hw *hw,
  997. struct rtl_stats *stats,
  998. struct ieee80211_rx_status *rx_status,
  999. u8 *pdesc, struct sk_buff *skb);
  1000. void (*set_channel_access) (struct ieee80211_hw *hw);
  1001. bool(*radio_onoff_checking) (struct ieee80211_hw *hw, u8 *valid);
  1002. void (*dm_watchdog) (struct ieee80211_hw *hw);
  1003. void (*scan_operation_backup) (struct ieee80211_hw *hw, u8 operation);
  1004. bool(*set_rf_power_state) (struct ieee80211_hw *hw,
  1005. enum rf_pwrstate rfpwr_state);
  1006. void (*led_control) (struct ieee80211_hw *hw,
  1007. enum led_ctl_mode ledaction);
  1008. void (*set_desc) (u8 *pdesc, bool istx, u8 desc_name, u8 *val);
  1009. u32(*get_desc) (u8 *pdesc, bool istx, u8 desc_name);
  1010. void (*tx_polling) (struct ieee80211_hw *hw, unsigned int hw_queue);
  1011. void (*enable_hw_sec) (struct ieee80211_hw *hw);
  1012. void (*set_key) (struct ieee80211_hw *hw, u32 key_index,
  1013. u8 *p_macaddr, bool is_group, u8 enc_algo,
  1014. bool is_wepkey, bool clear_all);
  1015. void (*init_sw_leds) (struct ieee80211_hw *hw);
  1016. void (*deinit_sw_leds) (struct ieee80211_hw *hw);
  1017. u32(*get_bbreg) (struct ieee80211_hw *hw, u32 regaddr, u32 bitmask);
  1018. void (*set_bbreg) (struct ieee80211_hw *hw, u32 regaddr, u32 bitmask,
  1019. u32 data);
  1020. u32(*get_rfreg) (struct ieee80211_hw *hw, enum radio_path rfpath,
  1021. u32 regaddr, u32 bitmask);
  1022. void (*set_rfreg) (struct ieee80211_hw *hw, enum radio_path rfpath,
  1023. u32 regaddr, u32 bitmask, u32 data);
  1024. };
  1025. struct rtl_intf_ops {
  1026. /*com */
  1027. int (*adapter_start) (struct ieee80211_hw *hw);
  1028. void (*adapter_stop) (struct ieee80211_hw *hw);
  1029. int (*adapter_tx) (struct ieee80211_hw *hw, struct sk_buff *skb);
  1030. int (*reset_trx_ring) (struct ieee80211_hw *hw);
  1031. bool (*waitq_insert) (struct ieee80211_hw *hw, struct sk_buff *skb);
  1032. /*pci */
  1033. void (*disable_aspm) (struct ieee80211_hw *hw);
  1034. void (*enable_aspm) (struct ieee80211_hw *hw);
  1035. /*usb */
  1036. };
  1037. struct rtl_mod_params {
  1038. /* default: 0 = using hardware encryption */
  1039. int sw_crypto;
  1040. };
  1041. struct rtl_hal_usbint_cfg {
  1042. /* data - rx */
  1043. u32 in_ep_num;
  1044. u32 rx_urb_num;
  1045. u32 rx_max_size;
  1046. /* op - rx */
  1047. void (*usb_rx_hdl)(struct ieee80211_hw *, struct sk_buff *);
  1048. void (*usb_rx_segregate_hdl)(struct ieee80211_hw *, struct sk_buff *,
  1049. struct sk_buff_head *);
  1050. /* tx */
  1051. void (*usb_tx_cleanup)(struct ieee80211_hw *, struct sk_buff *);
  1052. int (*usb_tx_post_hdl)(struct ieee80211_hw *, struct urb *,
  1053. struct sk_buff *);
  1054. struct sk_buff *(*usb_tx_aggregate_hdl)(struct ieee80211_hw *,
  1055. struct sk_buff_head *);
  1056. /* endpoint mapping */
  1057. int (*usb_endpoint_mapping)(struct ieee80211_hw *hw);
  1058. u16 (*usb_mq_to_hwq)(u16 fc, u16 mac80211_queue_index);
  1059. };
  1060. struct rtl_hal_cfg {
  1061. char *name;
  1062. char *fw_name;
  1063. struct rtl_hal_ops *ops;
  1064. struct rtl_mod_params *mod_params;
  1065. struct rtl_hal_usbint_cfg *usb_interface_cfg;
  1066. /*this map used for some registers or vars
  1067. defined int HAL but used in MAIN */
  1068. u32 maps[RTL_VAR_MAP_MAX];
  1069. };
  1070. struct rtl_locks {
  1071. /* mutex */
  1072. struct mutex conf_mutex;
  1073. /*spin lock */
  1074. spinlock_t ips_lock;
  1075. spinlock_t irq_th_lock;
  1076. spinlock_t h2c_lock;
  1077. spinlock_t rf_ps_lock;
  1078. spinlock_t rf_lock;
  1079. spinlock_t lps_lock;
  1080. spinlock_t tx_urb_lock;
  1081. };
  1082. struct rtl_works {
  1083. struct ieee80211_hw *hw;
  1084. /*timer */
  1085. struct timer_list watchdog_timer;
  1086. /*task */
  1087. struct tasklet_struct irq_tasklet;
  1088. struct tasklet_struct irq_prepare_bcn_tasklet;
  1089. /*work queue */
  1090. struct workqueue_struct *rtl_wq;
  1091. struct delayed_work watchdog_wq;
  1092. struct delayed_work ips_nic_off_wq;
  1093. };
  1094. struct rtl_debug {
  1095. u32 dbgp_type[DBGP_TYPE_MAX];
  1096. u32 global_debuglevel;
  1097. u64 global_debugcomponents;
  1098. };
  1099. struct rtl_priv {
  1100. struct rtl_locks locks;
  1101. struct rtl_works works;
  1102. struct rtl_mac mac80211;
  1103. struct rtl_hal rtlhal;
  1104. struct rtl_regulatory regd;
  1105. struct rtl_rfkill rfkill;
  1106. struct rtl_io io;
  1107. struct rtl_phy phy;
  1108. struct rtl_dm dm;
  1109. struct rtl_security sec;
  1110. struct rtl_efuse efuse;
  1111. struct rtl_ps_ctl psc;
  1112. struct rate_adaptive ra;
  1113. struct wireless_stats stats;
  1114. struct rt_link_detect link_info;
  1115. struct false_alarm_statistics falsealm_cnt;
  1116. struct rtl_rate_priv *rate_priv;
  1117. struct rtl_debug dbg;
  1118. /*
  1119. *hal_cfg : for diff cards
  1120. *intf_ops : for diff interrface usb/pcie
  1121. */
  1122. struct rtl_hal_cfg *cfg;
  1123. struct rtl_intf_ops *intf_ops;
  1124. /*this var will be set by set_bit,
  1125. and was used to indicate status of
  1126. interface or hardware */
  1127. unsigned long status;
  1128. /*This must be the last item so
  1129. that it points to the data allocated
  1130. beyond this structure like:
  1131. rtl_pci_priv or rtl_usb_priv */
  1132. u8 priv[0];
  1133. };
  1134. #define rtl_priv(hw) (((struct rtl_priv *)(hw)->priv))
  1135. #define rtl_mac(rtlpriv) (&((rtlpriv)->mac80211))
  1136. #define rtl_hal(rtlpriv) (&((rtlpriv)->rtlhal))
  1137. #define rtl_efuse(rtlpriv) (&((rtlpriv)->efuse))
  1138. #define rtl_psc(rtlpriv) (&((rtlpriv)->psc))
  1139. /****************************************
  1140. mem access macro define start
  1141. Call endian free function when
  1142. 1. Read/write packet content.
  1143. 2. Before write integer to IO.
  1144. 3. After read integer from IO.
  1145. ****************************************/
  1146. /* Convert little data endian to host */
  1147. #define EF1BYTE(_val) \
  1148. ((u8)(_val))
  1149. #define EF2BYTE(_val) \
  1150. (le16_to_cpu(_val))
  1151. #define EF4BYTE(_val) \
  1152. (le32_to_cpu(_val))
  1153. /* Read data from memory */
  1154. #define READEF1BYTE(_ptr) \
  1155. EF1BYTE(*((u8 *)(_ptr)))
  1156. #define READEF2BYTE(_ptr) \
  1157. EF2BYTE(*((u16 *)(_ptr)))
  1158. #define READEF4BYTE(_ptr) \
  1159. EF4BYTE(*((u32 *)(_ptr)))
  1160. /* Write data to memory */
  1161. #define WRITEEF1BYTE(_ptr, _val) \
  1162. (*((u8 *)(_ptr))) = EF1BYTE(_val)
  1163. #define WRITEEF2BYTE(_ptr, _val) \
  1164. (*((u16 *)(_ptr))) = EF2BYTE(_val)
  1165. #define WRITEEF4BYTE(_ptr, _val) \
  1166. (*((u32 *)(_ptr))) = EF4BYTE(_val)
  1167. /*Example:
  1168. BIT_LEN_MASK_32(0) => 0x00000000
  1169. BIT_LEN_MASK_32(1) => 0x00000001
  1170. BIT_LEN_MASK_32(2) => 0x00000003
  1171. BIT_LEN_MASK_32(32) => 0xFFFFFFFF*/
  1172. #define BIT_LEN_MASK_32(__bitlen) \
  1173. (0xFFFFFFFF >> (32 - (__bitlen)))
  1174. #define BIT_LEN_MASK_16(__bitlen) \
  1175. (0xFFFF >> (16 - (__bitlen)))
  1176. #define BIT_LEN_MASK_8(__bitlen) \
  1177. (0xFF >> (8 - (__bitlen)))
  1178. /*Example:
  1179. BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
  1180. BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000*/
  1181. #define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen) \
  1182. (BIT_LEN_MASK_32(__bitlen) << (__bitoffset))
  1183. #define BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen) \
  1184. (BIT_LEN_MASK_16(__bitlen) << (__bitoffset))
  1185. #define BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen) \
  1186. (BIT_LEN_MASK_8(__bitlen) << (__bitoffset))
  1187. /*Description:
  1188. Return 4-byte value in host byte ordering from
  1189. 4-byte pointer in little-endian system.*/
  1190. #define LE_P4BYTE_TO_HOST_4BYTE(__pstart) \
  1191. (EF4BYTE(*((u32 *)(__pstart))))
  1192. #define LE_P2BYTE_TO_HOST_2BYTE(__pstart) \
  1193. (EF2BYTE(*((u16 *)(__pstart))))
  1194. #define LE_P1BYTE_TO_HOST_1BYTE(__pstart) \
  1195. (EF1BYTE(*((u8 *)(__pstart))))
  1196. /*Description:
  1197. Translate subfield (continuous bits in little-endian) of 4-byte
  1198. value to host byte ordering.*/
  1199. #define LE_BITS_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
  1200. ( \
  1201. (LE_P4BYTE_TO_HOST_4BYTE(__pstart) >> (__bitoffset)) & \
  1202. BIT_LEN_MASK_32(__bitlen) \
  1203. )
  1204. #define LE_BITS_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
  1205. ( \
  1206. (LE_P2BYTE_TO_HOST_2BYTE(__pstart) >> (__bitoffset)) & \
  1207. BIT_LEN_MASK_16(__bitlen) \
  1208. )
  1209. #define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
  1210. ( \
  1211. (LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \
  1212. BIT_LEN_MASK_8(__bitlen) \
  1213. )
  1214. /*Description:
  1215. Mask subfield (continuous bits in little-endian) of 4-byte value
  1216. and return the result in 4-byte value in host byte ordering.*/
  1217. #define LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
  1218. ( \
  1219. LE_P4BYTE_TO_HOST_4BYTE(__pstart) & \
  1220. (~BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen)) \
  1221. )
  1222. #define LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
  1223. ( \
  1224. LE_P2BYTE_TO_HOST_2BYTE(__pstart) & \
  1225. (~BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen)) \
  1226. )
  1227. #define LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
  1228. ( \
  1229. LE_P1BYTE_TO_HOST_1BYTE(__pstart) & \
  1230. (~BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen)) \
  1231. )
  1232. /*Description:
  1233. Set subfield of little-endian 4-byte value to specified value. */
  1234. #define SET_BITS_TO_LE_4BYTE(__pstart, __bitoffset, __bitlen, __val) \
  1235. *((u32 *)(__pstart)) = EF4BYTE \
  1236. ( \
  1237. LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) | \
  1238. ((((u32)__val) & BIT_LEN_MASK_32(__bitlen)) << (__bitoffset)) \
  1239. );
  1240. #define SET_BITS_TO_LE_2BYTE(__pstart, __bitoffset, __bitlen, __val) \
  1241. *((u16 *)(__pstart)) = EF2BYTE \
  1242. ( \
  1243. LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) | \
  1244. ((((u16)__val) & BIT_LEN_MASK_16(__bitlen)) << (__bitoffset)) \
  1245. );
  1246. #define SET_BITS_TO_LE_1BYTE(__pstart, __bitoffset, __bitlen, __val) \
  1247. *((u8 *)(__pstart)) = EF1BYTE \
  1248. ( \
  1249. LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) | \
  1250. ((((u8)__val) & BIT_LEN_MASK_8(__bitlen)) << (__bitoffset)) \
  1251. );
  1252. /****************************************
  1253. mem access macro define end
  1254. ****************************************/
  1255. #define packet_get_type(_packet) (EF1BYTE((_packet).octet[0]) & 0xFC)
  1256. #define RTL_WATCH_DOG_TIME 2000
  1257. #define MSECS(t) msecs_to_jiffies(t)
  1258. #define WLAN_FC_GET_VERS(fc) ((fc) & IEEE80211_FCTL_VERS)
  1259. #define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE)
  1260. #define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE)
  1261. #define WLAN_FC_MORE_DATA(fc) ((fc) & IEEE80211_FCTL_MOREDATA)
  1262. #define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
  1263. #define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
  1264. #define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4)
  1265. #define RT_RF_OFF_LEVL_ASPM BIT(0) /*PCI ASPM */
  1266. #define RT_RF_OFF_LEVL_CLK_REQ BIT(1) /*PCI clock request */
  1267. #define RT_RF_OFF_LEVL_PCI_D3 BIT(2) /*PCI D3 mode */
  1268. /*NIC halt, re-initialize hw parameters*/
  1269. #define RT_RF_OFF_LEVL_HALT_NIC BIT(3)
  1270. #define RT_RF_OFF_LEVL_FREE_FW BIT(4) /*FW free, re-download the FW */
  1271. #define RT_RF_OFF_LEVL_FW_32K BIT(5) /*FW in 32k */
  1272. /*Always enable ASPM and Clock Req in initialization.*/
  1273. #define RT_RF_PS_LEVEL_ALWAYS_ASPM BIT(6)
  1274. /*When LPS is on, disable 2R if no packet is received or transmittd.*/
  1275. #define RT_RF_LPS_DISALBE_2R BIT(30)
  1276. #define RT_RF_LPS_LEVEL_ASPM BIT(31) /*LPS with ASPM */
  1277. #define RT_IN_PS_LEVEL(ppsc, _ps_flg) \
  1278. ((ppsc->cur_ps_level & _ps_flg) ? true : false)
  1279. #define RT_CLEAR_PS_LEVEL(ppsc, _ps_flg) \
  1280. (ppsc->cur_ps_level &= (~(_ps_flg)))
  1281. #define RT_SET_PS_LEVEL(ppsc, _ps_flg) \
  1282. (ppsc->cur_ps_level |= _ps_flg)
  1283. #define container_of_dwork_rtl(x, y, z) \
  1284. container_of(container_of(x, struct delayed_work, work), y, z)
  1285. #define FILL_OCTET_STRING(_os, _octet, _len) \
  1286. (_os).octet = (u8 *)(_octet); \
  1287. (_os).length = (_len);
  1288. #define CP_MACADDR(des, src) \
  1289. memcpy((des), (src), ETH_ALEN)
  1290. static inline u8 rtl_read_byte(struct rtl_priv *rtlpriv, u32 addr)
  1291. {
  1292. return rtlpriv->io.read8_sync(rtlpriv, addr);
  1293. }
  1294. static inline u16 rtl_read_word(struct rtl_priv *rtlpriv, u32 addr)
  1295. {
  1296. return rtlpriv->io.read16_sync(rtlpriv, addr);
  1297. }
  1298. static inline u32 rtl_read_dword(struct rtl_priv *rtlpriv, u32 addr)
  1299. {
  1300. return rtlpriv->io.read32_sync(rtlpriv, addr);
  1301. }
  1302. static inline void rtl_write_byte(struct rtl_priv *rtlpriv, u32 addr, u8 val8)
  1303. {
  1304. rtlpriv->io.write8_async(rtlpriv, addr, val8);
  1305. }
  1306. static inline void rtl_write_word(struct rtl_priv *rtlpriv, u32 addr, u16 val16)
  1307. {
  1308. rtlpriv->io.write16_async(rtlpriv, addr, val16);
  1309. }
  1310. static inline void rtl_write_dword(struct rtl_priv *rtlpriv,
  1311. u32 addr, u32 val32)
  1312. {
  1313. rtlpriv->io.write32_async(rtlpriv, addr, val32);
  1314. }
  1315. static inline u32 rtl_get_bbreg(struct ieee80211_hw *hw,
  1316. u32 regaddr, u32 bitmask)
  1317. {
  1318. return ((struct rtl_priv *)(hw)->priv)->cfg->ops->get_bbreg(hw,
  1319. regaddr,
  1320. bitmask);
  1321. }
  1322. static inline void rtl_set_bbreg(struct ieee80211_hw *hw, u32 regaddr,
  1323. u32 bitmask, u32 data)
  1324. {
  1325. ((struct rtl_priv *)(hw)->priv)->cfg->ops->set_bbreg(hw,
  1326. regaddr, bitmask,
  1327. data);
  1328. }
  1329. static inline u32 rtl_get_rfreg(struct ieee80211_hw *hw,
  1330. enum radio_path rfpath, u32 regaddr,
  1331. u32 bitmask)
  1332. {
  1333. return ((struct rtl_priv *)(hw)->priv)->cfg->ops->get_rfreg(hw,
  1334. rfpath,
  1335. regaddr,
  1336. bitmask);
  1337. }
  1338. static inline void rtl_set_rfreg(struct ieee80211_hw *hw,
  1339. enum radio_path rfpath, u32 regaddr,
  1340. u32 bitmask, u32 data)
  1341. {
  1342. ((struct rtl_priv *)(hw)->priv)->cfg->ops->set_rfreg(hw,
  1343. rfpath, regaddr,
  1344. bitmask, data);
  1345. }
  1346. static inline bool is_hal_stop(struct rtl_hal *rtlhal)
  1347. {
  1348. return (_HAL_STATE_STOP == rtlhal->state);
  1349. }
  1350. static inline void set_hal_start(struct rtl_hal *rtlhal)
  1351. {
  1352. rtlhal->state = _HAL_STATE_START;
  1353. }
  1354. static inline void set_hal_stop(struct rtl_hal *rtlhal)
  1355. {
  1356. rtlhal->state = _HAL_STATE_STOP;
  1357. }
  1358. static inline u8 get_rf_type(struct rtl_phy *rtlphy)
  1359. {
  1360. return rtlphy->rf_type;
  1361. }
  1362. #endif