nic_rx.h 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/include/nic/nic_rx.h#1
  3. */
  4. /*! \file "nic_rx.h"
  5. \brief The declaration of the nic rx functions
  6. */
  7. /*
  8. ** Log: nic_rx.h
  9. **
  10. ** 07 30 2013 tsaiyuan.hsu
  11. ** [BORA00002222] MT6630 unified MAC RXM
  12. ** add defragmentation.
  13. **
  14. ** 07 23 2013 wh.su
  15. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  16. ** Sync the latest jb2.mp 11w code as draft version
  17. ** Not the CM bit for avoid wapi 1x drop at re-key
  18. **
  19. ** 04 30 2013 tsaiyuan.hsu
  20. ** [BORA00002222] MT6630 unified MAC RXM
  21. ** change the definition of rx descriptor, AMP, ASF and Data, to align spec.
  22. **
  23. ** 03 20 2013 tsaiyuan.hsu
  24. ** [BORA00002222] MT6630 unified MAC RXM
  25. ** add rx duplicate check.
  26. **
  27. ** 03 12 2013 tsaiyuan.hsu
  28. ** [BORA00002222] MT6630 unified MAC RXM
  29. ** remove hif_rx_hdr usage.
  30. **
  31. ** 03 12 2013 tsaiyuan.hsu
  32. ** [BORA00002222] MT6630 unified MAC RXM
  33. ** add rx data and management processing.
  34. **
  35. ** 03 07 2013 tsaiyuan.hsu
  36. ** [BORA00002222] MT6630 unified MAC RXM
  37. ** use rx_status to locate packet type instead of hif_rx_header.
  38. **
  39. ** 02 01 2013 cp.wu
  40. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  41. ** 1. eliminate MT5931/MT6620/MT6628 logic
  42. ** 2. add firmware download control sequence
  43. **
  44. ** 01 09 2013 tsaiyuan.hsu
  45. ** [BORA00002222] MT6630 unified MAC RXM
  46. ** add hw_mac_rx datatype and macro.
  47. **
  48. ** 09 17 2012 cm.chang
  49. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  50. ** Duplicate source from MT6620 v2.3 driver branch
  51. ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base)
  52. *
  53. * 11 07 2011 tsaiyuan.hsu
  54. * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
  55. * add debug counters and periodically dump counters for debugging.
  56. *
  57. * 05 05 2011 cp.wu
  58. * [WCXRP00000702] [MT5931][Driver] Modify initialization sequence for E1 ASIC
  59. * add delay after whole-chip resetting for MT5931 E1 ASIC.
  60. *
  61. * 04 18 2011 terry.wu
  62. * [WCXRP00000660] [MT6620 Wi-Fi][Driver] Remove flag CFG_WIFI_DIRECT_MOVED
  63. * Remove flag CFG_WIFI_DIRECT_MOVED.
  64. *
  65. * 01 24 2011 cm.chang
  66. * [WCXRP00000384] [MT6620 Wi-Fi][Driver][FW] Handle 20/40 action frame in AP mode
  67. * and stop ampdu timer when sta_rec is freed
  68. * Process received 20/40 coexistence action frame for AP mode
  69. *
  70. * 09 08 2010 cp.wu
  71. * NULL
  72. * use static memory pool for storing IEs of scanning result.
  73. *
  74. * 09 07 2010 yuche.tsai
  75. * NULL
  76. * Change prototype of API of adding P2P device to scan result.
  77. * Additional IE buffer is saved.
  78. *
  79. * 09 03 2010 kevin.huang
  80. * NULL
  81. * Refine #include sequence and solve recursive/nested #include issue
  82. *
  83. * 08 05 2010 yuche.tsai
  84. * NULL
  85. * Modify data structure for P2P Scan result.
  86. *
  87. * 08 03 2010 cp.wu
  88. * NULL
  89. * newly added P2P API should be declared in header file.
  90. *
  91. * 07 30 2010 cp.wu
  92. * NULL
  93. * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
  94. * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
  95. * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
  96. *
  97. * 07 08 2010 cp.wu
  98. *
  99. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  100. *
  101. * 06 14 2010 cp.wu
  102. * [WPD00003833][MT6620 and MT5931] Driver migration
  103. * saa_fsm.c is migrated.
  104. *
  105. * 06 14 2010 cp.wu
  106. * [WPD00003833][MT6620 and MT5931] Driver migration
  107. * add management dispatching function table.
  108. *
  109. * 06 11 2010 cp.wu
  110. * [WPD00003833][MT6620 and MT5931] Driver migration
  111. * 1) migrate assoc.c.
  112. * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
  113. * 3) add configuration options for CNM_MEM and RSN modules
  114. * 4) add data path for management frames
  115. * 5) eliminate rPacketInfo of MSDU_INFO_T
  116. *
  117. * 06 06 2010 kevin.huang
  118. * [WPD00003832][MT6620 5931] Create driver base
  119. * [MT6620 5931] Create driver base
  120. *
  121. * 03 30 2010 cp.wu
  122. * [WPD00001943]Create WiFi test driver framework on WinXP
  123. * remove driver-land statistics.
  124. *
  125. * 03 24 2010 cp.wu
  126. * [WPD00001943]Create WiFi test driver framework on WinXP
  127. * generate information for OID_GEN_RCV_OK & OID_GEN_XMIT_OK
  128. * *
  129. *
  130. * 03 11 2010 cp.wu
  131. * [WPD00003821][BUG] Host driver stops processing RX packets from HIF RX0
  132. * add RX starvation warning debug message controlled by CFG_HIF_RX_STARVATION_WARNING
  133. *
  134. * 03 10 2010 cp.wu
  135. * [WPD00001943]Create WiFi test driver framework on WinXP
  136. * code clean: removing unused variables and structure definitions
  137. *
  138. * 02 25 2010 cp.wu
  139. * [WPD00001943]Create WiFi test driver framework on WinXP
  140. * correct behavior to prevent duplicated RX handling for RX0_DONE and RX1_DONE
  141. *
  142. * 02 10 2010 cp.wu
  143. * [WPD00001943]Create WiFi test driver framework on WinXP
  144. * implement host-side firmware download logic
  145. *
  146. * 02 10 2010 cp.wu
  147. * [WPD00001943]Create WiFi test driver framework on WinXP
  148. * 1) remove unused function in nic_rx.c [which has been handled in que_mgt.c]
  149. * * 2) firmware image length is now retrieved via NdisFileOpen
  150. * * 3) firmware image is not structured by (P_IMG_SEC_HDR_T) anymore
  151. * * 4) nicRxWaitResponse() revised
  152. * * 5) another set of TQ counter default value is added for fw-download state
  153. * * 6) Wi-Fi load address is now retrieved from registry too
  154. *
  155. * 12 30 2009 cp.wu
  156. * [WPD00001943]Create WiFi test driver framework on WinXP
  157. * 1) According to CMD/EVENT documentation v0.8,
  158. * * * * OID_CUSTOM_TEST_RX_STATUS & OID_CUSTOM_TEST_TX_STATUS is no longer used,
  159. * * * * and result is retrieved by get ATInfo instead
  160. * * * * 2) add 4 counter for recording aggregation statistics
  161. ** \main\maintrunk.MT6620WiFiDriver_Prj\24 2009-12-10 16:49:09 GMT mtk02752
  162. ** code clean
  163. ** \main\maintrunk.MT6620WiFiDriver_Prj\23 2009-12-09 14:02:37 GMT MTK02468
  164. ** Added ucStaRecIdx in SW_RFB_T and HALF_SEQ_NO_COUNT definition (to replace HALF_SEQ_NO_CNOUT)
  165. ** \main\maintrunk.MT6620WiFiDriver_Prj\22 2009-11-27 11:07:54 GMT mtk02752
  166. ** add flush for reset
  167. ** \main\maintrunk.MT6620WiFiDriver_Prj\21 2009-11-25 18:18:09 GMT mtk02752
  168. ** modify nicRxAddScanResult()
  169. ** \main\maintrunk.MT6620WiFiDriver_Prj\20 2009-11-24 22:42:22 GMT mtk02752
  170. ** add nicRxAddScanResult() to prepare to handle SCAN_RESULT event
  171. ** \main\maintrunk.MT6620WiFiDriver_Prj\19 2009-11-24 19:57:06 GMT mtk02752
  172. ** adopt P_HIF_RX_HEADER_T
  173. ** \main\maintrunk.MT6620WiFiDriver_Prj\18 2009-11-16 21:43:04 GMT mtk02752
  174. ** correct ENUM_RX_PKT_DESTINATION_T definitions
  175. ** \main\maintrunk.MT6620WiFiDriver_Prj\17 2009-11-16 15:28:25 GMT mtk02752
  176. ** add ucQueuedPacketNum for indicating how many packet are queued by RX reordering buffer/forwarding path
  177. ** \main\maintrunk.MT6620WiFiDriver_Prj\16 2009-11-16 15:05:01 GMT mtk02752
  178. ** add eTC for SW_RFB_T and structure RX_MAILBOX
  179. ** \main\maintrunk.MT6620WiFiDriver_Prj\15 2009-11-13 21:16:57 GMT mtk02752
  180. ** \main\maintrunk.MT6620WiFiDriver_Prj\14 2009-11-13 16:59:30 GMT mtk02752
  181. ** add handler for event packet
  182. ** \main\maintrunk.MT6620WiFiDriver_Prj\13 2009-11-13 13:45:50 GMT mtk02752
  183. ** add port param for nicRxEnhanceReadBuffer()
  184. ** \main\maintrunk.MT6620WiFiDriver_Prj\12 2009-11-11 10:12:31 GMT mtk02752
  185. ** nicSDIOReadIntStatus() always read sizeof(ENHANCE_MODE_DATA_STRUCT_T) for int response,
  186. ** thus the number should be set to 0(:=16) instead of 10
  187. ** \main\maintrunk.MT6620WiFiDriver_Prj\11 2009-10-29 19:53:32 GMT mtk01084
  188. ** modify structure naming
  189. ** \main\maintrunk.MT6620WiFiDriver_Prj\10 2009-10-23 16:08:23 GMT mtk01084
  190. ** \main\maintrunk.MT6620WiFiDriver_Prj\9 2009-10-13 21:59:01 GMT mtk01084
  191. ** update for new HW architecture design
  192. ** \main\maintrunk.MT6620WiFiDriver_Prj\8 2009-05-20 12:23:33 GMT mtk01461
  193. ** Add u4MaxEventBufferLen parameter to nicRxWaitResponse()
  194. ** \main\maintrunk.MT6620WiFiDriver_Prj\7 2009-05-18 21:00:48 GMT mtk01426
  195. ** Update SDIO_MAXIMUM_RX_STATUS value
  196. ** \main\maintrunk.MT6620WiFiDriver_Prj\6 2009-04-28 10:36:15 GMT mtk01461
  197. ** Remove unused define - SDIO_MAXIMUM_TX_STATUS
  198. ** \main\maintrunk.MT6620WiFiDriver_Prj\5 2009-04-01 10:53:17 GMT mtk01461
  199. ** Add function for HIF_LOOPBACK_PRE_TEST
  200. ** \main\maintrunk.MT6620WiFiDriver_Prj\4 2009-03-18 20:56:19 GMT mtk01426
  201. ** Add to support CFG_HIF_LOOPBACK and CFG_SDIO_RX_ENHANCE
  202. ** \main\maintrunk.MT6620WiFiDriver_Prj\3 2009-03-17 20:19:56 GMT mtk01426
  203. ** Add nicRxWaitResponse function proto type
  204. ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-03-10 20:16:35 GMT mtk01426
  205. ** Init for develop
  206. **
  207. */
  208. #ifndef _NIC_RX_H
  209. #define _NIC_RX_H
  210. /*******************************************************************************
  211. * C O M P I L E R F L A G S
  212. ********************************************************************************
  213. */
  214. /*******************************************************************************
  215. * E X T E R N A L R E F E R E N C E S
  216. ********************************************************************************
  217. */
  218. /*******************************************************************************
  219. * C O N S T A N T S
  220. ********************************************************************************
  221. */
  222. #define MAX_SEQ_NO 4095
  223. #define MAX_SEQ_NO_COUNT 4096
  224. #define HALF_SEQ_NO_CNOUT 2048
  225. #define HALF_SEQ_NO_COUNT 2048
  226. #define MT6620_FIXED_WIN_SIZE 64
  227. #define CFG_RX_MAX_BA_ENTRY 4
  228. #define CFG_RX_MAX_BA_TID_NUM 8
  229. #define RX_STATUS_FLAG_MORE_PACKET BIT(30)
  230. #define RX_STATUS_CHKSUM_MASK BITS(0, 10)
  231. #define RX_RFB_LEN_FIELD_LEN 4
  232. #define RX_HEADER_OFFSET 2
  233. #define RX_RETURN_INDICATED_RFB_TIMEOUT_SEC 3
  234. #if defined(_HIF_SDIO) && defined(WINDOWS_DDK)
  235. /*! On XP, maximum Tx+Rx Statue <= 64-4(HISR)*/
  236. #define SDIO_MAXIMUM_RX_LEN_NUM 0 /*!< 0~15 (0: un-limited) */
  237. #else
  238. #define SDIO_MAXIMUM_RX_LEN_NUM 0 /*!< 0~15 (0: un-limited) */
  239. #endif
  240. /* RXM Definitions */
  241. /* The payload format of a RX packet */
  242. #define RX_PAYLOAD_FORMAT_MSDU 0
  243. #define RX_PAYLOAD_FORMAT_FIRST_SUB_AMSDU 3
  244. #define RX_PAYLOAD_FORMAT_MIDDLE_SUB_AMSDU 2
  245. #define RX_PAYLOAD_FORMAT_LAST_SUB_AMSDU 1
  246. /* HAL RX from hal_hw_def_rom.h */
  247. /*------------------------------------------------------------------------------
  248. * Cipher define
  249. *------------------------------------------------------------------------------
  250. */
  251. #define CIPHER_SUITE_NONE 0
  252. #define CIPHER_SUITE_WEP40 1
  253. #define CIPHER_SUITE_TKIP 2
  254. #define CIPHER_SUITE_TKIP_WO_MIC 3
  255. #define CIPHER_SUITE_CCMP 4
  256. #define CIPHER_SUITE_WEP104 5
  257. #define CIPHER_SUITE_BIP 6
  258. #define CIPHER_SUITE_WEP128 7
  259. #define CIPHER_SUITE_WPI 8
  260. #define CIPHER_SUITE_CCMP_W_CCX 9
  261. #define CIPHER_SUITE_GCMP 10
  262. /*------------------------------------------------------------------------------
  263. * Bit fields for HW_MAC_RX_DESC_T
  264. *------------------------------------------------------------------------------
  265. */
  266. /*! MAC RX DMA Descriptor */
  267. /* DW 0*/
  268. /* Word 0 */
  269. #define RX_STATUS_RX_BYTE_COUNT_MASK BITS(0, 16)
  270. /* Word 1 */
  271. #define RX_STATUS_ETH_TYPE_OFFSET_MASK BITS(0, 6)
  272. #define RX_STATUS_ETH_TYPE_OFFSET 0
  273. #define RX_STATUS_IP_CHKSUM BIT(7)
  274. #define RX_STATUS_UDP_TCP_CHKSUM BIT(8)
  275. #define RX_STATUS_GROUP_VLD_MASK BITS(9, 12)
  276. #define RX_STATUS_GROUP_VLD_OFFSET 9
  277. #define RX_STATUS_PKT_TYPE_MASK BITS(13, 15)
  278. #define RX_STATUS_PKT_TYPE_OFFSET 13
  279. /* DW 1 */
  280. /* Byte 0 */
  281. #define RX_STATUS_HTC BIT(0)
  282. #define RX_STATUS_UC2ME BIT(1)
  283. #define RX_STATUS_MC_FRAME BIT(2)
  284. #define RX_STATUS_BC_FRAME BIT(3)
  285. #define RX_STATUS_BCN_WITH_BMC BIT(4)
  286. #define RX_STATUS_BCN_WITH_UC BIT(5)
  287. #define RX_STATUS_KEYID_MASK BITS(6, 7)
  288. #define RX_STATUS_KEYID_OFFSET 6
  289. /* Byte 1 */
  290. #define RX_STATUS_CHAN_FREQ_MASK BITS(0, 7)
  291. /* Byte 2 */
  292. #define RX_STATUS_HEADER_LEN_MASK BITS(0, 5)
  293. #define RX_STATUS_HEADER_OFFSET BIT(6)
  294. #define RX_STATUS_HEADER_TRAN BIT(7)
  295. /* Byte 3 */
  296. #define RX_STATUS_PAYLOAD_FORMAT_MASK BITS(0, 1)
  297. #define RX_STATUS_PAYLOAD_FORMAT_OFFSET 0
  298. #define RX_STATUS_BSSID_MASK BITS(2, 7)
  299. #define RX_STATUS_BSSID_OFFSET 2
  300. /* DW 2 */
  301. /* Byte 1 */
  302. #define RX_STATUS_TID_MASK BITS(0, 3)
  303. #define RX_STATUS_SEC_MASK BITS(4, 7)
  304. #define RX_STATUS_SEC_OFFSET 4
  305. /* Byte 2-3 */
  306. #define RX_STATUS_SW_BIT BIT(0)
  307. #define RX_STATUS_FLAG_FCS_ERROR BIT(1)
  308. #define RX_STATUS_FLAG_CIPHER_MISMATCH BIT(2)
  309. #define RX_STATUS_FLAG_CIPHER_LENGTH_MISMATCH BIT(3)
  310. #define RX_STATUS_FLAG_ICV_ERROR BIT(4)
  311. #define RX_STATUS_FLAG_TKIPMIC_ERROR BIT(5)
  312. #define RX_STATUS_FLAG_LEN_MISMATCH BIT(6)
  313. #define RX_STATUS_FLAG_DE_AMSDU_FAIL BIT(7)
  314. #define RX_STATUS_FLAG_EXCEED_LEN BIT(8)
  315. #define RX_STATUS_LLC_MIS BIT(9)
  316. #define RX_STATUS_UDF_VLT BIT(10)
  317. #define RX_STATUS_FRAG BIT(11)
  318. #define RX_STATUS_NULL BIT(12)
  319. #define RX_STATUS_DATA BIT(13)
  320. #define RX_STATUS_AMPDU_SUB_FRAME BIT(14)
  321. #define RX_STATUS_AMPDU_FORMAT BIT(15)
  322. #define PAYLOAD_FORMAT_IS_MSDU_FRAME 0
  323. #define RX_STATUS_FLAG_ERROR_MASK (RX_STATUS_FLAG_FCS_ERROR | RX_STATUS_FLAG_ICV_ERROR | \
  324. RX_STATUS_FLAG_CIPHER_LENGTH_MISMATCH) /* No TKIP MIC error */
  325. /* DW 3 */
  326. #define RX_STATUS_RXV_SEQ_NO_MASK BITS(0, 7)
  327. #define RX_STATUS_TCL BIT(8)
  328. #define RX_STATUS_CLS BIT(11)
  329. #define RX_STATUS_OFLD_MASK BITS(12, 13)
  330. #define RX_STATUS_OFLD_OFFSET 12
  331. #define RX_STATUS_EAPOL_PACKET BIT(12)
  332. #define RX_STATUS_ARP_NS_PACKET BIT(13)
  333. #define RX_STATUS_TDLS_PACKET BITS(12, 13)
  334. #define RX_STATUS_MGC BIT(14)
  335. #define RX_STATUS_WOL_MASK BITS(15, 19)
  336. #define RX_STATUS_WOL_OFFSET 15
  337. #define RX_STATUS_CLS_BITMAP_MASK BITS(20, 29)
  338. #define RX_STATUS_CLS_BITMAP_OFFSET 20
  339. #define RX_STATUS_PF_MODE_BLACK_LIST BIT(30)
  340. #define RX_STATUS_PF_STS_CHECKED BIT(31)
  341. /* DW 12 */
  342. #define RX_STATUS_FRAG_NUM_MASK BITS(0, 3)
  343. #define RX_STATUS_SEQ_NUM_MASK BITS(4, 15)
  344. #define RX_STATUS_SEQ_NUM_OFFSET 4
  345. #define RX_STATUS_GROUP1_VALID BIT(0)
  346. #define RX_STATUS_GROUP2_VALID BIT(1)
  347. #define RX_STATUS_GROUP3_VALID BIT(2)
  348. #define RX_STATUS_GROUP4_VALID BIT(3)
  349. #define RX_STATUS_FIXED_LEN 16
  350. #define RX_STATUS_CHAN_FREQ_MASK_FOR_BY_PASS_MPDE BITS(0, 7)
  351. #define RX_STATUS_FLAG_FCS_ERROR_FOR_BY_PASS_MODE BIT(16)
  352. /* Timing Measurement Report */
  353. /* DW0 Word 1 */
  354. #define RX_TMR_TOA_VALID BIT(11)
  355. #define RX_TMR_TOD_VALID BIT(10)
  356. #define RX_TMR_TYPE_MASK BITS(8, 9)
  357. #define RX_TMR_TYPE_OFFSET 8
  358. #define RX_TMR_SUBTYPE_MASK BITS(4, 7)
  359. #define RX_TMR_SUBTYPE_OFFSET 4
  360. /* DW0 Byte 1*/
  361. #define RX_TMR_TM_FAILED BIT(2)
  362. #define RX_TMR_NOISY_CHAN BIT(1)
  363. #define RX_TMR_RESPONDER BIT(0)
  364. /* TBD */
  365. #define DMA_OWN_TO_HW BIT(0)
  366. #define DMA_OWN_TO_FW_PENDING BIT(1)
  367. #define STATUS_IS_OWN_TO_FW(flag) (((flag) & DMA_OWN_TO_HW) ? FALSE : TRUE)
  368. #define STATUS_IS_FW_PENDING(flag) (((flag) & DMA_OWN_TO_FW_PENDING) ? TRUE : FALSE)
  369. /* DW 2 */
  370. #define RX_STATUS_PACKET_LENGTH_MASK BITS(0, 16)
  371. #define RX_STATUS_HEADER_TRAN_MASK BIT(7)
  372. #define RX_STATUS_HEADER_TRAN_OFFSET 7
  373. #define RX_STATUS_HEADER_TRAN_BSS0_MASK BIT(6)
  374. #define RX_STATUS_HEADER_TRAN_BSS0_OFFSET 6
  375. #define RX_STATUS_HEADER_TRAN_BSS1_MASK BIT(7)
  376. #define RX_STATUS_HEADER_TRAN_BSS1_OFFSET 7
  377. /* DW 4 */
  378. #define RX_STATUS_MATCH_PACKET BIT(4)
  379. #define RX_STATUS_HEADER_OFFSET_MASK 0xC0
  380. #define RX_STATUS_HEADER_OFFSET_OFFSET 6
  381. /*------------------------------------------------------------------------------
  382. * Bit fields for HW_RX_VECTOR_DESC_T
  383. *------------------------------------------------------------------------------
  384. */
  385. /* DW 2 */
  386. #define RX_VECTOR_FOR_BA_ACK BIT(7)
  387. /*! HIF RX DMA Descriptor */
  388. /* DW 2 */
  389. #define HIF_RX_DESC_BUFFER_LEN BITS(0, 15)
  390. #define HIF_RX_DESC_ETHER_TYPE_OFFSET_MASK BITS(16, 23)
  391. #define HIF_RX_DESC_ETHER_TYPE_OFFSET_OFFSET 16
  392. #define HIF_RX_DESC_IP_CHKSUM_CHECK BIT(24)
  393. #define HIF_RX_DESC_TCP_UDP_CHKSUM_CHECK BIT(25)
  394. #define HIF_RX_DATA_QUEUE 0
  395. #define HIF_RX_EVENT_QUEUE 1
  396. /*------------------------------------------------------------------------------
  397. * Bit fields for PHY Vector
  398. *------------------------------------------------------------------------------
  399. */
  400. /* RX Vector, 1st Cycle */
  401. #define RX_VT_RX_RATE_AC_MASK BITS(0, 3)
  402. #define RX_VT_RX_RATE_MASK BITS(0, 6)
  403. #define RX_VT_RX_RATE_OFFSET 0
  404. #define RX_VT_STBC_MASK BITS(7, 8)
  405. #define RX_VT_STBC_OFFSET 7
  406. #define RX_VT_LDPC BIT(9)
  407. #define RX_VT_NESS_MASK BITS(10, 11)
  408. #define RX_VT_NESS_OFFSET 10
  409. #define RX_VT_RX_MODE_MASK BITS(12, 14)
  410. #define RX_VT_RX_MODE_OFFSET 12
  411. #define RX_VT_RX_MODE_VHT BIT(14)
  412. #define RX_VT_FR_MODE_MASK BITS(15, 16)
  413. #define RX_VT_FR_MODE_OFFSET 15
  414. #define RX_VT_TXOP_PS_NOT_ALLOWED BIT(17)
  415. #define RX_VT_AGGREGATION BIT(18)
  416. #define RX_VT_SHORT_GI BIT(19)
  417. #define RX_VT_SMOOTH BIT(20)
  418. #define RX_VT_NO_SOUNDING BIT(21)
  419. #define RX_VT_SOUNDING BIT(21)
  420. #define RX_VT_SHORT_GI_NSYM BIT(22)
  421. #define RX_VT_CODING_MASK BITS(23, 24)
  422. #define RX_VT_CODING_OFFSET 23
  423. #define RX_VT_BEAMFORMED BIT(29)
  424. #define RX_VT_GROUPID_0_MASK BITS(30, 31)
  425. #define RX_VT_GROUPID_0_OFFSET 30
  426. #define RX_VT_RX_RATE_1M 0x0
  427. #define RX_VT_RX_RATE_2M 0x1
  428. #define RX_VT_RX_RATE_5M 0x2
  429. #define RX_VT_RX_RATE_11M 0x3
  430. #define RX_VT_RX_RATE_6M 0xB
  431. #define RX_VT_RX_RATE_9M 0xF
  432. #define RX_VT_RX_RATE_12M 0xA
  433. #define RX_VT_RX_RATE_18M 0xE
  434. #define RX_VT_RX_RATE_24M 0x9
  435. #define RX_VT_RX_RATE_36M 0xD
  436. #define RX_VT_RX_RATE_48M 0x8
  437. #define RX_VT_RX_RATE_54M 0xC
  438. #define RX_VT_RX_RATE_MCS0 0
  439. #define RX_VT_RX_RATE_MCS1 1
  440. #define RX_VT_RX_RATE_MCS2 2
  441. #define RX_VT_RX_RATE_MCS3 3
  442. #define RX_VT_RX_RATE_MCS4 4
  443. #define RX_VT_RX_RATE_MCS5 5
  444. #define RX_VT_RX_RATE_MCS6 6
  445. #define RX_VT_RX_RATE_MCS7 7
  446. #define RX_VT_RX_RATE_MCS32 32
  447. #define RX_VT_LEGACY_CCK 0
  448. #define RX_VT_LEGACY_OFDM 1
  449. #define RX_VT_MIXED_MODE 2
  450. #define RX_VT_GREEN_MODE 3
  451. #define RX_VT_VHT_MODE 4
  452. #define RX_VT_LG20_HT20 0
  453. #define RX_VT_DL40_HT40 1
  454. #define RX_VT_U20 2
  455. #define RX_VT_L20 3
  456. #define RX_VT_FR_MODE_20 0
  457. #define RX_VT_FR_MODE_40 1
  458. #define RX_VT_FR_MODE_80 2
  459. #define RX_VT_FR_MODE_160 3
  460. #define RX_VT_CCK_SHORT_PREAMBLE BIT(2)
  461. /* RX Vector, 2nd Cycle */
  462. #define RX_VT_RX_LEN_HT_MASK BITS(0, 15)
  463. #define RX_VT_RX_LEN_LEACY_MASK BITS(0, 11)
  464. #define RX_VT_RX_LEN_VHT_MASK BITS(0, 20)
  465. #define RX_VT_GROUPID_1_MASK BITS(21, 24)
  466. #define RX_VT_GROUPID_1_OFFSET 21
  467. #define RX_VT_NSTS_MASK BITS(25, 27)
  468. #define RX_VT_NSTS_OFFSET 25
  469. #define RX_VT_AID_0_MASK BITS(28, 31)
  470. #define RX_VT_AID_0_OFFSET 28
  471. /* RX Vector, 3rd Cycle */
  472. #define RX_VT_AID_1_MASK BITS(0, 4)
  473. #define RX_VT_AID_1_OFFSET 0
  474. #define RX_VT_SEL_ANT BIT(7)
  475. #define RX_VT_RCPI_MASK BITS(8, 15)
  476. #define RX_VT_RCPI_OFFSET 8
  477. #define RX_VT_OFDM_FREQ_TRANS_DET BIT(5)
  478. #define RX_VT_FAGC0_EQ_CAL BIT(16)
  479. /* RX Vector, 4th Cycle */
  480. #define RX_VT_IB_RSSI_MASK BITS(0, 7)
  481. #define RX_VT_WB_RSSI_MASK BITS(8, 15)
  482. #define RX_VT_WB_RSSI_OFFSET 8
  483. /* RX Vector, 6th Cycle */
  484. #define RX_VT_NF0_MASK BITS(0, 7)
  485. #define RX_VT_NF0_OFFSET 0
  486. /* RX Vector Group 2, the 1st cycle */
  487. #define RX_VT_CCK_LQ BITS(4, 10)
  488. #define RX_VT_OFDM_LQ_BPSK BITS(4, 9)
  489. #define RX_VT_LQ_OFFSET 4
  490. #define RX_VT_PRIM_ITFR_ENV BIT(0)
  491. #define RX_VT_SEC_ITFR_ENV BIT(1)
  492. #define RX_VT_SEC40_ITFR_ENV BIT(2)
  493. /* RX Vector Group 2, the 2nd cycle */
  494. #define RX_VT_DYNA_BW_IN_NON_HT_DYNA BIT(29)
  495. #define RX_VT_CH_BW_IN_NON_HT_CBW40 BIT(30)
  496. #define RX_VT_CH_BW_IN_NON_HT_CBW80 BIT(31)
  497. #define RX_VT_CH_BW_IN_NON_HT_CBW160 BITS(30, 31)
  498. /* RX Data Type */
  499. #define RX_DATA_TYPE_RX_VECTOR 0
  500. #define RX_DATA_TYPE_RX_DATA 1
  501. #define RX_DATA_TYPE_RX_EVM 2
  502. #define RX_DATA_TYPE_RX_AMBI 3
  503. #define RX_DATA_TYPE_RX_BT 4
  504. /*******************************************************************************
  505. * D A T A T Y P E S
  506. ********************************************************************************
  507. */
  508. typedef enum _ENUM_RX_STATISTIC_COUNTER_T {
  509. RX_MPDU_TOTAL_COUNT = 0,
  510. RX_SIZE_ERR_DROP_COUNT,
  511. RX_DATA_INDICATION_COUNT,
  512. RX_DATA_RETURNED_COUNT,
  513. RX_DATA_RETAINED_COUNT,
  514. RX_DROP_TOTAL_COUNT,
  515. RX_TYPE_ERR_DROP_COUNT,
  516. RX_CLASS_ERR_DROP_COUNT,
  517. RX_DST_NULL_DROP_COUNT,
  518. #if CFG_TCP_IP_CHKSUM_OFFLOAD || CFG_TCP_IP_CHKSUM_OFFLOAD_NDIS_60
  519. RX_CSUM_TCP_FAILED_COUNT,
  520. RX_CSUM_UDP_FAILED_COUNT,
  521. RX_CSUM_IP_FAILED_COUNT,
  522. RX_CSUM_TCP_SUCCESS_COUNT,
  523. RX_CSUM_UDP_SUCCESS_COUNT,
  524. RX_CSUM_IP_SUCCESS_COUNT,
  525. RX_CSUM_UNKNOWN_L4_PKT_COUNT,
  526. RX_CSUM_UNKNOWN_L3_PKT_COUNT,
  527. RX_IP_V6_PKT_CCOUNT,
  528. #endif
  529. RX_STATISTIC_COUNTER_NUM
  530. } ENUM_RX_STATISTIC_COUNTER_T;
  531. typedef enum _ENUM_RX_PKT_DESTINATION_T {
  532. RX_PKT_DESTINATION_HOST, /* to OS */
  533. RX_PKT_DESTINATION_FORWARD, /* to TX queue for forward, AP mode */
  534. RX_PKT_DESTINATION_HOST_WITH_FORWARD, /* to both TX and OS, AP mode broadcast packet */
  535. RX_PKT_DESTINATION_NULL, /* packet to be freed */
  536. RX_PKT_DESTINATION_NUM
  537. } ENUM_RX_PKT_DESTINATION_T;
  538. /* Used for MAC RX */
  539. typedef enum _ENUM_MAC_RX_PKT_TYPE_T {
  540. RX_PKT_TYPE_TX_STATUS = 0,
  541. RX_PKT_TYPE_RX_VECTOR,
  542. RX_PKT_TYPE_RX_DATA,
  543. RX_PKT_TYPE_DUP_RFB,
  544. RX_PKT_TYPE_TM_REPORT,
  545. RX_PKT_TYPE_SW_DEFINED = 7
  546. } ENUM_MAC_RX_PKT_TYPE_T;
  547. typedef enum _ENUM_MAC_RX_GROUP_VLD_T {
  548. RX_GROUP_VLD_1 = 0,
  549. RX_GROUP_VLD_2,
  550. RX_GROUP_VLD_3,
  551. RX_GROUP_VLD_4,
  552. RX_GROUP_VLD_NUM
  553. } ENUM_MAC_RX_GROUP_VLD_T;
  554. typedef enum _ENUM_MAC_GI_INFO_T {
  555. MAC_GI_NORMAL = 0,
  556. MAC_GI_SHORT
  557. } ENUM_MAC_GI_INFO_T, *P_ENUM_MAC_GI_INFO_T;
  558. #define RXM_RXD_PKT_TYPE_SW_BITMAP 0xE00F
  559. #define RXM_RXD_PKT_TYPE_SW_EVENT 0xE000
  560. #define RXM_RXD_PKT_TYPE_SW_FRAME 0xE001
  561. /* AMPDU data frame with no errors including FC/FM/I/T/LM/DAF/EL/LLC-MIS/ UDFVLT and Class 3 error */
  562. #define RXS_DW2_AMPDU_nERR_BITMAP 0xFFFF
  563. #define RXS_DW2_AMPDU_nERR_VALUE 0x0000
  564. /* no error including FC/FM/I/T/LM/DAF/EL/LLC-MIS/ UDFVLT */
  565. #define RXS_DW2_RX_nERR_BITMAP 0x07FC
  566. #define RXS_DW2_RX_nERR_VALUE 0x0000
  567. /* Non-Data frames */
  568. #define RXS_DW2_RX_nDATA_BITMAP 0x3000
  569. #define RXS_DW2_RX_nDATA_VALUE 0x2000
  570. /* Claas Error */
  571. #define RXS_DW2_RX_CLASSERR_BITMAP 0x0001
  572. #define RXS_DW2_RX_CLASSERR_VALUE 0x0001
  573. /* Fragmentation */
  574. #define RXS_DW2_RX_FRAG_BITMAP 0x3800
  575. #define RXS_DW2_RX_FRAG_VALUE 0x0800
  576. /*******************************************************************************
  577. * P U B L I C D A T A
  578. ********************************************************************************
  579. */
  580. /*! A data structure which is identical with MAC RX DMA Descriptor */
  581. typedef struct _HW_MAC_RX_DESC_T {
  582. UINT_16 u2RxByteCount; /* DW 0 */
  583. UINT_16 u2PktTYpe;
  584. UINT_8 ucMatchPacket; /* DW 1 */
  585. UINT_8 ucChanFreq;
  586. UINT_8 ucHeaderLen;
  587. UINT_8 ucBssid;
  588. UINT_8 ucWlanIdx; /* DW 2 */
  589. UINT_8 ucTidSecMode;
  590. UINT_16 u2StatusFlag;
  591. UINT_32 u4PatternFilterInfo; /* DW 3 */
  592. } HW_MAC_RX_DESC_T, *P_HW_MAC_RX_DESC_T;
  593. typedef struct _HW_MAC_RX_STS_GROUP_1_T {
  594. UINT_8 aucPN[16];
  595. } HW_MAC_RX_STS_GROUP_1_T, *P_HW_MAC_RX_STS_GROUP_1_T;
  596. typedef struct _HW_MAC_RX_STS_GROUP_2_T {
  597. UINT_32 u4Timestamp; /* DW 12 */
  598. UINT_32 u4CRC; /* DW 13 */
  599. } HW_MAC_RX_STS_GROUP_2_T, *P_HW_MAC_RX_STS_GROUP_2_T;
  600. typedef struct _HW_MAC_RX_STS_GROUP_4_T {
  601. /* For HDR_TRAN */
  602. UINT_16 u2FrameCtl; /* DW 4 */
  603. UINT_8 aucTA[6]; /* DW 4~5 */
  604. UINT_16 u2SeqFrag; /* DW 6 */
  605. UINT_16 u2Qos; /* DW 6 */
  606. UINT_32 u4HTC; /* DW 7 */
  607. } HW_MAC_RX_STS_GROUP_4_T, *P_HW_MAC_RX_STS_GROUP_4_T;
  608. typedef struct _HW_MAC_RX_STS_GROUP_3_T {
  609. /*! RX Vector Info */
  610. UINT_32 u4RxVector[6]; /* DW 14~19 */
  611. } HW_MAC_RX_STS_GROUP_3_T, *P_HW_MAC_RX_STS_GROUP_3_T;
  612. typedef struct _HW_MAC_RX_TMRI_PKT_FORMAT_T {
  613. UINT_8 ucPID;
  614. UINT_8 ucStatus;
  615. UINT_16 u2PktTYpe;
  616. UINT_32 u4Reserved[2];
  617. UINT_32 u4ToA;
  618. UINT_32 u4ToD;
  619. } HW_MAC_RX_TMRI_PKT_FORMAT_T, *P_HW_MAC_RX_TMRI_PKT_FORMAT_T;
  620. typedef struct _HW_MAC_RX_TMRR_PKT_FORMAT_T {
  621. UINT_8 ucVtSeq;
  622. UINT_8 ucStatus;
  623. UINT_16 u2PktTYpe;
  624. UINT_8 aucTALow[2];
  625. UINT_16 u2SnField;
  626. UINT_8 aucTAHigh[4];
  627. UINT_32 u4ToA;
  628. UINT_32 u4ToD;
  629. } HW_MAC_RX_TMRR_PKT_FORMAT_T, *P_HW_MAC_RX_TMRR_PKT_FORMAT_T;
  630. /*! A data structure which is identical with MAC RX Vector DMA Descriptor */
  631. typedef struct _HW_RX_VECTOR_DESC_T {
  632. UINT_8 aucTA[6]; /* DW 0~1 */
  633. UINT_8 ucRxVtSeqNo;
  634. /*! RX Vector Info */
  635. UINT_32 u4RxVector[9]; /* DW 2~10 */
  636. } HW_RX_VECTOR_DESC_T, *P_HW_RX_VECTOR_DESC_T;
  637. struct _SW_RFB_T {
  638. QUE_ENTRY_T rQueEntry;
  639. PVOID pvPacket; /*!< ptr to rx Packet Descriptor */
  640. PUINT_8 pucRecvBuff; /*!< ptr to receive data buffer */
  641. /* add fot mt6630 */
  642. UINT_8 ucGroupVLD;
  643. UINT_16 u2RxStatusOffst;
  644. P_HW_MAC_RX_DESC_T prRxStatus;
  645. P_HW_MAC_RX_STS_GROUP_1_T prRxStatusGroup1;
  646. P_HW_MAC_RX_STS_GROUP_2_T prRxStatusGroup2;
  647. P_HW_MAC_RX_STS_GROUP_3_T prRxStatusGroup3;
  648. P_HW_MAC_RX_STS_GROUP_4_T prRxStatusGroup4;
  649. /* rx data information */
  650. PVOID pvHeader;
  651. UINT_16 u2PacketLen;
  652. UINT_16 u2HeaderLen;
  653. PUINT_8 pucPayload;
  654. UINT_16 u2PayloadLength;
  655. P_STA_RECORD_T prStaRec;
  656. UINT_8 ucPacketType;
  657. /* rx sta record */
  658. UINT_8 ucWlanIdx;
  659. UINT_8 ucStaRecIdx;
  660. BOOLEAN fgReorderBuffer;
  661. BOOLEAN fgDataFrame;
  662. BOOLEAN fgFragFrame;
  663. /* duplicate detection */
  664. UINT_16 u2FrameCtrl;
  665. UINT_16 u2SequenceControl;
  666. UINT_16 u2SSN;
  667. UINT_8 ucTid;
  668. ENUM_CSUM_RESULT_T aeCSUM[CSUM_TYPE_NUM];
  669. ENUM_RX_PKT_DESTINATION_T eDst;
  670. ENUM_TRAFFIC_CLASS_INDEX_T eTC; /* only valid when eDst == FORWARD */
  671. };
  672. /*! RX configuration type structure */
  673. typedef struct _RX_CTRL_T {
  674. UINT_32 u4RxCachedSize;
  675. PUINT_8 pucRxCached;
  676. QUE_T rFreeSwRfbList;
  677. QUE_T rReceivedRfbList;
  678. QUE_T rIndicatedRfbList;
  679. #if CFG_SDIO_RX_AGG
  680. PUINT_8 pucRxCoalescingBufPtr;
  681. #endif
  682. PVOID apvIndPacket[CFG_RX_MAX_PKT_NUM];
  683. PVOID apvRetainedPacket[CFG_RX_MAX_PKT_NUM];
  684. UINT_8 ucNumIndPacket;
  685. UINT_8 ucNumRetainedPacket;
  686. UINT_64 au8Statistics[RX_STATISTIC_COUNTER_NUM]; /*!< RX Counters */
  687. #if CFG_HIF_STATISTICS
  688. UINT_32 u4TotalRxAccessNum;
  689. UINT_32 u4TotalRxPacketNum;
  690. #endif
  691. #if CFG_HIF_RX_STARVATION_WARNING
  692. UINT_32 u4QueuedCnt;
  693. UINT_32 u4DequeuedCnt;
  694. #endif
  695. #if CFG_RX_PKTS_DUMP
  696. UINT_32 u4RxPktsDumpTypeMask;
  697. #endif
  698. #if CFG_SUPPORT_SNIFFER
  699. UINT_32 u4AmpduRefNum;
  700. #endif
  701. } RX_CTRL_T, *P_RX_CTRL_T;
  702. typedef struct _RX_MAILBOX_T {
  703. UINT_32 u4RxMailbox[2]; /* for Device-to-Host Mailbox */
  704. } RX_MAILBOX_T, *P_RX_MAILBOX_T;
  705. typedef WLAN_STATUS(*PROCESS_RX_MGT_FUNCTION) (P_ADAPTER_T, P_SW_RFB_T);
  706. typedef struct _EMU_MAC_RATE_INFO_T {
  707. UINT_8 ucPhyRateCode;
  708. UINT_32 u4PhyRate[4][2];
  709. } EMU_MAC_RATE_INFO_T, *P_EMU_MAC_RATE_INFO_T;
  710. /*******************************************************************************
  711. * P R I V A T E D A T A
  712. ********************************************************************************
  713. */
  714. /*******************************************************************************
  715. * M A C R O S
  716. ********************************************************************************
  717. */
  718. #define RATE_INFO(_RateCode, _Bw20, _Bw20SGI, _Bw40, _BW40SGI, _Bw80, _Bw80SGI, _Bw160, _Bw160SGI) \
  719. { \
  720. .ucPhyRateCode = (_RateCode), \
  721. .u4PhyRate[RX_VT_FR_MODE_20][MAC_GI_NORMAL] = (_Bw20), \
  722. .u4PhyRate[RX_VT_FR_MODE_20][MAC_GI_SHORT] = (_Bw20SGI), \
  723. .u4PhyRate[RX_VT_FR_MODE_40][MAC_GI_NORMAL] = (_Bw40), \
  724. .u4PhyRate[RX_VT_FR_MODE_40][MAC_GI_SHORT] = (_BW40SGI), \
  725. .u4PhyRate[RX_VT_FR_MODE_80][MAC_GI_NORMAL] = (_Bw80), \
  726. .u4PhyRate[RX_VT_FR_MODE_80][MAC_GI_SHORT] = (_Bw80SGI), \
  727. .u4PhyRate[RX_VT_FR_MODE_160][MAC_GI_NORMAL] = (_Bw160), \
  728. .u4PhyRate[RX_VT_FR_MODE_160][MAC_GI_SHORT] = (_Bw160SGI), \
  729. }
  730. #define RX_INC_CNT(prRxCtrl, eCounter) \
  731. {((P_RX_CTRL_T)prRxCtrl)->au8Statistics[eCounter]++; }
  732. #define RX_ADD_CNT(prRxCtrl, eCounter, u8Amount) \
  733. {((P_RX_CTRL_T)prRxCtrl)->au8Statistics[eCounter] += (UINT_64)u8Amount; }
  734. #define RX_GET_CNT(prRxCtrl, eCounter) \
  735. (((P_RX_CTRL_T)prRxCtrl)->au8Statistics[eCounter])
  736. #define RX_RESET_ALL_CNTS(prRxCtrl) \
  737. {kalMemZero(&prRxCtrl->au8Statistics[0], sizeof(prRxCtrl->au8Statistics)); }
  738. #define RX_STATUS_TEST_MORE_FLAG(flag) \
  739. ((BOOL)((flag & RX_STATUS_FLAG_MORE_PACKET) ? TRUE : FALSE))
  740. /*------------------------------------------------------------------------------
  741. * MACRO for HW_MAC_RX_DESC_T
  742. *------------------------------------------------------------------------------
  743. */
  744. /* DW 0 */
  745. #define HAL_RX_STATUS_GET_RX_BYTE_CNT(_prHwMacRxDesc) ((_prHwMacRxDesc)->u2RxByteCount)
  746. #define HAL_RX_STATUS_GET_ETH_TYPE_OFFSET(_prHwMacRxDesc) \
  747. (((_prHwMacRxDesc)->u2PktTYpe & RX_STATUS_ETH_TYPE_OFFSET_MASK) >> RX_STATUS_ETH_TYPE_OFFSET)
  748. #define HAL_RX_STATUS_GET_GROUP_VLD(_prHwMacRxDesc) \
  749. (((_prHwMacRxDesc)->u2PktTYpe & RX_STATUS_GROUP_VLD_MASK) >> RX_STATUS_GROUP_VLD_OFFSET)
  750. #define HAL_RX_STATUS_GET_PKT_TYPE(_prHwMacRxDesc) \
  751. (((_prHwMacRxDesc)->u2PktTYpe & RX_STATUS_PKT_TYPE_MASK) >> RX_STATUS_PKT_TYPE_OFFSET)
  752. /* DW 1 */
  753. #define HAL_RX_STATUS_IS_HTC_EXIST(_prHwMacRxDesc) (((_prHwMacRxDesc)->ucMatchPacket & RX_STATUS_HTC)?TRUE:FALSE)
  754. #define HAL_RX_STATUS_IS_UC2ME(_prHwMacRxDesc) (((_prHwMacRxDesc)->ucMatchPacket & RX_STATUS_UC2ME)?TRUE:FALSE)
  755. #define HAL_RX_STATUS_IS_MC(_prHwMacRxDesc) (((_prHwMacRxDesc)->ucMatchPacket & RX_STATUS_MC_FRAME)?TRUE:FALSE)
  756. #define HAL_RX_STATUS_IS_BC(_prHwMacRxDesc) (((_prHwMacRxDesc)->ucMatchPacket & RX_STATUS_BC_FRAME)?TRUE:FALSE)
  757. #define HAL_RX_STATUS_IS_BCN_WITH_BMC(_prHwMacRxDesc) \
  758. (((_prHwMacRxDesc)->ucMatchPacket & RX_STATUS_BCN_WITH_BMC)?TRUE:FALSE)
  759. #define HAL_RX_STATUS_IS_BCN_WITH_UC(_prHwMacRxDesc) \
  760. (((_prHwMacRxDesc)->ucMatchPacket & RX_STATUS_BCN_WITH_UC)?TRUE:FALSE)
  761. #define HAL_RX_STATUS_GET_KEY_ID(_prHwMacRxDesc) \
  762. (((_prHwMacRxDesc)->ucMatchPacket & RX_STATUS_KEYID_MASK) >> RX_STATUS_KEYID_OFFSET)
  763. #define HAL_RX_STATUS_GET_CHAN_FREQ(_prHwMacRxDesc) \
  764. ((_prHwMacRxDesc)->ucChanFreq)
  765. #define HAL_RX_STATUS_GET_HEADER_LEN(_prHwMacRxDesc) ((_prHwMacRxDesc)->ucHeaderLen & RX_STATUS_HEADER_LEN_MASK)
  766. #define HAL_RX_STATUS_IS_HEADER_OFFSET(_prHwMacRxDesc) \
  767. (((_prHwMacRxDesc)->ucHeaderLen & RX_STATUS_HEADER_OFFSET)?TRUE:FALSE)
  768. #define HAL_RX_STATUS_GET_HEADER_OFFSET(_prHwMacRxDesc) \
  769. (((_prHwMacRxDesc)->ucHeaderLen & RX_STATUS_HEADER_OFFSET) ? 2 : 0)
  770. #define HAL_RX_STATUS_IS_HEADER_TRAN(_prHwMacRxDesc) \
  771. (((_prHwMacRxDesc)->ucHeaderLen & RX_STATUS_HEADER_TRAN)?TRUE:FALSE)
  772. #define HAL_RX_STATUS_GET_HEADER_TRAN(_prHwMacRxDesc) HAL_RX_STATUS_IS_HEADER_TRAN(_prHwMacRxDesc)
  773. #define HAL_RX_STATUS_GET_PAYLOAD_FORMAT(_prHwMacRxDesc) \
  774. (((_prHwMacRxDesc)->ucBssid & RX_STATUS_PAYLOAD_FORMAT_MASK) >> RX_STATUS_PAYLOAD_FORMAT_OFFSET)
  775. #define HAL_RX_STATUS_GET_BSSID(_prHwMacRxDesc) \
  776. (((_prHwMacRxDesc)->ucBssid & RX_STATUS_BSSID_MASK) >> RX_STATUS_BSSID_OFFSET)
  777. /* DW 2 */
  778. #define HAL_RX_STATUS_GET_WLAN_IDX(_prHwMacRxDesc) ((_prHwMacRxDesc)->ucWlanIdx)
  779. #define HAL_RX_STATUS_GET_TID(_prHwMacRxDesc) (((_prHwMacRxDesc)->ucTidSecMode & RX_STATUS_TID_MASK))
  780. #define HAL_RX_STATUS_GET_SEC_MODE(_prHwMacRxDesc) \
  781. (((_prHwMacRxDesc)->ucTidSecMode & RX_STATUS_SEC_MASK) >> RX_STATUS_SEC_OFFSET)
  782. #define HAL_RX_STATUS_GET_SW_BIT(_prHwMacRxDesc) \
  783. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_SW_BIT)?TRUE:FALSE)
  784. #define HAL_RX_STATUS_IS_FCS_ERROR(_prHwMacRxDesc) \
  785. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_FLAG_FCS_ERROR)?TRUE:FALSE)
  786. #define HAL_RX_STATUS_IS_CIPHER_MISMATCH(_prHwMacRxDesc) \
  787. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_FLAG_CIPHER_MISMATCH)?TRUE:FALSE)
  788. #define HAL_RX_STATUS_IS_CLM_ERROR(_prHwMacRxDesc) \
  789. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_FLAG_CIPHER_LENGTH_MISMATCH)?TRUE:FALSE)
  790. #define HAL_RX_STATUS_IS_ICV_ERROR(_prHwMacRxDesc) \
  791. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_FLAG_ICV_ERROR)?TRUE:FALSE)
  792. #define HAL_RX_STATUS_IS_TKIP_MIC_ERROR(_prHwMacRxDesc) \
  793. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_FLAG_TKIPMIC_ERROR) > 0?TRUE:FALSE)
  794. #define HAL_RX_STATUS_IS_ERROR(_prHwMacRxDesc) \
  795. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_FLAG_ERROR_MASK)?TRUE:FALSE)
  796. #define HAL_RX_STATUS_IS_LEN_MISMATCH(_prHwMacRxDesc) \
  797. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_FLAG_LEN_MISMATCH)?TRUE:FALSE)
  798. #define HAL_RX_STATUS_IS_DE_AMSDU_FAIL(_prHwMacRxDesc) \
  799. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_FLAG_DE_AMSDU_FAIL)?TRUE:FALSE)
  800. #define HAL_RX_STATUS_IS_EXCEED_LEN(_prHwMacRxDesc) \
  801. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_FLAG_EXCEED_LEN)?TRUE:FALSE)
  802. #define HAL_RX_STATUS_IS_LLC_MIS(_prHwMacRxDesc) (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_LLC_MIS)?TRUE:FALSE)
  803. #define HAL_RX_STATUS_IS_UDF_VLT(_prHwMacRxDesc) (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_UDF_VLT)?TRUE:FALSE)
  804. #define HAL_RX_STATUS_IS_FRAG(_prHwMacRxDesc) (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_FRAG)?TRUE:FALSE)
  805. #define HAL_RX_STATUS_IS_NULL(_prHwMacRxDesc) (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_NULL)?TRUE:FALSE)
  806. #define HAL_RX_STATUS_IS_DATA(_prHwMacRxDesc) (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_DATA)?FALSE:TRUE)
  807. #define HAL_RX_STATUS_IS_AMPDU_SUB_FRAME(_prHwMacRxDesc) \
  808. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_AMPDU_SUB_FRAME)?FALSE:TRUE)
  809. #define HAL_RX_STATUS_IS_AMPDU_FORMAT(_prHwMacRxDesc) \
  810. (((_prHwMacRxDesc)->u2StatusFlag & RX_STATUS_AMPDU_FORMAT)?FALSE:TRUE)
  811. /* DW 3 */
  812. #define HAL_RX_STATUS_IS_RV_VALID(_prHwMacRxDesc) \
  813. (((_prHwMacRxDesc)->u4PatternFilterInfo & RX_STATUS_RXV_SEQ_NO_MASK)?TRUE:FALSE)
  814. #define HAL_RX_STATUS_GET_RXV_SEQ_NO(_prHwMacRxDesc) \
  815. ((_prHwMacRxDesc)->u4PatternFilterInfo & RX_STATUS_RXV_SEQ_NO_MASK)
  816. #define HAL_RX_STATUS_GET_TCL(_prHwMacRxDesc) \
  817. (((_prHwMacRxDesc)->u4PatternFilterInfo & RX_STATUS_TCL)?TRUE:FALSE)
  818. #define HAL_RX_STATUS_IS_CLS(_prHwMacRxDesc) \
  819. (((_prHwMacRxDesc)->u4PatternFilterInfo & RX_STATUS_CLS)?TRUE:FALSE)
  820. #define HAL_RX_STATUS_GET_OFLD(_prHwMacRxDesc) \
  821. (((_prHwMacRxDesc)->u4PatternFilterInfo & RX_STATUS_OFLD_MASK) >> RX_STATUS_OFLD_OFFSET)
  822. #define HAL_RX_STATUS_IS_MGC(_prHwMacRxDesc) \
  823. (((_prHwMacRxDesc)->u4PatternFilterInfo & RX_STATUS_MGC)?TRUE:FALSE)
  824. #define HAL_RX_STATUS_GET_WOL(_prHwMacRxDesc) \
  825. (((_prHwMacRxDesc)->u4PatternFilterInfo & RX_STATUS_WOL_MASK) >> RX_STATUS_WOL_OFFSET)
  826. #define HAL_RX_STATUS_GET_CLS_BITMAP(_prHwMacRxDesc) \
  827. (((_prHwMacRxDesc)->u4PatternFilterInfo & RX_STATUS_CLS_BITMAP_MASK) >> RX_STATUS_CLS_BITMAP_OFFSET)
  828. #define HAL_RX_STATUS_IS_PF_BLACK_LIST(_prHwMacRxDesc) \
  829. (((_prHwMacRxDesc)->u4PatternFilterInfo & RX_STATUS_PF_MODE_BLACK_LIST)?TRUE:FALSE)
  830. #define HAL_RX_STATUS_IS_PF_CHECKED(_prHwMacRxDesc) \
  831. (((_prHwMacRxDesc)->u4PatternFilterInfo & RX_STATUS_PF_STS_CHECKED)?TRUE:FALSE)
  832. /* DW 4~7 */
  833. #define HAL_RX_STATUS_GET_FRAME_CTL_FIELD(_prHwMacRxStsGroup4) ((_prHwMacRxStsGroup4)->u2FrameCtl)
  834. #define HAL_RX_STATUS_GET_TA(_prHwMacRxStsGroup4, pucTA) \
  835. {\
  836. kalMemCopy(pucTA, &(_prHwMacRxStsGroup4)->aucTA[0], 6); \
  837. }
  838. #define HAL_RX_STATUS_GET_SEQ_FRAG_NUM(_prHwMacRxStsGroup4) ((_prHwMacRxStsGroup4)->u2SeqFrag)
  839. #define HAL_RX_STATUS_GET_QOS_CTL_FIELD(_prHwMacRxStsGroup4) ((_prHwMacRxStsGroup4)->u2Qos)
  840. #define HAL_RX_STATUS_GET_SEQFrag_NUM(_prHwMacRxStsGroup4) ((_prHwMacRxStsGroup4)->u2SeqFrag)
  841. #define HAL_RX_STATUS_GET_HTC(_prHwMacRxStsGroup4) ((_prHwMacRxStsGroup4)->u4HTC)
  842. /* DW 8~11 */
  843. #define HAL_RX_STATUS_GET_RSC(_prHwMacRxStsGroup1, pucRSC) \
  844. {\
  845. kalMemCopy(pucRSC, &(_prHwMacRxStsGroup1)->aucPN[0], 6); \
  846. }
  847. #define HAL_RX_STATUS_GET_PN(_prHwMacRxStsGroup1, pucPN) \
  848. {\
  849. kalMemCopy(pucPN, &(_prHwMacRxStsGroup1)->aucPN[0], 16); \
  850. }
  851. /* DW 12~13 */
  852. #define HAL_RX_STATUS_GET_TIMESTAMP(_prHwMacRxStsGroup2, _ucIdx) ((_prHwMacRxStsGroup2)->u4Timestamp)
  853. #define HAL_RX_STATUS_GET_FCS32(_prHwMacRxStsGroup2) ((_prHwMacRxStsGroup2)->u4CRC)
  854. /* DW 14~19 */
  855. #define HAL_RX_STATUS_GET_RX_VECTOR(_prHwMacRxStsGroup3, _ucIdx) ((_prHwMacRxStsGroup3)->u4RxVector[_ucIdx])
  856. #define HAL_RX_STATUS_GET_RCPI(_prHwMacRxStsGroup3) \
  857. (((_prHwMacRxStsGroup3)->u4RxVector[2] & RX_VT_RCPI_MASK) >> RX_VT_RCPI_OFFSET)
  858. /* TBD */
  859. #define HAL_RX_STATUS_GET_RX_PACKET_LEN(_prHwMacRxDesc)
  860. #define HAL_RX_STATUS_IS_MATCH_PACKET(_prHwMacRxDesc)
  861. #define HAL_RX_STATUS_GET_CHNL_NUM(_prHwMacRxDesc) \
  862. ((((_prHwMacRxDesc)->ucChanFreq) > HW_CHNL_NUM_MAX_4G_5G) ? \
  863. (((_prHwMacRxDesc)->ucChanFreq) - HW_CHNL_NUM_MAX_4G_5G) : \
  864. ((_prHwMacRxDesc)->ucChanFreq))
  865. /* To do: support more bands other than 2.4G and 5G */
  866. #define HAL_RX_STATUS_GET_RF_BAND(_prHwMacRxDesc) \
  867. ((((_prHwMacRxDesc)->ucChanFreq) <= HW_CHNL_NUM_MAX_2G4) ? \
  868. BAND_2G4 : BAND_5G)
  869. /*------------------------------------------------------------------------------
  870. * MACRO for HW_RX_VECTOR_DESC_T
  871. *------------------------------------------------------------------------------
  872. */
  873. #define HAL_RX_VECTOR_GET_TA(_prHwRxVector, pucTA) \
  874. {\
  875. kalMemCopy(pucTA, &(_prHwRxVector)->aucTA[0], 6); \
  876. }
  877. #define HAL_RX_VECTOR_GET_SEQ_NO(_prHwRxVector) ((_prHwRxVector)->ucRxVtSeqNo & RX_STATUS_RXV_SEQ_NO_MASK)
  878. #define HAL_RX_VECTOR_IS_FOR_BA_ACK(_prHwRxVector) (((_prHwRxVector)->ucRxVtSeqNo & RX_VECTOR_FOR_BA_ACK)?TRUE:FALSE)
  879. #define HAL_RX_VECTOR_GET_RX_VECTOR(_prHwRxVector, _ucIdx) ((_prHwRxVector)->u4RxVector[_ucIdx])
  880. #define RXM_IS_QOS_DATA_FRAME(_u2FrameCtrl) \
  881. (((_u2FrameCtrl & MASK_FRAME_TYPE) == MAC_FRAME_QOS_DATA) ? TRUE : FALSE)
  882. /*******************************************************************************
  883. * F U N C T I O N D E C L A R A T I O N S
  884. ********************************************************************************
  885. */
  886. VOID nicRxInitialize(IN P_ADAPTER_T prAdapter);
  887. VOID nicRxUninitialize(IN P_ADAPTER_T prAdapter);
  888. VOID nicRxProcessRFBs(IN P_ADAPTER_T prAdapter);
  889. #if !CFG_SDIO_INTR_ENHANCE
  890. VOID nicRxReceiveRFBs(IN P_ADAPTER_T prAdapter);
  891. WLAN_STATUS nicRxReadBuffer(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  892. #else
  893. VOID nicRxSDIOReceiveRFBs(IN P_ADAPTER_T prAdapter);
  894. WLAN_STATUS
  895. nicRxEnhanceReadBuffer(IN P_ADAPTER_T prAdapter,
  896. IN UINT_32 u4DataPort, IN UINT_16 u2RxLength, IN OUT P_SW_RFB_T prSwRfb);
  897. #endif /* CFG_SDIO_INTR_ENHANCE */
  898. #if CFG_SDIO_RX_AGG
  899. VOID nicRxSDIOAggReceiveRFBs(IN P_ADAPTER_T prAdapter);
  900. #endif
  901. WLAN_STATUS nicRxSetupRFB(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prRfb);
  902. VOID nicRxReturnRFB(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prRfb);
  903. VOID nicProcessRxInterrupt(IN P_ADAPTER_T prAdapter);
  904. VOID nicRxProcessPktWithoutReorder(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb);
  905. VOID nicRxProcessForwardPkt(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb);
  906. VOID nicRxProcessGOBroadcastPkt(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb);
  907. VOID nicRxFillRFB(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  908. P_SW_RFB_T incRxDefragMPDU(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSWRfb, OUT P_QUE_T prReturnedQue);
  909. BOOLEAN nicRxIsDuplicateFrame(IN OUT P_SW_RFB_T prSwRfb);
  910. #if CFG_SUPPORT_SNIFFER
  911. VOID nicRxProcessMonitorPacket(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  912. #endif
  913. VOID nicRxProcessDataPacket(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  914. VOID nicRxProcessEventPacket(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  915. VOID nicRxProcessMgmtPacket(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  916. #if CFG_TCP_IP_CHKSUM_OFFLOAD
  917. VOID nicRxFillChksumStatus(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb, IN UINT_32 u4TcpUdpIpCksStatus);
  918. VOID nicRxUpdateCSUMStatistics(IN P_ADAPTER_T prAdapter, IN const ENUM_CSUM_RESULT_T aeCSUM[]);
  919. #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
  920. VOID nicRxQueryStatus(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucBuffer, OUT PUINT_32 pu4Count);
  921. VOID nicRxClearStatistics(IN P_ADAPTER_T prAdapter);
  922. VOID nicRxQueryStatistics(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucBuffer, OUT PUINT_32 pu4Count);
  923. WLAN_STATUS
  924. nicRxWaitResponse(IN P_ADAPTER_T prAdapter,
  925. IN UINT_8 ucPortIdx, OUT PUINT_8 pucRspBuffer, IN UINT_32 u4MaxRespBufferLen, OUT PUINT_32 pu4Length);
  926. VOID nicRxEnablePromiscuousMode(IN P_ADAPTER_T prAdapter);
  927. VOID nicRxDisablePromiscuousMode(IN P_ADAPTER_T prAdapter);
  928. WLAN_STATUS nicRxFlush(IN P_ADAPTER_T prAdapter);
  929. WLAN_STATUS nicRxProcessActionFrame(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb);
  930. #endif /* _NIC_RX_H */