Lines Matching +full:center +full:- +full:spread
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
27 return ab->hw_params.hw_ops->rx_desc_get_hdr_status(desc); in ath11k_dp_rx_h_80211_hdr()
34 if (!ab->hw_params.hw_ops->rx_desc_encrypt_valid(desc)) in ath11k_dp_rx_h_mpdu_start_enctype()
37 return ab->hw_params.hw_ops->rx_desc_get_encrypt_type(desc); in ath11k_dp_rx_h_mpdu_start_enctype()
43 return ab->hw_params.hw_ops->rx_desc_get_decap_type(desc); in ath11k_dp_rx_h_msdu_start_decap_type()
50 return ab->hw_params.hw_ops->rx_desc_get_ldpc_support(desc); in ath11k_dp_rx_h_msdu_start_ldpc_support()
57 return ab->hw_params.hw_ops->rx_desc_get_mesh_ctl(desc); in ath11k_dp_rx_h_msdu_start_mesh_ctl_present()
64 return ab->hw_params.hw_ops->rx_desc_get_mpdu_seq_ctl_vld(desc); in ath11k_dp_rx_h_mpdu_start_seq_ctrl_valid()
70 return ab->hw_params.hw_ops->rx_desc_get_mpdu_fc_valid(desc); in ath11k_dp_rx_h_mpdu_start_fc_valid()
78 hdr = (struct ieee80211_hdr *)(skb->data + ab->hw_params.hal_desc_sz); in ath11k_dp_rx_h_mpdu_start_more_frags()
79 return ieee80211_has_morefrags(hdr->frame_control); in ath11k_dp_rx_h_mpdu_start_more_frags()
87 hdr = (struct ieee80211_hdr *)(skb->data + ab->hw_params.hal_desc_sz); in ath11k_dp_rx_h_mpdu_start_frag_no()
88 return le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG; in ath11k_dp_rx_h_mpdu_start_frag_no()
94 return ab->hw_params.hw_ops->rx_desc_get_mpdu_start_seq_no(desc); in ath11k_dp_rx_h_mpdu_start_seq_no()
100 return ab->hw_params.hw_ops->rx_desc_get_attention(desc); in ath11k_dp_rx_get_attention()
106 __le32_to_cpu(attn->info2)); in ath11k_dp_rx_h_attn_msdu_done()
112 __le32_to_cpu(attn->info1)); in ath11k_dp_rx_h_attn_l4_cksum_fail()
118 __le32_to_cpu(attn->info1)); in ath11k_dp_rx_h_attn_ip_cksum_fail()
124 __le32_to_cpu(attn->info2)) == in ath11k_dp_rx_h_attn_is_decrypted()
130 u32 info = __le32_to_cpu(attn->info1); in ath11k_dp_rx_h_attn_mpdu_err()
172 return ab->hw_params.hw_ops->rx_desc_get_msdu_len(desc); in ath11k_dp_rx_h_msdu_start_msdu_len()
178 return ab->hw_params.hw_ops->rx_desc_get_msdu_sgi(desc); in ath11k_dp_rx_h_msdu_start_sgi()
184 return ab->hw_params.hw_ops->rx_desc_get_msdu_rate_mcs(desc); in ath11k_dp_rx_h_msdu_start_rate_mcs()
190 return ab->hw_params.hw_ops->rx_desc_get_msdu_rx_bw(desc); in ath11k_dp_rx_h_msdu_start_rx_bw()
196 return ab->hw_params.hw_ops->rx_desc_get_msdu_freq(desc); in ath11k_dp_rx_h_msdu_start_freq()
202 return ab->hw_params.hw_ops->rx_desc_get_msdu_pkt_type(desc); in ath11k_dp_rx_h_msdu_start_pkt_type()
208 return hweight8(ab->hw_params.hw_ops->rx_desc_get_msdu_nss(desc)); in ath11k_dp_rx_h_msdu_start_nss()
214 return ab->hw_params.hw_ops->rx_desc_get_mpdu_tid(desc); in ath11k_dp_rx_h_mpdu_start_tid()
220 return ab->hw_params.hw_ops->rx_desc_get_mpdu_peer_id(desc); in ath11k_dp_rx_h_mpdu_start_peer_id()
226 return ab->hw_params.hw_ops->rx_desc_get_l3_pad_bytes(desc); in ath11k_dp_rx_h_msdu_end_l3pad()
232 return ab->hw_params.hw_ops->rx_desc_get_first_msdu(desc); in ath11k_dp_rx_h_msdu_end_first_msdu()
238 return ab->hw_params.hw_ops->rx_desc_get_last_msdu(desc); in ath11k_dp_rx_h_msdu_end_last_msdu()
245 ab->hw_params.hw_ops->rx_desc_copy_attn_end_tlv(fdesc, ldesc); in ath11k_dp_rx_desc_end_tlv_copy()
251 __le32_to_cpu(attn->info1)); in ath11k_dp_rxdesc_get_mpdulen_err()
259 rx_pkt_hdr = ab->hw_params.hw_ops->rx_desc_get_msdu_payload(rx_desc); in ath11k_dp_rxdesc_get_80211hdr()
269 tlv_tag = ab->hw_params.hw_ops->rx_desc_get_mpdu_start_tag(rx_desc); in ath11k_dp_rxdesc_mpdu_valid()
277 return ab->hw_params.hw_ops->rx_desc_get_mpdu_ppdu_id(rx_desc); in ath11k_dp_rxdesc_get_ppduid()
284 ab->hw_params.hw_ops->rx_desc_set_msdu_len(desc, len); in ath11k_dp_rxdesc_set_msdu_len()
294 __le32_to_cpu(attn->info1))); in ath11k_dp_rx_h_attn_is_mcbc()
300 return ab->hw_params.hw_ops->rx_desc_mac_addr2_valid(desc); in ath11k_dp_rxdesc_mac_addr2_valid()
306 return ab->hw_params.hw_ops->rx_desc_mpdu_start_addr2(desc); in ath11k_dp_rxdesc_mpdu_start_addr2()
314 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) in ath11k_dp_service_mon_ring()
317 mod_timer(&ab->mon_reap_timer, jiffies + in ath11k_dp_service_mon_ring()
327 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) in ath11k_dp_purge_mon_ring()
340 return -ETIMEDOUT; in ath11k_dp_purge_mon_ring()
358 req_entries = min(req_entries, rx_ring->bufs_max); in ath11k_dp_rxbufs_replenish()
360 srng = &ab->hal.srng_list[rx_ring->refill_buf_ring.ring_id]; in ath11k_dp_rxbufs_replenish()
362 spin_lock_bh(&srng->lock); in ath11k_dp_rxbufs_replenish()
367 if (!req_entries && (num_free > (rx_ring->bufs_max * 3) / 4)) in ath11k_dp_rxbufs_replenish()
379 if (!IS_ALIGNED((unsigned long)skb->data, in ath11k_dp_rxbufs_replenish()
382 PTR_ALIGN(skb->data, DP_RX_BUFFER_ALIGN_SIZE) - in ath11k_dp_rxbufs_replenish()
383 skb->data); in ath11k_dp_rxbufs_replenish()
386 paddr = dma_map_single(ab->dev, skb->data, in ath11k_dp_rxbufs_replenish()
387 skb->len + skb_tailroom(skb), in ath11k_dp_rxbufs_replenish()
389 if (dma_mapping_error(ab->dev, paddr)) in ath11k_dp_rxbufs_replenish()
392 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rxbufs_replenish()
393 buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 1, in ath11k_dp_rxbufs_replenish()
394 (rx_ring->bufs_max * 3) + 1, GFP_ATOMIC); in ath11k_dp_rxbufs_replenish()
395 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rxbufs_replenish()
403 ATH11K_SKB_RXCB(skb)->paddr = paddr; in ath11k_dp_rxbufs_replenish()
408 num_remain--; in ath11k_dp_rxbufs_replenish()
415 spin_unlock_bh(&srng->lock); in ath11k_dp_rxbufs_replenish()
417 return req_entries - num_remain; in ath11k_dp_rxbufs_replenish()
420 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rxbufs_replenish()
421 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rxbufs_replenish()
422 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rxbufs_replenish()
424 dma_unmap_single(ab->dev, paddr, skb->len + skb_tailroom(skb), in ath11k_dp_rxbufs_replenish()
431 spin_unlock_bh(&srng->lock); in ath11k_dp_rxbufs_replenish()
433 return req_entries - num_remain; in ath11k_dp_rxbufs_replenish()
442 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rxdma_buf_ring_free()
443 idr_for_each_entry(&rx_ring->bufs_idr, skb, buf_id) { in ath11k_dp_rxdma_buf_ring_free()
444 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rxdma_buf_ring_free()
448 dma_unmap_single(ar->ab->dev, ATH11K_SKB_RXCB(skb)->paddr, in ath11k_dp_rxdma_buf_ring_free()
449 skb->len + skb_tailroom(skb), DMA_FROM_DEVICE); in ath11k_dp_rxdma_buf_ring_free()
453 idr_destroy(&rx_ring->bufs_idr); in ath11k_dp_rxdma_buf_ring_free()
454 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rxdma_buf_ring_free()
461 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rxdma_pdev_buf_free()
462 struct ath11k_base *ab = ar->ab; in ath11k_dp_rxdma_pdev_buf_free()
463 struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring; in ath11k_dp_rxdma_pdev_buf_free()
468 rx_ring = &dp->rxdma_mon_buf_ring; in ath11k_dp_rxdma_pdev_buf_free()
471 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_dp_rxdma_pdev_buf_free()
472 rx_ring = &dp->rx_mon_status_refill_ring[i]; in ath11k_dp_rxdma_pdev_buf_free()
483 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rxdma_ring_buf_setup()
486 num_entries = rx_ring->refill_buf_ring.size / in ath11k_dp_rxdma_ring_buf_setup()
487 ath11k_hal_srng_get_entrysize(ar->ab, ringtype); in ath11k_dp_rxdma_ring_buf_setup()
489 rx_ring->bufs_max = num_entries; in ath11k_dp_rxdma_ring_buf_setup()
490 ath11k_dp_rxbufs_replenish(ar->ab, dp->mac_id, rx_ring, num_entries, in ath11k_dp_rxdma_ring_buf_setup()
491 ar->ab->hw_params.hal_params->rx_buf_rbm); in ath11k_dp_rxdma_ring_buf_setup()
497 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rxdma_pdev_buf_setup()
498 struct ath11k_base *ab = ar->ab; in ath11k_dp_rxdma_pdev_buf_setup()
499 struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring; in ath11k_dp_rxdma_pdev_buf_setup()
504 if (ar->ab->hw_params.rxdma1_enable) { in ath11k_dp_rxdma_pdev_buf_setup()
505 rx_ring = &dp->rxdma_mon_buf_ring; in ath11k_dp_rxdma_pdev_buf_setup()
509 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_dp_rxdma_pdev_buf_setup()
510 rx_ring = &dp->rx_mon_status_refill_ring[i]; in ath11k_dp_rxdma_pdev_buf_setup()
519 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_pdev_srng_free()
520 struct ath11k_base *ab = ar->ab; in ath11k_dp_rx_pdev_srng_free()
523 ath11k_dp_srng_cleanup(ab, &dp->rx_refill_buf_ring.refill_buf_ring); in ath11k_dp_rx_pdev_srng_free()
525 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_dp_rx_pdev_srng_free()
526 if (ab->hw_params.rx_mac_buf_ring) in ath11k_dp_rx_pdev_srng_free()
527 ath11k_dp_srng_cleanup(ab, &dp->rx_mac_buf_ring[i]); in ath11k_dp_rx_pdev_srng_free()
529 ath11k_dp_srng_cleanup(ab, &dp->rxdma_err_dst_ring[i]); in ath11k_dp_rx_pdev_srng_free()
531 &dp->rx_mon_status_refill_ring[i].refill_buf_ring); in ath11k_dp_rx_pdev_srng_free()
534 ath11k_dp_srng_cleanup(ab, &dp->rxdma_mon_buf_ring.refill_buf_ring); in ath11k_dp_rx_pdev_srng_free()
539 struct ath11k_dp *dp = &ab->dp; in ath11k_dp_pdev_reo_cleanup()
543 ath11k_dp_srng_cleanup(ab, &dp->reo_dst_ring[i]); in ath11k_dp_pdev_reo_cleanup()
548 struct ath11k_dp *dp = &ab->dp; in ath11k_dp_pdev_reo_setup()
553 ret = ath11k_dp_srng_setup(ab, &dp->reo_dst_ring[i], in ath11k_dp_pdev_reo_setup()
572 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_pdev_srng_alloc()
573 struct ath11k_base *ab = ar->ab; in ath11k_dp_rx_pdev_srng_alloc()
578 ret = ath11k_dp_srng_setup(ar->ab, in ath11k_dp_rx_pdev_srng_alloc()
579 &dp->rx_refill_buf_ring.refill_buf_ring, in ath11k_dp_rx_pdev_srng_alloc()
581 dp->mac_id, DP_RXDMA_BUF_RING_SIZE); in ath11k_dp_rx_pdev_srng_alloc()
583 ath11k_warn(ar->ab, "failed to setup rx_refill_buf_ring\n"); in ath11k_dp_rx_pdev_srng_alloc()
587 if (ar->ab->hw_params.rx_mac_buf_ring) { in ath11k_dp_rx_pdev_srng_alloc()
588 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_dp_rx_pdev_srng_alloc()
589 ret = ath11k_dp_srng_setup(ar->ab, in ath11k_dp_rx_pdev_srng_alloc()
590 &dp->rx_mac_buf_ring[i], in ath11k_dp_rx_pdev_srng_alloc()
592 dp->mac_id + i, 1024); in ath11k_dp_rx_pdev_srng_alloc()
594 ath11k_warn(ar->ab, "failed to setup rx_mac_buf_ring %d\n", in ath11k_dp_rx_pdev_srng_alloc()
601 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_dp_rx_pdev_srng_alloc()
602 ret = ath11k_dp_srng_setup(ar->ab, &dp->rxdma_err_dst_ring[i], in ath11k_dp_rx_pdev_srng_alloc()
603 HAL_RXDMA_DST, 0, dp->mac_id + i, in ath11k_dp_rx_pdev_srng_alloc()
606 ath11k_warn(ar->ab, "failed to setup rxdma_err_dst_ring %d\n", i); in ath11k_dp_rx_pdev_srng_alloc()
611 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_dp_rx_pdev_srng_alloc()
612 srng = &dp->rx_mon_status_refill_ring[i].refill_buf_ring; in ath11k_dp_rx_pdev_srng_alloc()
613 ret = ath11k_dp_srng_setup(ar->ab, in ath11k_dp_rx_pdev_srng_alloc()
615 HAL_RXDMA_MONITOR_STATUS, 0, dp->mac_id + i, in ath11k_dp_rx_pdev_srng_alloc()
618 ath11k_warn(ar->ab, in ath11k_dp_rx_pdev_srng_alloc()
629 if (!ar->ab->hw_params.rxdma1_enable) { in ath11k_dp_rx_pdev_srng_alloc()
631 timer_setup(&ar->ab->mon_reap_timer, in ath11k_dp_rx_pdev_srng_alloc()
636 ret = ath11k_dp_srng_setup(ar->ab, in ath11k_dp_rx_pdev_srng_alloc()
637 &dp->rxdma_mon_buf_ring.refill_buf_ring, in ath11k_dp_rx_pdev_srng_alloc()
638 HAL_RXDMA_MONITOR_BUF, 0, dp->mac_id, in ath11k_dp_rx_pdev_srng_alloc()
641 ath11k_warn(ar->ab, in ath11k_dp_rx_pdev_srng_alloc()
646 ret = ath11k_dp_srng_setup(ar->ab, &dp->rxdma_mon_dst_ring, in ath11k_dp_rx_pdev_srng_alloc()
647 HAL_RXDMA_MONITOR_DST, 0, dp->mac_id, in ath11k_dp_rx_pdev_srng_alloc()
650 ath11k_warn(ar->ab, in ath11k_dp_rx_pdev_srng_alloc()
655 ret = ath11k_dp_srng_setup(ar->ab, &dp->rxdma_mon_desc_ring, in ath11k_dp_rx_pdev_srng_alloc()
656 HAL_RXDMA_MONITOR_DESC, 0, dp->mac_id, in ath11k_dp_rx_pdev_srng_alloc()
659 ath11k_warn(ar->ab, in ath11k_dp_rx_pdev_srng_alloc()
669 struct ath11k_dp *dp = &ab->dp; in ath11k_dp_reo_cmd_list_cleanup()
674 spin_lock_bh(&dp->reo_cmd_lock); in ath11k_dp_reo_cmd_list_cleanup()
675 list_for_each_entry_safe(cmd, tmp, &dp->reo_cmd_list, list) { in ath11k_dp_reo_cmd_list_cleanup()
676 list_del(&cmd->list); in ath11k_dp_reo_cmd_list_cleanup()
677 rx_tid = &cmd->data; in ath11k_dp_reo_cmd_list_cleanup()
678 if (rx_tid->vaddr_unaligned) { in ath11k_dp_reo_cmd_list_cleanup()
679 dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, in ath11k_dp_reo_cmd_list_cleanup()
680 rx_tid->vaddr_unaligned, in ath11k_dp_reo_cmd_list_cleanup()
681 rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); in ath11k_dp_reo_cmd_list_cleanup()
682 rx_tid->vaddr_unaligned = NULL; in ath11k_dp_reo_cmd_list_cleanup()
688 &dp->reo_cmd_cache_flush_list, list) { in ath11k_dp_reo_cmd_list_cleanup()
689 list_del(&cmd_cache->list); in ath11k_dp_reo_cmd_list_cleanup()
690 dp->reo_cmd_cache_flush_count--; in ath11k_dp_reo_cmd_list_cleanup()
691 rx_tid = &cmd_cache->data; in ath11k_dp_reo_cmd_list_cleanup()
692 if (rx_tid->vaddr_unaligned) { in ath11k_dp_reo_cmd_list_cleanup()
693 dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, in ath11k_dp_reo_cmd_list_cleanup()
694 rx_tid->vaddr_unaligned, in ath11k_dp_reo_cmd_list_cleanup()
695 rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); in ath11k_dp_reo_cmd_list_cleanup()
696 rx_tid->vaddr_unaligned = NULL; in ath11k_dp_reo_cmd_list_cleanup()
700 spin_unlock_bh(&dp->reo_cmd_lock); in ath11k_dp_reo_cmd_list_cleanup()
709 ath11k_warn(dp->ab, "failed to flush rx tid hw desc, tid %d status %d\n", in ath11k_dp_reo_cmd_free()
710 rx_tid->tid, status); in ath11k_dp_reo_cmd_free()
711 if (rx_tid->vaddr_unaligned) { in ath11k_dp_reo_cmd_free()
712 dma_free_noncoherent(dp->ab->dev, rx_tid->unaligned_size, in ath11k_dp_reo_cmd_free()
713 rx_tid->vaddr_unaligned, in ath11k_dp_reo_cmd_free()
714 rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); in ath11k_dp_reo_cmd_free()
715 rx_tid->vaddr_unaligned = NULL; in ath11k_dp_reo_cmd_free()
726 tot_desc_sz = rx_tid->size; in ath11k_dp_reo_cache_flush()
730 tot_desc_sz -= desc_sz; in ath11k_dp_reo_cache_flush()
731 cmd.addr_lo = lower_32_bits(rx_tid->paddr + tot_desc_sz); in ath11k_dp_reo_cache_flush()
732 cmd.addr_hi = upper_32_bits(rx_tid->paddr); in ath11k_dp_reo_cache_flush()
739 rx_tid->tid, ret); in ath11k_dp_reo_cache_flush()
743 cmd.addr_lo = lower_32_bits(rx_tid->paddr); in ath11k_dp_reo_cache_flush()
744 cmd.addr_hi = upper_32_bits(rx_tid->paddr); in ath11k_dp_reo_cache_flush()
751 rx_tid->tid, ret); in ath11k_dp_reo_cache_flush()
752 dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, in ath11k_dp_reo_cache_flush()
753 rx_tid->vaddr_unaligned, in ath11k_dp_reo_cache_flush()
754 rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); in ath11k_dp_reo_cache_flush()
755 rx_tid->vaddr_unaligned = NULL; in ath11k_dp_reo_cache_flush()
762 struct ath11k_base *ab = dp->ab; in ath11k_dp_rx_tid_del_func()
771 rx_tid->tid, status); in ath11k_dp_rx_tid_del_func()
779 elem->ts = jiffies; in ath11k_dp_rx_tid_del_func()
780 memcpy(&elem->data, rx_tid, sizeof(*rx_tid)); in ath11k_dp_rx_tid_del_func()
782 spin_lock_bh(&dp->reo_cmd_lock); in ath11k_dp_rx_tid_del_func()
783 list_add_tail(&elem->list, &dp->reo_cmd_cache_flush_list); in ath11k_dp_rx_tid_del_func()
784 dp->reo_cmd_cache_flush_count++; in ath11k_dp_rx_tid_del_func()
787 list_for_each_entry_safe(elem, tmp, &dp->reo_cmd_cache_flush_list, in ath11k_dp_rx_tid_del_func()
789 if (dp->reo_cmd_cache_flush_count > DP_REO_DESC_FREE_THRESHOLD || in ath11k_dp_rx_tid_del_func()
790 time_after(jiffies, elem->ts + in ath11k_dp_rx_tid_del_func()
792 list_del(&elem->list); in ath11k_dp_rx_tid_del_func()
793 dp->reo_cmd_cache_flush_count--; in ath11k_dp_rx_tid_del_func()
794 spin_unlock_bh(&dp->reo_cmd_lock); in ath11k_dp_rx_tid_del_func()
796 ath11k_dp_reo_cache_flush(ab, &elem->data); in ath11k_dp_rx_tid_del_func()
798 spin_lock_bh(&dp->reo_cmd_lock); in ath11k_dp_rx_tid_del_func()
801 spin_unlock_bh(&dp->reo_cmd_lock); in ath11k_dp_rx_tid_del_func()
805 dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, in ath11k_dp_rx_tid_del_func()
806 rx_tid->vaddr_unaligned, in ath11k_dp_rx_tid_del_func()
807 rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); in ath11k_dp_rx_tid_del_func()
808 rx_tid->vaddr_unaligned = NULL; in ath11k_dp_rx_tid_del_func()
815 struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; in ath11k_peer_rx_tid_delete()
818 if (!rx_tid->active) in ath11k_peer_rx_tid_delete()
821 rx_tid->active = false; in ath11k_peer_rx_tid_delete()
824 cmd.addr_lo = lower_32_bits(rx_tid->paddr); in ath11k_peer_rx_tid_delete()
825 cmd.addr_hi = upper_32_bits(rx_tid->paddr); in ath11k_peer_rx_tid_delete()
827 ret = ath11k_dp_tx_send_reo_cmd(ar->ab, rx_tid, in ath11k_peer_rx_tid_delete()
831 if (ret != -ESHUTDOWN) in ath11k_peer_rx_tid_delete()
832 ath11k_err(ar->ab, "failed to send HAL_REO_CMD_UPDATE_RX_QUEUE cmd, tid %d (%d)\n", in ath11k_peer_rx_tid_delete()
834 dma_free_noncoherent(ar->ab->dev, rx_tid->unaligned_size, in ath11k_peer_rx_tid_delete()
835 rx_tid->vaddr_unaligned, in ath11k_peer_rx_tid_delete()
836 rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); in ath11k_peer_rx_tid_delete()
837 rx_tid->vaddr_unaligned = NULL; in ath11k_peer_rx_tid_delete()
840 rx_tid->paddr = 0; in ath11k_peer_rx_tid_delete()
841 rx_tid->paddr_unaligned = 0; in ath11k_peer_rx_tid_delete()
842 rx_tid->size = 0; in ath11k_peer_rx_tid_delete()
843 rx_tid->unaligned_size = 0; in ath11k_peer_rx_tid_delete()
850 struct ath11k_dp *dp = &ab->dp; in ath11k_dp_rx_link_desc_return()
855 srng = &ab->hal.srng_list[dp->wbm_desc_rel_ring.ring_id]; in ath11k_dp_rx_link_desc_return()
857 spin_lock_bh(&srng->lock); in ath11k_dp_rx_link_desc_return()
863 ret = -ENOBUFS; in ath11k_dp_rx_link_desc_return()
873 spin_unlock_bh(&srng->lock); in ath11k_dp_rx_link_desc_return()
880 struct ath11k_base *ab = rx_tid->ab; in ath11k_dp_rx_frags_cleanup()
882 lockdep_assert_held(&ab->base_lock); in ath11k_dp_rx_frags_cleanup()
884 if (rx_tid->dst_ring_desc) { in ath11k_dp_rx_frags_cleanup()
886 ath11k_dp_rx_link_desc_return(ab, (u32 *)rx_tid->dst_ring_desc, in ath11k_dp_rx_frags_cleanup()
888 kfree(rx_tid->dst_ring_desc); in ath11k_dp_rx_frags_cleanup()
889 rx_tid->dst_ring_desc = NULL; in ath11k_dp_rx_frags_cleanup()
892 rx_tid->cur_sn = 0; in ath11k_dp_rx_frags_cleanup()
893 rx_tid->last_frag_no = 0; in ath11k_dp_rx_frags_cleanup()
894 rx_tid->rx_frag_bitmap = 0; in ath11k_dp_rx_frags_cleanup()
895 __skb_queue_purge(&rx_tid->rx_frags); in ath11k_dp_rx_frags_cleanup()
903 lockdep_assert_held(&ar->ab->base_lock); in ath11k_peer_frags_flush()
906 rx_tid = &peer->rx_tid[i]; in ath11k_peer_frags_flush()
908 spin_unlock_bh(&ar->ab->base_lock); in ath11k_peer_frags_flush()
909 timer_delete_sync(&rx_tid->frag_timer); in ath11k_peer_frags_flush()
910 spin_lock_bh(&ar->ab->base_lock); in ath11k_peer_frags_flush()
921 lockdep_assert_held(&ar->ab->base_lock); in ath11k_peer_rx_tid_cleanup()
924 rx_tid = &peer->rx_tid[i]; in ath11k_peer_rx_tid_cleanup()
929 spin_unlock_bh(&ar->ab->base_lock); in ath11k_peer_rx_tid_cleanup()
930 timer_delete_sync(&rx_tid->frag_timer); in ath11k_peer_rx_tid_cleanup()
931 spin_lock_bh(&ar->ab->base_lock); in ath11k_peer_rx_tid_cleanup()
944 cmd.addr_lo = lower_32_bits(rx_tid->paddr); in ath11k_peer_rx_tid_reo_update()
945 cmd.addr_hi = upper_32_bits(rx_tid->paddr); in ath11k_peer_rx_tid_reo_update()
955 ret = ath11k_dp_tx_send_reo_cmd(ar->ab, rx_tid, in ath11k_peer_rx_tid_reo_update()
959 ath11k_warn(ar->ab, "failed to update rx tid queue, tid %d (%d)\n", in ath11k_peer_rx_tid_reo_update()
960 rx_tid->tid, ret); in ath11k_peer_rx_tid_reo_update()
964 rx_tid->ba_win_sz = ba_win_sz; in ath11k_peer_rx_tid_reo_update()
975 spin_lock_bh(&ab->base_lock); in ath11k_dp_rx_tid_mem_free()
983 rx_tid = &peer->rx_tid[tid]; in ath11k_dp_rx_tid_mem_free()
984 if (!rx_tid->active) in ath11k_dp_rx_tid_mem_free()
987 dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, rx_tid->vaddr_unaligned, in ath11k_dp_rx_tid_mem_free()
988 rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); in ath11k_dp_rx_tid_mem_free()
989 rx_tid->vaddr_unaligned = NULL; in ath11k_dp_rx_tid_mem_free()
991 rx_tid->active = false; in ath11k_dp_rx_tid_mem_free()
994 spin_unlock_bh(&ab->base_lock); in ath11k_dp_rx_tid_mem_free()
1001 struct ath11k_base *ab = ar->ab; in ath11k_peer_rx_tid_setup()
1009 spin_lock_bh(&ab->base_lock); in ath11k_peer_rx_tid_setup()
1015 spin_unlock_bh(&ab->base_lock); in ath11k_peer_rx_tid_setup()
1016 return -ENOENT; in ath11k_peer_rx_tid_setup()
1019 rx_tid = &peer->rx_tid[tid]; in ath11k_peer_rx_tid_setup()
1021 if (rx_tid->active) { in ath11k_peer_rx_tid_setup()
1022 paddr = rx_tid->paddr; in ath11k_peer_rx_tid_setup()
1025 spin_unlock_bh(&ab->base_lock); in ath11k_peer_rx_tid_setup()
1041 rx_tid->tid = tid; in ath11k_peer_rx_tid_setup()
1043 rx_tid->ba_win_sz = ba_win_sz; in ath11k_peer_rx_tid_setup()
1053 rx_tid->unaligned_size = hw_desc_sz + HAL_LINK_DESC_ALIGN - 1; in ath11k_peer_rx_tid_setup()
1054 vaddr_unaligned = dma_alloc_noncoherent(ab->dev, rx_tid->unaligned_size, &paddr, in ath11k_peer_rx_tid_setup()
1057 spin_unlock_bh(&ab->base_lock); in ath11k_peer_rx_tid_setup()
1058 return -ENOMEM; in ath11k_peer_rx_tid_setup()
1061 rx_tid->vaddr_unaligned = vaddr_unaligned; in ath11k_peer_rx_tid_setup()
1063 rx_tid->paddr_unaligned = paddr; in ath11k_peer_rx_tid_setup()
1064 rx_tid->paddr = rx_tid->paddr_unaligned + ((unsigned long)vaddr - in ath11k_peer_rx_tid_setup()
1065 (unsigned long)rx_tid->vaddr_unaligned); in ath11k_peer_rx_tid_setup()
1067 rx_tid->size = hw_desc_sz; in ath11k_peer_rx_tid_setup()
1068 rx_tid->active = true; in ath11k_peer_rx_tid_setup()
1074 dma_sync_single_for_device(ab->dev, rx_tid->paddr, in ath11k_peer_rx_tid_setup()
1075 rx_tid->size, in ath11k_peer_rx_tid_setup()
1077 spin_unlock_bh(&ab->base_lock); in ath11k_peer_rx_tid_setup()
1079 ret = ath11k_wmi_peer_rx_reorder_queue_setup(ar, vdev_id, peer_mac, rx_tid->paddr, in ath11k_peer_rx_tid_setup()
1082 ath11k_warn(ar->ab, "failed to setup rx reorder queue for peer %pM tid %d: %d\n", in ath11k_peer_rx_tid_setup()
1093 struct ath11k_base *ab = ar->ab; in ath11k_dp_rx_ampdu_start()
1094 struct ath11k_sta *arsta = ath11k_sta_to_arsta(params->sta); in ath11k_dp_rx_ampdu_start()
1095 int vdev_id = arsta->arvif->vdev_id; in ath11k_dp_rx_ampdu_start()
1098 ret = ath11k_peer_rx_tid_setup(ar, params->sta->addr, vdev_id, in ath11k_dp_rx_ampdu_start()
1099 params->tid, params->buf_size, in ath11k_dp_rx_ampdu_start()
1100 params->ssn, arsta->pn_type); in ath11k_dp_rx_ampdu_start()
1110 struct ath11k_base *ab = ar->ab; in ath11k_dp_rx_ampdu_stop()
1112 struct ath11k_sta *arsta = ath11k_sta_to_arsta(params->sta); in ath11k_dp_rx_ampdu_stop()
1113 int vdev_id = arsta->arvif->vdev_id; in ath11k_dp_rx_ampdu_stop()
1118 spin_lock_bh(&ab->base_lock); in ath11k_dp_rx_ampdu_stop()
1120 peer = ath11k_peer_find(ab, vdev_id, params->sta->addr); in ath11k_dp_rx_ampdu_stop()
1123 spin_unlock_bh(&ab->base_lock); in ath11k_dp_rx_ampdu_stop()
1124 return -ENOENT; in ath11k_dp_rx_ampdu_stop()
1127 paddr = peer->rx_tid[params->tid].paddr; in ath11k_dp_rx_ampdu_stop()
1128 active = peer->rx_tid[params->tid].active; in ath11k_dp_rx_ampdu_stop()
1131 spin_unlock_bh(&ab->base_lock); in ath11k_dp_rx_ampdu_stop()
1135 ret = ath11k_peer_rx_tid_reo_update(ar, peer, peer->rx_tid, 1, 0, false); in ath11k_dp_rx_ampdu_stop()
1136 spin_unlock_bh(&ab->base_lock); in ath11k_dp_rx_ampdu_stop()
1139 params->tid, ret); in ath11k_dp_rx_ampdu_stop()
1144 params->sta->addr, paddr, in ath11k_dp_rx_ampdu_stop()
1145 params->tid, 1, 1); in ath11k_dp_rx_ampdu_stop()
1158 struct ath11k *ar = arvif->ar; in ath11k_dp_peer_rx_pn_replay_config()
1159 struct ath11k_base *ab = ar->ab; in ath11k_dp_peer_rx_pn_replay_config()
1170 if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) in ath11k_dp_peer_rx_pn_replay_config()
1180 switch (key->cipher) { in ath11k_dp_peer_rx_pn_replay_config()
1195 spin_lock_bh(&ab->base_lock); in ath11k_dp_peer_rx_pn_replay_config()
1197 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr); in ath11k_dp_peer_rx_pn_replay_config()
1200 spin_unlock_bh(&ab->base_lock); in ath11k_dp_peer_rx_pn_replay_config()
1201 return -ENOENT; in ath11k_dp_peer_rx_pn_replay_config()
1205 rx_tid = &peer->rx_tid[tid]; in ath11k_dp_peer_rx_pn_replay_config()
1206 if (!rx_tid->active) in ath11k_dp_peer_rx_pn_replay_config()
1208 cmd.addr_lo = lower_32_bits(rx_tid->paddr); in ath11k_dp_peer_rx_pn_replay_config()
1209 cmd.addr_hi = upper_32_bits(rx_tid->paddr); in ath11k_dp_peer_rx_pn_replay_config()
1220 spin_unlock_bh(&ab->base_lock); in ath11k_dp_peer_rx_pn_replay_config()
1230 for (i = 0; i < HTT_PPDU_STATS_MAX_USERS - 1; i++) { in ath11k_get_ppdu_user_index()
1231 if (ppdu_stats->user_stats[i].is_valid_peer_id) { in ath11k_get_ppdu_user_index()
1232 if (peer_id == ppdu_stats->user_stats[i].peer_id) in ath11k_get_ppdu_user_index()
1239 return -EINVAL; in ath11k_get_ppdu_user_index()
1258 return -EINVAL; in ath11k_htt_tlv_ppdu_stats_parse()
1260 memcpy((void *)&ppdu_info->ppdu_stats.common, ptr, in ath11k_htt_tlv_ppdu_stats_parse()
1267 return -EINVAL; in ath11k_htt_tlv_ppdu_stats_parse()
1270 peer_id = ((struct htt_ppdu_stats_user_rate *)ptr)->sw_peer_id; in ath11k_htt_tlv_ppdu_stats_parse()
1271 cur_user = ath11k_get_ppdu_user_index(&ppdu_info->ppdu_stats, in ath11k_htt_tlv_ppdu_stats_parse()
1274 return -EINVAL; in ath11k_htt_tlv_ppdu_stats_parse()
1275 user_stats = &ppdu_info->ppdu_stats.user_stats[cur_user]; in ath11k_htt_tlv_ppdu_stats_parse()
1276 user_stats->peer_id = peer_id; in ath11k_htt_tlv_ppdu_stats_parse()
1277 user_stats->is_valid_peer_id = true; in ath11k_htt_tlv_ppdu_stats_parse()
1278 memcpy((void *)&user_stats->rate, ptr, in ath11k_htt_tlv_ppdu_stats_parse()
1280 user_stats->tlv_flags |= BIT(tag); in ath11k_htt_tlv_ppdu_stats_parse()
1286 return -EINVAL; in ath11k_htt_tlv_ppdu_stats_parse()
1289 peer_id = ((struct htt_ppdu_stats_usr_cmpltn_cmn *)ptr)->sw_peer_id; in ath11k_htt_tlv_ppdu_stats_parse()
1290 cur_user = ath11k_get_ppdu_user_index(&ppdu_info->ppdu_stats, in ath11k_htt_tlv_ppdu_stats_parse()
1293 return -EINVAL; in ath11k_htt_tlv_ppdu_stats_parse()
1294 user_stats = &ppdu_info->ppdu_stats.user_stats[cur_user]; in ath11k_htt_tlv_ppdu_stats_parse()
1295 user_stats->peer_id = peer_id; in ath11k_htt_tlv_ppdu_stats_parse()
1296 user_stats->is_valid_peer_id = true; in ath11k_htt_tlv_ppdu_stats_parse()
1297 memcpy((void *)&user_stats->cmpltn_cmn, ptr, in ath11k_htt_tlv_ppdu_stats_parse()
1299 user_stats->tlv_flags |= BIT(tag); in ath11k_htt_tlv_ppdu_stats_parse()
1306 return -EINVAL; in ath11k_htt_tlv_ppdu_stats_parse()
1310 ((struct htt_ppdu_stats_usr_cmpltn_ack_ba_status *)ptr)->sw_peer_id; in ath11k_htt_tlv_ppdu_stats_parse()
1311 cur_user = ath11k_get_ppdu_user_index(&ppdu_info->ppdu_stats, in ath11k_htt_tlv_ppdu_stats_parse()
1314 return -EINVAL; in ath11k_htt_tlv_ppdu_stats_parse()
1315 user_stats = &ppdu_info->ppdu_stats.user_stats[cur_user]; in ath11k_htt_tlv_ppdu_stats_parse()
1316 user_stats->peer_id = peer_id; in ath11k_htt_tlv_ppdu_stats_parse()
1317 user_stats->is_valid_peer_id = true; in ath11k_htt_tlv_ppdu_stats_parse()
1318 memcpy((void *)&user_stats->ack_ba, ptr, in ath11k_htt_tlv_ppdu_stats_parse()
1320 user_stats->tlv_flags |= BIT(tag); in ath11k_htt_tlv_ppdu_stats_parse()
1334 int ret = -EINVAL; in ath11k_dp_htt_tlv_iter()
1339 ptr - begin, len, sizeof(*tlv)); in ath11k_dp_htt_tlv_iter()
1340 return -EINVAL; in ath11k_dp_htt_tlv_iter()
1343 tlv_tag = FIELD_GET(HTT_TLV_TAG, tlv->header); in ath11k_dp_htt_tlv_iter()
1344 tlv_len = FIELD_GET(HTT_TLV_LEN, tlv->header); in ath11k_dp_htt_tlv_iter()
1346 len -= sizeof(*tlv); in ath11k_dp_htt_tlv_iter()
1350 tlv_tag, ptr - begin, len, tlv_len); in ath11k_dp_htt_tlv_iter()
1351 return -EINVAL; in ath11k_dp_htt_tlv_iter()
1354 if (ret == -ENOMEM) in ath11k_dp_htt_tlv_iter()
1358 len -= tlv_len; in ath11k_dp_htt_tlv_iter()
1367 struct ath11k_base *ab = ar->ab; in ath11k_update_per_peer_tx_stats()
1372 struct ath11k_per_peer_tx_stats *peer_stats = &ar->peer_tx_stats; in ath11k_update_per_peer_tx_stats()
1373 struct htt_ppdu_user_stats *usr_stats = &ppdu_stats->user_stats[user]; in ath11k_update_per_peer_tx_stats()
1374 struct htt_ppdu_stats_common *common = &ppdu_stats->common; in ath11k_update_per_peer_tx_stats()
1383 if (!(usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_RATE))) in ath11k_update_per_peer_tx_stats()
1386 if (usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_COMMON)) in ath11k_update_per_peer_tx_stats()
1388 HTT_USR_CMPLTN_IS_AMPDU(usr_stats->cmpltn_cmn.flags); in ath11k_update_per_peer_tx_stats()
1390 if (usr_stats->tlv_flags & in ath11k_update_per_peer_tx_stats()
1392 succ_bytes = usr_stats->ack_ba.success_bytes; in ath11k_update_per_peer_tx_stats()
1394 usr_stats->ack_ba.info); in ath11k_update_per_peer_tx_stats()
1396 usr_stats->ack_ba.info); in ath11k_update_per_peer_tx_stats()
1399 if (common->fes_duration_us) in ath11k_update_per_peer_tx_stats()
1400 tx_duration = common->fes_duration_us; in ath11k_update_per_peer_tx_stats()
1402 user_rate = &usr_stats->rate; in ath11k_update_per_peer_tx_stats()
1403 flags = HTT_USR_RATE_PREAMBLE(user_rate->rate_flags); in ath11k_update_per_peer_tx_stats()
1404 bw = HTT_USR_RATE_BW(user_rate->rate_flags) - 2; in ath11k_update_per_peer_tx_stats()
1405 nss = HTT_USR_RATE_NSS(user_rate->rate_flags) + 1; in ath11k_update_per_peer_tx_stats()
1406 mcs = HTT_USR_RATE_MCS(user_rate->rate_flags); in ath11k_update_per_peer_tx_stats()
1407 sgi = HTT_USR_RATE_GI(user_rate->rate_flags); in ath11k_update_per_peer_tx_stats()
1408 dcm = HTT_USR_RATE_DCM(user_rate->rate_flags); in ath11k_update_per_peer_tx_stats()
1441 spin_lock_bh(&ab->base_lock); in ath11k_update_per_peer_tx_stats()
1442 peer = ath11k_peer_find_by_id(ab, usr_stats->peer_id); in ath11k_update_per_peer_tx_stats()
1444 if (!peer || !peer->sta) { in ath11k_update_per_peer_tx_stats()
1445 spin_unlock_bh(&ab->base_lock); in ath11k_update_per_peer_tx_stats()
1450 sta = peer->sta; in ath11k_update_per_peer_tx_stats()
1453 memset(&arsta->txrate, 0, sizeof(arsta->txrate)); in ath11k_update_per_peer_tx_stats()
1457 arsta->txrate.legacy = rate; in ath11k_update_per_peer_tx_stats()
1460 arsta->txrate.legacy = rate; in ath11k_update_per_peer_tx_stats()
1463 arsta->txrate.mcs = mcs + 8 * (nss - 1); in ath11k_update_per_peer_tx_stats()
1464 arsta->txrate.flags = RATE_INFO_FLAGS_MCS; in ath11k_update_per_peer_tx_stats()
1466 arsta->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; in ath11k_update_per_peer_tx_stats()
1469 arsta->txrate.mcs = mcs; in ath11k_update_per_peer_tx_stats()
1470 arsta->txrate.flags = RATE_INFO_FLAGS_VHT_MCS; in ath11k_update_per_peer_tx_stats()
1472 arsta->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; in ath11k_update_per_peer_tx_stats()
1475 arsta->txrate.mcs = mcs; in ath11k_update_per_peer_tx_stats()
1476 arsta->txrate.flags = RATE_INFO_FLAGS_HE_MCS; in ath11k_update_per_peer_tx_stats()
1477 arsta->txrate.he_dcm = dcm; in ath11k_update_per_peer_tx_stats()
1478 arsta->txrate.he_gi = ath11k_mac_he_gi_to_nl80211_he_gi(sgi); in ath11k_update_per_peer_tx_stats()
1479 arsta->txrate.he_ru_alloc = ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc in ath11k_update_per_peer_tx_stats()
1480 ((user_rate->ru_end - in ath11k_update_per_peer_tx_stats()
1481 user_rate->ru_start) + 1); in ath11k_update_per_peer_tx_stats()
1485 arsta->txrate.nss = nss; in ath11k_update_per_peer_tx_stats()
1487 arsta->txrate.bw = ath11k_mac_bw_to_mac80211_bw(bw); in ath11k_update_per_peer_tx_stats()
1488 arsta->tx_duration += tx_duration; in ath11k_update_per_peer_tx_stats()
1489 memcpy(&arsta->last_txrate, &arsta->txrate, sizeof(struct rate_info)); in ath11k_update_per_peer_tx_stats()
1496 peer_stats->succ_pkts = succ_pkts; in ath11k_update_per_peer_tx_stats()
1497 peer_stats->succ_bytes = succ_bytes; in ath11k_update_per_peer_tx_stats()
1498 peer_stats->is_ampdu = is_ampdu; in ath11k_update_per_peer_tx_stats()
1499 peer_stats->duration = tx_duration; in ath11k_update_per_peer_tx_stats()
1500 peer_stats->ba_fails = in ath11k_update_per_peer_tx_stats()
1501 HTT_USR_CMPLTN_LONG_RETRY(usr_stats->cmpltn_cmn.flags) + in ath11k_update_per_peer_tx_stats()
1502 HTT_USR_CMPLTN_SHORT_RETRY(usr_stats->cmpltn_cmn.flags); in ath11k_update_per_peer_tx_stats()
1508 spin_unlock_bh(&ab->base_lock); in ath11k_update_per_peer_tx_stats()
1517 for (user = 0; user < HTT_PPDU_STATS_MAX_USERS - 1; user++) in ath11k_htt_update_ppdu_stats()
1527 lockdep_assert_held(&ar->data_lock); in ath11k_dp_htt_get_ppdu_desc()
1529 if (!list_empty(&ar->ppdu_stats_info)) { in ath11k_dp_htt_get_ppdu_desc()
1530 list_for_each_entry(ppdu_info, &ar->ppdu_stats_info, list) { in ath11k_dp_htt_get_ppdu_desc()
1531 if (ppdu_info->ppdu_id == ppdu_id) in ath11k_dp_htt_get_ppdu_desc()
1535 if (ar->ppdu_stat_list_depth > HTT_PPDU_DESC_MAX_DEPTH) { in ath11k_dp_htt_get_ppdu_desc()
1536 ppdu_info = list_first_entry(&ar->ppdu_stats_info, in ath11k_dp_htt_get_ppdu_desc()
1538 list_del(&ppdu_info->list); in ath11k_dp_htt_get_ppdu_desc()
1539 ar->ppdu_stat_list_depth--; in ath11k_dp_htt_get_ppdu_desc()
1540 ath11k_htt_update_ppdu_stats(ar, &ppdu_info->ppdu_stats); in ath11k_dp_htt_get_ppdu_desc()
1549 list_add_tail(&ppdu_info->list, &ar->ppdu_stats_info); in ath11k_dp_htt_get_ppdu_desc()
1550 ar->ppdu_stat_list_depth++; in ath11k_dp_htt_get_ppdu_desc()
1565 msg = (struct ath11k_htt_ppdu_stats_msg *)skb->data; in ath11k_htt_pull_ppdu_stats()
1566 len = FIELD_GET(HTT_T2H_PPDU_STATS_INFO_PAYLOAD_SIZE, msg->info); in ath11k_htt_pull_ppdu_stats()
1567 pdev_id = FIELD_GET(HTT_T2H_PPDU_STATS_INFO_PDEV_ID, msg->info); in ath11k_htt_pull_ppdu_stats()
1568 ppdu_id = msg->ppdu_id; in ath11k_htt_pull_ppdu_stats()
1573 ret = -EINVAL; in ath11k_htt_pull_ppdu_stats()
1578 trace_ath11k_htt_ppdu_stats(ar, skb->data, len); in ath11k_htt_pull_ppdu_stats()
1580 spin_lock_bh(&ar->data_lock); in ath11k_htt_pull_ppdu_stats()
1583 ret = -EINVAL; in ath11k_htt_pull_ppdu_stats()
1587 ppdu_info->ppdu_id = ppdu_id; in ath11k_htt_pull_ppdu_stats()
1588 ret = ath11k_dp_htt_tlv_iter(ab, msg->data, len, in ath11k_htt_pull_ppdu_stats()
1597 spin_unlock_bh(&ar->data_lock); in ath11k_htt_pull_ppdu_stats()
1607 struct htt_pktlog_msg *data = (struct htt_pktlog_msg *)skb->data; in ath11k_htt_pktlog()
1612 pdev_id = FIELD_GET(HTT_T2H_PPDU_STATS_INFO_PDEV_ID, data->hdr); in ath11k_htt_pktlog()
1622 trace_ath11k_htt_pktlog(ar, data->payload, hdr->size, in ath11k_htt_pktlog()
1623 ar->ab->pktlog_defs_checksum); in ath11k_htt_pktlog()
1632 u32 *data = (u32 *)skb->data; in ath11k_htt_backpressure_event_handler()
1656 bp_stats = &ab->soc_stats.bp_stats.umac_ring_bp_stats[ring_id]; in ath11k_htt_backpressure_event_handler()
1663 bp_stats = &ab->soc_stats.bp_stats.lmac_ring_bp_stats[ring_id][pdev_idx]; in ath11k_htt_backpressure_event_handler()
1670 spin_lock_bh(&ab->base_lock); in ath11k_htt_backpressure_event_handler()
1671 bp_stats->hp = hp; in ath11k_htt_backpressure_event_handler()
1672 bp_stats->tp = tp; in ath11k_htt_backpressure_event_handler()
1673 bp_stats->count++; in ath11k_htt_backpressure_event_handler()
1674 bp_stats->jiffies = jiffies; in ath11k_htt_backpressure_event_handler()
1675 spin_unlock_bh(&ab->base_lock); in ath11k_htt_backpressure_event_handler()
1681 struct ath11k_dp *dp = &ab->dp; in ath11k_dp_htt_htc_t2h_msg_handler()
1682 struct htt_resp_msg *resp = (struct htt_resp_msg *)skb->data; in ath11k_dp_htt_htc_t2h_msg_handler()
1695 dp->htt_tgt_ver_major = FIELD_GET(HTT_T2H_VERSION_CONF_MAJOR, in ath11k_dp_htt_htc_t2h_msg_handler()
1696 resp->version_msg.version); in ath11k_dp_htt_htc_t2h_msg_handler()
1697 dp->htt_tgt_ver_minor = FIELD_GET(HTT_T2H_VERSION_CONF_MINOR, in ath11k_dp_htt_htc_t2h_msg_handler()
1698 resp->version_msg.version); in ath11k_dp_htt_htc_t2h_msg_handler()
1699 complete(&dp->htt_tgt_version_received); in ath11k_dp_htt_htc_t2h_msg_handler()
1703 resp->peer_map_ev.info); in ath11k_dp_htt_htc_t2h_msg_handler()
1705 resp->peer_map_ev.info); in ath11k_dp_htt_htc_t2h_msg_handler()
1707 resp->peer_map_ev.info1); in ath11k_dp_htt_htc_t2h_msg_handler()
1708 ath11k_dp_get_mac_addr(resp->peer_map_ev.mac_addr_l32, in ath11k_dp_htt_htc_t2h_msg_handler()
1714 resp->peer_map_ev.info); in ath11k_dp_htt_htc_t2h_msg_handler()
1716 resp->peer_map_ev.info); in ath11k_dp_htt_htc_t2h_msg_handler()
1718 resp->peer_map_ev.info1); in ath11k_dp_htt_htc_t2h_msg_handler()
1719 ath11k_dp_get_mac_addr(resp->peer_map_ev.mac_addr_l32, in ath11k_dp_htt_htc_t2h_msg_handler()
1722 resp->peer_map_ev.info2); in ath11k_dp_htt_htc_t2h_msg_handler()
1724 resp->peer_map_ev.info1); in ath11k_dp_htt_htc_t2h_msg_handler()
1731 resp->peer_unmap_ev.info); in ath11k_dp_htt_htc_t2h_msg_handler()
1759 struct ath11k_base *ab = ar->ab; in ath11k_dp_rx_msdu_coalesce()
1765 u32 hal_rx_desc_sz = ar->ab->hw_params.hal_desc_sz; in ath11k_dp_rx_msdu_coalesce()
1767 /* As the msdu is spread across multiple rx buffers, in ath11k_dp_rx_msdu_coalesce()
1772 buf_first_len = DP_RX_BUFFER_SIZE - buf_first_hdr_len; in ath11k_dp_rx_msdu_coalesce()
1780 ldesc = (struct hal_rx_desc *)last->data; in ath11k_dp_rx_msdu_coalesce()
1781 rxcb->is_first_msdu = ath11k_dp_rx_h_msdu_end_first_msdu(ab, ldesc); in ath11k_dp_rx_msdu_coalesce()
1782 rxcb->is_last_msdu = ath11k_dp_rx_h_msdu_end_last_msdu(ab, ldesc); in ath11k_dp_rx_msdu_coalesce()
1785 * exceeds DP_RX_BUFFER_SIZE - HAL_RX_DESC_SIZE. So assume the data in ath11k_dp_rx_msdu_coalesce()
1786 * in the first buf is of length DP_RX_BUFFER_SIZE - HAL_RX_DESC_SIZE. in ath11k_dp_rx_msdu_coalesce()
1791 /* When an MSDU spread over multiple buffers attention, MSDU_END and in ath11k_dp_rx_msdu_coalesce()
1794 ath11k_dp_rx_desc_end_tlv_copy(ab, rxcb->rx_desc, ldesc); in ath11k_dp_rx_msdu_coalesce()
1796 space_extra = msdu_len - (buf_first_len + skb_tailroom(first)); in ath11k_dp_rx_msdu_coalesce()
1802 if (!rxcb->is_continuation) { in ath11k_dp_rx_msdu_coalesce()
1808 return -ENOMEM; in ath11k_dp_rx_msdu_coalesce()
1811 rem_len = msdu_len - buf_first_len; in ath11k_dp_rx_msdu_coalesce()
1814 if (rxcb->is_continuation) in ath11k_dp_rx_msdu_coalesce()
1815 buf_len = DP_RX_BUFFER_SIZE - hal_rx_desc_sz; in ath11k_dp_rx_msdu_coalesce()
1819 if (buf_len > (DP_RX_BUFFER_SIZE - hal_rx_desc_sz)) { in ath11k_dp_rx_msdu_coalesce()
1822 return -EINVAL; in ath11k_dp_rx_msdu_coalesce()
1831 rem_len -= buf_len; in ath11k_dp_rx_msdu_coalesce()
1832 if (!rxcb->is_continuation) in ath11k_dp_rx_msdu_coalesce()
1845 if (!rxcb->is_continuation) in ath11k_dp_rx_get_msdu_last_buf()
1850 if (!rxcb->is_continuation) in ath11k_dp_rx_get_msdu_last_buf()
1863 rx_attention = ath11k_dp_rx_get_attention(ar->ab, rxcb->rx_desc); in ath11k_dp_rx_h_csum_offload()
1867 msdu->ip_summed = (ip_csum_fail || l4_csum_fail) ? in ath11k_dp_rx_h_csum_offload()
1893 ath11k_warn(ar->ab, "unsupported encryption type %d for mic len\n", enctype); in ath11k_dp_rx_crypto_mic_len()
1921 ath11k_warn(ar->ab, "unsupported encryption type %d\n", enctype); in ath11k_dp_rx_crypto_param_len()
1946 ath11k_warn(ar->ab, "unsupported encryption type %d\n", enctype); in ath11k_dp_rx_crypto_icv_len()
1966 hdr = (struct ieee80211_hdr *)msdu->data; in ath11k_dp_rx_h_undecap_nwifi()
1967 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath11k_dp_rx_h_undecap_nwifi()
1970 skb_pull(msdu, ieee80211_hdrlen(hdr->frame_control)); in ath11k_dp_rx_h_undecap_nwifi()
1972 if (rxcb->is_first_msdu) { in ath11k_dp_rx_h_undecap_nwifi()
1977 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath11k_dp_rx_h_undecap_nwifi()
1979 /* Each A-MSDU subframe will be reported as a separate MSDU, in ath11k_dp_rx_h_undecap_nwifi()
1980 * so strip the A-MSDU bit from QoS Ctl. in ath11k_dp_rx_h_undecap_nwifi()
1982 if (ieee80211_is_data_qos(hdr->frame_control)) { in ath11k_dp_rx_h_undecap_nwifi()
1988 hdr->frame_control |= __cpu_to_le16(IEEE80211_STYPE_QOS_DATA); in ath11k_dp_rx_h_undecap_nwifi()
1991 hdr->frame_control &= ~(__cpu_to_le16(IEEE80211_FCTL_ORDER)); in ath11k_dp_rx_h_undecap_nwifi()
1993 qos_ctl = rxcb->tid; in ath11k_dp_rx_h_undecap_nwifi()
1995 if (ath11k_dp_rx_h_msdu_start_mesh_ctl_present(ar->ab, rxcb->rx_desc)) in ath11k_dp_rx_h_undecap_nwifi()
2004 if (!(status->flag & RX_FLAG_IV_STRIPPED)) { in ath11k_dp_rx_h_undecap_nwifi()
2011 if (!rxcb->is_first_msdu) { in ath11k_dp_rx_h_undecap_nwifi()
2024 hdr = (struct ieee80211_hdr *)msdu->data; in ath11k_dp_rx_h_undecap_nwifi()
2039 if (!rxcb->is_first_msdu || in ath11k_dp_rx_h_undecap_raw()
2040 !(rxcb->is_first_msdu && rxcb->is_last_msdu)) { in ath11k_dp_rx_h_undecap_raw()
2045 skb_trim(msdu, msdu->len - FCS_LEN); in ath11k_dp_rx_h_undecap_raw()
2050 hdr = (void *)msdu->data; in ath11k_dp_rx_h_undecap_raw()
2053 if (status->flag & RX_FLAG_IV_STRIPPED) { in ath11k_dp_rx_h_undecap_raw()
2054 skb_trim(msdu, msdu->len - in ath11k_dp_rx_h_undecap_raw()
2057 skb_trim(msdu, msdu->len - in ath11k_dp_rx_h_undecap_raw()
2061 if (status->flag & RX_FLAG_MIC_STRIPPED) in ath11k_dp_rx_h_undecap_raw()
2062 skb_trim(msdu, msdu->len - in ath11k_dp_rx_h_undecap_raw()
2066 if (status->flag & RX_FLAG_ICV_STRIPPED) in ath11k_dp_rx_h_undecap_raw()
2067 skb_trim(msdu, msdu->len - in ath11k_dp_rx_h_undecap_raw()
2072 if ((status->flag & RX_FLAG_MMIC_STRIPPED) && in ath11k_dp_rx_h_undecap_raw()
2073 !ieee80211_has_morefrags(hdr->frame_control) && in ath11k_dp_rx_h_undecap_raw()
2075 skb_trim(msdu, msdu->len - IEEE80211_CCMP_MIC_LEN); in ath11k_dp_rx_h_undecap_raw()
2078 if (status->flag & RX_FLAG_IV_STRIPPED) { in ath11k_dp_rx_h_undecap_raw()
2079 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath11k_dp_rx_h_undecap_raw()
2082 memmove((void *)msdu->data + crypto_len, in ath11k_dp_rx_h_undecap_raw()
2083 (void *)msdu->data, hdr_len); in ath11k_dp_rx_h_undecap_raw()
2098 is_amsdu = !(rxcb->is_first_msdu && rxcb->is_last_msdu); in ath11k_dp_rx_h_find_rfc1042()
2099 hdr = (struct ieee80211_hdr *)ath11k_dp_rx_h_80211_hdr(ar->ab, rxcb->rx_desc); in ath11k_dp_rx_h_find_rfc1042()
2102 if (rxcb->is_first_msdu) { in ath11k_dp_rx_h_find_rfc1042()
2103 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath11k_dp_rx_h_find_rfc1042()
2133 eth = (struct ethhdr *)msdu->data; in ath11k_dp_rx_h_undecap_eth()
2134 ether_addr_copy(da, eth->h_dest); in ath11k_dp_rx_h_undecap_eth()
2135 ether_addr_copy(sa, eth->h_source); in ath11k_dp_rx_h_undecap_eth()
2144 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath11k_dp_rx_h_undecap_eth()
2146 if (!(status->flag & RX_FLAG_IV_STRIPPED)) { in ath11k_dp_rx_h_undecap_eth()
2158 hdr = (struct ieee80211_hdr *)msdu->data; in ath11k_dp_rx_h_undecap_eth()
2173 first_hdr = ath11k_dp_rx_h_80211_hdr(ar->ab, rx_desc); in ath11k_dp_rx_h_undecap()
2174 decap = ath11k_dp_rx_h_msdu_start_decap_type(ar->ab, rx_desc); in ath11k_dp_rx_h_undecap()
2186 ehdr = (struct ethhdr *)msdu->data; in ath11k_dp_rx_h_undecap()
2189 if (ehdr->h_proto == cpu_to_be16(ETH_P_PAE)) { in ath11k_dp_rx_h_undecap()
2190 ATH11K_SKB_RXCB(msdu)->is_eapol = true; in ath11k_dp_rx_h_undecap()
2199 if (ATH11K_SKB_RXCB(msdu)->is_mcbc && decrypted) in ath11k_dp_rx_h_undecap()
2213 struct hal_rx_desc *rx_desc = rxcb->rx_desc; in ath11k_dp_rx_h_find_peer()
2216 lockdep_assert_held(&ab->base_lock); in ath11k_dp_rx_h_find_peer()
2218 if (rxcb->peer_id) in ath11k_dp_rx_h_find_peer()
2219 peer = ath11k_peer_find_by_id(ab, rxcb->peer_id); in ath11k_dp_rx_h_find_peer()
2248 fill_crypto_hdr = ath11k_dp_rx_h_attn_is_mcbc(ar->ab, rx_desc); in ath11k_dp_rx_h_mpdu()
2249 rxcb->is_mcbc = fill_crypto_hdr; in ath11k_dp_rx_h_mpdu()
2251 if (rxcb->is_mcbc) { in ath11k_dp_rx_h_mpdu()
2252 rxcb->peer_id = ath11k_dp_rx_h_mpdu_start_peer_id(ar->ab, rx_desc); in ath11k_dp_rx_h_mpdu()
2253 rxcb->seq_no = ath11k_dp_rx_h_mpdu_start_seq_no(ar->ab, rx_desc); in ath11k_dp_rx_h_mpdu()
2256 spin_lock_bh(&ar->ab->base_lock); in ath11k_dp_rx_h_mpdu()
2257 peer = ath11k_dp_rx_h_find_peer(ar->ab, msdu); in ath11k_dp_rx_h_mpdu()
2259 if (rxcb->is_mcbc) in ath11k_dp_rx_h_mpdu()
2260 enctype = peer->sec_type_grp; in ath11k_dp_rx_h_mpdu()
2262 enctype = peer->sec_type; in ath11k_dp_rx_h_mpdu()
2264 enctype = ath11k_dp_rx_h_mpdu_start_enctype(ar->ab, rx_desc); in ath11k_dp_rx_h_mpdu()
2266 spin_unlock_bh(&ar->ab->base_lock); in ath11k_dp_rx_h_mpdu()
2268 rx_attention = ath11k_dp_rx_get_attention(ar->ab, rx_desc); in ath11k_dp_rx_h_mpdu()
2273 /* Clear per-MPDU flags while leaving per-PPDU flags intact */ in ath11k_dp_rx_h_mpdu()
2274 rx_status->flag &= ~(RX_FLAG_FAILED_FCS_CRC | in ath11k_dp_rx_h_mpdu()
2281 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC; in ath11k_dp_rx_h_mpdu()
2283 rx_status->flag |= RX_FLAG_MMIC_ERROR; in ath11k_dp_rx_h_mpdu()
2286 rx_status->flag |= RX_FLAG_DECRYPTED | RX_FLAG_MMIC_STRIPPED; in ath11k_dp_rx_h_mpdu()
2289 rx_status->flag |= RX_FLAG_MIC_STRIPPED | in ath11k_dp_rx_h_mpdu()
2292 rx_status->flag |= RX_FLAG_IV_STRIPPED | in ath11k_dp_rx_h_mpdu()
2303 if (ath11k_dp_rx_h_msdu_start_decap_type(ar->ab, rx_desc) != in ath11k_dp_rx_h_mpdu()
2305 hdr = (void *)msdu->data; in ath11k_dp_rx_h_mpdu()
2306 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_FCTL_PROTECTED); in ath11k_dp_rx_h_mpdu()
2320 pkt_type = ath11k_dp_rx_h_msdu_start_pkt_type(ar->ab, rx_desc); in ath11k_dp_rx_h_rate()
2321 bw = ath11k_dp_rx_h_msdu_start_rx_bw(ar->ab, rx_desc); in ath11k_dp_rx_h_rate()
2322 rate_mcs = ath11k_dp_rx_h_msdu_start_rate_mcs(ar->ab, rx_desc); in ath11k_dp_rx_h_rate()
2323 nss = ath11k_dp_rx_h_msdu_start_nss(ar->ab, rx_desc); in ath11k_dp_rx_h_rate()
2324 sgi = ath11k_dp_rx_h_msdu_start_sgi(ar->ab, rx_desc); in ath11k_dp_rx_h_rate()
2330 sband = &ar->mac.sbands[rx_status->band]; in ath11k_dp_rx_h_rate()
2331 rx_status->rate_idx = ath11k_mac_hw_rate_to_idx(sband, rate_mcs, in ath11k_dp_rx_h_rate()
2335 rx_status->encoding = RX_ENC_HT; in ath11k_dp_rx_h_rate()
2337 ath11k_warn(ar->ab, in ath11k_dp_rx_h_rate()
2342 rx_status->rate_idx = rate_mcs + (8 * (nss - 1)); in ath11k_dp_rx_h_rate()
2344 rx_status->enc_flags |= RX_ENC_FLAG_SHORT_GI; in ath11k_dp_rx_h_rate()
2345 rx_status->bw = ath11k_mac_bw_to_mac80211_bw(bw); in ath11k_dp_rx_h_rate()
2348 rx_status->encoding = RX_ENC_VHT; in ath11k_dp_rx_h_rate()
2349 rx_status->rate_idx = rate_mcs; in ath11k_dp_rx_h_rate()
2351 ath11k_warn(ar->ab, in ath11k_dp_rx_h_rate()
2356 rx_status->nss = nss; in ath11k_dp_rx_h_rate()
2358 rx_status->enc_flags |= RX_ENC_FLAG_SHORT_GI; in ath11k_dp_rx_h_rate()
2359 rx_status->bw = ath11k_mac_bw_to_mac80211_bw(bw); in ath11k_dp_rx_h_rate()
2360 is_ldpc = ath11k_dp_rx_h_msdu_start_ldpc_support(ar->ab, rx_desc); in ath11k_dp_rx_h_rate()
2362 rx_status->enc_flags |= RX_ENC_FLAG_LDPC; in ath11k_dp_rx_h_rate()
2365 rx_status->rate_idx = rate_mcs; in ath11k_dp_rx_h_rate()
2367 ath11k_warn(ar->ab, in ath11k_dp_rx_h_rate()
2372 rx_status->encoding = RX_ENC_HE; in ath11k_dp_rx_h_rate()
2373 rx_status->nss = nss; in ath11k_dp_rx_h_rate()
2374 rx_status->he_gi = ath11k_mac_he_gi_to_nl80211_he_gi(sgi); in ath11k_dp_rx_h_rate()
2375 rx_status->bw = ath11k_mac_bw_to_mac80211_bw(bw); in ath11k_dp_rx_h_rate()
2387 rx_status->freq = 0; in ath11k_dp_rx_h_ppdu()
2388 rx_status->rate_idx = 0; in ath11k_dp_rx_h_ppdu()
2389 rx_status->nss = 0; in ath11k_dp_rx_h_ppdu()
2390 rx_status->encoding = RX_ENC_LEGACY; in ath11k_dp_rx_h_ppdu()
2391 rx_status->bw = RATE_INFO_BW_20; in ath11k_dp_rx_h_ppdu()
2393 rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL; in ath11k_dp_rx_h_ppdu()
2395 meta_data = ath11k_dp_rx_h_msdu_start_freq(ar->ab, rx_desc); in ath11k_dp_rx_h_ppdu()
2401 rx_status->band = NL80211_BAND_6GHZ; in ath11k_dp_rx_h_ppdu()
2402 rx_status->freq = center_freq; in ath11k_dp_rx_h_ppdu()
2404 rx_status->band = NL80211_BAND_2GHZ; in ath11k_dp_rx_h_ppdu()
2406 rx_status->band = NL80211_BAND_5GHZ; in ath11k_dp_rx_h_ppdu()
2408 spin_lock_bh(&ar->data_lock); in ath11k_dp_rx_h_ppdu()
2409 channel = ar->rx_channel; in ath11k_dp_rx_h_ppdu()
2411 rx_status->band = channel->band; in ath11k_dp_rx_h_ppdu()
2413 ieee80211_frequency_to_channel(channel->center_freq); in ath11k_dp_rx_h_ppdu()
2415 spin_unlock_bh(&ar->data_lock); in ath11k_dp_rx_h_ppdu()
2416 ath11k_dbg_dump(ar->ab, ATH11K_DBG_DATA, NULL, "rx_desc: ", in ath11k_dp_rx_h_ppdu()
2420 if (rx_status->band != NL80211_BAND_6GHZ) in ath11k_dp_rx_h_ppdu()
2421 rx_status->freq = ieee80211_channel_to_frequency(channel_num, in ath11k_dp_rx_h_ppdu()
2422 rx_status->band); in ath11k_dp_rx_h_ppdu()
2442 bool is_mcbc = rxcb->is_mcbc; in ath11k_dp_rx_deliver_msdu()
2443 bool is_eapol = rxcb->is_eapol; in ath11k_dp_rx_deliver_msdu()
2445 if (status->encoding == RX_ENC_HE && in ath11k_dp_rx_deliver_msdu()
2446 !(status->flag & RX_FLAG_RADIOTAP_HE) && in ath11k_dp_rx_deliver_msdu()
2447 !(status->flag & RX_FLAG_SKIP_MONITOR)) { in ath11k_dp_rx_deliver_msdu()
2450 status->flag |= RX_FLAG_RADIOTAP_HE; in ath11k_dp_rx_deliver_msdu()
2453 if (!(status->flag & RX_FLAG_ONLY_MONITOR)) in ath11k_dp_rx_deliver_msdu()
2454 decap = ath11k_dp_rx_h_msdu_start_decap_type(ar->ab, rxcb->rx_desc); in ath11k_dp_rx_deliver_msdu()
2456 spin_lock_bh(&ar->ab->base_lock); in ath11k_dp_rx_deliver_msdu()
2457 peer = ath11k_dp_rx_h_find_peer(ar->ab, msdu); in ath11k_dp_rx_deliver_msdu()
2458 if (peer && peer->sta) in ath11k_dp_rx_deliver_msdu()
2459 pubsta = peer->sta; in ath11k_dp_rx_deliver_msdu()
2460 spin_unlock_bh(&ar->ab->base_lock); in ath11k_dp_rx_deliver_msdu()
2462 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_deliver_msdu()
2463 …s%s%s%s%s %srate_idx %u vht_nss %u freq %u band %u flag 0x%x fcs-err %i mic-err %i amsdu-more %i\n… in ath11k_dp_rx_deliver_msdu()
2465 msdu->len, in ath11k_dp_rx_deliver_msdu()
2466 peer ? peer->addr : NULL, in ath11k_dp_rx_deliver_msdu()
2467 rxcb->tid, in ath11k_dp_rx_deliver_msdu()
2469 rxcb->seq_no, in ath11k_dp_rx_deliver_msdu()
2470 (status->encoding == RX_ENC_LEGACY) ? "legacy" : "", in ath11k_dp_rx_deliver_msdu()
2471 (status->encoding == RX_ENC_HT) ? "ht" : "", in ath11k_dp_rx_deliver_msdu()
2472 (status->encoding == RX_ENC_VHT) ? "vht" : "", in ath11k_dp_rx_deliver_msdu()
2473 (status->encoding == RX_ENC_HE) ? "he" : "", in ath11k_dp_rx_deliver_msdu()
2474 (status->bw == RATE_INFO_BW_40) ? "40" : "", in ath11k_dp_rx_deliver_msdu()
2475 (status->bw == RATE_INFO_BW_80) ? "80" : "", in ath11k_dp_rx_deliver_msdu()
2476 (status->bw == RATE_INFO_BW_160) ? "160" : "", in ath11k_dp_rx_deliver_msdu()
2477 status->enc_flags & RX_ENC_FLAG_SHORT_GI ? "sgi " : "", in ath11k_dp_rx_deliver_msdu()
2478 status->rate_idx, in ath11k_dp_rx_deliver_msdu()
2479 status->nss, in ath11k_dp_rx_deliver_msdu()
2480 status->freq, in ath11k_dp_rx_deliver_msdu()
2481 status->band, status->flag, in ath11k_dp_rx_deliver_msdu()
2482 !!(status->flag & RX_FLAG_FAILED_FCS_CRC), in ath11k_dp_rx_deliver_msdu()
2483 !!(status->flag & RX_FLAG_MMIC_ERROR), in ath11k_dp_rx_deliver_msdu()
2484 !!(status->flag & RX_FLAG_AMSDU_MORE)); in ath11k_dp_rx_deliver_msdu()
2486 ath11k_dbg_dump(ar->ab, ATH11K_DBG_DP_RX, NULL, "dp rx msdu: ", in ath11k_dp_rx_deliver_msdu()
2487 msdu->data, msdu->len); in ath11k_dp_rx_deliver_msdu()
2500 !(is_mcbc && rx_status->flag & RX_FLAG_DECRYPTED)) in ath11k_dp_rx_deliver_msdu()
2501 rx_status->flag |= RX_FLAG_8023; in ath11k_dp_rx_deliver_msdu()
2503 ieee80211_rx_napi(ar->hw, pubsta, msdu, napi); in ath11k_dp_rx_deliver_msdu()
2511 struct ath11k_base *ab = ar->ab; in ath11k_dp_rx_process_msdu()
2520 u32 hal_rx_desc_sz = ar->ab->hw_params.hal_desc_sz; in ath11k_dp_rx_process_msdu()
2526 ret = -EIO; in ath11k_dp_rx_process_msdu()
2530 rx_desc = (struct hal_rx_desc *)msdu->data; in ath11k_dp_rx_process_msdu()
2532 ath11k_warn(ar->ab, "msdu len not valid\n"); in ath11k_dp_rx_process_msdu()
2533 ret = -EIO; in ath11k_dp_rx_process_msdu()
2537 lrx_desc = (struct hal_rx_desc *)last_buf->data; in ath11k_dp_rx_process_msdu()
2541 ret = -EIO; in ath11k_dp_rx_process_msdu()
2546 rxcb->rx_desc = rx_desc; in ath11k_dp_rx_process_msdu()
2550 if (rxcb->is_frag) { in ath11k_dp_rx_process_msdu()
2552 } else if (!rxcb->is_continuation) { in ath11k_dp_rx_process_msdu()
2555 ret = -EINVAL; in ath11k_dp_rx_process_msdu()
2579 rx_status->flag |= RX_FLAG_SKIP_MONITOR | RX_FLAG_DUP_VALIDATED; in ath11k_dp_rx_process_msdu()
2600 if (unlikely(!rcu_access_pointer(ab->pdevs_active[mac_id]))) { in ath11k_dp_rx_process_received_packets()
2605 ar = ab->pdevs[mac_id].ar; in ath11k_dp_rx_process_received_packets()
2606 if (unlikely(test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags))) { in ath11k_dp_rx_process_received_packets()
2627 struct ath11k_dp *dp = &ab->dp; in ath11k_dp_process_rx()
2646 srng = &ab->hal.srng_list[dp->reo_dst_ring[ring_id].ring_id]; in ath11k_dp_process_rx()
2648 spin_lock_bh(&srng->lock); in ath11k_dp_process_rx()
2657 desc->buf_addr_info.info1); in ath11k_dp_process_rx()
2665 ar = ab->pdevs[mac_id].ar; in ath11k_dp_process_rx()
2666 rx_ring = &ar->dp.rx_refill_buf_ring; in ath11k_dp_process_rx()
2667 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_process_rx()
2668 msdu = idr_find(&rx_ring->bufs_idr, buf_id); in ath11k_dp_process_rx()
2672 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_process_rx()
2676 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_process_rx()
2677 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_process_rx()
2680 dma_unmap_single(ab->dev, rxcb->paddr, in ath11k_dp_process_rx()
2681 msdu->len + skb_tailroom(msdu), in ath11k_dp_process_rx()
2687 desc->info0); in ath11k_dp_process_rx()
2691 ab->soc_stats.hal_reo_error[ring_id]++; in ath11k_dp_process_rx()
2695 rxcb->is_first_msdu = !!(desc->rx_msdu_info.info0 & in ath11k_dp_process_rx()
2697 rxcb->is_last_msdu = !!(desc->rx_msdu_info.info0 & in ath11k_dp_process_rx()
2699 rxcb->is_continuation = !!(desc->rx_msdu_info.info0 & in ath11k_dp_process_rx()
2701 rxcb->peer_id = FIELD_GET(RX_MPDU_DESC_META_DATA_PEER_ID, in ath11k_dp_process_rx()
2702 desc->rx_mpdu_info.meta_data); in ath11k_dp_process_rx()
2703 rxcb->seq_no = FIELD_GET(RX_MPDU_DESC_INFO0_SEQ_NUM, in ath11k_dp_process_rx()
2704 desc->rx_mpdu_info.info0); in ath11k_dp_process_rx()
2705 rxcb->tid = FIELD_GET(HAL_REO_DEST_RING_INFO0_RX_QUEUE_NUM, in ath11k_dp_process_rx()
2706 desc->info0); in ath11k_dp_process_rx()
2708 rxcb->mac_id = mac_id; in ath11k_dp_process_rx()
2711 if (rxcb->is_continuation) { in ath11k_dp_process_rx()
2735 spin_unlock_bh(&srng->lock); in ath11k_dp_process_rx()
2740 for (i = 0; i < ab->num_radios; i++) { in ath11k_dp_process_rx()
2746 ar = ab->pdevs[i].ar; in ath11k_dp_process_rx()
2747 rx_ring = &ar->dp.rx_refill_buf_ring; in ath11k_dp_process_rx()
2750 ab->hw_params.hal_params->rx_buf_rbm); in ath11k_dp_process_rx()
2759 struct ath11k_rx_peer_stats *rx_stats = arsta->rx_stats; in ath11k_dp_rx_update_peer_stats()
2766 arsta->rssi_comb = ppdu_info->rssi_comb; in ath11k_dp_rx_update_peer_stats()
2767 ewma_avg_rssi_add(&arsta->avg_rssi, ppdu_info->rssi_comb); in ath11k_dp_rx_update_peer_stats()
2769 num_msdu = ppdu_info->tcp_msdu_count + ppdu_info->tcp_ack_msdu_count + in ath11k_dp_rx_update_peer_stats()
2770 ppdu_info->udp_msdu_count + ppdu_info->other_msdu_count; in ath11k_dp_rx_update_peer_stats()
2772 rx_stats->num_msdu += num_msdu; in ath11k_dp_rx_update_peer_stats()
2773 rx_stats->tcp_msdu_count += ppdu_info->tcp_msdu_count + in ath11k_dp_rx_update_peer_stats()
2774 ppdu_info->tcp_ack_msdu_count; in ath11k_dp_rx_update_peer_stats()
2775 rx_stats->udp_msdu_count += ppdu_info->udp_msdu_count; in ath11k_dp_rx_update_peer_stats()
2776 rx_stats->other_msdu_count += ppdu_info->other_msdu_count; in ath11k_dp_rx_update_peer_stats()
2778 if (ppdu_info->preamble_type == HAL_RX_PREAMBLE_11A || in ath11k_dp_rx_update_peer_stats()
2779 ppdu_info->preamble_type == HAL_RX_PREAMBLE_11B) { in ath11k_dp_rx_update_peer_stats()
2780 ppdu_info->nss = 1; in ath11k_dp_rx_update_peer_stats()
2781 ppdu_info->mcs = HAL_RX_MAX_MCS; in ath11k_dp_rx_update_peer_stats()
2782 ppdu_info->tid = IEEE80211_NUM_TIDS; in ath11k_dp_rx_update_peer_stats()
2785 if (ppdu_info->nss > 0 && ppdu_info->nss <= HAL_RX_MAX_NSS) in ath11k_dp_rx_update_peer_stats()
2786 rx_stats->nss_count[ppdu_info->nss - 1] += num_msdu; in ath11k_dp_rx_update_peer_stats()
2788 if (ppdu_info->mcs <= HAL_RX_MAX_MCS) in ath11k_dp_rx_update_peer_stats()
2789 rx_stats->mcs_count[ppdu_info->mcs] += num_msdu; in ath11k_dp_rx_update_peer_stats()
2791 if (ppdu_info->gi < HAL_RX_GI_MAX) in ath11k_dp_rx_update_peer_stats()
2792 rx_stats->gi_count[ppdu_info->gi] += num_msdu; in ath11k_dp_rx_update_peer_stats()
2794 if (ppdu_info->bw < HAL_RX_BW_MAX) in ath11k_dp_rx_update_peer_stats()
2795 rx_stats->bw_count[ppdu_info->bw] += num_msdu; in ath11k_dp_rx_update_peer_stats()
2797 if (ppdu_info->ldpc < HAL_RX_SU_MU_CODING_MAX) in ath11k_dp_rx_update_peer_stats()
2798 rx_stats->coding_count[ppdu_info->ldpc] += num_msdu; in ath11k_dp_rx_update_peer_stats()
2800 if (ppdu_info->tid <= IEEE80211_NUM_TIDS) in ath11k_dp_rx_update_peer_stats()
2801 rx_stats->tid_count[ppdu_info->tid] += num_msdu; in ath11k_dp_rx_update_peer_stats()
2803 if (ppdu_info->preamble_type < HAL_RX_PREAMBLE_MAX) in ath11k_dp_rx_update_peer_stats()
2804 rx_stats->pream_cnt[ppdu_info->preamble_type] += num_msdu; in ath11k_dp_rx_update_peer_stats()
2806 if (ppdu_info->reception_type < HAL_RX_RECEPTION_TYPE_MAX) in ath11k_dp_rx_update_peer_stats()
2807 rx_stats->reception_type[ppdu_info->reception_type] += num_msdu; in ath11k_dp_rx_update_peer_stats()
2809 if (ppdu_info->is_stbc) in ath11k_dp_rx_update_peer_stats()
2810 rx_stats->stbc_count += num_msdu; in ath11k_dp_rx_update_peer_stats()
2812 if (ppdu_info->beamformed) in ath11k_dp_rx_update_peer_stats()
2813 rx_stats->beamformed_count += num_msdu; in ath11k_dp_rx_update_peer_stats()
2815 if (ppdu_info->num_mpdu_fcs_ok > 1) in ath11k_dp_rx_update_peer_stats()
2816 rx_stats->ampdu_msdu_count += num_msdu; in ath11k_dp_rx_update_peer_stats()
2818 rx_stats->non_ampdu_msdu_count += num_msdu; in ath11k_dp_rx_update_peer_stats()
2820 rx_stats->num_mpdu_fcs_ok += ppdu_info->num_mpdu_fcs_ok; in ath11k_dp_rx_update_peer_stats()
2821 rx_stats->num_mpdu_fcs_err += ppdu_info->num_mpdu_fcs_err; in ath11k_dp_rx_update_peer_stats()
2822 rx_stats->dcm_count += ppdu_info->dcm; in ath11k_dp_rx_update_peer_stats()
2823 rx_stats->ru_alloc_cnt[ppdu_info->ru_alloc] += num_msdu; in ath11k_dp_rx_update_peer_stats()
2825 BUILD_BUG_ON(ARRAY_SIZE(arsta->chain_signal) > in ath11k_dp_rx_update_peer_stats()
2826 ARRAY_SIZE(ppdu_info->rssi_chain_pri20)); in ath11k_dp_rx_update_peer_stats()
2828 for (i = 0; i < ARRAY_SIZE(arsta->chain_signal); i++) in ath11k_dp_rx_update_peer_stats()
2829 arsta->chain_signal[i] = ppdu_info->rssi_chain_pri20[i]; in ath11k_dp_rx_update_peer_stats()
2831 rx_stats->rx_duration += ppdu_info->rx_duration; in ath11k_dp_rx_update_peer_stats()
2832 arsta->rx_duration = rx_stats->rx_duration; in ath11k_dp_rx_update_peer_stats()
2848 if (!IS_ALIGNED((unsigned long)skb->data, in ath11k_dp_rx_alloc_mon_status_buf()
2850 skb_pull(skb, PTR_ALIGN(skb->data, DP_RX_BUFFER_ALIGN_SIZE) - in ath11k_dp_rx_alloc_mon_status_buf()
2851 skb->data); in ath11k_dp_rx_alloc_mon_status_buf()
2854 paddr = dma_map_single(ab->dev, skb->data, in ath11k_dp_rx_alloc_mon_status_buf()
2855 skb->len + skb_tailroom(skb), in ath11k_dp_rx_alloc_mon_status_buf()
2857 if (unlikely(dma_mapping_error(ab->dev, paddr))) in ath11k_dp_rx_alloc_mon_status_buf()
2860 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_alloc_mon_status_buf()
2861 *buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 0, in ath11k_dp_rx_alloc_mon_status_buf()
2862 rx_ring->bufs_max, GFP_ATOMIC); in ath11k_dp_rx_alloc_mon_status_buf()
2863 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_alloc_mon_status_buf()
2867 ATH11K_SKB_RXCB(skb)->paddr = paddr; in ath11k_dp_rx_alloc_mon_status_buf()
2871 dma_unmap_single(ab->dev, paddr, skb->len + skb_tailroom(skb), in ath11k_dp_rx_alloc_mon_status_buf()
2893 req_entries = min(req_entries, rx_ring->bufs_max); in ath11k_dp_rx_mon_status_bufs_replenish()
2895 srng = &ab->hal.srng_list[rx_ring->refill_buf_ring.ring_id]; in ath11k_dp_rx_mon_status_bufs_replenish()
2897 spin_lock_bh(&srng->lock); in ath11k_dp_rx_mon_status_bufs_replenish()
2911 paddr = ATH11K_SKB_RXCB(skb)->paddr; in ath11k_dp_rx_mon_status_bufs_replenish()
2920 num_remain--; in ath11k_dp_rx_mon_status_bufs_replenish()
2927 spin_unlock_bh(&srng->lock); in ath11k_dp_rx_mon_status_bufs_replenish()
2929 return req_entries - num_remain; in ath11k_dp_rx_mon_status_bufs_replenish()
2932 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_mon_status_bufs_replenish()
2933 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_mon_status_bufs_replenish()
2934 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_mon_status_bufs_replenish()
2935 dma_unmap_single(ab->dev, paddr, skb->len + skb_tailroom(skb), in ath11k_dp_rx_mon_status_bufs_replenish()
2939 spin_unlock_bh(&srng->lock); in ath11k_dp_rx_mon_status_bufs_replenish()
2941 return req_entries - num_remain; in ath11k_dp_rx_mon_status_bufs_replenish()
2955 tlv_len = FIELD_GET(HAL_TLV_HDR_LEN, tlv->tl); in ath11k_dp_rx_mon_update_status_buf_state()
2960 if (FIELD_GET(HAL_TLV_HDR_TAG, tlv->tl) != HAL_RX_PPDU_START) in ath11k_dp_rx_mon_update_status_buf_state()
2966 __le32_to_cpu(ppdu_start->info0)); in ath11k_dp_rx_mon_update_status_buf_state()
2968 if (pmon->sw_mon_entries.ppdu_id < ppdu_id) { in ath11k_dp_rx_mon_update_status_buf_state()
2969 pmon->buf_state = DP_MON_STATUS_LEAD; in ath11k_dp_rx_mon_update_status_buf_state()
2970 ppdu_id_diff = ppdu_id - pmon->sw_mon_entries.ppdu_id; in ath11k_dp_rx_mon_update_status_buf_state()
2972 pmon->buf_state = DP_MON_STATUS_LAG; in ath11k_dp_rx_mon_update_status_buf_state()
2973 } else if (pmon->sw_mon_entries.ppdu_id > ppdu_id) { in ath11k_dp_rx_mon_update_status_buf_state()
2974 pmon->buf_state = DP_MON_STATUS_LAG; in ath11k_dp_rx_mon_update_status_buf_state()
2975 ppdu_id_diff = pmon->sw_mon_entries.ppdu_id - ppdu_id; in ath11k_dp_rx_mon_update_status_buf_state()
2977 pmon->buf_state = DP_MON_STATUS_LEAD; in ath11k_dp_rx_mon_update_status_buf_state()
3002 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_mon_buf_done()
3003 skb = idr_find(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_mon_buf_done()
3004 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_mon_buf_done()
3010 dma_sync_single_for_cpu(ab->dev, rxcb->paddr, in ath11k_dp_rx_mon_buf_done()
3011 skb->len + skb_tailroom(skb), in ath11k_dp_rx_mon_buf_done()
3014 tlv = (struct hal_tlv_hdr *)skb->data; in ath11k_dp_rx_mon_buf_done()
3015 if (FIELD_GET(HAL_TLV_HDR_TAG, tlv->tl) != HAL_RX_STATUS_BUFFER_DONE) in ath11k_dp_rx_mon_buf_done()
3041 ar = ab->pdevs[ath11k_hw_mac_id_to_pdev_id(&ab->hw_params, mac_id)].ar; in ath11k_dp_rx_reap_mon_status_ring()
3042 dp = &ar->dp; in ath11k_dp_rx_reap_mon_status_ring()
3043 pmon = &dp->mon_data; in ath11k_dp_rx_reap_mon_status_ring()
3044 srng_id = ath11k_hw_mac_id_to_srng_id(&ab->hw_params, mac_id); in ath11k_dp_rx_reap_mon_status_ring()
3045 rx_ring = &dp->rx_mon_status_refill_ring[srng_id]; in ath11k_dp_rx_reap_mon_status_ring()
3047 srng = &ab->hal.srng_list[rx_ring->refill_buf_ring.ring_id]; in ath11k_dp_rx_reap_mon_status_ring()
3049 spin_lock_bh(&srng->lock); in ath11k_dp_rx_reap_mon_status_ring()
3053 *budget -= 1; in ath11k_dp_rx_reap_mon_status_ring()
3057 pmon->buf_state = DP_MON_STATUS_REPLINISH; in ath11k_dp_rx_reap_mon_status_ring()
3066 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_reap_mon_status_ring()
3067 skb = idr_find(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_reap_mon_status_ring()
3068 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_reap_mon_status_ring()
3073 pmon->buf_state = DP_MON_STATUS_REPLINISH; in ath11k_dp_rx_reap_mon_status_ring()
3079 dma_sync_single_for_cpu(ab->dev, rxcb->paddr, in ath11k_dp_rx_reap_mon_status_ring()
3080 skb->len + skb_tailroom(skb), in ath11k_dp_rx_reap_mon_status_ring()
3083 tlv = (struct hal_tlv_hdr *)skb->data; in ath11k_dp_rx_reap_mon_status_ring()
3084 if (FIELD_GET(HAL_TLV_HDR_TAG, tlv->tl) != in ath11k_dp_rx_reap_mon_status_ring()
3088 tlv->tl), buf_id); in ath11k_dp_rx_reap_mon_status_ring()
3110 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_reap_mon_status_ring()
3111 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_reap_mon_status_ring()
3112 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_reap_mon_status_ring()
3114 dma_unmap_single(ab->dev, rxcb->paddr, in ath11k_dp_rx_reap_mon_status_ring()
3115 skb->len + skb_tailroom(skb), in ath11k_dp_rx_reap_mon_status_ring()
3119 pmon->buf_state = DP_MON_STATUS_REPLINISH; in ath11k_dp_rx_reap_mon_status_ring()
3123 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_reap_mon_status_ring()
3124 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_reap_mon_status_ring()
3125 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_reap_mon_status_ring()
3126 if (ab->hw_params.full_monitor_mode) { in ath11k_dp_rx_reap_mon_status_ring()
3128 if (paddr == pmon->mon_status_paddr) in ath11k_dp_rx_reap_mon_status_ring()
3129 pmon->buf_state = DP_MON_STATUS_MATCH; in ath11k_dp_rx_reap_mon_status_ring()
3132 dma_unmap_single(ab->dev, rxcb->paddr, in ath11k_dp_rx_reap_mon_status_ring()
3133 skb->len + skb_tailroom(skb), in ath11k_dp_rx_reap_mon_status_ring()
3138 pmon->buf_state = DP_MON_STATUS_REPLINISH; in ath11k_dp_rx_reap_mon_status_ring()
3145 hal_params = ab->hw_params.hal_params; in ath11k_dp_rx_reap_mon_status_ring()
3147 hal_params->rx_buf_rbm); in ath11k_dp_rx_reap_mon_status_ring()
3156 ath11k_hal_rx_buf_addr_info_set(rx_mon_status_desc, rxcb->paddr, in ath11k_dp_rx_reap_mon_status_ring()
3158 ab->hw_params.hal_params->rx_buf_rbm); in ath11k_dp_rx_reap_mon_status_ring()
3163 spin_unlock_bh(&srng->lock); in ath11k_dp_rx_reap_mon_status_ring()
3172 spin_lock_bh(&rx_tid->ab->base_lock); in ath11k_dp_rx_frag_timer()
3173 if (rx_tid->last_frag_no && in ath11k_dp_rx_frag_timer()
3174 rx_tid->rx_frag_bitmap == GENMASK(rx_tid->last_frag_no, 0)) { in ath11k_dp_rx_frag_timer()
3175 spin_unlock_bh(&rx_tid->ab->base_lock); in ath11k_dp_rx_frag_timer()
3179 spin_unlock_bh(&rx_tid->ab->base_lock); in ath11k_dp_rx_frag_timer()
3184 struct ath11k_base *ab = ar->ab; in ath11k_peer_rx_frag_setup()
3197 spin_lock_bh(&ab->base_lock); in ath11k_peer_rx_frag_setup()
3202 spin_unlock_bh(&ab->base_lock); in ath11k_peer_rx_frag_setup()
3204 return -ENOENT; in ath11k_peer_rx_frag_setup()
3208 rx_tid = &peer->rx_tid[i]; in ath11k_peer_rx_frag_setup()
3209 rx_tid->ab = ab; in ath11k_peer_rx_frag_setup()
3210 timer_setup(&rx_tid->frag_timer, ath11k_dp_rx_frag_timer, 0); in ath11k_peer_rx_frag_setup()
3211 skb_queue_head_init(&rx_tid->rx_frags); in ath11k_peer_rx_frag_setup()
3214 peer->tfm_mmic = tfm; in ath11k_peer_rx_frag_setup()
3215 peer->dp_setup_done = true; in ath11k_peer_rx_frag_setup()
3216 spin_unlock_bh(&ab->base_lock); in ath11k_peer_rx_frag_setup()
3231 return -EINVAL; in ath11k_dp_rx_h_michael_mic()
3233 desc->tfm = tfm; in ath11k_dp_rx_h_michael_mic()
3246 if (ieee80211_is_data_qos(hdr->frame_control)) in ath11k_dp_rx_h_michael_mic()
3265 struct hal_rx_desc *rx_desc = (struct hal_rx_desc *)msdu->data; in ath11k_dp_rx_h_verify_tkip_mic()
3272 u32 hdr_len, hal_rx_desc_sz = ar->ab->hw_params.hal_desc_sz; in ath11k_dp_rx_h_verify_tkip_mic()
3276 if (ath11k_dp_rx_h_mpdu_start_enctype(ar->ab, rx_desc) != in ath11k_dp_rx_h_verify_tkip_mic()
3280 hdr = (struct ieee80211_hdr *)(msdu->data + hal_rx_desc_sz); in ath11k_dp_rx_h_verify_tkip_mic()
3281 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath11k_dp_rx_h_verify_tkip_mic()
3285 if (!is_multicast_ether_addr(hdr->addr1)) in ath11k_dp_rx_h_verify_tkip_mic()
3286 key_idx = peer->ucast_keyidx; in ath11k_dp_rx_h_verify_tkip_mic()
3288 key_idx = peer->mcast_keyidx; in ath11k_dp_rx_h_verify_tkip_mic()
3290 key_conf = peer->keys[key_idx]; in ath11k_dp_rx_h_verify_tkip_mic()
3292 data = msdu->data + head_len; in ath11k_dp_rx_h_verify_tkip_mic()
3293 data_len = msdu->len - head_len - tail_len; in ath11k_dp_rx_h_verify_tkip_mic()
3294 key = &key_conf->key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY]; in ath11k_dp_rx_h_verify_tkip_mic()
3296 ret = ath11k_dp_rx_h_michael_mic(peer->tfm_mmic, key, hdr, data, data_len, mic); in ath11k_dp_rx_h_verify_tkip_mic()
3303 (ATH11K_SKB_RXCB(msdu))->is_first_msdu = true; in ath11k_dp_rx_h_verify_tkip_mic()
3304 (ATH11K_SKB_RXCB(msdu))->is_last_msdu = true; in ath11k_dp_rx_h_verify_tkip_mic()
3306 rxs->flag |= RX_FLAG_MMIC_ERROR | RX_FLAG_MMIC_STRIPPED | in ath11k_dp_rx_h_verify_tkip_mic()
3313 ieee80211_rx(ar->hw, msdu); in ath11k_dp_rx_h_verify_tkip_mic()
3314 return -EINVAL; in ath11k_dp_rx_h_verify_tkip_mic()
3323 u32 hal_rx_desc_sz = ar->ab->hw_params.hal_desc_sz; in ath11k_dp_rx_h_undecap_frag()
3328 hdr = (struct ieee80211_hdr *)(msdu->data + hal_rx_desc_sz); in ath11k_dp_rx_h_undecap_frag()
3331 skb_trim(msdu, msdu->len - in ath11k_dp_rx_h_undecap_frag()
3335 skb_trim(msdu, msdu->len - in ath11k_dp_rx_h_undecap_frag()
3339 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath11k_dp_rx_h_undecap_frag()
3342 memmove((void *)msdu->data + hal_rx_desc_sz + crypto_len, in ath11k_dp_rx_h_undecap_frag()
3343 (void *)msdu->data + hal_rx_desc_sz, hdr_len); in ath11k_dp_rx_h_undecap_frag()
3361 u32 flags, hal_rx_desc_sz = ar->ab->hw_params.hal_desc_sz; in ath11k_dp_rx_h_defrag()
3363 first_frag = skb_peek(&rx_tid->rx_frags); in ath11k_dp_rx_h_defrag()
3364 last_frag = skb_peek_tail(&rx_tid->rx_frags); in ath11k_dp_rx_h_defrag()
3366 skb_queue_walk(&rx_tid->rx_frags, skb) { in ath11k_dp_rx_h_defrag()
3368 rx_desc = (struct hal_rx_desc *)skb->data; in ath11k_dp_rx_h_defrag()
3369 hdr = (struct ieee80211_hdr *)(skb->data + hal_rx_desc_sz); in ath11k_dp_rx_h_defrag()
3371 enctype = ath11k_dp_rx_h_mpdu_start_enctype(ar->ab, rx_desc); in ath11k_dp_rx_h_defrag()
3373 rx_attention = ath11k_dp_rx_get_attention(ar->ab, rx_desc); in ath11k_dp_rx_h_defrag()
3387 skb_trim(skb, skb->len - FCS_LEN); in ath11k_dp_rx_h_defrag()
3392 ieee80211_hdrlen(hdr->frame_control)); in ath11k_dp_rx_h_defrag()
3393 msdu_len += skb->len; in ath11k_dp_rx_h_defrag()
3396 extra_space = msdu_len - (DP_RX_BUFFER_SIZE + skb_tailroom(first_frag)); in ath11k_dp_rx_h_defrag()
3399 return -ENOMEM; in ath11k_dp_rx_h_defrag()
3401 __skb_unlink(first_frag, &rx_tid->rx_frags); in ath11k_dp_rx_h_defrag()
3402 while ((skb = __skb_dequeue(&rx_tid->rx_frags))) { in ath11k_dp_rx_h_defrag()
3403 skb_put_data(first_frag, skb->data, skb->len); in ath11k_dp_rx_h_defrag()
3407 hdr = (struct ieee80211_hdr *)(first_frag->data + hal_rx_desc_sz); in ath11k_dp_rx_h_defrag()
3408 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_FCTL_MOREFRAGS); in ath11k_dp_rx_h_defrag()
3409 ATH11K_SKB_RXCB(first_frag)->is_frag = 1; in ath11k_dp_rx_h_defrag()
3421 struct ath11k_base *ab = ar->ab; in ath11k_dp_rx_h_defrag_reo_reinject()
3422 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_h_defrag_reo_reinject()
3423 struct dp_rxdma_ring *rx_refill_ring = &dp->rx_refill_buf_ring; in ath11k_dp_rx_h_defrag_reo_reinject()
3424 struct hal_rx_desc *rx_desc = (struct hal_rx_desc *)defrag_skb->data; in ath11k_dp_rx_h_defrag_reo_reinject()
3436 hal_rx_desc_sz = ab->hw_params.hal_desc_sz; in ath11k_dp_rx_h_defrag_reo_reinject()
3437 link_desc_banks = ab->dp.link_desc_banks; in ath11k_dp_rx_h_defrag_reo_reinject()
3438 reo_dest_ring = rx_tid->dst_ring_desc; in ath11k_dp_rx_h_defrag_reo_reinject()
3442 (paddr - link_desc_banks[desc_bank].paddr)); in ath11k_dp_rx_h_defrag_reo_reinject()
3443 msdu0 = &msdu_link->msdu_link[0]; in ath11k_dp_rx_h_defrag_reo_reinject()
3444 dst_idx = FIELD_GET(RX_MSDU_DESC_INFO0_REO_DEST_IND, msdu0->rx_msdu_info.info0); in ath11k_dp_rx_h_defrag_reo_reinject()
3451 defrag_skb->len - hal_rx_desc_sz) | in ath11k_dp_rx_h_defrag_reo_reinject()
3455 msdu0->rx_msdu_info.info0 = msdu_info; in ath11k_dp_rx_h_defrag_reo_reinject()
3458 ath11k_dp_rxdesc_set_msdu_len(ab, rx_desc, defrag_skb->len - hal_rx_desc_sz); in ath11k_dp_rx_h_defrag_reo_reinject()
3460 paddr = dma_map_single(ab->dev, defrag_skb->data, in ath11k_dp_rx_h_defrag_reo_reinject()
3461 defrag_skb->len + skb_tailroom(defrag_skb), in ath11k_dp_rx_h_defrag_reo_reinject()
3463 if (dma_mapping_error(ab->dev, paddr)) in ath11k_dp_rx_h_defrag_reo_reinject()
3464 return -ENOMEM; in ath11k_dp_rx_h_defrag_reo_reinject()
3466 spin_lock_bh(&rx_refill_ring->idr_lock); in ath11k_dp_rx_h_defrag_reo_reinject()
3467 buf_id = idr_alloc(&rx_refill_ring->bufs_idr, defrag_skb, 0, in ath11k_dp_rx_h_defrag_reo_reinject()
3468 rx_refill_ring->bufs_max * 3, GFP_ATOMIC); in ath11k_dp_rx_h_defrag_reo_reinject()
3469 spin_unlock_bh(&rx_refill_ring->idr_lock); in ath11k_dp_rx_h_defrag_reo_reinject()
3471 ret = -ENOMEM; in ath11k_dp_rx_h_defrag_reo_reinject()
3475 ATH11K_SKB_RXCB(defrag_skb)->paddr = paddr; in ath11k_dp_rx_h_defrag_reo_reinject()
3476 cookie = FIELD_PREP(DP_RXDMA_BUF_COOKIE_PDEV_ID, dp->mac_id) | in ath11k_dp_rx_h_defrag_reo_reinject()
3480 ab->hw_params.hal_params->rx_buf_rbm); in ath11k_dp_rx_h_defrag_reo_reinject()
3483 srng = &ab->hal.srng_list[ab->dp.reo_reinject_ring.ring_id]; in ath11k_dp_rx_h_defrag_reo_reinject()
3485 spin_lock_bh(&srng->lock); in ath11k_dp_rx_h_defrag_reo_reinject()
3492 spin_unlock_bh(&srng->lock); in ath11k_dp_rx_h_defrag_reo_reinject()
3493 ret = -ENOSPC; in ath11k_dp_rx_h_defrag_reo_reinject()
3503 FIELD_PREP(RX_MPDU_DESC_INFO0_SEQ_NUM, rx_tid->cur_sn) | in ath11k_dp_rx_h_defrag_reo_reinject()
3510 reo_ent_ring->rx_mpdu_info.info0 = mpdu_info; in ath11k_dp_rx_h_defrag_reo_reinject()
3511 reo_ent_ring->rx_mpdu_info.meta_data = reo_dest_ring->rx_mpdu_info.meta_data; in ath11k_dp_rx_h_defrag_reo_reinject()
3512 reo_ent_ring->queue_addr_lo = reo_dest_ring->queue_addr_lo; in ath11k_dp_rx_h_defrag_reo_reinject()
3513 reo_ent_ring->info0 = FIELD_PREP(HAL_REO_ENTR_RING_INFO0_QUEUE_ADDR_HI, in ath11k_dp_rx_h_defrag_reo_reinject()
3515 reo_dest_ring->info0)) | in ath11k_dp_rx_h_defrag_reo_reinject()
3518 spin_unlock_bh(&srng->lock); in ath11k_dp_rx_h_defrag_reo_reinject()
3523 spin_lock_bh(&rx_refill_ring->idr_lock); in ath11k_dp_rx_h_defrag_reo_reinject()
3524 idr_remove(&rx_refill_ring->bufs_idr, buf_id); in ath11k_dp_rx_h_defrag_reo_reinject()
3525 spin_unlock_bh(&rx_refill_ring->idr_lock); in ath11k_dp_rx_h_defrag_reo_reinject()
3527 dma_unmap_single(ab->dev, paddr, defrag_skb->len + skb_tailroom(defrag_skb), in ath11k_dp_rx_h_defrag_reo_reinject()
3537 frag1 = ath11k_dp_rx_h_mpdu_start_frag_no(ar->ab, a); in ath11k_dp_rx_h_cmp_frags()
3538 frag2 = ath11k_dp_rx_h_mpdu_start_frag_no(ar->ab, b); in ath11k_dp_rx_h_cmp_frags()
3540 return frag1 - frag2; in ath11k_dp_rx_h_cmp_frags()
3565 u32 hal_rx_desc_sz = ar->ab->hw_params.hal_desc_sz; in ath11k_dp_rx_h_get_pn()
3567 hdr = (struct ieee80211_hdr *)(skb->data + hal_rx_desc_sz); in ath11k_dp_rx_h_get_pn()
3568 ehdr = skb->data + hal_rx_desc_sz + ieee80211_hdrlen(hdr->frame_control); in ath11k_dp_rx_h_get_pn()
3589 first_frag = skb_peek(&rx_tid->rx_frags); in ath11k_dp_rx_h_defrag_validate_incr_pn()
3590 desc = (struct hal_rx_desc *)first_frag->data; in ath11k_dp_rx_h_defrag_validate_incr_pn()
3592 encrypt_type = ath11k_dp_rx_h_mpdu_start_enctype(ar->ab, desc); in ath11k_dp_rx_h_defrag_validate_incr_pn()
3600 skb_queue_walk(&rx_tid->rx_frags, skb) { in ath11k_dp_rx_h_defrag_validate_incr_pn()
3616 struct ath11k_base *ab = ar->ab; in ath11k_dp_rx_frag_h_mpdu()
3628 rx_desc = (struct hal_rx_desc *)msdu->data; in ath11k_dp_rx_frag_h_mpdu()
3629 peer_id = ath11k_dp_rx_h_mpdu_start_peer_id(ar->ab, rx_desc); in ath11k_dp_rx_frag_h_mpdu()
3630 tid = ath11k_dp_rx_h_mpdu_start_tid(ar->ab, rx_desc); in ath11k_dp_rx_frag_h_mpdu()
3631 seqno = ath11k_dp_rx_h_mpdu_start_seq_no(ar->ab, rx_desc); in ath11k_dp_rx_frag_h_mpdu()
3632 frag_no = ath11k_dp_rx_h_mpdu_start_frag_no(ar->ab, msdu); in ath11k_dp_rx_frag_h_mpdu()
3633 more_frags = ath11k_dp_rx_h_mpdu_start_more_frags(ar->ab, msdu); in ath11k_dp_rx_frag_h_mpdu()
3634 is_mcbc = ath11k_dp_rx_h_attn_is_mcbc(ar->ab, rx_desc); in ath11k_dp_rx_frag_h_mpdu()
3638 return -EINVAL; in ath11k_dp_rx_frag_h_mpdu()
3640 if (!ath11k_dp_rx_h_mpdu_start_seq_ctrl_valid(ar->ab, rx_desc) || in ath11k_dp_rx_frag_h_mpdu()
3641 !ath11k_dp_rx_h_mpdu_start_fc_valid(ar->ab, rx_desc) || in ath11k_dp_rx_frag_h_mpdu()
3643 return -EINVAL; in ath11k_dp_rx_frag_h_mpdu()
3651 return -EINVAL; in ath11k_dp_rx_frag_h_mpdu()
3653 spin_lock_bh(&ab->base_lock); in ath11k_dp_rx_frag_h_mpdu()
3656 ath11k_warn(ab, "failed to find the peer to de-fragment received fragment peer_id %d\n", in ath11k_dp_rx_frag_h_mpdu()
3658 ret = -ENOENT; in ath11k_dp_rx_frag_h_mpdu()
3661 if (!peer->dp_setup_done) { in ath11k_dp_rx_frag_h_mpdu()
3663 peer->addr, peer_id); in ath11k_dp_rx_frag_h_mpdu()
3664 ret = -ENOENT; in ath11k_dp_rx_frag_h_mpdu()
3668 rx_tid = &peer->rx_tid[tid]; in ath11k_dp_rx_frag_h_mpdu()
3670 if ((!skb_queue_empty(&rx_tid->rx_frags) && seqno != rx_tid->cur_sn) || in ath11k_dp_rx_frag_h_mpdu()
3671 skb_queue_empty(&rx_tid->rx_frags)) { in ath11k_dp_rx_frag_h_mpdu()
3674 rx_tid->cur_sn = seqno; in ath11k_dp_rx_frag_h_mpdu()
3677 if (rx_tid->rx_frag_bitmap & BIT(frag_no)) { in ath11k_dp_rx_frag_h_mpdu()
3679 ret = -EINVAL; in ath11k_dp_rx_frag_h_mpdu()
3683 if (!rx_tid->rx_frag_bitmap || (frag_no > __fls(rx_tid->rx_frag_bitmap))) in ath11k_dp_rx_frag_h_mpdu()
3684 __skb_queue_tail(&rx_tid->rx_frags, msdu); in ath11k_dp_rx_frag_h_mpdu()
3686 ath11k_dp_rx_h_sort_frags(ar, &rx_tid->rx_frags, msdu); in ath11k_dp_rx_frag_h_mpdu()
3688 rx_tid->rx_frag_bitmap |= BIT(frag_no); in ath11k_dp_rx_frag_h_mpdu()
3690 rx_tid->last_frag_no = frag_no; in ath11k_dp_rx_frag_h_mpdu()
3693 rx_tid->dst_ring_desc = kmemdup(ring_desc, in ath11k_dp_rx_frag_h_mpdu()
3694 sizeof(*rx_tid->dst_ring_desc), in ath11k_dp_rx_frag_h_mpdu()
3696 if (!rx_tid->dst_ring_desc) { in ath11k_dp_rx_frag_h_mpdu()
3697 ret = -ENOMEM; in ath11k_dp_rx_frag_h_mpdu()
3705 if (!rx_tid->last_frag_no || in ath11k_dp_rx_frag_h_mpdu()
3706 rx_tid->rx_frag_bitmap != GENMASK(rx_tid->last_frag_no, 0)) { in ath11k_dp_rx_frag_h_mpdu()
3707 mod_timer(&rx_tid->frag_timer, jiffies + in ath11k_dp_rx_frag_h_mpdu()
3712 spin_unlock_bh(&ab->base_lock); in ath11k_dp_rx_frag_h_mpdu()
3713 timer_delete_sync(&rx_tid->frag_timer); in ath11k_dp_rx_frag_h_mpdu()
3714 spin_lock_bh(&ab->base_lock); in ath11k_dp_rx_frag_h_mpdu()
3739 spin_unlock_bh(&ab->base_lock); in ath11k_dp_rx_frag_h_mpdu()
3746 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_process_rx_err_buf()
3747 struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring; in ath11k_dp_process_rx_err_buf()
3753 u32 hal_rx_desc_sz = ar->ab->hw_params.hal_desc_sz; in ath11k_dp_process_rx_err_buf()
3755 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_process_rx_err_buf()
3756 msdu = idr_find(&rx_ring->bufs_idr, buf_id); in ath11k_dp_process_rx_err_buf()
3758 ath11k_warn(ar->ab, "rx err buf with invalid buf_id %d\n", in ath11k_dp_process_rx_err_buf()
3760 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_process_rx_err_buf()
3761 return -EINVAL; in ath11k_dp_process_rx_err_buf()
3764 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_process_rx_err_buf()
3765 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_process_rx_err_buf()
3768 dma_unmap_single(ar->ab->dev, rxcb->paddr, in ath11k_dp_process_rx_err_buf()
3769 msdu->len + skb_tailroom(msdu), in ath11k_dp_process_rx_err_buf()
3778 if (!rcu_dereference(ar->ab->pdevs_active[ar->pdev_idx])) { in ath11k_dp_process_rx_err_buf()
3783 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) { in ath11k_dp_process_rx_err_buf()
3788 rx_desc = (struct hal_rx_desc *)msdu->data; in ath11k_dp_process_rx_err_buf()
3789 msdu_len = ath11k_dp_rx_h_msdu_start_msdu_len(ar->ab, rx_desc); in ath11k_dp_process_rx_err_buf()
3791 hdr_status = ath11k_dp_rx_h_80211_hdr(ar->ab, rx_desc); in ath11k_dp_process_rx_err_buf()
3792 ath11k_warn(ar->ab, "invalid msdu leng %u", msdu_len); in ath11k_dp_process_rx_err_buf()
3793 ath11k_dbg_dump(ar->ab, ATH11K_DBG_DATA, NULL, "", hdr_status, in ath11k_dp_process_rx_err_buf()
3795 ath11k_dbg_dump(ar->ab, ATH11K_DBG_DATA, NULL, "", rx_desc, in ath11k_dp_process_rx_err_buf()
3805 ath11k_dp_rx_link_desc_return(ar->ab, ring_desc, in ath11k_dp_process_rx_err_buf()
3837 dp = &ab->dp; in ath11k_dp_process_rx_err()
3838 reo_except = &dp->reo_except_ring; in ath11k_dp_process_rx_err()
3839 link_desc_banks = dp->link_desc_banks; in ath11k_dp_process_rx_err()
3841 srng = &ab->hal.srng_list[reo_except->ring_id]; in ath11k_dp_process_rx_err()
3843 spin_lock_bh(&srng->lock); in ath11k_dp_process_rx_err()
3851 ab->soc_stats.err_ring_pkts++; in ath11k_dp_process_rx_err()
3860 (paddr - link_desc_banks[desc_bank].paddr); in ath11k_dp_process_rx_err()
3866 ab->soc_stats.invalid_rbm++; in ath11k_dp_process_rx_err()
3873 is_frag = !!(reo_desc->rx_mpdu_info.info0 & RX_MPDU_DESC_INFO0_FRAG_FLAG); in ath11k_dp_process_rx_err()
3892 ar = ab->pdevs[mac_id].ar; in ath11k_dp_process_rx_err()
3905 budget = quota - tot_n_bufs_reaped; in ath11k_dp_process_rx_err()
3911 spin_unlock_bh(&srng->lock); in ath11k_dp_process_rx_err()
3913 for (i = 0; i < ab->num_radios; i++) { in ath11k_dp_process_rx_err()
3917 ar = ab->pdevs[i].ar; in ath11k_dp_process_rx_err()
3918 rx_ring = &ar->dp.rx_refill_buf_ring; in ath11k_dp_process_rx_err()
3921 ab->hw_params.hal_params->rx_buf_rbm); in ath11k_dp_process_rx_err()
3936 (DP_RX_BUFFER_SIZE - ar->ab->hw_params.hal_desc_sz)); in ath11k_dp_rx_null_q_desc_sg_drop()
3940 if (rxcb->err_rel_src == HAL_WBM_REL_SRC_MODULE_REO && in ath11k_dp_rx_null_q_desc_sg_drop()
3941 rxcb->err_code == HAL_REO_DEST_RING_ERROR_CODE_DESC_ADDR_ZERO) { in ath11k_dp_rx_null_q_desc_sg_drop()
3946 n_buffs--; in ath11k_dp_rx_null_q_desc_sg_drop()
3956 struct hal_rx_desc *desc = (struct hal_rx_desc *)msdu->data; in ath11k_dp_rx_h_null_q_desc()
3960 u32 hal_rx_desc_sz = ar->ab->hw_params.hal_desc_sz; in ath11k_dp_rx_h_null_q_desc()
3962 msdu_len = ath11k_dp_rx_h_msdu_start_msdu_len(ar->ab, desc); in ath11k_dp_rx_h_null_q_desc()
3964 if (!rxcb->is_frag && ((msdu_len + hal_rx_desc_sz) > DP_RX_BUFFER_SIZE)) { in ath11k_dp_rx_h_null_q_desc()
3966 msdu_len = msdu_len - (DP_RX_BUFFER_SIZE - hal_rx_desc_sz); in ath11k_dp_rx_h_null_q_desc()
3968 return -EINVAL; in ath11k_dp_rx_h_null_q_desc()
3971 rx_attention = ath11k_dp_rx_get_attention(ar->ab, desc); in ath11k_dp_rx_h_null_q_desc()
3973 ath11k_warn(ar->ab, in ath11k_dp_rx_h_null_q_desc()
3976 return -EIO; in ath11k_dp_rx_h_null_q_desc()
3984 * non-QOS TID queue, in the absence of any other default TID queue. in ath11k_dp_rx_h_null_q_desc()
3988 rxcb->is_first_msdu = ath11k_dp_rx_h_msdu_end_first_msdu(ar->ab, desc); in ath11k_dp_rx_h_null_q_desc()
3989 rxcb->is_last_msdu = ath11k_dp_rx_h_msdu_end_last_msdu(ar->ab, desc); in ath11k_dp_rx_h_null_q_desc()
3991 if (rxcb->is_frag) { in ath11k_dp_rx_h_null_q_desc()
3994 l3pad_bytes = ath11k_dp_rx_h_msdu_end_l3pad(ar->ab, desc); in ath11k_dp_rx_h_null_q_desc()
3997 return -EINVAL; in ath11k_dp_rx_h_null_q_desc()
4006 rxcb->tid = ath11k_dp_rx_h_mpdu_start_tid(ar->ab, desc); in ath11k_dp_rx_h_null_q_desc()
4022 ar->ab->soc_stats.reo_error[rxcb->err_code]++; in ath11k_dp_rx_h_reo_err()
4024 switch (rxcb->err_code) { in ath11k_dp_rx_h_reo_err()
4050 struct hal_rx_desc *desc = (struct hal_rx_desc *)msdu->data; in ath11k_dp_rx_h_tkip_mic_err()
4053 u32 hal_rx_desc_sz = ar->ab->hw_params.hal_desc_sz; in ath11k_dp_rx_h_tkip_mic_err()
4055 rxcb->is_first_msdu = ath11k_dp_rx_h_msdu_end_first_msdu(ar->ab, desc); in ath11k_dp_rx_h_tkip_mic_err()
4056 rxcb->is_last_msdu = ath11k_dp_rx_h_msdu_end_last_msdu(ar->ab, desc); in ath11k_dp_rx_h_tkip_mic_err()
4058 l3pad_bytes = ath11k_dp_rx_h_msdu_end_l3pad(ar->ab, desc); in ath11k_dp_rx_h_tkip_mic_err()
4059 msdu_len = ath11k_dp_rx_h_msdu_start_msdu_len(ar->ab, desc); in ath11k_dp_rx_h_tkip_mic_err()
4065 status->flag |= (RX_FLAG_MMIC_STRIPPED | RX_FLAG_MMIC_ERROR | in ath11k_dp_rx_h_tkip_mic_err()
4078 ar->ab->soc_stats.rxdma_error[rxcb->err_code]++; in ath11k_dp_rx_h_rxdma_err()
4080 switch (rxcb->err_code) { in ath11k_dp_rx_h_rxdma_err()
4104 switch (rxcb->err_rel_src) { in ath11k_dp_rx_wbm_err()
4128 struct ath11k_dp *dp = &ab->dp; in ath11k_dp_rx_process_wbm_err()
4141 for (i = 0; i < ab->num_radios; i++) in ath11k_dp_rx_process_wbm_err()
4144 srng = &ab->hal.srng_list[dp->rx_rel_ring.ring_id]; in ath11k_dp_rx_process_wbm_err()
4146 spin_lock_bh(&srng->lock); in ath11k_dp_rx_process_wbm_err()
4166 ar = ab->pdevs[mac_id].ar; in ath11k_dp_rx_process_wbm_err()
4167 rx_ring = &ar->dp.rx_refill_buf_ring; in ath11k_dp_rx_process_wbm_err()
4169 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_process_wbm_err()
4170 msdu = idr_find(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_process_wbm_err()
4174 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_process_wbm_err()
4178 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_process_wbm_err()
4179 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_process_wbm_err()
4182 dma_unmap_single(ab->dev, rxcb->paddr, in ath11k_dp_rx_process_wbm_err()
4183 msdu->len + skb_tailroom(msdu), in ath11k_dp_rx_process_wbm_err()
4188 budget--; in ath11k_dp_rx_process_wbm_err()
4196 rxcb->err_rel_src = err_info.err_rel_src; in ath11k_dp_rx_process_wbm_err()
4197 rxcb->err_code = err_info.err_code; in ath11k_dp_rx_process_wbm_err()
4198 rxcb->rx_desc = (struct hal_rx_desc *)msdu->data; in ath11k_dp_rx_process_wbm_err()
4204 spin_unlock_bh(&srng->lock); in ath11k_dp_rx_process_wbm_err()
4209 for (i = 0; i < ab->num_radios; i++) { in ath11k_dp_rx_process_wbm_err()
4213 ar = ab->pdevs[i].ar; in ath11k_dp_rx_process_wbm_err()
4214 rx_ring = &ar->dp.rx_refill_buf_ring; in ath11k_dp_rx_process_wbm_err()
4217 ab->hw_params.hal_params->rx_buf_rbm); in ath11k_dp_rx_process_wbm_err()
4221 for (i = 0; i < ab->num_radios; i++) { in ath11k_dp_rx_process_wbm_err()
4222 if (!rcu_dereference(ab->pdevs_active[i])) { in ath11k_dp_rx_process_wbm_err()
4227 ar = ab->pdevs[i].ar; in ath11k_dp_rx_process_wbm_err()
4229 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) { in ath11k_dp_rx_process_wbm_err()
4247 struct dp_link_desc_bank *link_desc_banks = ab->dp.link_desc_banks; in ath11k_dp_process_rxdma_err()
4265 ar = ab->pdevs[ath11k_hw_mac_id_to_pdev_id(&ab->hw_params, mac_id)].ar; in ath11k_dp_process_rxdma_err()
4266 err_ring = &ar->dp.rxdma_err_dst_ring[ath11k_hw_mac_id_to_srng_id(&ab->hw_params, in ath11k_dp_process_rxdma_err()
4268 rx_ring = &ar->dp.rx_refill_buf_ring; in ath11k_dp_process_rxdma_err()
4270 srng = &ab->hal.srng_list[err_ring->ring_id]; in ath11k_dp_process_rxdma_err()
4272 spin_lock_bh(&srng->lock); in ath11k_dp_process_rxdma_err()
4276 while (quota-- && in ath11k_dp_process_rxdma_err()
4283 entr_ring->info1); in ath11k_dp_process_rxdma_err()
4284 ab->soc_stats.rxdma_error[rxdma_err_code]++; in ath11k_dp_process_rxdma_err()
4287 (paddr - link_desc_banks[desc_bank].paddr); in ath11k_dp_process_rxdma_err()
4295 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_process_rxdma_err()
4296 skb = idr_find(&rx_ring->bufs_idr, buf_id); in ath11k_dp_process_rxdma_err()
4300 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_process_rxdma_err()
4304 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_process_rxdma_err()
4305 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_process_rxdma_err()
4308 dma_unmap_single(ab->dev, rxcb->paddr, in ath11k_dp_process_rxdma_err()
4309 skb->len + skb_tailroom(skb), in ath11k_dp_process_rxdma_err()
4322 spin_unlock_bh(&srng->lock); in ath11k_dp_process_rxdma_err()
4326 ab->hw_params.hal_params->rx_buf_rbm); in ath11k_dp_process_rxdma_err()
4328 return budget - quota; in ath11k_dp_process_rxdma_err()
4333 struct ath11k_dp *dp = &ab->dp; in ath11k_dp_process_reo_status()
4341 srng = &ab->hal.srng_list[dp->reo_status_ring.ring_id]; in ath11k_dp_process_reo_status()
4345 spin_lock_bh(&srng->lock); in ath11k_dp_process_reo_status()
4386 spin_lock_bh(&dp->reo_cmd_lock); in ath11k_dp_process_reo_status()
4387 list_for_each_entry_safe(cmd, tmp, &dp->reo_cmd_list, list) { in ath11k_dp_process_reo_status()
4388 if (reo_status.uniform_hdr.cmd_num == cmd->cmd_num) { in ath11k_dp_process_reo_status()
4390 list_del(&cmd->list); in ath11k_dp_process_reo_status()
4394 spin_unlock_bh(&dp->reo_cmd_lock); in ath11k_dp_process_reo_status()
4397 cmd->handler(dp, (void *)&cmd->data, in ath11k_dp_process_reo_status()
4407 spin_unlock_bh(&srng->lock); in ath11k_dp_process_reo_status()
4412 struct ath11k *ar = ab->pdevs[mac_id].ar; in ath11k_dp_rx_pdev_free()
4420 struct ath11k *ar = ab->pdevs[mac_id].ar; in ath11k_dp_rx_pdev_alloc()
4421 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_pdev_alloc()
4438 ring_id = dp->rx_refill_buf_ring.refill_buf_ring.ring_id; in ath11k_dp_rx_pdev_alloc()
4446 if (ab->hw_params.rx_mac_buf_ring) { in ath11k_dp_rx_pdev_alloc()
4447 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_dp_rx_pdev_alloc()
4448 ring_id = dp->rx_mac_buf_ring[i].ring_id; in ath11k_dp_rx_pdev_alloc()
4459 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_dp_rx_pdev_alloc()
4460 ring_id = dp->rxdma_err_dst_ring[i].ring_id; in ath11k_dp_rx_pdev_alloc()
4470 if (!ab->hw_params.rxdma1_enable) in ath11k_dp_rx_pdev_alloc()
4473 ring_id = dp->rxdma_mon_buf_ring.refill_buf_ring.ring_id; in ath11k_dp_rx_pdev_alloc()
4482 dp->rxdma_mon_dst_ring.ring_id, in ath11k_dp_rx_pdev_alloc()
4490 dp->rxdma_mon_desc_ring.ring_id, in ath11k_dp_rx_pdev_alloc()
4499 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) { in ath11k_dp_rx_pdev_alloc()
4500 ring_id = dp->rx_mon_status_refill_ring[i].refill_buf_ring.ring_id; in ath11k_dp_rx_pdev_alloc()
4516 if (*total_len >= (DP_RX_BUFFER_SIZE - sizeof(struct hal_rx_desc))) { in ath11k_dp_mon_set_frag_len()
4517 *frag_len = DP_RX_BUFFER_SIZE - sizeof(struct hal_rx_desc); in ath11k_dp_mon_set_frag_len()
4518 *total_len -= *frag_len; in ath11k_dp_mon_set_frag_len()
4530 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_monitor_link_desc_return()
4536 if (ar->ab->hw_params.rxdma1_enable) { in ath11k_dp_rx_monitor_link_desc_return()
4537 dp_srng = &dp->rxdma_mon_desc_ring; in ath11k_dp_rx_monitor_link_desc_return()
4538 hal_srng = &ar->ab->hal.srng_list[dp_srng->ring_id]; in ath11k_dp_rx_monitor_link_desc_return()
4540 dp_srng = &ar->ab->dp.wbm_desc_rel_ring; in ath11k_dp_rx_monitor_link_desc_return()
4541 hal_srng = &ar->ab->hal.srng_list[dp_srng->ring_id]; in ath11k_dp_rx_monitor_link_desc_return()
4544 ath11k_hal_srng_access_begin(ar->ab, hal_srng); in ath11k_dp_rx_monitor_link_desc_return()
4546 src_srng_desc = ath11k_hal_srng_src_get_next_entry(ar->ab, hal_srng); in ath11k_dp_rx_monitor_link_desc_return()
4553 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_monitor_link_desc_return()
4555 ret = -ENOMEM; in ath11k_dp_rx_monitor_link_desc_return()
4558 ath11k_hal_srng_access_end(ar->ab, hal_srng); in ath11k_dp_rx_monitor_link_desc_return()
4571 buf_addr_info = (struct ath11k_buffer_addr *)&msdu_link->buf_addr_info; in ath11k_dp_rx_mon_next_link_desc_get()
4580 if (skb->len > len) { in ath11k_dp_pkt_set_pktlen()
4583 if (skb_tailroom(skb) < len - skb->len) { in ath11k_dp_pkt_set_pktlen()
4585 len - skb->len - skb_tailroom(skb), in ath11k_dp_pkt_set_pktlen()
4588 return -ENOMEM; in ath11k_dp_pkt_set_pktlen()
4591 skb_put(skb, (len - skb->len)); in ath11k_dp_pkt_set_pktlen()
4610 msdu_details = &msdu_link->msdu_link[0]; in ath11k_hal_rx_msdu_list_get()
4615 msdu_desc_info = &msdu_details[i - 1].rx_msdu_info; in ath11k_hal_rx_msdu_list_get()
4616 msdu_desc_info->info0 |= last; in ath11k_hal_rx_msdu_list_get()
4623 msdu_desc_info->info0 |= first; in ath11k_hal_rx_msdu_list_get()
4624 else if (i == (HAL_RX_NUM_MSDU_DESC - 1)) in ath11k_hal_rx_msdu_list_get()
4625 msdu_desc_info->info0 |= last; in ath11k_hal_rx_msdu_list_get()
4626 msdu_list->msdu_info[i].msdu_flags = msdu_desc_info->info0; in ath11k_hal_rx_msdu_list_get()
4627 msdu_list->msdu_info[i].msdu_len = in ath11k_hal_rx_msdu_list_get()
4628 HAL_RX_MSDU_PKT_LENGTH_GET(msdu_desc_info->info0); in ath11k_hal_rx_msdu_list_get()
4629 msdu_list->sw_cookie[i] = in ath11k_hal_rx_msdu_list_get()
4634 msdu_list->rbm[i] = tmp; in ath11k_hal_rx_msdu_list_get()
4645 ((msdu_ppdu_id - *ppdu_id) < DP_NOT_PPDU_ID_WRAP_AROUND)) { in ath11k_dp_rx_mon_comp_ppduid()
4649 ((*ppdu_id - msdu_ppdu_id) > DP_NOT_PPDU_ID_WRAP_AROUND)) { in ath11k_dp_rx_mon_comp_ppduid()
4664 if (info->msdu_flags & RX_MSDU_DESC_INFO0_MSDU_CONTINUATION) { in ath11k_dp_mon_get_buf_len()
4666 *total_len = info->msdu_len; in ath11k_dp_mon_get_buf_len()
4676 *frag_len = info->msdu_len; in ath11k_dp_mon_get_buf_len()
4679 *msdu_cnt -= 1; in ath11k_dp_mon_get_buf_len()
4690 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_mon_mpdu_pop()
4691 struct ath11k_mon_data *pmon = (struct ath11k_mon_data *)&dp->mon_data; in ath11k_dp_rx_mon_mpdu_pop()
4692 struct dp_rxdma_ring *rx_ring = &dp->rxdma_mon_buf_ring; in ath11k_dp_rx_mon_mpdu_pop()
4712 if (!ar->ab->hw_params.rxdma1_enable) in ath11k_dp_rx_mon_mpdu_pop()
4713 rx_ring = &dp->rx_refill_buf_ring; in ath11k_dp_rx_mon_mpdu_pop()
4721 ent_desc->info1) == in ath11k_dp_rx_mon_mpdu_pop()
4725 ent_desc->info1); in ath11k_dp_rx_mon_mpdu_pop()
4730 pmon->rx_mon_stats.dest_mpdu_drop++; in ath11k_dp_rx_mon_mpdu_pop()
4738 if (pmon->mon_last_linkdesc_paddr == paddr) { in ath11k_dp_rx_mon_mpdu_pop()
4739 pmon->rx_mon_stats.dup_mon_linkdesc_cnt++; in ath11k_dp_rx_mon_mpdu_pop()
4743 if (ar->ab->hw_params.rxdma1_enable) in ath11k_dp_rx_mon_mpdu_pop()
4745 (void *)pmon->link_desc_banks[sw_cookie].vaddr + in ath11k_dp_rx_mon_mpdu_pop()
4746 (paddr - pmon->link_desc_banks[sw_cookie].paddr); in ath11k_dp_rx_mon_mpdu_pop()
4749 (void *)ar->ab->dp.link_desc_banks[sw_cookie].vaddr + in ath11k_dp_rx_mon_mpdu_pop()
4750 (paddr - ar->ab->dp.link_desc_banks[sw_cookie].paddr); in ath11k_dp_rx_mon_mpdu_pop()
4758 if (pmon->mon_last_buf_cookie == msdu_list.sw_cookie[i]) { in ath11k_dp_rx_mon_mpdu_pop()
4759 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_mon_mpdu_pop()
4761 i, pmon->mon_last_buf_cookie); in ath11k_dp_rx_mon_mpdu_pop()
4763 pmon->rx_mon_stats.dup_mon_buf_cnt++; in ath11k_dp_rx_mon_mpdu_pop()
4769 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_mon_mpdu_pop()
4770 msdu = idr_find(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_mon_mpdu_pop()
4771 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_mon_mpdu_pop()
4773 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_mon_mpdu_pop()
4778 if (!rxcb->unmapped) { in ath11k_dp_rx_mon_mpdu_pop()
4779 dma_unmap_single(ar->ab->dev, rxcb->paddr, in ath11k_dp_rx_mon_mpdu_pop()
4780 msdu->len + in ath11k_dp_rx_mon_mpdu_pop()
4783 rxcb->unmapped = 1; in ath11k_dp_rx_mon_mpdu_pop()
4786 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_mon_mpdu_pop()
4794 rx_desc = (struct hal_rx_desc *)msdu->data; in ath11k_dp_rx_mon_mpdu_pop()
4797 l2_hdr_offset = ath11k_dp_rx_h_msdu_end_l3pad(ar->ab, rx_desc); in ath11k_dp_rx_mon_mpdu_pop()
4800 if (!ath11k_dp_rxdesc_mpdu_valid(ar->ab, rx_desc)) { in ath11k_dp_rx_mon_mpdu_pop()
4804 pmon->mon_last_linkdesc_paddr = paddr; in ath11k_dp_rx_mon_mpdu_pop()
4809 ath11k_dp_rxdesc_get_ppduid(ar->ab, rx_desc); in ath11k_dp_rx_mon_mpdu_pop()
4822 pmon->mon_last_linkdesc_paddr = paddr; in ath11k_dp_rx_mon_mpdu_pop()
4835 last->next = msdu; in ath11k_dp_rx_mon_mpdu_pop()
4839 pmon->mon_last_buf_cookie = msdu_list.sw_cookie[i]; in ath11k_dp_rx_mon_mpdu_pop()
4841 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_mon_mpdu_pop()
4842 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_mon_mpdu_pop()
4843 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_mon_mpdu_pop()
4852 if (ar->ab->hw_params.rxdma1_enable) { in ath11k_dp_rx_mon_mpdu_pop()
4855 dp->mac_id)) in ath11k_dp_rx_mon_mpdu_pop()
4856 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_mon_mpdu_pop()
4859 ath11k_dp_rx_link_desc_return(ar->ab, rx_link_buf_info, in ath11k_dp_rx_mon_mpdu_pop()
4868 last->next = NULL; in ath11k_dp_rx_mon_mpdu_pop()
4882 rx_pkt_offset = ar->ab->hw_params.hal_desc_sz; in ath11k_dp_rx_msdus_set_payload()
4883 l2_hdr_offset = ath11k_dp_rx_h_msdu_end_l3pad(ar->ab, in ath11k_dp_rx_msdus_set_payload()
4884 (struct hal_rx_desc *)msdu->data); in ath11k_dp_rx_msdus_set_payload()
4894 struct ath11k_base *ab = ar->ab; in ath11k_dp_rx_mon_merg_msdus()
4906 rx_desc = (struct hal_rx_desc *)head_msdu->data; in ath11k_dp_rx_mon_merg_msdus()
4924 msdu = head_msdu->next; in ath11k_dp_rx_mon_merg_msdus()
4930 msdu = msdu->next; in ath11k_dp_rx_mon_merg_msdus()
4933 prev_buf->next = NULL; in ath11k_dp_rx_mon_merg_msdus()
4935 skb_trim(prev_buf, prev_buf->len - HAL_RX_FCS_LEN); in ath11k_dp_rx_mon_merg_msdus()
4939 rx_desc = (struct hal_rx_desc *)head_msdu->data; in ath11k_dp_rx_mon_merg_msdus()
4945 if (ieee80211_is_data_qos(wh->frame_control)) in ath11k_dp_rx_mon_merg_msdus()
4959 msdu = msdu->next; in ath11k_dp_rx_mon_merg_msdus()
4966 "mpdu_buf %p mpdu_buf->len %u", in ath11k_dp_rx_mon_merg_msdus()
4967 prev_buf, prev_buf->len); in ath11k_dp_rx_mon_merg_msdus()
4987 put_unaligned_le16(rx_status->he_data1, &rtap_buf[rtap_len]); in ath11k_dp_rx_update_radiotap_he()
4990 put_unaligned_le16(rx_status->he_data2, &rtap_buf[rtap_len]); in ath11k_dp_rx_update_radiotap_he()
4993 put_unaligned_le16(rx_status->he_data3, &rtap_buf[rtap_len]); in ath11k_dp_rx_update_radiotap_he()
4996 put_unaligned_le16(rx_status->he_data4, &rtap_buf[rtap_len]); in ath11k_dp_rx_update_radiotap_he()
4999 put_unaligned_le16(rx_status->he_data5, &rtap_buf[rtap_len]); in ath11k_dp_rx_update_radiotap_he()
5002 put_unaligned_le16(rx_status->he_data6, &rtap_buf[rtap_len]); in ath11k_dp_rx_update_radiotap_he()
5011 put_unaligned_le16(rx_status->he_flags1, &rtap_buf[rtap_len]); in ath11k_dp_rx_update_radiotap_he_mu()
5014 put_unaligned_le16(rx_status->he_flags2, &rtap_buf[rtap_len]); in ath11k_dp_rx_update_radiotap_he_mu()
5017 rtap_buf[rtap_len] = rx_status->he_RU[0]; in ath11k_dp_rx_update_radiotap_he_mu()
5020 rtap_buf[rtap_len] = rx_status->he_RU[1]; in ath11k_dp_rx_update_radiotap_he_mu()
5023 rtap_buf[rtap_len] = rx_status->he_RU[2]; in ath11k_dp_rx_update_radiotap_he_mu()
5026 rtap_buf[rtap_len] = rx_status->he_RU[3]; in ath11k_dp_rx_update_radiotap_he_mu()
5037 rxs->flag |= RX_FLAG_MACTIME_START; in ath11k_update_radiotap()
5038 rxs->signal = ppduinfo->rssi_comb + ATH11K_DEFAULT_NOISE_FLOOR; in ath11k_update_radiotap()
5040 if (ppduinfo->nss) in ath11k_update_radiotap()
5041 rxs->nss = ppduinfo->nss; in ath11k_update_radiotap()
5043 if (ppduinfo->he_mu_flags) { in ath11k_update_radiotap()
5044 rxs->flag |= RX_FLAG_RADIOTAP_HE_MU; in ath11k_update_radiotap()
5045 rxs->encoding = RX_ENC_HE; in ath11k_update_radiotap()
5048 } else if (ppduinfo->he_flags) { in ath11k_update_radiotap()
5049 rxs->flag |= RX_FLAG_RADIOTAP_HE; in ath11k_update_radiotap()
5050 rxs->encoding = RX_ENC_HE; in ath11k_update_radiotap()
5053 rxs->rate_idx = ppduinfo->rate; in ath11k_update_radiotap()
5054 } else if (ppduinfo->vht_flags) { in ath11k_update_radiotap()
5055 rxs->encoding = RX_ENC_VHT; in ath11k_update_radiotap()
5056 rxs->rate_idx = ppduinfo->rate; in ath11k_update_radiotap()
5057 } else if (ppduinfo->ht_flags) { in ath11k_update_radiotap()
5058 rxs->encoding = RX_ENC_HT; in ath11k_update_radiotap()
5059 rxs->rate_idx = ppduinfo->rate; in ath11k_update_radiotap()
5061 rxs->encoding = RX_ENC_LEGACY; in ath11k_update_radiotap()
5062 sband = &ar->mac.sbands[rxs->band]; in ath11k_update_radiotap()
5063 rxs->rate_idx = ath11k_mac_hw_rate_to_idx(sband, ppduinfo->rate, in ath11k_update_radiotap()
5064 ppduinfo->cck_flag); in ath11k_update_radiotap()
5067 rxs->mactime = ppduinfo->tsft; in ath11k_update_radiotap()
5076 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_mon_deliver()
5078 struct ieee80211_rx_status *rxs = &dp->rx_status; in ath11k_dp_rx_mon_deliver()
5089 rxs->flag = 0; in ath11k_dp_rx_mon_deliver()
5092 rxs->flag = RX_FLAG_FAILED_FCS_CRC; in ath11k_dp_rx_mon_deliver()
5095 skb_next = mon_skb->next; in ath11k_dp_rx_mon_deliver()
5097 rxs->flag &= ~RX_FLAG_AMSDU_MORE; in ath11k_dp_rx_mon_deliver()
5099 rxs->flag |= RX_FLAG_AMSDU_MORE; in ath11k_dp_rx_mon_deliver()
5103 rxs->flag &= ~RX_FLAG_ALLOW_SAME_PN; in ath11k_dp_rx_mon_deliver()
5105 rxs->flag |= RX_FLAG_ALLOW_SAME_PN; in ath11k_dp_rx_mon_deliver()
5107 rxs->flag |= RX_FLAG_ONLY_MONITOR; in ath11k_dp_rx_mon_deliver()
5113 rxs->flag = 0; in ath11k_dp_rx_mon_deliver()
5120 skb_next = mon_skb->next; in ath11k_dp_rx_mon_deliver()
5124 return -EINVAL; in ath11k_dp_rx_mon_deliver()
5136 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_mon_dest_process()
5137 struct ath11k_mon_data *pmon = (struct ath11k_mon_data *)&dp->mon_data; in ath11k_dp_rx_mon_dest_process()
5148 if (ar->ab->hw_params.rxdma1_enable) in ath11k_dp_rx_mon_dest_process()
5149 ring_id = dp->rxdma_mon_dst_ring.ring_id; in ath11k_dp_rx_mon_dest_process()
5151 ring_id = dp->rxdma_err_dst_ring[mac_id].ring_id; in ath11k_dp_rx_mon_dest_process()
5153 mon_dst_srng = &ar->ab->hal.srng_list[ring_id]; in ath11k_dp_rx_mon_dest_process()
5155 spin_lock_bh(&pmon->mon_lock); in ath11k_dp_rx_mon_dest_process()
5157 spin_lock_bh(&mon_dst_srng->lock); in ath11k_dp_rx_mon_dest_process()
5158 ath11k_hal_srng_access_begin(ar->ab, mon_dst_srng); in ath11k_dp_rx_mon_dest_process()
5160 ppdu_id = pmon->mon_ppdu_info.ppdu_id; in ath11k_dp_rx_mon_dest_process()
5162 rx_mon_stats = &pmon->rx_mon_stats; in ath11k_dp_rx_mon_dest_process()
5164 while ((ring_entry = ath11k_hal_srng_dst_peek(ar->ab, mon_dst_srng))) { in ath11k_dp_rx_mon_dest_process()
5178 dp->mon_dest_ring_stuck_cnt = 0; in ath11k_dp_rx_mon_dest_process()
5180 dp->mon_dest_ring_stuck_cnt++; in ath11k_dp_rx_mon_dest_process()
5181 rx_mon_stats->dest_mon_not_reaped++; in ath11k_dp_rx_mon_dest_process()
5184 if (dp->mon_dest_ring_stuck_cnt > MON_DEST_RING_STUCK_MAX_CNT) { in ath11k_dp_rx_mon_dest_process()
5185 rx_mon_stats->dest_mon_stuck++; in ath11k_dp_rx_mon_dest_process()
5186 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_mon_dest_process()
5188 pmon->mon_ppdu_info.ppdu_id, ppdu_id, in ath11k_dp_rx_mon_dest_process()
5189 dp->mon_dest_ring_stuck_cnt, in ath11k_dp_rx_mon_dest_process()
5190 rx_mon_stats->dest_mon_not_reaped, in ath11k_dp_rx_mon_dest_process()
5191 rx_mon_stats->dest_mon_stuck); in ath11k_dp_rx_mon_dest_process()
5192 pmon->mon_ppdu_info.ppdu_id = ppdu_id; in ath11k_dp_rx_mon_dest_process()
5196 if (ppdu_id != pmon->mon_ppdu_info.ppdu_id) { in ath11k_dp_rx_mon_dest_process()
5197 pmon->mon_ppdu_status = DP_PPDU_STATUS_START; in ath11k_dp_rx_mon_dest_process()
5198 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_mon_dest_process()
5200 ppdu_id, pmon->mon_ppdu_info.ppdu_id, in ath11k_dp_rx_mon_dest_process()
5201 rx_mon_stats->dest_mon_not_reaped, in ath11k_dp_rx_mon_dest_process()
5202 rx_mon_stats->dest_mon_stuck); in ath11k_dp_rx_mon_dest_process()
5206 ath11k_dp_rx_mon_deliver(ar, dp->mac_id, head_msdu, in ath11k_dp_rx_mon_dest_process()
5207 &pmon->mon_ppdu_info, in ath11k_dp_rx_mon_dest_process()
5209 rx_mon_stats->dest_mpdu_done++; in ath11k_dp_rx_mon_dest_process()
5212 ring_entry = ath11k_hal_srng_dst_get_next_entry(ar->ab, in ath11k_dp_rx_mon_dest_process()
5215 ath11k_hal_srng_access_end(ar->ab, mon_dst_srng); in ath11k_dp_rx_mon_dest_process()
5216 spin_unlock_bh(&mon_dst_srng->lock); in ath11k_dp_rx_mon_dest_process()
5218 spin_unlock_bh(&pmon->mon_lock); in ath11k_dp_rx_mon_dest_process()
5221 rx_mon_stats->dest_ppdu_done++; in ath11k_dp_rx_mon_dest_process()
5222 hal_params = ar->ab->hw_params.hal_params; in ath11k_dp_rx_mon_dest_process()
5224 if (ar->ab->hw_params.rxdma1_enable) in ath11k_dp_rx_mon_dest_process()
5225 ath11k_dp_rxbufs_replenish(ar->ab, dp->mac_id, in ath11k_dp_rx_mon_dest_process()
5226 &dp->rxdma_mon_buf_ring, in ath11k_dp_rx_mon_dest_process()
5228 hal_params->rx_buf_rbm); in ath11k_dp_rx_mon_dest_process()
5230 ath11k_dp_rxbufs_replenish(ar->ab, dp->mac_id, in ath11k_dp_rx_mon_dest_process()
5231 &dp->rx_refill_buf_ring, in ath11k_dp_rx_mon_dest_process()
5233 hal_params->rx_buf_rbm); in ath11k_dp_rx_mon_dest_process()
5249 struct ath11k_mon_data *pmon = (struct ath11k_mon_data *)&ar->dp.mon_data; in ath11k_dp_rx_process_mon_status()
5250 struct ath11k_pdev_mon_stats *rx_mon_stats = &pmon->rx_mon_stats; in ath11k_dp_rx_process_mon_status()
5251 struct hal_rx_mon_ppdu_info *ppdu_info = &pmon->mon_ppdu_info; in ath11k_dp_rx_process_mon_status()
5261 ppdu_info->peer_id = HAL_INVALID_PEERID; in ath11k_dp_rx_process_mon_status()
5276 trace_ath11k_htt_rxdesc(ar, skb->data, log_type, rx_buf_sz); in ath11k_dp_rx_process_mon_status()
5279 ppdu_info->peer_id = HAL_INVALID_PEERID; in ath11k_dp_rx_process_mon_status()
5282 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags) && in ath11k_dp_rx_process_mon_status()
5283 pmon->mon_ppdu_status == DP_PPDU_STATUS_START && in ath11k_dp_rx_process_mon_status()
5285 rx_mon_stats->status_ppdu_done++; in ath11k_dp_rx_process_mon_status()
5286 pmon->mon_ppdu_status = DP_PPDU_STATUS_DONE; in ath11k_dp_rx_process_mon_status()
5287 if (!ab->hw_params.full_monitor_mode) { in ath11k_dp_rx_process_mon_status()
5290 pmon->mon_ppdu_status = DP_PPDU_STATUS_START; in ath11k_dp_rx_process_mon_status()
5294 if (ppdu_info->peer_id == HAL_INVALID_PEERID || in ath11k_dp_rx_process_mon_status()
5301 spin_lock_bh(&ab->base_lock); in ath11k_dp_rx_process_mon_status()
5302 peer = ath11k_peer_find_by_id(ab, ppdu_info->peer_id); in ath11k_dp_rx_process_mon_status()
5304 if (!peer || !peer->sta) { in ath11k_dp_rx_process_mon_status()
5307 ppdu_info->peer_id); in ath11k_dp_rx_process_mon_status()
5311 arsta = ath11k_sta_to_arsta(peer->sta); in ath11k_dp_rx_process_mon_status()
5314 if (ath11k_debugfs_is_pktlog_peer_valid(ar, peer->addr)) in ath11k_dp_rx_process_mon_status()
5315 trace_ath11k_htt_rxdesc(ar, skb->data, log_type, rx_buf_sz); in ath11k_dp_rx_process_mon_status()
5318 spin_unlock_bh(&ab->base_lock); in ath11k_dp_rx_process_mon_status()
5323 ppdu_info->peer_id = HAL_INVALID_PEERID; in ath11k_dp_rx_process_mon_status()
5335 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_full_mon_mpdu_pop()
5336 struct ath11k_mon_data *pmon = &dp->mon_data; in ath11k_dp_rx_full_mon_mpdu_pop()
5337 struct dp_rxdma_ring *rx_ring = &dp->rxdma_mon_buf_ring; in ath11k_dp_rx_full_mon_mpdu_pop()
5356 sw_cookie = sw_mon_entries->mon_dst_sw_cookie; in ath11k_dp_rx_full_mon_mpdu_pop()
5357 sw_mon_entries->end_of_ppdu = false; in ath11k_dp_rx_full_mon_mpdu_pop()
5358 sw_mon_entries->drop_ppdu = false; in ath11k_dp_rx_full_mon_mpdu_pop()
5359 p_last_buf_addr_info = sw_mon_entries->dst_buf_addr_info; in ath11k_dp_rx_full_mon_mpdu_pop()
5360 msdu_cnt = sw_mon_entries->msdu_cnt; in ath11k_dp_rx_full_mon_mpdu_pop()
5362 sw_mon_entries->end_of_ppdu = in ath11k_dp_rx_full_mon_mpdu_pop()
5363 FIELD_GET(HAL_SW_MON_RING_INFO0_END_OF_PPDU, sw_desc->info0); in ath11k_dp_rx_full_mon_mpdu_pop()
5364 if (sw_mon_entries->end_of_ppdu) in ath11k_dp_rx_full_mon_mpdu_pop()
5368 sw_desc->info0) == in ath11k_dp_rx_full_mon_mpdu_pop()
5372 sw_desc->info0); in ath11k_dp_rx_full_mon_mpdu_pop()
5376 pmon->rx_mon_stats.dest_mpdu_drop++; in ath11k_dp_rx_full_mon_mpdu_pop()
5386 (u8 *)pmon->link_desc_banks[sw_cookie].vaddr + in ath11k_dp_rx_full_mon_mpdu_pop()
5387 (sw_mon_entries->mon_dst_paddr - in ath11k_dp_rx_full_mon_mpdu_pop()
5388 pmon->link_desc_banks[sw_cookie].paddr); in ath11k_dp_rx_full_mon_mpdu_pop()
5397 spin_lock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_full_mon_mpdu_pop()
5398 msdu = idr_find(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_full_mon_mpdu_pop()
5400 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_full_mon_mpdu_pop()
5403 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_full_mon_mpdu_pop()
5406 idr_remove(&rx_ring->bufs_idr, buf_id); in ath11k_dp_rx_full_mon_mpdu_pop()
5407 spin_unlock_bh(&rx_ring->idr_lock); in ath11k_dp_rx_full_mon_mpdu_pop()
5410 if (!rxcb->unmapped) { in ath11k_dp_rx_full_mon_mpdu_pop()
5411 dma_unmap_single(ar->ab->dev, rxcb->paddr, in ath11k_dp_rx_full_mon_mpdu_pop()
5412 msdu->len + in ath11k_dp_rx_full_mon_mpdu_pop()
5415 rxcb->unmapped = 1; in ath11k_dp_rx_full_mon_mpdu_pop()
5418 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_full_mon_mpdu_pop()
5420 i, msdu, sw_mon_entries->ppdu_id); in ath11k_dp_rx_full_mon_mpdu_pop()
5422 msdu_cnt--; in ath11k_dp_rx_full_mon_mpdu_pop()
5426 rx_desc = (struct hal_rx_desc *)msdu->data; in ath11k_dp_rx_full_mon_mpdu_pop()
5429 l2_hdr_offset = ath11k_dp_rx_h_msdu_end_l3pad(ar->ab, rx_desc); in ath11k_dp_rx_full_mon_mpdu_pop()
5432 if (!ath11k_dp_rxdesc_mpdu_valid(ar->ab, rx_desc)) { in ath11k_dp_rx_full_mon_mpdu_pop()
5452 last->next = msdu; in ath11k_dp_rx_full_mon_mpdu_pop()
5460 &sw_mon_entries->mon_dst_paddr, in ath11k_dp_rx_full_mon_mpdu_pop()
5461 &sw_mon_entries->mon_dst_sw_cookie, in ath11k_dp_rx_full_mon_mpdu_pop()
5467 dp->mac_id)) in ath11k_dp_rx_full_mon_mpdu_pop()
5468 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, in ath11k_dp_rx_full_mon_mpdu_pop()
5473 } while (sw_mon_entries->mon_dst_paddr && msdu_cnt); in ath11k_dp_rx_full_mon_mpdu_pop()
5476 last->next = NULL; in ath11k_dp_rx_full_mon_mpdu_pop()
5490 return -ENOMEM; in ath11k_dp_rx_full_mon_prepare_mpdu()
5492 list_add_tail(&mon_mpdu->list, &dp->dp_full_mon_mpdu_list); in ath11k_dp_rx_full_mon_prepare_mpdu()
5493 mon_mpdu->head = head; in ath11k_dp_rx_full_mon_prepare_mpdu()
5494 mon_mpdu->tail = tail; in ath11k_dp_rx_full_mon_prepare_mpdu()
5505 if (list_empty(&dp->dp_full_mon_mpdu_list)) in ath11k_dp_rx_full_mon_drop_ppdu()
5508 list_for_each_entry_safe(mon_mpdu, tmp, &dp->dp_full_mon_mpdu_list, list) { in ath11k_dp_rx_full_mon_drop_ppdu()
5509 list_del(&mon_mpdu->list); in ath11k_dp_rx_full_mon_drop_ppdu()
5511 tmp_msdu = mon_mpdu->head; in ath11k_dp_rx_full_mon_drop_ppdu()
5513 skb_next = tmp_msdu->next; in ath11k_dp_rx_full_mon_drop_ppdu()
5529 struct dp_full_mon_mpdu *mon_mpdu = pmon->mon_mpdu; in ath11k_dp_rx_full_mon_deliver_ppdu()
5531 struct ath11k_base *ab = ar->ab; in ath11k_dp_rx_full_mon_deliver_ppdu()
5532 struct ath11k_dp *dp = &ab->dp; in ath11k_dp_rx_full_mon_deliver_ppdu()
5535 rx_mon_stats = &pmon->rx_mon_stats; in ath11k_dp_rx_full_mon_deliver_ppdu()
5537 list_for_each_entry_safe(mon_mpdu, tmp, &dp->dp_full_mon_mpdu_list, list) { in ath11k_dp_rx_full_mon_deliver_ppdu()
5538 list_del(&mon_mpdu->list); in ath11k_dp_rx_full_mon_deliver_ppdu()
5539 head_msdu = mon_mpdu->head; in ath11k_dp_rx_full_mon_deliver_ppdu()
5540 tail_msdu = mon_mpdu->tail; in ath11k_dp_rx_full_mon_deliver_ppdu()
5543 &pmon->mon_ppdu_info, in ath11k_dp_rx_full_mon_deliver_ppdu()
5545 rx_mon_stats->dest_mpdu_done++; in ath11k_dp_rx_full_mon_deliver_ppdu()
5546 ath11k_dbg(ar->ab, ATH11K_DBG_DATA, "full mon: deliver ppdu\n"); in ath11k_dp_rx_full_mon_deliver_ppdu()
5558 struct ath11k *ar = ab->pdevs[mac_id].ar; in ath11k_dp_rx_process_full_mon_status_ring()
5559 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_process_full_mon_status_ring()
5560 struct ath11k_mon_data *pmon = &dp->mon_data; in ath11k_dp_rx_process_full_mon_status_ring()
5564 sw_mon_entries = &pmon->sw_mon_entries; in ath11k_dp_rx_process_full_mon_status_ring()
5566 while (pmon->hold_mon_dst_ring) { in ath11k_dp_rx_process_full_mon_status_ring()
5569 if (pmon->buf_state == DP_MON_STATUS_MATCH) { in ath11k_dp_rx_process_full_mon_status_ring()
5570 count = sw_mon_entries->status_buf_count; in ath11k_dp_rx_process_full_mon_status_ring()
5576 ath11k_dp_rx_full_mon_deliver_ppdu(ar, dp->mac_id, in ath11k_dp_rx_process_full_mon_status_ring()
5578 pmon->hold_mon_dst_ring = false; in ath11k_dp_rx_process_full_mon_status_ring()
5579 } else if (!pmon->mon_status_paddr || in ath11k_dp_rx_process_full_mon_status_ring()
5580 pmon->buf_state == DP_MON_STATUS_LEAD) { in ath11k_dp_rx_process_full_mon_status_ring()
5581 sw_mon_entries->drop_ppdu = true; in ath11k_dp_rx_process_full_mon_status_ring()
5582 pmon->hold_mon_dst_ring = false; in ath11k_dp_rx_process_full_mon_status_ring()
5591 if (sw_mon_entries->drop_ppdu) in ath11k_dp_rx_process_full_mon_status_ring()
5592 ath11k_dp_rx_full_mon_drop_ppdu(&ab->dp, pmon->mon_mpdu); in ath11k_dp_rx_process_full_mon_status_ring()
5600 struct ath11k *ar = ab->pdevs[mac_id].ar; in ath11k_dp_full_mon_process_rx()
5601 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_full_mon_process_rx()
5602 struct ath11k_mon_data *pmon = &dp->mon_data; in ath11k_dp_full_mon_process_rx()
5612 spin_lock_bh(&pmon->mon_lock); in ath11k_dp_full_mon_process_rx()
5614 sw_mon_entries = &pmon->sw_mon_entries; in ath11k_dp_full_mon_process_rx()
5615 rx_mon_stats = &pmon->rx_mon_stats; in ath11k_dp_full_mon_process_rx()
5617 if (pmon->hold_mon_dst_ring) { in ath11k_dp_full_mon_process_rx()
5618 spin_unlock_bh(&pmon->mon_lock); in ath11k_dp_full_mon_process_rx()
5622 mon_dst_srng = &ar->ab->hal.srng_list[dp->rxdma_mon_dst_ring.ring_id]; in ath11k_dp_full_mon_process_rx()
5623 spin_lock_bh(&mon_dst_srng->lock); in ath11k_dp_full_mon_process_rx()
5625 ath11k_hal_srng_access_begin(ar->ab, mon_dst_srng); in ath11k_dp_full_mon_process_rx()
5626 while ((ring_entry = ath11k_hal_srng_dst_peek(ar->ab, mon_dst_srng))) { in ath11k_dp_full_mon_process_rx()
5636 if (!sw_mon_entries->end_of_ppdu) { in ath11k_dp_full_mon_process_rx()
5638 ret = ath11k_dp_rx_full_mon_prepare_mpdu(&ab->dp, in ath11k_dp_full_mon_process_rx()
5639 pmon->mon_mpdu, in ath11k_dp_full_mon_process_rx()
5648 if (!sw_mon_entries->ppdu_id && in ath11k_dp_full_mon_process_rx()
5649 !sw_mon_entries->mon_status_paddr) { in ath11k_dp_full_mon_process_rx()
5655 rx_mon_stats->dest_ppdu_done++; in ath11k_dp_full_mon_process_rx()
5656 pmon->mon_ppdu_status = DP_PPDU_STATUS_START; in ath11k_dp_full_mon_process_rx()
5657 pmon->buf_state = DP_MON_STATUS_LAG; in ath11k_dp_full_mon_process_rx()
5658 pmon->mon_status_paddr = sw_mon_entries->mon_status_paddr; in ath11k_dp_full_mon_process_rx()
5659 pmon->hold_mon_dst_ring = true; in ath11k_dp_full_mon_process_rx()
5661 ring_entry = ath11k_hal_srng_dst_get_next_entry(ar->ab, in ath11k_dp_full_mon_process_rx()
5667 ath11k_hal_srng_access_end(ar->ab, mon_dst_srng); in ath11k_dp_full_mon_process_rx()
5668 spin_unlock_bh(&mon_dst_srng->lock); in ath11k_dp_full_mon_process_rx()
5669 spin_unlock_bh(&pmon->mon_lock); in ath11k_dp_full_mon_process_rx()
5672 ath11k_dp_rxbufs_replenish(ar->ab, dp->mac_id, in ath11k_dp_full_mon_process_rx()
5673 &dp->rxdma_mon_buf_ring, in ath11k_dp_full_mon_process_rx()
5691 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags) && in ath11k_dp_rx_process_mon_rings()
5692 ab->hw_params.full_monitor_mode) in ath11k_dp_rx_process_mon_rings()
5702 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_pdev_mon_status_attach()
5703 struct ath11k_mon_data *pmon = (struct ath11k_mon_data *)&dp->mon_data; in ath11k_dp_rx_pdev_mon_status_attach()
5705 pmon->mon_ppdu_status = DP_PPDU_STATUS_START; in ath11k_dp_rx_pdev_mon_status_attach()
5707 memset(&pmon->rx_mon_stats, 0, in ath11k_dp_rx_pdev_mon_status_attach()
5708 sizeof(pmon->rx_mon_stats)); in ath11k_dp_rx_pdev_mon_status_attach()
5714 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_rx_pdev_mon_attach()
5715 struct ath11k_mon_data *pmon = &dp->mon_data; in ath11k_dp_rx_pdev_mon_attach()
5723 ath11k_warn(ar->ab, "pdev_mon_status_attach() failed"); in ath11k_dp_rx_pdev_mon_attach()
5730 if (!ar->ab->hw_params.rxdma1_enable) in ath11k_dp_rx_pdev_mon_attach()
5733 dp_srng = &dp->rxdma_mon_desc_ring; in ath11k_dp_rx_pdev_mon_attach()
5734 n_link_desc = dp_srng->size / in ath11k_dp_rx_pdev_mon_attach()
5735 ath11k_hal_srng_get_entrysize(ar->ab, HAL_RXDMA_MONITOR_DESC); in ath11k_dp_rx_pdev_mon_attach()
5737 &ar->ab->hal.srng_list[dp->rxdma_mon_desc_ring.ring_id]; in ath11k_dp_rx_pdev_mon_attach()
5739 ret = ath11k_dp_link_desc_setup(ar->ab, pmon->link_desc_banks, in ath11k_dp_rx_pdev_mon_attach()
5743 ath11k_warn(ar->ab, "mon_link_desc_pool_setup() failed"); in ath11k_dp_rx_pdev_mon_attach()
5746 pmon->mon_last_linkdesc_paddr = 0; in ath11k_dp_rx_pdev_mon_attach()
5747 pmon->mon_last_buf_cookie = DP_RX_DESC_COOKIE_MAX + 1; in ath11k_dp_rx_pdev_mon_attach()
5748 spin_lock_init(&pmon->mon_lock); in ath11k_dp_rx_pdev_mon_attach()
5755 struct ath11k_pdev_dp *dp = &ar->dp; in ath11k_dp_mon_link_free()
5756 struct ath11k_mon_data *pmon = &dp->mon_data; in ath11k_dp_mon_link_free()
5758 ath11k_dp_link_desc_cleanup(ar->ab, pmon->link_desc_banks, in ath11k_dp_mon_link_free()
5760 &dp->rxdma_mon_desc_ring); in ath11k_dp_mon_link_free()
5773 mod_timer(&ab->mon_reap_timer, in ath11k_dp_rx_pktlog_start()
5784 timer_delete_sync(&ab->mon_reap_timer); in ath11k_dp_rx_pktlog_stop()