diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/core.h')
| -rw-r--r-- | drivers/net/wireless/ath/ath10k/core.h | 211 | 
1 files changed, 159 insertions, 52 deletions
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h index e4bba563ed4..68ceef61933 100644 --- a/drivers/net/wireless/ath/ath10k/core.h +++ b/drivers/net/wireless/ath/ath10k/core.h @@ -30,6 +30,7 @@  #include "wmi.h"  #include "../ath.h"  #include "../regd.h" +#include "../dfs_pattern_detector.h"  #define MS(_v, _f) (((_v) & _f##_MASK) >> _f##_LSB)  #define SM(_v, _f) (((_v) << _f##_LSB) & _f##_MASK) @@ -43,27 +44,37 @@  /* Antenna noise floor */  #define ATH10K_DEFAULT_NOISE_FLOOR -95 +#define ATH10K_MAX_NUM_MGMT_PENDING 128 + +/* number of failed packets */ +#define ATH10K_KICKOUT_THRESHOLD 50 + +/* + * Use insanely high numbers to make sure that the firmware implementation + * won't start, we have the same functionality already in hostapd. Unit + * is seconds. + */ +#define ATH10K_KEEPALIVE_MIN_IDLE 3747 +#define ATH10K_KEEPALIVE_MAX_IDLE 3895 +#define ATH10K_KEEPALIVE_MAX_UNRESPONSIVE 3900 +  struct ath10k;  struct ath10k_skb_cb {  	dma_addr_t paddr; -	bool is_mapped; -	bool is_aborted; +	u8 vdev_id;  	struct { -		u8 vdev_id; -		u16 msdu_id;  		u8 tid;  		bool is_offchan; -		bool is_conf; -		bool discard; -		bool no_ack; -		u8 refcount; -		struct sk_buff *txfrag; -		struct sk_buff *msdu; +		struct ath10k_htt_txbuf *txbuf; +		u32 txbuf_paddr;  	} __packed htt; -	/* 4 bytes left on 64bit arch */ +	struct { +		bool dtim_zero; +		bool deliver_cab; +	} bcn;  } __packed;  static inline struct ath10k_skb_cb *ATH10K_SKB_CB(struct sk_buff *skb) @@ -73,32 +84,6 @@ static inline struct ath10k_skb_cb *ATH10K_SKB_CB(struct sk_buff *skb)  	return (struct ath10k_skb_cb *)&IEEE80211_SKB_CB(skb)->driver_data;  } -static inline int ath10k_skb_map(struct device *dev, struct sk_buff *skb) -{ -	if (ATH10K_SKB_CB(skb)->is_mapped) -		return -EINVAL; - -	ATH10K_SKB_CB(skb)->paddr = dma_map_single(dev, skb->data, skb->len, -						   DMA_TO_DEVICE); - -	if (unlikely(dma_mapping_error(dev, ATH10K_SKB_CB(skb)->paddr))) -		return -EIO; - -	ATH10K_SKB_CB(skb)->is_mapped = true; -	return 0; -} - -static inline int ath10k_skb_unmap(struct device *dev, struct sk_buff *skb) -{ -	if (!ATH10K_SKB_CB(skb)->is_mapped) -		return -EINVAL; - -	dma_unmap_single(dev, ATH10K_SKB_CB(skb)->paddr, skb->len, -			 DMA_TO_DEVICE); -	ATH10K_SKB_CB(skb)->is_mapped = false; -	return 0; -} -  static inline u32 host_interest_item_address(u32 item_offset)  {  	return QCA988X_HOST_INTEREST_ADDRESS + item_offset; @@ -108,21 +93,33 @@ struct ath10k_bmi {  	bool done_sent;  }; +#define ATH10K_MAX_MEM_REQS 16 + +struct ath10k_mem_chunk { +	void *vaddr; +	dma_addr_t paddr; +	u32 len; +	u32 req_id; +}; +  struct ath10k_wmi {  	enum ath10k_htc_ep_id eid;  	struct completion service_ready;  	struct completion unified_ready; -	atomic_t pending_tx_count; -	wait_queue_head_t wq; +	wait_queue_head_t tx_credits_wq; +	struct wmi_cmd_map *cmd; +	struct wmi_vdev_param_map *vdev_param; +	struct wmi_pdev_param_map *pdev_param; -	struct sk_buff_head wmi_event_list; -	struct work_struct wmi_event_work; +	u32 num_mem_chunks; +	struct ath10k_mem_chunk mem_chunks[ATH10K_MAX_MEM_REQS];  };  struct ath10k_peer_stat {  	u8 peer_macaddr[ETH_ALEN];  	u32 peer_rssi;  	u32 peer_tx_rate; +	u32 peer_rx_rate; /* 10x only */  };  struct ath10k_target_stats { @@ -134,6 +131,12 @@ struct ath10k_target_stats {  	u32 cycle_count;  	u32 phy_err_count;  	u32 chan_tx_power; +	u32 ack_rx_bad; +	u32 rts_bad; +	u32 rts_good; +	u32 fcs_bad; +	u32 no_beacons; +	u32 mib_int_count;  	/* PDEV TX stats */  	s32 comp_queued; @@ -185,6 +188,14 @@ struct ath10k_target_stats {  }; +struct ath10k_dfs_stats { +	u32 phy_errors; +	u32 pulses_total; +	u32 pulses_detected; +	u32 pulses_discarded; +	u32 radar_detected; +}; +  #define ATH10K_MAX_NUM_PEER_IDS (1 << 11) /* htt rx_desc limit */  struct ath10k_peer { @@ -195,26 +206,49 @@ struct ath10k_peer {  	struct ieee80211_key_conf *keys[WMI_MAX_KEY_INDEX + 1];  }; +struct ath10k_sta { +	struct ath10k_vif *arvif; + +	/* the following are protected by ar->data_lock */ +	u32 changed; /* IEEE80211_RC_* */ +	u32 bw; +	u32 nss; +	u32 smps; + +	struct work_struct update_wk; +}; +  #define ATH10K_VDEV_SETUP_TIMEOUT_HZ (5*HZ)  struct ath10k_vif { +	struct list_head list; +  	u32 vdev_id;  	enum wmi_vdev_type vdev_type;  	enum wmi_vdev_subtype vdev_subtype;  	u32 beacon_interval;  	u32 dtim_period; +	struct sk_buff *beacon; +	/* protected by data_lock */ +	bool beacon_sent;  	struct ath10k *ar;  	struct ieee80211_vif *vif; +	bool is_started; +	bool is_up; +	u32 aid; +	u8 bssid[ETH_ALEN]; + +	struct work_struct wep_key_work;  	struct ieee80211_key_conf *wep_keys[WMI_MAX_KEY_INDEX + 1]; -	u8 def_wep_key_index; +	u8 def_wep_key_idx; +	u8 def_wep_key_newidx;  	u16 tx_seq_no;  	union {  		struct { -			u8 bssid[ETH_ALEN];  			u32 uapsd;  		} sta;  		struct { @@ -228,10 +262,13 @@ struct ath10k_vif {  			u32 noa_len;  			u8 *noa_data;  		} ap; -		struct { -			u8 bssid[ETH_ALEN]; -		} ibss;  	} u; + +	u8 fixed_rate; +	u8 fixed_nss; +	u8 force_sgi; +	bool use_cts_prot; +	int num_legacy_stations;  };  struct ath10k_vif_iter { @@ -246,6 +283,13 @@ struct ath10k_debug {  	u32 wmi_service_bitmap[WMI_SERVICE_BM_SIZE];  	struct completion event_stats_compl; + +	unsigned long htt_stats_mask; +	struct delayed_work htt_stats_dwork; +	struct ath10k_dfs_stats dfs_stats; +	struct ath_dfs_pool_stats dfs_pool_stats; + +	u32 fw_dbglog_mask;  };  enum ath10k_state { @@ -270,12 +314,37 @@ enum ath10k_state {  	ATH10K_STATE_WEDGED,  }; +enum ath10k_fw_features { +	/* wmi_mgmt_rx_hdr contains extra RSSI information */ +	ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX = 0, + +	/* firmware from 10X branch */ +	ATH10K_FW_FEATURE_WMI_10X = 1, + +	/* firmware support tx frame management over WMI, otherwise it's HTT */ +	ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX = 2, + +	/* Firmware does not support P2P */ +	ATH10K_FW_FEATURE_NO_P2P = 3, + +	/* keep last */ +	ATH10K_FW_FEATURE_COUNT, +}; + +enum ath10k_dev_flags { +	/* Indicates that ath10k device is during CAC phase of DFS */ +	ATH10K_CAC_RUNNING, +	ATH10K_FLAG_FIRST_BOOT_DONE, +	ATH10K_FLAG_CORE_REGISTERED, +}; +  struct ath10k {  	struct ath_common ath_common;  	struct ieee80211_hw *hw;  	struct device *dev;  	u8 mac_addr[ETH_ALEN]; +	u32 chip_id;  	u32 target_version;  	u8 fw_version_major;  	u32 fw_version_minor; @@ -288,6 +357,8 @@ struct ath10k {  	u32 vht_cap_info;  	u32 num_rf_chains; +	DECLARE_BITMAP(fw_features, ATH10K_FW_FEATURE_COUNT); +  	struct targetdef *targetdef;  	struct hostdef *hostdef; @@ -298,8 +369,7 @@ struct ath10k {  		const struct ath10k_hif_ops *ops;  	} hif; -	wait_queue_head_t event_queue; -	bool is_target_paused; +	struct completion target_suspend;  	struct ath10k_bmi bmi;  	struct ath10k_wmi wmi; @@ -319,9 +389,19 @@ struct ath10k {  		} fw;  	} hw_params; -	const struct firmware *board_data; +	const struct firmware *board; +	const void *board_data; +	size_t board_len; +  	const struct firmware *otp; +	const void *otp_data; +	size_t otp_len; +  	const struct firmware *firmware; +	const void *firmware_data; +	size_t firmware_len; + +	int fw_api;  	struct {  		struct completion started; @@ -345,11 +425,27 @@ struct ath10k {  	/* valid during scan; needed for mgmt rx during scan */  	struct ieee80211_channel *scan_channel; +	/* current operating channel definition */ +	struct cfg80211_chan_def chandef; +  	int free_vdev_map; +	bool promisc; +	bool monitor;  	int monitor_vdev_id; -	bool monitor_enabled; -	bool monitor_present; +	bool monitor_started;  	unsigned int filter_flags; +	unsigned long dev_flags; +	u32 dfs_block_radar_events; + +	/* protected by conf_mutex */ +	bool radar_enabled; +	int num_started_vdevs; + +	/* Protected by conf-mutex */ +	u8 supp_tx_chainmask; +	u8 supp_rx_chainmask; +	u8 cfg_tx_chainmask; +	u8 cfg_rx_chainmask;  	struct wmi_pdev_set_wmm_params_arg wmm_params;  	struct completion install_key_done; @@ -364,16 +460,24 @@ struct ath10k {  	/* protects shared structure data */  	spinlock_t data_lock; +	struct list_head arvifs;  	struct list_head peers;  	wait_queue_head_t peer_mapping_wq; +	/* number of created peers; protected by data_lock */ +	int num_peers; +  	struct work_struct offchan_tx_work;  	struct sk_buff_head offchan_tx_queue;  	struct completion offchan_tx_completed;  	struct sk_buff *offchan_tx_skb; +	struct work_struct wmi_mgmt_tx_work; +	struct sk_buff_head wmi_mgmt_tx_queue; +  	enum ath10k_state state; +	struct work_struct register_work;  	struct work_struct restart_work;  	/* cycle count is reported twice for each visited channel during scan. @@ -382,6 +486,8 @@ struct ath10k {  	u32 survey_last_cycle_count;  	struct survey_info survey[ATH10K_NUM_CHANS]; +	struct dfs_pattern_detector *dfs_detector; +  #ifdef CONFIG_ATH10K_DEBUGFS  	struct ath10k_debug debug;  #endif @@ -392,8 +498,9 @@ struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,  void ath10k_core_destroy(struct ath10k *ar);  int ath10k_core_start(struct ath10k *ar); +int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt);  void ath10k_core_stop(struct ath10k *ar); -int ath10k_core_register(struct ath10k *ar); +int ath10k_core_register(struct ath10k *ar, u32 chip_id);  void ath10k_core_unregister(struct ath10k *ar);  #endif /* _CORE_H_ */  | 
