1 /* SPDX-License-Identifier: BSD-3-Clause-Clear */ 2 /* 3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 4 * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. 5 */ 6 #ifndef ATH12K_DP_RX_H 7 #define ATH12K_DP_RX_H 8 9 #include "core.h" 10 #include "rx_desc.h" 11 #include "debug.h" 12 13 #define DP_MAX_NWIFI_HDR_LEN 30 14 15 struct ath12k_dp_rx_tid { 16 u8 tid; 17 u32 *vaddr; 18 dma_addr_t paddr; 19 u32 size; 20 u32 ba_win_sz; 21 bool active; 22 23 /* Info related to rx fragments */ 24 u32 cur_sn; 25 u16 last_frag_no; 26 u16 rx_frag_bitmap; 27 28 struct sk_buff_head rx_frags; 29 struct hal_reo_dest_ring *dst_ring_desc; 30 31 /* Timer info related to fragments */ 32 struct timer_list frag_timer; 33 struct ath12k_base *ab; 34 }; 35 36 struct ath12k_dp_rx_reo_cache_flush_elem { 37 struct list_head list; 38 struct ath12k_dp_rx_tid data; 39 unsigned long ts; 40 }; 41 42 struct ath12k_dp_rx_reo_cmd { 43 struct list_head list; 44 struct ath12k_dp_rx_tid data; 45 int cmd_num; 46 void (*handler)(struct ath12k_dp *dp, void *ctx, 47 enum hal_reo_cmd_status status); 48 }; 49 50 #define ATH12K_DP_RX_REO_DESC_FREE_THRES 64 51 #define ATH12K_DP_RX_REO_DESC_FREE_TIMEOUT_MS 1000 52 53 enum ath12k_dp_rx_decap_type { 54 DP_RX_DECAP_TYPE_RAW, 55 DP_RX_DECAP_TYPE_NATIVE_WIFI, 56 DP_RX_DECAP_TYPE_ETHERNET2_DIX, 57 DP_RX_DECAP_TYPE_8023, 58 }; 59 60 struct ath12k_dp_rx_rfc1042_hdr { 61 u8 llc_dsap; 62 u8 llc_ssap; 63 u8 llc_ctrl; 64 u8 snap_oui[3]; 65 __be16 snap_type; 66 } __packed; 67 68 static inline u32 ath12k_he_gi_to_nl80211_he_gi(u8 sgi) 69 { 70 u32 ret = 0; 71 72 switch (sgi) { 73 case RX_MSDU_START_SGI_0_8_US: 74 ret = NL80211_RATE_INFO_HE_GI_0_8; 75 break; 76 case RX_MSDU_START_SGI_1_6_US: 77 ret = NL80211_RATE_INFO_HE_GI_1_6; 78 break; 79 case RX_MSDU_START_SGI_3_2_US: 80 ret = NL80211_RATE_INFO_HE_GI_3_2; 81 break; 82 default: 83 ret = NL80211_RATE_INFO_HE_GI_0_8; 84 break; 85 } 86 87 return ret; 88 } 89 90 int ath12k_dp_rx_ampdu_start(struct ath12k *ar, 91 struct ieee80211_ampdu_params *params, 92 u8 link_id); 93 int ath12k_dp_rx_ampdu_stop(struct ath12k *ar, 94 struct ieee80211_ampdu_params *params, 95 u8 link_id); 96 int ath12k_dp_rx_peer_pn_replay_config(struct ath12k_link_vif *arvif, 97 const u8 *peer_addr, 98 enum set_key_cmd key_cmd, 99 struct ieee80211_key_conf *key); 100 void ath12k_dp_rx_peer_tid_cleanup(struct ath12k *ar, struct ath12k_peer *peer); 101 void ath12k_dp_rx_peer_tid_delete(struct ath12k *ar, 102 struct ath12k_peer *peer, u8 tid); 103 int ath12k_dp_rx_peer_tid_setup(struct ath12k *ar, const u8 *peer_mac, int vdev_id, 104 u8 tid, u32 ba_win_sz, u16 ssn, 105 enum hal_pn_type pn_type); 106 void ath12k_dp_htt_htc_t2h_msg_handler(struct ath12k_base *ab, 107 struct sk_buff *skb); 108 int ath12k_dp_rx_pdev_reo_setup(struct ath12k_base *ab); 109 void ath12k_dp_rx_pdev_reo_cleanup(struct ath12k_base *ab); 110 int ath12k_dp_rx_htt_setup(struct ath12k_base *ab); 111 int ath12k_dp_rx_alloc(struct ath12k_base *ab); 112 void ath12k_dp_rx_free(struct ath12k_base *ab); 113 int ath12k_dp_rx_pdev_alloc(struct ath12k_base *ab, int pdev_idx); 114 void ath12k_dp_rx_pdev_free(struct ath12k_base *ab, int pdev_idx); 115 void ath12k_dp_rx_reo_cmd_list_cleanup(struct ath12k_base *ab); 116 void ath12k_dp_rx_process_reo_status(struct ath12k_base *ab); 117 int ath12k_dp_rx_process_wbm_err(struct ath12k_base *ab, 118 struct napi_struct *napi, int budget); 119 int ath12k_dp_rx_process_err(struct ath12k_base *ab, struct napi_struct *napi, 120 int budget); 121 int ath12k_dp_rx_process(struct ath12k_base *ab, int mac_id, 122 struct napi_struct *napi, 123 int budget); 124 int ath12k_dp_rx_bufs_replenish(struct ath12k_base *ab, 125 struct dp_rxdma_ring *rx_ring, 126 struct list_head *used_list, 127 int req_entries); 128 int ath12k_dp_rx_pdev_mon_attach(struct ath12k *ar); 129 int ath12k_dp_rx_peer_frag_setup(struct ath12k *ar, const u8 *peer_mac, int vdev_id); 130 131 u8 ath12k_dp_rx_h_l3pad(struct ath12k_base *ab, 132 struct hal_rx_desc *desc); 133 struct ath12k_peer * 134 ath12k_dp_rx_h_find_peer(struct ath12k_base *ab, struct sk_buff *msdu); 135 u8 ath12k_dp_rx_h_decap_type(struct ath12k_base *ab, 136 struct hal_rx_desc *desc); 137 u32 ath12k_dp_rx_h_mpdu_err(struct ath12k_base *ab, 138 struct hal_rx_desc *desc); 139 void ath12k_dp_rx_h_ppdu(struct ath12k *ar, struct hal_rx_desc *rx_desc, 140 struct ieee80211_rx_status *rx_status); 141 int ath12k_dp_rxdma_ring_sel_config_qcn9274(struct ath12k_base *ab); 142 int ath12k_dp_rxdma_ring_sel_config_wcn7850(struct ath12k_base *ab); 143 144 int ath12k_dp_htt_tlv_iter(struct ath12k_base *ab, const void *ptr, size_t len, 145 int (*iter)(struct ath12k_base *ar, u16 tag, u16 len, 146 const void *ptr, void *data), 147 void *data); 148 #endif /* ATH12K_DP_RX_H */ 149