1 /* 2 * Copyright (c) 2021 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 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_li_rx.h" 25 26 qdf_size_t dp_get_context_size_li(enum dp_context_type context_type) 27 { 28 switch (context_type) { 29 case DP_CONTEXT_TYPE_SOC: 30 return sizeof(struct dp_soc_li); 31 case DP_CONTEXT_TYPE_PDEV: 32 return sizeof(struct dp_pdev_li); 33 case DP_CONTEXT_TYPE_VDEV: 34 return sizeof(struct dp_vdev_li); 35 case DP_CONTEXT_TYPE_PEER: 36 return sizeof(struct dp_peer_li); 37 default: 38 return 0; 39 } 40 } 41 42 static QDF_STATUS dp_soc_attach_li(struct dp_soc *soc) 43 { 44 soc->wbm_sw0_bm_id = hal_tx_get_wbm_sw0_bm_id(); 45 46 return QDF_STATUS_SUCCESS; 47 } 48 49 static QDF_STATUS dp_soc_detach_li(struct dp_soc *soc) 50 { 51 return QDF_STATUS_SUCCESS; 52 } 53 54 static QDF_STATUS dp_soc_init_li(struct dp_soc *soc) 55 { 56 return QDF_STATUS_SUCCESS; 57 } 58 59 static QDF_STATUS dp_soc_deinit_li(struct dp_soc *soc) 60 { 61 return QDF_STATUS_SUCCESS; 62 } 63 64 static QDF_STATUS dp_pdev_attach_li(struct dp_pdev *pdev) 65 { 66 return QDF_STATUS_SUCCESS; 67 } 68 69 static QDF_STATUS dp_pdev_detach_li(struct dp_pdev *pdev) 70 { 71 return QDF_STATUS_SUCCESS; 72 } 73 74 static QDF_STATUS dp_vdev_attach_li(struct dp_soc *soc, struct dp_vdev *vdev) 75 { 76 return QDF_STATUS_SUCCESS; 77 } 78 79 static QDF_STATUS dp_vdev_detach_li(struct dp_soc *soc, struct dp_vdev *vdev) 80 { 81 return QDF_STATUS_SUCCESS; 82 } 83 84 qdf_size_t dp_get_soc_context_size_li(void) 85 { 86 return sizeof(struct dp_soc); 87 } 88 89 #ifdef NO_RX_PKT_HDR_TLV 90 /** 91 * dp_rxdma_ring_sel_cfg_li() - Setup RXDMA ring config 92 * @soc: Common DP soc handle 93 * 94 * Return: QDF_STATUS 95 */ 96 static QDF_STATUS 97 dp_rxdma_ring_sel_cfg_li(struct dp_soc *soc) 98 { 99 int i; 100 int mac_id; 101 struct htt_rx_ring_tlv_filter htt_tlv_filter = {0}; 102 QDF_STATUS status = QDF_STATUS_SUCCESS; 103 104 htt_tlv_filter.mpdu_start = 1; 105 htt_tlv_filter.msdu_start = 1; 106 htt_tlv_filter.mpdu_end = 1; 107 htt_tlv_filter.msdu_end = 1; 108 htt_tlv_filter.attention = 1; 109 htt_tlv_filter.packet = 1; 110 htt_tlv_filter.packet_header = 0; 111 112 htt_tlv_filter.ppdu_start = 0; 113 htt_tlv_filter.ppdu_end = 0; 114 htt_tlv_filter.ppdu_end_user_stats = 0; 115 htt_tlv_filter.ppdu_end_user_stats_ext = 0; 116 htt_tlv_filter.ppdu_end_status_done = 0; 117 htt_tlv_filter.enable_fp = 1; 118 htt_tlv_filter.enable_md = 0; 119 htt_tlv_filter.enable_md = 0; 120 htt_tlv_filter.enable_mo = 0; 121 122 htt_tlv_filter.fp_mgmt_filter = 0; 123 htt_tlv_filter.fp_ctrl_filter = FILTER_CTRL_BA_REQ; 124 htt_tlv_filter.fp_data_filter = (FILTER_DATA_UCAST | 125 FILTER_DATA_MCAST | 126 FILTER_DATA_DATA); 127 htt_tlv_filter.mo_mgmt_filter = 0; 128 htt_tlv_filter.mo_ctrl_filter = 0; 129 htt_tlv_filter.mo_data_filter = 0; 130 htt_tlv_filter.md_data_filter = 0; 131 132 htt_tlv_filter.offset_valid = true; 133 134 htt_tlv_filter.rx_packet_offset = soc->rx_pkt_tlv_size; 135 /*Not subscribing rx_pkt_header*/ 136 htt_tlv_filter.rx_header_offset = 0; 137 htt_tlv_filter.rx_mpdu_start_offset = 138 hal_rx_mpdu_start_offset_get(soc->hal_soc); 139 htt_tlv_filter.rx_mpdu_end_offset = 140 hal_rx_mpdu_end_offset_get(soc->hal_soc); 141 htt_tlv_filter.rx_msdu_start_offset = 142 hal_rx_msdu_start_offset_get(soc->hal_soc); 143 htt_tlv_filter.rx_msdu_end_offset = 144 hal_rx_msdu_end_offset_get(soc->hal_soc); 145 htt_tlv_filter.rx_attn_offset = 146 hal_rx_attn_offset_get(soc->hal_soc); 147 148 for (i = 0; i < MAX_PDEV_CNT; i++) { 149 struct dp_pdev *pdev = soc->pdev_list[i]; 150 151 if (!pdev) 152 continue; 153 154 for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { 155 int mac_for_pdev = 156 dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id); 157 /* 158 * Obtain lmac id from pdev to access the LMAC ring 159 * in soc context 160 */ 161 int lmac_id = 162 dp_get_lmac_id_for_pdev_id(soc, mac_id, 163 pdev->pdev_id); 164 165 htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, 166 soc->rx_refill_buf_ring[lmac_id]. 167 hal_srng, 168 RXDMA_BUF, RX_DATA_BUFFER_SIZE, 169 &htt_tlv_filter); 170 } 171 } 172 return status; 173 } 174 #else 175 176 static QDF_STATUS 177 dp_rxdma_ring_sel_cfg_li(struct dp_soc *soc) 178 { 179 int i; 180 int mac_id; 181 struct htt_rx_ring_tlv_filter htt_tlv_filter = {0}; 182 struct dp_srng *rx_mac_srng; 183 QDF_STATUS status = QDF_STATUS_SUCCESS; 184 185 htt_tlv_filter.mpdu_start = 1; 186 htt_tlv_filter.msdu_start = 1; 187 htt_tlv_filter.mpdu_end = 1; 188 htt_tlv_filter.msdu_end = 1; 189 htt_tlv_filter.attention = 1; 190 htt_tlv_filter.packet = 1; 191 htt_tlv_filter.packet_header = 1; 192 193 htt_tlv_filter.ppdu_start = 0; 194 htt_tlv_filter.ppdu_end = 0; 195 htt_tlv_filter.ppdu_end_user_stats = 0; 196 htt_tlv_filter.ppdu_end_user_stats_ext = 0; 197 htt_tlv_filter.ppdu_end_status_done = 0; 198 htt_tlv_filter.enable_fp = 1; 199 htt_tlv_filter.enable_md = 0; 200 htt_tlv_filter.enable_md = 0; 201 htt_tlv_filter.enable_mo = 0; 202 203 htt_tlv_filter.fp_mgmt_filter = 0; 204 htt_tlv_filter.fp_ctrl_filter = FILTER_CTRL_BA_REQ; 205 htt_tlv_filter.fp_data_filter = (FILTER_DATA_UCAST | 206 FILTER_DATA_MCAST | 207 FILTER_DATA_DATA); 208 htt_tlv_filter.mo_mgmt_filter = 0; 209 htt_tlv_filter.mo_ctrl_filter = 0; 210 htt_tlv_filter.mo_data_filter = 0; 211 htt_tlv_filter.md_data_filter = 0; 212 213 htt_tlv_filter.offset_valid = true; 214 215 htt_tlv_filter.rx_packet_offset = soc->rx_pkt_tlv_size; 216 htt_tlv_filter.rx_header_offset = 217 hal_rx_pkt_tlv_offset_get(soc->hal_soc); 218 htt_tlv_filter.rx_mpdu_start_offset = 219 hal_rx_mpdu_start_offset_get(soc->hal_soc); 220 htt_tlv_filter.rx_mpdu_end_offset = 221 hal_rx_mpdu_end_offset_get(soc->hal_soc); 222 htt_tlv_filter.rx_msdu_start_offset = 223 hal_rx_msdu_start_offset_get(soc->hal_soc); 224 htt_tlv_filter.rx_msdu_end_offset = 225 hal_rx_msdu_end_offset_get(soc->hal_soc); 226 htt_tlv_filter.rx_attn_offset = 227 hal_rx_attn_offset_get(soc->hal_soc); 228 229 for (i = 0; i < MAX_PDEV_CNT; i++) { 230 struct dp_pdev *pdev = soc->pdev_list[i]; 231 232 if (!pdev) 233 continue; 234 235 for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { 236 int mac_for_pdev = 237 dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id); 238 /* 239 * Obtain lmac id from pdev to access the LMAC ring 240 * in soc context 241 */ 242 int lmac_id = 243 dp_get_lmac_id_for_pdev_id(soc, mac_id, 244 pdev->pdev_id); 245 246 rx_mac_srng = dp_get_rxdma_ring(pdev, lmac_id); 247 htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, 248 rx_mac_srng->hal_srng, 249 RXDMA_BUF, RX_DATA_BUFFER_SIZE, 250 &htt_tlv_filter); 251 } 252 } 253 return status; 254 255 } 256 #endif 257 258 void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) 259 { 260 #ifndef QCA_HOST_MODE_WIFI_DISABLED 261 arch_ops->tx_hw_enqueue = dp_tx_hw_enqueue_li; 262 arch_ops->dp_rx_process = dp_rx_process_li; 263 arch_ops->tx_comp_get_params_from_hal_desc = 264 dp_tx_comp_get_params_from_hal_desc_li; 265 arch_ops->dp_wbm_get_rx_desc_from_hal_desc = 266 dp_wbm_get_rx_desc_from_hal_desc_li; 267 arch_ops->dp_tx_desc_pool_init = dp_tx_desc_pool_init_li; 268 arch_ops->dp_tx_desc_pool_deinit = dp_tx_desc_pool_deinit_li; 269 arch_ops->dp_rx_desc_pool_init = dp_rx_desc_pool_init_li; 270 arch_ops->dp_rx_desc_pool_deinit = dp_rx_desc_pool_deinit_li; 271 #else 272 arch_ops->dp_rx_desc_pool_init = dp_rx_desc_pool_init_generic; 273 arch_ops->dp_rx_desc_pool_deinit = dp_rx_desc_pool_deinit_generic; 274 #endif 275 arch_ops->txrx_get_context_size = dp_get_context_size_li; 276 arch_ops->txrx_soc_attach = dp_soc_attach_li; 277 arch_ops->txrx_soc_detach = dp_soc_detach_li; 278 arch_ops->txrx_soc_init = dp_soc_init_li; 279 arch_ops->txrx_soc_deinit = dp_soc_deinit_li; 280 arch_ops->txrx_pdev_attach = dp_pdev_attach_li; 281 arch_ops->txrx_pdev_detach = dp_pdev_detach_li; 282 arch_ops->txrx_vdev_attach = dp_vdev_attach_li; 283 arch_ops->txrx_vdev_detach = dp_vdev_detach_li; 284 arch_ops->dp_rx_desc_cookie_2_va = 285 dp_rx_desc_cookie_2_va_li; 286 287 arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li; 288 } 289 290