xref: /linux/drivers/net/wireless/ath/ath12k/wifi7/dp_tx.c (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
4  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
5  */
6 
7 #include "../core.h"
8 #include "../debug.h"
9 #include "../dp_tx.h"
10 #include "../peer.h"
11 #include "dp_tx.h"
12 #include "hal_desc.h"
13 #include "hal.h"
14 #include "hal_tx.h"
15 
16 /*
17  * Convert an encrypted EAPOL frame from native-WiFi format to
18  * the layout expected by the firmware RAW encrypt pipeline:
19  *
20  *   [802.11 hdr][IV (zeroed)][LLC/SNAP][EAPOL payload][ICV (zeroed)]
21  *
22  * mac80211 delivers the frame as [802.11 hdr][LLC/SNAP][EAPOL payload].
23  * The MAC header length is read from the unmodified skb and is safe because
24  * ieee80211_hdrlen() only inspects the 2-byte frame_control field.
25  * pskb_expand_head() is used to grow both head (for the IV) and tail
26  * (for the ICV) in a single call and allocation.
27  */
28 static int
ath12k_wifi7_dp_tx_encap_eapol(struct sk_buff * skb,struct hal_tx_info * ti,struct ath12k_skb_cb * skb_cb)29 ath12k_wifi7_dp_tx_encap_eapol(struct sk_buff *skb,
30 			       struct hal_tx_info *ti,
31 			       struct ath12k_skb_cb *skb_cb)
32 {
33 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
34 	enum hal_encrypt_type enc_type =
35 				ath12k_dp_tx_get_encrypt_type(skb_cb->cipher);
36 	u16 mac_hdr_len = ieee80211_hdrlen(hdr->frame_control);
37 	u8 iv_len = ath12k_dp_tx_crypto_iv_len(enc_type);
38 	u8 icv_len = ath12k_dp_tx_crypto_icv_len(enc_type);
39 
40 	if (pskb_expand_head(skb, iv_len, icv_len, GFP_ATOMIC))
41 		return -ENOMEM;
42 
43 	if (iv_len) {
44 		skb_push(skb, iv_len);
45 		memmove(skb->data, skb->data + iv_len, mac_hdr_len);
46 		memset(skb->data + mac_hdr_len, 0, iv_len);
47 	}
48 
49 	if (icv_len)
50 		memset(skb_put(skb, icv_len), 0, icv_len);
51 
52 	ti->flags0 |= u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_TO_FW);
53 	ti->encap_type = HAL_TCL_ENCAP_TYPE_RAW;
54 	ti->encrypt_type = enc_type;
55 
56 	return 0;
57 }
58 
59 static void
ath12k_wifi7_hal_tx_cmd_ext_desc_setup(struct ath12k_base * ab,struct hal_tx_msdu_ext_desc * tcl_ext_cmd,struct hal_tx_info * ti)60 ath12k_wifi7_hal_tx_cmd_ext_desc_setup(struct ath12k_base *ab,
61 				       struct hal_tx_msdu_ext_desc *tcl_ext_cmd,
62 				       struct hal_tx_info *ti)
63 {
64 	tcl_ext_cmd->info0 = le32_encode_bits(ti->paddr,
65 					      HAL_TX_MSDU_EXT_INFO0_BUF_PTR_LO);
66 	tcl_ext_cmd->info1 = le32_encode_bits(0x0,
67 					      HAL_TX_MSDU_EXT_INFO1_BUF_PTR_HI) |
68 			       le32_encode_bits(ti->data_len,
69 						HAL_TX_MSDU_EXT_INFO1_BUF_LEN);
70 
71 	tcl_ext_cmd->info1 |= le32_encode_bits(1, HAL_TX_MSDU_EXT_INFO1_EXTN_OVERRIDE) |
72 				le32_encode_bits(ti->encap_type,
73 						 HAL_TX_MSDU_EXT_INFO1_ENCAP_TYPE) |
74 				le32_encode_bits(ti->encrypt_type,
75 						 HAL_TX_MSDU_EXT_INFO1_ENCRYPT_TYPE);
76 }
77 
78 #define HTT_META_DATA_ALIGNMENT 0x8
79 
80 /* Preparing HTT Metadata when utilized with ext MSDU */
ath12k_wifi7_dp_prepare_htt_metadata(struct sk_buff * skb)81 static int ath12k_wifi7_dp_prepare_htt_metadata(struct sk_buff *skb)
82 {
83 	struct hal_tx_msdu_metadata *desc_ext;
84 	u8 htt_desc_size;
85 	/* Size rounded of multiple of 8 bytes */
86 	u8 htt_desc_size_aligned;
87 
88 	htt_desc_size = sizeof(struct hal_tx_msdu_metadata);
89 	htt_desc_size_aligned = ALIGN(htt_desc_size, HTT_META_DATA_ALIGNMENT);
90 
91 	desc_ext = ath12k_dp_metadata_align_skb(skb, htt_desc_size_aligned);
92 	if (!desc_ext)
93 		return -ENOMEM;
94 
95 	desc_ext->info0 = le32_encode_bits(1, HAL_TX_MSDU_METADATA_INFO0_ENCRYPT_FLAG) |
96 			  le32_encode_bits(0, HAL_TX_MSDU_METADATA_INFO0_ENCRYPT_TYPE) |
97 			  le32_encode_bits(1,
98 					   HAL_TX_MSDU_METADATA_INFO0_HOST_TX_DESC_POOL);
99 
100 	return 0;
101 }
102 
103 #define ATH12K_AST_HASH_MASK	0xF
104 
105 /* TODO: Remove the export once this file is built with wifi7 ko */
ath12k_wifi7_dp_tx(struct ath12k_pdev_dp * dp_pdev,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct sk_buff * skb,bool gsn_valid,int mcbc_gsn,bool is_mcast)106 int ath12k_wifi7_dp_tx(struct ath12k_pdev_dp *dp_pdev, struct ath12k_link_vif *arvif,
107 		       struct ath12k_link_sta *arsta, struct sk_buff *skb,
108 		       bool gsn_valid, int mcbc_gsn, bool is_mcast)
109 {
110 	struct ath12k_dp *dp = dp_pdev->dp;
111 	struct ath12k_hal *hal = dp->hal;
112 	struct ath12k_base *ab = dp->ab;
113 	struct hal_tx_info ti = {};
114 	struct ath12k_tx_desc_info *tx_desc;
115 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
116 	struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
117 	struct hal_tcl_data_cmd *hal_tcl_desc;
118 	struct hal_tx_msdu_ext_desc *msg;
119 	struct sk_buff *skb_ext_desc = NULL;
120 	struct hal_srng *tcl_ring;
121 	struct ieee80211_hdr *hdr = (void *)skb->data;
122 	struct ath12k_vif *ahvif = arvif->ahvif;
123 	struct ath12k_dp_vif *dp_vif = &ahvif->dp_vif;
124 	struct ath12k_dp_link_vif *dp_link_vif;
125 	struct dp_tx_ring *tx_ring;
126 	struct ethhdr *eth = NULL;
127 	u8 pool_id;
128 	u8 hal_ring_id;
129 	int ret;
130 	u8 ring_selector, ring_map = 0;
131 	bool tcl_ring_retry;
132 	bool msdu_ext_desc = false;
133 	bool add_htt_metadata = false;
134 	u32 iova_mask = dp->hw_params->iova_mask;
135 	bool is_diff_encap = false;
136 	bool is_null_frame = false;
137 	bool eapol_encap_done = false;
138 
139 	if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ab->dev_flags))
140 		return -ESHUTDOWN;
141 
142 	if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) &&
143 	    !ieee80211_is_data(hdr->frame_control))
144 		return -EOPNOTSUPP;
145 
146 	if (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP)
147 		eth = (struct ethhdr *)skb->data;
148 
149 	pool_id = skb_get_queue_mapping(skb) & (ATH12K_HW_MAX_QUEUES - 1);
150 
151 	/* Let the default ring selection be based on current processor
152 	 * number, where one of the 3 tcl rings are selected based on
153 	 * the smp_processor_id(). In case that ring
154 	 * is full/busy, we resort to other available rings.
155 	 * If all rings are full, we drop the packet.
156 	 * TODO: Add throttling logic when all rings are full
157 	 */
158 	ring_selector = dp->hw_params->hw_ops->get_ring_selector(skb);
159 
160 tcl_ring_sel:
161 	tcl_ring_retry = false;
162 	ti.ring_id = ring_selector % dp->hw_params->max_tx_ring;
163 
164 	ring_map |= BIT(ti.ring_id);
165 	ti.rbm_id = hal->tcl_to_wbm_rbm_map[ti.ring_id].rbm_id;
166 
167 	tx_ring = &dp->tx_ring[ti.ring_id];
168 
169 	tx_desc = ath12k_dp_tx_assign_buffer(dp, pool_id);
170 	if (!tx_desc)
171 		return -ENOMEM;
172 
173 	dp_link_vif = ath12k_dp_vif_to_dp_link_vif(&ahvif->dp_vif, arvif->link_id);
174 
175 	ti.bank_id = dp_link_vif->bank_id;
176 	ti.meta_data_flags = dp_link_vif->tcl_metadata;
177 	ti.bss_ast_hash = dp_link_vif->ast_hash;
178 	ti.bss_ast_idx = dp_link_vif->ast_idx;
179 
180 	if (eth && is_multicast_ether_addr(eth->h_dest) && arsta) {
181 		ti.meta_data_flags = arsta->tcl_metadata;
182 		ti.bss_ast_hash = arsta->ast_hash & ATH12K_AST_HASH_MASK;
183 		ti.bss_ast_idx = arsta->ast_idx;
184 		ti.lookup_override = true;
185 	} else if (!eth && ieee80211_has_a4(hdr->frame_control) &&
186 		   is_multicast_ether_addr(hdr->addr3) && arsta) {
187 		ti.meta_data_flags = arsta->tcl_metadata;
188 		ti.flags0 |= u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_TO_FW);
189 	}
190 
191 	if (dp_vif->tx_encap_type == HAL_TCL_ENCAP_TYPE_RAW &&
192 	    test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags)) {
193 		if (skb_cb->flags & ATH12K_SKB_CIPHER_SET) {
194 			ti.encrypt_type =
195 				ath12k_dp_tx_get_encrypt_type(skb_cb->cipher);
196 
197 			if (ieee80211_has_protected(hdr->frame_control))
198 				skb_put(skb, IEEE80211_CCMP_MIC_LEN);
199 		} else {
200 			ti.encrypt_type = HAL_ENCRYPT_TYPE_OPEN;
201 		}
202 
203 		msdu_ext_desc = true;
204 	}
205 
206 	if (gsn_valid && !ti.lookup_override) {
207 		/* Reset and Initialize meta_data_flags with Global Sequence
208 		 * Number (GSN) info.
209 		 */
210 		ti.meta_data_flags =
211 			u32_encode_bits(HTT_TCL_META_DATA_TYPE_GLOBAL_SEQ_NUM,
212 					HTT_TCL_META_DATA_TYPE) |
213 			u32_encode_bits(mcbc_gsn, HTT_TCL_META_DATA_GLOBAL_SEQ_NUM);
214 
215 		/*
216 		 * Since NAWDS enabled for this vdev firmware expects
217 		 * this flag to be set for sending 3-address multicast frame.
218 		 */
219 		ti.meta_data_flags |=
220 			u32_encode_bits(arvif->nawds_enabled,
221 					HTT_TCL_META_DATA_GLOBAL_SEQ_HOST_INSPECTED);
222 	}
223 
224 	ti.encap_type = ath12k_dp_tx_get_encap_type(ab, skb);
225 	ti.addr_search_flags = dp_link_vif->hal_addr_search_flags;
226 	ti.search_type = dp_link_vif->search_type;
227 	ti.type = HAL_TCL_DESC_TYPE_BUFFER;
228 	ti.pkt_offset = 0;
229 	ti.lmac_id = dp_link_vif->lmac_id;
230 
231 	ti.vdev_id = dp_link_vif->vdev_id;
232 
233 	if (gsn_valid && !ti.lookup_override)
234 		ti.vdev_id += HTT_TX_MLO_MCAST_HOST_REINJECT_BASE_VDEV_ID;
235 	else if (arvif->nawds_enabled && is_mcast && !ti.lookup_override)
236 		ti.meta_data_flags |=
237 			u32_encode_bits(1, HTT_TCL_META_DATA_HOST_INSPECTED_MISSION);
238 
239 	ti.dscp_tid_tbl_idx = 0;
240 
241 	if (skb->ip_summed == CHECKSUM_PARTIAL &&
242 	    ti.encap_type != HAL_TCL_ENCAP_TYPE_RAW) {
243 		ti.flags0 |= u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_IP4_CKSUM_EN) |
244 			     u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_UDP4_CKSUM_EN) |
245 			     u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_UDP6_CKSUM_EN) |
246 			     u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_TCP4_CKSUM_EN) |
247 			     u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_TCP6_CKSUM_EN);
248 	}
249 
250 	ti.flags1 |= u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO3_TID_OVERWRITE);
251 
252 	ti.tid = ath12k_dp_tx_get_tid(skb);
253 
254 	switch (ti.encap_type) {
255 	case HAL_TCL_ENCAP_TYPE_NATIVE_WIFI:
256 		is_null_frame = ieee80211_is_nullfunc(hdr->frame_control);
257 		if (ahvif->vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) {
258 			if ((skb->protocol == cpu_to_be16(ETH_P_PAE) &&
259 			     !(skb_cb->flags & ATH12K_SKB_CIPHER_SET)) || is_null_frame)
260 				is_diff_encap = true;
261 
262 			if (skb->protocol == cpu_to_be16(ETH_P_PAE) &&
263 			    (skb_cb->flags & ATH12K_SKB_CIPHER_SET)) {
264 				if (!eapol_encap_done) {
265 					ret = ath12k_wifi7_dp_tx_encap_eapol(skb, &ti,
266 									     skb_cb);
267 					if (ret)
268 						goto fail_remove_tx_buf;
269 					hdr = (void *)skb->data;
270 					eapol_encap_done = true;
271 				} else {
272 					ti.flags0 |= u32_encode_bits(1,
273 							HAL_TCL_DATA_CMD_INFO2_TO_FW);
274 					ti.encap_type = HAL_TCL_ENCAP_TYPE_RAW;
275 					ti.encrypt_type =
276 						ath12k_dp_tx_get_encrypt_type(skb_cb->cipher);
277 				}
278 			}
279 			/* Firmware expects msdu ext descriptor for nwifi/raw packets
280 			 * received in ETH mode. Without this, observed tx fail for
281 			 * Multicast packets in ETH mode.
282 			 */
283 			msdu_ext_desc = true;
284 		} else {
285 			ath12k_dp_tx_encap_nwifi(skb);
286 		}
287 		break;
288 	case HAL_TCL_ENCAP_TYPE_RAW:
289 		if (!test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) {
290 			ret = -EINVAL;
291 			goto fail_remove_tx_buf;
292 		}
293 		break;
294 	case HAL_TCL_ENCAP_TYPE_ETHERNET:
295 		/* no need to encap */
296 		break;
297 	case HAL_TCL_ENCAP_TYPE_802_3:
298 	default:
299 		/* TODO: Take care of other encap modes as well */
300 		ret = -EINVAL;
301 		atomic_inc(&dp->device_stats.tx_err.misc_fail);
302 		goto fail_remove_tx_buf;
303 	}
304 
305 	if (iova_mask &&
306 	    (unsigned long)skb->data & iova_mask) {
307 		ret = ath12k_dp_tx_align_payload(dp, &skb);
308 		if (ret) {
309 			ath12k_warn(ab, "failed to align TX buffer %d\n", ret);
310 			/* don't bail out, give original buffer
311 			 * a chance even unaligned.
312 			 */
313 			goto map;
314 		}
315 
316 		/* hdr is pointing to a wrong place after alignment,
317 		 * so refresh it for later use.
318 		 */
319 		hdr = (void *)skb->data;
320 	}
321 map:
322 	ti.paddr = dma_map_single(dp->dev, skb->data, skb->len, DMA_TO_DEVICE);
323 	if (dma_mapping_error(dp->dev, ti.paddr)) {
324 		atomic_inc(&dp->device_stats.tx_err.misc_fail);
325 		ath12k_warn(ab, "failed to DMA map data Tx buffer\n");
326 		ret = -ENOMEM;
327 		goto fail_remove_tx_buf;
328 	}
329 
330 	if ((!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags) &&
331 	     !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) &&
332 	     !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
333 	     ieee80211_has_protected(hdr->frame_control)) ||
334 	    is_diff_encap) {
335 		/* Firmware is not expecting meta data for qos null
336 		 * nwifi packet received in ETH encap mode.
337 		 */
338 		if (is_null_frame && msdu_ext_desc)
339 			goto skip_htt_meta;
340 
341 		/* Add metadata for sw encrypted vlan group traffic
342 		 * and EAPOL nwifi packet received in ETH encap mode.
343 		 */
344 		add_htt_metadata = true;
345 		msdu_ext_desc = true;
346 		ti.meta_data_flags |= HTT_TCL_META_DATA_VALID_HTT;
347 skip_htt_meta:
348 		ti.flags0 |= u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_TO_FW);
349 		ti.encap_type = HAL_TCL_ENCAP_TYPE_RAW;
350 		ti.encrypt_type = HAL_ENCRYPT_TYPE_OPEN;
351 	}
352 
353 	tx_desc->skb = skb;
354 	tx_desc->mac_id = dp_link_vif->pdev_idx;
355 	ti.desc_id = tx_desc->desc_id;
356 	ti.data_len = skb->len;
357 	skb_cb->paddr = ti.paddr;
358 
359 	if (msdu_ext_desc) {
360 		skb_ext_desc = dev_alloc_skb(sizeof(struct hal_tx_msdu_ext_desc));
361 		if (!skb_ext_desc) {
362 			ret = -ENOMEM;
363 			goto fail_unmap_dma;
364 		}
365 
366 		skb_put(skb_ext_desc, sizeof(struct hal_tx_msdu_ext_desc));
367 		memset(skb_ext_desc->data, 0, skb_ext_desc->len);
368 
369 		msg = (struct hal_tx_msdu_ext_desc *)skb_ext_desc->data;
370 		ath12k_wifi7_hal_tx_cmd_ext_desc_setup(ab, msg, &ti);
371 
372 		if (add_htt_metadata) {
373 			ret = ath12k_wifi7_dp_prepare_htt_metadata(skb_ext_desc);
374 			if (ret < 0) {
375 				ath12k_dbg(ab, ATH12K_DBG_DP_TX,
376 					   "Failed to add HTT meta data, dropping packet\n");
377 				goto fail_free_ext_skb;
378 			}
379 		}
380 
381 		ti.paddr = dma_map_single(dp->dev, skb_ext_desc->data,
382 					  skb_ext_desc->len, DMA_TO_DEVICE);
383 		ret = dma_mapping_error(dp->dev, ti.paddr);
384 		if (ret)
385 			goto fail_free_ext_skb;
386 
387 		ti.data_len = skb_ext_desc->len;
388 		ti.type = HAL_TCL_DESC_TYPE_EXT_DESC;
389 
390 		skb_cb->paddr_ext_desc = ti.paddr;
391 		tx_desc->skb_ext_desc = skb_ext_desc;
392 	}
393 
394 	hal_ring_id = tx_ring->tcl_data_ring.ring_id;
395 	tcl_ring = &hal->srng_list[hal_ring_id];
396 
397 	spin_lock_bh(&tcl_ring->lock);
398 
399 	ath12k_hal_srng_access_begin(ab, tcl_ring);
400 
401 	hal_tcl_desc = ath12k_hal_srng_src_get_next_entry(ab, tcl_ring);
402 	if (!hal_tcl_desc) {
403 		/* NOTE: It is highly unlikely we'll be running out of tcl_ring
404 		 * desc because the desc is directly enqueued onto hw queue.
405 		 */
406 		ath12k_hal_srng_access_end(ab, tcl_ring);
407 		dp->device_stats.tx_err.desc_na[ti.ring_id]++;
408 		spin_unlock_bh(&tcl_ring->lock);
409 		ret = -ENOMEM;
410 
411 		/* Checking for available tcl descriptors in another ring in
412 		 * case of failure due to full tcl ring now, is better than
413 		 * checking this ring earlier for each pkt tx.
414 		 * Restart ring selection if some rings are not checked yet.
415 		 */
416 		if (ring_map != (BIT(dp->hw_params->max_tx_ring) - 1) &&
417 		    dp->hw_params->tcl_ring_retry) {
418 			tcl_ring_retry = true;
419 			ring_selector++;
420 		}
421 
422 		goto fail_unmap_dma_ext;
423 	}
424 
425 	spin_lock_bh(&arvif->link_stats_lock);
426 	arvif->link_stats.tx_encap_type[ti.encap_type]++;
427 	arvif->link_stats.tx_encrypt_type[ti.encrypt_type]++;
428 	arvif->link_stats.tx_desc_type[ti.type]++;
429 
430 	if (is_mcast)
431 		arvif->link_stats.tx_bcast_mcast++;
432 	else
433 		arvif->link_stats.tx_enqueued++;
434 	spin_unlock_bh(&arvif->link_stats_lock);
435 
436 	dp->device_stats.tx_enqueued[ti.ring_id]++;
437 
438 	ath12k_wifi7_hal_tx_cmd_desc_setup(ab, hal_tcl_desc, &ti);
439 
440 	ath12k_hal_srng_access_end(ab, tcl_ring);
441 
442 	spin_unlock_bh(&tcl_ring->lock);
443 
444 	ath12k_dbg_dump(ab, ATH12K_DBG_DP_TX, NULL, "dp tx msdu: ",
445 			skb->data, skb->len);
446 
447 	atomic_inc(&dp_pdev->num_tx_pending);
448 
449 	return 0;
450 
451 fail_unmap_dma_ext:
452 	if (skb_cb->paddr_ext_desc)
453 		dma_unmap_single(dp->dev, skb_cb->paddr_ext_desc,
454 				 skb_ext_desc->len,
455 				 DMA_TO_DEVICE);
456 fail_free_ext_skb:
457 	kfree_skb(skb_ext_desc);
458 
459 fail_unmap_dma:
460 	dma_unmap_single(dp->dev, ti.paddr, ti.data_len, DMA_TO_DEVICE);
461 
462 fail_remove_tx_buf:
463 	ath12k_dp_tx_release_txbuf(dp, tx_desc, pool_id);
464 
465 	spin_lock_bh(&arvif->link_stats_lock);
466 	arvif->link_stats.tx_dropped++;
467 	spin_unlock_bh(&arvif->link_stats_lock);
468 
469 	if (tcl_ring_retry)
470 		goto tcl_ring_sel;
471 
472 	return ret;
473 }
474 
475 static void
ath12k_dp_tx_htt_tx_complete_buf(struct ath12k_dp * dp,struct ath12k_tx_desc_params * desc_params,struct dp_tx_ring * tx_ring,struct ath12k_dp_htt_wbm_tx_status * ts,u16 peer_id)476 ath12k_dp_tx_htt_tx_complete_buf(struct ath12k_dp *dp,
477 				 struct ath12k_tx_desc_params *desc_params,
478 				 struct dp_tx_ring *tx_ring,
479 				 struct ath12k_dp_htt_wbm_tx_status *ts,
480 				 u16 peer_id)
481 {
482 	struct ath12k_base *ab = dp->ab;
483 	struct ieee80211_tx_info *info;
484 	struct ath12k_link_vif *arvif;
485 	struct ath12k_skb_cb *skb_cb;
486 	struct ieee80211_vif *vif;
487 	struct ath12k_vif *ahvif;
488 	struct sk_buff *msdu = desc_params->skb;
489 	s32 noise_floor;
490 	struct ieee80211_tx_status status = {};
491 	struct ath12k_dp_link_peer *peer;
492 	struct ath12k_pdev_dp *dp_pdev;
493 	u8 pdev_id;
494 
495 	skb_cb = ATH12K_SKB_CB(msdu);
496 	info = IEEE80211_SKB_CB(msdu);
497 
498 	pdev_id = ath12k_hw_mac_id_to_pdev_id(dp->hw_params, desc_params->mac_id);
499 
500 	rcu_read_lock();
501 	dp_pdev = ath12k_dp_to_pdev_dp(dp, pdev_id);
502 	if (!dp_pdev) {
503 		rcu_read_unlock();
504 		return;
505 	}
506 
507 	dp->device_stats.tx_completed[tx_ring->tcl_data_ring_id]++;
508 
509 	if (atomic_dec_and_test(&dp_pdev->num_tx_pending))
510 		wake_up(&dp_pdev->tx_empty_waitq);
511 
512 	dma_unmap_single(dp->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
513 	if (skb_cb->paddr_ext_desc) {
514 		dma_unmap_single(dp->dev, skb_cb->paddr_ext_desc,
515 				 desc_params->skb_ext_desc->len, DMA_TO_DEVICE);
516 		dev_kfree_skb_any(desc_params->skb_ext_desc);
517 	}
518 
519 	vif = skb_cb->vif;
520 	if (vif) {
521 		ahvif = ath12k_vif_to_ahvif(vif);
522 		arvif = rcu_dereference(ahvif->link[skb_cb->link_id]);
523 		if (arvif) {
524 			spin_lock_bh(&arvif->link_stats_lock);
525 			arvif->link_stats.tx_completed++;
526 			spin_unlock_bh(&arvif->link_stats_lock);
527 		}
528 	}
529 
530 	memset(&info->status, 0, sizeof(info->status));
531 
532 	if (ts->acked) {
533 		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) {
534 			info->flags |= IEEE80211_TX_STAT_ACK;
535 			info->status.ack_signal = ts->ack_rssi;
536 
537 			if (!test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
538 				      ab->wmi_ab.svc_map)) {
539 				struct ath12k *ar = ath12k_pdev_dp_to_ar(dp_pdev);
540 
541 				spin_lock_bh(&ar->data_lock);
542 				noise_floor = ath12k_pdev_get_noise_floor(ar);
543 				spin_unlock_bh(&ar->data_lock);
544 
545 				info->status.ack_signal += noise_floor;
546 			}
547 
548 			info->status.flags = IEEE80211_TX_STATUS_ACK_SIGNAL_VALID;
549 		} else {
550 			info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
551 		}
552 	}
553 
554 	peer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, peer_id);
555 	if (!peer || !peer->sta) {
556 		ath12k_dbg(ab, ATH12K_DBG_DATA,
557 			   "dp_tx: failed to find the peer with peer_id %d\n", peer_id);
558 		ieee80211_free_txskb(ath12k_pdev_dp_to_hw(dp_pdev), msdu);
559 		goto exit;
560 	} else {
561 		status.sta = peer->sta;
562 	}
563 
564 	status.info = info;
565 	status.skb = msdu;
566 	ieee80211_tx_status_ext(ath12k_pdev_dp_to_hw(dp_pdev), &status);
567 exit:
568 	rcu_read_unlock();
569 }
570 
571 static void
ath12k_dp_tx_process_htt_tx_complete(struct ath12k_dp * dp,void * desc,struct dp_tx_ring * tx_ring,struct ath12k_tx_desc_params * desc_params)572 ath12k_dp_tx_process_htt_tx_complete(struct ath12k_dp *dp, void *desc,
573 				     struct dp_tx_ring *tx_ring,
574 				     struct ath12k_tx_desc_params *desc_params)
575 {
576 	struct htt_tx_wbm_completion *status_desc;
577 	struct ath12k_dp_htt_wbm_tx_status ts = {};
578 	enum hal_wbm_htt_tx_comp_status wbm_status;
579 	u16 peer_id;
580 
581 	status_desc = desc;
582 
583 	wbm_status = le32_get_bits(status_desc->info0,
584 				   HTT_TX_WBM_COMP_INFO0_STATUS);
585 	dp->device_stats.fw_tx_status[wbm_status]++;
586 
587 	switch (wbm_status) {
588 	case HAL_WBM_REL_HTT_TX_COMP_STATUS_OK:
589 		ts.acked = (wbm_status == HAL_WBM_REL_HTT_TX_COMP_STATUS_OK);
590 		ts.ack_rssi = le32_get_bits(status_desc->info2,
591 					    HTT_TX_WBM_COMP_INFO2_ACK_RSSI);
592 
593 		peer_id = le32_get_bits(((struct hal_wbm_completion_ring_tx *)desc)->
594 				info3, HAL_WBM_COMPL_TX_INFO3_PEER_ID);
595 
596 		ath12k_dp_tx_htt_tx_complete_buf(dp, desc_params, tx_ring, &ts, peer_id);
597 		break;
598 	case HAL_WBM_REL_HTT_TX_COMP_STATUS_DROP:
599 	case HAL_WBM_REL_HTT_TX_COMP_STATUS_TTL:
600 	case HAL_WBM_REL_HTT_TX_COMP_STATUS_REINJ:
601 	case HAL_WBM_REL_HTT_TX_COMP_STATUS_INSPECT:
602 	case HAL_WBM_REL_HTT_TX_COMP_STATUS_VDEVID_MISMATCH:
603 		ath12k_dp_tx_free_txbuf(dp, tx_ring, desc_params);
604 		break;
605 	case HAL_WBM_REL_HTT_TX_COMP_STATUS_MEC_NOTIFY:
606 		/* This event is to be handled only when the driver decides to
607 		 * use WDS offload functionality.
608 		 */
609 		break;
610 	default:
611 		ath12k_warn(dp->ab, "Unknown htt wbm tx status %d\n", wbm_status);
612 		break;
613 	}
614 }
615 
ath12k_wifi7_dp_tx_update_txcompl(struct ath12k_pdev_dp * dp_pdev,struct hal_tx_status * ts)616 static void ath12k_wifi7_dp_tx_update_txcompl(struct ath12k_pdev_dp *dp_pdev,
617 					      struct hal_tx_status *ts)
618 {
619 	struct ath12k_dp *dp = dp_pdev->dp;
620 	struct ath12k_dp_link_peer *peer;
621 	struct ath12k_link_sta *arsta;
622 	struct rate_info txrate = {};
623 	struct ieee80211_sta *sta;
624 	struct ath12k_sta *ahsta;
625 	u16 rate, ru_tones;
626 	u8 rate_idx = 0;
627 	int ret;
628 
629 	peer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, ts->peer_id);
630 	if (!peer || !peer->sta) {
631 		ath12k_dbg(dp->ab, ATH12K_DBG_DP_TX,
632 			   "failed to find the peer by id %u\n", ts->peer_id);
633 		return;
634 	}
635 
636 	spin_lock_bh(&dp->dp_lock);
637 
638 	sta = peer->sta;
639 	ahsta = ath12k_sta_to_ahsta(sta);
640 	arsta = &ahsta->deflink;
641 
642 	spin_unlock_bh(&dp->dp_lock);
643 
644 	/* This is to prefer choose the real NSS value arsta->last_txrate.nss,
645 	 * if it is invalid, then choose the NSS value while assoc.
646 	 */
647 	if (peer->last_txrate.nss)
648 		txrate.nss = peer->last_txrate.nss;
649 	else
650 		txrate.nss = arsta->peer_nss;
651 
652 	switch (ts->pkt_type) {
653 	case HAL_TX_RATE_STATS_PKT_TYPE_11A:
654 	case HAL_TX_RATE_STATS_PKT_TYPE_11B:
655 		ret = ath12k_mac_hw_ratecode_to_legacy_rate(ts->mcs,
656 							    ts->pkt_type,
657 							    &rate_idx,
658 							    &rate);
659 		if (ret < 0) {
660 			ath12k_warn(dp->ab, "Invalid tx legacy rate %d\n", ret);
661 			return;
662 		}
663 
664 		txrate.legacy = rate;
665 		break;
666 	case HAL_TX_RATE_STATS_PKT_TYPE_11N:
667 		if (ts->mcs > ATH12K_HT_MCS_MAX) {
668 			ath12k_warn(dp->ab, "Invalid HT mcs index %d\n", ts->mcs);
669 			return;
670 		}
671 
672 		if (txrate.nss != 0)
673 			txrate.mcs = ts->mcs + 8 * (txrate.nss - 1);
674 
675 		txrate.flags = RATE_INFO_FLAGS_MCS;
676 
677 		if (ts->sgi)
678 			txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
679 		break;
680 	case HAL_TX_RATE_STATS_PKT_TYPE_11AC:
681 		if (ts->mcs > ATH12K_VHT_MCS_MAX) {
682 			ath12k_warn(dp->ab, "Invalid VHT mcs index %d\n", ts->mcs);
683 			return;
684 		}
685 
686 		txrate.mcs = ts->mcs;
687 		txrate.flags = RATE_INFO_FLAGS_VHT_MCS;
688 
689 		if (ts->sgi)
690 			txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
691 		break;
692 	case HAL_TX_RATE_STATS_PKT_TYPE_11AX:
693 		if (ts->mcs > ATH12K_HE_MCS_MAX) {
694 			ath12k_warn(dp->ab, "Invalid HE mcs index %d\n", ts->mcs);
695 			return;
696 		}
697 
698 		txrate.mcs = ts->mcs;
699 		txrate.flags = RATE_INFO_FLAGS_HE_MCS;
700 		txrate.he_gi = ath12k_he_gi_to_nl80211_he_gi(ts->sgi);
701 		break;
702 	case HAL_TX_RATE_STATS_PKT_TYPE_11BE:
703 		if (ts->mcs > ATH12K_EHT_MCS_MAX) {
704 			ath12k_warn(dp->ab, "Invalid EHT mcs index %d\n", ts->mcs);
705 			return;
706 		}
707 
708 		txrate.mcs = ts->mcs;
709 		txrate.flags = RATE_INFO_FLAGS_EHT_MCS;
710 		txrate.eht_gi = ath12k_mac_eht_gi_to_nl80211_eht_gi(ts->sgi);
711 		break;
712 	default:
713 		ath12k_warn(dp->ab, "Invalid tx pkt type: %d\n", ts->pkt_type);
714 		return;
715 	}
716 
717 	txrate.bw = ath12k_mac_bw_to_mac80211_bw(ts->bw);
718 
719 	if (ts->ofdma && ts->pkt_type == HAL_TX_RATE_STATS_PKT_TYPE_11AX) {
720 		txrate.bw = RATE_INFO_BW_HE_RU;
721 		ru_tones = ath12k_mac_he_convert_tones_to_ru_tones(ts->tones);
722 		txrate.he_ru_alloc =
723 			ath12k_he_ru_tones_to_nl80211_he_ru_alloc(ru_tones);
724 	}
725 
726 	if (ts->ofdma && ts->pkt_type == HAL_TX_RATE_STATS_PKT_TYPE_11BE) {
727 		txrate.bw = RATE_INFO_BW_EHT_RU;
728 		txrate.eht_ru_alloc =
729 			ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(ts->tones);
730 	}
731 
732 	spin_lock_bh(&dp->dp_lock);
733 	peer->txrate = txrate;
734 	spin_unlock_bh(&dp->dp_lock);
735 }
736 
ath12k_wifi7_dp_tx_complete_msdu(struct ath12k_pdev_dp * dp_pdev,struct ath12k_tx_desc_params * desc_params,struct hal_tx_status * ts,int ring)737 static void ath12k_wifi7_dp_tx_complete_msdu(struct ath12k_pdev_dp *dp_pdev,
738 					     struct ath12k_tx_desc_params *desc_params,
739 					     struct hal_tx_status *ts,
740 					     int ring)
741 {
742 	struct ath12k_dp *dp = dp_pdev->dp;
743 	struct ath12k_base *ab = dp->ab;
744 	struct ieee80211_tx_info *info;
745 	struct ath12k_link_vif *arvif;
746 	struct ath12k_skb_cb *skb_cb;
747 	struct ieee80211_vif *vif;
748 	struct ath12k_vif *ahvif;
749 	struct sk_buff *msdu = desc_params->skb;
750 	s32 noise_floor;
751 	struct ieee80211_tx_status status = {};
752 	struct ieee80211_rate_status status_rate = {};
753 	struct ath12k_dp_link_peer *peer;
754 	struct rate_info rate;
755 
756 	if (WARN_ON_ONCE(ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)) {
757 		/* Must not happen */
758 		return;
759 	}
760 
761 	skb_cb = ATH12K_SKB_CB(msdu);
762 	dp->device_stats.tx_completed[ring]++;
763 
764 	dma_unmap_single(dp->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
765 	if (skb_cb->paddr_ext_desc) {
766 		dma_unmap_single(dp->dev, skb_cb->paddr_ext_desc,
767 				 desc_params->skb_ext_desc->len, DMA_TO_DEVICE);
768 		dev_kfree_skb_any(desc_params->skb_ext_desc);
769 	}
770 
771 	rcu_read_lock();
772 
773 	if (!rcu_dereference(ab->pdevs_active[dp_pdev->mac_id])) {
774 		ieee80211_free_txskb(ath12k_pdev_dp_to_hw(dp_pdev), msdu);
775 		goto exit;
776 	}
777 
778 	if (!skb_cb->vif) {
779 		ieee80211_free_txskb(ath12k_pdev_dp_to_hw(dp_pdev), msdu);
780 		goto exit;
781 	}
782 
783 	vif = skb_cb->vif;
784 	if (vif) {
785 		ahvif = ath12k_vif_to_ahvif(vif);
786 		arvif = rcu_dereference(ahvif->link[skb_cb->link_id]);
787 		if (arvif) {
788 			spin_lock_bh(&arvif->link_stats_lock);
789 			arvif->link_stats.tx_completed++;
790 			spin_unlock_bh(&arvif->link_stats_lock);
791 		}
792 	}
793 
794 	info = IEEE80211_SKB_CB(msdu);
795 	memset(&info->status, 0, sizeof(info->status));
796 
797 	/* skip tx rate update from ieee80211_status*/
798 	info->status.rates[0].idx = -1;
799 
800 	switch (ts->status) {
801 	case HAL_WBM_TQM_REL_REASON_FRAME_ACKED:
802 		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) {
803 			info->flags |= IEEE80211_TX_STAT_ACK;
804 			info->status.ack_signal = ts->ack_rssi;
805 
806 			if (!test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
807 				      ab->wmi_ab.svc_map)) {
808 				struct ath12k *ar = ath12k_pdev_dp_to_ar(dp_pdev);
809 
810 				spin_lock_bh(&ar->data_lock);
811 				noise_floor = ath12k_pdev_get_noise_floor(ar);
812 				spin_unlock_bh(&ar->data_lock);
813 
814 				info->status.ack_signal += noise_floor;
815 			}
816 
817 			info->status.flags = IEEE80211_TX_STATUS_ACK_SIGNAL_VALID;
818 		}
819 		break;
820 	case HAL_WBM_TQM_REL_REASON_CMD_REMOVE_TX:
821 		if (info->flags & IEEE80211_TX_CTL_NO_ACK) {
822 			info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
823 			break;
824 		}
825 		fallthrough;
826 	case HAL_WBM_TQM_REL_REASON_CMD_REMOVE_MPDU:
827 	case HAL_WBM_TQM_REL_REASON_DROP_THRESHOLD:
828 	case HAL_WBM_TQM_REL_REASON_CMD_REMOVE_AGED_FRAMES:
829 		/* The failure status is due to internal firmware tx failure
830 		 * hence drop the frame; do not update the status of frame to
831 		 * the upper layer
832 		 */
833 		ieee80211_free_txskb(ath12k_pdev_dp_to_hw(dp_pdev), msdu);
834 		goto exit;
835 	default:
836 		ath12k_dbg(ab, ATH12K_DBG_DP_TX, "tx frame is not acked status %d\n",
837 			   ts->status);
838 		break;
839 	}
840 
841 	/* NOTE: Tx rate status reporting. Tx completion status does not have
842 	 * necessary information (for example nss) to build the tx rate.
843 	 * Might end up reporting it out-of-band from HTT stats.
844 	 */
845 
846 	ath12k_wifi7_dp_tx_update_txcompl(dp_pdev, ts);
847 
848 	peer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, ts->peer_id);
849 	if (!peer || !peer->sta) {
850 		ath12k_err(ab,
851 			   "dp_tx: failed to find the peer with peer_id %d\n",
852 			   ts->peer_id);
853 		ieee80211_free_txskb(ath12k_pdev_dp_to_hw(dp_pdev), msdu);
854 		goto exit;
855 	}
856 
857 	status.sta = peer->sta;
858 	status.info = info;
859 	status.skb = msdu;
860 	rate = peer->last_txrate;
861 
862 	status_rate.rate_idx = rate;
863 	status_rate.try_count = 1;
864 
865 	status.rates = &status_rate;
866 	status.n_rates = 1;
867 	ieee80211_tx_status_ext(ath12k_pdev_dp_to_hw(dp_pdev), &status);
868 
869 exit:
870 	rcu_read_unlock();
871 }
872 
873 static void
ath12k_wifi7_dp_tx_status_parse(struct ath12k_dp * dp,struct hal_wbm_completion_ring_tx * desc,struct hal_tx_status * ts)874 ath12k_wifi7_dp_tx_status_parse(struct ath12k_dp *dp,
875 				struct hal_wbm_completion_ring_tx *desc,
876 				struct hal_tx_status *ts)
877 {
878 	u32 info0 = le32_to_cpu(desc->rate_stats.info0);
879 
880 	ts->buf_rel_source =
881 		le32_get_bits(desc->info0, HAL_WBM_COMPL_TX_INFO0_REL_SRC_MODULE);
882 	if (ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_FW &&
883 	    ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)
884 		return;
885 
886 	if (ts->buf_rel_source == HAL_WBM_REL_SRC_MODULE_FW)
887 		return;
888 
889 	ts->status = le32_get_bits(desc->info0,
890 				   HAL_WBM_COMPL_TX_INFO0_TQM_RELEASE_REASON);
891 
892 	ts->ppdu_id = le32_get_bits(desc->info1,
893 				    HAL_WBM_COMPL_TX_INFO1_TQM_STATUS_NUMBER);
894 
895 	ts->peer_id = le32_get_bits(desc->info3, HAL_WBM_COMPL_TX_INFO3_PEER_ID);
896 
897 	ts->ack_rssi = le32_get_bits(desc->info2,
898 				     HAL_WBM_COMPL_TX_INFO2_ACK_FRAME_RSSI);
899 
900 	if (info0 & HAL_TX_RATE_STATS_INFO0_VALID) {
901 		ts->pkt_type = u32_get_bits(info0, HAL_TX_RATE_STATS_INFO0_PKT_TYPE);
902 		ts->mcs = u32_get_bits(info0, HAL_TX_RATE_STATS_INFO0_MCS);
903 		ts->sgi = u32_get_bits(info0, HAL_TX_RATE_STATS_INFO0_SGI);
904 		ts->bw = u32_get_bits(info0, HAL_TX_RATE_STATS_INFO0_BW);
905 		ts->tones = u32_get_bits(info0, HAL_TX_RATE_STATS_INFO0_TONES_IN_RU);
906 		ts->ofdma = u32_get_bits(info0, HAL_TX_RATE_STATS_INFO0_OFDMA_TX);
907 	}
908 }
909 
ath12k_wifi7_dp_tx_completion_handler(struct ath12k_dp * dp,int ring_id)910 void ath12k_wifi7_dp_tx_completion_handler(struct ath12k_dp *dp, int ring_id)
911 {
912 	struct ath12k_base *ab = dp->ab;
913 	struct ath12k_pdev_dp *dp_pdev;
914 	int hal_ring_id = dp->tx_ring[ring_id].tcl_comp_ring.ring_id;
915 	struct hal_srng *status_ring = &dp->hal->srng_list[hal_ring_id];
916 	struct ath12k_tx_desc_info *tx_desc = NULL;
917 	struct hal_tx_status ts = {};
918 	struct ath12k_tx_desc_params desc_params;
919 	struct dp_tx_ring *tx_ring = &dp->tx_ring[ring_id];
920 	struct hal_wbm_release_ring *desc;
921 	u8 pdev_idx;
922 	u64 desc_va;
923 	enum hal_wbm_rel_src_module buf_rel_source;
924 	enum hal_wbm_tqm_rel_reason rel_status;
925 
926 	spin_lock_bh(&status_ring->lock);
927 
928 	ath12k_hal_srng_access_begin(ab, status_ring);
929 
930 	while (ATH12K_TX_COMPL_NEXT(ab, tx_ring->tx_status_head) !=
931 	       tx_ring->tx_status_tail) {
932 		desc = ath12k_hal_srng_dst_get_next_entry(ab, status_ring);
933 		if (!desc)
934 			break;
935 
936 		memcpy(&tx_ring->tx_status[tx_ring->tx_status_head],
937 		       desc, sizeof(*desc));
938 		tx_ring->tx_status_head =
939 			ATH12K_TX_COMPL_NEXT(ab, tx_ring->tx_status_head);
940 	}
941 
942 	if (ath12k_hal_srng_dst_peek(ab, status_ring) &&
943 	    (ATH12K_TX_COMPL_NEXT(ab, tx_ring->tx_status_head) ==
944 	     tx_ring->tx_status_tail)) {
945 		/* TODO: Process pending tx_status messages when kfifo_is_full() */
946 		ath12k_warn(ab, "Unable to process some of the tx_status ring desc because status_fifo is full\n");
947 	}
948 
949 	ath12k_hal_srng_access_end(ab, status_ring);
950 
951 	spin_unlock_bh(&status_ring->lock);
952 
953 	while (ATH12K_TX_COMPL_NEXT(ab, tx_ring->tx_status_tail) !=
954 	       tx_ring->tx_status_head) {
955 		struct hal_wbm_completion_ring_tx *tx_status;
956 		u32 desc_id;
957 
958 		tx_ring->tx_status_tail =
959 			ATH12K_TX_COMPL_NEXT(ab, tx_ring->tx_status_tail);
960 		tx_status = &tx_ring->tx_status[tx_ring->tx_status_tail];
961 		ath12k_wifi7_dp_tx_status_parse(dp, tx_status, &ts);
962 
963 		if (le32_get_bits(tx_status->info0, HAL_WBM_COMPL_TX_INFO0_CC_DONE)) {
964 			/* HW done cookie conversion */
965 			desc_va = ((u64)le32_to_cpu(tx_status->buf_va_hi) << 32 |
966 				   le32_to_cpu(tx_status->buf_va_lo));
967 			tx_desc = (struct ath12k_tx_desc_info *)((unsigned long)desc_va);
968 		} else {
969 			/* SW does cookie conversion to VA */
970 			desc_id = le32_get_bits(tx_status->buf_va_hi,
971 						BUFFER_ADDR_INFO1_SW_COOKIE);
972 
973 			tx_desc = ath12k_dp_get_tx_desc(dp, desc_id);
974 		}
975 		if (!tx_desc) {
976 			ath12k_warn(ab, "unable to retrieve tx_desc!");
977 			continue;
978 		}
979 
980 		desc_params.mac_id = tx_desc->mac_id;
981 		desc_params.skb = tx_desc->skb;
982 		desc_params.skb_ext_desc = tx_desc->skb_ext_desc;
983 
984 		/* Find the HAL_WBM_RELEASE_INFO0_REL_SRC_MODULE value */
985 		buf_rel_source = le32_get_bits(tx_status->info0,
986 					       HAL_WBM_RELEASE_INFO0_REL_SRC_MODULE);
987 		dp->device_stats.tx_wbm_rel_source[buf_rel_source]++;
988 
989 		rel_status = le32_get_bits(tx_status->info0,
990 					   HAL_WBM_COMPL_TX_INFO0_TQM_RELEASE_REASON);
991 		dp->device_stats.tqm_rel_reason[rel_status]++;
992 
993 		/* Release descriptor as soon as extracting necessary info
994 		 * to reduce contention
995 		 */
996 		ath12k_dp_tx_release_txbuf(dp, tx_desc, tx_desc->pool_id);
997 		if (ts.buf_rel_source == HAL_WBM_REL_SRC_MODULE_FW) {
998 			ath12k_dp_tx_process_htt_tx_complete(dp, (void *)tx_status,
999 							     tx_ring, &desc_params);
1000 			continue;
1001 		}
1002 
1003 		pdev_idx = ath12k_hw_mac_id_to_pdev_id(dp->hw_params, desc_params.mac_id);
1004 
1005 		rcu_read_lock();
1006 
1007 		dp_pdev = ath12k_dp_to_pdev_dp(dp, pdev_idx);
1008 		if (!dp_pdev) {
1009 			rcu_read_unlock();
1010 			continue;
1011 		}
1012 
1013 		if (atomic_dec_and_test(&dp_pdev->num_tx_pending))
1014 			wake_up(&dp_pdev->tx_empty_waitq);
1015 
1016 		ath12k_wifi7_dp_tx_complete_msdu(dp_pdev, &desc_params, &ts,
1017 						 tx_ring->tcl_data_ring_id);
1018 		rcu_read_unlock();
1019 	}
1020 }
1021 
ath12k_wifi7_dp_tx_get_vdev_bank_config(struct ath12k_base * ab,struct ath12k_link_vif * arvif)1022 u32 ath12k_wifi7_dp_tx_get_vdev_bank_config(struct ath12k_base *ab,
1023 					    struct ath12k_link_vif *arvif)
1024 {
1025 	u32 bank_config = 0;
1026 	u8 link_id = arvif->link_id;
1027 	struct ath12k_vif *ahvif = arvif->ahvif;
1028 	struct ath12k_dp_vif *dp_vif = &ahvif->dp_vif;
1029 	struct ath12k_dp_link_vif *dp_link_vif;
1030 
1031 	dp_link_vif = ath12k_dp_vif_to_dp_link_vif(dp_vif, link_id);
1032 
1033 	/* Only valid for raw frames with HW crypto enabled.
1034 	 * With SW crypto, mac80211 sets key per packet
1035 	 */
1036 	if (dp_vif->tx_encap_type == HAL_TCL_ENCAP_TYPE_RAW &&
1037 	    test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags))
1038 		bank_config |=
1039 			u32_encode_bits(ath12k_dp_tx_get_encrypt_type(dp_vif->key_cipher),
1040 					HAL_TX_BANK_CONFIG_ENCRYPT_TYPE);
1041 
1042 	bank_config |= u32_encode_bits(dp_vif->tx_encap_type,
1043 					HAL_TX_BANK_CONFIG_ENCAP_TYPE);
1044 	bank_config |= u32_encode_bits(0, HAL_TX_BANK_CONFIG_SRC_BUFFER_SWAP) |
1045 			u32_encode_bits(0, HAL_TX_BANK_CONFIG_LINK_META_SWAP) |
1046 			u32_encode_bits(0, HAL_TX_BANK_CONFIG_EPD);
1047 
1048 	/* only valid if idx_lookup_override is not set in tcl_data_cmd */
1049 	if (ahvif->vdev_type == WMI_VDEV_TYPE_STA)
1050 		bank_config |= u32_encode_bits(1, HAL_TX_BANK_CONFIG_INDEX_LOOKUP_EN);
1051 	else
1052 		bank_config |= u32_encode_bits(0, HAL_TX_BANK_CONFIG_INDEX_LOOKUP_EN);
1053 
1054 	bank_config |= u32_encode_bits(dp_link_vif->hal_addr_search_flags &
1055 				       HAL_TX_ADDRX_EN,
1056 				       HAL_TX_BANK_CONFIG_ADDRX_EN) |
1057 			u32_encode_bits(!!(dp_link_vif->hal_addr_search_flags &
1058 					HAL_TX_ADDRY_EN),
1059 					HAL_TX_BANK_CONFIG_ADDRY_EN);
1060 
1061 	bank_config |= u32_encode_bits(ieee80211_vif_is_mesh(ahvif->vif) ? 3 : 0,
1062 					HAL_TX_BANK_CONFIG_MESH_EN) |
1063 			u32_encode_bits(dp_link_vif->vdev_id_check_en,
1064 					HAL_TX_BANK_CONFIG_VDEV_ID_CHECK_EN);
1065 
1066 	bank_config |= u32_encode_bits(0, HAL_TX_BANK_CONFIG_DSCP_TIP_MAP_ID);
1067 
1068 	return bank_config;
1069 }
1070