halmac_api.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. #include "halmac_2_platform.h"
  2. #include "halmac_type.h"
  3. #if HALMAC_PLATFORM_WINDOWS == 1
  4. #if HALMAC_8822B_SUPPORT
  5. #include "halmac_88xx/halmac_api_win8822b.h"
  6. #include "halmac_88xx/halmac_win8822b_cfg.h"
  7. #endif
  8. #if HALMAC_8821C_SUPPORT
  9. #include "halmac_88xx/halmac_api_win8821c.h"
  10. #include "halmac_88xx/halmac_win8821c_cfg.h"
  11. #endif
  12. #else
  13. #include "halmac_88xx/halmac_api_88xx.h"
  14. #include "halmac_88xx/halmac_88xx_cfg.h"
  15. #endif
  16. #if HALMAC_8822B_SUPPORT
  17. #include "halmac_88xx/halmac_8822b/halmac_8822b_cfg.h"
  18. #endif
  19. #if HALMAC_8821C_SUPPORT
  20. #include "halmac_88xx/halmac_8821c/halmac_8821c_cfg.h"
  21. #endif
  22. HALMAC_RET_STATUS
  23. halmac_check_platform_api(
  24. IN VOID *pDriver_adapter,
  25. IN HALMAC_INTERFACE halmac_interface,
  26. IN PHALMAC_PLATFORM_API pHalmac_platform_api
  27. );
  28. HALMAC_RET_STATUS
  29. halmac_get_chip_info(
  30. IN VOID *pDriver_adapter,
  31. IN PHALMAC_PLATFORM_API pHalmac_platform_api,
  32. IN HALMAC_INTERFACE halmac_interface,
  33. IN PHALMAC_ADAPTER pHalmac_adapter
  34. );
  35. u8
  36. platform_reg_read_8_sdio(
  37. IN VOID *pDriver_adapter,
  38. IN PHALMAC_PLATFORM_API pHalmac_platform_api,
  39. IN u32 offset
  40. );
  41. HALMAC_RET_STATUS
  42. plarform_reg_write_8_sdio(
  43. IN VOID *pDriver_adapter,
  44. IN PHALMAC_PLATFORM_API pHalmac_platform_api,
  45. IN u32 offset,
  46. IN u8 data
  47. );
  48. HALMAC_RET_STATUS
  49. halmac_convert_to_sdio_bus_offset(
  50. INOUT u32 *halmac_offset
  51. );
  52. /**
  53. * halmac_init_adapter() - init halmac_adapter
  54. * @pDriver_adapter : the adapter of caller
  55. * @pHalmac_platform_api : the platform APIs which is used in halmac APIs
  56. * @halmac_interface : bus interface
  57. * @ppHalmac_adapter : the adapter of halmac
  58. * @ppHalmac_api : the function pointer of APIs, caller shall call APIs by function pointer
  59. * Author : KaiYuan Chang / Ivan Lin
  60. * Return : HALMAC_RET_STATUS
  61. * More details of status code can be found in prototype document
  62. */
  63. HALMAC_RET_STATUS
  64. halmac_init_adapter(
  65. IN VOID *pDriver_adapter,
  66. IN PHALMAC_PLATFORM_API pHalmac_platform_api,
  67. IN HALMAC_INTERFACE halmac_interface,
  68. OUT PHALMAC_ADAPTER *ppHalmac_adapter,
  69. OUT PHALMAC_API *ppHalmac_api
  70. )
  71. {
  72. PHALMAC_ADAPTER pHalmac_adapter = (PHALMAC_ADAPTER)NULL;
  73. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  74. u8 *pBuf = NULL;
  75. #if HALMAC_PLATFORM_WINDOWS == 1
  76. u8 chip_id = 0;
  77. #endif
  78. union {
  79. u32 i;
  80. u8 x[4];
  81. } ENDIAN_CHECK = { 0x01000000 };
  82. status = halmac_check_platform_api(pDriver_adapter, halmac_interface, pHalmac_platform_api);
  83. if (HALMAC_RET_SUCCESS != status)
  84. return status;
  85. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ALWAYS, HALMAC_SVN_VER "\n");
  86. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ALWAYS, "HALMAC_MAJOR_VER = %x\n", HALMAC_MAJOR_VER);
  87. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ALWAYS, "HALMAC_PROTOTYPE_VER = %x\n", HALMAC_PROTOTYPE_VER);
  88. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ALWAYS, "HALMAC_MINOR_VER = %x\n", HALMAC_MINOR_VER);
  89. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ALWAYS, "HALMAC_PATCH_VER = %x\n", HALMAC_PATCH_VER);
  90. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_adapter_88xx ==========>\n");
  91. /* Check endian setting - Little endian : 1, Big endian : 0*/
  92. if (HALMAC_SYSTEM_ENDIAN == ENDIAN_CHECK.x[0]) {
  93. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Endian setting Err!!\n");
  94. return HALMAC_RET_ENDIAN_ERR;
  95. }
  96. pBuf = (u8 *)pHalmac_platform_api->RTL_MALLOC(pDriver_adapter, sizeof(HALMAC_ADAPTER));
  97. if (pBuf == NULL) {
  98. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Malloc HAL Adapter Err!!\n");
  99. return HALMAC_RET_MALLOC_FAIL;
  100. }
  101. pHalmac_platform_api->RTL_MEMSET(pDriver_adapter, pBuf, 0x00, sizeof(HALMAC_ADAPTER));
  102. pHalmac_adapter = (PHALMAC_ADAPTER)pBuf;
  103. /* return halmac adapter address to caller */
  104. *ppHalmac_adapter = pHalmac_adapter;
  105. /* Record caller info */
  106. pHalmac_adapter->pHalmac_platform_api = pHalmac_platform_api;
  107. pHalmac_adapter->pDriver_adapter = pDriver_adapter;
  108. halmac_interface = (HALMAC_INTERFACE_AXI == halmac_interface) ? HALMAC_INTERFACE_PCIE : halmac_interface;
  109. pHalmac_adapter->halmac_interface = halmac_interface;
  110. PLATFORM_MUTEX_INIT(pDriver_adapter, &(pHalmac_adapter->EfuseMutex));
  111. PLATFORM_MUTEX_INIT(pDriver_adapter, &(pHalmac_adapter->h2c_seq_mutex));
  112. /*Get Chip*/
  113. if (HALMAC_RET_SUCCESS != halmac_get_chip_info(pDriver_adapter, pHalmac_platform_api, halmac_interface, pHalmac_adapter)) {
  114. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "HALMAC_RET_CHIP_NOT_SUPPORT\n");
  115. return HALMAC_RET_CHIP_NOT_SUPPORT;
  116. }
  117. /* Assign function pointer to halmac API */
  118. #if HALMAC_PLATFORM_WINDOWS == 0
  119. halmac_init_adapter_para_88xx(pHalmac_adapter);
  120. status = halmac_mount_api_88xx(pHalmac_adapter);
  121. #else
  122. #if HALMAC_8822B_SUPPORT
  123. if (HALMAC_CHIP_ID_8822B == pHalmac_adapter->chip_id) {
  124. halmac_init_adapter_para_win8822b(pHalmac_adapter);
  125. status = halmac_mount_api_win8822b(pHalmac_adapter);
  126. }
  127. #endif
  128. #if HALMAC_8821C_SUPPORT
  129. if (HALMAC_CHIP_ID_8821C == pHalmac_adapter->chip_id) {
  130. halmac_init_adapter_para_win8821c(pHalmac_adapter);
  131. status = halmac_mount_api_win8821c(pHalmac_adapter);
  132. }
  133. #endif
  134. #endif
  135. /* Return halmac API function pointer */
  136. *ppHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  137. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_adapter_88xx <==========\n");
  138. return status;
  139. }
  140. /**
  141. * halmac_halt_api() - stop halmac_api action
  142. * @pHalmac_adapter : the adapter of halmac
  143. * Author : Ivan Lin
  144. * Return : HALMAC_RET_STATUS
  145. * More details of status code can be found in prototype document
  146. */
  147. HALMAC_RET_STATUS
  148. halmac_halt_api(
  149. IN PHALMAC_ADAPTER pHalmac_adapter
  150. )
  151. {
  152. VOID *pDriver_adapter = NULL;
  153. PHALMAC_PLATFORM_API pHalmac_platform_api = (PHALMAC_PLATFORM_API)NULL;
  154. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  155. return HALMAC_RET_ADAPTER_INVALID;
  156. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  157. pHalmac_platform_api = pHalmac_adapter->pHalmac_platform_api;
  158. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_halt_api ==========>\n");
  159. pHalmac_adapter->halmac_state.api_state = HALMAC_API_STATE_HALT;
  160. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_halt_api ==========>\n");
  161. return HALMAC_RET_SUCCESS;
  162. }
  163. /**
  164. * halmac_deinit_adapter() - deinit halmac adapter
  165. * @pHalmac_adapter : the adapter of halmac
  166. * Author : KaiYuan Chang / Ivan Lin
  167. * Return : HALMAC_RET_STATUS
  168. * More details of status code can be found in prototype document
  169. */
  170. HALMAC_RET_STATUS
  171. halmac_deinit_adapter(
  172. IN PHALMAC_ADAPTER pHalmac_adapter
  173. )
  174. {
  175. VOID *pDriver_adapter = NULL;
  176. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  177. return HALMAC_RET_ADAPTER_INVALID;
  178. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  179. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_deinit_adapter_88xx ==========>\n");
  180. PLATFORM_MUTEX_DEINIT(pDriver_adapter, &(pHalmac_adapter->EfuseMutex));
  181. PLATFORM_MUTEX_DEINIT(pDriver_adapter, &(pHalmac_adapter->h2c_seq_mutex));
  182. if (NULL != pHalmac_adapter->pHalEfuse_map) {
  183. PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter->pHalEfuse_map, pHalmac_adapter->hw_config_info.efuse_size);
  184. pHalmac_adapter->pHalEfuse_map = (u8 *)NULL;
  185. }
  186. if (NULL != pHalmac_adapter->halmac_state.psd_set.pData) {
  187. PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter->halmac_state.psd_set.pData, pHalmac_adapter->halmac_state.psd_set.data_size);
  188. pHalmac_adapter->halmac_state.psd_set.pData = (u8 *)NULL;
  189. }
  190. if (NULL != pHalmac_adapter->pHalmac_api) {
  191. PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter->pHalmac_api, sizeof(HALMAC_API));
  192. pHalmac_adapter->pHalmac_api = NULL;
  193. }
  194. pHalmac_adapter->pHalAdapter_backup = NULL;
  195. PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter, sizeof(HALMAC_ADAPTER));
  196. return HALMAC_RET_SUCCESS;
  197. }
  198. HALMAC_RET_STATUS
  199. halmac_check_platform_api(
  200. IN VOID *pDriver_adapter,
  201. IN HALMAC_INTERFACE halmac_interface,
  202. IN PHALMAC_PLATFORM_API pHalmac_platform_api
  203. )
  204. {
  205. VOID *pAdapter_Local = NULL;
  206. pAdapter_Local = pDriver_adapter;
  207. if (NULL == pHalmac_platform_api)
  208. return HALMAC_RET_PLATFORM_API_NULL;
  209. if (NULL == pHalmac_platform_api->MSG_PRINT)
  210. return HALMAC_RET_PLATFORM_API_NULL;
  211. if (HALMAC_INTERFACE_SDIO == halmac_interface) {
  212. if (NULL == pHalmac_platform_api->SDIO_CMD52_READ) {
  213. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD52_READ)\n");
  214. return HALMAC_RET_PLATFORM_API_NULL;
  215. }
  216. if (NULL == pHalmac_platform_api->SDIO_CMD53_READ_8) {
  217. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_READ_8)\n");
  218. return HALMAC_RET_PLATFORM_API_NULL;
  219. }
  220. if (NULL == pHalmac_platform_api->SDIO_CMD53_READ_16) {
  221. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_READ_16)\n");
  222. return HALMAC_RET_PLATFORM_API_NULL;
  223. }
  224. if (NULL == pHalmac_platform_api->SDIO_CMD53_READ_32) {
  225. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_READ_32)\n");
  226. return HALMAC_RET_PLATFORM_API_NULL;
  227. }
  228. if (NULL == pHalmac_platform_api->SDIO_CMD53_READ_N) {
  229. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_READ_N)\n");
  230. return HALMAC_RET_PLATFORM_API_NULL;
  231. }
  232. if (NULL == pHalmac_platform_api->SDIO_CMD52_WRITE) {
  233. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD52_WRITE)\n");
  234. return HALMAC_RET_PLATFORM_API_NULL;
  235. }
  236. if (NULL == pHalmac_platform_api->SDIO_CMD53_WRITE_8) {
  237. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_WRITE_8)\n");
  238. return HALMAC_RET_PLATFORM_API_NULL;
  239. }
  240. if (NULL == pHalmac_platform_api->SDIO_CMD53_WRITE_16) {
  241. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_WRITE_16)\n");
  242. return HALMAC_RET_PLATFORM_API_NULL;
  243. }
  244. if (NULL == pHalmac_platform_api->SDIO_CMD53_WRITE_32) {
  245. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_WRITE_32)\n");
  246. return HALMAC_RET_PLATFORM_API_NULL;
  247. }
  248. }
  249. if ((HALMAC_INTERFACE_USB == halmac_interface) || (HALMAC_INTERFACE_PCIE == halmac_interface)) {
  250. if (NULL == pHalmac_platform_api->REG_READ_8) {
  251. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_READ_8)\n");
  252. return HALMAC_RET_PLATFORM_API_NULL;
  253. }
  254. if (NULL == pHalmac_platform_api->REG_READ_16) {
  255. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_READ_16)\n");
  256. return HALMAC_RET_PLATFORM_API_NULL;
  257. }
  258. if (NULL == pHalmac_platform_api->REG_READ_32) {
  259. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_READ_32)\n");
  260. return HALMAC_RET_PLATFORM_API_NULL;
  261. }
  262. if (NULL == pHalmac_platform_api->REG_WRITE_8) {
  263. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_WRITE_8)\n");
  264. return HALMAC_RET_PLATFORM_API_NULL;
  265. }
  266. if (NULL == pHalmac_platform_api->REG_WRITE_16) {
  267. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_WRITE_16)\n");
  268. return HALMAC_RET_PLATFORM_API_NULL;
  269. }
  270. if (NULL == pHalmac_platform_api->REG_WRITE_32) {
  271. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_WRITE_32)\n");
  272. return HALMAC_RET_PLATFORM_API_NULL;
  273. }
  274. }
  275. if (NULL == pHalmac_platform_api->RTL_FREE) {
  276. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->RTL_FREE)\n");
  277. return HALMAC_RET_PLATFORM_API_NULL;
  278. }
  279. if (NULL == pHalmac_platform_api->RTL_MALLOC) {
  280. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->RTL_MALLOC)\n");
  281. return HALMAC_RET_PLATFORM_API_NULL;
  282. }
  283. if (NULL == pHalmac_platform_api->RTL_MEMCPY) {
  284. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->RTL_MEMCPY)\n");
  285. return HALMAC_RET_PLATFORM_API_NULL;
  286. }
  287. if (NULL == pHalmac_platform_api->RTL_MEMSET) {
  288. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->RTL_MEMSET)\n");
  289. return HALMAC_RET_PLATFORM_API_NULL;
  290. }
  291. if (NULL == pHalmac_platform_api->RTL_DELAY_US) {
  292. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->RTL_DELAY_US)\n");
  293. return HALMAC_RET_PLATFORM_API_NULL;
  294. }
  295. if (NULL == pHalmac_platform_api->MUTEX_INIT) {
  296. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->MUTEX_INIT)\n");
  297. return HALMAC_RET_PLATFORM_API_NULL;
  298. }
  299. if (NULL == pHalmac_platform_api->MUTEX_DEINIT) {
  300. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->MUTEX_DEINIT)\n");
  301. return HALMAC_RET_PLATFORM_API_NULL;
  302. }
  303. if (NULL == pHalmac_platform_api->MUTEX_LOCK) {
  304. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->MUTEX_LOCK)\n");
  305. return HALMAC_RET_PLATFORM_API_NULL;
  306. }
  307. if (NULL == pHalmac_platform_api->MUTEX_UNLOCK) {
  308. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->MUTEX_UNLOCK)\n");
  309. return HALMAC_RET_PLATFORM_API_NULL;
  310. }
  311. if (NULL == pHalmac_platform_api->EVENT_INDICATION) {
  312. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->EVENT_INDICATION)\n");
  313. return HALMAC_RET_PLATFORM_API_NULL;
  314. }
  315. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_check_platform_api ==========>\n");
  316. return HALMAC_RET_SUCCESS;
  317. }
  318. /**
  319. * halmac_get_version() - get HALMAC version
  320. * @version : return version of major, prototype and minor information
  321. * Author : KaiYuan Chang / Ivan Lin
  322. * Return : HALMAC_RET_STATUS
  323. * More details of status code can be found in prototype document
  324. */
  325. HALMAC_RET_STATUS
  326. halmac_get_version(
  327. OUT HALMAC_VER *version
  328. )
  329. {
  330. version->major_ver = (u8)HALMAC_MAJOR_VER;
  331. version->prototype_ver = (u8)HALMAC_PROTOTYPE_VER;
  332. version->minor_ver = (u8)HALMAC_MINOR_VER;
  333. return HALMAC_RET_SUCCESS;
  334. }
  335. HALMAC_RET_STATUS
  336. halmac_get_chip_info(
  337. IN VOID *pDriver_adapter,
  338. IN PHALMAC_PLATFORM_API pHalmac_platform_api,
  339. IN HALMAC_INTERFACE halmac_interface,
  340. IN PHALMAC_ADAPTER pHalmac_adapter
  341. )
  342. {
  343. PHALMAC_API pHalmac_api = (PHALMAC_API)NULL;
  344. u8 chip_id, chip_version;
  345. u32 polling_count;
  346. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  347. /* Get Chip_id and Chip_version */
  348. if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
  349. plarform_reg_write_8_sdio(pDriver_adapter, pHalmac_platform_api, REG_SDIO_HSUS_CTRL, platform_reg_read_8_sdio(pDriver_adapter, pHalmac_platform_api, REG_SDIO_HSUS_CTRL) & ~(BIT(0)));
  350. polling_count = 10000;
  351. while (!(platform_reg_read_8_sdio(pDriver_adapter, pHalmac_platform_api, REG_SDIO_HSUS_CTRL) & 0x02)) {
  352. polling_count--;
  353. if (polling_count == 0)
  354. return HALMAC_RET_SDIO_LEAVE_SUSPEND_FAIL;
  355. }
  356. chip_id = platform_reg_read_8_sdio(pDriver_adapter, pHalmac_platform_api, REG_SYS_CFG2);
  357. chip_version = platform_reg_read_8_sdio(pDriver_adapter, pHalmac_platform_api, REG_SYS_CFG1 + 1) >> 4;
  358. } else {
  359. chip_id = pHalmac_platform_api->REG_READ_8(pDriver_adapter, REG_SYS_CFG2);
  360. chip_version = pHalmac_platform_api->REG_READ_8(pDriver_adapter, REG_SYS_CFG1 + 1) >> 4;
  361. }
  362. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]Chip id : 0x%X\n", chip_id);
  363. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]Chip version : 0x%X\n", chip_version);
  364. pHalmac_adapter->chip_version = (HALMAC_CHIP_VER)chip_version;
  365. if (HALMAC_CHIP_ID_HW_DEF_8822B == chip_id)
  366. pHalmac_adapter->chip_id = HALMAC_CHIP_ID_8822B;
  367. else if (HALMAC_CHIP_ID_HW_DEF_8821C == chip_id)
  368. pHalmac_adapter->chip_id = HALMAC_CHIP_ID_8821C;
  369. else if (HALMAC_CHIP_ID_HW_DEF_8814B == chip_id)
  370. pHalmac_adapter->chip_id = HALMAC_CHIP_ID_8814B;
  371. else if (HALMAC_CHIP_ID_HW_DEF_8197F == chip_id)
  372. pHalmac_adapter->chip_id = HALMAC_CHIP_ID_8197F;
  373. else {
  374. pHalmac_adapter->chip_id = HALMAC_CHIP_ID_UNDEFINE;
  375. return HALMAC_RET_CHIP_NOT_SUPPORT;
  376. }
  377. return HALMAC_RET_SUCCESS;
  378. }
  379. u8
  380. platform_reg_read_8_sdio(
  381. IN VOID *pDriver_adapter,
  382. IN PHALMAC_PLATFORM_API pHalmac_platform_api,
  383. IN u32 offset
  384. )
  385. {
  386. u8 value8;
  387. u32 halmac_offset = offset;
  388. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  389. if (0 == (halmac_offset & 0xFFFF0000))
  390. halmac_offset |= WLAN_IOREG_OFFSET;
  391. status = halmac_convert_to_sdio_bus_offset(&halmac_offset);
  392. if (HALMAC_RET_SUCCESS != status) {
  393. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "platform_reg_read_8_sdio error = %x\n", status);
  394. return status;
  395. }
  396. value8 = pHalmac_platform_api->SDIO_CMD52_READ(pDriver_adapter, halmac_offset);
  397. return value8;
  398. }
  399. HALMAC_RET_STATUS
  400. plarform_reg_write_8_sdio(
  401. IN VOID *pDriver_adapter,
  402. IN PHALMAC_PLATFORM_API pHalmac_platform_api,
  403. IN u32 offset,
  404. IN u8 data
  405. )
  406. {
  407. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  408. u32 halmac_offset = offset;
  409. if (0 == (halmac_offset & 0xFFFF0000))
  410. halmac_offset |= WLAN_IOREG_OFFSET;
  411. status = halmac_convert_to_sdio_bus_offset(&halmac_offset);
  412. if (HALMAC_RET_SUCCESS != status) {
  413. pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_reg_write_8_sdio_88xx error = %x\n", status);
  414. return status;
  415. }
  416. pHalmac_platform_api->SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset, data);
  417. return HALMAC_RET_SUCCESS;
  418. }
  419. HALMAC_RET_STATUS
  420. halmac_convert_to_sdio_bus_offset(
  421. INOUT u32 *halmac_offset
  422. )
  423. {
  424. switch ((*halmac_offset) & 0xFFFF0000) {
  425. case WLAN_IOREG_OFFSET:
  426. *halmac_offset = (HALMAC_SDIO_CMD_ADDR_MAC_REG << 13) | (*halmac_offset & HALMAC_WLAN_MAC_REG_MSK);
  427. break;
  428. case SDIO_LOCAL_OFFSET:
  429. *halmac_offset = (HALMAC_SDIO_CMD_ADDR_SDIO_REG << 13) | (*halmac_offset & HALMAC_SDIO_LOCAL_MSK);
  430. break;
  431. default:
  432. *halmac_offset = 0xFFFFFFFF;
  433. return HALMAC_RET_CONVERT_SDIO_OFFSET_FAIL;
  434. }
  435. return HALMAC_RET_SUCCESS;
  436. }