hal_6290_srng.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. /*
  2. * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions are
  6. * met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above
  10. * copyright notice, this list of conditions and the following
  11. * disclaimer in the documentation and/or other materials provided
  12. * with the distribution.
  13. * * Neither the name of The Linux Foundation nor the names of its
  14. * contributors may be used to endorse or promote products derived
  15. * from this software without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
  18. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
  20. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
  21. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  24. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  25. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  26. * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  27. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. */
  29. #include "qdf_types.h"
  30. #include "qdf_util.h"
  31. #include "qdf_types.h"
  32. #include "qdf_lock.h"
  33. #include "qdf_mem.h"
  34. #include "qdf_nbuf.h"
  35. #include "hal_hw_headers.h"
  36. #include "hal_internal.h"
  37. #include "hal_api.h"
  38. #include "target_type.h"
  39. #include "wcss_version.h"
  40. #include "qdf_module.h"
  41. #include "hal_6290_tx.h"
  42. #include "hal_6290_rx.h"
  43. struct hal_hw_txrx_ops qca6290_hal_hw_txrx_ops = {
  44. /* tx */
  45. hal_tx_desc_set_dscp_tid_table_id_6290,
  46. hal_tx_set_dscp_tid_map_6290,
  47. hal_tx_update_dscp_tid_6290,
  48. hal_tx_desc_set_lmac_id_6290,
  49. /* rx */
  50. hal_rx_msdu_start_nss_get_6290,
  51. hal_rx_mon_hw_desc_get_mpdu_status_6290,
  52. hal_rx_get_tlv_6290,
  53. hal_rx_proc_phyrx_other_receive_info_tlv_6290,
  54. hal_rx_dump_msdu_start_tlv_6290,
  55. hal_get_link_desc_size_6290,
  56. hal_rx_mpdu_start_tid_get_6290,
  57. hal_rx_msdu_start_reception_type_get_6290,
  58. };
  59. struct hal_hw_srng_config hw_srng_table_6290[] = {
  60. /* TODO: max_rings can populated by querying HW capabilities */
  61. { /* REO_DST */
  62. .start_ring_id = HAL_SRNG_REO2SW1,
  63. .max_rings = 4,
  64. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  65. .lmac_ring = FALSE,
  66. .ring_dir = HAL_SRNG_DST_RING,
  67. .reg_start = {
  68. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
  69. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  70. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
  71. SEQ_WCSS_UMAC_REO_REG_OFFSET)
  72. },
  73. .reg_size = {
  74. HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
  75. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
  76. HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
  77. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
  78. },
  79. .max_size = HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
  80. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
  81. },
  82. { /* REO_EXCEPTION */
  83. /* Designating REO2TCL ring as exception ring. This ring is
  84. * similar to other REO2SW rings though it is named as REO2TCL.
  85. * Any of theREO2SW rings can be used as exception ring.
  86. */
  87. .start_ring_id = HAL_SRNG_REO2TCL,
  88. .max_rings = 1,
  89. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  90. .lmac_ring = FALSE,
  91. .ring_dir = HAL_SRNG_DST_RING,
  92. .reg_start = {
  93. HWIO_REO_R0_REO2TCL_RING_BASE_LSB_ADDR(
  94. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  95. HWIO_REO_R2_REO2TCL_RING_HP_ADDR(
  96. SEQ_WCSS_UMAC_REO_REG_OFFSET)
  97. },
  98. /* Single ring - provide ring size if multiple rings of this
  99. * type are supported
  100. */
  101. .reg_size = {},
  102. .max_size = HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_BMSK >>
  103. HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_SHFT,
  104. },
  105. { /* REO_REINJECT */
  106. .start_ring_id = HAL_SRNG_SW2REO,
  107. .max_rings = 1,
  108. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  109. .lmac_ring = FALSE,
  110. .ring_dir = HAL_SRNG_SRC_RING,
  111. .reg_start = {
  112. HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
  113. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  114. HWIO_REO_R2_SW2REO_RING_HP_ADDR(
  115. SEQ_WCSS_UMAC_REO_REG_OFFSET)
  116. },
  117. /* Single ring - provide ring size if multiple rings of this
  118. * type are supported
  119. */
  120. .reg_size = {},
  121. .max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
  122. HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
  123. },
  124. { /* REO_CMD */
  125. .start_ring_id = HAL_SRNG_REO_CMD,
  126. .max_rings = 1,
  127. .entry_size = (sizeof(struct tlv_32_hdr) +
  128. sizeof(struct reo_get_queue_stats)) >> 2,
  129. .lmac_ring = FALSE,
  130. .ring_dir = HAL_SRNG_SRC_RING,
  131. .reg_start = {
  132. HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
  133. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  134. HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
  135. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  136. },
  137. /* Single ring - provide ring size if multiple rings of this
  138. * type are supported
  139. */
  140. .reg_size = {},
  141. .max_size = HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
  142. HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
  143. },
  144. { /* REO_STATUS */
  145. .start_ring_id = HAL_SRNG_REO_STATUS,
  146. .max_rings = 1,
  147. .entry_size = (sizeof(struct tlv_32_hdr) +
  148. sizeof(struct reo_get_queue_stats_status)) >> 2,
  149. .lmac_ring = FALSE,
  150. .ring_dir = HAL_SRNG_DST_RING,
  151. .reg_start = {
  152. HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
  153. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  154. HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
  155. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  156. },
  157. /* Single ring - provide ring size if multiple rings of this
  158. * type are supported
  159. */
  160. .reg_size = {},
  161. .max_size =
  162. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  163. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  164. },
  165. { /* TCL_DATA */
  166. .start_ring_id = HAL_SRNG_SW2TCL1,
  167. .max_rings = 3,
  168. .entry_size = (sizeof(struct tlv_32_hdr) +
  169. sizeof(struct tcl_data_cmd)) >> 2,
  170. .lmac_ring = FALSE,
  171. .ring_dir = HAL_SRNG_SRC_RING,
  172. .reg_start = {
  173. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
  174. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  175. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
  176. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  177. },
  178. .reg_size = {
  179. HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
  180. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
  181. HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
  182. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
  183. },
  184. .max_size = HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
  185. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
  186. },
  187. { /* TCL_CMD */
  188. .start_ring_id = HAL_SRNG_SW2TCL_CMD,
  189. .max_rings = 1,
  190. .entry_size = (sizeof(struct tlv_32_hdr) +
  191. sizeof(struct tcl_gse_cmd)) >> 2,
  192. .lmac_ring = FALSE,
  193. .ring_dir = HAL_SRNG_SRC_RING,
  194. .reg_start = {
  195. HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_LSB_ADDR(
  196. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  197. HWIO_TCL_R2_SW2TCL_CMD_RING_HP_ADDR(
  198. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  199. },
  200. /* Single ring - provide ring size if multiple rings of this
  201. * type are supported
  202. */
  203. .reg_size = {},
  204. .max_size =
  205. HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
  206. HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
  207. },
  208. { /* TCL_STATUS */
  209. .start_ring_id = HAL_SRNG_TCL_STATUS,
  210. .max_rings = 1,
  211. .entry_size = (sizeof(struct tlv_32_hdr) +
  212. sizeof(struct tcl_status_ring)) >> 2,
  213. .lmac_ring = FALSE,
  214. .ring_dir = HAL_SRNG_DST_RING,
  215. .reg_start = {
  216. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
  217. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  218. HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
  219. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  220. },
  221. /* Single ring - provide ring size if multiple rings of this
  222. * type are supported
  223. */
  224. .reg_size = {},
  225. .max_size =
  226. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
  227. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
  228. },
  229. { /* CE_SRC */
  230. .start_ring_id = HAL_SRNG_CE_0_SRC,
  231. .max_rings = 12,
  232. .entry_size = sizeof(struct ce_src_desc) >> 2,
  233. .lmac_ring = FALSE,
  234. .ring_dir = HAL_SRNG_SRC_RING,
  235. .reg_start = {
  236. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
  237. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
  238. HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
  239. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
  240. },
  241. .reg_size = {
  242. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
  243. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
  244. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
  245. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
  246. },
  247. .max_size =
  248. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
  249. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
  250. },
  251. { /* CE_DST */
  252. .start_ring_id = HAL_SRNG_CE_0_DST,
  253. .max_rings = 12,
  254. .entry_size = 8 >> 2,
  255. /*TODO: entry_size above should actually be
  256. * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
  257. * of struct ce_dst_desc in HW header files
  258. */
  259. .lmac_ring = FALSE,
  260. .ring_dir = HAL_SRNG_SRC_RING,
  261. .reg_start = {
  262. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
  263. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  264. HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
  265. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  266. },
  267. .reg_size = {
  268. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  269. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  270. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  271. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  272. },
  273. .max_size =
  274. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
  275. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
  276. },
  277. { /* CE_DST_STATUS */
  278. .start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
  279. .max_rings = 12,
  280. .entry_size = sizeof(struct ce_stat_desc) >> 2,
  281. .lmac_ring = FALSE,
  282. .ring_dir = HAL_SRNG_DST_RING,
  283. .reg_start = {
  284. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR(
  285. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  286. HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR(
  287. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  288. },
  289. /* TODO: check destination status ring registers */
  290. .reg_size = {
  291. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  292. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  293. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  294. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  295. },
  296. .max_size =
  297. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  298. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  299. },
  300. { /* WBM_IDLE_LINK */
  301. .start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
  302. .max_rings = 1,
  303. .entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
  304. .lmac_ring = FALSE,
  305. .ring_dir = HAL_SRNG_SRC_RING,
  306. .reg_start = {
  307. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  308. HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  309. },
  310. /* Single ring - provide ring size if multiple rings of this
  311. * type are supported
  312. */
  313. .reg_size = {},
  314. .max_size =
  315. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
  316. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
  317. },
  318. { /* SW2WBM_RELEASE */
  319. .start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
  320. .max_rings = 1,
  321. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  322. .lmac_ring = FALSE,
  323. .ring_dir = HAL_SRNG_SRC_RING,
  324. .reg_start = {
  325. HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  326. HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  327. },
  328. /* Single ring - provide ring size if multiple rings of this
  329. * type are supported
  330. */
  331. .reg_size = {},
  332. .max_size =
  333. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  334. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  335. },
  336. { /* WBM2SW_RELEASE */
  337. .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
  338. .max_rings = 4,
  339. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  340. .lmac_ring = FALSE,
  341. .ring_dir = HAL_SRNG_DST_RING,
  342. .reg_start = {
  343. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  344. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  345. },
  346. .reg_size = {
  347. HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
  348. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  349. HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
  350. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  351. },
  352. .max_size =
  353. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  354. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  355. },
  356. { /* RXDMA_BUF */
  357. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
  358. #ifdef IPA_OFFLOAD
  359. .max_rings = 3,
  360. #else
  361. .max_rings = 2,
  362. #endif
  363. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  364. .lmac_ring = TRUE,
  365. .ring_dir = HAL_SRNG_SRC_RING,
  366. /* reg_start is not set because LMAC rings are not accessed
  367. * from host
  368. */
  369. .reg_start = {},
  370. .reg_size = {},
  371. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  372. },
  373. { /* RXDMA_DST */
  374. .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
  375. .max_rings = 1,
  376. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  377. .lmac_ring = TRUE,
  378. .ring_dir = HAL_SRNG_DST_RING,
  379. /* reg_start is not set because LMAC rings are not accessed
  380. * from host
  381. */
  382. .reg_start = {},
  383. .reg_size = {},
  384. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  385. },
  386. { /* RXDMA_MONITOR_BUF */
  387. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
  388. .max_rings = 1,
  389. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  390. .lmac_ring = TRUE,
  391. .ring_dir = HAL_SRNG_SRC_RING,
  392. /* reg_start is not set because LMAC rings are not accessed
  393. * from host
  394. */
  395. .reg_start = {},
  396. .reg_size = {},
  397. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  398. },
  399. { /* RXDMA_MONITOR_STATUS */
  400. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
  401. .max_rings = 1,
  402. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  403. .lmac_ring = TRUE,
  404. .ring_dir = HAL_SRNG_SRC_RING,
  405. /* reg_start is not set because LMAC rings are not accessed
  406. * from host
  407. */
  408. .reg_start = {},
  409. .reg_size = {},
  410. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  411. },
  412. { /* RXDMA_MONITOR_DST */
  413. .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW1,
  414. .max_rings = 1,
  415. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  416. .lmac_ring = TRUE,
  417. .ring_dir = HAL_SRNG_DST_RING,
  418. /* reg_start is not set because LMAC rings are not accessed
  419. * from host
  420. */
  421. .reg_start = {},
  422. .reg_size = {},
  423. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  424. },
  425. { /* RXDMA_MONITOR_DESC */
  426. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
  427. .max_rings = 1,
  428. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  429. .lmac_ring = TRUE,
  430. .ring_dir = HAL_SRNG_SRC_RING,
  431. /* reg_start is not set because LMAC rings are not accessed
  432. * from host
  433. */
  434. .reg_start = {},
  435. .reg_size = {},
  436. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  437. },
  438. { /* DIR_BUF_RX_DMA_SRC */
  439. .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
  440. .max_rings = 1,
  441. .entry_size = 2,
  442. .lmac_ring = TRUE,
  443. .ring_dir = HAL_SRNG_SRC_RING,
  444. /* reg_start is not set because LMAC rings are not accessed
  445. * from host
  446. */
  447. .reg_start = {},
  448. .reg_size = {},
  449. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  450. },
  451. #ifdef WLAN_FEATURE_CIF_CFR
  452. { /* WIFI_POS_SRC */
  453. .start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
  454. .max_rings = 1,
  455. .entry_size = sizeof(wmi_oem_dma_buf_release_entry) >> 2,
  456. .lmac_ring = TRUE,
  457. .ring_dir = HAL_SRNG_SRC_RING,
  458. /* reg_start is not set because LMAC rings are not accessed
  459. * from host
  460. */
  461. .reg_start = {},
  462. .reg_size = {},
  463. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  464. },
  465. #endif
  466. };
  467. int32_t hal_hw_reg_offset_qca6290[] = {
  468. /* dst */
  469. REG_OFFSET(DST, HP),
  470. REG_OFFSET(DST, TP),
  471. REG_OFFSET(DST, ID),
  472. REG_OFFSET(DST, MISC),
  473. REG_OFFSET(DST, HP_ADDR_LSB),
  474. REG_OFFSET(DST, HP_ADDR_MSB),
  475. REG_OFFSET(DST, MSI1_BASE_LSB),
  476. REG_OFFSET(DST, MSI1_BASE_MSB),
  477. REG_OFFSET(DST, MSI1_DATA),
  478. REG_OFFSET(DST, BASE_LSB),
  479. REG_OFFSET(DST, BASE_MSB),
  480. REG_OFFSET(DST, PRODUCER_INT_SETUP),
  481. /* src */
  482. REG_OFFSET(SRC, HP),
  483. REG_OFFSET(SRC, TP),
  484. REG_OFFSET(SRC, ID),
  485. REG_OFFSET(SRC, MISC),
  486. REG_OFFSET(SRC, TP_ADDR_LSB),
  487. REG_OFFSET(SRC, TP_ADDR_MSB),
  488. REG_OFFSET(SRC, MSI1_BASE_LSB),
  489. REG_OFFSET(SRC, MSI1_BASE_MSB),
  490. REG_OFFSET(SRC, MSI1_DATA),
  491. REG_OFFSET(SRC, BASE_LSB),
  492. REG_OFFSET(SRC, BASE_MSB),
  493. REG_OFFSET(SRC, CONSUMER_INT_SETUP_IX0),
  494. REG_OFFSET(SRC, CONSUMER_INT_SETUP_IX1),
  495. };
  496. void hal_qca6290_attach(struct hal_soc *hal_soc)
  497. {
  498. hal_soc->hw_srng_table = hw_srng_table_6290;
  499. hal_soc->hal_hw_reg_offset = hal_hw_reg_offset_qca6290;
  500. hal_soc->ops = &qca6290_hal_hw_txrx_ops;
  501. }