Lines Matching +full:rates +full:- +full:mcs

1 // SPDX-License-Identifier: ISC
3 * Copyright (c) 2005-2011 Atheros Communications Inc.
4 * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
34 hash_for_each_possible(ar->htt.rx_ring.skb_table, rxcb, hlist, paddr) in ath10k_htt_rx_find_skb_paddr()
35 if (rxcb->paddr == paddr) in ath10k_htt_rx_find_skb_paddr()
49 if (htt->rx_ring.in_ord_rx) { in ath10k_htt_rx_ring_free()
50 hash_for_each_safe(htt->rx_ring.skb_table, i, n, rxcb, hlist) { in ath10k_htt_rx_ring_free()
52 dma_unmap_single(htt->ar->dev, rxcb->paddr, in ath10k_htt_rx_ring_free()
53 skb->len + skb_tailroom(skb), in ath10k_htt_rx_ring_free()
55 hash_del(&rxcb->hlist); in ath10k_htt_rx_ring_free()
59 for (i = 0; i < htt->rx_ring.size; i++) { in ath10k_htt_rx_ring_free()
60 skb = htt->rx_ring.netbufs_ring[i]; in ath10k_htt_rx_ring_free()
65 dma_unmap_single(htt->ar->dev, rxcb->paddr, in ath10k_htt_rx_ring_free()
66 skb->len + skb_tailroom(skb), in ath10k_htt_rx_ring_free()
72 htt->rx_ring.fill_cnt = 0; in ath10k_htt_rx_ring_free()
73 hash_init(htt->rx_ring.skb_table); in ath10k_htt_rx_ring_free()
74 memset(htt->rx_ring.netbufs_ring, 0, in ath10k_htt_rx_ring_free()
75 htt->rx_ring.size * sizeof(htt->rx_ring.netbufs_ring[0])); in ath10k_htt_rx_ring_free()
80 return htt->rx_ring.size * sizeof(htt->rx_ring.paddrs_ring_32); in ath10k_htt_get_rx_ring_size_32()
85 return htt->rx_ring.size * sizeof(htt->rx_ring.paddrs_ring_64); in ath10k_htt_get_rx_ring_size_64()
91 htt->rx_ring.paddrs_ring_32 = vaddr; in ath10k_htt_config_paddrs_ring_32()
97 htt->rx_ring.paddrs_ring_64 = vaddr; in ath10k_htt_config_paddrs_ring_64()
103 htt->rx_ring.paddrs_ring_32[idx] = __cpu_to_le32(paddr); in ath10k_htt_set_paddrs_ring_32()
109 htt->rx_ring.paddrs_ring_64[idx] = __cpu_to_le64(paddr); in ath10k_htt_set_paddrs_ring_64()
114 htt->rx_ring.paddrs_ring_32[idx] = 0; in ath10k_htt_reset_paddrs_ring_32()
119 htt->rx_ring.paddrs_ring_64[idx] = 0; in ath10k_htt_reset_paddrs_ring_64()
124 return (void *)htt->rx_ring.paddrs_ring_32; in ath10k_htt_get_vaddr_ring_32()
129 return (void *)htt->rx_ring.paddrs_ring_64; in ath10k_htt_get_vaddr_ring_64()
134 struct ath10k_hw_params *hw = &htt->ar->hw_params; in __ath10k_htt_rx_ring_fill_n()
148 idx = __le32_to_cpu(*htt->rx_ring.alloc_idx.vaddr); in __ath10k_htt_rx_ring_fill_n()
150 if (idx < 0 || idx >= htt->rx_ring.size) { in __ath10k_htt_rx_ring_fill_n()
151 ath10k_err(htt->ar, "rx ring index is not valid, firmware malfunctioning?\n"); in __ath10k_htt_rx_ring_fill_n()
152 idx &= htt->rx_ring.size_mask; in __ath10k_htt_rx_ring_fill_n()
153 ret = -ENOMEM; in __ath10k_htt_rx_ring_fill_n()
160 ret = -ENOMEM; in __ath10k_htt_rx_ring_fill_n()
164 if (!IS_ALIGNED((unsigned long)skb->data, HTT_RX_DESC_ALIGN)) in __ath10k_htt_rx_ring_fill_n()
166 PTR_ALIGN(skb->data, HTT_RX_DESC_ALIGN) - in __ath10k_htt_rx_ring_fill_n()
167 skb->data); in __ath10k_htt_rx_ring_fill_n()
170 rx_desc = HTT_RX_BUF_TO_RX_DESC(hw, skb->data); in __ath10k_htt_rx_ring_fill_n()
171 ath10k_htt_rx_desc_get_attention(hw, rx_desc)->flags = __cpu_to_le32(0); in __ath10k_htt_rx_ring_fill_n()
173 paddr = dma_map_single(htt->ar->dev, skb->data, in __ath10k_htt_rx_ring_fill_n()
174 skb->len + skb_tailroom(skb), in __ath10k_htt_rx_ring_fill_n()
177 if (unlikely(dma_mapping_error(htt->ar->dev, paddr))) { in __ath10k_htt_rx_ring_fill_n()
179 ret = -ENOMEM; in __ath10k_htt_rx_ring_fill_n()
184 rxcb->paddr = paddr; in __ath10k_htt_rx_ring_fill_n()
185 htt->rx_ring.netbufs_ring[idx] = skb; in __ath10k_htt_rx_ring_fill_n()
187 htt->rx_ring.fill_cnt++; in __ath10k_htt_rx_ring_fill_n()
189 if (htt->rx_ring.in_ord_rx) { in __ath10k_htt_rx_ring_fill_n()
190 hash_add(htt->rx_ring.skb_table, in __ath10k_htt_rx_ring_fill_n()
191 &ATH10K_SKB_RXCB(skb)->hlist, in __ath10k_htt_rx_ring_fill_n()
195 num--; in __ath10k_htt_rx_ring_fill_n()
197 idx &= htt->rx_ring.size_mask; in __ath10k_htt_rx_ring_fill_n()
206 *htt->rx_ring.alloc_idx.vaddr = __cpu_to_le32(idx); in __ath10k_htt_rx_ring_fill_n()
212 lockdep_assert_held(&htt->rx_ring.lock); in ath10k_htt_rx_ring_fill_n()
236 spin_lock_bh(&htt->rx_ring.lock); in ath10k_htt_rx_msdu_buff_replenish()
237 num_deficit = htt->rx_ring.fill_level - htt->rx_ring.fill_cnt; in ath10k_htt_rx_msdu_buff_replenish()
239 num_deficit -= num_to_fill; in ath10k_htt_rx_msdu_buff_replenish()
241 if (ret == -ENOMEM) { in ath10k_htt_rx_msdu_buff_replenish()
243 * Failed to fill it to the desired level - in ath10k_htt_rx_msdu_buff_replenish()
246 * another A-MPDU rx, no special recovery is needed. in ath10k_htt_rx_msdu_buff_replenish()
248 mod_timer(&htt->rx_ring.refill_retry_timer, jiffies + in ath10k_htt_rx_msdu_buff_replenish()
251 mod_timer(&htt->rx_ring.refill_retry_timer, jiffies + in ath10k_htt_rx_msdu_buff_replenish()
254 spin_unlock_bh(&htt->rx_ring.lock); in ath10k_htt_rx_msdu_buff_replenish()
266 struct ath10k_htt *htt = &ar->htt; in ath10k_htt_rx_ring_refill()
269 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) in ath10k_htt_rx_ring_refill()
272 spin_lock_bh(&htt->rx_ring.lock); in ath10k_htt_rx_ring_refill()
273 ret = ath10k_htt_rx_ring_fill_n(htt, (htt->rx_ring.fill_level - in ath10k_htt_rx_ring_refill()
274 htt->rx_ring.fill_cnt)); in ath10k_htt_rx_ring_refill()
279 spin_unlock_bh(&htt->rx_ring.lock); in ath10k_htt_rx_ring_refill()
286 if (htt->ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) in ath10k_htt_rx_free()
289 del_timer_sync(&htt->rx_ring.refill_retry_timer); in ath10k_htt_rx_free()
291 skb_queue_purge(&htt->rx_msdus_q); in ath10k_htt_rx_free()
292 skb_queue_purge(&htt->rx_in_ord_compl_q); in ath10k_htt_rx_free()
293 skb_queue_purge(&htt->tx_fetch_ind_q); in ath10k_htt_rx_free()
295 spin_lock_bh(&htt->rx_ring.lock); in ath10k_htt_rx_free()
297 spin_unlock_bh(&htt->rx_ring.lock); in ath10k_htt_rx_free()
299 dma_free_coherent(htt->ar->dev, in ath10k_htt_rx_free()
302 htt->rx_ring.base_paddr); in ath10k_htt_rx_free()
306 dma_free_coherent(htt->ar->dev, in ath10k_htt_rx_free()
307 sizeof(*htt->rx_ring.alloc_idx.vaddr), in ath10k_htt_rx_free()
308 htt->rx_ring.alloc_idx.vaddr, in ath10k_htt_rx_free()
309 htt->rx_ring.alloc_idx.paddr); in ath10k_htt_rx_free()
310 htt->rx_ring.alloc_idx.vaddr = NULL; in ath10k_htt_rx_free()
312 kfree(htt->rx_ring.netbufs_ring); in ath10k_htt_rx_free()
313 htt->rx_ring.netbufs_ring = NULL; in ath10k_htt_rx_free()
318 struct ath10k *ar = htt->ar; in ath10k_htt_rx_netbuf_pop()
322 lockdep_assert_held(&htt->rx_ring.lock); in ath10k_htt_rx_netbuf_pop()
324 if (htt->rx_ring.fill_cnt == 0) { in ath10k_htt_rx_netbuf_pop()
329 idx = htt->rx_ring.sw_rd_idx.msdu_payld; in ath10k_htt_rx_netbuf_pop()
330 msdu = htt->rx_ring.netbufs_ring[idx]; in ath10k_htt_rx_netbuf_pop()
331 htt->rx_ring.netbufs_ring[idx] = NULL; in ath10k_htt_rx_netbuf_pop()
335 idx &= htt->rx_ring.size_mask; in ath10k_htt_rx_netbuf_pop()
336 htt->rx_ring.sw_rd_idx.msdu_payld = idx; in ath10k_htt_rx_netbuf_pop()
337 htt->rx_ring.fill_cnt--; in ath10k_htt_rx_netbuf_pop()
339 dma_unmap_single(htt->ar->dev, in ath10k_htt_rx_netbuf_pop()
340 ATH10K_SKB_RXCB(msdu)->paddr, in ath10k_htt_rx_netbuf_pop()
341 msdu->len + skb_tailroom(msdu), in ath10k_htt_rx_netbuf_pop()
344 msdu->data, msdu->len + skb_tailroom(msdu)); in ath10k_htt_rx_netbuf_pop()
349 /* return: < 0 fatal error, 0 - non chained msdu, 1 chained msdu */
353 struct ath10k *ar = htt->ar; in ath10k_htt_rx_amsdu_pop()
354 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_amsdu_pop()
363 lockdep_assert_held(&htt->rx_ring.lock); in ath10k_htt_rx_amsdu_pop()
371 return -ENOENT; in ath10k_htt_rx_amsdu_pop()
376 rx_desc = HTT_RX_BUF_TO_RX_DESC(hw, msdu->data); in ath10k_htt_rx_amsdu_pop()
386 skb_put(msdu, hw->rx_desc_ops->rx_desc_msdu_payload_offset); in ath10k_htt_rx_amsdu_pop()
387 skb_pull(msdu, hw->rx_desc_ops->rx_desc_msdu_payload_offset); in ath10k_htt_rx_amsdu_pop()
390 * Sanity check - confirm the HW is finished filling in the in ath10k_htt_rx_amsdu_pop()
397 if (!(__le32_to_cpu(rx_desc_attention->flags) in ath10k_htt_rx_amsdu_pop()
400 return -EIO; in ath10k_htt_rx_amsdu_pop()
403 msdu_len_invalid = !!(__le32_to_cpu(rx_desc_attention->flags) in ath10k_htt_rx_amsdu_pop()
406 msdu_len = MS(__le32_to_cpu(rx_desc_msdu_start_common->info0), in ath10k_htt_rx_amsdu_pop()
408 msdu_chained = rx_desc_frag_info_common->ring2_more_count; in ath10k_htt_rx_amsdu_pop()
415 msdu_len -= msdu->len; in ath10k_htt_rx_amsdu_pop()
418 while (msdu_chained--) { in ath10k_htt_rx_amsdu_pop()
422 return -ENOENT; in ath10k_htt_rx_amsdu_pop()
428 msdu_len -= msdu->len; in ath10k_htt_rx_amsdu_pop()
432 last_msdu = __le32_to_cpu(rx_desc_msdu_end_common->info0) & in ath10k_htt_rx_amsdu_pop()
441 hw->rx_desc_ops->rx_desc_size - sizeof(u32)); in ath10k_htt_rx_amsdu_pop()
448 msdu_chaining = -1; in ath10k_htt_rx_amsdu_pop()
453 * First, the elements popped here are still in use - it is not in ath10k_htt_rx_amsdu_pop()
469 struct ath10k *ar = htt->ar; in ath10k_htt_rx_pop_paddr()
473 lockdep_assert_held(&htt->rx_ring.lock); in ath10k_htt_rx_pop_paddr()
480 hash_del(&rxcb->hlist); in ath10k_htt_rx_pop_paddr()
481 htt->rx_ring.fill_cnt--; in ath10k_htt_rx_pop_paddr()
483 dma_unmap_single(htt->ar->dev, rxcb->paddr, in ath10k_htt_rx_pop_paddr()
484 msdu->len + skb_tailroom(msdu), in ath10k_htt_rx_pop_paddr()
487 msdu->data, msdu->len + skb_tailroom(msdu)); in ath10k_htt_rx_pop_paddr()
496 skb_shinfo(skb_head)->frag_list = frag_list; in ath10k_htt_append_frag_list()
497 skb_head->data_len = frag_len; in ath10k_htt_append_frag_list()
498 skb_head->len += skb_head->data_len; in ath10k_htt_append_frag_list()
505 struct ath10k *ar = htt->ar; in ath10k_htt_rx_handle_amsdu_mon_32()
506 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_handle_amsdu_mon_32()
513 int amsdu_len = __le16_to_cpu(ind_desc->msdu_len); in ath10k_htt_rx_handle_amsdu_mon_32()
515 rxd = HTT_RX_BUF_TO_RX_DESC(hw, msdu->data); in ath10k_htt_rx_handle_amsdu_mon_32()
516 trace_ath10k_htt_rx_desc(ar, rxd, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_handle_amsdu_mon_32()
518 skb_put(msdu, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_handle_amsdu_mon_32()
519 skb_pull(msdu, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_handle_amsdu_mon_32()
521 amsdu_len -= msdu->len; in ath10k_htt_rx_handle_amsdu_mon_32()
523 last_frag = ind_desc->reserved; in ath10k_htt_rx_handle_amsdu_mon_32()
527 __le16_to_cpu(ind_desc->msdu_len), in ath10k_htt_rx_handle_amsdu_mon_32()
534 paddr = __le32_to_cpu(ind_desc->msdu_paddr); in ath10k_htt_rx_handle_amsdu_mon_32()
537 ath10k_warn(ar, "failed to pop frag-1 paddr: 0x%x", paddr); in ath10k_htt_rx_handle_amsdu_mon_32()
538 return -ENOENT; in ath10k_htt_rx_handle_amsdu_mon_32()
544 amsdu_len -= frag_buf->len; in ath10k_htt_rx_handle_amsdu_mon_32()
546 last_frag = ind_desc->reserved; in ath10k_htt_rx_handle_amsdu_mon_32()
549 paddr = __le32_to_cpu(ind_desc->msdu_paddr); in ath10k_htt_rx_handle_amsdu_mon_32()
552 ath10k_warn(ar, "failed to pop frag-n paddr: 0x%x", in ath10k_htt_rx_handle_amsdu_mon_32()
554 prev_frag_buf->next = NULL; in ath10k_htt_rx_handle_amsdu_mon_32()
555 return -ENOENT; in ath10k_htt_rx_handle_amsdu_mon_32()
559 last_frag = ind_desc->reserved; in ath10k_htt_rx_handle_amsdu_mon_32()
560 amsdu_len -= frag_buf->len; in ath10k_htt_rx_handle_amsdu_mon_32()
562 prev_frag_buf->next = frag_buf; in ath10k_htt_rx_handle_amsdu_mon_32()
568 __le16_to_cpu(ind_desc->msdu_len), amsdu_len); in ath10k_htt_rx_handle_amsdu_mon_32()
573 prev_frag_buf->next = NULL; in ath10k_htt_rx_handle_amsdu_mon_32()
582 struct ath10k *ar = htt->ar; in ath10k_htt_rx_handle_amsdu_mon_64()
583 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_handle_amsdu_mon_64()
590 int amsdu_len = __le16_to_cpu(ind_desc->msdu_len); in ath10k_htt_rx_handle_amsdu_mon_64()
592 rxd = HTT_RX_BUF_TO_RX_DESC(hw, msdu->data); in ath10k_htt_rx_handle_amsdu_mon_64()
593 trace_ath10k_htt_rx_desc(ar, rxd, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_handle_amsdu_mon_64()
595 skb_put(msdu, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_handle_amsdu_mon_64()
596 skb_pull(msdu, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_handle_amsdu_mon_64()
598 amsdu_len -= msdu->len; in ath10k_htt_rx_handle_amsdu_mon_64()
600 last_frag = ind_desc->reserved; in ath10k_htt_rx_handle_amsdu_mon_64()
604 __le16_to_cpu(ind_desc->msdu_len), in ath10k_htt_rx_handle_amsdu_mon_64()
611 paddr = __le64_to_cpu(ind_desc->msdu_paddr); in ath10k_htt_rx_handle_amsdu_mon_64()
615 ath10k_warn(ar, "failed to pop frag-1 paddr: 0x%llx", paddr); in ath10k_htt_rx_handle_amsdu_mon_64()
617 ath10k_warn(ar, "failed to pop frag-1 paddr: 0x%jx", (uintmax_t)paddr); in ath10k_htt_rx_handle_amsdu_mon_64()
619 return -ENOENT; in ath10k_htt_rx_handle_amsdu_mon_64()
625 amsdu_len -= frag_buf->len; in ath10k_htt_rx_handle_amsdu_mon_64()
627 last_frag = ind_desc->reserved; in ath10k_htt_rx_handle_amsdu_mon_64()
630 paddr = __le64_to_cpu(ind_desc->msdu_paddr); in ath10k_htt_rx_handle_amsdu_mon_64()
634 ath10k_warn(ar, "failed to pop frag-n paddr: 0x%llx", in ath10k_htt_rx_handle_amsdu_mon_64()
637 ath10k_warn(ar, "failed to pop frag-n paddr: 0x%jx", in ath10k_htt_rx_handle_amsdu_mon_64()
640 prev_frag_buf->next = NULL; in ath10k_htt_rx_handle_amsdu_mon_64()
641 return -ENOENT; in ath10k_htt_rx_handle_amsdu_mon_64()
645 last_frag = ind_desc->reserved; in ath10k_htt_rx_handle_amsdu_mon_64()
646 amsdu_len -= frag_buf->len; in ath10k_htt_rx_handle_amsdu_mon_64()
648 prev_frag_buf->next = frag_buf; in ath10k_htt_rx_handle_amsdu_mon_64()
654 __le16_to_cpu(ind_desc->msdu_len), amsdu_len); in ath10k_htt_rx_handle_amsdu_mon_64()
659 prev_frag_buf->next = NULL; in ath10k_htt_rx_handle_amsdu_mon_64()
667 struct ath10k *ar = htt->ar; in ath10k_htt_rx_pop_paddr32_list()
668 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_pop_paddr32_list()
669 struct htt_rx_in_ord_msdu_desc *msdu_desc = ev->msdu_descs32; in ath10k_htt_rx_pop_paddr32_list()
677 lockdep_assert_held(&htt->rx_ring.lock); in ath10k_htt_rx_pop_paddr32_list()
679 msdu_count = __le16_to_cpu(ev->msdu_count); in ath10k_htt_rx_pop_paddr32_list()
680 is_offload = !!(ev->info & HTT_RX_IN_ORD_IND_INFO_OFFLOAD_MASK); in ath10k_htt_rx_pop_paddr32_list()
682 while (msdu_count--) { in ath10k_htt_rx_pop_paddr32_list()
683 paddr = __le32_to_cpu(msdu_desc->msdu_paddr); in ath10k_htt_rx_pop_paddr32_list()
688 return -ENOENT; in ath10k_htt_rx_pop_paddr32_list()
691 if (!is_offload && ar->monitor_arvif) { in ath10k_htt_rx_pop_paddr32_list()
706 rxd = HTT_RX_BUF_TO_RX_DESC(hw, msdu->data); in ath10k_htt_rx_pop_paddr32_list()
709 trace_ath10k_htt_rx_desc(ar, rxd, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_pop_paddr32_list()
711 skb_put(msdu, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_pop_paddr32_list()
712 skb_pull(msdu, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_pop_paddr32_list()
713 skb_put(msdu, __le16_to_cpu(msdu_desc->msdu_len)); in ath10k_htt_rx_pop_paddr32_list()
715 if (!(__le32_to_cpu(rxd_attention->flags) & in ath10k_htt_rx_pop_paddr32_list()
717 ath10k_warn(htt->ar, "tried to pop an incomplete frame, oops!\n"); in ath10k_htt_rx_pop_paddr32_list()
718 return -EIO; in ath10k_htt_rx_pop_paddr32_list()
732 struct ath10k *ar = htt->ar; in ath10k_htt_rx_pop_paddr64_list()
733 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_pop_paddr64_list()
734 struct htt_rx_in_ord_msdu_desc_ext *msdu_desc = ev->msdu_descs64; in ath10k_htt_rx_pop_paddr64_list()
742 lockdep_assert_held(&htt->rx_ring.lock); in ath10k_htt_rx_pop_paddr64_list()
744 msdu_count = __le16_to_cpu(ev->msdu_count); in ath10k_htt_rx_pop_paddr64_list()
745 is_offload = !!(ev->info & HTT_RX_IN_ORD_IND_INFO_OFFLOAD_MASK); in ath10k_htt_rx_pop_paddr64_list()
747 while (msdu_count--) { in ath10k_htt_rx_pop_paddr64_list()
748 paddr = __le64_to_cpu(msdu_desc->msdu_paddr); in ath10k_htt_rx_pop_paddr64_list()
752 return -ENOENT; in ath10k_htt_rx_pop_paddr64_list()
755 if (!is_offload && ar->monitor_arvif) { in ath10k_htt_rx_pop_paddr64_list()
770 rxd = HTT_RX_BUF_TO_RX_DESC(hw, msdu->data); in ath10k_htt_rx_pop_paddr64_list()
773 trace_ath10k_htt_rx_desc(ar, rxd, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_pop_paddr64_list()
775 skb_put(msdu, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_pop_paddr64_list()
776 skb_pull(msdu, hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_pop_paddr64_list()
777 skb_put(msdu, __le16_to_cpu(msdu_desc->msdu_len)); in ath10k_htt_rx_pop_paddr64_list()
779 if (!(__le32_to_cpu(rxd_attention->flags) & in ath10k_htt_rx_pop_paddr64_list()
781 ath10k_warn(htt->ar, "tried to pop an incomplete frame, oops!\n"); in ath10k_htt_rx_pop_paddr64_list()
782 return -EIO; in ath10k_htt_rx_pop_paddr64_list()
794 struct ath10k *ar = htt->ar; in ath10k_htt_rx_alloc()
798 struct timer_list *timer = &htt->rx_ring.refill_retry_timer; in ath10k_htt_rx_alloc()
800 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) in ath10k_htt_rx_alloc()
803 htt->rx_confused = false; in ath10k_htt_rx_alloc()
808 htt->rx_ring.size = HTT_RX_RING_SIZE; in ath10k_htt_rx_alloc()
809 htt->rx_ring.size_mask = htt->rx_ring.size - 1; in ath10k_htt_rx_alloc()
810 htt->rx_ring.fill_level = ar->hw_params.rx_ring_fill_level; in ath10k_htt_rx_alloc()
812 if (!is_power_of_2(htt->rx_ring.size)) { in ath10k_htt_rx_alloc()
814 return -EINVAL; in ath10k_htt_rx_alloc()
817 htt->rx_ring.netbufs_ring = in ath10k_htt_rx_alloc()
818 kcalloc(htt->rx_ring.size, sizeof(struct sk_buff *), in ath10k_htt_rx_alloc()
820 if (!htt->rx_ring.netbufs_ring) in ath10k_htt_rx_alloc()
825 vaddr_ring = dma_alloc_coherent(htt->ar->dev, size, &paddr, GFP_KERNEL); in ath10k_htt_rx_alloc()
830 htt->rx_ring.base_paddr = paddr; in ath10k_htt_rx_alloc()
832 vaddr = dma_alloc_coherent(htt->ar->dev, in ath10k_htt_rx_alloc()
833 sizeof(*htt->rx_ring.alloc_idx.vaddr), in ath10k_htt_rx_alloc()
838 htt->rx_ring.alloc_idx.vaddr = vaddr; in ath10k_htt_rx_alloc()
839 htt->rx_ring.alloc_idx.paddr = paddr; in ath10k_htt_rx_alloc()
840 htt->rx_ring.sw_rd_idx.msdu_payld = htt->rx_ring.size_mask; in ath10k_htt_rx_alloc()
841 *htt->rx_ring.alloc_idx.vaddr = 0; in ath10k_htt_rx_alloc()
846 spin_lock_init(&htt->rx_ring.lock); in ath10k_htt_rx_alloc()
848 spin_lock_init(&htt->tx_fetch_ind_q.lock); in ath10k_htt_rx_alloc()
851 htt->rx_ring.fill_cnt = 0; in ath10k_htt_rx_alloc()
852 htt->rx_ring.sw_rd_idx.msdu_payld = 0; in ath10k_htt_rx_alloc()
853 hash_init(htt->rx_ring.skb_table); in ath10k_htt_rx_alloc()
855 skb_queue_head_init(&htt->rx_msdus_q); in ath10k_htt_rx_alloc()
856 skb_queue_head_init(&htt->rx_in_ord_compl_q); in ath10k_htt_rx_alloc()
857 skb_queue_head_init(&htt->tx_fetch_ind_q); in ath10k_htt_rx_alloc()
858 atomic_set(&htt->num_mpdus_ready, 0); in ath10k_htt_rx_alloc()
861 htt->rx_ring.size, htt->rx_ring.fill_level); in ath10k_htt_rx_alloc()
865 dma_free_coherent(htt->ar->dev, in ath10k_htt_rx_alloc()
868 htt->rx_ring.base_paddr); in ath10k_htt_rx_alloc()
871 kfree(htt->rx_ring.netbufs_ring); in ath10k_htt_rx_alloc()
872 htt->rx_ring.netbufs_ring = NULL; in ath10k_htt_rx_alloc()
874 return -ENOMEM; in ath10k_htt_rx_alloc()
992 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_rates()
1000 u8 cck, rate, bw, sgi, mcs, nss; in ath10k_htt_rx_h_rates() local
1015 info1 = __le32_to_cpu(rxd_ppdu_start->info1); in ath10k_htt_rx_h_rates()
1016 info2 = __le32_to_cpu(rxd_ppdu_start->info2); in ath10k_htt_rx_h_rates()
1017 info3 = __le32_to_cpu(rxd_ppdu_start->info3); in ath10k_htt_rx_h_rates()
1024 * be undefined check if freq is non-zero. in ath10k_htt_rx_h_rates()
1026 if (!status->freq) in ath10k_htt_rx_h_rates()
1033 sband = &ar->mac.sbands[status->band]; in ath10k_htt_rx_h_rates()
1034 status->rate_idx = ath10k_mac_hw_rate_to_idx(sband, rate, cck); in ath10k_htt_rx_h_rates()
1038 /* HT-SIG - Table 20-11 in info2 and info3 */ in ath10k_htt_rx_h_rates()
1039 mcs = info2 & 0x1F; in ath10k_htt_rx_h_rates()
1040 nss = mcs >> 3; in ath10k_htt_rx_h_rates()
1044 status->rate_idx = mcs; in ath10k_htt_rx_h_rates()
1045 status->encoding = RX_ENC_HT; in ath10k_htt_rx_h_rates()
1047 status->enc_flags |= RX_ENC_FLAG_SHORT_GI; in ath10k_htt_rx_h_rates()
1049 status->bw = RATE_INFO_BW_40; in ath10k_htt_rx_h_rates()
1053 /* VHT-SIG-A1 in info2, VHT-SIG-A2 in info3 in ath10k_htt_rx_h_rates()
1062 mcs = (info3 >> 4) & 0x0F; in ath10k_htt_rx_h_rates()
1069 /* Hardware doesn't decode VHT-SIG-B into Rx descriptor in ath10k_htt_rx_h_rates()
1070 * so it's impossible to decode MCS. Also since in ath10k_htt_rx_h_rates()
1074 * from VHT-SIG-A1. in ath10k_htt_rx_h_rates()
1077 * on best-effort basis. in ath10k_htt_rx_h_rates()
1079 mcs = 0; in ath10k_htt_rx_h_rates()
1083 if (mcs > 0x09) { in ath10k_htt_rx_h_rates()
1084 ath10k_warn(ar, "invalid MCS received %u\n", mcs); in ath10k_htt_rx_h_rates()
1086 __le32_to_cpu(rxd_attention->flags), in ath10k_htt_rx_h_rates()
1087 __le32_to_cpu(rxd_mpdu_start->info0), in ath10k_htt_rx_h_rates()
1088 __le32_to_cpu(rxd_mpdu_start->info1), in ath10k_htt_rx_h_rates()
1089 __le32_to_cpu(rxd_msdu_start_common->info0), in ath10k_htt_rx_h_rates()
1090 __le32_to_cpu(rxd_msdu_start_common->info1), in ath10k_htt_rx_h_rates()
1091 rxd_ppdu_start->info0, in ath10k_htt_rx_h_rates()
1092 __le32_to_cpu(rxd_ppdu_start->info1), in ath10k_htt_rx_h_rates()
1093 __le32_to_cpu(rxd_ppdu_start->info2), in ath10k_htt_rx_h_rates()
1094 __le32_to_cpu(rxd_ppdu_start->info3), in ath10k_htt_rx_h_rates()
1095 __le32_to_cpu(rxd_ppdu_start->info4)); in ath10k_htt_rx_h_rates()
1098 __le32_to_cpu(rxd_msdu_end_common->info0), in ath10k_htt_rx_h_rates()
1099 __le32_to_cpu(rxd_mpdu_end->info0)); in ath10k_htt_rx_h_rates()
1106 status->rate_idx = mcs; in ath10k_htt_rx_h_rates()
1107 status->nss = nss; in ath10k_htt_rx_h_rates()
1110 status->enc_flags |= RX_ENC_FLAG_SHORT_GI; in ath10k_htt_rx_h_rates()
1112 status->bw = ath10k_bw_to_mac80211_bw(bw); in ath10k_htt_rx_h_rates()
1113 status->encoding = RX_ENC_VHT; in ath10k_htt_rx_h_rates()
1123 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_peer_channel()
1132 lockdep_assert_held(&ar->data_lock); in ath10k_htt_rx_h_peer_channel()
1141 if (rxd_attention->flags & in ath10k_htt_rx_h_peer_channel()
1145 if (!(rxd_msdu_end_common->info0 & in ath10k_htt_rx_h_peer_channel()
1149 peer_id = MS(__le32_to_cpu(rxd_mpdu_start->info0), in ath10k_htt_rx_h_peer_channel()
1156 arvif = ath10k_get_arvif(ar, peer->vdev_id); in ath10k_htt_rx_h_peer_channel()
1160 if (ath10k_mac_vif_chan(arvif->vif, &def)) in ath10k_htt_rx_h_peer_channel()
1172 lockdep_assert_held(&ar->data_lock); in ath10k_htt_rx_h_vdev_channel()
1174 list_for_each_entry(arvif, &ar->arvifs, list) { in ath10k_htt_rx_h_vdev_channel()
1175 if (arvif->vdev_id == vdev_id && in ath10k_htt_rx_h_vdev_channel()
1176 ath10k_mac_vif_chan(arvif->vif, &def) == 0) in ath10k_htt_rx_h_vdev_channel()
1190 *def = conf->def; in ath10k_htt_rx_h_any_chan_iter()
1198 ieee80211_iter_chan_contexts_atomic(ar->hw, in ath10k_htt_rx_h_any_channel()
1212 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_h_channel()
1213 ch = ar->scan_channel; in ath10k_htt_rx_h_channel()
1215 ch = ar->rx_channel; in ath10k_htt_rx_h_channel()
1223 ch = ar->tgt_oper_chan; in ath10k_htt_rx_h_channel()
1224 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_h_channel()
1229 status->band = ch->band; in ath10k_htt_rx_h_channel()
1230 status->freq = ch->center_freq; in ath10k_htt_rx_h_channel()
1239 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_signal()
1244 status->chains &= ~BIT(i); in ath10k_htt_rx_h_signal()
1246 if (rxd_ppdu_start->rssi_chains[i].pri20_mhz != 0x80) { in ath10k_htt_rx_h_signal()
1247 status->chain_signal[i] = ATH10K_DEFAULT_NOISE_FLOOR + in ath10k_htt_rx_h_signal()
1248 rxd_ppdu_start->rssi_chains[i].pri20_mhz; in ath10k_htt_rx_h_signal()
1250 status->chains |= BIT(i); in ath10k_htt_rx_h_signal()
1255 status->signal = ATH10K_DEFAULT_NOISE_FLOOR + in ath10k_htt_rx_h_signal()
1256 rxd_ppdu_start->rssi_comb; in ath10k_htt_rx_h_signal()
1257 status->flag &= ~RX_FLAG_NO_SIGNAL_VAL; in ath10k_htt_rx_h_signal()
1264 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_mactime()
1275 status->mactime = __le32_to_cpu(rxd_ppdu_end_common->tsf_timestamp); in ath10k_htt_rx_h_mactime()
1276 status->flag |= RX_FLAG_MACTIME_END; in ath10k_htt_rx_h_mactime()
1285 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_ppdu()
1297 (void *)first->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_ppdu()
1299 (u8 *)first->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_ppdu()
1304 is_first_ppdu = !!(rxd_attention->flags & in ath10k_htt_rx_h_ppdu()
1306 is_last_ppdu = !!(rxd_attention->flags & in ath10k_htt_rx_h_ppdu()
1310 /* New PPDU starts so clear out the old per-PPDU status. */ in ath10k_htt_rx_h_ppdu()
1311 status->freq = 0; in ath10k_htt_rx_h_ppdu()
1312 status->rate_idx = 0; in ath10k_htt_rx_h_ppdu()
1313 status->nss = 0; in ath10k_htt_rx_h_ppdu()
1314 status->encoding = RX_ENC_LEGACY; in ath10k_htt_rx_h_ppdu()
1315 status->bw = RATE_INFO_BW_20; in ath10k_htt_rx_h_ppdu()
1317 status->flag &= ~RX_FLAG_MACTIME_END; in ath10k_htt_rx_h_ppdu()
1318 status->flag |= RX_FLAG_NO_SIGNAL_VAL; in ath10k_htt_rx_h_ppdu()
1320 status->flag &= ~(RX_FLAG_AMPDU_IS_LAST); in ath10k_htt_rx_h_ppdu()
1321 status->flag |= RX_FLAG_AMPDU_DETAILS | RX_FLAG_AMPDU_LAST_KNOWN; in ath10k_htt_rx_h_ppdu()
1322 status->ampdu_reference = ar->ampdu_reference; in ath10k_htt_rx_h_ppdu()
1333 status->flag |= RX_FLAG_AMPDU_IS_LAST; in ath10k_htt_rx_h_ppdu()
1334 ar->ampdu_reference++; in ath10k_htt_rx_h_ppdu()
1354 if (!ieee80211_is_data_qos(hdr->frame_control)) in ath10k_get_tid()
1376 skb_queue_tail(&ar->htt.rx_msdus_q, skb); in ath10k_htt_rx_h_queue_msdu()
1382 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath10k_process_rx()
1387 if (!(ar->filter_flags & FIF_FCSFAIL) && in ath10k_process_rx()
1388 status->flag & RX_FLAG_FAILED_FCS_CRC) { in ath10k_process_rx()
1389 ar->stats.rx_crc_err_drop++; in ath10k_process_rx()
1395 …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 ath10k_process_rx()
1397 skb->len, in ath10k_process_rx()
1402 IEEE80211_SEQ_TO_SN(__le16_to_cpu(hdr->seq_ctrl)), in ath10k_process_rx()
1403 (status->encoding == RX_ENC_LEGACY) ? "legacy" : "", in ath10k_process_rx()
1404 (status->encoding == RX_ENC_HT) ? "ht" : "", in ath10k_process_rx()
1405 (status->encoding == RX_ENC_VHT) ? "vht" : "", in ath10k_process_rx()
1406 (status->bw == RATE_INFO_BW_40) ? "40" : "", in ath10k_process_rx()
1407 (status->bw == RATE_INFO_BW_80) ? "80" : "", in ath10k_process_rx()
1408 (status->bw == RATE_INFO_BW_160) ? "160" : "", in ath10k_process_rx()
1409 status->enc_flags & RX_ENC_FLAG_SHORT_GI ? "sgi " : "", in ath10k_process_rx()
1410 status->rate_idx, in ath10k_process_rx()
1411 status->nss, in ath10k_process_rx()
1412 status->freq, in ath10k_process_rx()
1413 status->band, status->flag, in ath10k_process_rx()
1414 !!(status->flag & RX_FLAG_FAILED_FCS_CRC), in ath10k_process_rx()
1415 !!(status->flag & RX_FLAG_MMIC_ERROR), in ath10k_process_rx()
1416 !!(status->flag & RX_FLAG_AMSDU_MORE)); in ath10k_process_rx()
1418 skb->data, skb->len); in ath10k_process_rx()
1419 trace_ath10k_rx_hdr(ar, skb->data, skb->len); in ath10k_process_rx()
1420 trace_ath10k_rx_payload(ar, skb->data, skb->len); in ath10k_process_rx()
1422 ieee80211_rx_napi(ar->hw, NULL, skb, &ar->napi); in ath10k_process_rx()
1428 int len = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_nwifi_hdrlen()
1431 ar->running_fw->fw_file.fw_features)) in ath10k_htt_rx_nwifi_hdrlen()
1445 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_undecap_raw()
1453 int bytes_aligned = ar->hw_params.decap_align_bytes; in ath10k_htt_rx_h_undecap_raw()
1458 (void *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_undecap_raw()
1460 (u8 *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_undecap_raw()
1464 is_first = !!(rxd_msdu_end_common->info0 & in ath10k_htt_rx_h_undecap_raw()
1466 is_last = !!(rxd_msdu_end_common->info0 & in ath10k_htt_rx_h_undecap_raw()
1471 * [crypto param] <-- can be trimmed if !fcs_err && in ath10k_htt_rx_h_undecap_raw()
1473 * [amsdu header] <-- only if A-MSDU in ath10k_htt_rx_h_undecap_raw()
1476 * [FCS] <-- at end, needs to be trimmed in ath10k_htt_rx_h_undecap_raw()
1479 /* Some hardwares(QCA99x0 variants) limit number of msdus in a-msdu when in ath10k_htt_rx_h_undecap_raw()
1480 * deaggregate, so that unwanted MSDU-deaggregation is avoided for in ath10k_htt_rx_h_undecap_raw()
1497 skb_trim(msdu, msdu->len - FCS_LEN); in ath10k_htt_rx_h_undecap_raw()
1506 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_h_undecap_raw()
1509 if (ieee80211_is_data_qos(hdr->frame_control)) { in ath10k_htt_rx_h_undecap_raw()
1527 * to deliver them as-is without stripping the crypto param. This is in ath10k_htt_rx_h_undecap_raw()
1540 hdr = (void *)msdu->data; in ath10k_htt_rx_h_undecap_raw()
1543 if (status->flag & RX_FLAG_IV_STRIPPED) { in ath10k_htt_rx_h_undecap_raw()
1544 skb_trim(msdu, msdu->len - in ath10k_htt_rx_h_undecap_raw()
1547 skb_trim(msdu, msdu->len - in ath10k_htt_rx_h_undecap_raw()
1551 if (status->flag & RX_FLAG_MIC_STRIPPED) in ath10k_htt_rx_h_undecap_raw()
1552 skb_trim(msdu, msdu->len - in ath10k_htt_rx_h_undecap_raw()
1556 if (status->flag & RX_FLAG_ICV_STRIPPED) in ath10k_htt_rx_h_undecap_raw()
1557 skb_trim(msdu, msdu->len - in ath10k_htt_rx_h_undecap_raw()
1562 if ((status->flag & RX_FLAG_MMIC_STRIPPED) && in ath10k_htt_rx_h_undecap_raw()
1563 !ieee80211_has_morefrags(hdr->frame_control) && in ath10k_htt_rx_h_undecap_raw()
1565 skb_trim(msdu, msdu->len - MICHAEL_MIC_LEN); in ath10k_htt_rx_h_undecap_raw()
1568 if (status->flag & RX_FLAG_IV_STRIPPED) { in ath10k_htt_rx_h_undecap_raw()
1569 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_h_undecap_raw()
1573 memmove((void *)msdu->data + crypto_len, in ath10k_htt_rx_h_undecap_raw()
1575 memmove((u8 *)msdu->data + crypto_len, in ath10k_htt_rx_h_undecap_raw()
1577 (void *)msdu->data, hdr_len); in ath10k_htt_rx_h_undecap_raw()
1588 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_undecap_nwifi()
1600 int bytes_aligned = ar->hw_params.decap_align_bytes; in ath10k_htt_rx_h_undecap_nwifi()
1603 * [nwifi 802.11 header] <-- replaced with 802.11 hdr in ath10k_htt_rx_h_undecap_nwifi()
1609 * Note2: There's no A-MSDU subframe header. Even if it's part in ath10k_htt_rx_h_undecap_nwifi()
1610 * of an A-MSDU. in ath10k_htt_rx_h_undecap_nwifi()
1615 rxd = HTT_RX_BUF_TO_RX_DESC(hw, (void *)msdu->data - in ath10k_htt_rx_h_undecap_nwifi()
1617 rxd = HTT_RX_BUF_TO_RX_DESC(hw, (u8 *)msdu->data - in ath10k_htt_rx_h_undecap_nwifi()
1619 hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_undecap_nwifi()
1621 l3_pad_bytes = ath10k_htt_rx_desc_get_l3_pad_bytes(&ar->hw_params, rxd); in ath10k_htt_rx_h_undecap_nwifi()
1625 hdr = (struct ieee80211_hdr *)(msdu->data + l3_pad_bytes); in ath10k_htt_rx_h_undecap_nwifi()
1631 hdr2 = (struct ieee80211_hdr *)(msdu->data + l3_pad_bytes); in ath10k_htt_rx_h_undecap_nwifi()
1645 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_h_undecap_nwifi()
1647 if (!(status->flag & RX_FLAG_IV_STRIPPED)) { in ath10k_htt_rx_h_undecap_nwifi()
1664 hdr = (struct ieee80211_hdr *)msdu->data; in ath10k_htt_rx_h_undecap_nwifi()
1668 hdr2 = (struct ieee80211_hdr *)msdu->data; in ath10k_htt_rx_h_undecap_nwifi()
1679 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_find_rfc1042()
1690 int bytes_aligned = ar->hw_params.decap_align_bytes; in ath10k_htt_rx_h_find_rfc1042()
1694 (void *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_find_rfc1042()
1696 (u8 *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_find_rfc1042()
1703 is_first = !!(rxd_msdu_end_common->info0 & in ath10k_htt_rx_h_find_rfc1042()
1705 is_last = !!(rxd_msdu_end_common->info0 & in ath10k_htt_rx_h_find_rfc1042()
1716 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_h_find_rfc1042()
1735 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_undecap_eth()
1749 int bytes_aligned = ar->hw_params.decap_align_bytes; in ath10k_htt_rx_h_undecap_eth()
1752 * [eth header] <-- replaced with 802.11 hdr & rfc1042/llc in ath10k_htt_rx_h_undecap_eth()
1762 (void *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_undecap_eth()
1764 (u8 *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_undecap_eth()
1767 l3_pad_bytes = ath10k_htt_rx_desc_get_l3_pad_bytes(&ar->hw_params, rxd); in ath10k_htt_rx_h_undecap_eth()
1772 eth = (struct ethhdr *)msdu->data; in ath10k_htt_rx_h_undecap_eth()
1773 ether_addr_copy(da, eth->h_dest); in ath10k_htt_rx_h_undecap_eth()
1774 ether_addr_copy(sa, eth->h_source); in ath10k_htt_rx_h_undecap_eth()
1787 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_h_undecap_eth()
1789 if (!(status->flag & RX_FLAG_IV_STRIPPED)) { in ath10k_htt_rx_h_undecap_eth()
1806 hdr = (struct ieee80211_hdr *)msdu->data; in ath10k_htt_rx_h_undecap_eth()
1810 hdr2 = (struct ieee80211_hdr *)msdu->data; in ath10k_htt_rx_h_undecap_eth()
1822 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_undecap_snap()
1831 int bytes_aligned = ar->hw_params.decap_align_bytes; in ath10k_htt_rx_h_undecap_snap()
1834 * [amsdu header] <-- replaced with 802.11 hdr in ath10k_htt_rx_h_undecap_snap()
1841 (void *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_undecap_snap()
1843 (u8 *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_undecap_snap()
1846 l3_pad_bytes = ath10k_htt_rx_desc_get_l3_pad_bytes(&ar->hw_params, rxd); in ath10k_htt_rx_h_undecap_snap()
1856 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_h_undecap_snap()
1858 if (!(status->flag & RX_FLAG_IV_STRIPPED)) { in ath10k_htt_rx_h_undecap_snap()
1879 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_undecap()
1885 * [802.11 header] <-- padded to 4 bytes long in ath10k_htt_rx_h_undecap()
1886 * [crypto param] <-- padded to 4 bytes long in ath10k_htt_rx_h_undecap()
1887 * [amsdu header] <-- only if A-MSDU in ath10k_htt_rx_h_undecap()
1891 * [amsdu header] <-- only if A-MSDU in ath10k_htt_rx_h_undecap()
1897 (void *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_undecap()
1899 (u8 *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_undecap()
1903 decap = MS(__le32_to_cpu(rxd_msdu_start_common->info1), in ath10k_htt_rx_h_undecap()
1937 (void *)skb->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_get_csum_state()
1939 (u8 *)skb->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_get_csum_state()
1944 flags = __le32_to_cpu(rxd_attention->flags); in ath10k_htt_rx_get_csum_state()
1945 info = __le32_to_cpu(rxd_msdu_start_common->info1); in ath10k_htt_rx_get_csum_state()
1969 msdu->ip_summed = ath10k_htt_rx_get_csum_state(hw, msdu); in ath10k_htt_rx_h_csum_offload()
1979 hdr = (struct ieee80211_hdr *)skb->data; in ath10k_htt_rx_h_get_pn()
1980 ehdr = skb->data + ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_h_get_pn()
1998 hdr = (struct ieee80211_hdr *)skb->data; in ath10k_htt_rx_h_frag_multicast_check()
1999 return !is_multicast_ether_addr(hdr->addr1); in ath10k_htt_rx_h_frag_multicast_check()
2019 hdr = (struct ieee80211_hdr *)skb->data; in ath10k_htt_rx_h_frag_pn_check()
2020 if (ieee80211_is_data_qos(hdr->frame_control)) in ath10k_htt_rx_h_frag_pn_check()
2025 last_pn = &peer->frag_tids_last_pn[tid]; in ath10k_htt_rx_h_frag_pn_check()
2027 frag_number = le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG; in ath10k_htt_rx_h_frag_pn_check()
2028 seq = IEEE80211_SEQ_TO_SN(__le16_to_cpu(hdr->seq_ctrl)); in ath10k_htt_rx_h_frag_pn_check()
2031 last_pn->pn48 = new_pn.pn48; in ath10k_htt_rx_h_frag_pn_check()
2032 peer->frag_tids_seq[tid] = seq; in ath10k_htt_rx_h_frag_pn_check()
2034 if (seq != peer->frag_tids_seq[tid]) in ath10k_htt_rx_h_frag_pn_check()
2037 if (new_pn.pn48 != last_pn->pn48 + 1) in ath10k_htt_rx_h_frag_pn_check()
2040 last_pn->pn48 = new_pn.pn48; in ath10k_htt_rx_h_frag_pn_check()
2058 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_mpdu()
2082 (void *)first->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_mpdu()
2084 (u8 *)first->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_mpdu()
2090 is_mgmt = !!(rxd_attention->flags & in ath10k_htt_rx_h_mpdu()
2093 enctype = MS(__le32_to_cpu(rxd_mpdu_start->info0), in ath10k_htt_rx_h_mpdu()
2096 /* First MSDU's Rx descriptor in an A-MSDU contains full 802.11 in ath10k_htt_rx_h_mpdu()
2105 /* Each A-MSDU subframe will use the original header as the base and be in ath10k_htt_rx_h_mpdu()
2106 * reported as a separate MSDU so strip the A-MSDU bit from QoS Ctl. in ath10k_htt_rx_h_mpdu()
2110 if (ieee80211_is_data_qos(hdr->frame_control)) { in ath10k_htt_rx_h_mpdu()
2119 (void *)last->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_mpdu()
2121 (u8 *)last->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_mpdu()
2125 attention = __le32_to_cpu(rxd_attention->flags); in ath10k_htt_rx_h_mpdu()
2141 /* Clear per-MPDU flags while leaving per-PPDU flags intact. */ in ath10k_htt_rx_h_mpdu()
2142 status->flag &= ~(RX_FLAG_FAILED_FCS_CRC | in ath10k_htt_rx_h_mpdu()
2150 status->flag |= RX_FLAG_FAILED_FCS_CRC; in ath10k_htt_rx_h_mpdu()
2153 status->flag |= RX_FLAG_MMIC_ERROR; in ath10k_htt_rx_h_mpdu()
2172 status->flag |= RX_FLAG_ONLY_MONITOR; in ath10k_htt_rx_h_mpdu()
2175 status->flag |= RX_FLAG_DECRYPTED; in ath10k_htt_rx_h_mpdu()
2178 status->flag |= RX_FLAG_MMIC_STRIPPED; in ath10k_htt_rx_h_mpdu()
2181 status->flag |= RX_FLAG_MIC_STRIPPED | in ath10k_htt_rx_h_mpdu()
2184 status->flag |= RX_FLAG_IV_STRIPPED; in ath10k_htt_rx_h_mpdu()
2202 temp = msdu->prev; in ath10k_htt_rx_h_mpdu()
2211 ath10k_htt_rx_h_csum_offload(&ar->hw_params, msdu); in ath10k_htt_rx_h_mpdu()
2215 status->flag &= ~RX_FLAG_MMIC_STRIPPED; in ath10k_htt_rx_h_mpdu()
2232 hdr = (void *)msdu->data; in ath10k_htt_rx_h_mpdu()
2233 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_FCTL_PROTECTED); in ath10k_htt_rx_h_mpdu()
2237 status->flag &= ~RX_FLAG_IV_STRIPPED & in ath10k_htt_rx_h_mpdu()
2252 /* Setup per-MSDU flags */ in ath10k_htt_rx_h_enqueue()
2254 status->flag &= ~RX_FLAG_AMSDU_MORE; in ath10k_htt_rx_h_enqueue()
2256 status->flag |= RX_FLAG_AMSDU_MORE; in ath10k_htt_rx_h_enqueue()
2260 status->flag &= ~RX_FLAG_ALLOW_SAME_PN; in ath10k_htt_rx_h_enqueue()
2262 status->flag |= RX_FLAG_ALLOW_SAME_PN; in ath10k_htt_rx_h_enqueue()
2288 total_len += skb->len; in ath10k_unchain_msdu()
2290 space = total_len - skb_tailroom(first); in ath10k_unchain_msdu()
2293 /* TODO: bump some rx-oom error stat */ in ath10k_unchain_msdu()
2298 return -1; in ath10k_unchain_msdu()
2305 skb_copy_from_linear_data(skb, skb_put(first, skb->len), in ath10k_unchain_msdu()
2306 skb->len); in ath10k_unchain_msdu()
2312 *unchain_cnt += amsdu_len - 1; in ath10k_unchain_msdu()
2323 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_h_unchain()
2332 (void *)first->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_unchain()
2334 (u8 *)first->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_h_unchain()
2339 decap = MS(__le32_to_cpu(rxd_msdu_start_common->info1), in ath10k_htt_rx_h_unchain()
2345 * try re-constructing such frames - it'll be pretty much garbage. in ath10k_htt_rx_h_unchain()
2348 skb_queue_len(amsdu) != 1 + rxd_frag_info->ring2_more_count) { in ath10k_htt_rx_h_unchain()
2363 struct ath10k_hw_params *hw = &ar->hw_params; in ath10k_htt_rx_validate_amsdu()
2370 int bytes_aligned = ar->hw_params.decap_align_bytes; in ath10k_htt_rx_validate_amsdu()
2376 (void *)first->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_validate_amsdu()
2378 (u8 *)first->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_validate_amsdu()
2385 is_first = !!(rxd_msdu_end_common->info0 & in ath10k_htt_rx_validate_amsdu()
2387 is_last = !!(rxd_msdu_end_common->info0 & in ath10k_htt_rx_validate_amsdu()
2390 /* Return in case of non-aggregated msdu */ in ath10k_htt_rx_validate_amsdu()
2398 enctype = MS(__le32_to_cpu(rxd_mpdu_start->info0), in ath10k_htt_rx_validate_amsdu()
2401 hdr_len = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_validate_amsdu()
2410 * gets flipped in non-SPP AMSDU's, in such cases the first in ath10k_htt_rx_validate_amsdu()
2424 if (!rx_status->freq) { in ath10k_htt_rx_amsdu_allowed()
2429 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) { in ath10k_htt_rx_amsdu_allowed()
2461 struct ath10k *ar = htt->ar; in ath10k_htt_rx_handle_amsdu()
2462 struct ieee80211_rx_status *rx_status = &htt->rx_status; in ath10k_htt_rx_handle_amsdu()
2474 spin_lock_bh(&htt->rx_ring.lock); in ath10k_htt_rx_handle_amsdu()
2475 if (htt->rx_confused) { in ath10k_htt_rx_handle_amsdu()
2476 spin_unlock_bh(&htt->rx_ring.lock); in ath10k_htt_rx_handle_amsdu()
2477 return -EIO; in ath10k_htt_rx_handle_amsdu()
2480 spin_unlock_bh(&htt->rx_ring.lock); in ath10k_htt_rx_handle_amsdu()
2488 htt->rx_confused = true; in ath10k_htt_rx_handle_amsdu()
2519 pn->pn48 = __le32_to_cpu(rx_desc->pn_31_0) + in ath10k_htt_rx_mpdu_desc_pn_hl()
2520 ((u64)(__le32_to_cpu(rx_desc->u0.pn_63_32) & 0xFFFF) << 32); in ath10k_htt_rx_mpdu_desc_pn_hl()
2523 pn->pn24 = __le32_to_cpu(rx_desc->pn_31_0); in ath10k_htt_rx_mpdu_desc_pn_hl()
2531 return ((new_pn->pn48 & 0xffffffffffffULL) <= in ath10k_htt_rx_pn_cmp48()
2532 (old_pn->pn48 & 0xffffffffffffULL)); in ath10k_htt_rx_pn_cmp48()
2548 lockdep_assert_held(&ar->data_lock); in ath10k_htt_rx_pn_check_replay_hl()
2553 if (!(rx->fw_desc.flags & FW_RX_DESC_FLAGS_FIRST_MSDU)) in ath10k_htt_rx_pn_check_replay_hl()
2556 num_mpdu_ranges = MS(__le32_to_cpu(rx->hdr.info1), in ath10k_htt_rx_pn_check_replay_hl()
2559 rx_desc = (struct htt_hl_rx_desc *)&rx->mpdu_ranges[num_mpdu_ranges]; in ath10k_htt_rx_pn_check_replay_hl()
2560 rx_desc_info = __le32_to_cpu(rx_desc->info); in ath10k_htt_rx_pn_check_replay_hl()
2565 tid = MS(rx->hdr.info0, HTT_RX_INDICATION_INFO0_EXT_TID); in ath10k_htt_rx_pn_check_replay_hl()
2566 last_pn_valid = peer->tids_last_pn_valid[tid]; in ath10k_htt_rx_pn_check_replay_hl()
2567 last_pn = &peer->tids_last_pn[tid]; in ath10k_htt_rx_pn_check_replay_hl()
2574 sec_type = peer->rx_pn[sec_index].sec_type; in ath10k_htt_rx_pn_check_replay_hl()
2575 ath10k_htt_rx_mpdu_desc_pn_hl(rx_desc, &new_pn, peer->rx_pn[sec_index].pn_len); in ath10k_htt_rx_pn_check_replay_hl()
2585 peer->tids_last_pn_valid[tid] = true; in ath10k_htt_rx_pn_check_replay_hl()
2588 last_pn->pn48 = new_pn.pn48; in ath10k_htt_rx_pn_check_replay_hl()
2599 struct ath10k *ar = htt->ar; in ath10k_htt_rx_proc_rx_ind_hl()
2617 peer_id = __le16_to_cpu(rx->hdr.peer_id); in ath10k_htt_rx_proc_rx_ind_hl()
2618 tid = MS(rx->hdr.info0, HTT_RX_INDICATION_INFO0_EXT_TID); in ath10k_htt_rx_proc_rx_ind_hl()
2620 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_ind_hl()
2622 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_ind_hl()
2629 num_mpdu_ranges = MS(__le32_to_cpu(rx->hdr.info1), in ath10k_htt_rx_proc_rx_ind_hl()
2632 fw_desc = &rx->fw_desc; in ath10k_htt_rx_proc_rx_ind_hl()
2633 rx_desc_len = fw_desc->len; in ath10k_htt_rx_proc_rx_ind_hl()
2635 if (fw_desc->u.bits.discard) { in ath10k_htt_rx_proc_rx_ind_hl()
2649 if (mpdu_ranges->mpdu_range_status != in ath10k_htt_rx_proc_rx_ind_hl()
2651 mpdu_ranges->mpdu_range_status != in ath10k_htt_rx_proc_rx_ind_hl()
2654 mpdu_ranges->mpdu_range_status); in ath10k_htt_rx_proc_rx_ind_hl()
2658 rx_desc = (struct htt_hl_rx_desc *)&rx->mpdu_ranges[num_mpdu_ranges]; in ath10k_htt_rx_proc_rx_ind_hl()
2659 rx_desc_info = __le32_to_cpu(rx_desc->info); in ath10k_htt_rx_proc_rx_ind_hl()
2666 sec_type = peer->rx_pn[sec_index].sec_type; in ath10k_htt_rx_proc_rx_ind_hl()
2667 first_msdu = rx->fw_desc.flags & FW_RX_DESC_FLAGS_FIRST_MSDU; in ath10k_htt_rx_proc_rx_ind_hl()
2669 ath10k_htt_rx_mpdu_desc_pn_hl(rx_desc, &new_pn, peer->rx_pn[sec_index].pn_len); in ath10k_htt_rx_proc_rx_ind_hl()
2672 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_ind_hl()
2674 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_ind_hl()
2683 tot_hdr_len = sizeof(struct htt_resp_hdr) + sizeof(rx->hdr) + in ath10k_htt_rx_proc_rx_ind_hl()
2684 sizeof(rx->ppdu) + sizeof(rx->prefix) + in ath10k_htt_rx_proc_rx_ind_hl()
2685 sizeof(rx->fw_desc) + in ath10k_htt_rx_proc_rx_ind_hl()
2690 hdr = (struct ieee80211_hdr *)skb->data; in ath10k_htt_rx_proc_rx_ind_hl()
2691 qos = ieee80211_is_data_qos(hdr->frame_control); in ath10k_htt_rx_proc_rx_ind_hl()
2696 if (rx->ppdu.combined_rssi == 0) { in ath10k_htt_rx_proc_rx_ind_hl()
2698 rx_status->signal = 0; in ath10k_htt_rx_proc_rx_ind_hl()
2699 rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL; in ath10k_htt_rx_proc_rx_ind_hl()
2701 rx_status->signal = ATH10K_DEFAULT_NOISE_FLOOR + in ath10k_htt_rx_proc_rx_ind_hl()
2702 rx->ppdu.combined_rssi; in ath10k_htt_rx_proc_rx_ind_hl()
2703 rx_status->flag &= ~RX_FLAG_NO_SIGNAL_VAL; in ath10k_htt_rx_proc_rx_ind_hl()
2706 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_ind_hl()
2707 ch = ar->scan_channel; in ath10k_htt_rx_proc_rx_ind_hl()
2709 ch = ar->rx_channel; in ath10k_htt_rx_proc_rx_ind_hl()
2713 ch = ar->tgt_oper_chan; in ath10k_htt_rx_proc_rx_ind_hl()
2714 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_ind_hl()
2717 rx_status->band = ch->band; in ath10k_htt_rx_proc_rx_ind_hl()
2718 rx_status->freq = ch->center_freq; in ath10k_htt_rx_proc_rx_ind_hl()
2720 if (rx->fw_desc.flags & FW_RX_DESC_FLAGS_LAST_MSDU) in ath10k_htt_rx_proc_rx_ind_hl()
2721 rx_status->flag &= ~RX_FLAG_AMSDU_MORE; in ath10k_htt_rx_proc_rx_ind_hl()
2723 rx_status->flag |= RX_FLAG_AMSDU_MORE; in ath10k_htt_rx_proc_rx_ind_hl()
2732 if (ieee80211_has_protected(hdr->frame_control)) { in ath10k_htt_rx_proc_rx_ind_hl()
2733 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_FCTL_PROTECTED); in ath10k_htt_rx_proc_rx_ind_hl()
2734 rx_status->flag |= RX_FLAG_DECRYPTED | in ath10k_htt_rx_proc_rx_ind_hl()
2748 hdr = (struct ieee80211_hdr *)skb->data; in ath10k_htt_rx_proc_rx_ind_hl()
2749 offset = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_proc_rx_ind_hl()
2750 hdr->frame_control |= __cpu_to_le16(IEEE80211_FCTL_PROTECTED); in ath10k_htt_rx_proc_rx_ind_hl()
2751 rx_status->flag &= ~RX_FLAG_IV_STRIPPED; in ath10k_htt_rx_proc_rx_ind_hl()
2753 memmove(skb->data - IEEE80211_CCMP_HDR_LEN, in ath10k_htt_rx_proc_rx_ind_hl()
2754 skb->data, offset); in ath10k_htt_rx_proc_rx_ind_hl()
2756 ivp = skb->data + offset; in ath10k_htt_rx_proc_rx_ind_hl()
2757 memset(skb->data + offset, 0, IEEE80211_CCMP_HDR_LEN); in ath10k_htt_rx_proc_rx_ind_hl()
2759 ivp[IEEE80211_WEP_IV_LEN - 1] |= ATH10K_IEEE80211_EXTIV; in ath10k_htt_rx_proc_rx_ind_hl()
2761 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { in ath10k_htt_rx_proc_rx_ind_hl()
2762 if (peer->keys[i] && in ath10k_htt_rx_proc_rx_ind_hl()
2763 peer->keys[i]->flags & IEEE80211_KEY_FLAG_PAIRWISE) in ath10k_htt_rx_proc_rx_ind_hl()
2764 keyidx = peer->keys[i]->keyidx; in ath10k_htt_rx_proc_rx_ind_hl()
2768 ivp[IEEE80211_WEP_IV_LEN - 1] |= keyidx << 6; in ath10k_htt_rx_proc_rx_ind_hl()
2771 rx_status->flag |= RX_FLAG_MIC_STRIPPED; in ath10k_htt_rx_proc_rx_ind_hl()
2773 memcpy(skb->data + offset, &pn48, 2); in ath10k_htt_rx_proc_rx_ind_hl()
2775 memcpy(skb->data + offset + 4, ((u8 *)&pn48) + 2, 4); in ath10k_htt_rx_proc_rx_ind_hl()
2777 rx_status->flag |= RX_FLAG_ICV_STRIPPED; in ath10k_htt_rx_proc_rx_ind_hl()
2779 memcpy(skb->data + offset + 2, &pn48, 1); in ath10k_htt_rx_proc_rx_ind_hl()
2781 memcpy(skb->data + offset, ((u8 *)&pn48) + 1, 1); in ath10k_htt_rx_proc_rx_ind_hl()
2783 memcpy(skb->data + offset + 4, ((u8 *)&pn48) + 2, 4); in ath10k_htt_rx_proc_rx_ind_hl()
2789 rx_status->flag &= ~RX_FLAG_IV_STRIPPED & in ath10k_htt_rx_proc_rx_ind_hl()
2792 if (mpdu_ranges->mpdu_range_status == HTT_RX_IND_MPDU_STATUS_TKIP_MIC_ERR) in ath10k_htt_rx_proc_rx_ind_hl()
2793 rx_status->flag |= RX_FLAG_MMIC_ERROR; in ath10k_htt_rx_proc_rx_ind_hl()
2799 hdr = (struct ieee80211_hdr *)skb->data; in ath10k_htt_rx_proc_rx_ind_hl()
2800 offset = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_proc_rx_ind_hl()
2802 hdr->frame_control |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA); in ath10k_htt_rx_proc_rx_ind_hl()
2803 memmove(skb->data - IEEE80211_QOS_CTL_LEN, skb->data, offset); in ath10k_htt_rx_proc_rx_ind_hl()
2806 memcpy(skb->data + offset, &qos_ctrl, IEEE80211_QOS_CTL_LEN); in ath10k_htt_rx_proc_rx_ind_hl()
2809 if (ar->napi.dev) in ath10k_htt_rx_proc_rx_ind_hl()
2810 ieee80211_rx_napi(ar->hw, NULL, skb, &ar->napi); in ath10k_htt_rx_proc_rx_ind_hl()
2812 ieee80211_rx_ni(ar->hw, skb); in ath10k_htt_rx_proc_rx_ind_hl()
2831 orig_hdr = skb->data; in ath10k_htt_rx_frag_tkip_decap_nomic()
2835 if (!(ivp[IEEE80211_WEP_IV_LEN - 1] & ATH10K_IEEE80211_EXTIV)) in ath10k_htt_rx_frag_tkip_decap_nomic()
2836 return -EINVAL; in ath10k_htt_rx_frag_tkip_decap_nomic()
2840 skb_trim(skb, skb->len - ATH10K_IEEE80211_TKIP_MICLEN); in ath10k_htt_rx_frag_tkip_decap_nomic()
2850 orig_hdr = skb->data; in ath10k_htt_rx_frag_tkip_decap_withmic()
2854 if (!(ivp[IEEE80211_WEP_IV_LEN - 1] & ATH10K_IEEE80211_EXTIV)) in ath10k_htt_rx_frag_tkip_decap_withmic()
2855 return -EINVAL; in ath10k_htt_rx_frag_tkip_decap_withmic()
2859 skb_trim(skb, skb->len - IEEE80211_TKIP_ICV_LEN); in ath10k_htt_rx_frag_tkip_decap_withmic()
2869 orig_hdr = skb->data; in ath10k_htt_rx_frag_ccmp_decap()
2873 if (!(ivp[IEEE80211_WEP_IV_LEN - 1] & ATH10K_IEEE80211_EXTIV)) in ath10k_htt_rx_frag_ccmp_decap()
2874 return -EINVAL; in ath10k_htt_rx_frag_ccmp_decap()
2876 skb_trim(skb, skb->len - IEEE80211_CCMP_MIC_LEN); in ath10k_htt_rx_frag_ccmp_decap()
2888 orig_hdr = skb->data; in ath10k_htt_rx_frag_wep_decap()
2893 skb_trim(skb, skb->len - IEEE80211_WEP_ICV_LEN); in ath10k_htt_rx_frag_wep_decap()
2901 struct ath10k *ar = htt->ar; in ath10k_htt_rx_proc_rx_frag_ind_hl()
2917 resp = (struct htt_resp *)(skb->data + HTT_RX_FRAG_IND_INFO0_HEADER_LEN); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2919 skb_trim(skb, skb->len - FCS_LEN); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2921 peer_id = __le16_to_cpu(rx->peer_id); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2922 rx_hl = (struct htt_rx_indication_hl *)(&resp->rx_ind_hl); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2924 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2931 num_mpdu_ranges = MS(__le32_to_cpu(rx_hl->hdr.info1), in ath10k_htt_rx_proc_rx_frag_ind_hl()
2935 sizeof(rx_hl->hdr) + in ath10k_htt_rx_proc_rx_frag_ind_hl()
2936 sizeof(rx_hl->ppdu) + in ath10k_htt_rx_proc_rx_frag_ind_hl()
2937 sizeof(rx_hl->prefix) + in ath10k_htt_rx_proc_rx_frag_ind_hl()
2938 sizeof(rx_hl->fw_desc) + in ath10k_htt_rx_proc_rx_frag_ind_hl()
2941 tid = MS(rx_hl->hdr.info0, HTT_RX_INDICATION_INFO0_EXT_TID); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2942 rx_desc = (struct htt_hl_rx_desc *)(skb->data + tot_hdr_len); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2943 rx_desc_info = __le32_to_cpu(rx_desc->info); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2945 hdr = (struct ieee80211_hdr *)((u8 *)rx_desc + rx_hl->fw_desc.len); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2947 if (is_multicast_ether_addr(hdr->addr1)) { in ath10k_htt_rx_proc_rx_frag_ind_hl()
2953 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2954 return ath10k_htt_rx_proc_rx_ind_hl(htt, &resp->rx_ind_hl, skb, in ath10k_htt_rx_proc_rx_frag_ind_hl()
2959 if (ieee80211_has_retry(hdr->frame_control)) in ath10k_htt_rx_proc_rx_frag_ind_hl()
2962 hdr_space = ieee80211_hdrlen(hdr->frame_control); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2963 sc = __le16_to_cpu(hdr->seq_ctrl); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2969 sec_type = peer->rx_pn[sec_index].sec_type; in ath10k_htt_rx_proc_rx_frag_ind_hl()
2970 ath10k_htt_rx_mpdu_desc_pn_hl(rx_desc, &new_pn, peer->rx_pn[sec_index].pn_len); in ath10k_htt_rx_proc_rx_frag_ind_hl()
2977 rx_hl->fw_desc.len, in ath10k_htt_rx_proc_rx_frag_ind_hl()
2985 rx_hl->fw_desc.len, in ath10k_htt_rx_proc_rx_frag_ind_hl()
2992 tot_hdr_len + rx_hl->fw_desc.len, in ath10k_htt_rx_proc_rx_frag_ind_hl()
3001 tot_hdr_len + rx_hl->fw_desc.len, in ath10k_htt_rx_proc_rx_frag_ind_hl()
3010 resp = (struct htt_resp *)(skb->data); in ath10k_htt_rx_proc_rx_frag_ind_hl()
3015 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_frag_ind_hl()
3016 return ath10k_htt_rx_proc_rx_ind_hl(htt, &resp->rx_ind_hl, skb, in ath10k_htt_rx_proc_rx_frag_ind_hl()
3021 last_pn = &peer->frag_tids_last_pn[tid]; in ath10k_htt_rx_proc_rx_frag_ind_hl()
3024 if (ath10k_htt_rx_pn_check_replay_hl(ar, peer, &resp->rx_ind_hl)) in ath10k_htt_rx_proc_rx_frag_ind_hl()
3027 last_pn->pn48 = new_pn.pn48; in ath10k_htt_rx_proc_rx_frag_ind_hl()
3028 peer->frag_tids_seq[tid] = seq; in ath10k_htt_rx_proc_rx_frag_ind_hl()
3030 if (seq != peer->frag_tids_seq[tid]) in ath10k_htt_rx_proc_rx_frag_ind_hl()
3033 if (new_pn.pn48 != last_pn->pn48 + 1) in ath10k_htt_rx_proc_rx_frag_ind_hl()
3036 last_pn->pn48 = new_pn.pn48; in ath10k_htt_rx_proc_rx_frag_ind_hl()
3037 last_pn = &peer->tids_last_pn[tid]; in ath10k_htt_rx_proc_rx_frag_ind_hl()
3038 last_pn->pn48 = new_pn.pn48; in ath10k_htt_rx_proc_rx_frag_ind_hl()
3041 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_frag_ind_hl()
3043 return ath10k_htt_rx_proc_rx_ind_hl(htt, &resp->rx_ind_hl, skb, in ath10k_htt_rx_proc_rx_frag_ind_hl()
3047 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_proc_rx_frag_ind_hl()
3058 struct ath10k *ar = htt->ar; in ath10k_htt_rx_proc_rx_ind_ll()
3065 num_mpdu_ranges = MS(__le32_to_cpu(rx->hdr.info1), in ath10k_htt_rx_proc_rx_ind_ll()
3067 peer_id = __le16_to_cpu(rx->hdr.peer_id); in ath10k_htt_rx_proc_rx_ind_ll()
3068 tid = MS(rx->hdr.info0, HTT_RX_INDICATION_INFO0_EXT_TID); in ath10k_htt_rx_proc_rx_ind_ll()
3078 atomic_add(mpdu_count, &htt->num_mpdus_ready); in ath10k_htt_rx_proc_rx_ind_ll()
3087 struct ath10k_htt *htt = &ar->htt; in ath10k_htt_rx_tx_compl_ind()
3088 struct htt_resp *resp = (struct htt_resp *)skb->data; in ath10k_htt_rx_tx_compl_ind()
3090 int status = MS(resp->data_tx_completion.flags, HTT_DATA_TX_STATUS); in ath10k_htt_rx_tx_compl_ind()
3119 resp->data_tx_completion.num_msdus); in ath10k_htt_rx_tx_compl_ind()
3121 msdu_count = resp->data_tx_completion.num_msdus; in ath10k_htt_rx_tx_compl_ind()
3122 msdus = resp->data_tx_completion.msdus; in ath10k_htt_rx_tx_compl_ind()
3123 rssi_enabled = ath10k_is_rssi_enable(&ar->hw_params, resp); in ath10k_htt_rx_tx_compl_ind()
3126 htt_pad = ath10k_tx_data_rssi_get_pad_bytes(&ar->hw_params, in ath10k_htt_rx_tx_compl_ind()
3147 /* kfifo_put: In practice firmware shouldn't fire off per-CE in ath10k_htt_rx_tx_compl_ind()
3148 * interrupt and main interrupt (MSI/-X range case) for the same in ath10k_htt_rx_tx_compl_ind()
3155 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) { in ath10k_htt_rx_tx_compl_ind()
3157 } else if (!kfifo_put(&htt->txdone_fifo, tx_done)) { in ath10k_htt_rx_tx_compl_ind()
3164 if (!(resp->data_tx_completion.flags2 & HTT_TX_CMPL_FLAG_PPDU_DURATION_PRESENT)) in ath10k_htt_rx_tx_compl_ind()
3172 if (resp->data_tx_completion.flags2 & in ath10k_htt_rx_tx_compl_ind()
3178 __le32_to_cpu(ppdu_info->info0)); in ath10k_htt_rx_tx_compl_ind()
3184 ppdu_dur = &ppdu_info->ppdu_dur[i]; in ath10k_htt_rx_tx_compl_ind()
3185 info0 = __le32_to_cpu(ppdu_dur->info0); in ath10k_htt_rx_tx_compl_ind()
3190 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_tx_compl_ind()
3193 if (!peer || !peer->sta) { in ath10k_htt_rx_tx_compl_ind()
3194 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_tx_compl_ind()
3201 tx_duration = __le32_to_cpu(ppdu_dur->tx_duration); in ath10k_htt_rx_tx_compl_ind()
3203 ieee80211_sta_register_airtime(peer->sta, tid, tx_duration, 0); in ath10k_htt_rx_tx_compl_ind()
3205 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_tx_compl_ind()
3212 struct htt_rx_addba *ev = &resp->rx_addba; in ath10k_htt_rx_addba()
3217 info0 = __le16_to_cpu(ev->info0); in ath10k_htt_rx_addba()
3223 tid, peer_id, ev->window_size); in ath10k_htt_rx_addba()
3225 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_addba()
3230 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_addba()
3234 arvif = ath10k_get_arvif(ar, peer->vdev_id); in ath10k_htt_rx_addba()
3237 peer->vdev_id); in ath10k_htt_rx_addba()
3238 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_addba()
3244 peer->addr, tid, ev->window_size); in ath10k_htt_rx_addba()
3246 ieee80211_start_rx_ba_session_offl(arvif->vif, peer->addr, tid); in ath10k_htt_rx_addba()
3247 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_addba()
3252 struct htt_rx_delba *ev = &resp->rx_delba; in ath10k_htt_rx_delba()
3257 info0 = __le16_to_cpu(ev->info0); in ath10k_htt_rx_delba()
3265 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_delba()
3270 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_delba()
3274 arvif = ath10k_get_arvif(ar, peer->vdev_id); in ath10k_htt_rx_delba()
3277 peer->vdev_id); in ath10k_htt_rx_delba()
3278 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_delba()
3284 peer->addr, tid); in ath10k_htt_rx_delba()
3286 ieee80211_stop_rx_ba_session_offl(arvif->vif, peer->addr, tid); in ath10k_htt_rx_delba()
3287 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_delba()
3299 return -ENOBUFS; in ath10k_htt_rx_extract_amsdu()
3302 return -EINVAL; in ath10k_htt_rx_extract_amsdu()
3309 (void *)msdu->data - in ath10k_htt_rx_extract_amsdu()
3311 (u8 *)msdu->data - in ath10k_htt_rx_extract_amsdu()
3313 hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_extract_amsdu()
3316 if (rxd_msdu_end_common->info0 & in ath10k_htt_rx_extract_amsdu()
3324 (void *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_extract_amsdu()
3326 (u8 *)msdu->data - hw->rx_desc_ops->rx_desc_size); in ath10k_htt_rx_extract_amsdu()
3330 if (!(rxd_msdu_end_common->info0 & in ath10k_htt_rx_extract_amsdu()
3333 return -EAGAIN; in ath10k_htt_rx_extract_amsdu()
3342 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath10k_htt_rx_h_rx_offload_prot()
3344 if (!ieee80211_has_protected(hdr->frame_control)) in ath10k_htt_rx_h_rx_offload_prot()
3352 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_FCTL_PROTECTED); in ath10k_htt_rx_h_rx_offload_prot()
3353 status->flag |= RX_FLAG_DECRYPTED | in ath10k_htt_rx_h_rx_offload_prot()
3361 struct ath10k_htt *htt = &ar->htt; in ath10k_htt_rx_h_rx_offload()
3362 struct ieee80211_rx_status *status = &htt->rx_status; in ath10k_htt_rx_h_rx_offload()
3372 rx = (void *)msdu->data; in ath10k_htt_rx_h_rx_offload()
3377 if (skb_tailroom(msdu) < __le16_to_cpu(rx->msdu_len)) { in ath10k_htt_rx_h_rx_offload()
3383 skb_put(msdu, __le16_to_cpu(rx->msdu_len)); in ath10k_htt_rx_h_rx_offload()
3390 offset = 4 - ((unsigned long)msdu->data & 3); in ath10k_htt_rx_h_rx_offload()
3392 memmove(msdu->data + offset, msdu->data, msdu->len); in ath10k_htt_rx_h_rx_offload()
3395 /* FIXME: The frame is NWifi. Re-construct QoS Control in ath10k_htt_rx_h_rx_offload()
3400 status->flag |= RX_FLAG_NO_SIGNAL_VAL; in ath10k_htt_rx_h_rx_offload()
3403 ath10k_htt_rx_h_channel(ar, status, NULL, rx->vdev_id); in ath10k_htt_rx_h_rx_offload()
3410 struct ath10k_htt *htt = &ar->htt; in ath10k_htt_rx_in_ord_ind()
3411 struct htt_resp *resp = (void *)skb->data; in ath10k_htt_rx_in_ord_ind()
3412 struct ieee80211_rx_status *status = &htt->rx_status; in ath10k_htt_rx_in_ord_ind()
3423 lockdep_assert_held(&htt->rx_ring.lock); in ath10k_htt_rx_in_ord_ind()
3425 if (htt->rx_confused) in ath10k_htt_rx_in_ord_ind()
3426 return -EIO; in ath10k_htt_rx_in_ord_ind()
3428 skb_pull(skb, sizeof(resp->hdr)); in ath10k_htt_rx_in_ord_ind()
3429 skb_pull(skb, sizeof(resp->rx_in_ord_ind)); in ath10k_htt_rx_in_ord_ind()
3431 peer_id = __le16_to_cpu(resp->rx_in_ord_ind.peer_id); in ath10k_htt_rx_in_ord_ind()
3432 msdu_count = __le16_to_cpu(resp->rx_in_ord_ind.msdu_count); in ath10k_htt_rx_in_ord_ind()
3433 vdev_id = resp->rx_in_ord_ind.vdev_id; in ath10k_htt_rx_in_ord_ind()
3434 tid = SM(resp->rx_in_ord_ind.info, HTT_RX_IN_ORD_IND_INFO_TID); in ath10k_htt_rx_in_ord_ind()
3435 offload = !!(resp->rx_in_ord_ind.info & in ath10k_htt_rx_in_ord_ind()
3437 frag = !!(resp->rx_in_ord_ind.info & HTT_RX_IN_ORD_IND_INFO_FRAG_MASK); in ath10k_htt_rx_in_ord_ind()
3443 if (skb->len < msdu_count * sizeof(*resp->rx_in_ord_ind.msdu_descs32)) { in ath10k_htt_rx_in_ord_ind()
3445 return -EINVAL; in ath10k_htt_rx_in_ord_ind()
3448 /* The event can deliver more than 1 A-MSDU. Each A-MSDU is later in ath10k_htt_rx_in_ord_ind()
3452 if (ar->hw_params.target_64bit) in ath10k_htt_rx_in_ord_ind()
3453 ret = ath10k_htt_rx_pop_paddr64_list(htt, &resp->rx_in_ord_ind, in ath10k_htt_rx_in_ord_ind()
3456 ret = ath10k_htt_rx_pop_paddr32_list(htt, &resp->rx_in_ord_ind, in ath10k_htt_rx_in_ord_ind()
3461 htt->rx_confused = true; in ath10k_htt_rx_in_ord_ind()
3462 return -EIO; in ath10k_htt_rx_in_ord_ind()
3473 ret = ath10k_htt_rx_extract_amsdu(&ar->hw_params, &list, &amsdu); in ath10k_htt_rx_in_ord_ind()
3476 /* Note: The in-order indication may report interleaved in ath10k_htt_rx_in_ord_ind()
3488 case -EAGAIN: in ath10k_htt_rx_in_ord_ind()
3493 htt->rx_confused = true; in ath10k_htt_rx_in_ord_ind()
3495 return -EIO; in ath10k_htt_rx_in_ord_ind()
3523 struct ieee80211_hw *hw = ar->hw; in ath10k_htt_rx_tx_fetch_ind()
3525 struct htt_resp *resp = (struct htt_resp *)skb->data; in ath10k_htt_rx_tx_fetch_ind()
3543 len = sizeof(resp->hdr) + sizeof(resp->tx_fetch_ind); in ath10k_htt_rx_tx_fetch_ind()
3544 if (unlikely(skb->len < len)) { in ath10k_htt_rx_tx_fetch_ind()
3549 num_records = le16_to_cpu(resp->tx_fetch_ind.num_records); in ath10k_htt_rx_tx_fetch_ind()
3550 num_resp_ids = le16_to_cpu(resp->tx_fetch_ind.num_resp_ids); in ath10k_htt_rx_tx_fetch_ind()
3552 len += sizeof(resp->tx_fetch_ind.records[0]) * num_records; in ath10k_htt_rx_tx_fetch_ind()
3553 len += sizeof(resp->tx_fetch_ind.resp_ids[0]) * num_resp_ids; in ath10k_htt_rx_tx_fetch_ind()
3555 if (unlikely(skb->len < len)) { in ath10k_htt_rx_tx_fetch_ind()
3562 le16_to_cpu(resp->tx_fetch_ind.fetch_seq_num)); in ath10k_htt_rx_tx_fetch_ind()
3564 if (!ar->htt.tx_q_state.enabled) { in ath10k_htt_rx_tx_fetch_ind()
3569 if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH) { in ath10k_htt_rx_tx_fetch_ind()
3577 record = &resp->tx_fetch_ind.records[i]; in ath10k_htt_rx_tx_fetch_ind()
3578 peer_id = MS(le16_to_cpu(record->info), in ath10k_htt_rx_tx_fetch_ind()
3580 tid = MS(le16_to_cpu(record->info), in ath10k_htt_rx_tx_fetch_ind()
3582 max_num_msdus = le16_to_cpu(record->num_msdus); in ath10k_htt_rx_tx_fetch_ind()
3583 max_num_bytes = le32_to_cpu(record->num_bytes); in ath10k_htt_rx_tx_fetch_ind()
3588 if (unlikely(peer_id >= ar->htt.tx_q_state.num_peers) || in ath10k_htt_rx_tx_fetch_ind()
3589 unlikely(tid >= ar->htt.tx_q_state.num_tids)) { in ath10k_htt_rx_tx_fetch_ind()
3595 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_tx_fetch_ind()
3597 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_tx_fetch_ind()
3612 ieee80211_txq_schedule_start(hw, txq->ac); in ath10k_htt_rx_tx_fetch_ind()
3627 ieee80211_txq_schedule_end(hw, txq->ac); in ath10k_htt_rx_tx_fetch_ind()
3629 record->num_msdus = cpu_to_le16(num_msdus); in ath10k_htt_rx_tx_fetch_ind()
3630 record->num_bytes = cpu_to_le32(num_bytes); in ath10k_htt_rx_tx_fetch_ind()
3637 resp_ids = ath10k_htt_get_tx_fetch_ind_resp_ids(&resp->tx_fetch_ind); in ath10k_htt_rx_tx_fetch_ind()
3641 resp->tx_fetch_ind.token, in ath10k_htt_rx_tx_fetch_ind()
3642 resp->tx_fetch_ind.fetch_seq_num, in ath10k_htt_rx_tx_fetch_ind()
3643 resp->tx_fetch_ind.records, in ath10k_htt_rx_tx_fetch_ind()
3647 le32_to_cpu(resp->tx_fetch_ind.token), ret); in ath10k_htt_rx_tx_fetch_ind()
3657 const struct htt_resp *resp = (void *)skb->data; in ath10k_htt_rx_tx_fetch_confirm()
3663 len = sizeof(resp->hdr) + sizeof(resp->tx_fetch_confirm); in ath10k_htt_rx_tx_fetch_confirm()
3664 if (unlikely(skb->len < len)) { in ath10k_htt_rx_tx_fetch_confirm()
3669 num_resp_ids = le16_to_cpu(resp->tx_fetch_confirm.num_resp_ids); in ath10k_htt_rx_tx_fetch_confirm()
3670 len += sizeof(resp->tx_fetch_confirm.resp_ids[0]) * num_resp_ids; in ath10k_htt_rx_tx_fetch_confirm()
3672 if (unlikely(skb->len < len)) { in ath10k_htt_rx_tx_fetch_confirm()
3678 resp->tx_fetch_confirm.resp_ids, in ath10k_htt_rx_tx_fetch_confirm()
3685 const struct htt_resp *resp = (void *)skb->data; in ath10k_htt_rx_tx_mode_switch_ind()
3702 len = sizeof(resp->hdr) + sizeof(resp->tx_mode_switch_ind); in ath10k_htt_rx_tx_mode_switch_ind()
3703 if (unlikely(skb->len < len)) { in ath10k_htt_rx_tx_mode_switch_ind()
3708 info0 = le16_to_cpu(resp->tx_mode_switch_ind.info0); in ath10k_htt_rx_tx_mode_switch_ind()
3709 info1 = le16_to_cpu(resp->tx_mode_switch_ind.info1); in ath10k_htt_rx_tx_mode_switch_ind()
3720 len += sizeof(resp->tx_mode_switch_ind.records[0]) * num_records; in ath10k_htt_rx_tx_mode_switch_ind()
3722 if (unlikely(skb->len < len)) { in ath10k_htt_rx_tx_mode_switch_ind()
3740 ar->htt.tx_q_state.enabled = enable; in ath10k_htt_rx_tx_mode_switch_ind()
3741 ar->htt.tx_q_state.mode = mode; in ath10k_htt_rx_tx_mode_switch_ind()
3742 ar->htt.tx_q_state.num_push_allowed = threshold; in ath10k_htt_rx_tx_mode_switch_ind()
3747 record = &resp->tx_mode_switch_ind.records[i]; in ath10k_htt_rx_tx_mode_switch_ind()
3748 info0 = le16_to_cpu(record->info0); in ath10k_htt_rx_tx_mode_switch_ind()
3752 if (unlikely(peer_id >= ar->htt.tx_q_state.num_peers) || in ath10k_htt_rx_tx_mode_switch_ind()
3753 unlikely(tid >= ar->htt.tx_q_state.num_tids)) { in ath10k_htt_rx_tx_mode_switch_ind()
3759 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_tx_mode_switch_ind()
3761 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_tx_mode_switch_ind()
3773 spin_lock_bh(&ar->htt.tx_lock); in ath10k_htt_rx_tx_mode_switch_ind()
3774 artxq = (void *)txq->drv_priv; in ath10k_htt_rx_tx_mode_switch_ind()
3775 artxq->num_push_allowed = le16_to_cpu(record->num_max_msdus); in ath10k_htt_rx_tx_mode_switch_ind()
3776 spin_unlock_bh(&ar->htt.tx_lock); in ath10k_htt_rx_tx_mode_switch_ind()
3807 return -EINVAL; in ath10k_get_legacy_rate_idx()
3816 struct rate_info *txrate = &arsta->txrate; in ath10k_accumulate_per_peer_tx_stats()
3818 int idx, ht_idx, gi, mcs, bw, nss; in ath10k_accumulate_per_peer_tx_stats() local
3821 if (!arsta->tx_stats) in ath10k_accumulate_per_peer_tx_stats()
3824 tx_stats = arsta->tx_stats; in ath10k_accumulate_per_peer_tx_stats()
3825 flags = txrate->flags; in ath10k_accumulate_per_peer_tx_stats()
3827 mcs = ATH10K_HW_MCS_RATE(pstats->ratecode); in ath10k_accumulate_per_peer_tx_stats()
3828 bw = txrate->bw; in ath10k_accumulate_per_peer_tx_stats()
3829 nss = txrate->nss; in ath10k_accumulate_per_peer_tx_stats()
3830 ht_idx = mcs + (nss - 1) * 8; in ath10k_accumulate_per_peer_tx_stats()
3831 idx = mcs * 8 + 8 * 10 * (nss - 1); in ath10k_accumulate_per_peer_tx_stats()
3834 #define STATS_OP_FMT(name) tx_stats->stats[ATH10K_STATS_TYPE_##name] in ath10k_accumulate_per_peer_tx_stats()
3836 if (txrate->flags & RATE_INFO_FLAGS_VHT_MCS) { in ath10k_accumulate_per_peer_tx_stats()
3837 STATS_OP_FMT(SUCC).vht[0][mcs] += pstats->succ_bytes; in ath10k_accumulate_per_peer_tx_stats()
3838 STATS_OP_FMT(SUCC).vht[1][mcs] += pstats->succ_pkts; in ath10k_accumulate_per_peer_tx_stats()
3839 STATS_OP_FMT(FAIL).vht[0][mcs] += pstats->failed_bytes; in ath10k_accumulate_per_peer_tx_stats()
3840 STATS_OP_FMT(FAIL).vht[1][mcs] += pstats->failed_pkts; in ath10k_accumulate_per_peer_tx_stats()
3841 STATS_OP_FMT(RETRY).vht[0][mcs] += pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3842 STATS_OP_FMT(RETRY).vht[1][mcs] += pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3843 } else if (txrate->flags & RATE_INFO_FLAGS_MCS) { in ath10k_accumulate_per_peer_tx_stats()
3844 STATS_OP_FMT(SUCC).ht[0][ht_idx] += pstats->succ_bytes; in ath10k_accumulate_per_peer_tx_stats()
3845 STATS_OP_FMT(SUCC).ht[1][ht_idx] += pstats->succ_pkts; in ath10k_accumulate_per_peer_tx_stats()
3846 STATS_OP_FMT(FAIL).ht[0][ht_idx] += pstats->failed_bytes; in ath10k_accumulate_per_peer_tx_stats()
3847 STATS_OP_FMT(FAIL).ht[1][ht_idx] += pstats->failed_pkts; in ath10k_accumulate_per_peer_tx_stats()
3848 STATS_OP_FMT(RETRY).ht[0][ht_idx] += pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3849 STATS_OP_FMT(RETRY).ht[1][ht_idx] += pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3851 mcs = legacy_rate_idx; in ath10k_accumulate_per_peer_tx_stats()
3853 STATS_OP_FMT(SUCC).legacy[0][mcs] += pstats->succ_bytes; in ath10k_accumulate_per_peer_tx_stats()
3854 STATS_OP_FMT(SUCC).legacy[1][mcs] += pstats->succ_pkts; in ath10k_accumulate_per_peer_tx_stats()
3855 STATS_OP_FMT(FAIL).legacy[0][mcs] += pstats->failed_bytes; in ath10k_accumulate_per_peer_tx_stats()
3856 STATS_OP_FMT(FAIL).legacy[1][mcs] += pstats->failed_pkts; in ath10k_accumulate_per_peer_tx_stats()
3857 STATS_OP_FMT(RETRY).legacy[0][mcs] += pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3858 STATS_OP_FMT(RETRY).legacy[1][mcs] += pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3861 if (ATH10K_HW_AMPDU(pstats->flags)) { in ath10k_accumulate_per_peer_tx_stats()
3862 tx_stats->ba_fails += ATH10K_HW_BA_FAIL(pstats->flags); in ath10k_accumulate_per_peer_tx_stats()
3864 if (txrate->flags & RATE_INFO_FLAGS_MCS) { in ath10k_accumulate_per_peer_tx_stats()
3866 pstats->succ_bytes + pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3868 pstats->succ_pkts + pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3870 STATS_OP_FMT(AMPDU).vht[0][mcs] += in ath10k_accumulate_per_peer_tx_stats()
3871 pstats->succ_bytes + pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3872 STATS_OP_FMT(AMPDU).vht[1][mcs] += in ath10k_accumulate_per_peer_tx_stats()
3873 pstats->succ_pkts + pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3876 pstats->succ_bytes + pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3877 STATS_OP_FMT(AMPDU).nss[0][nss - 1] += in ath10k_accumulate_per_peer_tx_stats()
3878 pstats->succ_bytes + pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3880 pstats->succ_bytes + pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3882 pstats->succ_bytes + pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3884 pstats->succ_pkts + pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3885 STATS_OP_FMT(AMPDU).nss[1][nss - 1] += in ath10k_accumulate_per_peer_tx_stats()
3886 pstats->succ_pkts + pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3888 pstats->succ_pkts + pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3890 pstats->succ_pkts + pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3892 tx_stats->ack_fails += in ath10k_accumulate_per_peer_tx_stats()
3893 ATH10K_HW_BA_FAIL(pstats->flags); in ath10k_accumulate_per_peer_tx_stats()
3896 STATS_OP_FMT(SUCC).bw[0][bw] += pstats->succ_bytes; in ath10k_accumulate_per_peer_tx_stats()
3897 STATS_OP_FMT(SUCC).nss[0][nss - 1] += pstats->succ_bytes; in ath10k_accumulate_per_peer_tx_stats()
3898 STATS_OP_FMT(SUCC).gi[0][gi] += pstats->succ_bytes; in ath10k_accumulate_per_peer_tx_stats()
3900 STATS_OP_FMT(SUCC).bw[1][bw] += pstats->succ_pkts; in ath10k_accumulate_per_peer_tx_stats()
3901 STATS_OP_FMT(SUCC).nss[1][nss - 1] += pstats->succ_pkts; in ath10k_accumulate_per_peer_tx_stats()
3902 STATS_OP_FMT(SUCC).gi[1][gi] += pstats->succ_pkts; in ath10k_accumulate_per_peer_tx_stats()
3904 STATS_OP_FMT(FAIL).bw[0][bw] += pstats->failed_bytes; in ath10k_accumulate_per_peer_tx_stats()
3905 STATS_OP_FMT(FAIL).nss[0][nss - 1] += pstats->failed_bytes; in ath10k_accumulate_per_peer_tx_stats()
3906 STATS_OP_FMT(FAIL).gi[0][gi] += pstats->failed_bytes; in ath10k_accumulate_per_peer_tx_stats()
3908 STATS_OP_FMT(FAIL).bw[1][bw] += pstats->failed_pkts; in ath10k_accumulate_per_peer_tx_stats()
3909 STATS_OP_FMT(FAIL).nss[1][nss - 1] += pstats->failed_pkts; in ath10k_accumulate_per_peer_tx_stats()
3910 STATS_OP_FMT(FAIL).gi[1][gi] += pstats->failed_pkts; in ath10k_accumulate_per_peer_tx_stats()
3912 STATS_OP_FMT(RETRY).bw[0][bw] += pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3913 STATS_OP_FMT(RETRY).nss[0][nss - 1] += pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3914 STATS_OP_FMT(RETRY).gi[0][gi] += pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3916 STATS_OP_FMT(RETRY).bw[1][bw] += pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3917 STATS_OP_FMT(RETRY).nss[1][nss - 1] += pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3918 STATS_OP_FMT(RETRY).gi[1][gi] += pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3920 if (txrate->flags >= RATE_INFO_FLAGS_MCS) { in ath10k_accumulate_per_peer_tx_stats()
3921 STATS_OP_FMT(SUCC).rate_table[0][idx] += pstats->succ_bytes; in ath10k_accumulate_per_peer_tx_stats()
3922 STATS_OP_FMT(SUCC).rate_table[1][idx] += pstats->succ_pkts; in ath10k_accumulate_per_peer_tx_stats()
3923 STATS_OP_FMT(FAIL).rate_table[0][idx] += pstats->failed_bytes; in ath10k_accumulate_per_peer_tx_stats()
3924 STATS_OP_FMT(FAIL).rate_table[1][idx] += pstats->failed_pkts; in ath10k_accumulate_per_peer_tx_stats()
3925 STATS_OP_FMT(RETRY).rate_table[0][idx] += pstats->retry_bytes; in ath10k_accumulate_per_peer_tx_stats()
3926 STATS_OP_FMT(RETRY).rate_table[1][idx] += pstats->retry_pkts; in ath10k_accumulate_per_peer_tx_stats()
3929 tx_stats->tx_duration += pstats->duration; in ath10k_accumulate_per_peer_tx_stats()
3937 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; in ath10k_update_per_peer_tx_stats()
3944 lockdep_assert_held(&ar->data_lock); in ath10k_update_per_peer_tx_stats()
3946 txrate.flags = ATH10K_HW_PREAMBLE(peer_stats->ratecode); in ath10k_update_per_peer_tx_stats()
3947 txrate.bw = ATH10K_HW_BW(peer_stats->flags); in ath10k_update_per_peer_tx_stats()
3948 txrate.nss = ATH10K_HW_NSS(peer_stats->ratecode); in ath10k_update_per_peer_tx_stats()
3949 txrate.mcs = ATH10K_HW_MCS_RATE(peer_stats->ratecode); in ath10k_update_per_peer_tx_stats()
3950 sgi = ATH10K_HW_GI(peer_stats->flags); in ath10k_update_per_peer_tx_stats()
3951 skip_auto_rate = ATH10K_FW_SKIPPED_RATE_CTRL(peer_stats->flags); in ath10k_update_per_peer_tx_stats()
3954 * if host has configure fixed rates and in some other special cases. in ath10k_update_per_peer_tx_stats()
3959 if (txrate.flags == WMI_RATE_PREAMBLE_VHT && txrate.mcs > 9) { in ath10k_update_per_peer_tx_stats()
3960 ath10k_warn(ar, "Invalid VHT mcs %d peer stats", txrate.mcs); in ath10k_update_per_peer_tx_stats()
3965 (txrate.mcs > 7 || txrate.nss < 1)) { in ath10k_update_per_peer_tx_stats()
3966 ath10k_warn(ar, "Invalid HT mcs %d nss %d peer stats", in ath10k_update_per_peer_tx_stats()
3967 txrate.mcs, txrate.nss); in ath10k_update_per_peer_tx_stats()
3971 memset(&arsta->txrate, 0, sizeof(arsta->txrate)); in ath10k_update_per_peer_tx_stats()
3972 memset(&arsta->tx_info.status, 0, sizeof(arsta->tx_info.status)); in ath10k_update_per_peer_tx_stats()
3975 rate = ATH10K_HW_LEGACY_RATE(peer_stats->ratecode); in ath10k_update_per_peer_tx_stats()
3982 arsta->txrate.legacy = rate; in ath10k_update_per_peer_tx_stats()
3984 arsta->txrate.flags = RATE_INFO_FLAGS_MCS; in ath10k_update_per_peer_tx_stats()
3985 arsta->txrate.mcs = txrate.mcs + 8 * (txrate.nss - 1); in ath10k_update_per_peer_tx_stats()
3987 arsta->txrate.flags = RATE_INFO_FLAGS_VHT_MCS; in ath10k_update_per_peer_tx_stats()
3988 arsta->txrate.mcs = txrate.mcs; in ath10k_update_per_peer_tx_stats()
3993 if (arsta->arvif && arsta->arvif->vif) in ath10k_update_per_peer_tx_stats()
3994 conf = rcu_dereference(arsta->arvif->vif->bss_conf.chanctx_conf); in ath10k_update_per_peer_tx_stats()
3995 if (conf && conf->def.chan->band == NL80211_BAND_5GHZ) in ath10k_update_per_peer_tx_stats()
3996 arsta->tx_info.status.rates[0].idx = rate_idx - 4; in ath10k_update_per_peer_tx_stats()
3999 arsta->tx_info.status.rates[0].idx = rate_idx; in ath10k_update_per_peer_tx_stats()
4001 arsta->tx_info.status.rates[0].flags |= in ath10k_update_per_peer_tx_stats()
4006 arsta->tx_info.status.rates[0].idx = in ath10k_update_per_peer_tx_stats()
4007 txrate.mcs + ((txrate.nss - 1) * 8); in ath10k_update_per_peer_tx_stats()
4009 arsta->tx_info.status.rates[0].flags |= in ath10k_update_per_peer_tx_stats()
4011 arsta->tx_info.status.rates[0].flags |= IEEE80211_TX_RC_MCS; in ath10k_update_per_peer_tx_stats()
4014 ieee80211_rate_set_vht(&arsta->tx_info.status.rates[0], in ath10k_update_per_peer_tx_stats()
4015 txrate.mcs, txrate.nss); in ath10k_update_per_peer_tx_stats()
4017 arsta->tx_info.status.rates[0].flags |= in ath10k_update_per_peer_tx_stats()
4019 arsta->tx_info.status.rates[0].flags |= IEEE80211_TX_RC_VHT_MCS; in ath10k_update_per_peer_tx_stats()
4023 arsta->txrate.nss = txrate.nss; in ath10k_update_per_peer_tx_stats()
4024 arsta->txrate.bw = ath10k_bw_to_mac80211_bw(txrate.bw); in ath10k_update_per_peer_tx_stats()
4025 arsta->last_tx_bitrate = cfg80211_calculate_bitrate(&arsta->txrate); in ath10k_update_per_peer_tx_stats()
4027 arsta->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; in ath10k_update_per_peer_tx_stats()
4029 switch (arsta->txrate.bw) { in ath10k_update_per_peer_tx_stats()
4031 arsta->tx_info.status.rates[0].flags |= in ath10k_update_per_peer_tx_stats()
4035 arsta->tx_info.status.rates[0].flags |= in ath10k_update_per_peer_tx_stats()
4039 arsta->tx_info.status.rates[0].flags |= in ath10k_update_per_peer_tx_stats()
4044 if (peer_stats->succ_pkts) { in ath10k_update_per_peer_tx_stats()
4045 arsta->tx_info.flags = IEEE80211_TX_STAT_ACK; in ath10k_update_per_peer_tx_stats()
4046 arsta->tx_info.status.rates[0].count = 1; in ath10k_update_per_peer_tx_stats()
4047 ieee80211_tx_rate_update(ar->hw, sta, &arsta->tx_info); in ath10k_update_per_peer_tx_stats()
4050 if (ar->htt.disable_tx_comp) { in ath10k_update_per_peer_tx_stats()
4051 arsta->tx_failed += peer_stats->failed_pkts; in ath10k_update_per_peer_tx_stats()
4053 arsta->tx_failed); in ath10k_update_per_peer_tx_stats()
4056 arsta->tx_retries += peer_stats->retry_pkts; in ath10k_update_per_peer_tx_stats()
4057 ath10k_dbg(ar, ATH10K_DBG_HTT, "htt tx retries %d", arsta->tx_retries); in ath10k_update_per_peer_tx_stats()
4067 struct htt_resp *resp = (struct htt_resp *)skb->data; in ath10k_htt_fetch_peer_stats()
4068 struct ath10k_per_peer_tx_stats *p_tx_stats = &ar->peer_tx_stats; in ath10k_htt_fetch_peer_stats()
4075 num_ppdu = resp->peer_tx_stats.num_ppdu; in ath10k_htt_fetch_peer_stats()
4076 ppdu_len = resp->peer_tx_stats.ppdu_len * sizeof(__le32); in ath10k_htt_fetch_peer_stats()
4078 if (skb->len < sizeof(struct htt_resp_hdr) + num_ppdu * ppdu_len) { in ath10k_htt_fetch_peer_stats()
4079 ath10k_warn(ar, "Invalid peer stats buf length %d\n", skb->len); in ath10k_htt_fetch_peer_stats()
4084 (resp->peer_tx_stats.payload); in ath10k_htt_fetch_peer_stats()
4085 peer_id = __le16_to_cpu(tx_stats->peer_id); in ath10k_htt_fetch_peer_stats()
4088 spin_lock_bh(&ar->data_lock); in ath10k_htt_fetch_peer_stats()
4090 if (!peer || !peer->sta) { in ath10k_htt_fetch_peer_stats()
4096 sta = peer->sta; in ath10k_htt_fetch_peer_stats()
4099 (resp->peer_tx_stats.payload + i * ppdu_len); in ath10k_htt_fetch_peer_stats()
4101 p_tx_stats->succ_bytes = __le32_to_cpu(tx_stats->succ_bytes); in ath10k_htt_fetch_peer_stats()
4102 p_tx_stats->retry_bytes = __le32_to_cpu(tx_stats->retry_bytes); in ath10k_htt_fetch_peer_stats()
4103 p_tx_stats->failed_bytes = in ath10k_htt_fetch_peer_stats()
4104 __le32_to_cpu(tx_stats->failed_bytes); in ath10k_htt_fetch_peer_stats()
4105 p_tx_stats->ratecode = tx_stats->ratecode; in ath10k_htt_fetch_peer_stats()
4106 p_tx_stats->flags = tx_stats->flags; in ath10k_htt_fetch_peer_stats()
4107 p_tx_stats->succ_pkts = __le16_to_cpu(tx_stats->succ_pkts); in ath10k_htt_fetch_peer_stats()
4108 p_tx_stats->retry_pkts = __le16_to_cpu(tx_stats->retry_pkts); in ath10k_htt_fetch_peer_stats()
4109 p_tx_stats->failed_pkts = __le16_to_cpu(tx_stats->failed_pkts); in ath10k_htt_fetch_peer_stats()
4110 p_tx_stats->duration = __le16_to_cpu(tx_stats->tx_duration); in ath10k_htt_fetch_peer_stats()
4116 spin_unlock_bh(&ar->data_lock); in ath10k_htt_fetch_peer_stats()
4123 struct ath10k_per_peer_tx_stats *p_tx_stats = &ar->peer_tx_stats; in ath10k_fetch_10_2_tx_stats()
4127 u16 log_type = __le16_to_cpu(hdr->log_type); in ath10k_fetch_10_2_tx_stats()
4133 tx_stats = (struct ath10k_10_2_peer_tx_stats *)((hdr->payload) + in ath10k_fetch_10_2_tx_stats()
4136 if (!tx_stats->tx_ppdu_cnt) in ath10k_fetch_10_2_tx_stats()
4139 peer_id = tx_stats->peer_id; in ath10k_fetch_10_2_tx_stats()
4142 spin_lock_bh(&ar->data_lock); in ath10k_fetch_10_2_tx_stats()
4144 if (!peer || !peer->sta) { in ath10k_fetch_10_2_tx_stats()
4150 sta = peer->sta; in ath10k_fetch_10_2_tx_stats()
4151 for (i = 0; i < tx_stats->tx_ppdu_cnt; i++) { in ath10k_fetch_10_2_tx_stats()
4152 p_tx_stats->succ_bytes = in ath10k_fetch_10_2_tx_stats()
4153 __le16_to_cpu(tx_stats->success_bytes[i]); in ath10k_fetch_10_2_tx_stats()
4154 p_tx_stats->retry_bytes = in ath10k_fetch_10_2_tx_stats()
4155 __le16_to_cpu(tx_stats->retry_bytes[i]); in ath10k_fetch_10_2_tx_stats()
4156 p_tx_stats->failed_bytes = in ath10k_fetch_10_2_tx_stats()
4157 __le16_to_cpu(tx_stats->failed_bytes[i]); in ath10k_fetch_10_2_tx_stats()
4158 p_tx_stats->ratecode = tx_stats->ratecode[i]; in ath10k_fetch_10_2_tx_stats()
4159 p_tx_stats->flags = tx_stats->flags[i]; in ath10k_fetch_10_2_tx_stats()
4160 p_tx_stats->succ_pkts = tx_stats->success_pkts[i]; in ath10k_fetch_10_2_tx_stats()
4161 p_tx_stats->retry_pkts = tx_stats->retry_pkts[i]; in ath10k_fetch_10_2_tx_stats()
4162 p_tx_stats->failed_pkts = tx_stats->failed_pkts[i]; in ath10k_fetch_10_2_tx_stats()
4166 spin_unlock_bh(&ar->data_lock); in ath10k_fetch_10_2_tx_stats()
4172 spin_unlock_bh(&ar->data_lock); in ath10k_fetch_10_2_tx_stats()
4195 spin_lock_bh(&ar->data_lock); in ath10k_htt_rx_sec_ind_handler()
4197 peer = ath10k_peer_find_by_id(ar, __le16_to_cpu(ev->peer_id)); in ath10k_htt_rx_sec_ind_handler()
4200 __le16_to_cpu(ev->peer_id)); in ath10k_htt_rx_sec_ind_handler()
4204 sec_type = MS(ev->flags, HTT_SECURITY_TYPE); in ath10k_htt_rx_sec_ind_handler()
4206 if (ev->flags & HTT_SECURITY_IS_UNICAST) in ath10k_htt_rx_sec_ind_handler()
4211 peer->rx_pn[sec_index].sec_type = sec_type; in ath10k_htt_rx_sec_ind_handler()
4212 peer->rx_pn[sec_index].pn_len = ath10k_htt_rx_pn_len(sec_type); in ath10k_htt_rx_sec_ind_handler()
4214 memset(peer->tids_last_pn_valid, 0, sizeof(peer->tids_last_pn_valid)); in ath10k_htt_rx_sec_ind_handler()
4215 memset(peer->tids_last_pn, 0, sizeof(peer->tids_last_pn)); in ath10k_htt_rx_sec_ind_handler()
4218 spin_unlock_bh(&ar->data_lock); in ath10k_htt_rx_sec_ind_handler()
4223 struct ath10k_htt *htt = &ar->htt; in ath10k_htt_t2h_msg_handler()
4224 struct htt_resp *resp = (struct htt_resp *)skb->data; in ath10k_htt_t2h_msg_handler()
4228 if (!IS_ALIGNED((unsigned long)skb->data, 4)) in ath10k_htt_t2h_msg_handler()
4232 resp->hdr.msg_type); in ath10k_htt_t2h_msg_handler()
4234 if (resp->hdr.msg_type >= ar->htt.t2h_msg_types_max) { in ath10k_htt_t2h_msg_handler()
4236 resp->hdr.msg_type, ar->htt.t2h_msg_types_max); in ath10k_htt_t2h_msg_handler()
4239 type = ar->htt.t2h_msg_types[resp->hdr.msg_type]; in ath10k_htt_t2h_msg_handler()
4243 htt->target_version_major = resp->ver_resp.major; in ath10k_htt_t2h_msg_handler()
4244 htt->target_version_minor = resp->ver_resp.minor; in ath10k_htt_t2h_msg_handler()
4245 complete(&htt->target_version_received); in ath10k_htt_t2h_msg_handler()
4249 if (ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL) { in ath10k_htt_t2h_msg_handler()
4250 ath10k_htt_rx_proc_rx_ind_ll(htt, &resp->rx_ind); in ath10k_htt_t2h_msg_handler()
4252 skb_queue_tail(&htt->rx_indication_head, skb); in ath10k_htt_t2h_msg_handler()
4258 .vdev_id = resp->peer_map.vdev_id, in ath10k_htt_t2h_msg_handler()
4259 .peer_id = __le16_to_cpu(resp->peer_map.peer_id), in ath10k_htt_t2h_msg_handler()
4261 memcpy(ev.addr, resp->peer_map.addr, sizeof(ev.addr)); in ath10k_htt_t2h_msg_handler()
4267 .peer_id = __le16_to_cpu(resp->peer_unmap.peer_id), in ath10k_htt_t2h_msg_handler()
4274 struct ath10k_htt *htt = &ar->htt; in ath10k_htt_t2h_msg_handler()
4275 struct ath10k_htc *htc = &ar->htc; in ath10k_htt_t2h_msg_handler()
4276 struct ath10k_htc_ep *ep = &ar->htc.endpoint[htt->eid]; in ath10k_htt_t2h_msg_handler()
4277 int status = __le32_to_cpu(resp->mgmt_tx_completion.status); in ath10k_htt_t2h_msg_handler()
4278 int info = __le32_to_cpu(resp->mgmt_tx_completion.info); in ath10k_htt_t2h_msg_handler()
4280 tx_done.msdu_id = __le32_to_cpu(resp->mgmt_tx_completion.desc_id); in ath10k_htt_t2h_msg_handler()
4286 ar->wmi.svc_map) && in ath10k_htt_t2h_msg_handler()
4287 (resp->mgmt_tx_completion.flags & in ath10k_htt_t2h_msg_handler()
4302 if (htt->disable_tx_comp) { in ath10k_htt_t2h_msg_handler()
4303 spin_lock_bh(&htc->tx_lock); in ath10k_htt_t2h_msg_handler()
4304 ep->tx_credits++; in ath10k_htt_t2h_msg_handler()
4305 spin_unlock_bh(&htc->tx_lock); in ath10k_htt_t2h_msg_handler()
4310 spin_lock_bh(&htt->tx_lock); in ath10k_htt_t2h_msg_handler()
4312 spin_unlock_bh(&htt->tx_lock); in ath10k_htt_t2h_msg_handler()
4317 ath10k_htt_rx_tx_compl_ind(htt->ar, skb); in ath10k_htt_t2h_msg_handler()
4320 struct ath10k *ar = htt->ar; in ath10k_htt_t2h_msg_handler()
4321 struct htt_security_indication *ev = &resp->security_indication; in ath10k_htt_t2h_msg_handler()
4326 __le16_to_cpu(ev->peer_id), in ath10k_htt_t2h_msg_handler()
4327 !!(ev->flags & HTT_SECURITY_IS_UNICAST), in ath10k_htt_t2h_msg_handler()
4328 MS(ev->flags, HTT_SECURITY_TYPE)); in ath10k_htt_t2h_msg_handler()
4329 complete(&ar->install_key_done); in ath10k_htt_t2h_msg_handler()
4334 skb->data, skb->len); in ath10k_htt_t2h_msg_handler()
4335 atomic_inc(&htt->num_mpdus_ready); in ath10k_htt_t2h_msg_handler()
4338 &resp->rx_frag_ind, in ath10k_htt_t2h_msg_handler()
4344 trace_ath10k_htt_stats(ar, skb->data, skb->len); in ath10k_htt_t2h_msg_handler()
4361 trace_ath10k_htt_pktlog(ar, resp->pktlog_msg.payload, in ath10k_htt_t2h_msg_handler()
4362 skb->len - in ath10k_htt_t2h_msg_handler()
4368 resp->pktlog_msg.payload); in ath10k_htt_t2h_msg_handler()
4378 skb_queue_tail(&htt->rx_in_ord_compl_q, skb); in ath10k_htt_t2h_msg_handler()
4382 struct ath10k_htt *htt = &ar->htt; in ath10k_htt_t2h_msg_handler()
4383 struct ath10k_htc *htc = &ar->htc; in ath10k_htt_t2h_msg_handler()
4384 struct ath10k_htc_ep *ep = &ar->htc.endpoint[htt->eid]; in ath10k_htt_t2h_msg_handler()
4390 htt_credit_delta = -htt_credit_delta; in ath10k_htt_t2h_msg_handler()
4396 if (htt->disable_tx_comp) { in ath10k_htt_t2h_msg_handler()
4397 spin_lock_bh(&htc->tx_lock); in ath10k_htt_t2h_msg_handler()
4398 ep->tx_credits += htt_credit_delta; in ath10k_htt_t2h_msg_handler()
4399 spin_unlock_bh(&htc->tx_lock); in ath10k_htt_t2h_msg_handler()
4402 ep->tx_credits); in ath10k_htt_t2h_msg_handler()
4403 ep->ep_ops.ep_tx_credits(htc->ar); in ath10k_htt_t2h_msg_handler()
4408 u32 phymode = __le32_to_cpu(resp->chan_change.phymode); in ath10k_htt_t2h_msg_handler()
4409 u32 freq = __le32_to_cpu(resp->chan_change.freq); in ath10k_htt_t2h_msg_handler()
4411 ar->tgt_oper_chan = ieee80211_get_channel(ar->hw->wiphy, freq); in ath10k_htt_t2h_msg_handler()
4426 skb_queue_tail(&htt->tx_fetch_ind_q, tx_fetch_ind); in ath10k_htt_t2h_msg_handler()
4441 resp->hdr.msg_type); in ath10k_htt_t2h_msg_handler()
4443 skb->data, skb->len); in ath10k_htt_t2h_msg_handler()
4453 trace_ath10k_htt_pktlog(ar, skb->data, skb->len); in ath10k_htt_rx_pktlog_completion_handler()
4463 if (skb_queue_empty(&ar->htt.rx_msdus_q)) in ath10k_htt_rx_deliver_msdu()
4466 skb = skb_dequeue(&ar->htt.rx_msdus_q); in ath10k_htt_rx_deliver_msdu()
4479 struct ath10k_htt *htt = &ar->htt; in ath10k_htt_rx_hl_indication()
4485 skb = skb_dequeue(&htt->rx_indication_head); in ath10k_htt_rx_hl_indication()
4489 resp = (struct htt_resp *)skb->data; in ath10k_htt_rx_hl_indication()
4492 &resp->rx_ind_hl, in ath10k_htt_rx_hl_indication()
4501 skb_queue_len(&htt->rx_indication_head)); in ath10k_htt_rx_hl_indication()
4509 struct ath10k_htt *htt = &ar->htt; in ath10k_htt_txrx_compl_task()
4528 while ((skb = skb_dequeue(&htt->rx_in_ord_compl_q))) { in ath10k_htt_txrx_compl_task()
4529 spin_lock_bh(&htt->rx_ring.lock); in ath10k_htt_txrx_compl_task()
4531 spin_unlock_bh(&htt->rx_ring.lock); in ath10k_htt_txrx_compl_task()
4534 if (ret == -EIO) { in ath10k_htt_txrx_compl_task()
4540 while (atomic_read(&htt->num_mpdus_ready)) { in ath10k_htt_txrx_compl_task()
4542 if (ret == -EIO) { in ath10k_htt_txrx_compl_task()
4546 atomic_dec(&htt->num_mpdus_ready); in ath10k_htt_txrx_compl_task()
4557 if ((quota < budget) && !kfifo_is_empty(&htt->txdone_fifo)) in ath10k_htt_txrx_compl_task()
4565 while (kfifo_get(&htt->txdone_fifo, &tx_done)) in ath10k_htt_txrx_compl_task()
4570 spin_lock_irqsave(&htt->tx_fetch_ind_q.lock, flags); in ath10k_htt_txrx_compl_task()
4571 skb_queue_splice_init(&htt->tx_fetch_ind_q, &tx_ind_q); in ath10k_htt_txrx_compl_task()
4572 spin_unlock_irqrestore(&htt->tx_fetch_ind_q.lock, flags); in ath10k_htt_txrx_compl_task()
4612 struct ath10k *ar = htt->ar; in ath10k_htt_set_rx_ops()
4614 if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) in ath10k_htt_set_rx_ops()
4615 htt->rx_ops = &htt_rx_ops_hl; in ath10k_htt_set_rx_ops()
4616 else if (ar->hw_params.target_64bit) in ath10k_htt_set_rx_ops()
4617 htt->rx_ops = &htt_rx_ops_64; in ath10k_htt_set_rx_ops()
4619 htt->rx_ops = &htt_rx_ops_32; in ath10k_htt_set_rx_ops()