hal.h 20 KB

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