halmac_api_88xx_sdio.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975
  1. #include "halmac_88xx_cfg.h"
  2. /**
  3. * halmac_init_sdio_cfg_88xx() - init SDIO
  4. * @pHalmac_adapter : the adapter of halmac
  5. * Author : KaiYuan Chang/Ivan Lin
  6. * Return : HALMAC_RET_STATUS
  7. * More details of status code can be found in prototype document
  8. */
  9. HALMAC_RET_STATUS
  10. halmac_init_sdio_cfg_88xx(
  11. IN PHALMAC_ADAPTER pHalmac_adapter
  12. )
  13. {
  14. VOID *pDriver_adapter = NULL;
  15. PHALMAC_API pHalmac_api;
  16. u8 data[16] = {0};
  17. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  18. return HALMAC_RET_ADAPTER_INVALID;
  19. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  20. return HALMAC_RET_API_INVALID;
  21. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_INIT_SDIO_CFG);
  22. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  23. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  24. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_sdio_cfg_88xx ==========>\n");
  25. HALMAC_REG_READ_32(pHalmac_adapter, REG_SDIO_FREE_TXPG);
  26. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_SDIO_TX_CTRL, 0x00000000);
  27. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_sdio_cfg_88xx <==========\n");
  28. return HALMAC_RET_SUCCESS;
  29. }
  30. /**
  31. * halmac_deinit_sdio_cfg_88xx() - deinit SDIO
  32. * @pHalmac_adapter : the adapter of halmac
  33. * Author : KaiYuan Chang/Ivan Lin
  34. * Return : HALMAC_RET_STATUS
  35. * More details of status code can be found in prototype document
  36. */
  37. HALMAC_RET_STATUS
  38. halmac_deinit_sdio_cfg_88xx(
  39. IN PHALMAC_ADAPTER pHalmac_adapter
  40. )
  41. {
  42. VOID *pDriver_adapter = NULL;
  43. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  44. return HALMAC_RET_ADAPTER_INVALID;
  45. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  46. return HALMAC_RET_API_INVALID;
  47. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_DEINIT_SDIO_CFG);
  48. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  49. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_deinit_sdio_cfg_88xx ==========>\n");
  50. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_deinit_sdio_cfg_88xx <==========\n");
  51. return HALMAC_RET_SUCCESS;
  52. }
  53. /**
  54. * halmac_cfg_rx_aggregation_88xx_sdio() - config rx aggregation
  55. * @pHalmac_adapter : the adapter of halmac
  56. * @halmac_rx_agg_mode
  57. * Author : KaiYuan Chang/Ivan Lin
  58. * Return : HALMAC_RET_STATUS
  59. * More details of status code can be found in prototype document
  60. */
  61. HALMAC_RET_STATUS
  62. halmac_cfg_rx_aggregation_88xx_sdio(
  63. IN PHALMAC_ADAPTER pHalmac_adapter,
  64. IN PHALMAC_RXAGG_CFG phalmac_rxagg_cfg
  65. )
  66. {
  67. u8 value8;
  68. u8 size = 0, timeout = 0, agg_enable = 0;
  69. VOID *pDriver_adapter = NULL;
  70. PHALMAC_API pHalmac_api;
  71. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  72. return HALMAC_RET_ADAPTER_INVALID;
  73. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  74. return HALMAC_RET_API_INVALID;
  75. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_RX_AGGREGATION);
  76. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  77. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  78. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_rx_aggregation_88xx_sdio ==========>\n");
  79. agg_enable = HALMAC_REG_READ_8(pHalmac_adapter, REG_TXDMA_PQ_MAP);
  80. switch (phalmac_rxagg_cfg->mode) {
  81. case HALMAC_RX_AGG_MODE_NONE:
  82. agg_enable &= ~(BIT_RXDMA_AGG_EN);
  83. break;
  84. case HALMAC_RX_AGG_MODE_DMA:
  85. case HALMAC_RX_AGG_MODE_USB:
  86. agg_enable |= BIT_RXDMA_AGG_EN;
  87. break;
  88. default:
  89. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_cfg_rx_aggregation_88xx_usb switch case not support\n");
  90. agg_enable &= ~BIT_RXDMA_AGG_EN;
  91. break;
  92. }
  93. if (_FALSE == phalmac_rxagg_cfg->threshold.drv_define) {
  94. size = 0xFF;
  95. timeout = 0x01;
  96. } else {
  97. size = phalmac_rxagg_cfg->threshold.size;
  98. timeout = phalmac_rxagg_cfg->threshold.timeout;
  99. }
  100. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TXDMA_PQ_MAP, agg_enable);
  101. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_RXDMA_AGG_PG_TH, (u16)(size | (timeout << BIT_SHIFT_DMA_AGG_TO_V1)));
  102. value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_RXDMA_MODE);
  103. if (0 != (agg_enable & BIT_RXDMA_AGG_EN))
  104. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_RXDMA_MODE, value8 | BIT_DMA_MODE);
  105. else
  106. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_RXDMA_MODE, value8 & ~(BIT_DMA_MODE));
  107. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_rx_aggregation_88xx_sdio <==========\n");
  108. return HALMAC_RET_SUCCESS;
  109. }
  110. /**
  111. * halmac_reg_read_8_sdio_88xx() - read 1byte register
  112. * @pHalmac_adapter : the adapter of halmac
  113. * @halmac_offset : register offset
  114. * Author : KaiYuan Chang/Ivan Lin
  115. * Return : HALMAC_RET_STATUS
  116. * More details of status code can be found in prototype document
  117. */
  118. u8
  119. halmac_reg_read_8_sdio_88xx(
  120. IN PHALMAC_ADAPTER pHalmac_adapter,
  121. IN u32 halmac_offset
  122. )
  123. {
  124. u8 value8;
  125. VOID *pDriver_adapter = NULL;
  126. PHALMAC_API pHalmac_api;
  127. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  128. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  129. return HALMAC_RET_ADAPTER_INVALID;
  130. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  131. return HALMAC_RET_API_INVALID;
  132. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  133. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  134. if (0 == (halmac_offset & 0xFFFF0000))
  135. halmac_offset |= WLAN_IOREG_OFFSET;
  136. status = halmac_convert_to_sdio_bus_offset_88xx(pHalmac_adapter, &halmac_offset);
  137. if (HALMAC_RET_SUCCESS != status) {
  138. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_reg_read_8_sdio_88xx error = %x\n", status);
  139. return status;
  140. }
  141. value8 = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset);
  142. return value8;
  143. }
  144. /**
  145. * halmac_reg_write_8_sdio_88xx() - write 1byte register
  146. * @pHalmac_adapter : the adapter of halmac
  147. * @halmac_offset : register offset
  148. * @halmac_data : register value
  149. * Author : KaiYuan Chang/Ivan Lin
  150. * Return : HALMAC_RET_STATUS
  151. * More details of status code can be found in prototype document
  152. */
  153. HALMAC_RET_STATUS
  154. halmac_reg_write_8_sdio_88xx(
  155. IN PHALMAC_ADAPTER pHalmac_adapter,
  156. IN u32 halmac_offset,
  157. IN u8 halmac_data
  158. )
  159. {
  160. VOID *pDriver_adapter = NULL;
  161. PHALMAC_API pHalmac_api;
  162. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  163. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  164. return HALMAC_RET_ADAPTER_INVALID;
  165. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  166. return HALMAC_RET_API_INVALID;
  167. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  168. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  169. if (0 == (halmac_offset & 0xFFFF0000))
  170. halmac_offset |= WLAN_IOREG_OFFSET;
  171. status = halmac_convert_to_sdio_bus_offset_88xx(pHalmac_adapter, &halmac_offset);
  172. if (HALMAC_RET_SUCCESS != status) {
  173. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_reg_write_8_sdio_88xx error = %x\n", status);
  174. return status;
  175. }
  176. PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset, halmac_data);
  177. return HALMAC_RET_SUCCESS;
  178. }
  179. /**
  180. * halmac_reg_read_16_sdio_88xx() - read 2byte register
  181. * @pHalmac_adapter : the adapter of halmac
  182. * @halmac_offset : register offset
  183. * Author : KaiYuan Chang/Ivan Lin
  184. * Return : HALMAC_RET_STATUS
  185. * More details of status code can be found in prototype document
  186. */
  187. u16
  188. halmac_reg_read_16_sdio_88xx(
  189. IN PHALMAC_ADAPTER pHalmac_adapter,
  190. IN u32 halmac_offset
  191. )
  192. {
  193. VOID *pDriver_adapter = NULL;
  194. PHALMAC_API pHalmac_api;
  195. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  196. u32 halmac_offset_old = 0;
  197. union {
  198. u16 word;
  199. u8 byte[2];
  200. } value16 = { 0x0000 };
  201. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  202. return HALMAC_RET_ADAPTER_INVALID;
  203. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  204. return HALMAC_RET_API_INVALID;
  205. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  206. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  207. halmac_offset_old = halmac_offset;
  208. if (0 == (halmac_offset & 0xFFFF0000))
  209. halmac_offset |= WLAN_IOREG_OFFSET;
  210. status = halmac_convert_to_sdio_bus_offset_88xx(pHalmac_adapter, &halmac_offset);
  211. if (HALMAC_RET_SUCCESS != status) {
  212. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_reg_read_16_sdio_88xx error = %x\n", status);
  213. return status;
  214. }
  215. if ((HALMAC_MAC_POWER_OFF == pHalmac_adapter->halmac_state.mac_power) || (0 != (halmac_offset & (2 - 1))) ||
  216. (HALMAC_SDIO_CMD53_4BYTE_MODE_RW == pHalmac_adapter->sdio_cmd53_4byte) || (HALMAC_SDIO_CMD53_4BYTE_MODE_R == pHalmac_adapter->sdio_cmd53_4byte)) {
  217. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "[WARN]use cmd52, offset = %x\n", halmac_offset);
  218. value16.byte[0] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset);
  219. value16.byte[1] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset + 1);
  220. value16.word = rtk_le16_to_cpu(value16.word);
  221. } else {
  222. if (pHalmac_adapter->sdio_hw_info.io_hi_speed_flag != 0) {
  223. if ((halmac_offset_old & 0xffffef00) == 0x00000000) {
  224. value16.byte[0] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset);
  225. value16.byte[1] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset + 1);
  226. value16.word = rtk_le16_to_cpu(value16.word);
  227. } else {
  228. value16.word = PLATFORM_SDIO_CMD53_READ_16(pDriver_adapter, halmac_offset);
  229. }
  230. } else {
  231. value16.word = PLATFORM_SDIO_CMD53_READ_16(pDriver_adapter, halmac_offset);
  232. }
  233. }
  234. return value16.word;
  235. }
  236. /**
  237. * halmac_reg_write_16_sdio_88xx() - write 2byte register
  238. * @pHalmac_adapter : the adapter of halmac
  239. * @halmac_offset : register offset
  240. * @halmac_data : register value
  241. * Author : KaiYuan Chang/Ivan Lin
  242. * Return : HALMAC_RET_STATUS
  243. * More details of status code can be found in prototype document
  244. */
  245. HALMAC_RET_STATUS
  246. halmac_reg_write_16_sdio_88xx(
  247. IN PHALMAC_ADAPTER pHalmac_adapter,
  248. IN u32 halmac_offset,
  249. IN u16 halmac_data
  250. )
  251. {
  252. VOID *pDriver_adapter = NULL;
  253. PHALMAC_API pHalmac_api;
  254. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  255. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  256. return HALMAC_RET_ADAPTER_INVALID;
  257. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  258. return HALMAC_RET_API_INVALID;
  259. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  260. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  261. if (0 == (halmac_offset & 0xFFFF0000))
  262. halmac_offset |= WLAN_IOREG_OFFSET;
  263. status = halmac_convert_to_sdio_bus_offset_88xx(pHalmac_adapter, &halmac_offset);
  264. if (HALMAC_RET_SUCCESS != status) {
  265. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_reg_write_16_sdio_88xx error = %x\n", status);
  266. return status;
  267. }
  268. if ((HALMAC_MAC_POWER_OFF == pHalmac_adapter->halmac_state.mac_power) || (0 != (halmac_offset & (2 - 1))) ||
  269. (HALMAC_SDIO_CMD53_4BYTE_MODE_RW == pHalmac_adapter->sdio_cmd53_4byte) || (HALMAC_SDIO_CMD53_4BYTE_MODE_W == pHalmac_adapter->sdio_cmd53_4byte)) {
  270. PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset, (u8)(halmac_data & 0xFF));
  271. PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset + 1, (u8)((halmac_data & 0xFF00) >> 8));
  272. } else {
  273. PLATFORM_SDIO_CMD53_WRITE_16(pDriver_adapter, halmac_offset, halmac_data);
  274. }
  275. return HALMAC_RET_SUCCESS;
  276. }
  277. /**
  278. * halmac_reg_read_32_sdio_88xx() - read 4byte register
  279. * @pHalmac_adapter : the adapter of halmac
  280. * @halmac_offset : register offset
  281. * Author : KaiYuan Chang/Ivan Lin
  282. * Return : HALMAC_RET_STATUS
  283. * More details of status code can be found in prototype document
  284. */
  285. u32
  286. halmac_reg_read_32_sdio_88xx(
  287. IN PHALMAC_ADAPTER pHalmac_adapter,
  288. IN u32 halmac_offset
  289. )
  290. {
  291. VOID *pDriver_adapter = NULL;
  292. PHALMAC_API pHalmac_api;
  293. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  294. u32 halmac_offset_old = 0;
  295. union {
  296. u32 dword;
  297. u8 byte[4];
  298. } value32 = { 0x00000000 };
  299. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  300. return HALMAC_RET_ADAPTER_INVALID;
  301. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  302. return HALMAC_RET_API_INVALID;
  303. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  304. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  305. halmac_offset_old = halmac_offset;
  306. if (0 == (halmac_offset & 0xFFFF0000))
  307. halmac_offset |= WLAN_IOREG_OFFSET;
  308. status = halmac_convert_to_sdio_bus_offset_88xx(pHalmac_adapter, &halmac_offset);
  309. if (HALMAC_RET_SUCCESS != status) {
  310. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_reg_read_32_sdio_88xx error = %x\n", status);
  311. return status;
  312. }
  313. if (HALMAC_MAC_POWER_OFF == pHalmac_adapter->halmac_state.mac_power || 0 != (halmac_offset & (4 - 1))) {
  314. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "[WARN]use cmd52, offset = %x\n", halmac_offset);
  315. value32.byte[0] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset);
  316. value32.byte[1] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset + 1);
  317. value32.byte[2] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset + 2);
  318. value32.byte[3] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset + 3);
  319. value32.dword = rtk_le32_to_cpu(value32.dword);
  320. } else {
  321. if (pHalmac_adapter->sdio_hw_info.io_hi_speed_flag != 0) {
  322. if ((halmac_offset_old & 0xffffef00) == 0x00000000) {
  323. value32.byte[0] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset);
  324. value32.byte[1] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset + 1);
  325. value32.byte[2] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset + 2);
  326. value32.byte[3] = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset + 3);
  327. value32.dword = rtk_le32_to_cpu(value32.dword);
  328. } else {
  329. value32.dword = PLATFORM_SDIO_CMD53_READ_32(pDriver_adapter, halmac_offset);
  330. }
  331. } else {
  332. value32.dword = PLATFORM_SDIO_CMD53_READ_32(pDriver_adapter, halmac_offset);
  333. }
  334. }
  335. return value32.dword;
  336. }
  337. /**
  338. * halmac_reg_write_32_sdio_88xx() - write 4byte register
  339. * @pHalmac_adapter : the adapter of halmac
  340. * @halmac_offset : register offset
  341. * @halmac_data : register value
  342. * Author : KaiYuan Chang/Ivan Lin
  343. * Return : HALMAC_RET_STATUS
  344. * More details of status code can be found in prototype document
  345. */
  346. HALMAC_RET_STATUS
  347. halmac_reg_write_32_sdio_88xx(
  348. IN PHALMAC_ADAPTER pHalmac_adapter,
  349. IN u32 halmac_offset,
  350. IN u32 halmac_data
  351. )
  352. {
  353. VOID *pDriver_adapter = NULL;
  354. PHALMAC_API pHalmac_api;
  355. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  356. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  357. return HALMAC_RET_ADAPTER_INVALID;
  358. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  359. return HALMAC_RET_API_INVALID;
  360. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  361. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  362. if (0 == (halmac_offset & 0xFFFF0000))
  363. halmac_offset |= WLAN_IOREG_OFFSET;
  364. status = halmac_convert_to_sdio_bus_offset_88xx(pHalmac_adapter, &halmac_offset);
  365. if (HALMAC_RET_SUCCESS != status) {
  366. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_reg_write_32_sdio_88xx error = %x\n", status);
  367. return status;
  368. }
  369. if (HALMAC_MAC_POWER_OFF == pHalmac_adapter->halmac_state.mac_power || 0 != (halmac_offset & (4 - 1))) {
  370. PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset, (u8)(halmac_data & 0xFF));
  371. PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset + 1, (u8)((halmac_data & 0xFF00) >> 8));
  372. PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset + 2, (u8)((halmac_data & 0xFF0000) >> 16));
  373. PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset + 3, (u8)((halmac_data & 0xFF000000) >> 24));
  374. } else {
  375. PLATFORM_SDIO_CMD53_WRITE_32(pDriver_adapter, halmac_offset, halmac_data);
  376. }
  377. return HALMAC_RET_SUCCESS;
  378. }
  379. /**
  380. * halmac_reg_read_nbyte_sdio_88xx() - read n byte register
  381. * @pHalmac_adapter : the adapter of halmac
  382. * @halmac_offset : register offset
  383. * @halmac_size : register value size
  384. * @halmac_data : register value
  385. * Author : Soar
  386. * Return : HALMAC_RET_STATUS
  387. * More details of status code can be found in prototype document
  388. */
  389. u8
  390. halmac_reg_read_nbyte_sdio_88xx(
  391. IN PHALMAC_ADAPTER pHalmac_adapter,
  392. IN u32 halmac_offset,
  393. IN u32 halmac_size,
  394. OUT u8 *halmac_data
  395. )
  396. {
  397. u8 rtemp = 0xFF;
  398. u32 counter = 1000;
  399. VOID *pDriver_adapter = NULL;
  400. PHALMAC_API pHalmac_api;
  401. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  402. union {
  403. u32 dword;
  404. u8 byte[4];
  405. } value32 = { 0x00000000 };
  406. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  407. return HALMAC_RET_ADAPTER_INVALID;
  408. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  409. return HALMAC_RET_API_INVALID;
  410. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  411. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  412. if (0 == (halmac_offset & 0xFFFF0000)) {
  413. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_offset error = 0x%x\n", halmac_offset);
  414. return HALMAC_RET_FAIL;
  415. }
  416. status = halmac_convert_to_sdio_bus_offset_88xx(pHalmac_adapter, &halmac_offset);
  417. if (HALMAC_RET_SUCCESS != status) {
  418. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_reg_read_nbyte_sdio_88xx error = %x\n", status);
  419. return status;
  420. }
  421. if (HALMAC_MAC_POWER_OFF == pHalmac_adapter->halmac_state.mac_power) {
  422. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_state error = 0x%x\n", pHalmac_adapter->halmac_state.mac_power);
  423. return HALMAC_RET_FAIL;
  424. }
  425. PLATFORM_SDIO_CMD53_READ_N(pDriver_adapter, halmac_offset, halmac_size, halmac_data);
  426. return HALMAC_RET_SUCCESS;
  427. }
  428. /**
  429. * halmac_get_sdio_tx_addr_sdio_88xx() - get CMD53 addr for the TX packet
  430. * @pHalmac_adapter : the adapter of halmac
  431. * @halmac_buf : tx packet, include txdesc
  432. * @halmac_size : tx packet size
  433. * @pcmd53_addr : cmd53 addr value
  434. * Author : KaiYuan Chang/Ivan Lin
  435. * Return : HALMAC_RET_STATUS
  436. * More details of status code can be found in prototype document
  437. */
  438. HALMAC_RET_STATUS
  439. halmac_get_sdio_tx_addr_88xx(
  440. IN PHALMAC_ADAPTER pHalmac_adapter,
  441. IN u8 *halmac_buf,
  442. IN u32 halmac_size,
  443. OUT u32 *pcmd53_addr
  444. )
  445. {
  446. u32 four_byte_len;
  447. VOID *pDriver_adapter = NULL;
  448. PHALMAC_API pHalmac_api;
  449. HALMAC_QUEUE_SELECT queue_sel;
  450. HALMAC_DMA_MAPPING dma_mapping;
  451. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  452. return HALMAC_RET_ADAPTER_INVALID;
  453. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  454. return HALMAC_RET_API_INVALID;
  455. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_GET_SDIO_TX_ADDR);
  456. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  457. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  458. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_get_sdio_tx_addr_88xx ==========>\n");
  459. if (NULL == halmac_buf) {
  460. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_buf is NULL!!\n");
  461. return HALMAC_RET_DATA_BUF_NULL;
  462. }
  463. if (0 == halmac_size) {
  464. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_size is 0!!\n");
  465. return HALMAC_RET_DATA_SIZE_INCORRECT;
  466. }
  467. queue_sel = (HALMAC_QUEUE_SELECT)GET_TX_DESC_QSEL(halmac_buf);
  468. switch (queue_sel) {
  469. case HALMAC_QUEUE_SELECT_VO:
  470. case HALMAC_QUEUE_SELECT_VO_V2:
  471. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO];
  472. break;
  473. case HALMAC_QUEUE_SELECT_VI:
  474. case HALMAC_QUEUE_SELECT_VI_V2:
  475. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI];
  476. break;
  477. case HALMAC_QUEUE_SELECT_BE:
  478. case HALMAC_QUEUE_SELECT_BE_V2:
  479. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE];
  480. break;
  481. case HALMAC_QUEUE_SELECT_BK:
  482. case HALMAC_QUEUE_SELECT_BK_V2:
  483. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK];
  484. break;
  485. case HALMAC_QUEUE_SELECT_MGNT:
  486. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG];
  487. break;
  488. case HALMAC_QUEUE_SELECT_HIGH:
  489. case HALMAC_QUEUE_SELECT_BCN:
  490. case HALMAC_QUEUE_SELECT_CMD:
  491. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI];
  492. break;
  493. default:
  494. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Qsel is out of range\n");
  495. return HALMAC_RET_QSEL_INCORRECT;
  496. }
  497. four_byte_len = (halmac_size >> 2) + ((halmac_size & (4 - 1)) ? 1 : 0);
  498. switch (dma_mapping) {
  499. case HALMAC_DMA_MAPPING_HIGH:
  500. *pcmd53_addr = HALMAC_SDIO_CMD_ADDR_TXFF_HIGH;
  501. break;
  502. case HALMAC_DMA_MAPPING_NORMAL:
  503. *pcmd53_addr = HALMAC_SDIO_CMD_ADDR_TXFF_NORMAL;
  504. break;
  505. case HALMAC_DMA_MAPPING_LOW:
  506. *pcmd53_addr = HALMAC_SDIO_CMD_ADDR_TXFF_LOW;
  507. break;
  508. case HALMAC_DMA_MAPPING_EXTRA:
  509. *pcmd53_addr = HALMAC_SDIO_CMD_ADDR_TXFF_EXTRA;
  510. break;
  511. default:
  512. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "DmaMapping is out of range\n");
  513. return HALMAC_RET_DMA_MAP_INCORRECT;
  514. }
  515. *pcmd53_addr = (*pcmd53_addr << 13) | (four_byte_len & HALMAC_SDIO_4BYTE_LEN_MASK);
  516. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_get_sdio_tx_addr_88xx <==========\n");
  517. return HALMAC_RET_SUCCESS;
  518. }
  519. /**
  520. * halmac_cfg_tx_agg_align_sdio_88xx() -config sdio bus tx agg alignment
  521. * @pHalmac_adapter : the adapter of halmac
  522. * @enable : function enable(1)/disable(0)
  523. * @align_size : sdio bus tx agg alignment size (2^n, n = 3~11)
  524. * Author : Soar Tu
  525. * Return : HALMAC_RET_STATUS
  526. * More details of status code can be found in prototype document
  527. */
  528. HALMAC_RET_STATUS
  529. halmac_cfg_tx_agg_align_sdio_88xx(
  530. IN PHALMAC_ADAPTER pHalmac_adapter,
  531. IN u8 enable,
  532. IN u16 align_size
  533. )
  534. {
  535. PHALMAC_API pHalmac_api;
  536. VOID *pDriver_adapter = NULL;
  537. u8 i, align_size_ok = 0;
  538. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  539. return HALMAC_RET_ADAPTER_INVALID;
  540. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  541. return HALMAC_RET_API_INVALID;
  542. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_TX_AGG_ALIGN);
  543. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  544. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  545. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_tx_agg_align_sdio_88xx ==========>\n");
  546. if ((align_size & 0xF000) != 0) {
  547. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Align size is out of range\n");
  548. return HALMAC_RET_FAIL;
  549. }
  550. for (i = 3; i <= 11; i++) {
  551. if (align_size == 1 << i) {
  552. align_size_ok = 1;
  553. break;
  554. }
  555. }
  556. if (align_size_ok == 0) {
  557. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Align size is not 2^3 ~ 2^11\n");
  558. return HALMAC_RET_FAIL;
  559. }
  560. /*Keep sdio tx agg alignment size for driver query*/
  561. pHalmac_adapter->hw_config_info.tx_align_size = align_size;
  562. if (enable)
  563. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_RQPN_CTRL_2, 0x8000 | align_size);
  564. else
  565. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_RQPN_CTRL_2, align_size);
  566. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_tx_agg_align_sdio_88xx <==========\n");
  567. return HALMAC_RET_SUCCESS;
  568. }
  569. HALMAC_RET_STATUS
  570. halmac_cfg_tx_agg_align_sdio_not_support_88xx(
  571. IN PHALMAC_ADAPTER pHalmac_adapter,
  572. IN u8 enable,
  573. IN u16 align_size
  574. )
  575. {
  576. PHALMAC_API pHalmac_api;
  577. VOID *pDriver_adapter = NULL;
  578. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  579. return HALMAC_RET_ADAPTER_INVALID;
  580. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  581. return HALMAC_RET_API_INVALID;
  582. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_TX_AGG_ALIGN);
  583. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  584. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  585. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_tx_agg_align_sdio_not_support_88xx ==========>\n");
  586. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_tx_agg_align_sdio_not_support_88xx not support\n");
  587. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_tx_agg_align_sdio_not_support_88xx <==========\n");
  588. return HALMAC_RET_SUCCESS;
  589. }
  590. /**
  591. * halmac_tx_allowed_sdio_88xx() - check tx status
  592. * @pHalmac_adapter : the adapter of halmac
  593. * @pHalmac_buf : tx packet, include txdesc
  594. * @halmac_size : tx packet size, include txdesc
  595. * Author : Ivan Lin
  596. * Return : HALMAC_RET_STATUS
  597. * More details of status code can be found in prototype document
  598. */
  599. HALMAC_RET_STATUS
  600. halmac_tx_allowed_sdio_88xx(
  601. IN PHALMAC_ADAPTER pHalmac_adapter,
  602. IN u8 *pHalmac_buf,
  603. IN u32 halmac_size
  604. )
  605. {
  606. u8 *pCurr_packet;
  607. u16 *pCurr_free_space;
  608. u32 i, counter;
  609. u32 tx_agg_num, packet_size = 0;
  610. u32 tx_required_page_num, total_required_page_num = 0;
  611. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  612. VOID *pDriver_adapter = NULL;
  613. HALMAC_DMA_MAPPING dma_mapping;
  614. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  615. return HALMAC_RET_ADAPTER_INVALID;
  616. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  617. return HALMAC_RET_API_INVALID;
  618. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_TX_ALLOWED_SDIO);
  619. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  620. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_tx_allowed_sdio_88xx ==========>\n");
  621. tx_agg_num = GET_TX_DESC_DMA_TXAGG_NUM(pHalmac_buf);
  622. pCurr_packet = pHalmac_buf;
  623. tx_agg_num = (tx_agg_num == 0) ? 1 : tx_agg_num;
  624. switch ((HALMAC_QUEUE_SELECT)GET_TX_DESC_QSEL(pCurr_packet)) {
  625. case HALMAC_QUEUE_SELECT_VO:
  626. case HALMAC_QUEUE_SELECT_VO_V2:
  627. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO];
  628. break;
  629. case HALMAC_QUEUE_SELECT_VI:
  630. case HALMAC_QUEUE_SELECT_VI_V2:
  631. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI];
  632. break;
  633. case HALMAC_QUEUE_SELECT_BE:
  634. case HALMAC_QUEUE_SELECT_BE_V2:
  635. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE];
  636. break;
  637. case HALMAC_QUEUE_SELECT_BK:
  638. case HALMAC_QUEUE_SELECT_BK_V2:
  639. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK];
  640. break;
  641. case HALMAC_QUEUE_SELECT_MGNT:
  642. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG];
  643. break;
  644. case HALMAC_QUEUE_SELECT_HIGH:
  645. dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI];
  646. break;
  647. case HALMAC_QUEUE_SELECT_BCN:
  648. case HALMAC_QUEUE_SELECT_CMD:
  649. return HALMAC_RET_SUCCESS;
  650. default:
  651. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Qsel is out of range\n");
  652. return HALMAC_RET_QSEL_INCORRECT;
  653. }
  654. switch (dma_mapping) {
  655. case HALMAC_DMA_MAPPING_HIGH:
  656. pCurr_free_space = &(pHalmac_adapter->sdio_free_space.high_queue_number);
  657. break;
  658. case HALMAC_DMA_MAPPING_NORMAL:
  659. pCurr_free_space = &(pHalmac_adapter->sdio_free_space.normal_queue_number);
  660. break;
  661. case HALMAC_DMA_MAPPING_LOW:
  662. pCurr_free_space = &(pHalmac_adapter->sdio_free_space.low_queue_number);
  663. break;
  664. case HALMAC_DMA_MAPPING_EXTRA:
  665. pCurr_free_space = &(pHalmac_adapter->sdio_free_space.extra_queue_number);
  666. break;
  667. default:
  668. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "DmaMapping is out of range\n");
  669. return HALMAC_RET_DMA_MAP_INCORRECT;
  670. }
  671. for (i = 0; i < tx_agg_num; i++) {
  672. packet_size = GET_TX_DESC_TXPKTSIZE(pCurr_packet) + GET_TX_DESC_OFFSET(pCurr_packet) + (GET_TX_DESC_PKT_OFFSET(pCurr_packet) << 3);
  673. tx_required_page_num = (packet_size >> pHalmac_adapter->hw_config_info.page_size_2_power) + ((packet_size & (pHalmac_adapter->hw_config_info.page_size - 1)) ? 1 : 0);
  674. total_required_page_num += tx_required_page_num;
  675. packet_size = HALMAC_ALIGN(packet_size, 8);
  676. pCurr_packet += packet_size;
  677. }
  678. counter = 10;
  679. do {
  680. if ((u32)(*pCurr_free_space + pHalmac_adapter->sdio_free_space.public_queue_number) > total_required_page_num) {
  681. if (*pCurr_free_space >= total_required_page_num) {
  682. *pCurr_free_space -= (u16)total_required_page_num;
  683. } else {
  684. pHalmac_adapter->sdio_free_space.public_queue_number -= (u16)(total_required_page_num - *pCurr_free_space);
  685. *pCurr_free_space = 0;
  686. }
  687. status = halmac_check_oqt_88xx(pHalmac_adapter, tx_agg_num, pHalmac_buf);
  688. if (HALMAC_RET_SUCCESS != status)
  689. return status;
  690. break;
  691. } else {
  692. halmac_update_sdio_free_page_88xx(pHalmac_adapter);
  693. }
  694. counter--;
  695. if (0 == counter)
  696. return HALMAC_RET_FREE_SPACE_NOT_ENOUGH;
  697. } while (1);
  698. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_tx_allowed_sdio_88xx <==========\n");
  699. return HALMAC_RET_SUCCESS;
  700. }
  701. /**
  702. * halmac_reg_read_indirect_32_sdio_88xx() - read MAC reg by SDIO reg
  703. * @pHalmac_adapter : the adapter of halmac
  704. * @halmac_offset : register offset
  705. * Author : Soar
  706. * Return : HALMAC_RET_STATUS
  707. * More details of status code can be found in prototype document
  708. */
  709. u32
  710. halmac_reg_read_indirect_32_sdio_88xx(
  711. IN PHALMAC_ADAPTER pHalmac_adapter,
  712. IN u32 halmac_offset
  713. )
  714. {
  715. u8 rtemp;
  716. u32 counter = 1000;
  717. VOID *pDriver_adapter = NULL;
  718. union {
  719. u32 dword;
  720. u8 byte[4];
  721. } value32 = { 0x00000000 };
  722. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  723. return HALMAC_RET_ADAPTER_INVALID;
  724. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  725. return HALMAC_RET_API_INVALID;
  726. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  727. PLATFORM_SDIO_CMD53_WRITE_32(pDriver_adapter, (HALMAC_SDIO_CMD_ADDR_SDIO_REG << 13) | (REG_SDIO_INDIRECT_REG_CFG & HALMAC_SDIO_LOCAL_MSK), halmac_offset | BIT(19) | BIT(17));
  728. do {
  729. rtemp = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, (HALMAC_SDIO_CMD_ADDR_SDIO_REG << 13) | ((REG_SDIO_INDIRECT_REG_CFG + 2) & HALMAC_SDIO_LOCAL_MSK));
  730. counter--;
  731. } while (((rtemp & BIT(4)) != 0) && (counter > 0));
  732. value32.dword = PLATFORM_SDIO_CMD53_READ_32(pDriver_adapter, (HALMAC_SDIO_CMD_ADDR_SDIO_REG << 13) | (REG_SDIO_INDIRECT_REG_DATA & HALMAC_SDIO_LOCAL_MSK));
  733. return value32.dword;
  734. }
  735. /**
  736. * halmac_sdio_cmd53_4byte_88xx() - cmd53 only for 4byte len register IO
  737. * @pHalmac_adapter : the adapter of halmac
  738. * @enable : 1->CMD53 only use in 4byte reg, 0 : No limitation
  739. * Author : Ivan Lin/KaiYuan Chang
  740. * Return : HALMAC_RET_STATUS
  741. * More details of status code can be found in prototype document
  742. */
  743. HALMAC_RET_STATUS
  744. halmac_sdio_cmd53_4byte_88xx(
  745. IN PHALMAC_ADAPTER pHalmac_adapter,
  746. IN HALMAC_SDIO_CMD53_4BYTE_MODE cmd53_4byte_mode
  747. )
  748. {
  749. if (halmac_adapter_validate(pHalmac_adapter) != HALMAC_RET_SUCCESS)
  750. return HALMAC_RET_ADAPTER_INVALID;
  751. if (halmac_api_validate(pHalmac_adapter) != HALMAC_RET_SUCCESS)
  752. return HALMAC_RET_API_INVALID;
  753. if (pHalmac_adapter->halmac_interface != HALMAC_INTERFACE_SDIO)
  754. return HALMAC_RET_WRONG_INTF;
  755. pHalmac_adapter->sdio_cmd53_4byte = cmd53_4byte_mode;
  756. return HALMAC_RET_SUCCESS;
  757. }
  758. /**
  759. * halmac_sdio_hw_info_88xx() - info sdio hw info
  760. * @pHalmac_adapter : the adapter of halmac
  761. * @HALMAC_SDIO_CMD53_4BYTE_MODE :
  762. * clock_speed : sdio bus clock. Unit -> MHz
  763. * spec_ver : sdio spec version
  764. * Author : Ivan Lin
  765. * Return : HALMAC_RET_STATUS
  766. * More details of status code can be found in prototype document
  767. */
  768. HALMAC_RET_STATUS
  769. halmac_sdio_hw_info_88xx(
  770. IN PHALMAC_ADAPTER pHalmac_adapter,
  771. IN PHALMAC_SDIO_HW_INFO pSdio_hw_info
  772. )
  773. {
  774. VOID *pDriver_adapter = NULL;
  775. PHALMAC_API pHalmac_api;
  776. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  777. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  778. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_sdio_hw_info_88xx ==========>\n");
  779. if (halmac_adapter_validate(pHalmac_adapter) != HALMAC_RET_SUCCESS)
  780. return HALMAC_RET_ADAPTER_INVALID;
  781. if (halmac_api_validate(pHalmac_adapter) != HALMAC_RET_SUCCESS)
  782. return HALMAC_RET_API_INVALID;
  783. if (pHalmac_adapter->halmac_interface != HALMAC_INTERFACE_SDIO)
  784. return HALMAC_RET_WRONG_INTF;
  785. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]SDIO hw clock : %d, spec : %d\n", pSdio_hw_info->clock_speed, pSdio_hw_info->spec_ver);
  786. if (pSdio_hw_info->clock_speed > HALMAC_SDIO_CLOCK_SPEED_MAX_88XX)
  787. return HALMAC_RET_SDIO_CLOCK_ERR;
  788. if (pSdio_hw_info->clock_speed > HALMAC_SDIO_CLK_THRESHOLD_88XX)
  789. pHalmac_adapter->sdio_hw_info.io_hi_speed_flag = 1;
  790. pHalmac_adapter->sdio_hw_info.clock_speed = pSdio_hw_info->clock_speed;
  791. pHalmac_adapter->sdio_hw_info.spec_ver = pSdio_hw_info->spec_ver;
  792. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_sdio_hw_info_88xx <==========\n");
  793. return HALMAC_RET_SUCCESS;
  794. }