146 lines
4.4 KiB
C
146 lines
4.4 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
|
/*
|
|
* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
|
|
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
#ifndef ATH12K_DP_RX_H
|
|
#define ATH12K_DP_RX_H
|
|
|
|
#include "core.h"
|
|
#include "rx_desc.h"
|
|
#include "debug.h"
|
|
|
|
#define DP_MAX_NWIFI_HDR_LEN 30
|
|
|
|
struct ath12k_dp_rx_tid {
|
|
u8 tid;
|
|
u32 *vaddr;
|
|
dma_addr_t paddr;
|
|
u32 size;
|
|
u32 ba_win_sz;
|
|
bool active;
|
|
|
|
/* Info related to rx fragments */
|
|
u32 cur_sn;
|
|
u16 last_frag_no;
|
|
u16 rx_frag_bitmap;
|
|
|
|
struct sk_buff_head rx_frags;
|
|
struct hal_reo_dest_ring *dst_ring_desc;
|
|
|
|
/* Timer info related to fragments */
|
|
struct timer_list frag_timer;
|
|
struct ath12k_base *ab;
|
|
};
|
|
|
|
struct ath12k_dp_rx_reo_cache_flush_elem {
|
|
struct list_head list;
|
|
struct ath12k_dp_rx_tid data;
|
|
unsigned long ts;
|
|
};
|
|
|
|
struct ath12k_dp_rx_reo_cmd {
|
|
struct list_head list;
|
|
struct ath12k_dp_rx_tid data;
|
|
int cmd_num;
|
|
void (*handler)(struct ath12k_dp *dp, void *ctx,
|
|
enum hal_reo_cmd_status status);
|
|
};
|
|
|
|
#define ATH12K_DP_RX_REO_DESC_FREE_THRES 64
|
|
#define ATH12K_DP_RX_REO_DESC_FREE_TIMEOUT_MS 1000
|
|
|
|
enum ath12k_dp_rx_decap_type {
|
|
DP_RX_DECAP_TYPE_RAW,
|
|
DP_RX_DECAP_TYPE_NATIVE_WIFI,
|
|
DP_RX_DECAP_TYPE_ETHERNET2_DIX,
|
|
DP_RX_DECAP_TYPE_8023,
|
|
};
|
|
|
|
struct ath12k_dp_rx_rfc1042_hdr {
|
|
u8 llc_dsap;
|
|
u8 llc_ssap;
|
|
u8 llc_ctrl;
|
|
u8 snap_oui[3];
|
|
__be16 snap_type;
|
|
} __packed;
|
|
|
|
static inline u32 ath12k_he_gi_to_nl80211_he_gi(u8 sgi)
|
|
{
|
|
u32 ret = 0;
|
|
|
|
switch (sgi) {
|
|
case RX_MSDU_START_SGI_0_8_US:
|
|
ret = NL80211_RATE_INFO_HE_GI_0_8;
|
|
break;
|
|
case RX_MSDU_START_SGI_1_6_US:
|
|
ret = NL80211_RATE_INFO_HE_GI_1_6;
|
|
break;
|
|
case RX_MSDU_START_SGI_3_2_US:
|
|
ret = NL80211_RATE_INFO_HE_GI_3_2;
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ath12k_dp_rx_ampdu_start(struct ath12k *ar,
|
|
struct ieee80211_ampdu_params *params);
|
|
int ath12k_dp_rx_ampdu_stop(struct ath12k *ar,
|
|
struct ieee80211_ampdu_params *params);
|
|
int ath12k_dp_rx_peer_pn_replay_config(struct ath12k_vif *arvif,
|
|
const u8 *peer_addr,
|
|
enum set_key_cmd key_cmd,
|
|
struct ieee80211_key_conf *key);
|
|
void ath12k_dp_rx_peer_tid_cleanup(struct ath12k *ar, struct ath12k_peer *peer);
|
|
void ath12k_dp_rx_peer_tid_delete(struct ath12k *ar,
|
|
struct ath12k_peer *peer, u8 tid);
|
|
int ath12k_dp_rx_peer_tid_setup(struct ath12k *ar, const u8 *peer_mac, int vdev_id,
|
|
u8 tid, u32 ba_win_sz, u16 ssn,
|
|
enum hal_pn_type pn_type);
|
|
void ath12k_dp_htt_htc_t2h_msg_handler(struct ath12k_base *ab,
|
|
struct sk_buff *skb);
|
|
int ath12k_dp_rx_pdev_reo_setup(struct ath12k_base *ab);
|
|
void ath12k_dp_rx_pdev_reo_cleanup(struct ath12k_base *ab);
|
|
int ath12k_dp_rx_htt_setup(struct ath12k_base *ab);
|
|
int ath12k_dp_rx_alloc(struct ath12k_base *ab);
|
|
void ath12k_dp_rx_free(struct ath12k_base *ab);
|
|
int ath12k_dp_rx_pdev_alloc(struct ath12k_base *ab, int pdev_idx);
|
|
void ath12k_dp_rx_pdev_free(struct ath12k_base *ab, int pdev_idx);
|
|
void ath12k_dp_rx_reo_cmd_list_cleanup(struct ath12k_base *ab);
|
|
void ath12k_dp_rx_process_reo_status(struct ath12k_base *ab);
|
|
int ath12k_dp_rx_process_wbm_err(struct ath12k_base *ab,
|
|
struct napi_struct *napi, int budget);
|
|
int ath12k_dp_rx_process_err(struct ath12k_base *ab, struct napi_struct *napi,
|
|
int budget);
|
|
int ath12k_dp_rx_process(struct ath12k_base *ab, int mac_id,
|
|
struct napi_struct *napi,
|
|
int budget);
|
|
int ath12k_dp_rx_bufs_replenish(struct ath12k_base *ab, int mac_id,
|
|
struct dp_rxdma_ring *rx_ring,
|
|
int req_entries,
|
|
enum hal_rx_buf_return_buf_manager mgr,
|
|
bool hw_cc);
|
|
int ath12k_dp_rx_pdev_mon_attach(struct ath12k *ar);
|
|
int ath12k_dp_rx_peer_frag_setup(struct ath12k *ar, const u8 *peer_mac, int vdev_id);
|
|
|
|
int ath12k_dp_rx_pktlog_start(struct ath12k_base *ab);
|
|
int ath12k_dp_rx_pktlog_stop(struct ath12k_base *ab, bool stop_timer);
|
|
u8 ath12k_dp_rx_h_l3pad(struct ath12k_base *ab,
|
|
struct hal_rx_desc *desc);
|
|
struct ath12k_peer *
|
|
ath12k_dp_rx_h_find_peer(struct ath12k_base *ab, struct sk_buff *msdu);
|
|
u8 ath12k_dp_rx_h_decap_type(struct ath12k_base *ab,
|
|
struct hal_rx_desc *desc);
|
|
u32 ath12k_dp_rx_h_mpdu_err(struct ath12k_base *ab,
|
|
struct hal_rx_desc *desc);
|
|
void ath12k_dp_rx_h_ppdu(struct ath12k *ar, struct hal_rx_desc *rx_desc,
|
|
struct ieee80211_rx_status *rx_status);
|
|
struct ath12k_peer *
|
|
ath12k_dp_rx_h_find_peer(struct ath12k_base *ab, struct sk_buff *msdu);
|
|
|
|
int ath12k_dp_rxdma_ring_sel_config_qcn9274(struct ath12k_base *ab);
|
|
int ath12k_dp_rxdma_ring_sel_config_wcn7850(struct ath12k_base *ab);
|
|
|
|
#endif /* ATH12K_DP_RX_H */
|