xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/li/dp_li.c (revision 5611ef508114526caa3c58ffe2e188650c7b53d1) !
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