halmac_init_8821c.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2016 - 2018 Realtek Corporation. All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. ******************************************************************************/
  15. #include "halmac_init_8821c.h"
  16. #include "halmac_8821c_cfg.h"
  17. #if HALMAC_PCIE_SUPPORT
  18. #include "halmac_pcie_8821c.h"
  19. #endif
  20. #if HALMAC_SDIO_SUPPORT
  21. #include "halmac_sdio_8821c.h"
  22. #endif
  23. #if HALMAC_USB_SUPPORT
  24. #include "halmac_usb_8821c.h"
  25. #endif
  26. #include "halmac_gpio_8821c.h"
  27. #include "halmac_common_8821c.h"
  28. #include "halmac_cfg_wmac_8821c.h"
  29. #include "../halmac_common_88xx.h"
  30. #include "../halmac_init_88xx.h"
  31. #if HALMAC_8821C_SUPPORT
  32. #define RSVD_PG_DRV_NUM 16
  33. #define RSVD_PG_H2C_EXTRAINFO_NUM 24
  34. #define RSVD_PG_H2C_STATICINFO_NUM 8
  35. #define RSVD_PG_H2CQ_NUM 8
  36. #define RSVD_PG_CPU_INSTRUCTION_NUM 0
  37. #define RSVD_PG_FW_TXBUF_NUM 4
  38. #define RSVD_PG_CSIBUF_NUM 0
  39. #define RSVD_PG_DLLB_NUM (TX_FIFO_SIZE_8821C / 3 >> \
  40. TX_PAGE_SIZE_SHIFT_88XX)
  41. #define MAC_TRX_ENABLE (BIT_HCI_TXDMA_EN | BIT_HCI_RXDMA_EN | BIT_TXDMA_EN | \
  42. BIT_RXDMA_EN | BIT_PROTOCOL_EN | BIT_SCHEDULE_EN | \
  43. BIT_MACTXEN | BIT_MACRXEN)
  44. #define BLK_DESC_NUM 0x3
  45. #define WLAN_SLOT_TIME 0x05
  46. #define WLAN_PIFS_TIME 0x19
  47. #define WLAN_SIFS_CCK_CONT_TX 0xA
  48. #define WLAN_SIFS_OFDM_CONT_TX 0xA
  49. #define WLAN_SIFS_CCK_TRX 0x10
  50. #define WLAN_SIFS_OFDM_TRX 0x10
  51. #define WLAN_VO_TXOP_LIMIT 0x186 /* unit : 32us */
  52. #define WLAN_VI_TXOP_LIMIT 0x3BC /* unit : 32us */
  53. #define WLAN_RDG_NAV 0x05
  54. #define WLAN_TXOP_NAV 0x1B
  55. #define WLAN_CCK_RX_TSF 0x30
  56. #define WLAN_OFDM_RX_TSF 0x30
  57. #define WLAN_TBTT_PROHIBIT 0x04 /* unit : 32us */
  58. #define WLAN_TBTT_HOLD_TIME 0x064 /* unit : 32us */
  59. #define WLAN_DRV_EARLY_INT 0x04
  60. #define WLAN_BCN_DMA_TIME 0x02
  61. #define WLAN_ACK_TO_CCK 0x40
  62. #define WLAN_RX_FILTER0 0x0FFFFFFF
  63. #define WLAN_RX_FILTER2 0xFFFF
  64. #define WLAN_RCR_CFG 0xE400220E
  65. #define WLAN_RXPKT_MAX_SZ 12288
  66. #define WLAN_RXPKT_MAX_SZ_512 (WLAN_RXPKT_MAX_SZ >> 9)
  67. #define WLAN_AMPDU_MAX_TIME 0x70
  68. #define WLAN_RTS_LEN_TH 0xFF
  69. #define WLAN_RTS_TX_TIME_TH 0x08
  70. #define WLAN_MAX_AGG_PKT_LIMIT 0x10
  71. #define WLAN_RTS_MAX_AGG_PKT_LIMIT 0x10
  72. #define WLAN_MAX_AGG_PKT_LIMIT_SDIO 0x2B
  73. #define WLAN_RTS_MAX_AGG_PKT_LIMIT_SDIO 0x2B
  74. #define WLAN_PRE_TXCNT_TIME_TH 0x1E4
  75. #define WALN_FAST_EDCA_VO_TH 0x06
  76. #define WLAN_FAST_EDCA_VI_TH 0x06
  77. #define WLAN_FAST_EDCA_BE_TH 0x06
  78. #define WLAN_FAST_EDCA_BK_TH 0x06
  79. #define WLAN_BAR_RETRY_LIMIT 0x01
  80. #define WLAN_RA_TRY_RATE_AGG_LIMIT 0x08
  81. #define WLAN_TX_FUNC_CFG1 0x30
  82. #define WLAN_TX_FUNC_CFG2 0x30
  83. #define WLAN_MAC_OPT_NORM_FUNC1 0x98
  84. #define WLAN_MAC_OPT_LB_FUNC1 0x80
  85. #define WLAN_MAC_OPT_FUNC2 0x30810041
  86. #define WLAN_SIFS_CFG (WLAN_SIFS_CCK_CONT_TX | \
  87. (WLAN_SIFS_OFDM_CONT_TX << BIT_SHIFT_SIFS_OFDM_CTX) | \
  88. (WLAN_SIFS_CCK_TRX << BIT_SHIFT_SIFS_CCK_TRX) | \
  89. (WLAN_SIFS_OFDM_TRX << BIT_SHIFT_SIFS_OFDM_TRX))
  90. #define WLAN_TBTT_TIME (WLAN_TBTT_PROHIBIT |\
  91. (WLAN_TBTT_HOLD_TIME << BIT_SHIFT_TBTT_HOLD_TIME_AP))
  92. #define WLAN_NAV_CFG (WLAN_RDG_NAV | (WLAN_TXOP_NAV << 16))
  93. #define WLAN_RX_TSF_CFG (WLAN_CCK_RX_TSF | (WLAN_OFDM_RX_TSF) << 8)
  94. #if HALMAC_PLATFORM_WINDOWS
  95. /*SDIO RQPN Mapping for Windows, extra queue is not implemented in Driver code*/
  96. static struct halmac_rqpn HALMAC_RQPN_SDIO_8821C[] = {
  97. /* { mode, vo_map, vi_map, be_map, bk_map, mg_map, hi_map } */
  98. {HALMAC_TRX_MODE_NORMAL,
  99. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  100. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  101. {HALMAC_TRX_MODE_TRXSHARE,
  102. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  103. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  104. {HALMAC_TRX_MODE_WMM,
  105. HALMAC_MAP2_HQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_NQ,
  106. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  107. {HALMAC_TRX_MODE_P2P,
  108. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  109. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  110. {HALMAC_TRX_MODE_LOOPBACK,
  111. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  112. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  113. {HALMAC_TRX_MODE_DELAY_LOOPBACK,
  114. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  115. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  116. };
  117. #else
  118. /*SDIO RQPN Mapping*/
  119. static struct halmac_rqpn HALMAC_RQPN_SDIO_8821C[] = {
  120. /* { mode, vo_map, vi_map, be_map, bk_map, mg_map, hi_map } */
  121. {HALMAC_TRX_MODE_NORMAL,
  122. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  123. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  124. {HALMAC_TRX_MODE_TRXSHARE,
  125. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  126. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  127. {HALMAC_TRX_MODE_WMM,
  128. HALMAC_MAP2_HQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_NQ,
  129. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  130. {HALMAC_TRX_MODE_P2P,
  131. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  132. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  133. {HALMAC_TRX_MODE_LOOPBACK,
  134. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  135. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  136. {HALMAC_TRX_MODE_DELAY_LOOPBACK,
  137. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  138. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  139. };
  140. #endif
  141. /*PCIE RQPN Mapping*/
  142. static struct halmac_rqpn HALMAC_RQPN_PCIE_8821C[] = {
  143. /* { mode, vo_map, vi_map, be_map, bk_map, mg_map, hi_map } */
  144. {HALMAC_TRX_MODE_NORMAL,
  145. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  146. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  147. {HALMAC_TRX_MODE_TRXSHARE,
  148. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  149. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  150. {HALMAC_TRX_MODE_WMM,
  151. HALMAC_MAP2_HQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_NQ,
  152. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  153. {HALMAC_TRX_MODE_P2P,
  154. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  155. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  156. {HALMAC_TRX_MODE_LOOPBACK,
  157. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  158. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  159. {HALMAC_TRX_MODE_DELAY_LOOPBACK,
  160. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  161. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  162. };
  163. /*USB 2 Bulkout RQPN Mapping*/
  164. static struct halmac_rqpn HALMAC_RQPN_2BULKOUT_8821C[] = {
  165. /* { mode, vo_map, vi_map, be_map, bk_map, mg_map, hi_map } */
  166. {HALMAC_TRX_MODE_NORMAL,
  167. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_HQ,
  168. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  169. {HALMAC_TRX_MODE_TRXSHARE,
  170. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_HQ,
  171. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  172. {HALMAC_TRX_MODE_WMM,
  173. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_HQ,
  174. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  175. {HALMAC_TRX_MODE_P2P,
  176. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ, HALMAC_MAP2_HQ, HALMAC_MAP2_NQ,
  177. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  178. {HALMAC_TRX_MODE_LOOPBACK,
  179. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ, HALMAC_MAP2_HQ, HALMAC_MAP2_NQ,
  180. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  181. {HALMAC_TRX_MODE_DELAY_LOOPBACK,
  182. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ, HALMAC_MAP2_HQ, HALMAC_MAP2_NQ,
  183. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  184. };
  185. /*USB 3 Bulkout RQPN Mapping*/
  186. static struct halmac_rqpn HALMAC_RQPN_3BULKOUT_8821C[] = {
  187. /* { mode, vo_map, vi_map, be_map, bk_map, mg_map, hi_map } */
  188. {HALMAC_TRX_MODE_NORMAL,
  189. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  190. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  191. {HALMAC_TRX_MODE_TRXSHARE,
  192. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  193. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  194. {HALMAC_TRX_MODE_WMM,
  195. HALMAC_MAP2_HQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_NQ,
  196. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  197. {HALMAC_TRX_MODE_P2P,
  198. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ, HALMAC_MAP2_LQ, HALMAC_MAP2_NQ,
  199. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  200. {HALMAC_TRX_MODE_LOOPBACK,
  201. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ, HALMAC_MAP2_LQ, HALMAC_MAP2_NQ,
  202. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  203. {HALMAC_TRX_MODE_DELAY_LOOPBACK,
  204. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ, HALMAC_MAP2_LQ, HALMAC_MAP2_NQ,
  205. HALMAC_MAP2_HQ, HALMAC_MAP2_HQ},
  206. };
  207. /*USB 4 Bulkout RQPN Mapping*/
  208. static struct halmac_rqpn HALMAC_RQPN_4BULKOUT_8821C[] = {
  209. /* { mode, vo_map, vi_map, be_map, bk_map, mg_map, hi_map } */
  210. {HALMAC_TRX_MODE_NORMAL,
  211. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  212. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  213. {HALMAC_TRX_MODE_TRXSHARE,
  214. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  215. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  216. {HALMAC_TRX_MODE_WMM,
  217. HALMAC_MAP2_HQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_NQ,
  218. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  219. {HALMAC_TRX_MODE_P2P,
  220. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  221. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  222. {HALMAC_TRX_MODE_LOOPBACK,
  223. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  224. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  225. {HALMAC_TRX_MODE_DELAY_LOOPBACK,
  226. HALMAC_MAP2_NQ, HALMAC_MAP2_NQ, HALMAC_MAP2_LQ, HALMAC_MAP2_LQ,
  227. HALMAC_MAP2_EXQ, HALMAC_MAP2_HQ},
  228. };
  229. #if HALMAC_PLATFORM_WINDOWS
  230. /*SDIO Page Number*/
  231. static struct halmac_pg_num HALMAC_PG_NUM_SDIO_8821C[] = {
  232. /* { mode, hq_num, nq_num, lq_num, exq_num, gap_num} */
  233. {HALMAC_TRX_MODE_NORMAL, 16, 16, 16, 0, 1},
  234. {HALMAC_TRX_MODE_TRXSHARE, 8, 8, 8, 0, 1},
  235. {HALMAC_TRX_MODE_WMM, 16, 16, 16, 0, 1},
  236. {HALMAC_TRX_MODE_P2P, 16, 16, 16, 0, 1},
  237. {HALMAC_TRX_MODE_LOOPBACK, 16, 16, 16, 0, 1},
  238. {HALMAC_TRX_MODE_DELAY_LOOPBACK, 16, 16, 16, 0, 1},
  239. };
  240. #else
  241. /*SDIO Page Number*/
  242. static struct halmac_pg_num HALMAC_PG_NUM_SDIO_8821C[] = {
  243. /* { mode, hq_num, nq_num, lq_num, exq_num, gap_num} */
  244. {HALMAC_TRX_MODE_NORMAL, 16, 16, 16, 14, 1},
  245. {HALMAC_TRX_MODE_TRXSHARE, 8, 8, 8, 8, 1},
  246. {HALMAC_TRX_MODE_WMM, 16, 16, 16, 14, 1},
  247. {HALMAC_TRX_MODE_P2P, 16, 16, 16, 14, 1},
  248. {HALMAC_TRX_MODE_LOOPBACK, 16, 16, 16, 14, 1},
  249. {HALMAC_TRX_MODE_DELAY_LOOPBACK, 16, 16, 16, 14, 1},
  250. };
  251. #endif
  252. /*PCIE Page Number*/
  253. static struct halmac_pg_num HALMAC_PG_NUM_PCIE_8821C[] = {
  254. /* { mode, hq_num, nq_num, lq_num, exq_num, gap_num} */
  255. {HALMAC_TRX_MODE_NORMAL, 16, 16, 16, 14, 1},
  256. {HALMAC_TRX_MODE_TRXSHARE, 16, 16, 16, 14, 1},
  257. {HALMAC_TRX_MODE_WMM, 16, 16, 16, 14, 1},
  258. {HALMAC_TRX_MODE_P2P, 16, 16, 16, 14, 1},
  259. {HALMAC_TRX_MODE_LOOPBACK, 16, 16, 16, 14, 1},
  260. {HALMAC_TRX_MODE_DELAY_LOOPBACK, 16, 16, 16, 14, 1},
  261. };
  262. /*USB 2 Bulkout Page Number*/
  263. static struct halmac_pg_num HALMAC_PG_NUM_2BULKOUT_8821C[] = {
  264. /* { mode, hq_num, nq_num, lq_num, exq_num, gap_num} */
  265. {HALMAC_TRX_MODE_NORMAL, 16, 16, 0, 0, 1},
  266. {HALMAC_TRX_MODE_TRXSHARE, 16, 16, 0, 0, 1},
  267. {HALMAC_TRX_MODE_WMM, 16, 16, 0, 0, 1},
  268. {HALMAC_TRX_MODE_P2P, 16, 16, 0, 0, 1},
  269. {HALMAC_TRX_MODE_LOOPBACK, 16, 16, 0, 0, 1},
  270. {HALMAC_TRX_MODE_DELAY_LOOPBACK, 16, 16, 0, 0, 1},
  271. };
  272. /*USB 3 Bulkout Page Number*/
  273. static struct halmac_pg_num HALMAC_PG_NUM_3BULKOUT_8821C[] = {
  274. /* { mode, hq_num, nq_num, lq_num, exq_num, gap_num} */
  275. {HALMAC_TRX_MODE_NORMAL, 16, 16, 16, 0, 1},
  276. {HALMAC_TRX_MODE_TRXSHARE, 16, 16, 16, 0, 1},
  277. {HALMAC_TRX_MODE_WMM, 16, 16, 16, 0, 1},
  278. {HALMAC_TRX_MODE_P2P, 16, 16, 16, 0, 1},
  279. {HALMAC_TRX_MODE_LOOPBACK, 16, 16, 16, 0, 1},
  280. {HALMAC_TRX_MODE_DELAY_LOOPBACK, 16, 16, 16, 0, 1},
  281. };
  282. /*USB 4 Bulkout Page Number*/
  283. static struct halmac_pg_num HALMAC_PG_NUM_4BULKOUT_8821C[] = {
  284. /* { mode, hq_num, nq_num, lq_num, exq_num, gap_num} */
  285. {HALMAC_TRX_MODE_NORMAL, 16, 16, 16, 14, 1},
  286. {HALMAC_TRX_MODE_TRXSHARE, 16, 16, 16, 14, 1},
  287. {HALMAC_TRX_MODE_WMM, 16, 16, 16, 14, 1},
  288. {HALMAC_TRX_MODE_P2P, 16, 16, 16, 14, 1},
  289. {HALMAC_TRX_MODE_LOOPBACK, 16, 16, 16, 14, 1},
  290. {HALMAC_TRX_MODE_DELAY_LOOPBACK, 16, 16, 16, 14, 1},
  291. };
  292. static enum halmac_ret_status
  293. txdma_queue_mapping_8821c(struct halmac_adapter *adapter,
  294. enum halmac_trx_mode mode);
  295. static enum halmac_ret_status
  296. priority_queue_cfg_8821c(struct halmac_adapter *adapter,
  297. enum halmac_trx_mode mode);
  298. static enum halmac_ret_status
  299. set_trx_fifo_info_8821c(struct halmac_adapter *adapter,
  300. enum halmac_trx_mode mode);
  301. enum halmac_ret_status
  302. mount_api_8821c(struct halmac_adapter *adapter)
  303. {
  304. struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
  305. adapter->chip_id = HALMAC_CHIP_ID_8821C;
  306. adapter->hw_cfg_info.efuse_size = EFUSE_SIZE_8821C;
  307. adapter->hw_cfg_info.eeprom_size = EEPROM_SIZE_8821C;
  308. adapter->hw_cfg_info.bt_efuse_size = BT_EFUSE_SIZE_8821C;
  309. adapter->hw_cfg_info.cam_entry_num = SEC_CAM_NUM_8821C;
  310. adapter->hw_cfg_info.tx_fifo_size = TX_FIFO_SIZE_8821C;
  311. adapter->hw_cfg_info.rx_fifo_size = RX_FIFO_SIZE_8821C;
  312. adapter->hw_cfg_info.ac_oqt_size = OQT_ENTRY_AC_8821C;
  313. adapter->hw_cfg_info.non_ac_oqt_size = OQT_ENTRY_NOAC_8821C;
  314. adapter->hw_cfg_info.usb_txagg_num = BLK_DESC_NUM;
  315. adapter->txff_alloc.rsvd_drv_pg_num = RSVD_PG_DRV_NUM;
  316. api->halmac_init_trx_cfg = init_trx_cfg_8821c;
  317. api->halmac_init_protocol_cfg = init_protocol_cfg_8821c;
  318. api->halmac_init_h2c = init_h2c_8821c;
  319. api->halmac_pinmux_get_func = pinmux_get_func_8821c;
  320. api->halmac_pinmux_set_func = pinmux_set_func_8821c;
  321. api->halmac_pinmux_free_func = pinmux_free_func_8821c;
  322. api->halmac_get_hw_value = get_hw_value_8821c;
  323. api->halmac_set_hw_value = set_hw_value_8821c;
  324. api->halmac_cfg_drv_info = cfg_drv_info_8821c;
  325. api->halmac_fill_txdesc_checksum = fill_txdesc_check_sum_8821c;
  326. api->halmac_init_low_pwr = init_low_pwr_8821c;
  327. api->halmac_init_wmac_cfg = init_wmac_cfg_8821c;
  328. api->halmac_init_edca_cfg = init_edca_cfg_8821c;
  329. if (adapter->intf == HALMAC_INTERFACE_SDIO) {
  330. #if HALMAC_SDIO_SUPPORT
  331. api->halmac_mac_power_switch = mac_pwr_switch_sdio_8821c;
  332. api->halmac_phy_cfg = phy_cfg_sdio_8821c;
  333. api->halmac_pcie_switch = pcie_switch_sdio_8821c;
  334. api->halmac_interface_integration_tuning = intf_tun_sdio_8821c;
  335. api->halmac_tx_allowed_sdio = tx_allowed_sdio_8821c;
  336. api->halmac_get_sdio_tx_addr = get_sdio_tx_addr_8821c;
  337. api->halmac_reg_read_8 = reg_r8_sdio_8821c;
  338. api->halmac_reg_write_8 = reg_w8_sdio_8821c;
  339. api->halmac_reg_read_16 = reg_r16_sdio_8821c;
  340. api->halmac_reg_write_16 = reg_w16_sdio_8821c;
  341. api->halmac_reg_read_32 = reg_r32_sdio_8821c;
  342. api->halmac_reg_write_32 = reg_w32_sdio_8821c;
  343. adapter->sdio_fs.macid_map_size = MACID_MAX_8821C * 2;
  344. if (!adapter->sdio_fs.macid_map) {
  345. adapter->sdio_fs.macid_map =
  346. (u8 *)PLTFM_MALLOC(adapter->sdio_fs.macid_map_size);
  347. if (!adapter->sdio_fs.macid_map)
  348. PLTFM_MSG_ERR("[ERR]mac id map malloc!!\n");
  349. }
  350. #endif
  351. } else if (adapter->intf == HALMAC_INTERFACE_USB) {
  352. #if HALMAC_USB_SUPPORT
  353. api->halmac_mac_power_switch = mac_pwr_switch_usb_8821c;
  354. api->halmac_phy_cfg = phy_cfg_usb_8821c;
  355. api->halmac_pcie_switch = pcie_switch_usb_8821c;
  356. api->halmac_interface_integration_tuning = intf_tun_usb_8821c;
  357. #endif
  358. } else if (adapter->intf == HALMAC_INTERFACE_PCIE) {
  359. #if HALMAC_PCIE_SUPPORT
  360. api->halmac_mac_power_switch = mac_pwr_switch_pcie_8821c;
  361. api->halmac_phy_cfg = phy_cfg_pcie_8821c;
  362. api->halmac_pcie_switch = pcie_switch_8821c;
  363. api->halmac_interface_integration_tuning = intf_tun_pcie_8821c;
  364. #endif
  365. } else {
  366. PLTFM_MSG_ERR("[ERR]Undefined IC\n");
  367. return HALMAC_RET_CHIP_NOT_SUPPORT;
  368. }
  369. return HALMAC_RET_SUCCESS;
  370. }
  371. /**
  372. * init_trx_cfg_8821c() - config trx dma register
  373. * @adapter : the adapter of halmac
  374. * @mode : trx mode selection
  375. * Author : KaiYuan Chang/Ivan Lin
  376. * Return : enum halmac_ret_status
  377. * More details of status code can be found in prototype document
  378. */
  379. enum halmac_ret_status
  380. init_trx_cfg_8821c(struct halmac_adapter *adapter, enum halmac_trx_mode mode)
  381. {
  382. u8 value8;
  383. struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
  384. enum halmac_ret_status status = HALMAC_RET_SUCCESS;
  385. PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__);
  386. adapter->trx_mode = mode;
  387. status = txdma_queue_mapping_8821c(adapter, mode);
  388. if (status != HALMAC_RET_SUCCESS) {
  389. PLTFM_MSG_ERR("[ERR]queue mapping\n");
  390. return status;
  391. }
  392. value8 = 0;
  393. HALMAC_REG_W8(REG_CR, value8);
  394. value8 = MAC_TRX_ENABLE;
  395. HALMAC_REG_W8(REG_CR, value8);
  396. HALMAC_REG_W32(REG_H2CQ_CSR, BIT(31));
  397. status = priority_queue_cfg_8821c(adapter, mode);
  398. if (status != HALMAC_RET_SUCCESS) {
  399. PLTFM_MSG_ERR("[ERR]priority queue cfg\n");
  400. return status;
  401. }
  402. if (adapter->txff_alloc.rx_fifo_exp_mode !=
  403. HALMAC_RX_FIFO_EXPANDING_MODE_DISABLE)
  404. HALMAC_REG_W8(REG_RX_DRVINFO_SZ, RX_DESC_DUMMY_SIZE_8821C >> 3);
  405. status = init_h2c_8821c(adapter);
  406. if (status != HALMAC_RET_SUCCESS) {
  407. PLTFM_MSG_ERR("[ERR]init h2cq!\n");
  408. return status;
  409. }
  410. PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__);
  411. return HALMAC_RET_SUCCESS;
  412. }
  413. static enum halmac_ret_status
  414. txdma_queue_mapping_8821c(struct halmac_adapter *adapter,
  415. enum halmac_trx_mode mode)
  416. {
  417. u16 value16;
  418. struct halmac_rqpn *cur_rqpn_sel = NULL;
  419. enum halmac_ret_status status;
  420. struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
  421. if (adapter->intf == HALMAC_INTERFACE_SDIO) {
  422. cur_rqpn_sel = HALMAC_RQPN_SDIO_8821C;
  423. } else if (adapter->intf == HALMAC_INTERFACE_PCIE) {
  424. cur_rqpn_sel = HALMAC_RQPN_PCIE_8821C;
  425. } else if (adapter->intf == HALMAC_INTERFACE_USB) {
  426. if (adapter->bulkout_num == 2) {
  427. cur_rqpn_sel = HALMAC_RQPN_2BULKOUT_8821C;
  428. } else if (adapter->bulkout_num == 3) {
  429. cur_rqpn_sel = HALMAC_RQPN_3BULKOUT_8821C;
  430. } else if (adapter->bulkout_num == 4) {
  431. cur_rqpn_sel = HALMAC_RQPN_4BULKOUT_8821C;
  432. } else {
  433. PLTFM_MSG_ERR("[ERR]invalid intf\n");
  434. return HALMAC_RET_NOT_SUPPORT;
  435. }
  436. } else {
  437. return HALMAC_RET_NOT_SUPPORT;
  438. }
  439. status = rqpn_parser_88xx(adapter, mode, cur_rqpn_sel);
  440. if (status != HALMAC_RET_SUCCESS)
  441. return status;
  442. value16 = 0;
  443. value16 |= BIT_TXDMA_HIQ_MAP(adapter->pq_map[HALMAC_PQ_MAP_HI]);
  444. value16 |= BIT_TXDMA_MGQ_MAP(adapter->pq_map[HALMAC_PQ_MAP_MG]);
  445. value16 |= BIT_TXDMA_BKQ_MAP(adapter->pq_map[HALMAC_PQ_MAP_BK]);
  446. value16 |= BIT_TXDMA_BEQ_MAP(adapter->pq_map[HALMAC_PQ_MAP_BE]);
  447. value16 |= BIT_TXDMA_VIQ_MAP(adapter->pq_map[HALMAC_PQ_MAP_VI]);
  448. value16 |= BIT_TXDMA_VOQ_MAP(adapter->pq_map[HALMAC_PQ_MAP_VO]);
  449. HALMAC_REG_W16(REG_TXDMA_PQ_MAP, value16);
  450. return HALMAC_RET_SUCCESS;
  451. }
  452. static enum halmac_ret_status
  453. priority_queue_cfg_8821c(struct halmac_adapter *adapter,
  454. enum halmac_trx_mode mode)
  455. {
  456. u8 transfer_mode = 0;
  457. u8 value8;
  458. u32 cnt;
  459. struct halmac_txff_allocation *txff_info = &adapter->txff_alloc;
  460. enum halmac_ret_status status;
  461. struct halmac_pg_num *cur_pg_num = NULL;
  462. struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
  463. status = set_trx_fifo_info_8821c(adapter, mode);
  464. if (status != HALMAC_RET_SUCCESS) {
  465. PLTFM_MSG_ERR("[ERR]set trx fifo!!\n");
  466. return status;
  467. }
  468. if (adapter->intf == HALMAC_INTERFACE_SDIO) {
  469. cur_pg_num = HALMAC_PG_NUM_SDIO_8821C;
  470. } else if (adapter->intf == HALMAC_INTERFACE_PCIE) {
  471. cur_pg_num = HALMAC_PG_NUM_PCIE_8821C;
  472. } else if (adapter->intf == HALMAC_INTERFACE_USB) {
  473. if (adapter->bulkout_num == 2) {
  474. cur_pg_num = HALMAC_PG_NUM_2BULKOUT_8821C;
  475. } else if (adapter->bulkout_num == 3) {
  476. cur_pg_num = HALMAC_PG_NUM_3BULKOUT_8821C;
  477. } else if (adapter->bulkout_num == 4) {
  478. cur_pg_num = HALMAC_PG_NUM_4BULKOUT_8821C;
  479. } else {
  480. PLTFM_MSG_ERR("[ERR]invalid intf\n");
  481. return HALMAC_RET_NOT_SUPPORT;
  482. }
  483. } else {
  484. return HALMAC_RET_NOT_SUPPORT;
  485. }
  486. status = pg_num_parser_88xx(adapter, mode, cur_pg_num);
  487. if (status != HALMAC_RET_SUCCESS)
  488. return status;
  489. PLTFM_MSG_TRACE("[TRACE]Set FIFO page\n");
  490. HALMAC_REG_W16(REG_FIFOPAGE_INFO_1, txff_info->high_queue_pg_num);
  491. HALMAC_REG_W16(REG_FIFOPAGE_INFO_2, txff_info->low_queue_pg_num);
  492. HALMAC_REG_W16(REG_FIFOPAGE_INFO_3, txff_info->normal_queue_pg_num);
  493. HALMAC_REG_W16(REG_FIFOPAGE_INFO_4, txff_info->extra_queue_pg_num);
  494. HALMAC_REG_W16(REG_FIFOPAGE_INFO_5, txff_info->pub_queue_pg_num);
  495. HALMAC_REG_W32_SET(REG_RQPN_CTRL_2, BIT(31));
  496. adapter->sdio_fs.hiq_pg_num = txff_info->high_queue_pg_num;
  497. adapter->sdio_fs.miq_pg_num = txff_info->normal_queue_pg_num;
  498. adapter->sdio_fs.lowq_pg_num = txff_info->low_queue_pg_num;
  499. adapter->sdio_fs.pubq_pg_num = txff_info->pub_queue_pg_num;
  500. adapter->sdio_fs.exq_pg_num = txff_info->extra_queue_pg_num;
  501. HALMAC_REG_W16(REG_FIFOPAGE_CTRL_2, txff_info->rsvd_boundary);
  502. HALMAC_REG_W8_SET(REG_FWHW_TXQ_CTRL + 2, BIT(4));
  503. /*20170411 Soar*/
  504. /* SDIO sometimes use two CMD52 to do HALMAC_REG_W16 */
  505. /* and may cause a mismatch between HW status and Reg value. */
  506. /* A patch is to write high byte first, suggested by Argis */
  507. if (adapter->intf == HALMAC_INTERFACE_SDIO) {
  508. value8 = (u8)(txff_info->rsvd_boundary >> 8 & 0xFF);
  509. HALMAC_REG_W8(REG_BCNQ_BDNY_V1 + 1, value8);
  510. value8 = (u8)(txff_info->rsvd_boundary & 0xFF);
  511. HALMAC_REG_W8(REG_BCNQ_BDNY_V1, value8);
  512. } else {
  513. HALMAC_REG_W16(REG_BCNQ_BDNY_V1, txff_info->rsvd_boundary);
  514. }
  515. HALMAC_REG_W16(REG_FIFOPAGE_CTRL_2 + 2, txff_info->rsvd_boundary);
  516. /*20170411 Soar*/
  517. /* SDIO sometimes use two CMD52 to do HALMAC_REG_W16 */
  518. /* and may cause a mismatch between HW status and Reg value. */
  519. /* A patch is to write high byte first, suggested by Argis */
  520. if (adapter->intf == HALMAC_INTERFACE_SDIO) {
  521. value8 = (u8)(txff_info->rsvd_boundary >> 8 & 0xFF);
  522. HALMAC_REG_W8(REG_BCNQ1_BDNY_V1 + 1, value8);
  523. value8 = (u8)(txff_info->rsvd_boundary & 0xFF);
  524. HALMAC_REG_W8(REG_BCNQ1_BDNY_V1, value8);
  525. } else {
  526. HALMAC_REG_W16(REG_BCNQ1_BDNY_V1, txff_info->rsvd_boundary);
  527. }
  528. HALMAC_REG_W32(REG_RXFF_BNDY,
  529. adapter->hw_cfg_info.rx_fifo_size -
  530. C2H_PKT_BUF_88XX - 1);
  531. if (adapter->intf == HALMAC_INTERFACE_USB) {
  532. value8 = HALMAC_REG_R8(REG_AUTO_LLT_V1);
  533. value8 &= ~(BIT_MASK_BLK_DESC_NUM << BIT_SHIFT_BLK_DESC_NUM);
  534. value8 |= (BLK_DESC_NUM << BIT_SHIFT_BLK_DESC_NUM);
  535. HALMAC_REG_W8(REG_AUTO_LLT_V1, value8);
  536. HALMAC_REG_W8(REG_AUTO_LLT_V1 + 3, BLK_DESC_NUM);
  537. HALMAC_REG_W8_SET(REG_TXDMA_OFFSET_CHK + 1, BIT(1));
  538. }
  539. HALMAC_REG_W8_SET(REG_AUTO_LLT_V1, BIT_AUTO_INIT_LLT_V1);
  540. cnt = 1000;
  541. while (HALMAC_REG_R8(REG_AUTO_LLT_V1) & BIT_AUTO_INIT_LLT_V1) {
  542. cnt--;
  543. if (cnt == 0)
  544. return HALMAC_RET_INIT_LLT_FAIL;
  545. }
  546. if (mode == HALMAC_TRX_MODE_DELAY_LOOPBACK) {
  547. transfer_mode = HALMAC_TRNSFER_LOOPBACK_DELAY;
  548. HALMAC_REG_W16(REG_WMAC_LBK_BUF_HD_V1,
  549. adapter->txff_alloc.rsvd_boundary);
  550. } else if (mode == HALMAC_TRX_MODE_LOOPBACK) {
  551. transfer_mode = HALMAC_TRNSFER_LOOPBACK_DIRECT;
  552. } else {
  553. transfer_mode = HALMAC_TRNSFER_NORMAL;
  554. }
  555. adapter->hw_cfg_info.trx_mode = transfer_mode;
  556. HALMAC_REG_W8(REG_CR + 3, (u8)transfer_mode);
  557. return HALMAC_RET_SUCCESS;
  558. }
  559. static enum halmac_ret_status
  560. set_trx_fifo_info_8821c(struct halmac_adapter *adapter,
  561. enum halmac_trx_mode mode)
  562. {
  563. u16 cur_pg_addr;
  564. u32 txff_size = TX_FIFO_SIZE_8821C;
  565. u32 rxff_size = RX_FIFO_SIZE_8821C;
  566. struct halmac_txff_allocation *info = &adapter->txff_alloc;
  567. if (info->rx_fifo_exp_mode == HALMAC_RX_FIFO_EXPANDING_MODE_1_BLOCK) {
  568. txff_size = TX_FIFO_SIZE_RX_EXPAND_1BLK_8821C;
  569. rxff_size = RX_FIFO_SIZE_RX_EXPAND_1BLK_8821C;
  570. }
  571. if (info->la_mode != HALMAC_LA_MODE_DISABLE) {
  572. txff_size = TX_FIFO_SIZE_LA_8821C;
  573. rxff_size = RX_FIFO_SIZE_8821C;
  574. }
  575. adapter->hw_cfg_info.tx_fifo_size = txff_size;
  576. adapter->hw_cfg_info.rx_fifo_size = rxff_size;
  577. info->tx_fifo_pg_num = (u16)(txff_size >> TX_PAGE_SIZE_SHIFT_88XX);
  578. info->rsvd_pg_num = info->rsvd_drv_pg_num +
  579. RSVD_PG_H2C_EXTRAINFO_NUM +
  580. RSVD_PG_H2C_STATICINFO_NUM +
  581. RSVD_PG_H2CQ_NUM +
  582. RSVD_PG_CPU_INSTRUCTION_NUM +
  583. RSVD_PG_FW_TXBUF_NUM +
  584. RSVD_PG_CSIBUF_NUM;
  585. if (mode == HALMAC_TRX_MODE_DELAY_LOOPBACK)
  586. info->rsvd_pg_num += RSVD_PG_DLLB_NUM;
  587. if (info->rsvd_pg_num > info->tx_fifo_pg_num)
  588. return HALMAC_RET_CFG_TXFIFO_PAGE_FAIL;
  589. info->acq_pg_num = info->tx_fifo_pg_num - info->rsvd_pg_num;
  590. info->rsvd_boundary = info->tx_fifo_pg_num - info->rsvd_pg_num;
  591. cur_pg_addr = info->tx_fifo_pg_num;
  592. cur_pg_addr -= RSVD_PG_CSIBUF_NUM;
  593. info->rsvd_csibuf_addr = cur_pg_addr;
  594. cur_pg_addr -= RSVD_PG_FW_TXBUF_NUM;
  595. info->rsvd_fw_txbuf_addr = cur_pg_addr;
  596. cur_pg_addr -= RSVD_PG_CPU_INSTRUCTION_NUM;
  597. info->rsvd_cpu_instr_addr = cur_pg_addr;
  598. cur_pg_addr -= RSVD_PG_H2CQ_NUM;
  599. info->rsvd_h2cq_addr = cur_pg_addr;
  600. cur_pg_addr -= RSVD_PG_H2C_STATICINFO_NUM;
  601. info->rsvd_h2c_sta_info_addr = cur_pg_addr;
  602. cur_pg_addr -= RSVD_PG_H2C_EXTRAINFO_NUM;
  603. info->rsvd_h2c_info_addr = cur_pg_addr;
  604. cur_pg_addr -= info->rsvd_drv_pg_num;
  605. info->rsvd_drv_addr = cur_pg_addr;
  606. if (mode == HALMAC_TRX_MODE_DELAY_LOOPBACK)
  607. info->rsvd_drv_addr -= RSVD_PG_DLLB_NUM;
  608. if (info->rsvd_boundary != info->rsvd_drv_addr)
  609. return HALMAC_RET_CFG_TXFIFO_PAGE_FAIL;
  610. return HALMAC_RET_SUCCESS;
  611. }
  612. /**
  613. * init_protocol_cfg_8821c() - config protocol register
  614. * @adapter : the adapter of halmac
  615. * Author : KaiYuan Chang/Ivan Lin
  616. * Return : enum halmac_ret_status
  617. * More details of status code can be found in prototype document
  618. */
  619. enum halmac_ret_status
  620. init_protocol_cfg_8821c(struct halmac_adapter *adapter)
  621. {
  622. u16 pre_txcnt;
  623. u32 max_agg_num;
  624. u32 max_rts_agg_num;
  625. u32 value32;
  626. struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
  627. PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__);
  628. HALMAC_REG_W8(REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME);
  629. HALMAC_REG_W8_SET(REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
  630. pre_txcnt = WLAN_PRE_TXCNT_TIME_TH | BIT_EN_PRECNT;
  631. HALMAC_REG_W8(REG_PRECNT_CTRL, (u8)(pre_txcnt & 0xFF));
  632. HALMAC_REG_W8(REG_PRECNT_CTRL + 1, (u8)(pre_txcnt >> 8));
  633. max_agg_num = WLAN_MAX_AGG_PKT_LIMIT;
  634. max_rts_agg_num = WLAN_RTS_MAX_AGG_PKT_LIMIT;
  635. if (adapter->intf == HALMAC_INTERFACE_SDIO) {
  636. max_agg_num = WLAN_MAX_AGG_PKT_LIMIT_SDIO;
  637. max_rts_agg_num = WLAN_RTS_MAX_AGG_PKT_LIMIT_SDIO;
  638. }
  639. value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) |
  640. (max_agg_num << 16) | (max_rts_agg_num << 24);
  641. HALMAC_REG_W32(REG_PROT_MODE_CTRL, value32);
  642. HALMAC_REG_W16(REG_BAR_MODE_CTRL + 2,
  643. WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8);
  644. HALMAC_REG_W8(REG_FAST_EDCA_VOVI_SETTING, WALN_FAST_EDCA_VO_TH);
  645. HALMAC_REG_W8(REG_FAST_EDCA_VOVI_SETTING + 2, WLAN_FAST_EDCA_VI_TH);
  646. HALMAC_REG_W8(REG_FAST_EDCA_BEBK_SETTING, WLAN_FAST_EDCA_BE_TH);
  647. HALMAC_REG_W8(REG_FAST_EDCA_BEBK_SETTING + 2, WLAN_FAST_EDCA_BK_TH);
  648. PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__);
  649. return HALMAC_RET_SUCCESS;
  650. }
  651. /**
  652. * init_h2c_8821c() - config h2c packet buffer
  653. * @adapter : the adapter of halmac
  654. * Author : KaiYuan Chang/Ivan Lin
  655. * Return : enum halmac_ret_status
  656. * More details of status code can be found in prototype document
  657. */
  658. enum halmac_ret_status
  659. init_h2c_8821c(struct halmac_adapter *adapter)
  660. {
  661. u8 value8;
  662. u32 value32;
  663. u32 h2cq_addr;
  664. u32 h2cq_size;
  665. struct halmac_txff_allocation *txff_info = &adapter->txff_alloc;
  666. struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
  667. h2cq_addr = txff_info->rsvd_h2cq_addr << TX_PAGE_SIZE_SHIFT_88XX;
  668. h2cq_size = RSVD_PG_H2CQ_NUM << TX_PAGE_SIZE_SHIFT_88XX;
  669. value32 = HALMAC_REG_R32(REG_H2C_HEAD);
  670. value32 = (value32 & 0xFFFC0000) | h2cq_addr;
  671. HALMAC_REG_W32(REG_H2C_HEAD, value32);
  672. value32 = HALMAC_REG_R32(REG_H2C_READ_ADDR);
  673. value32 = (value32 & 0xFFFC0000) | h2cq_addr;
  674. HALMAC_REG_W32(REG_H2C_READ_ADDR, value32);
  675. value32 = HALMAC_REG_R32(REG_H2C_TAIL);
  676. value32 &= 0xFFFC0000;
  677. value32 |= (h2cq_addr + h2cq_size);
  678. HALMAC_REG_W32(REG_H2C_TAIL, value32);
  679. value8 = HALMAC_REG_R8(REG_H2C_INFO);
  680. value8 = (u8)((value8 & 0xFC) | 0x01);
  681. HALMAC_REG_W8(REG_H2C_INFO, value8);
  682. value8 = HALMAC_REG_R8(REG_H2C_INFO);
  683. value8 = (u8)((value8 & 0xFB) | 0x04);
  684. HALMAC_REG_W8(REG_H2C_INFO, value8);
  685. value8 = HALMAC_REG_R8(REG_TXDMA_OFFSET_CHK + 1);
  686. value8 = (u8)((value8 & 0x7f) | 0x80);
  687. HALMAC_REG_W8(REG_TXDMA_OFFSET_CHK + 1, value8);
  688. adapter->h2c_info.buf_size = h2cq_size;
  689. get_h2c_buf_free_space_88xx(adapter);
  690. if (adapter->h2c_info.buf_size != adapter->h2c_info.buf_fs) {
  691. PLTFM_MSG_ERR("[ERR]get h2c free space error!\n");
  692. return HALMAC_RET_GET_H2C_SPACE_ERR;
  693. }
  694. PLTFM_MSG_TRACE("[TRACE]h2c fs : %d\n", adapter->h2c_info.buf_fs);
  695. return HALMAC_RET_SUCCESS;
  696. }
  697. /**
  698. * init_edca_cfg_8821c() - init EDCA config
  699. * @adapter : the adapter of halmac
  700. * Author : KaiYuan Chang/Ivan Lin
  701. * Return : enum halmac_ret_status
  702. * More details of status code can be found in prototype document
  703. */
  704. enum halmac_ret_status
  705. init_edca_cfg_8821c(struct halmac_adapter *adapter)
  706. {
  707. struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
  708. PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__);
  709. /* Init SYNC_CLI_SEL : reg 0x5B4[6:4] = 0 */
  710. HALMAC_REG_W8_CLR(REG_TIMER0_SRC_SEL, BIT(4) | BIT(5) | BIT(6));
  711. /* Clear TX pause */
  712. HALMAC_REG_W16(REG_TXPAUSE, 0x0000);
  713. HALMAC_REG_W8(REG_SLOT, WLAN_SLOT_TIME);
  714. HALMAC_REG_W8(REG_PIFS, WLAN_PIFS_TIME);
  715. HALMAC_REG_W32(REG_SIFS, WLAN_SIFS_CFG);
  716. HALMAC_REG_W16(REG_EDCA_VO_PARAM + 2, WLAN_VO_TXOP_LIMIT);
  717. HALMAC_REG_W16(REG_EDCA_VI_PARAM + 2, WLAN_VI_TXOP_LIMIT);
  718. HALMAC_REG_W32(REG_RD_NAV_NXT, WLAN_NAV_CFG);
  719. HALMAC_REG_W16(REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG);
  720. /* Set beacon cotnrol - enable TSF and other related functions */
  721. HALMAC_REG_W8(REG_BCN_CTRL, (u8)(HALMAC_REG_R8(REG_BCN_CTRL) |
  722. BIT_EN_BCN_FUNCTION));
  723. /* Set send beacon related registers */
  724. HALMAC_REG_W32(REG_TBTT_PROHIBIT, WLAN_TBTT_TIME);
  725. HALMAC_REG_W8(REG_DRVERLYINT, WLAN_DRV_EARLY_INT);
  726. HALMAC_REG_W8(REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
  727. HALMAC_REG_W8_CLR(REG_TX_PTCL_CTRL + 1, BIT(4));
  728. PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__);
  729. return HALMAC_RET_SUCCESS;
  730. }
  731. /**
  732. * init_wmac_cfg_8821c() - init wmac config
  733. * @adapter : the adapter of halmac
  734. * Author : KaiYuan Chang/Ivan Lin
  735. * Return : enum halmac_ret_status
  736. * More details of status code can be found in prototype document
  737. */
  738. enum halmac_ret_status
  739. init_wmac_cfg_8821c(struct halmac_adapter *adapter)
  740. {
  741. u8 value8;
  742. struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
  743. enum halmac_ret_status status = HALMAC_RET_SUCCESS;
  744. PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__);
  745. HALMAC_REG_W32(REG_RXFLTMAP0, WLAN_RX_FILTER0);
  746. HALMAC_REG_W16(REG_RXFLTMAP2, WLAN_RX_FILTER2);
  747. HALMAC_REG_W32(REG_RCR, WLAN_RCR_CFG);
  748. HALMAC_REG_W8(REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
  749. HALMAC_REG_W8(REG_TCR + 2, WLAN_TX_FUNC_CFG2);
  750. HALMAC_REG_W8(REG_TCR + 1, WLAN_TX_FUNC_CFG1);
  751. HALMAC_REG_W8(REG_ACKTO_CCK, WLAN_ACK_TO_CCK);
  752. HALMAC_REG_W32(REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2);
  753. if (adapter->hw_cfg_info.trx_mode == HALMAC_TRNSFER_NORMAL)
  754. value8 = WLAN_MAC_OPT_NORM_FUNC1;
  755. else
  756. value8 = WLAN_MAC_OPT_LB_FUNC1;
  757. HALMAC_REG_W8(REG_WMAC_OPTION_FUNCTION + 4, value8);
  758. status = api->halmac_init_low_pwr(adapter);
  759. if (status != HALMAC_RET_SUCCESS)
  760. return status;
  761. PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__);
  762. return HALMAC_RET_SUCCESS;
  763. }
  764. #endif /* HALMAC_8821C_SUPPORT */