diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/htt.h')
| -rw-r--r-- | drivers/net/wireless/ath/ath10k/htt.h | 60 | 
1 files changed, 38 insertions, 22 deletions
diff --git a/drivers/net/wireless/ath/ath10k/htt.h b/drivers/net/wireless/ath/ath10k/htt.h index 318be4629cd..9a263462c79 100644 --- a/drivers/net/wireless/ath/ath10k/htt.h +++ b/drivers/net/wireless/ath/ath10k/htt.h @@ -19,13 +19,13 @@  #define _HTT_H_  #include <linux/bug.h> +#include <linux/interrupt.h> +#include <linux/dmapool.h> +#include <net/mac80211.h>  #include "htc.h"  #include "rx_desc.h" -#define HTT_CURRENT_VERSION_MAJOR	2 -#define HTT_CURRENT_VERSION_MINOR	1 -  enum htt_dbg_stats_type {  	HTT_DBG_STATS_WAL_PDEV_TXRX = 1 << 0,  	HTT_DBG_STATS_RX_REORDER    = 1 << 1, @@ -45,6 +45,9 @@ enum htt_h2t_msg_type { /* host-to-target */  	HTT_H2T_MSG_TYPE_SYNC               = 4,  	HTT_H2T_MSG_TYPE_AGGR_CFG           = 5,  	HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG = 6, + +	/* This command is used for sending management frames in HTT < 3.0. +	 * HTT >= 3.0 uses TX_FRM for everything. */  	HTT_H2T_MSG_TYPE_MGMT_TX            = 7,  	HTT_H2T_NUM_MSGS /* keep this last */ @@ -1170,18 +1173,12 @@ struct htt_peer_unmap_event {  	u16 peer_id;  }; -struct htt_rx_info { -	struct sk_buff *skb; -	enum htt_rx_mpdu_status status; -	enum htt_rx_mpdu_encrypt_type encrypt_type; -	s8 signal; -	struct { -		u8 info0; -		u32 info1; -		u32 info2; -	} rate; -	bool fcs_err; -}; +struct ath10k_htt_txbuf { +	struct htt_data_tx_desc_frag frags[2]; +	struct ath10k_htc_hdr htc_hdr; +	struct htt_cmd_hdr cmd_hdr; +	struct htt_data_tx_desc cmd_tx; +} __packed;  struct ath10k_htt {  	struct ath10k *ar; @@ -1264,10 +1261,21 @@ struct ath10k_htt {  	struct sk_buff **pending_tx;  	unsigned long *used_msdu_ids; /* bitmap */  	wait_queue_head_t empty_tx_wq; +	struct dma_pool *tx_pool;  	/* set if host-fw communication goes haywire  	 * used to avoid further failures */  	bool rx_confused; +	struct tasklet_struct rx_replenish_task; + +	/* This is used to group tx/rx completions separately and process them +	 * in batches to reduce cache stalls */ +	struct tasklet_struct txrx_compl_task; +	struct sk_buff_head tx_compl_q; +	struct sk_buff_head rx_compl_q; + +	/* rx_status template */ +	struct ieee80211_rx_status rx_status;  };  #define RX_HTT_HDR_STATUS_LEN 64 @@ -1308,6 +1316,10 @@ struct htt_rx_desc {  #define HTT_RX_BUF_SIZE 1920  #define HTT_RX_MSDU_SIZE (HTT_RX_BUF_SIZE - (int)sizeof(struct htt_rx_desc)) +/* Refill a bunch of RX buffers for each refill round so that FW/HW can handle + * aggregated traffic more nicely. */ +#define ATH10K_HTT_MAX_NUM_REFILL 16 +  /*   * DMA_MAP expects the buffer to be an integral number of cache lines.   * Rather than checking the actual cache line size, this code makes a @@ -1316,17 +1328,20 @@ struct htt_rx_desc {  #define HTT_LOG2_MAX_CACHE_LINE_SIZE 7	/* 2^7 = 128 */  #define HTT_MAX_CACHE_LINE_SIZE_MASK ((1 << HTT_LOG2_MAX_CACHE_LINE_SIZE) - 1) -int ath10k_htt_attach(struct ath10k *ar); -int ath10k_htt_attach_target(struct ath10k_htt *htt); -void ath10k_htt_detach(struct ath10k_htt *htt); +int ath10k_htt_connect(struct ath10k_htt *htt); +int ath10k_htt_init(struct ath10k *ar); +int ath10k_htt_setup(struct ath10k_htt *htt); + +int ath10k_htt_tx_alloc(struct ath10k_htt *htt); +void ath10k_htt_tx_free(struct ath10k_htt *htt); + +int ath10k_htt_rx_alloc(struct ath10k_htt *htt); +void ath10k_htt_rx_free(struct ath10k_htt *htt); -int ath10k_htt_tx_attach(struct ath10k_htt *htt); -void ath10k_htt_tx_detach(struct ath10k_htt *htt); -int ath10k_htt_rx_attach(struct ath10k_htt *htt); -void ath10k_htt_rx_detach(struct ath10k_htt *htt);  void ath10k_htt_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb);  void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb);  int ath10k_htt_h2t_ver_req_msg(struct ath10k_htt *htt); +int ath10k_htt_h2t_stats_req(struct ath10k_htt *htt, u8 mask, u64 cookie);  int ath10k_htt_send_rx_ring_cfg_ll(struct ath10k_htt *htt);  void __ath10k_htt_tx_dec_pending(struct ath10k_htt *htt); @@ -1334,4 +1349,5 @@ int ath10k_htt_tx_alloc_msdu_id(struct ath10k_htt *htt);  void ath10k_htt_tx_free_msdu_id(struct ath10k_htt *htt, u16 msdu_id);  int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *);  int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *); +  #endif  | 
