hal.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/include/nic/hal.h#1
  3. */
  4. /*! \file "hal.h"
  5. \brief The declaration of hal functions
  6. N/A
  7. */
  8. /*
  9. ** Log: hal.h
  10. *
  11. * 04 01 2011 tsaiyuan.hsu
  12. * [WCXRP00000615] [MT 6620 Wi-Fi][Driver] Fix klocwork issues
  13. * fix the klocwork issues, 57500, 57501, 57502 and 57503.
  14. *
  15. * 03 21 2011 cp.wu
  16. * [WCXRP00000540] [MT5931][Driver] Add eHPI8/eHPI16 support to Linux Glue Layer
  17. * portability improvement
  18. *
  19. * 03 07 2011 terry.wu
  20. * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
  21. * Toggle non-standard debug messages to comments.
  22. *
  23. * 11 08 2010 cp.wu
  24. * [WCXRP00000166] [MT6620 Wi-Fi][Driver] use SDIO CMD52 for enabling/disabling interrupt to reduce transaction period
  25. * change to use CMD52 for enabling/disabling interrupt to reduce SDIO transaction time
  26. *
  27. * 09 01 2010 cp.wu
  28. * NULL
  29. * move HIF CR initialization from where after sdioSetupCardFeature() to wlanAdapterStart()
  30. *
  31. * 07 08 2010 cp.wu
  32. *
  33. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  34. *
  35. * 06 15 2010 cp.wu
  36. * [WPD00003833][MT6620 and MT5931] Driver migration
  37. * change zero-padding for TX port access to HAL.
  38. *
  39. * 06 06 2010 kevin.huang
  40. * [WPD00003832][MT6620 5931] Create driver base
  41. * [MT6620 5931] Create driver base
  42. *
  43. * 04 06 2010 cp.wu
  44. * [WPD00001943]Create WiFi test driver framework on WinXP
  45. * eliminate direct access for prGlueInfo->fgIsCardRemoved in non-glue layer
  46. *
  47. * 01 27 2010 cp.wu
  48. * [WPD00001943]Create WiFi test driver framework on WinXP
  49. * 1. eliminate improper variable in rHifInfo
  50. * * * * 2. block TX/ordinary OID when RF test mode is engaged
  51. * * * * 3. wait until firmware finish operation when entering into and leaving from RF test mode
  52. * * * * 4. correct some HAL implementation
  53. ** \main\maintrunk.MT6620WiFiDriver_Prj\17 2009-12-16 18:02:26 GMT mtk02752
  54. ** include precomp.h
  55. ** \main\maintrunk.MT6620WiFiDriver_Prj\16 2009-12-10 16:43:16 GMT mtk02752
  56. ** code clean
  57. ** \main\maintrunk.MT6620WiFiDriver_Prj\15 2009-11-13 13:54:15 GMT mtk01084
  58. ** \main\maintrunk.MT6620WiFiDriver_Prj\14 2009-11-11 10:36:01 GMT mtk01084
  59. ** modify HAL functions
  60. ** \main\maintrunk.MT6620WiFiDriver_Prj\13 2009-11-09 22:56:28 GMT mtk01084
  61. ** modify HW access routines
  62. ** \main\maintrunk.MT6620WiFiDriver_Prj\12 2009-10-29 19:50:09 GMT mtk01084
  63. ** add new macro HAL_TX_PORT_WR
  64. ** \main\maintrunk.MT6620WiFiDriver_Prj\11 2009-10-23 16:08:10 GMT mtk01084
  65. ** \main\maintrunk.MT6620WiFiDriver_Prj\10 2009-10-13 21:58:50 GMT mtk01084
  66. ** update for new HW architecture design
  67. ** \main\maintrunk.MT6620WiFiDriver_Prj\9 2009-05-18 14:28:10 GMT mtk01084
  68. ** fix issue in HAL_DRIVER_OWN_BY_SDIO_CMD52()
  69. ** \main\maintrunk.MT6620WiFiDriver_Prj\8 2009-05-11 17:26:33 GMT mtk01084
  70. ** modify the bit definition to check driver own status
  71. ** \main\maintrunk.MT6620WiFiDriver_Prj\7 2009-04-28 10:30:22 GMT mtk01461
  72. ** Fix typo
  73. ** \main\maintrunk.MT6620WiFiDriver_Prj\6 2009-04-01 10:50:34 GMT mtk01461
  74. ** Redefine HAL_PORT_RD/WR macro for SW pre test
  75. ** \main\maintrunk.MT6620WiFiDriver_Prj\5 2009-03-24 09:46:49 GMT mtk01084
  76. ** fix LINT error
  77. ** \main\maintrunk.MT6620WiFiDriver_Prj\4 2009-03-23 16:53:38 GMT mtk01084
  78. ** add HAL_DRIVER_OWN_BY_SDIO_CMD52()
  79. ** \main\maintrunk.MT6620WiFiDriver_Prj\3 2009-03-18 20:53:13 GMT mtk01426
  80. ** Fixed lint warn
  81. ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-03-10 20:16:20 GMT mtk01426
  82. ** Init for develop
  83. **
  84. */
  85. #ifndef _HAL_H
  86. #define _HAL_H
  87. /*******************************************************************************
  88. * C O M P I L E R F L A G S
  89. ********************************************************************************
  90. */
  91. /*******************************************************************************
  92. * E X T E R N A L R E F E R E N C E S
  93. ********************************************************************************
  94. */
  95. /*******************************************************************************
  96. * C O N S T A N T S
  97. ********************************************************************************
  98. */
  99. /*******************************************************************************
  100. * D A T A T Y P E S
  101. ********************************************************************************
  102. */
  103. /*******************************************************************************
  104. * P U B L I C D A T A
  105. ********************************************************************************
  106. */
  107. /*******************************************************************************
  108. * P R I V A T E D A T A
  109. ********************************************************************************
  110. */
  111. /*******************************************************************************
  112. * M A C R O S
  113. ********************************************************************************
  114. */
  115. /* Macros for flag operations for the Adapter structure */
  116. #define HAL_SET_FLAG(_M, _F) ((_M)->u4HwFlags |= (_F))
  117. #define HAL_CLEAR_FLAG(_M, _F) ((_M)->u4HwFlags &= ~(_F))
  118. #define HAL_TEST_FLAG(_M, _F) ((_M)->u4HwFlags & (_F))
  119. #define HAL_TEST_FLAGS(_M, _F) (((_M)->u4HwFlags & (_F)) == (_F))
  120. #if defined(_HIF_SDIO)
  121. #define HAL_MCR_RD(_prAdapter, _u4Offset, _pu4Value) \
  122. do { \
  123. if (HAL_TEST_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR) == FALSE) { \
  124. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  125. ASSERT(0); \
  126. } \
  127. if (kalDevRegRead(_prAdapter->prGlueInfo, _u4Offset, _pu4Value) == FALSE) {\
  128. HAL_SET_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR); \
  129. fgIsBusAccessFailed = TRUE; \
  130. /* DBGLOG(HAL, ERROR, ("HAL_MCR_RD access fail! 0x%x: 0x%x\n", */ \
  131. /* (UINT32)_u4Offset, (UINT32)*_pu4Value)); */ \
  132. } \
  133. } else { \
  134. /* DBGLOG(HAL, WARN, ("ignore HAL_MCR_RD access! 0x%x\n", (UINT32)_u4Offset)); */ \
  135. } \
  136. } while (0)
  137. #define HAL_MCR_WR(_prAdapter, _u4Offset, _u4Value) \
  138. do { \
  139. if (HAL_TEST_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR) == FALSE) { \
  140. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  141. ASSERT(0); \
  142. } \
  143. if (kalDevRegWrite(_prAdapter->prGlueInfo, _u4Offset, _u4Value) == FALSE) {\
  144. HAL_SET_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR); \
  145. fgIsBusAccessFailed = TRUE; \
  146. /* DBGLOG(HAL, ERROR, ("HAL_MCR_WR access fail! 0x%x: 0x%x\n", */ \
  147. /* (UINT32)_u4Offset, (UINT32)_u4Value)); */ \
  148. } \
  149. } else { \
  150. /* DBGLOG(HAL, WARN, ("ignore HAL_MCR_WR access! 0x%x: 0x%x\n", */ \
  151. /* (UINT32)_u4Offset, (UINT32)_u4Value)); */ \
  152. } \
  153. } while (0)
  154. #define HAL_PORT_RD(_prAdapter, _u4Port, _u4Len, _pucBuf, _u4ValidBufSize) \
  155. { \
  156. /*fgResult = FALSE; */\
  157. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  158. ASSERT(0); \
  159. } \
  160. if (HAL_TEST_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR) == FALSE) { \
  161. if (kalDevPortRead(_prAdapter->prGlueInfo, _u4Port, _u4Len, _pucBuf, _u4ValidBufSize) \
  162. == FALSE) {\
  163. HAL_SET_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR); \
  164. fgIsBusAccessFailed = TRUE; \
  165. DBGLOG(HAL, ERROR, "HAL_PORT_RD access fail! 0x%x\n", _u4Port); \
  166. } \
  167. else { \
  168. /*fgResult = TRUE;*/ } \
  169. } else { \
  170. DBGLOG(HAL, WARN, "ignore HAL_PORT_RD access! 0x%x\n", _u4Port); \
  171. } \
  172. }
  173. #define HAL_PORT_WR(_prAdapter, _u4Port, _u4Len, _pucBuf, _u4ValidBufSize) \
  174. { \
  175. /*fgResult = FALSE; */\
  176. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  177. ASSERT(0); \
  178. } \
  179. if (HAL_TEST_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR) == FALSE) { \
  180. if (kalDevPortWrite(_prAdapter->prGlueInfo, _u4Port, _u4Len, _pucBuf, _u4ValidBufSize) \
  181. == FALSE) {\
  182. HAL_SET_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR); \
  183. fgIsBusAccessFailed = TRUE; \
  184. DBGLOG(HAL, ERROR, "HAL_PORT_WR access fail! 0x%x\n", _u4Port); \
  185. } \
  186. else { \
  187. /*fgResult = TRUE;*/ } \
  188. } else { \
  189. DBGLOG(HAL, WARN, "ignore HAL_PORT_WR access! 0x%x\n", _u4Port); \
  190. } \
  191. }
  192. #if 0 /* only for SDIO */
  193. #define HAL_BYTE_WR(_prAdapter, _u4Port, _ucBuf) \
  194. { \
  195. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  196. ASSERT(0); \
  197. } \
  198. if (HAL_TEST_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR) == FALSE) { \
  199. if (kalDevWriteWithSdioCmd52(_prAdapter->prGlueInfo, _u4Port, _ucBuf) == FALSE) {\
  200. HAL_SET_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR); \
  201. fgIsBusAccessFailed = TRUE; \
  202. DBGLOG(HAL, ERROR, "HAL_BYTE_WR access fail! 0x%x\n", _u4Port); \
  203. } \
  204. else { \
  205. /* Todo:: Nothing*/ \
  206. } \
  207. } \
  208. else { \
  209. DBGLOG(HAL, WARN, "ignore HAL_BYTE_WR access! 0x%x\n", _u4Port); \
  210. } \
  211. }
  212. #endif
  213. #define HAL_DRIVER_OWN_BY_SDIO_CMD52(_prAdapter, _pfgDriverIsOwnReady) \
  214. { \
  215. UINT_8 ucBuf = BIT(1); \
  216. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  217. ASSERT(0); \
  218. } \
  219. if (HAL_TEST_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR) == FALSE) { \
  220. if (kalDevReadAfterWriteWithSdioCmd52(_prAdapter->prGlueInfo, MCR_WHLPCR_BYTE1, &ucBuf, 1) \
  221. == FALSE) {\
  222. HAL_SET_FLAG(_prAdapter, ADAPTER_FLAG_HW_ERR); \
  223. fgIsBusAccessFailed = TRUE; \
  224. DBGLOG(HAL, ERROR, "kalDevReadAfterWriteWithSdioCmd52 access fail!\n"); \
  225. } \
  226. else { \
  227. *_pfgDriverIsOwnReady = (ucBuf & BIT(0)) ? TRUE : FALSE; \
  228. } \
  229. } else { \
  230. DBGLOG(HAL, WARN, "ignore HAL_DRIVER_OWN_BY_SDIO_CMD52 access!\n"); \
  231. } \
  232. }
  233. #else /* #if defined(_HIF_SDIO) */
  234. #define HAL_MCR_RD(_prAdapter, _u4Offset, _pu4Value) \
  235. { \
  236. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  237. ASSERT(0); \
  238. } \
  239. if (kalDevRegRead(_prAdapter->prGlueInfo, _u4Offset, _pu4Value) \
  240. == FALSE) \
  241. fgIsBusAccessFailed = TRUE; \
  242. }
  243. #define HAL_MCR_WR(_prAdapter, _u4Offset, _u4Value) \
  244. { \
  245. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  246. ASSERT(0); \
  247. } \
  248. if (kalDevRegWrite(_prAdapter->prGlueInfo, _u4Offset, _u4Value) \
  249. == FALSE) \
  250. fgIsBusAccessFailed = TRUE; \
  251. }
  252. #define HAL_PORT_RD(_prAdapter, _u4Port, _u4Len, _pucBuf, _u4ValidBufSize) \
  253. { \
  254. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  255. ASSERT(0); \
  256. } \
  257. if (kalDevPortRead(_prAdapter->prGlueInfo, _u4Port, _u4Len, _pucBuf, _u4ValidBufSize) \
  258. == FALSE) \
  259. fgIsBusAccessFailed = TRUE; \
  260. }
  261. #define HAL_PORT_WR(_prAdapter, _u4Port, _u4Len, _pucBuf, _u4ValidBufSize) \
  262. { \
  263. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  264. ASSERT(0); \
  265. } \
  266. if (kalDevPortWrite(_prAdapter->prGlueInfo, _u4Port, _u4Len, _pucBuf, _u4ValidBufSize) \
  267. == FALSE) \
  268. fgIsBusAccessFailed = TRUE; \
  269. }
  270. #if 0 /* only for SDIO */
  271. #define HAL_BYTE_WR(_prAdapter, _u4Port, _ucBuf) \
  272. { \
  273. if (_prAdapter->rAcpiState == ACPI_STATE_D3) { \
  274. ASSERT(0); \
  275. } \
  276. kalDevWriteWithSdioCmd52(_prAdapter->prGlueInfo, _u4Port, _ucBuf); \
  277. }
  278. #endif
  279. #endif /* #if defined(_HIF_SDIO) */
  280. #define HAL_READ_RX_PORT(prAdapter, u4PortId, u4Len, pvBuf, _u4ValidBufSize) \
  281. { \
  282. ASSERT(u4PortId < 2); \
  283. HAL_PORT_RD(prAdapter, \
  284. ((u4PortId == 0) ? MCR_WRDR0 : MCR_WRDR1), \
  285. u4Len, \
  286. pvBuf, \
  287. _u4ValidBufSize/*temp!!*//*4Kbyte*/); \
  288. }
  289. #define HAL_WRITE_TX_PORT(_prAdapter, _ucTxPortIdx, _u4Len, _pucBuf, _u4ValidBufSize) \
  290. { \
  291. ASSERT(_ucTxPortIdx < 2); \
  292. if ((_u4ValidBufSize - _u4Len) >= sizeof(UINT_32)) { \
  293. /* fill with single dword of zero as TX-aggregation termination */ \
  294. *(PUINT_32) (&((_pucBuf)[ALIGN_4(_u4Len)])) = 0; \
  295. } \
  296. HAL_PORT_WR(_prAdapter, \
  297. (_ucTxPortIdx == 0) ? MCR_WTDR0 : MCR_WTDR1, \
  298. _u4Len, \
  299. _pucBuf, \
  300. _u4ValidBufSize/*temp!!*//*4KByte*/); \
  301. }
  302. /* The macro to read the given MCR several times to check if the wait
  303. condition come true. */
  304. #define HAL_MCR_RD_AND_WAIT(_pAdapter, _offset, _pReadValue, _waitCondition, _waitDelay, _waitCount, _status) \
  305. { \
  306. UINT_32 count; \
  307. (_status) = FALSE; \
  308. for (count = 0; count < (_waitCount); count++) { \
  309. HAL_MCR_RD((_pAdapter), (_offset), (_pReadValue)); \
  310. if ((_waitCondition)) { \
  311. (_status) = TRUE; \
  312. break; \
  313. } \
  314. kalUdelay((_waitDelay)); \
  315. } \
  316. }
  317. /* The macro to write 1 to a R/S bit and read it several times to check if the
  318. command is done */
  319. #define HAL_MCR_WR_AND_WAIT(_pAdapter, _offset, _writeValue, _busyMask, _waitDelay, _waitCount, _status) \
  320. { \
  321. UINT_32 u4Temp; \
  322. UINT_32 u4Count = _waitCount; \
  323. (_status) = FALSE; \
  324. HAL_MCR_WR((_pAdapter), (_offset), (_writeValue)); \
  325. do { \
  326. kalUdelay((_waitDelay)); \
  327. HAL_MCR_RD((_pAdapter), (_offset), &u4Temp); \
  328. if (!(u4Temp & (_busyMask))) { \
  329. (_status) = TRUE; \
  330. break; \
  331. } \
  332. u4Count--; \
  333. } while (u4Count); \
  334. }
  335. #define HAL_GET_CHIP_ID_VER(_prAdapter, pu2ChipId, pu2Version) \
  336. { \
  337. UINT_32 u4Value; \
  338. HAL_MCR_RD(_prAdapter, \
  339. MCR_WCIR, \
  340. &u4Value); \
  341. *pu2ChipId = (UINT_16)(u4Value & WCIR_CHIP_ID); \
  342. *pu2Version = (UINT_16)(u4Value & WCIR_REVISION_ID) >> 16; \
  343. }
  344. #define HAL_WAIT_WIFI_FUNC_READY(_prAdapter) \
  345. { \
  346. UINT_32 u4Value; \
  347. UINT_32 i; \
  348. for (i = 0; i < 100; i++) { \
  349. HAL_MCR_RD(_prAdapter, \
  350. MCR_WCIR, \
  351. &u4Value); \
  352. if (u4Value & WCIR_WLAN_READY) { \
  353. break; \
  354. } \
  355. NdisMSleep(10); \
  356. } \
  357. }
  358. #define HAL_INTR_DISABLE(_prAdapter) \
  359. HAL_MCR_WR(_prAdapter, \
  360. MCR_WHLPCR, \
  361. WHLPCR_INT_EN_CLR)
  362. #define HAL_INTR_ENABLE(_prAdapter) \
  363. HAL_MCR_WR(_prAdapter, \
  364. MCR_WHLPCR, \
  365. WHLPCR_INT_EN_SET)
  366. #define HAL_INTR_ENABLE_AND_LP_OWN_SET(_prAdapter) \
  367. HAL_MCR_WR(_prAdapter, \
  368. MCR_WHLPCR, \
  369. (WHLPCR_INT_EN_SET | WHLPCR_FW_OWN_REQ_SET))
  370. #define HAL_LP_OWN_SET(_prAdapter) \
  371. HAL_MCR_WR(_prAdapter, \
  372. MCR_WHLPCR, \
  373. WHLPCR_FW_OWN_REQ_SET)
  374. #define HAL_LP_OWN_CLR_OK(_prAdapter, _pfgResult) \
  375. { \
  376. UINT_32 i; \
  377. UINT_32 u4RegValue; \
  378. UINT_32 u4LoopCnt = 2048 / 8; \
  379. *_pfgResult = TRUE; \
  380. /* Software get LP ownership */ \
  381. HAL_MCR_WR(_prAdapter, \
  382. MCR_WHLPCR, \
  383. WHLPCR_FW_OWN_REQ_CLR) \
  384. for (i = 0; i < u4LoopCnt; i++) { \
  385. HAL_MCR_RD(_prAdapter, MCR_WHLPCR, &u4RegValue); \
  386. if (u4RegValue & WHLPCR_IS_DRIVER_OWN) { \
  387. break; \
  388. } \
  389. else { \
  390. kalUdelay(8); \
  391. } \
  392. } \
  393. if (i == u4LoopCnt) { \
  394. *_pfgResult = FALSE; \
  395. /*ERRORLOG(("LP cannot be own back (%ld)", u4LoopCnt));*/ \
  396. /* check the time of LP instructions need to perform from Sleep to On */ \
  397. /*ASSERT(0); */ \
  398. } \
  399. }
  400. #define HAL_GET_ABNORMAL_INTERRUPT_REASON_CODE(_prAdapter, pu4AbnormalReason) \
  401. { \
  402. HAL_MCR_RD(_prAdapter, \
  403. MCR_WASR, \
  404. pu4AbnormalReason); \
  405. }
  406. #define HAL_DISABLE_RX_ENHANCE_MODE(_prAdapter) \
  407. { \
  408. UINT_32 u4Value; \
  409. HAL_MCR_RD(_prAdapter, \
  410. MCR_WHCR, \
  411. &u4Value); \
  412. HAL_MCR_WR(_prAdapter, \
  413. MCR_WHCR, \
  414. u4Value & ~WHCR_RX_ENHANCE_MODE_EN); \
  415. }
  416. #define HAL_ENABLE_RX_ENHANCE_MODE(_prAdapter) \
  417. { \
  418. UINT_32 u4Value; \
  419. HAL_MCR_RD(_prAdapter, \
  420. MCR_WHCR, \
  421. &u4Value); \
  422. HAL_MCR_WR(_prAdapter, \
  423. MCR_WHCR, \
  424. u4Value | WHCR_RX_ENHANCE_MODE_EN); \
  425. }
  426. #define HAL_CFG_MAX_HIF_RX_LEN_NUM(_prAdapter, _ucNumOfRxLen) \
  427. { \
  428. UINT_32 u4Value, ucNum; \
  429. ucNum = ((_ucNumOfRxLen >= 16) ? 0 : _ucNumOfRxLen); \
  430. u4Value = 0; \
  431. HAL_MCR_RD(_prAdapter, \
  432. MCR_WHCR, \
  433. &u4Value); \
  434. u4Value &= ~WHCR_MAX_HIF_RX_LEN_NUM; \
  435. u4Value |= ((((UINT_32)ucNum) << 4) & WHCR_MAX_HIF_RX_LEN_NUM); \
  436. HAL_MCR_WR(_prAdapter, \
  437. MCR_WHCR, \
  438. u4Value); \
  439. }
  440. #define HAL_SET_INTR_STATUS_READ_CLEAR(prAdapter) \
  441. { \
  442. UINT_32 u4Value; \
  443. HAL_MCR_RD(prAdapter, \
  444. MCR_WHCR, \
  445. &u4Value); \
  446. HAL_MCR_WR(prAdapter, \
  447. MCR_WHCR, \
  448. u4Value & ~WHCR_W_INT_CLR_CTRL); \
  449. prAdapter->prGlueInfo->rHifInfo.fgIntReadClear = TRUE;\
  450. }
  451. #define HAL_SET_INTR_STATUS_WRITE_1_CLEAR(prAdapter) \
  452. { \
  453. UINT_32 u4Value; \
  454. HAL_MCR_RD(prAdapter, \
  455. MCR_WHCR, \
  456. &u4Value); \
  457. HAL_MCR_WR(prAdapter, \
  458. MCR_WHCR, \
  459. u4Value | WHCR_W_INT_CLR_CTRL); \
  460. prAdapter->prGlueInfo->rHifInfo.fgIntReadClear = FALSE;\
  461. }
  462. /* Note: enhance mode structure may also carried inside the buffer,
  463. if the length of the buffer is long enough */
  464. #define HAL_READ_INTR_STATUS(prAdapter, length, pvBuf) \
  465. HAL_PORT_RD(prAdapter, \
  466. MCR_WHISR, \
  467. length, \
  468. pvBuf, \
  469. length)
  470. #define HAL_READ_TX_RELEASED_COUNT(_prAdapter, aucTxReleaseCount) \
  471. { \
  472. PUINT_32 pu4Value = (PUINT_32)aucTxReleaseCount; \
  473. HAL_MCR_RD(_prAdapter, \
  474. MCR_WTSR0, \
  475. &pu4Value[0]); \
  476. HAL_MCR_RD(_prAdapter, \
  477. MCR_WTSR1, \
  478. &pu4Value[1]); \
  479. }
  480. #define HAL_READ_RX_LENGTH(prAdapter, pu2Rx0Len, pu2Rx1Len) \
  481. { \
  482. UINT_32 u4Value; \
  483. u4Value = 0; \
  484. HAL_MCR_RD(prAdapter, \
  485. MCR_WRPLR, \
  486. &u4Value); \
  487. *pu2Rx0Len = (UINT_16)u4Value; \
  488. *pu2Rx1Len = (UINT_16)(u4Value >> 16); \
  489. }
  490. #define HAL_GET_INTR_STATUS_FROM_ENHANCE_MODE_STRUCT(pvBuf, u2Len, pu4Status) \
  491. { \
  492. PUINT_32 pu4Buf = (PUINT_32)pvBuf; \
  493. *pu4Status = pu4Buf[0]; \
  494. }
  495. #define HAL_GET_TX_STATUS_FROM_ENHANCE_MODE_STRUCT(pvInBuf, pu4BufOut, u4LenBufOut) \
  496. { \
  497. PUINT_32 pu4Buf = (PUINT_32)pvInBuf; \
  498. ASSERT(u4LenBufOut >= 8); \
  499. pu4BufOut[0] = pu4Buf[1]; \
  500. pu4BufOut[1] = pu4Buf[2]; \
  501. }
  502. #define HAL_GET_RX_LENGTH_FROM_ENHANCE_MODE_STRUCT(pvInBuf, pu2Rx0Num, au2Rx0Len, pu2Rx1Num, au2Rx1Len) \
  503. { \
  504. PUINT_32 pu4Buf = (PUINT_32)pvInBuf; \
  505. ASSERT((sizeof(au2Rx0Len) / sizeof(UINT_16)) >= 16); \
  506. ASSERT((sizeof(au2Rx1Len) / sizeof(UINT_16)) >= 16); \
  507. *pu2Rx0Num = (UINT_16)pu4Buf[3]; \
  508. *pu2Rx1Num = (UINT_16)(pu4Buf[3] >> 16); \
  509. kalMemCopy(au2Rx0Len, &pu4Buf[4], 8); \
  510. kalMemCopy(au2Rx1Len, &pu4Buf[12], 8); \
  511. }
  512. #define HAL_GET_MAILBOX_FROM_ENHANCE_MODE_STRUCT(pvInBuf, pu4Mailbox0, pu4Mailbox1) \
  513. { \
  514. PUINT_32 pu4Buf = (PUINT_32)pvInBuf; \
  515. *pu4Mailbox0 = (UINT_16)pu4Buf[21]; \
  516. *pu4Mailbox1 = (UINT_16)pu4Buf[22]; \
  517. }
  518. #define HAL_IS_TX_DONE_INTR(u4IntrStatus) \
  519. ((u4IntrStatus & WHISR_TX_DONE_INT) ? TRUE : FALSE)
  520. #define HAL_IS_RX_DONE_INTR(u4IntrStatus) \
  521. ((u4IntrStatus & (WHISR_RX0_DONE_INT | WHISR_RX1_DONE_INT)) ? TRUE : FALSE)
  522. #define HAL_IS_ABNORMAL_INTR(u4IntrStatus) \
  523. ((u4IntrStatus & WHISR_ABNORMAL_INT) ? TRUE : FALSE)
  524. #define HAL_IS_FW_OWNBACK_INTR(u4IntrStatus) \
  525. ((u4IntrStatus & WHISR_FW_OWN_BACK_INT) ? TRUE : FALSE)
  526. #define HAL_PUT_MAILBOX(prAdapter, u4MboxId, u4Data) \
  527. { \
  528. ASSERT(u4MboxId < 2); \
  529. HAL_MCR_WR(prAdapter, \
  530. ((u4MboxId == 0) ? MCR_H2DSM0R : MCR_H2DSM1R), \
  531. u4Data); \
  532. }
  533. #define HAL_GET_MAILBOX(prAdapter, u4MboxId, pu4Data) \
  534. { \
  535. ASSERT(u4MboxId < 2); \
  536. HAL_MCR_RD(prAdapter, \
  537. ((u4MboxId == 0) ? MCR_D2HRM0R : MCR_D2HRM1R), \
  538. pu4Data); \
  539. }
  540. #define HAL_SET_MAILBOX_READ_CLEAR(prAdapter, fgEnableReadClear) \
  541. { \
  542. UINT_32 u4Value; \
  543. HAL_MCR_RD(prAdapter, MCR_WHCR, &u4Value);\
  544. HAL_MCR_WR(prAdapter, MCR_WHCR, \
  545. (fgEnableReadClear) ? \
  546. (u4Value | WHCR_W_MAILBOX_RD_CLR_EN) : \
  547. (u4Value & ~WHCR_W_MAILBOX_RD_CLR_EN)); \
  548. prAdapter->prGlueInfo->rHifInfo.fgMbxReadClear = fgEnableReadClear;\
  549. }
  550. #define HAL_GET_MAILBOX_READ_CLEAR(prAdapter) (prAdapter->prGlueInfo->rHifInfo.fgMbxReadClear)
  551. /*******************************************************************************
  552. * F U N C T I O N D E C L A R A T I O N S
  553. ********************************************************************************
  554. */
  555. /*******************************************************************************
  556. * F U N C T I O N S
  557. ********************************************************************************
  558. */
  559. #endif /* _HAL_H */