dp_li.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. /*
  2. * Copyright (c) 2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for
  6. * any purpose with or without fee is hereby granted, provided that the
  7. * above copyright notice and this permission notice appear in all
  8. * copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  11. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  12. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  13. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  14. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  15. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  16. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  17. * PERFORMANCE OF THIS SOFTWARE.
  18. */
  19. #include "dp_types.h"
  20. #include <dp_internal.h>
  21. #include <dp_htt.h>
  22. #include "dp_li.h"
  23. #include "dp_li_tx.h"
  24. #include "dp_tx_desc.h"
  25. #include "dp_li_rx.h"
  26. #include "dp_peer.h"
  27. #include <wlan_utility.h>
  28. #if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
  29. static struct wlan_cfg_tcl_wbm_ring_num_map g_tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
  30. {.tcl_ring_num = 0, .wbm_ring_num = 0, .wbm_rbm_id = HAL_LI_WBM_SW0_BM_ID, .for_ipa = 0},
  31. {1, 4, HAL_LI_WBM_SW4_BM_ID, 1}, /* For IPA */
  32. {2, 2, HAL_LI_WBM_SW2_BM_ID, 1} /* For IPA */};
  33. #else
  34. static struct wlan_cfg_tcl_wbm_ring_num_map g_tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
  35. {.tcl_ring_num = 0, .wbm_ring_num = 0, .wbm_rbm_id = HAL_LI_WBM_SW0_BM_ID, .for_ipa = 0},
  36. {1, 1, HAL_LI_WBM_SW1_BM_ID, 0},
  37. {2, 2, HAL_LI_WBM_SW2_BM_ID, 0}
  38. };
  39. #endif
  40. static void dp_soc_cfg_attach_li(struct dp_soc *soc)
  41. {
  42. struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx = soc->wlan_cfg_ctx;
  43. wlan_cfg_set_rx_rel_ring_id(soc_cfg_ctx, WBM2SW_REL_ERR_RING_NUM);
  44. soc_cfg_ctx->tcl_wbm_map_array = g_tcl_wbm_map_array;
  45. }
  46. qdf_size_t dp_get_context_size_li(enum dp_context_type context_type)
  47. {
  48. switch (context_type) {
  49. case DP_CONTEXT_TYPE_SOC:
  50. return sizeof(struct dp_soc_li);
  51. case DP_CONTEXT_TYPE_PDEV:
  52. return sizeof(struct dp_pdev_li);
  53. case DP_CONTEXT_TYPE_VDEV:
  54. return sizeof(struct dp_vdev_li);
  55. case DP_CONTEXT_TYPE_PEER:
  56. return sizeof(struct dp_peer_li);
  57. default:
  58. return 0;
  59. }
  60. }
  61. qdf_size_t dp_mon_get_context_size_li(enum dp_context_type context_type)
  62. {
  63. switch (context_type) {
  64. case DP_CONTEXT_TYPE_MON_PDEV:
  65. return sizeof(struct dp_mon_pdev_li);
  66. case DP_CONTEXT_TYPE_MON_SOC:
  67. return sizeof(struct dp_mon_soc_li);
  68. default:
  69. return 0;
  70. }
  71. }
  72. static QDF_STATUS dp_soc_attach_li(struct dp_soc *soc,
  73. struct cdp_soc_attach_params *params)
  74. {
  75. soc->wbm_sw0_bm_id = hal_tx_get_wbm_sw0_bm_id();
  76. return QDF_STATUS_SUCCESS;
  77. }
  78. static QDF_STATUS dp_soc_detach_li(struct dp_soc *soc)
  79. {
  80. return QDF_STATUS_SUCCESS;
  81. }
  82. static QDF_STATUS dp_soc_init_li(struct dp_soc *soc)
  83. {
  84. return QDF_STATUS_SUCCESS;
  85. }
  86. static QDF_STATUS dp_soc_deinit_li(struct dp_soc *soc)
  87. {
  88. return QDF_STATUS_SUCCESS;
  89. }
  90. static QDF_STATUS dp_pdev_attach_li(struct dp_pdev *pdev,
  91. struct cdp_pdev_attach_params *params)
  92. {
  93. return QDF_STATUS_SUCCESS;
  94. }
  95. static QDF_STATUS dp_pdev_detach_li(struct dp_pdev *pdev)
  96. {
  97. return QDF_STATUS_SUCCESS;
  98. }
  99. static QDF_STATUS dp_vdev_attach_li(struct dp_soc *soc, struct dp_vdev *vdev)
  100. {
  101. return QDF_STATUS_SUCCESS;
  102. }
  103. static QDF_STATUS dp_vdev_detach_li(struct dp_soc *soc, struct dp_vdev *vdev)
  104. {
  105. return QDF_STATUS_SUCCESS;
  106. }
  107. #ifdef AST_OFFLOAD_ENABLE
  108. static void dp_peer_map_detach_li(struct dp_soc *soc)
  109. {
  110. dp_soc_wds_detach(soc);
  111. dp_peer_ast_table_detach(soc);
  112. dp_peer_ast_hash_detach(soc);
  113. dp_peer_mec_hash_detach(soc);
  114. }
  115. static QDF_STATUS dp_peer_map_attach_li(struct dp_soc *soc)
  116. {
  117. QDF_STATUS status;
  118. soc->max_peer_id = soc->max_peers;
  119. status = dp_peer_ast_table_attach(soc);
  120. if (!QDF_IS_STATUS_SUCCESS(status))
  121. return status;
  122. status = dp_peer_ast_hash_attach(soc);
  123. if (!QDF_IS_STATUS_SUCCESS(status))
  124. goto ast_table_detach;
  125. status = dp_peer_mec_hash_attach(soc);
  126. if (!QDF_IS_STATUS_SUCCESS(status))
  127. goto hash_detach;
  128. dp_soc_wds_attach(soc);
  129. return QDF_STATUS_SUCCESS;
  130. hash_detach:
  131. dp_peer_ast_hash_detach(soc);
  132. ast_table_detach:
  133. dp_peer_ast_table_detach(soc);
  134. return status;
  135. }
  136. #else
  137. static void dp_peer_map_detach_li(struct dp_soc *soc)
  138. {
  139. }
  140. static QDF_STATUS dp_peer_map_attach_li(struct dp_soc *soc)
  141. {
  142. soc->max_peer_id = soc->max_peers;
  143. return QDF_STATUS_SUCCESS;
  144. }
  145. #endif
  146. qdf_size_t dp_get_soc_context_size_li(void)
  147. {
  148. return sizeof(struct dp_soc);
  149. }
  150. #ifdef NO_RX_PKT_HDR_TLV
  151. /**
  152. * dp_rxdma_ring_sel_cfg_li() - Setup RXDMA ring config
  153. * @soc: Common DP soc handle
  154. *
  155. * Return: QDF_STATUS
  156. */
  157. static QDF_STATUS
  158. dp_rxdma_ring_sel_cfg_li(struct dp_soc *soc)
  159. {
  160. int i;
  161. int mac_id;
  162. struct htt_rx_ring_tlv_filter htt_tlv_filter = {0};
  163. struct dp_srng *rx_mac_srng;
  164. QDF_STATUS status = QDF_STATUS_SUCCESS;
  165. htt_tlv_filter.mpdu_start = 1;
  166. htt_tlv_filter.msdu_start = 1;
  167. htt_tlv_filter.mpdu_end = 1;
  168. htt_tlv_filter.msdu_end = 1;
  169. htt_tlv_filter.attention = 1;
  170. htt_tlv_filter.packet = 1;
  171. htt_tlv_filter.packet_header = 0;
  172. htt_tlv_filter.ppdu_start = 0;
  173. htt_tlv_filter.ppdu_end = 0;
  174. htt_tlv_filter.ppdu_end_user_stats = 0;
  175. htt_tlv_filter.ppdu_end_user_stats_ext = 0;
  176. htt_tlv_filter.ppdu_end_status_done = 0;
  177. htt_tlv_filter.enable_fp = 1;
  178. htt_tlv_filter.enable_md = 0;
  179. htt_tlv_filter.enable_md = 0;
  180. htt_tlv_filter.enable_mo = 0;
  181. htt_tlv_filter.fp_mgmt_filter = 0;
  182. htt_tlv_filter.fp_ctrl_filter = FILTER_CTRL_BA_REQ;
  183. htt_tlv_filter.fp_data_filter = (FILTER_DATA_UCAST |
  184. FILTER_DATA_MCAST |
  185. FILTER_DATA_DATA);
  186. htt_tlv_filter.mo_mgmt_filter = 0;
  187. htt_tlv_filter.mo_ctrl_filter = 0;
  188. htt_tlv_filter.mo_data_filter = 0;
  189. htt_tlv_filter.md_data_filter = 0;
  190. htt_tlv_filter.offset_valid = true;
  191. htt_tlv_filter.rx_packet_offset = soc->rx_pkt_tlv_size;
  192. /*Not subscribing rx_pkt_header*/
  193. htt_tlv_filter.rx_header_offset = 0;
  194. htt_tlv_filter.rx_mpdu_start_offset =
  195. hal_rx_mpdu_start_offset_get(soc->hal_soc);
  196. htt_tlv_filter.rx_mpdu_end_offset =
  197. hal_rx_mpdu_end_offset_get(soc->hal_soc);
  198. htt_tlv_filter.rx_msdu_start_offset =
  199. hal_rx_msdu_start_offset_get(soc->hal_soc);
  200. htt_tlv_filter.rx_msdu_end_offset =
  201. hal_rx_msdu_end_offset_get(soc->hal_soc);
  202. htt_tlv_filter.rx_attn_offset =
  203. hal_rx_attn_offset_get(soc->hal_soc);
  204. for (i = 0; i < MAX_PDEV_CNT; i++) {
  205. struct dp_pdev *pdev = soc->pdev_list[i];
  206. if (!pdev)
  207. continue;
  208. for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
  209. int mac_for_pdev =
  210. dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id);
  211. /*
  212. * Obtain lmac id from pdev to access the LMAC ring
  213. * in soc context
  214. */
  215. int lmac_id =
  216. dp_get_lmac_id_for_pdev_id(soc, mac_id,
  217. pdev->pdev_id);
  218. rx_mac_srng = dp_get_rxdma_ring(pdev, lmac_id);
  219. htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev,
  220. rx_mac_srng->hal_srng,
  221. RXDMA_BUF, RX_DATA_BUFFER_SIZE,
  222. &htt_tlv_filter);
  223. }
  224. }
  225. return status;
  226. }
  227. #else
  228. static QDF_STATUS
  229. dp_rxdma_ring_sel_cfg_li(struct dp_soc *soc)
  230. {
  231. int i;
  232. int mac_id;
  233. struct htt_rx_ring_tlv_filter htt_tlv_filter = {0};
  234. struct dp_srng *rx_mac_srng;
  235. QDF_STATUS status = QDF_STATUS_SUCCESS;
  236. htt_tlv_filter.mpdu_start = 1;
  237. htt_tlv_filter.msdu_start = 1;
  238. htt_tlv_filter.mpdu_end = 1;
  239. htt_tlv_filter.msdu_end = 1;
  240. htt_tlv_filter.attention = 1;
  241. htt_tlv_filter.packet = 1;
  242. htt_tlv_filter.packet_header = 1;
  243. htt_tlv_filter.ppdu_start = 0;
  244. htt_tlv_filter.ppdu_end = 0;
  245. htt_tlv_filter.ppdu_end_user_stats = 0;
  246. htt_tlv_filter.ppdu_end_user_stats_ext = 0;
  247. htt_tlv_filter.ppdu_end_status_done = 0;
  248. htt_tlv_filter.enable_fp = 1;
  249. htt_tlv_filter.enable_md = 0;
  250. htt_tlv_filter.enable_md = 0;
  251. htt_tlv_filter.enable_mo = 0;
  252. htt_tlv_filter.fp_mgmt_filter = 0;
  253. htt_tlv_filter.fp_ctrl_filter = FILTER_CTRL_BA_REQ;
  254. htt_tlv_filter.fp_data_filter = (FILTER_DATA_UCAST |
  255. FILTER_DATA_MCAST |
  256. FILTER_DATA_DATA);
  257. htt_tlv_filter.mo_mgmt_filter = 0;
  258. htt_tlv_filter.mo_ctrl_filter = 0;
  259. htt_tlv_filter.mo_data_filter = 0;
  260. htt_tlv_filter.md_data_filter = 0;
  261. htt_tlv_filter.offset_valid = true;
  262. htt_tlv_filter.rx_packet_offset = soc->rx_pkt_tlv_size;
  263. htt_tlv_filter.rx_header_offset =
  264. hal_rx_pkt_tlv_offset_get(soc->hal_soc);
  265. htt_tlv_filter.rx_mpdu_start_offset =
  266. hal_rx_mpdu_start_offset_get(soc->hal_soc);
  267. htt_tlv_filter.rx_mpdu_end_offset =
  268. hal_rx_mpdu_end_offset_get(soc->hal_soc);
  269. htt_tlv_filter.rx_msdu_start_offset =
  270. hal_rx_msdu_start_offset_get(soc->hal_soc);
  271. htt_tlv_filter.rx_msdu_end_offset =
  272. hal_rx_msdu_end_offset_get(soc->hal_soc);
  273. htt_tlv_filter.rx_attn_offset =
  274. hal_rx_attn_offset_get(soc->hal_soc);
  275. for (i = 0; i < MAX_PDEV_CNT; i++) {
  276. struct dp_pdev *pdev = soc->pdev_list[i];
  277. if (!pdev)
  278. continue;
  279. for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
  280. int mac_for_pdev =
  281. dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id);
  282. /*
  283. * Obtain lmac id from pdev to access the LMAC ring
  284. * in soc context
  285. */
  286. int lmac_id =
  287. dp_get_lmac_id_for_pdev_id(soc, mac_id,
  288. pdev->pdev_id);
  289. rx_mac_srng = dp_get_rxdma_ring(pdev, lmac_id);
  290. htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev,
  291. rx_mac_srng->hal_srng,
  292. RXDMA_BUF, RX_DATA_BUFFER_SIZE,
  293. &htt_tlv_filter);
  294. }
  295. }
  296. return status;
  297. }
  298. #endif
  299. #ifdef QCA_DP_ENABLE_TX_COMP_RING4
  300. static inline
  301. void dp_deinit_txcomp_ring4(struct dp_soc *soc)
  302. {
  303. if (soc) {
  304. wlan_minidump_remove(soc->tx_comp_ring[3].base_vaddr_unaligned,
  305. soc->tx_comp_ring[3].alloc_size,
  306. soc->ctrl_psoc, WLAN_MD_DP_SRNG_TX_COMP,
  307. "Transmit_completion_ring");
  308. dp_srng_deinit(soc, &soc->tx_comp_ring[3], WBM2SW_RELEASE, 0);
  309. }
  310. }
  311. static inline
  312. QDF_STATUS dp_init_txcomp_ring4(struct dp_soc *soc)
  313. {
  314. if (soc) {
  315. if (dp_srng_init(soc, &soc->tx_comp_ring[3],
  316. WBM2SW_RELEASE, WBM2SW_TXCOMP_RING4_NUM, 0)) {
  317. dp_err("%pK: dp_srng_init failed for rx_rel_ring",
  318. soc);
  319. return QDF_STATUS_E_FAILURE;
  320. }
  321. wlan_minidump_log(soc->tx_comp_ring[3].base_vaddr_unaligned,
  322. soc->tx_comp_ring[3].alloc_size,
  323. soc->ctrl_psoc, WLAN_MD_DP_SRNG_TX_COMP,
  324. "Transmit_completion_ring");
  325. }
  326. return QDF_STATUS_SUCCESS;
  327. }
  328. static inline
  329. void dp_free_txcomp_ring4(struct dp_soc *soc)
  330. {
  331. if (soc)
  332. dp_srng_free(soc, &soc->tx_comp_ring[3]);
  333. }
  334. static inline
  335. QDF_STATUS dp_alloc_txcomp_ring4(struct dp_soc *soc, uint32_t tx_comp_ring_size,
  336. uint32_t cached)
  337. {
  338. if (soc) {
  339. if (dp_srng_alloc(soc, &soc->tx_comp_ring[3], WBM2SW_RELEASE,
  340. tx_comp_ring_size, cached)) {
  341. dp_err("dp_srng_alloc failed for tx_comp_ring");
  342. return QDF_STATUS_E_FAILURE;
  343. }
  344. }
  345. return QDF_STATUS_SUCCESS;
  346. }
  347. #else
  348. static inline
  349. void dp_deinit_txcomp_ring4(struct dp_soc *soc)
  350. {
  351. }
  352. static inline
  353. QDF_STATUS dp_init_txcomp_ring4(struct dp_soc *soc)
  354. {
  355. return QDF_STATUS_SUCCESS;
  356. }
  357. static inline
  358. void dp_free_txcomp_ring4(struct dp_soc *soc)
  359. {
  360. }
  361. static inline
  362. QDF_STATUS dp_alloc_txcomp_ring4(struct dp_soc *soc, uint32_t tx_comp_ring_size,
  363. uint32_t cached)
  364. {
  365. return QDF_STATUS_SUCCESS;
  366. }
  367. #endif
  368. static void dp_soc_srng_deinit_li(struct dp_soc *soc)
  369. {
  370. /* Tx Complete ring */
  371. dp_deinit_txcomp_ring4(soc);
  372. }
  373. static void dp_soc_srng_free_li(struct dp_soc *soc)
  374. {
  375. dp_free_txcomp_ring4(soc);
  376. }
  377. static QDF_STATUS dp_soc_srng_alloc_li(struct dp_soc *soc)
  378. {
  379. uint32_t tx_comp_ring_size;
  380. uint32_t cached = WLAN_CFG_DST_RING_CACHED_DESC;
  381. struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
  382. soc_cfg_ctx = soc->wlan_cfg_ctx;
  383. tx_comp_ring_size = wlan_cfg_tx_comp_ring_size(soc_cfg_ctx);
  384. /* Disable cached desc if NSS offload is enabled */
  385. if (wlan_cfg_get_dp_soc_nss_cfg(soc_cfg_ctx))
  386. cached = 0;
  387. if (dp_alloc_txcomp_ring4(soc, tx_comp_ring_size, cached))
  388. goto fail1;
  389. return QDF_STATUS_SUCCESS;
  390. fail1:
  391. dp_soc_srng_free_li(soc);
  392. return QDF_STATUS_E_NOMEM;
  393. }
  394. static QDF_STATUS dp_soc_srng_init_li(struct dp_soc *soc)
  395. {
  396. /* Tx comp ring 3 */
  397. if (dp_init_txcomp_ring4(soc))
  398. goto fail1;
  399. return QDF_STATUS_SUCCESS;
  400. fail1:
  401. /*
  402. * Cleanup will be done as part of soc_detach, which will
  403. * be called on pdev attach failure
  404. */
  405. dp_soc_srng_deinit_li(soc);
  406. return QDF_STATUS_E_FAILURE;
  407. }
  408. static void dp_tx_implicit_rbm_set_li(struct dp_soc *soc,
  409. uint8_t tx_ring_id,
  410. uint8_t bm_id)
  411. {
  412. }
  413. static void dp_peer_get_reo_hash_li(struct dp_vdev *vdev,
  414. struct cdp_peer_setup_info *setup_info,
  415. enum cdp_host_reo_dest_ring *reo_dest,
  416. bool *hash_based,
  417. uint8_t *lmac_peer_id_msb)
  418. {
  419. dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based);
  420. }
  421. static bool dp_reo_remap_config_li(struct dp_soc *soc,
  422. uint32_t *remap0,
  423. uint32_t *remap1,
  424. uint32_t *remap2)
  425. {
  426. return dp_reo_remap_config(soc, remap0, remap1, remap2);
  427. }
  428. static QDF_STATUS dp_txrx_set_vdev_param_li(struct dp_soc *soc,
  429. struct dp_vdev *vdev,
  430. enum cdp_vdev_param_type param,
  431. cdp_config_param_type val)
  432. {
  433. return QDF_STATUS_SUCCESS;
  434. }
  435. void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
  436. {
  437. #ifndef QCA_HOST_MODE_WIFI_DISABLED
  438. arch_ops->tx_hw_enqueue = dp_tx_hw_enqueue_li;
  439. arch_ops->dp_rx_process = dp_rx_process_li;
  440. arch_ops->tx_comp_get_params_from_hal_desc =
  441. dp_tx_comp_get_params_from_hal_desc_li;
  442. arch_ops->dp_tx_process_htt_completion =
  443. dp_tx_process_htt_completion_li;
  444. arch_ops->dp_wbm_get_rx_desc_from_hal_desc =
  445. dp_wbm_get_rx_desc_from_hal_desc_li;
  446. arch_ops->dp_tx_desc_pool_init = dp_tx_desc_pool_init_li;
  447. arch_ops->dp_tx_desc_pool_deinit = dp_tx_desc_pool_deinit_li;
  448. arch_ops->dp_rx_desc_pool_init = dp_rx_desc_pool_init_li;
  449. arch_ops->dp_rx_desc_pool_deinit = dp_rx_desc_pool_deinit_li;
  450. #else
  451. arch_ops->dp_rx_desc_pool_init = dp_rx_desc_pool_init_generic;
  452. arch_ops->dp_rx_desc_pool_deinit = dp_rx_desc_pool_deinit_generic;
  453. #endif
  454. arch_ops->txrx_get_context_size = dp_get_context_size_li;
  455. arch_ops->txrx_get_mon_context_size = dp_mon_get_context_size_li;
  456. arch_ops->txrx_soc_attach = dp_soc_attach_li;
  457. arch_ops->txrx_soc_detach = dp_soc_detach_li;
  458. arch_ops->txrx_soc_init = dp_soc_init_li;
  459. arch_ops->txrx_soc_deinit = dp_soc_deinit_li;
  460. arch_ops->txrx_soc_srng_alloc = dp_soc_srng_alloc_li;
  461. arch_ops->txrx_soc_srng_init = dp_soc_srng_init_li;
  462. arch_ops->txrx_soc_srng_deinit = dp_soc_srng_deinit_li;
  463. arch_ops->txrx_soc_srng_free = dp_soc_srng_free_li;
  464. arch_ops->txrx_pdev_attach = dp_pdev_attach_li;
  465. arch_ops->txrx_pdev_detach = dp_pdev_detach_li;
  466. arch_ops->txrx_vdev_attach = dp_vdev_attach_li;
  467. arch_ops->txrx_vdev_detach = dp_vdev_detach_li;
  468. arch_ops->txrx_peer_map_attach = dp_peer_map_attach_li;
  469. arch_ops->txrx_peer_map_detach = dp_peer_map_detach_li;
  470. arch_ops->dp_rx_desc_cookie_2_va =
  471. dp_rx_desc_cookie_2_va_li;
  472. arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li;
  473. arch_ops->dp_rx_peer_metadata_peer_id_get =
  474. dp_rx_peer_metadata_peer_id_get_li;
  475. arch_ops->soc_cfg_attach = dp_soc_cfg_attach_li;
  476. arch_ops->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_li;
  477. arch_ops->peer_get_reo_hash = dp_peer_get_reo_hash_li;
  478. arch_ops->reo_remap_config = dp_reo_remap_config_li;
  479. arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_li;
  480. arch_ops->txrx_print_peer_stats = dp_print_peer_txrx_stats_li;
  481. arch_ops->dp_peer_rx_reorder_queue_setup =
  482. dp_peer_rx_reorder_queue_setup_li;
  483. }
  484. #ifdef QCA_DP_TX_HW_SW_NBUF_DESC_PREFETCH
  485. void dp_tx_comp_get_prefetched_params_from_hal_desc(
  486. struct dp_soc *soc,
  487. void *tx_comp_hal_desc,
  488. struct dp_tx_desc_s **r_tx_desc)
  489. {
  490. uint8_t pool_id;
  491. uint32_t tx_desc_id;
  492. tx_desc_id = hal_tx_comp_get_desc_id(tx_comp_hal_desc);
  493. pool_id = (tx_desc_id & DP_TX_DESC_ID_POOL_MASK) >>
  494. DP_TX_DESC_ID_POOL_OS;
  495. /* Find Tx descriptor */
  496. *r_tx_desc = dp_tx_desc_find(soc, pool_id,
  497. (tx_desc_id & DP_TX_DESC_ID_PAGE_MASK) >>
  498. DP_TX_DESC_ID_PAGE_OS,
  499. (tx_desc_id & DP_TX_DESC_ID_OFFSET_MASK) >>
  500. DP_TX_DESC_ID_OFFSET_OS);
  501. qdf_prefetch((uint8_t *)*r_tx_desc);
  502. }
  503. #endif
  504. #ifdef CONFIG_DP_PKT_ADD_TIMESTAMP
  505. void dp_pkt_add_timestamp(struct dp_vdev *vdev,
  506. enum qdf_pkt_timestamp_index index, uint64_t time,
  507. qdf_nbuf_t nbuf)
  508. {
  509. if (qdf_unlikely(qdf_is_dp_pkt_timestamp_enabled())) {
  510. uint64_t tsf_time;
  511. if (vdev->get_tsf_time) {
  512. vdev->get_tsf_time(vdev->osif_vdev, time, &tsf_time);
  513. qdf_add_dp_pkt_timestamp(nbuf, index, tsf_time);
  514. }
  515. }
  516. }
  517. void dp_pkt_get_timestamp(uint64_t *time)
  518. {
  519. if (qdf_unlikely(qdf_is_dp_pkt_timestamp_enabled()))
  520. *time = qdf_get_log_timestamp();
  521. }
  522. #endif