dxe.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. /*
  2. * Copyright (c) 2013 Eugene Krasnikov <[email protected]>
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  11. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  13. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  14. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #ifndef _DXE_H_
  17. #define _DXE_H_
  18. #include "wcn36xx.h"
  19. /*
  20. TX_LOW = DMA0
  21. TX_HIGH = DMA4
  22. RX_LOW = DMA1
  23. RX_HIGH = DMA3
  24. H2H_TEST_RX_TX = DMA2
  25. */
  26. /* DXE registers */
  27. #define WCN36XX_DXE_MEM_REG 0
  28. #define WCN36XX_CCU_DXE_INT_SELECT_RIVA 0x310
  29. #define WCN36XX_CCU_DXE_INT_SELECT_PRONTO 0x10dc
  30. /* Descriptor valid */
  31. #define WCN36xx_DXE_CTRL_VLD BIT(0)
  32. /* End of packet */
  33. #define WCN36xx_DXE_CTRL_EOP BIT(3)
  34. /* BD handling bit */
  35. #define WCN36xx_DXE_CTRL_BDH BIT(4)
  36. /* Source is a queue */
  37. #define WCN36xx_DXE_CTRL_SIQ BIT(5)
  38. /* Destination is a queue */
  39. #define WCN36xx_DXE_CTRL_DIQ BIT(6)
  40. /* Pointer address is a queue */
  41. #define WCN36xx_DXE_CTRL_PIQ BIT(7)
  42. /* Release PDU when done */
  43. #define WCN36xx_DXE_CTRL_PDU_REL BIT(8)
  44. /* STOP channel processing */
  45. #define WCN36xx_DXE_CTRL_STOP BIT(16)
  46. /* INT on descriptor done */
  47. #define WCN36xx_DXE_CTRL_INT BIT(17)
  48. /* Endian byte swap enable */
  49. #define WCN36xx_DXE_CTRL_SWAP BIT(20)
  50. /* Master endianness */
  51. #define WCN36xx_DXE_CTRL_ENDIANNESS BIT(21)
  52. /* Transfer type */
  53. #define WCN36xx_DXE_CTRL_XTYPE_SHIFT 1
  54. #define WCN36xx_DXE_CTRL_XTYPE_MASK GENMASK(2, WCN36xx_DXE_CTRL_XTYPE_SHIFT)
  55. #define WCN36xx_DXE_CTRL_XTYPE_SET(x) ((x) << WCN36xx_DXE_CTRL_XTYPE_SHIFT)
  56. /* BMU Threshold select */
  57. #define WCN36xx_DXE_CTRL_BTHLD_SEL_SHIFT 9
  58. #define WCN36xx_DXE_CTRL_BTHLD_SEL_MASK GENMASK(12, WCN36xx_DXE_CTRL_BTHLD_SEL_SHIFT)
  59. #define WCN36xx_DXE_CTRL_BTHLD_SEL_SET(x) ((x) << WCN36xx_DXE_CTRL_BTHLD_SEL_SHIFT)
  60. /* Priority */
  61. #define WCN36xx_DXE_CTRL_PRIO_SHIFT 13
  62. #define WCN36xx_DXE_CTRL_PRIO_MASK GENMASK(15, WCN36xx_DXE_CTRL_PRIO_SHIFT)
  63. #define WCN36xx_DXE_CTRL_PRIO_SET(x) ((x) << WCN36xx_DXE_CTRL_PRIO_SHIFT)
  64. /* BD Template index */
  65. #define WCN36xx_DXE_CTRL_BDT_IDX_SHIFT 18
  66. #define WCN36xx_DXE_CTRL_BDT_IDX_MASK GENMASK(19, WCN36xx_DXE_CTRL_BDT_IDX_SHIFT)
  67. #define WCN36xx_DXE_CTRL_BDT_IDX_SET(x) ((x) << WCN36xx_DXE_CTRL_BDT_IDX_SHIFT)
  68. /* Transfer types: */
  69. /* Host to host */
  70. #define WCN36xx_DXE_XTYPE_H2H (0)
  71. /* Host to BMU */
  72. #define WCN36xx_DXE_XTYPE_H2B (2)
  73. /* BMU to host */
  74. #define WCN36xx_DXE_XTYPE_B2H (3)
  75. #define WCN36XX_DXE_CTRL_TX_L (WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
  76. WCN36xx_DXE_CTRL_DIQ | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(5) | \
  77. WCN36xx_DXE_CTRL_PRIO_SET(4) | WCN36xx_DXE_CTRL_INT | \
  78. WCN36xx_DXE_CTRL_SWAP | WCN36xx_DXE_CTRL_ENDIANNESS)
  79. #define WCN36XX_DXE_CTRL_TX_H (WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
  80. WCN36xx_DXE_CTRL_DIQ | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(7) | \
  81. WCN36xx_DXE_CTRL_PRIO_SET(6) | WCN36xx_DXE_CTRL_INT | \
  82. WCN36xx_DXE_CTRL_SWAP | WCN36xx_DXE_CTRL_ENDIANNESS)
  83. #define WCN36XX_DXE_CTRL_RX_L (WCN36xx_DXE_CTRL_VLD | \
  84. WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_B2H) | \
  85. WCN36xx_DXE_CTRL_EOP | WCN36xx_DXE_CTRL_SIQ | \
  86. WCN36xx_DXE_CTRL_PDU_REL | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(6) | \
  87. WCN36xx_DXE_CTRL_PRIO_SET(5) | WCN36xx_DXE_CTRL_INT | \
  88. WCN36xx_DXE_CTRL_SWAP)
  89. #define WCN36XX_DXE_CTRL_RX_H (WCN36xx_DXE_CTRL_VLD | \
  90. WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_B2H) | \
  91. WCN36xx_DXE_CTRL_EOP | WCN36xx_DXE_CTRL_SIQ | \
  92. WCN36xx_DXE_CTRL_PDU_REL | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(8) | \
  93. WCN36xx_DXE_CTRL_PRIO_SET(6) | WCN36xx_DXE_CTRL_INT | \
  94. WCN36xx_DXE_CTRL_SWAP)
  95. #define WCN36XX_DXE_CTRL_TX_H_BD (WCN36xx_DXE_CTRL_VLD | \
  96. WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
  97. WCN36xx_DXE_CTRL_DIQ | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(7) | \
  98. WCN36xx_DXE_CTRL_PRIO_SET(6) | WCN36xx_DXE_CTRL_SWAP | \
  99. WCN36xx_DXE_CTRL_ENDIANNESS)
  100. #define WCN36XX_DXE_CTRL_TX_H_SKB (WCN36xx_DXE_CTRL_VLD | \
  101. WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
  102. WCN36xx_DXE_CTRL_EOP | WCN36xx_DXE_CTRL_DIQ | \
  103. WCN36xx_DXE_CTRL_BTHLD_SEL_SET(7) | WCN36xx_DXE_CTRL_PRIO_SET(6) | \
  104. WCN36xx_DXE_CTRL_INT | WCN36xx_DXE_CTRL_SWAP | \
  105. WCN36xx_DXE_CTRL_ENDIANNESS)
  106. #define WCN36XX_DXE_CTRL_TX_L_BD (WCN36xx_DXE_CTRL_VLD | \
  107. WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
  108. WCN36xx_DXE_CTRL_DIQ | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(5) | \
  109. WCN36xx_DXE_CTRL_PRIO_SET(4) | WCN36xx_DXE_CTRL_SWAP | \
  110. WCN36xx_DXE_CTRL_ENDIANNESS)
  111. #define WCN36XX_DXE_CTRL_TX_L_SKB (WCN36xx_DXE_CTRL_VLD | \
  112. WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
  113. WCN36xx_DXE_CTRL_EOP | WCN36xx_DXE_CTRL_DIQ | \
  114. WCN36xx_DXE_CTRL_BTHLD_SEL_SET(5) | WCN36xx_DXE_CTRL_PRIO_SET(4) | \
  115. WCN36xx_DXE_CTRL_INT | WCN36xx_DXE_CTRL_SWAP | \
  116. WCN36xx_DXE_CTRL_ENDIANNESS)
  117. /* TODO This must calculated properly but not hardcoded */
  118. #define WCN36XX_DXE_WQ_TX_L 0x17
  119. #define WCN36XX_DXE_WQ_TX_H 0x17
  120. #define WCN36XX_DXE_WQ_RX_L 0xB
  121. #define WCN36XX_DXE_WQ_RX_H 0x4
  122. /* Channel enable or restart */
  123. #define WCN36xx_DXE_CH_CTRL_EN BIT(0)
  124. /* End of packet bit */
  125. #define WCN36xx_DXE_CH_CTRL_EOP BIT(3)
  126. /* BD Handling bit */
  127. #define WCN36xx_DXE_CH_CTRL_BDH BIT(4)
  128. /* Source is queue */
  129. #define WCN36xx_DXE_CH_CTRL_SIQ BIT(5)
  130. /* Destination is queue */
  131. #define WCN36xx_DXE_CH_CTRL_DIQ BIT(6)
  132. /* Pointer descriptor is queue */
  133. #define WCN36xx_DXE_CH_CTRL_PIQ BIT(7)
  134. /* Relase PDU when done */
  135. #define WCN36xx_DXE_CH_CTRL_PDU_REL BIT(8)
  136. /* Stop channel processing */
  137. #define WCN36xx_DXE_CH_CTRL_STOP BIT(16)
  138. /* Enable external descriptor interrupt */
  139. #define WCN36xx_DXE_CH_CTRL_INE_ED BIT(17)
  140. /* Enable channel interrupt on errors */
  141. #define WCN36xx_DXE_CH_CTRL_INE_ERR BIT(18)
  142. /* Enable Channel interrupt when done */
  143. #define WCN36xx_DXE_CH_CTRL_INE_DONE BIT(19)
  144. /* External descriptor enable */
  145. #define WCN36xx_DXE_CH_CTRL_EDEN BIT(20)
  146. /* Wait for valid bit */
  147. #define WCN36xx_DXE_CH_CTRL_EDVEN BIT(21)
  148. /* Endianness is little endian*/
  149. #define WCN36xx_DXE_CH_CTRL_ENDIANNESS BIT(26)
  150. /* Abort transfer */
  151. #define WCN36xx_DXE_CH_CTRL_ABORT BIT(27)
  152. /* Long descriptor format */
  153. #define WCN36xx_DXE_CH_CTRL_DFMT BIT(28)
  154. /* Endian byte swap enable */
  155. #define WCN36xx_DXE_CH_CTRL_SWAP BIT(31)
  156. /* Transfer type */
  157. #define WCN36xx_DXE_CH_CTRL_XTYPE_SHIFT 1
  158. #define WCN36xx_DXE_CH_CTRL_XTYPE_MASK GENMASK(2, WCN36xx_DXE_CH_CTRL_XTYPE_SHIFT)
  159. #define WCN36xx_DXE_CH_CTRL_XTYPE_SET(x) ((x) << WCN36xx_DXE_CH_CTRL_XTYPE_SHIFT)
  160. /* Channel BMU Threshold select */
  161. #define WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SHIFT 9
  162. #define WCN36xx_DXE_CH_CTRL_BTHLD_SEL_MASK GENMASK(12, WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SHIFT)
  163. #define WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SET(x) ((x) << WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SHIFT)
  164. /* Channel Priority */
  165. #define WCN36xx_DXE_CH_CTRL_PRIO_SHIFT 13
  166. #define WCN36xx_DXE_CH_CTRL_PRIO_MASK GENMASK(15, WCN36xx_DXE_CH_CTRL_PRIO_SHIFT)
  167. #define WCN36xx_DXE_CH_CTRL_PRIO_SET(x) ((x) << WCN36xx_DXE_CH_CTRL_PRIO_SHIFT)
  168. /* Counter select */
  169. #define WCN36xx_DXE_CH_CTRL_SEL_SHIFT 22
  170. #define WCN36xx_DXE_CH_CTRL_SEL_MASK GENMASK(25, WCN36xx_DXE_CH_CTRL_SEL_SHIFT)
  171. #define WCN36xx_DXE_CH_CTRL_SEL_SET(x) ((x) << WCN36xx_DXE_CH_CTRL_SEL_SHIFT)
  172. /* Channel BD template index */
  173. #define WCN36xx_DXE_CH_CTRL_BDT_IDX_SHIFT 29
  174. #define WCN36xx_DXE_CH_CTRL_BDT_IDX_MASK GENMASK(30, WCN36xx_DXE_CH_CTRL_BDT_IDX_SHIFT)
  175. #define WCN36xx_DXE_CH_CTRL_BDT_IDX_SET(x) ((x) << WCN36xx_DXE_CH_CTRL_BDT_IDX_SHIFT)
  176. /* DXE default control register values */
  177. #define WCN36XX_DXE_CH_DEFAULT_CTL_RX_L (WCN36xx_DXE_CH_CTRL_EN | \
  178. WCN36xx_DXE_CH_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_B2H) | \
  179. WCN36xx_DXE_CH_CTRL_EOP | WCN36xx_DXE_CH_CTRL_SIQ | \
  180. WCN36xx_DXE_CH_CTRL_PDU_REL | WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SET(6) | \
  181. WCN36xx_DXE_CH_CTRL_PRIO_SET(5) | WCN36xx_DXE_CH_CTRL_INE_ED | \
  182. WCN36xx_DXE_CH_CTRL_INE_ERR | WCN36xx_DXE_CH_CTRL_INE_DONE | \
  183. WCN36xx_DXE_CH_CTRL_EDEN | WCN36xx_DXE_CH_CTRL_EDVEN | \
  184. WCN36xx_DXE_CH_CTRL_SEL_SET(1) | WCN36xx_DXE_CH_CTRL_ENDIANNESS | \
  185. WCN36xx_DXE_CH_CTRL_SWAP)
  186. #define WCN36XX_DXE_CH_DEFAULT_CTL_RX_H (WCN36xx_DXE_CH_CTRL_EN | \
  187. WCN36xx_DXE_CH_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_B2H) | \
  188. WCN36xx_DXE_CH_CTRL_EOP | WCN36xx_DXE_CH_CTRL_SIQ | \
  189. WCN36xx_DXE_CH_CTRL_PDU_REL | WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SET(8) | \
  190. WCN36xx_DXE_CH_CTRL_PRIO_SET(6) | WCN36xx_DXE_CH_CTRL_INE_ED | \
  191. WCN36xx_DXE_CH_CTRL_INE_ERR | WCN36xx_DXE_CH_CTRL_INE_DONE | \
  192. WCN36xx_DXE_CH_CTRL_EDEN | WCN36xx_DXE_CH_CTRL_EDVEN | \
  193. WCN36xx_DXE_CH_CTRL_SEL_SET(3) | WCN36xx_DXE_CH_CTRL_ENDIANNESS | \
  194. WCN36xx_DXE_CH_CTRL_SWAP)
  195. #define WCN36XX_DXE_CH_DEFAULT_CTL_TX_H (WCN36xx_DXE_CH_CTRL_EN | \
  196. WCN36xx_DXE_CH_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
  197. WCN36xx_DXE_CH_CTRL_EOP | WCN36xx_DXE_CH_CTRL_DIQ | \
  198. WCN36xx_DXE_CH_CTRL_PDU_REL | WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SET(7) | \
  199. WCN36xx_DXE_CH_CTRL_PRIO_SET(6) | WCN36xx_DXE_CH_CTRL_INE_ED | \
  200. WCN36xx_DXE_CH_CTRL_INE_ERR | WCN36xx_DXE_CH_CTRL_INE_DONE | \
  201. WCN36xx_DXE_CH_CTRL_EDEN | WCN36xx_DXE_CH_CTRL_EDVEN | \
  202. WCN36xx_DXE_CH_CTRL_SEL_SET(4) | WCN36xx_DXE_CH_CTRL_ENDIANNESS | \
  203. WCN36xx_DXE_CH_CTRL_SWAP)
  204. #define WCN36XX_DXE_CH_DEFAULT_CTL_TX_L (WCN36xx_DXE_CH_CTRL_EN | \
  205. WCN36xx_DXE_CH_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
  206. WCN36xx_DXE_CH_CTRL_EOP | WCN36xx_DXE_CH_CTRL_DIQ | \
  207. WCN36xx_DXE_CH_CTRL_PDU_REL | WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SET(5) | \
  208. WCN36xx_DXE_CH_CTRL_PRIO_SET(4) | WCN36xx_DXE_CH_CTRL_INE_ED | \
  209. WCN36xx_DXE_CH_CTRL_INE_ERR | WCN36xx_DXE_CH_CTRL_INE_DONE | \
  210. WCN36xx_DXE_CH_CTRL_EDEN | WCN36xx_DXE_CH_CTRL_EDVEN | \
  211. WCN36xx_DXE_CH_CTRL_SEL_SET(0) | WCN36xx_DXE_CH_CTRL_ENDIANNESS | \
  212. WCN36xx_DXE_CH_CTRL_SWAP)
  213. /* Common DXE registers */
  214. #define WCN36XX_DXE_MEM_CSR (WCN36XX_DXE_MEM_REG + 0x00)
  215. #define WCN36XX_DXE_REG_CSR_RESET (WCN36XX_DXE_MEM_REG + 0x00)
  216. #define WCN36XX_DXE_ENCH_ADDR (WCN36XX_DXE_MEM_REG + 0x04)
  217. #define WCN36XX_DXE_REG_CH_EN (WCN36XX_DXE_MEM_REG + 0x08)
  218. #define WCN36XX_DXE_REG_CH_DONE (WCN36XX_DXE_MEM_REG + 0x0C)
  219. #define WCN36XX_DXE_REG_CH_ERR (WCN36XX_DXE_MEM_REG + 0x10)
  220. #define WCN36XX_DXE_INT_MASK_REG (WCN36XX_DXE_MEM_REG + 0x18)
  221. #define WCN36XX_DXE_INT_SRC_RAW_REG (WCN36XX_DXE_MEM_REG + 0x20)
  222. /* #define WCN36XX_DXE_INT_CH6_MASK 0x00000040 */
  223. /* #define WCN36XX_DXE_INT_CH5_MASK 0x00000020 */
  224. #define WCN36XX_DXE_INT_CH4_MASK 0x00000010
  225. #define WCN36XX_DXE_INT_CH3_MASK 0x00000008
  226. /* #define WCN36XX_DXE_INT_CH2_MASK 0x00000004 */
  227. #define WCN36XX_DXE_INT_CH1_MASK 0x00000002
  228. #define WCN36XX_DXE_INT_CH0_MASK 0x00000001
  229. #define WCN36XX_DXE_0_INT_CLR (WCN36XX_DXE_MEM_REG + 0x30)
  230. #define WCN36XX_DXE_0_INT_ED_CLR (WCN36XX_DXE_MEM_REG + 0x34)
  231. #define WCN36XX_DXE_0_INT_DONE_CLR (WCN36XX_DXE_MEM_REG + 0x38)
  232. #define WCN36XX_DXE_0_INT_ERR_CLR (WCN36XX_DXE_MEM_REG + 0x3C)
  233. #define WCN36XX_CH_STAT_INT_DONE_MASK 0x00008000
  234. #define WCN36XX_CH_STAT_INT_ERR_MASK 0x00004000
  235. #define WCN36XX_CH_STAT_INT_ED_MASK 0x00002000
  236. #define WCN36XX_DXE_0_CH0_STATUS (WCN36XX_DXE_MEM_REG + 0x404)
  237. #define WCN36XX_DXE_0_CH1_STATUS (WCN36XX_DXE_MEM_REG + 0x444)
  238. #define WCN36XX_DXE_0_CH2_STATUS (WCN36XX_DXE_MEM_REG + 0x484)
  239. #define WCN36XX_DXE_0_CH3_STATUS (WCN36XX_DXE_MEM_REG + 0x4C4)
  240. #define WCN36XX_DXE_0_CH4_STATUS (WCN36XX_DXE_MEM_REG + 0x504)
  241. #define WCN36XX_DXE_REG_RESET 0x5c89
  242. /* Temporary BMU Workqueue 4 */
  243. #define WCN36XX_DXE_BMU_WQ_RX_LOW 0xB
  244. #define WCN36XX_DXE_BMU_WQ_RX_HIGH 0x4
  245. /* DMA channel offset */
  246. #define WCN36XX_DXE_TX_LOW_OFFSET 0x400
  247. #define WCN36XX_DXE_TX_HIGH_OFFSET 0x500
  248. #define WCN36XX_DXE_RX_LOW_OFFSET 0x440
  249. #define WCN36XX_DXE_RX_HIGH_OFFSET 0x4C0
  250. /* Address of the next DXE descriptor */
  251. #define WCN36XX_DXE_CH_NEXT_DESC_ADDR 0x001C
  252. #define WCN36XX_DXE_CH_NEXT_DESC_ADDR_TX_L (WCN36XX_DXE_MEM_REG + \
  253. WCN36XX_DXE_TX_LOW_OFFSET + \
  254. WCN36XX_DXE_CH_NEXT_DESC_ADDR)
  255. #define WCN36XX_DXE_CH_NEXT_DESC_ADDR_TX_H (WCN36XX_DXE_MEM_REG + \
  256. WCN36XX_DXE_TX_HIGH_OFFSET + \
  257. WCN36XX_DXE_CH_NEXT_DESC_ADDR)
  258. #define WCN36XX_DXE_CH_NEXT_DESC_ADDR_RX_L (WCN36XX_DXE_MEM_REG + \
  259. WCN36XX_DXE_RX_LOW_OFFSET + \
  260. WCN36XX_DXE_CH_NEXT_DESC_ADDR)
  261. #define WCN36XX_DXE_CH_NEXT_DESC_ADDR_RX_H (WCN36XX_DXE_MEM_REG + \
  262. WCN36XX_DXE_RX_HIGH_OFFSET + \
  263. WCN36XX_DXE_CH_NEXT_DESC_ADDR)
  264. /* DXE Descriptor source address */
  265. #define WCN36XX_DXE_CH_SRC_ADDR 0x000C
  266. #define WCN36XX_DXE_CH_SRC_ADDR_RX_L (WCN36XX_DXE_MEM_REG + \
  267. WCN36XX_DXE_RX_LOW_OFFSET + \
  268. WCN36XX_DXE_CH_SRC_ADDR)
  269. #define WCN36XX_DXE_CH_SRC_ADDR_RX_H (WCN36XX_DXE_MEM_REG + \
  270. WCN36XX_DXE_RX_HIGH_OFFSET + \
  271. WCN36XX_DXE_CH_SRC_ADDR)
  272. /* DXE Descriptor address destination address */
  273. #define WCN36XX_DXE_CH_DEST_ADDR 0x0014
  274. #define WCN36XX_DXE_CH_DEST_ADDR_TX_L (WCN36XX_DXE_MEM_REG + \
  275. WCN36XX_DXE_TX_LOW_OFFSET + \
  276. WCN36XX_DXE_CH_DEST_ADDR)
  277. #define WCN36XX_DXE_CH_DEST_ADDR_TX_H (WCN36XX_DXE_MEM_REG + \
  278. WCN36XX_DXE_TX_HIGH_OFFSET + \
  279. WCN36XX_DXE_CH_DEST_ADDR)
  280. #define WCN36XX_DXE_CH_DEST_ADDR_RX_L (WCN36XX_DXE_MEM_REG + \
  281. WCN36XX_DXE_RX_LOW_OFFSET + \
  282. WCN36XX_DXE_CH_DEST_ADDR)
  283. #define WCN36XX_DXE_CH_DEST_ADDR_RX_H (WCN36XX_DXE_MEM_REG + \
  284. WCN36XX_DXE_RX_HIGH_OFFSET + \
  285. WCN36XX_DXE_CH_DEST_ADDR)
  286. /* Interrupt status */
  287. #define WCN36XX_DXE_CH_STATUS_REG_ADDR 0x0004
  288. #define WCN36XX_DXE_CH_STATUS_REG_ADDR_TX_L (WCN36XX_DXE_MEM_REG + \
  289. WCN36XX_DXE_TX_LOW_OFFSET + \
  290. WCN36XX_DXE_CH_STATUS_REG_ADDR)
  291. #define WCN36XX_DXE_CH_STATUS_REG_ADDR_TX_H (WCN36XX_DXE_MEM_REG + \
  292. WCN36XX_DXE_TX_HIGH_OFFSET + \
  293. WCN36XX_DXE_CH_STATUS_REG_ADDR)
  294. #define WCN36XX_DXE_CH_STATUS_REG_ADDR_RX_L (WCN36XX_DXE_MEM_REG + \
  295. WCN36XX_DXE_RX_LOW_OFFSET + \
  296. WCN36XX_DXE_CH_STATUS_REG_ADDR)
  297. #define WCN36XX_DXE_CH_STATUS_REG_ADDR_RX_H (WCN36XX_DXE_MEM_REG + \
  298. WCN36XX_DXE_RX_HIGH_OFFSET + \
  299. WCN36XX_DXE_CH_STATUS_REG_ADDR)
  300. /* DXE default control register */
  301. #define WCN36XX_DXE_REG_CTL_RX_L (WCN36XX_DXE_MEM_REG + \
  302. WCN36XX_DXE_RX_LOW_OFFSET)
  303. #define WCN36XX_DXE_REG_CTL_RX_H (WCN36XX_DXE_MEM_REG + \
  304. WCN36XX_DXE_RX_HIGH_OFFSET)
  305. #define WCN36XX_DXE_REG_CTL_TX_H (WCN36XX_DXE_MEM_REG + \
  306. WCN36XX_DXE_TX_HIGH_OFFSET)
  307. #define WCN36XX_DXE_REG_CTL_TX_L (WCN36XX_DXE_MEM_REG + \
  308. WCN36XX_DXE_TX_LOW_OFFSET)
  309. #define WCN36XX_SMSM_WLAN_TX_ENABLE 0x00000400
  310. #define WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY 0x00000200
  311. /* Interrupt control channel mask */
  312. #define WCN36XX_INT_MASK_CHAN_TX_L 0x00000001
  313. #define WCN36XX_INT_MASK_CHAN_RX_L 0x00000002
  314. #define WCN36XX_INT_MASK_CHAN_RX_H 0x00000008
  315. #define WCN36XX_INT_MASK_CHAN_TX_H 0x00000010
  316. #define WCN36XX_BD_CHUNK_SIZE 128
  317. #define WCN36XX_PKT_SIZE 0xF20
  318. enum wcn36xx_dxe_ch_type {
  319. WCN36XX_DXE_CH_TX_L,
  320. WCN36XX_DXE_CH_TX_H,
  321. WCN36XX_DXE_CH_RX_L,
  322. WCN36XX_DXE_CH_RX_H
  323. };
  324. /* amount of descriptors per channel */
  325. enum wcn36xx_dxe_ch_desc_num {
  326. WCN36XX_DXE_CH_DESC_NUMB_TX_L = 128,
  327. WCN36XX_DXE_CH_DESC_NUMB_TX_H = 10,
  328. WCN36XX_DXE_CH_DESC_NUMB_RX_L = 512,
  329. WCN36XX_DXE_CH_DESC_NUMB_RX_H = 40
  330. };
  331. /**
  332. * struct wcn36xx_dxe_desc - describes descriptor of one DXE buffer
  333. *
  334. * @ctrl: is a union that consists of following bits:
  335. * union {
  336. * u32 valid :1; //0 = DMA stop, 1 = DMA continue with this
  337. * //descriptor
  338. * u32 transfer_type :2; //0 = Host to Host space
  339. * u32 eop :1; //End of Packet
  340. * u32 bd_handling :1; //if transferType = Host to BMU, then 0
  341. * // means first 128 bytes contain BD, and 1
  342. * // means create new empty BD
  343. * u32 siq :1; // SIQ
  344. * u32 diq :1; // DIQ
  345. * u32 pdu_rel :1; //0 = don't release BD and PDUs when done,
  346. * // 1 = release them
  347. * u32 bthld_sel :4; //BMU Threshold Select
  348. * u32 prio :3; //Specifies the priority level to use for
  349. * // the transfer
  350. * u32 stop_channel :1; //1 = DMA stops processing further, channel
  351. * //requires re-enabling after this
  352. * u32 intr :1; //Interrupt on Descriptor Done
  353. * u32 rsvd :1; //reserved
  354. * u32 size :14;//14 bits used - ignored for BMU transfers,
  355. * //only used for host to host transfers?
  356. * } ctrl;
  357. */
  358. struct wcn36xx_dxe_desc {
  359. u32 ctrl;
  360. u32 fr_len;
  361. u32 src_addr_l;
  362. u32 dst_addr_l;
  363. u32 phy_next_l;
  364. u32 src_addr_h;
  365. u32 dst_addr_h;
  366. u32 phy_next_h;
  367. } __packed;
  368. /* DXE Control block */
  369. struct wcn36xx_dxe_ctl {
  370. struct wcn36xx_dxe_ctl *next;
  371. struct wcn36xx_dxe_desc *desc;
  372. unsigned int desc_phy_addr;
  373. int ctl_blk_order;
  374. struct sk_buff *skb;
  375. void *bd_cpu_addr;
  376. dma_addr_t bd_phy_addr;
  377. };
  378. struct wcn36xx_dxe_ch {
  379. spinlock_t lock; /* protects head/tail ptrs */
  380. enum wcn36xx_dxe_ch_type ch_type;
  381. void *cpu_addr;
  382. dma_addr_t dma_addr;
  383. enum wcn36xx_dxe_ch_desc_num desc_num;
  384. /* DXE control block ring */
  385. struct wcn36xx_dxe_ctl *head_blk_ctl;
  386. struct wcn36xx_dxe_ctl *tail_blk_ctl;
  387. /* DXE channel specific configs */
  388. u32 dxe_wq;
  389. u32 ctrl_bd;
  390. u32 ctrl_skb;
  391. u32 reg_ctrl;
  392. u32 def_ctrl;
  393. };
  394. /* Memory Pool for BD headers */
  395. struct wcn36xx_dxe_mem_pool {
  396. int chunk_size;
  397. void *virt_addr;
  398. dma_addr_t phy_addr;
  399. };
  400. struct wcn36xx_tx_bd;
  401. struct wcn36xx_vif;
  402. int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn);
  403. void wcn36xx_dxe_free_mem_pools(struct wcn36xx *wcn);
  404. void wcn36xx_dxe_rx_frame(struct wcn36xx *wcn);
  405. int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn);
  406. void wcn36xx_dxe_free_ctl_blks(struct wcn36xx *wcn);
  407. int wcn36xx_dxe_init(struct wcn36xx *wcn);
  408. void wcn36xx_dxe_deinit(struct wcn36xx *wcn);
  409. int wcn36xx_dxe_init_channels(struct wcn36xx *wcn);
  410. int wcn36xx_dxe_tx_frame(struct wcn36xx *wcn,
  411. struct wcn36xx_vif *vif_priv,
  412. struct wcn36xx_tx_bd *bd,
  413. struct sk_buff *skb,
  414. bool is_low);
  415. int wcn36xx_dxe_tx_flush(struct wcn36xx *wcn);
  416. void wcn36xx_dxe_tx_ack_ind(struct wcn36xx *wcn, u32 status);
  417. #endif /* _DXE_H_ */