#include "core.h"
#include "htc.h"
#include "htt.h"
#include "txrx.h"
#include "debug.h"
#include "trace.h"
#include "mac.h"
#include <linux/log2.h>
#include <linux/bitfield.h>
#define HTT_RX_RING_REFILL_RETRY_MS …
#define HTT_RX_RING_REFILL_RESCHED_MS …
#define HTT_RX_BUF_TO_RX_DESC(hw, buf) …
static int ath10k_htt_rx_get_csum_state(struct ath10k_hw_params *hw, struct sk_buff *skb);
static struct sk_buff *
ath10k_htt_rx_find_skb_paddr(struct ath10k *ar, u64 paddr)
{ … }
static void ath10k_htt_rx_ring_free(struct ath10k_htt *htt)
{ … }
static size_t ath10k_htt_get_rx_ring_size_32(struct ath10k_htt *htt)
{ … }
static size_t ath10k_htt_get_rx_ring_size_64(struct ath10k_htt *htt)
{ … }
static void ath10k_htt_config_paddrs_ring_32(struct ath10k_htt *htt,
void *vaddr)
{ … }
static void ath10k_htt_config_paddrs_ring_64(struct ath10k_htt *htt,
void *vaddr)
{ … }
static void ath10k_htt_set_paddrs_ring_32(struct ath10k_htt *htt,
dma_addr_t paddr, int idx)
{ … }
static void ath10k_htt_set_paddrs_ring_64(struct ath10k_htt *htt,
dma_addr_t paddr, int idx)
{ … }
static void ath10k_htt_reset_paddrs_ring_32(struct ath10k_htt *htt, int idx)
{ … }
static void ath10k_htt_reset_paddrs_ring_64(struct ath10k_htt *htt, int idx)
{ … }
static void *ath10k_htt_get_vaddr_ring_32(struct ath10k_htt *htt)
{ … }
static void *ath10k_htt_get_vaddr_ring_64(struct ath10k_htt *htt)
{ … }
static int __ath10k_htt_rx_ring_fill_n(struct ath10k_htt *htt, int num)
{ … }
static int ath10k_htt_rx_ring_fill_n(struct ath10k_htt *htt, int num)
{ … }
static void ath10k_htt_rx_msdu_buff_replenish(struct ath10k_htt *htt)
{ … }
static void ath10k_htt_rx_ring_refill_retry(struct timer_list *t)
{ … }
int ath10k_htt_rx_ring_refill(struct ath10k *ar)
{ … }
void ath10k_htt_rx_free(struct ath10k_htt *htt)
{ … }
static inline struct sk_buff *ath10k_htt_rx_netbuf_pop(struct ath10k_htt *htt)
{ … }
static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
struct sk_buff_head *amsdu)
{ … }
static struct sk_buff *ath10k_htt_rx_pop_paddr(struct ath10k_htt *htt,
u64 paddr)
{ … }
static inline void ath10k_htt_append_frag_list(struct sk_buff *skb_head,
struct sk_buff *frag_list,
unsigned int frag_len)
{ … }
static int ath10k_htt_rx_handle_amsdu_mon_32(struct ath10k_htt *htt,
struct sk_buff *msdu,
struct htt_rx_in_ord_msdu_desc **msdu_desc)
{ … }
static int
ath10k_htt_rx_handle_amsdu_mon_64(struct ath10k_htt *htt,
struct sk_buff *msdu,
struct htt_rx_in_ord_msdu_desc_ext **msdu_desc)
{ … }
static int ath10k_htt_rx_pop_paddr32_list(struct ath10k_htt *htt,
struct htt_rx_in_ord_ind *ev,
struct sk_buff_head *list)
{ … }
static int ath10k_htt_rx_pop_paddr64_list(struct ath10k_htt *htt,
struct htt_rx_in_ord_ind *ev,
struct sk_buff_head *list)
{ … }
int ath10k_htt_rx_alloc(struct ath10k_htt *htt)
{ … }
static int ath10k_htt_rx_crypto_param_len(struct ath10k *ar,
enum htt_rx_mpdu_encrypt_type type)
{ … }
#define MICHAEL_MIC_LEN …
static int ath10k_htt_rx_crypto_mic_len(struct ath10k *ar,
enum htt_rx_mpdu_encrypt_type type)
{ … }
static int ath10k_htt_rx_crypto_icv_len(struct ath10k *ar,
enum htt_rx_mpdu_encrypt_type type)
{ … }
struct amsdu_subframe_hdr { … } __packed;
#define GROUP_ID_IS_SU_MIMO(x) …
static inline u8 ath10k_bw_to_mac80211_bw(u8 bw)
{ … }
static void ath10k_htt_rx_h_rates(struct ath10k *ar,
struct ieee80211_rx_status *status,
struct htt_rx_desc *rxd)
{ … }
static struct ieee80211_channel *
ath10k_htt_rx_h_peer_channel(struct ath10k *ar, struct htt_rx_desc *rxd)
{ … }
static struct ieee80211_channel *
ath10k_htt_rx_h_vdev_channel(struct ath10k *ar, u32 vdev_id)
{ … }
static void
ath10k_htt_rx_h_any_chan_iter(struct ieee80211_hw *hw,
struct ieee80211_chanctx_conf *conf,
void *data)
{ … }
static struct ieee80211_channel *
ath10k_htt_rx_h_any_channel(struct ath10k *ar)
{ … }
static bool ath10k_htt_rx_h_channel(struct ath10k *ar,
struct ieee80211_rx_status *status,
struct htt_rx_desc *rxd,
u32 vdev_id)
{ … }
static void ath10k_htt_rx_h_signal(struct ath10k *ar,
struct ieee80211_rx_status *status,
struct htt_rx_desc *rxd)
{ … }
static void ath10k_htt_rx_h_mactime(struct ath10k *ar,
struct ieee80211_rx_status *status,
struct htt_rx_desc *rxd)
{ … }
static void ath10k_htt_rx_h_ppdu(struct ath10k *ar,
struct sk_buff_head *amsdu,
struct ieee80211_rx_status *status,
u32 vdev_id)
{ … }
static const char * const tid_to_ac[] = …;
static char *ath10k_get_tid(struct ieee80211_hdr *hdr, char *out, size_t size)
{ … }
static void ath10k_htt_rx_h_queue_msdu(struct ath10k *ar,
struct ieee80211_rx_status *rx_status,
struct sk_buff *skb)
{ … }
static void ath10k_process_rx(struct ath10k *ar, struct sk_buff *skb)
{ … }
static int ath10k_htt_rx_nwifi_hdrlen(struct ath10k *ar,
struct ieee80211_hdr *hdr)
{ … }
static void ath10k_htt_rx_h_undecap_raw(struct ath10k *ar,
struct sk_buff *msdu,
struct ieee80211_rx_status *status,
enum htt_rx_mpdu_encrypt_type enctype,
bool is_decrypted,
const u8 first_hdr[64])
{ … }
static void ath10k_htt_rx_h_undecap_nwifi(struct ath10k *ar,
struct sk_buff *msdu,
struct ieee80211_rx_status *status,
const u8 first_hdr[64],
enum htt_rx_mpdu_encrypt_type enctype)
{ … }
static void *ath10k_htt_rx_h_find_rfc1042(struct ath10k *ar,
struct sk_buff *msdu,
enum htt_rx_mpdu_encrypt_type enctype)
{ … }
static void ath10k_htt_rx_h_undecap_eth(struct ath10k *ar,
struct sk_buff *msdu,
struct ieee80211_rx_status *status,
const u8 first_hdr[64],
enum htt_rx_mpdu_encrypt_type enctype)
{ … }
static void ath10k_htt_rx_h_undecap_snap(struct ath10k *ar,
struct sk_buff *msdu,
struct ieee80211_rx_status *status,
const u8 first_hdr[64],
enum htt_rx_mpdu_encrypt_type enctype)
{ … }
static void ath10k_htt_rx_h_undecap(struct ath10k *ar,
struct sk_buff *msdu,
struct ieee80211_rx_status *status,
u8 first_hdr[64],
enum htt_rx_mpdu_encrypt_type enctype,
bool is_decrypted)
{ … }
static int ath10k_htt_rx_get_csum_state(struct ath10k_hw_params *hw, struct sk_buff *skb)
{ … }
static void ath10k_htt_rx_h_csum_offload(struct ath10k_hw_params *hw,
struct sk_buff *msdu)
{ … }
static u64 ath10k_htt_rx_h_get_pn(struct ath10k *ar, struct sk_buff *skb,
enum htt_rx_mpdu_encrypt_type enctype)
{ … }
static bool ath10k_htt_rx_h_frag_multicast_check(struct ath10k *ar,
struct sk_buff *skb)
{ … }
static bool ath10k_htt_rx_h_frag_pn_check(struct ath10k *ar,
struct sk_buff *skb,
u16 peer_id,
enum htt_rx_mpdu_encrypt_type enctype)
{ … }
static void ath10k_htt_rx_h_mpdu(struct ath10k *ar,
struct sk_buff_head *amsdu,
struct ieee80211_rx_status *status,
bool fill_crypt_header,
u8 *rx_hdr,
enum ath10k_pkt_rx_err *err,
u16 peer_id,
bool frag)
{ … }
static void ath10k_htt_rx_h_enqueue(struct ath10k *ar,
struct sk_buff_head *amsdu,
struct ieee80211_rx_status *status)
{ … }
static int ath10k_unchain_msdu(struct sk_buff_head *amsdu,
unsigned long *unchain_cnt)
{ … }
static void ath10k_htt_rx_h_unchain(struct ath10k *ar,
struct sk_buff_head *amsdu,
unsigned long *drop_cnt,
unsigned long *unchain_cnt)
{ … }
static bool ath10k_htt_rx_validate_amsdu(struct ath10k *ar,
struct sk_buff_head *amsdu)
{ … }
static bool ath10k_htt_rx_amsdu_allowed(struct ath10k *ar,
struct sk_buff_head *amsdu,
struct ieee80211_rx_status *rx_status)
{ … }
static void ath10k_htt_rx_h_filter(struct ath10k *ar,
struct sk_buff_head *amsdu,
struct ieee80211_rx_status *rx_status,
unsigned long *drop_cnt)
{ … }
static int ath10k_htt_rx_handle_amsdu(struct ath10k_htt *htt)
{ … }
static void ath10k_htt_rx_mpdu_desc_pn_hl(struct htt_hl_rx_desc *rx_desc,
union htt_rx_pn_t *pn,
int pn_len_bits)
{ … }
static bool ath10k_htt_rx_pn_cmp48(union htt_rx_pn_t *new_pn,
union htt_rx_pn_t *old_pn)
{ … }
static bool ath10k_htt_rx_pn_check_replay_hl(struct ath10k *ar,
struct ath10k_peer *peer,
struct htt_rx_indication_hl *rx)
{ … }
static bool ath10k_htt_rx_proc_rx_ind_hl(struct ath10k_htt *htt,
struct htt_rx_indication_hl *rx,
struct sk_buff *skb,
enum htt_rx_pn_check_type check_pn_type,
enum htt_rx_tkip_demic_type tkip_mic_type)
{ … }
static int ath10k_htt_rx_frag_tkip_decap_nomic(struct sk_buff *skb,
u16 head_len,
u16 hdr_len)
{ … }
static int ath10k_htt_rx_frag_tkip_decap_withmic(struct sk_buff *skb,
u16 head_len,
u16 hdr_len)
{ … }
static int ath10k_htt_rx_frag_ccmp_decap(struct sk_buff *skb,
u16 head_len,
u16 hdr_len)
{ … }
static int ath10k_htt_rx_frag_wep_decap(struct sk_buff *skb,
u16 head_len,
u16 hdr_len)
{ … }
static bool ath10k_htt_rx_proc_rx_frag_ind_hl(struct ath10k_htt *htt,
struct htt_rx_fragment_indication *rx,
struct sk_buff *skb)
{ … }
static void ath10k_htt_rx_proc_rx_ind_ll(struct ath10k_htt *htt,
struct htt_rx_indication *rx)
{ … }
static void ath10k_htt_rx_tx_compl_ind(struct ath10k *ar,
struct sk_buff *skb)
{ … }
static void ath10k_htt_rx_addba(struct ath10k *ar, struct htt_resp *resp)
{ … }
static void ath10k_htt_rx_delba(struct ath10k *ar, struct htt_resp *resp)
{ … }
static int ath10k_htt_rx_extract_amsdu(struct ath10k_hw_params *hw,
struct sk_buff_head *list,
struct sk_buff_head *amsdu)
{ … }
static void ath10k_htt_rx_h_rx_offload_prot(struct ieee80211_rx_status *status,
struct sk_buff *skb)
{ … }
static void ath10k_htt_rx_h_rx_offload(struct ath10k *ar,
struct sk_buff_head *list)
{ … }
static int ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb)
{ … }
static void ath10k_htt_rx_tx_fetch_resp_id_confirm(struct ath10k *ar,
const __le32 *resp_ids,
int num_resp_ids)
{ … }
static void ath10k_htt_rx_tx_fetch_ind(struct ath10k *ar, struct sk_buff *skb)
{ … }
static void ath10k_htt_rx_tx_fetch_confirm(struct ath10k *ar,
struct sk_buff *skb)
{ … }
static void ath10k_htt_rx_tx_mode_switch_ind(struct ath10k *ar,
struct sk_buff *skb)
{ … }
void ath10k_htt_htc_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
{ … }
static inline s8 ath10k_get_legacy_rate_idx(struct ath10k *ar, u8 rate)
{ … }
static void
ath10k_accumulate_per_peer_tx_stats(struct ath10k *ar,
struct ath10k_sta *arsta,
struct ath10k_per_peer_tx_stats *pstats,
s8 legacy_rate_idx)
{ … }
static void
ath10k_update_per_peer_tx_stats(struct ath10k *ar,
struct ieee80211_sta *sta,
struct ath10k_per_peer_tx_stats *peer_stats)
{ … }
static void ath10k_htt_fetch_peer_stats(struct ath10k *ar,
struct sk_buff *skb)
{ … }
static void ath10k_fetch_10_2_tx_stats(struct ath10k *ar, u8 *data)
{ … }
static int ath10k_htt_rx_pn_len(enum htt_security_types sec_type)
{ … }
static void ath10k_htt_rx_sec_ind_handler(struct ath10k *ar,
struct htt_security_indication *ev)
{ … }
bool ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
{ … }
EXPORT_SYMBOL(…);
void ath10k_htt_rx_pktlog_completion_handler(struct ath10k *ar,
struct sk_buff *skb)
{ … }
EXPORT_SYMBOL(…);
static int ath10k_htt_rx_deliver_msdu(struct ath10k *ar, int quota, int budget)
{ … }
int ath10k_htt_rx_hl_indication(struct ath10k *ar, int budget)
{ … }
EXPORT_SYMBOL(…);
int ath10k_htt_txrx_compl_task(struct ath10k *ar, int budget)
{ … }
EXPORT_SYMBOL(…);
static const struct ath10k_htt_rx_ops htt_rx_ops_32 = …;
static const struct ath10k_htt_rx_ops htt_rx_ops_64 = …;
static const struct ath10k_htt_rx_ops htt_rx_ops_hl = …;
void ath10k_htt_set_rx_ops(struct ath10k_htt *htt)
{ … }