1fb9987d0SSujith /* 25b68138eSSujith Manoharan * Copyright (c) 2010-2011 Atheros Communications Inc. 3fb9987d0SSujith * 4fb9987d0SSujith * Permission to use, copy, modify, and/or distribute this software for any 5fb9987d0SSujith * purpose with or without fee is hereby granted, provided that the above 6fb9987d0SSujith * copyright notice and this permission notice appear in all copies. 7fb9987d0SSujith * 8fb9987d0SSujith * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9fb9987d0SSujith * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10fb9987d0SSujith * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11fb9987d0SSujith * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12fb9987d0SSujith * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13fb9987d0SSujith * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14fb9987d0SSujith * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15fb9987d0SSujith */ 16fb9987d0SSujith 17fb9987d0SSujith #ifndef HTC_H 18fb9987d0SSujith #define HTC_H 19fb9987d0SSujith 20fb9987d0SSujith #include <linux/module.h> 21fb9987d0SSujith #include <linux/usb.h> 22fb9987d0SSujith #include <linux/firmware.h> 23fb9987d0SSujith #include <linux/skbuff.h> 24fb9987d0SSujith #include <linux/netdevice.h> 25838f4279SFelix Fietkau #include <linux/etherdevice.h> 26fb9987d0SSujith #include <linux/leds.h> 27617f3d0dSTejun Heo #include <linux/slab.h> 28fb9987d0SSujith #include <net/mac80211.h> 29fb9987d0SSujith 30fb9987d0SSujith #include "common.h" 31fb9987d0SSujith #include "htc_hst.h" 32fb9987d0SSujith #include "hif_usb.h" 33fb9987d0SSujith #include "wmi.h" 34fb9987d0SSujith 35fb9987d0SSujith #define ATH_STA_SHORT_CALINTERVAL 1000 /* 1 second */ 36a236254cSSujith Manoharan #define ATH_AP_SHORT_CALINTERVAL 100 /* 100 ms */ 37fb9987d0SSujith #define ATH_ANI_POLLINTERVAL 100 /* 100 ms */ 38fb9987d0SSujith #define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */ 39fb9987d0SSujith #define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */ 40fb9987d0SSujith 41fb9987d0SSujith #define ATH_DEFAULT_BMISS_LIMIT 10 42fb9987d0SSujith #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024) 43fb9987d0SSujith #define TSF_TO_TU(_h, _l) \ 44fb9987d0SSujith ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10)) 45fb9987d0SSujith 46fb9987d0SSujith extern struct ieee80211_ops ath9k_htc_ops; 47e1572c5eSSujith extern int htc_modparam_nohwcrypt; 48fb9987d0SSujith 49fb9987d0SSujith enum htc_phymode { 50c75197a7SSujith Manoharan HTC_MODE_11NA = 0, 51c75197a7SSujith Manoharan HTC_MODE_11NG = 1 52fb9987d0SSujith }; 53fb9987d0SSujith 54fb9987d0SSujith enum htc_opmode { 55fb9987d0SSujith HTC_M_STA = 1, 56fb9987d0SSujith HTC_M_IBSS = 0, 57fb9987d0SSujith HTC_M_AHDEMO = 3, 58fb9987d0SSujith HTC_M_HOSTAP = 6, 59fb9987d0SSujith HTC_M_MONITOR = 8, 60fb9987d0SSujith HTC_M_WDS = 2 61fb9987d0SSujith }; 62fb9987d0SSujith 63fb9987d0SSujith #define ATH9K_HTC_AMPDU 1 64fb9987d0SSujith #define ATH9K_HTC_NORMAL 2 6540dc9e4bSSujith Manoharan #define ATH9K_HTC_BEACON 3 6640dc9e4bSSujith Manoharan #define ATH9K_HTC_MGMT 4 67fb9987d0SSujith 68fb9987d0SSujith #define ATH9K_HTC_TX_CTSONLY 0x1 69fb9987d0SSujith #define ATH9K_HTC_TX_RTSCTS 0x2 70fb9987d0SSujith 71fb9987d0SSujith struct tx_frame_hdr { 72fb9987d0SSujith u8 data_type; 73fb9987d0SSujith u8 node_idx; 74fb9987d0SSujith u8 vif_idx; 75fb9987d0SSujith u8 tidno; 76dc738cb6SRajkumar Manoharan __be32 flags; /* ATH9K_HTC_TX_* */ 77fb9987d0SSujith u8 key_type; 78fb9987d0SSujith u8 keyix; 79e8e38607SSujith Manoharan u8 cookie; 80e8e38607SSujith Manoharan u8 pad; 81fb9987d0SSujith } __packed; 82fb9987d0SSujith 83fb9987d0SSujith struct tx_mgmt_hdr { 84fb9987d0SSujith u8 node_idx; 85fb9987d0SSujith u8 vif_idx; 86fb9987d0SSujith u8 tidno; 87fb9987d0SSujith u8 flags; 88fb9987d0SSujith u8 key_type; 89fb9987d0SSujith u8 keyix; 90e8e38607SSujith Manoharan u8 cookie; 91e8e38607SSujith Manoharan u8 pad; 92fb9987d0SSujith } __packed; 93fb9987d0SSujith 94fb9987d0SSujith struct tx_beacon_header { 95fb9987d0SSujith u8 vif_index; 961c165c97SSujith Manoharan u8 len_changed; 97fb9987d0SSujith u16 rev; 98fb9987d0SSujith } __packed; 99fb9987d0SSujith 1003a0593efSSujith Manoharan #define MAX_TX_AMPDU_SUBFRAMES_9271 17 1013a0593efSSujith Manoharan #define MAX_TX_AMPDU_SUBFRAMES_7010 22 1023a0593efSSujith Manoharan 103fb9987d0SSujith struct ath9k_htc_cap_target { 1043a0593efSSujith Manoharan __be32 ampdu_limit; 105fb9987d0SSujith u8 ampdu_subframes; 1063a0593efSSujith Manoharan u8 enable_coex; 107fb9987d0SSujith u8 tx_chainmask; 1080a8579f6SSujith Manoharan u8 pad; 109fb9987d0SSujith } __packed; 110fb9987d0SSujith 111fb9987d0SSujith struct ath9k_htc_target_vif { 112fb9987d0SSujith u8 index; 113e4c62506SSujith Manoharan u8 opmode; 114fb9987d0SSujith u8 myaddr[ETH_ALEN]; 115fb9987d0SSujith u8 ath_cap; 116e4c62506SSujith Manoharan __be16 rtsthreshold; 117e4c62506SSujith Manoharan u8 pad; 118fb9987d0SSujith } __packed; 119fb9987d0SSujith 120fb9987d0SSujith struct ath9k_htc_target_sta { 121fb9987d0SSujith u8 macaddr[ETH_ALEN]; 122fb9987d0SSujith u8 bssid[ETH_ALEN]; 123fb9987d0SSujith u8 sta_index; 124fb9987d0SSujith u8 vif_index; 125fb9987d0SSujith u8 is_vif_sta; 12684dfa730SSujith Manoharan __be16 flags; 127b97c57ffSSujith Manoharan __be16 htcap; 128b97c57ffSSujith Manoharan __be16 maxampdu; 129b97c57ffSSujith Manoharan u8 pad; 130fb9987d0SSujith } __packed; 131fb9987d0SSujith 132fb9987d0SSujith struct ath9k_htc_target_aggr { 133fb9987d0SSujith u8 sta_index; 134fb9987d0SSujith u8 tidno; 135fb9987d0SSujith u8 aggr_enable; 136fb9987d0SSujith u8 padding; 137fb9987d0SSujith } __packed; 138fb9987d0SSujith 139fb9987d0SSujith #define ATH_HTC_RATE_MAX 30 140fb9987d0SSujith 141fb9987d0SSujith #define WLAN_RC_DS_FLAG 0x01 142fb9987d0SSujith #define WLAN_RC_40_FLAG 0x02 143fb9987d0SSujith #define WLAN_RC_SGI_FLAG 0x04 144fb9987d0SSujith #define WLAN_RC_HT_FLAG 0x08 145a226c3d9SOleksij Rempel #define ATH_RC_TX_STBC_FLAG 0x20 146fb9987d0SSujith 147fb9987d0SSujith struct ath9k_htc_rateset { 148fb9987d0SSujith u8 rs_nrates; 149fb9987d0SSujith u8 rs_rates[ATH_HTC_RATE_MAX]; 150fb9987d0SSujith }; 151fb9987d0SSujith 152fb9987d0SSujith struct ath9k_htc_rate { 153fb9987d0SSujith struct ath9k_htc_rateset legacy_rates; 154fb9987d0SSujith struct ath9k_htc_rateset ht_rates; 155fb9987d0SSujith } __packed; 156fb9987d0SSujith 157fb9987d0SSujith struct ath9k_htc_target_rate { 158fb9987d0SSujith u8 sta_index; 159fb9987d0SSujith u8 isnew; 1607f1f5a00SSujith __be32 capflags; 161fb9987d0SSujith struct ath9k_htc_rate rates; 162fb9987d0SSujith }; 163fb9987d0SSujith 164a55bb94aSSujith Manoharan struct ath9k_htc_target_rate_mask { 165a55bb94aSSujith Manoharan u8 vif_index; 166a55bb94aSSujith Manoharan u8 band; 167a55bb94aSSujith Manoharan __be32 mask; 168a55bb94aSSujith Manoharan u16 pad; 169a55bb94aSSujith Manoharan } __packed; 170a55bb94aSSujith Manoharan 171fbc29d6cSSujith Manoharan struct ath9k_htc_target_int_stats { 172fbc29d6cSSujith Manoharan __be32 rx; 173fbc29d6cSSujith Manoharan __be32 rxorn; 174fbc29d6cSSujith Manoharan __be32 rxeol; 175fbc29d6cSSujith Manoharan __be32 txurn; 176fbc29d6cSSujith Manoharan __be32 txto; 177fbc29d6cSSujith Manoharan __be32 cst; 178fbc29d6cSSujith Manoharan } __packed; 179fbc29d6cSSujith Manoharan 180fbc29d6cSSujith Manoharan struct ath9k_htc_target_tx_stats { 181fbc29d6cSSujith Manoharan __be32 xretries; 182fbc29d6cSSujith Manoharan __be32 fifoerr; 183fbc29d6cSSujith Manoharan __be32 filtered; 184fbc29d6cSSujith Manoharan __be32 timer_exp; 185fbc29d6cSSujith Manoharan __be32 shortretries; 186fbc29d6cSSujith Manoharan __be32 longretries; 187fbc29d6cSSujith Manoharan __be32 qnull; 188fbc29d6cSSujith Manoharan __be32 encap_fail; 189fbc29d6cSSujith Manoharan __be32 nobuf; 190fbc29d6cSSujith Manoharan } __packed; 191fbc29d6cSSujith Manoharan 192fbc29d6cSSujith Manoharan struct ath9k_htc_target_rx_stats { 193fbc29d6cSSujith Manoharan __be32 nobuf; 194fbc29d6cSSujith Manoharan __be32 host_send; 195fbc29d6cSSujith Manoharan __be32 host_done; 196fb9987d0SSujith } __packed; 197fb9987d0SSujith 198a97b478cSSujith Manoharan #define ATH9K_HTC_MAX_VIF 2 199da8d9d93SSujith Manoharan #define ATH9K_HTC_MAX_BCN_VIF 2 200a97b478cSSujith Manoharan 2010df8359aSSujith Manoharan #define INC_VIF(_priv, _type) do { \ 2020df8359aSSujith Manoharan switch (_type) { \ 2030df8359aSSujith Manoharan case NL80211_IFTYPE_STATION: \ 2040df8359aSSujith Manoharan _priv->num_sta_vif++; \ 2050df8359aSSujith Manoharan break; \ 2060df8359aSSujith Manoharan case NL80211_IFTYPE_ADHOC: \ 2070df8359aSSujith Manoharan _priv->num_ibss_vif++; \ 2080df8359aSSujith Manoharan break; \ 209da8d9d93SSujith Manoharan case NL80211_IFTYPE_AP: \ 210da8d9d93SSujith Manoharan _priv->num_ap_vif++; \ 211da8d9d93SSujith Manoharan break; \ 212594e65b6SJavier Cardona case NL80211_IFTYPE_MESH_POINT: \ 213594e65b6SJavier Cardona _priv->num_mbss_vif++; \ 214594e65b6SJavier Cardona break; \ 2150df8359aSSujith Manoharan default: \ 2160df8359aSSujith Manoharan break; \ 2170df8359aSSujith Manoharan } \ 2180df8359aSSujith Manoharan } while (0) 2190df8359aSSujith Manoharan 2200df8359aSSujith Manoharan #define DEC_VIF(_priv, _type) do { \ 2210df8359aSSujith Manoharan switch (_type) { \ 2220df8359aSSujith Manoharan case NL80211_IFTYPE_STATION: \ 2230df8359aSSujith Manoharan _priv->num_sta_vif--; \ 2240df8359aSSujith Manoharan break; \ 2250df8359aSSujith Manoharan case NL80211_IFTYPE_ADHOC: \ 2260df8359aSSujith Manoharan _priv->num_ibss_vif--; \ 2270df8359aSSujith Manoharan break; \ 228da8d9d93SSujith Manoharan case NL80211_IFTYPE_AP: \ 229da8d9d93SSujith Manoharan _priv->num_ap_vif--; \ 230da8d9d93SSujith Manoharan break; \ 231594e65b6SJavier Cardona case NL80211_IFTYPE_MESH_POINT: \ 232594e65b6SJavier Cardona _priv->num_mbss_vif--; \ 233594e65b6SJavier Cardona break; \ 2340df8359aSSujith Manoharan default: \ 2350df8359aSSujith Manoharan break; \ 2360df8359aSSujith Manoharan } \ 2370df8359aSSujith Manoharan } while (0) 2380df8359aSSujith Manoharan 239fb9987d0SSujith struct ath9k_htc_vif { 240fb9987d0SSujith u8 index; 2419a3d025bSSujith Manoharan u16 seq_no; 242e7a2a4f5SSujith Manoharan bool beacon_configured; 243832f6a18SSujith Manoharan int bslot; 2449b674a02SSujith Manoharan __le64 tsfadjust; 245fb9987d0SSujith }; 246fb9987d0SSujith 247585895cdSSujith Manoharan struct ath9k_vif_iter_data { 248585895cdSSujith Manoharan const u8 *hw_macaddr; 249585895cdSSujith Manoharan u8 mask[ETH_ALEN]; 250585895cdSSujith Manoharan }; 251585895cdSSujith Manoharan 252fb9987d0SSujith #define ATH9K_HTC_MAX_STA 8 253fb9987d0SSujith #define ATH9K_HTC_MAX_TID 8 254fb9987d0SSujith 255fb9987d0SSujith enum tid_aggr_state { 256fb9987d0SSujith AGGR_STOP = 0, 257fb9987d0SSujith AGGR_PROGRESS, 258fb9987d0SSujith AGGR_START, 259fb9987d0SSujith AGGR_OPERATIONAL 260fb9987d0SSujith }; 261fb9987d0SSujith 262fb9987d0SSujith struct ath9k_htc_sta { 263fb9987d0SSujith u8 index; 264fb9987d0SSujith enum tid_aggr_state tid_state[ATH9K_HTC_MAX_TID]; 265fb9987d0SSujith }; 266fb9987d0SSujith 267fb9987d0SSujith #define ATH9K_HTC_RXBUF 256 268fb9987d0SSujith #define HTC_RX_FRAME_HEADER_SIZE 40 269fb9987d0SSujith 270fb9987d0SSujith struct ath9k_htc_rxbuf { 271fb9987d0SSujith bool in_process; 272fb9987d0SSujith struct sk_buff *skb; 273fb9987d0SSujith struct ath_htc_rx_status rxstatus; 274fb9987d0SSujith struct list_head list; 275fb9987d0SSujith }; 276fb9987d0SSujith 277fb9987d0SSujith struct ath9k_htc_rx { 278fb9987d0SSujith int last_rssi; /* FIXME: per-STA */ 279fb9987d0SSujith struct list_head rxbuf; 280fb9987d0SSujith spinlock_t rxbuflock; 281fb9987d0SSujith }; 282fb9987d0SSujith 283859c3ca1SSujith Manoharan #define ATH9K_HTC_TX_CLEANUP_INTERVAL 50 /* ms */ 28489ea6745SSujith Manoharan #define ATH9K_HTC_TX_TIMEOUT_INTERVAL 3000 /* ms */ 2858e86a547SSujith Manoharan #define ATH9K_HTC_TX_RESERVE 10 28689ea6745SSujith Manoharan #define ATH9K_HTC_TX_TIMEOUT_COUNT 40 2878e86a547SSujith Manoharan #define ATH9K_HTC_TX_THRESHOLD (MAX_TX_BUF_NUM - ATH9K_HTC_TX_RESERVE) 288658ef04fSSujith Manoharan 2898e86a547SSujith Manoharan #define ATH9K_HTC_OP_TX_QUEUES_STOP BIT(0) 29027876a29SSujith Manoharan #define ATH9K_HTC_OP_TX_DRAIN BIT(1) 2918e86a547SSujith Manoharan 2928e86a547SSujith Manoharan struct ath9k_htc_tx { 2938e86a547SSujith Manoharan u8 flags; 2948e86a547SSujith Manoharan int queued_cnt; 29527876a29SSujith Manoharan struct sk_buff_head mgmt_ep_queue; 29627876a29SSujith Manoharan struct sk_buff_head cab_ep_queue; 29727876a29SSujith Manoharan struct sk_buff_head data_be_queue; 29827876a29SSujith Manoharan struct sk_buff_head data_bk_queue; 29927876a29SSujith Manoharan struct sk_buff_head data_vi_queue; 30027876a29SSujith Manoharan struct sk_buff_head data_vo_queue; 301b587fc81SSujith Manoharan struct sk_buff_head tx_failed; 3022c5d57f0SSujith Manoharan DECLARE_BITMAP(tx_slot, MAX_TX_BUF_NUM); 303859c3ca1SSujith Manoharan struct timer_list cleanup_timer; 3048e86a547SSujith Manoharan spinlock_t tx_lock; 305658ef04fSSujith Manoharan }; 306658ef04fSSujith Manoharan 307fb9987d0SSujith struct ath9k_htc_tx_ctl { 308fb9987d0SSujith u8 type; /* ATH9K_HTC_* */ 309d67ee533SSujith Manoharan u8 epid; 310729bd3abSSujith Manoharan u8 txok; 31184c9e164SSujith Manoharan u8 sta_idx; 312859c3ca1SSujith Manoharan unsigned long timestamp; 313fb9987d0SSujith }; 314fb9987d0SSujith 31540dc9e4bSSujith Manoharan static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb) 31640dc9e4bSSujith Manoharan { 31740dc9e4bSSujith Manoharan struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 31840dc9e4bSSujith Manoharan 31940dc9e4bSSujith Manoharan BUILD_BUG_ON(sizeof(struct ath9k_htc_tx_ctl) > 32040dc9e4bSSujith Manoharan IEEE80211_TX_INFO_DRIVER_DATA_SIZE); 32140dc9e4bSSujith Manoharan return (struct ath9k_htc_tx_ctl *) &tx_info->driver_data; 32240dc9e4bSSujith Manoharan } 32340dc9e4bSSujith Manoharan 324fb9987d0SSujith #ifdef CONFIG_ATH9K_HTC_DEBUGFS 325fb9987d0SSujith 326fb9987d0SSujith #define TX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c++) 32768185a4bSBen Greear #define TX_STAT_ADD(c, a) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c += a) 328fb9987d0SSujith #define RX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c++) 32968185a4bSBen Greear #define RX_STAT_ADD(c, a) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c += a) 3307d547eb4SSujith Manoharan #define CAB_STAT_INC priv->debug.tx_stats.cab_queued++ 331fb9987d0SSujith 3322edb4583SSujith #define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++) 3332edb4583SSujith 334719c4cf6SSujith Manoharan void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv, 335719c4cf6SSujith Manoharan struct ath_htc_rx_status *rxs); 336719c4cf6SSujith Manoharan 337fb9987d0SSujith struct ath_tx_stats { 338fb9987d0SSujith u32 buf_queued; 339fb9987d0SSujith u32 buf_completed; 340fb9987d0SSujith u32 skb_queued; 341b587fc81SSujith Manoharan u32 skb_success; 34268185a4bSBen Greear u32 skb_success_bytes; 343b587fc81SSujith Manoharan u32 skb_failed; 3447d547eb4SSujith Manoharan u32 cab_queued; 345bea843c7SSujith Manoharan u32 queue_stats[IEEE80211_NUM_ACS]; 346fb9987d0SSujith }; 347fb9987d0SSujith 348fb9987d0SSujith struct ath_rx_stats { 349fb9987d0SSujith u32 skb_allocated; 350fb9987d0SSujith u32 skb_completed; 35168185a4bSBen Greear u32 skb_completed_bytes; 352fb9987d0SSujith u32 skb_dropped; 353719c4cf6SSujith Manoharan u32 err_crc; 354719c4cf6SSujith Manoharan u32 err_decrypt_crc; 355719c4cf6SSujith Manoharan u32 err_mic; 356719c4cf6SSujith Manoharan u32 err_pre_delim; 357719c4cf6SSujith Manoharan u32 err_post_delim; 358719c4cf6SSujith Manoharan u32 err_decrypt_busy; 359719c4cf6SSujith Manoharan u32 err_phy; 360719c4cf6SSujith Manoharan u32 err_phy_stats[ATH9K_PHYERR_MAX]; 361fb9987d0SSujith }; 362fb9987d0SSujith 363fb9987d0SSujith struct ath9k_debug { 364fb9987d0SSujith struct dentry *debugfs_phy; 365fb9987d0SSujith struct ath_tx_stats tx_stats; 366fb9987d0SSujith struct ath_rx_stats rx_stats; 367fb9987d0SSujith }; 368fb9987d0SSujith 36968185a4bSBen Greear void ath9k_htc_get_et_strings(struct ieee80211_hw *hw, 37068185a4bSBen Greear struct ieee80211_vif *vif, 37168185a4bSBen Greear u32 sset, u8 *data); 37268185a4bSBen Greear int ath9k_htc_get_et_sset_count(struct ieee80211_hw *hw, 37368185a4bSBen Greear struct ieee80211_vif *vif, int sset); 37468185a4bSBen Greear void ath9k_htc_get_et_stats(struct ieee80211_hw *hw, 37568185a4bSBen Greear struct ieee80211_vif *vif, 37668185a4bSBen Greear struct ethtool_stats *stats, u64 *data); 377fb9987d0SSujith #else 378fb9987d0SSujith 379fb9987d0SSujith #define TX_STAT_INC(c) do { } while (0) 38068185a4bSBen Greear #define TX_STAT_ADD(c, a) do { } while (0) 381fb9987d0SSujith #define RX_STAT_INC(c) do { } while (0) 38268185a4bSBen Greear #define RX_STAT_ADD(c, a) do { } while (0) 3837d547eb4SSujith Manoharan #define CAB_STAT_INC do { } while (0) 384fb9987d0SSujith 385ed3305b4SJohn W. Linville #define TX_QSTAT_INC(c) do { } while (0) 386ed3305b4SJohn W. Linville 387719c4cf6SSujith Manoharan static inline void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv, 388719c4cf6SSujith Manoharan struct ath_htc_rx_status *rxs) 389719c4cf6SSujith Manoharan { 390719c4cf6SSujith Manoharan } 391719c4cf6SSujith Manoharan 392fb9987d0SSujith #endif /* CONFIG_ATH9K_HTC_DEBUGFS */ 393fb9987d0SSujith 394fb9987d0SSujith #define ATH_LED_PIN_DEF 1 3956d64ab7fSRajkumar Manoharan #define ATH_LED_PIN_9287 10 396fb9987d0SSujith #define ATH_LED_PIN_9271 15 39788c1f4f6SSujith #define ATH_LED_PIN_7010 12 398fb9987d0SSujith 399832f6a18SSujith Manoharan #define BSTUCK_THRESHOLD 10 400832f6a18SSujith Manoharan 401b0a6ba98SSujith Manoharan /* 402b0a6ba98SSujith Manoharan * Adjust these when the max. no of beaconing interfaces is 403b0a6ba98SSujith Manoharan * increased. 404b0a6ba98SSujith Manoharan */ 405b0a6ba98SSujith Manoharan #define DEFAULT_SWBA_RESPONSE 40 /* in TUs */ 406b0a6ba98SSujith Manoharan #define MIN_SWBA_RESPONSE 10 /* in TUs */ 407b0a6ba98SSujith Manoharan 4081c3652a5SVivek Natarajan struct htc_beacon_config { 409832f6a18SSujith Manoharan struct ieee80211_vif *bslot[ATH9K_HTC_MAX_BCN_VIF]; 4101c3652a5SVivek Natarajan u16 beacon_interval; 4111c3652a5SVivek Natarajan u16 dtim_period; 4121c3652a5SVivek Natarajan u16 bmiss_timeout; 413832f6a18SSujith Manoharan u32 bmiss_cnt; 4141c3652a5SVivek Natarajan }; 4151c3652a5SVivek Natarajan 41621cb9879SVivek Natarajan struct ath_btcoex { 41721cb9879SVivek Natarajan u32 bt_priority_cnt; 41821cb9879SVivek Natarajan unsigned long bt_priority_time; 41921cb9879SVivek Natarajan int bt_stomp_type; /* Types of BT stomping */ 42021cb9879SVivek Natarajan u32 btcoex_no_stomp; 42121cb9879SVivek Natarajan u32 btcoex_period; 42221cb9879SVivek Natarajan u32 btscan_no_stomp; 42321cb9879SVivek Natarajan }; 42421cb9879SVivek Natarajan 4259d5b80fdSSujith Manoharan #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT 426cee5341dSSujith Manoharan void ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product); 427bf047fcdSSujith Manoharan void ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv); 428bf047fcdSSujith Manoharan void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv); 4299d5b80fdSSujith Manoharan #else 4309d5b80fdSSujith Manoharan static inline void ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product) 4319d5b80fdSSujith Manoharan { 4329d5b80fdSSujith Manoharan } 4339d5b80fdSSujith Manoharan static inline void ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv) 4349d5b80fdSSujith Manoharan { 4359d5b80fdSSujith Manoharan } 4369d5b80fdSSujith Manoharan static inline void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv) 4379d5b80fdSSujith Manoharan { 4389d5b80fdSSujith Manoharan } 4399d5b80fdSSujith Manoharan #endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */ 44021cb9879SVivek Natarajan 441fb9987d0SSujith #define OP_INVALID BIT(0) 442fb9987d0SSujith #define OP_SCANNING BIT(1) 443d244f21eSSujith Manoharan #define OP_ENABLE_BEACON BIT(2) 444d244f21eSSujith Manoharan #define OP_BT_PRIORITY_DETECTED BIT(3) 445d244f21eSSujith Manoharan #define OP_BT_SCAN BIT(4) 446d244f21eSSujith Manoharan #define OP_ANI_RUNNING BIT(5) 447d244f21eSSujith Manoharan #define OP_TSF_RESET BIT(6) 448fb9987d0SSujith 449fb9987d0SSujith struct ath9k_htc_priv { 450fb9987d0SSujith struct device *dev; 451fb9987d0SSujith struct ieee80211_hw *hw; 452fb9987d0SSujith struct ath_hw *ah; 453fb9987d0SSujith struct htc_target *htc; 454fb9987d0SSujith struct wmi *wmi; 455fb9987d0SSujith 45629bbfb24SSujith Manoharan u16 fw_version_major; 45729bbfb24SSujith Manoharan u16 fw_version_minor; 45829bbfb24SSujith Manoharan 459fb9987d0SSujith enum htc_endpoint_id wmi_cmd_ep; 460fb9987d0SSujith enum htc_endpoint_id beacon_ep; 461fb9987d0SSujith enum htc_endpoint_id cab_ep; 462fb9987d0SSujith enum htc_endpoint_id uapsd_ep; 463fb9987d0SSujith enum htc_endpoint_id mgmt_ep; 464fb9987d0SSujith enum htc_endpoint_id data_be_ep; 465fb9987d0SSujith enum htc_endpoint_id data_bk_ep; 466fb9987d0SSujith enum htc_endpoint_id data_vi_ep; 467fb9987d0SSujith enum htc_endpoint_id data_vo_ep; 468fb9987d0SSujith 469a97b478cSSujith Manoharan u8 vif_slot; 470a97b478cSSujith Manoharan u8 mon_vif_idx; 471a97b478cSSujith Manoharan u8 sta_slot; 472a97b478cSSujith Manoharan u8 vif_sta_pos[ATH9K_HTC_MAX_VIF]; 4730df8359aSSujith Manoharan u8 num_ibss_vif; 474594e65b6SJavier Cardona u8 num_mbss_vif; 4750df8359aSSujith Manoharan u8 num_sta_vif; 4760cd075d7SSujith Manoharan u8 num_sta_assoc_vif; 477da8d9d93SSujith Manoharan u8 num_ap_vif; 478a97b478cSSujith Manoharan 479fb9987d0SSujith u16 curtxpow; 480fb9987d0SSujith u16 txpowlimit; 481fb9987d0SSujith u16 nvifs; 482fb9987d0SSujith u16 nstations; 4837c277349SSujith Manoharan bool rearm_ani; 4847c277349SSujith Manoharan bool reconfig_beacon; 485658ef04fSSujith Manoharan unsigned int rxfilter; 486d8a2c51cSSujith Manoharan unsigned long op_flags; 487fb9987d0SSujith 4884e3ae387SRajkumar Manoharan struct ath9k_hw_cal_data caldata; 489658ef04fSSujith Manoharan struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; 49020bd2a09SFelix Fietkau 491fb9987d0SSujith spinlock_t beacon_lock; 4921c3652a5SVivek Natarajan struct htc_beacon_config cur_beacon_conf; 493658ef04fSSujith Manoharan 494658ef04fSSujith Manoharan struct ath9k_htc_rx rx; 495658ef04fSSujith Manoharan struct ath9k_htc_tx tx; 496658ef04fSSujith Manoharan 49773908674SSujith Manoharan struct tasklet_struct swba_tasklet; 498fb9987d0SSujith struct tasklet_struct rx_tasklet; 499a236254cSSujith Manoharan struct delayed_work ani_work; 50027876a29SSujith Manoharan struct tasklet_struct tx_failed_tasklet; 501bde748a4SVivek Natarajan struct work_struct ps_work; 50273908674SSujith Manoharan struct work_struct fatal_work; 503bde748a4SVivek Natarajan 504bde748a4SVivek Natarajan struct mutex htc_pm_lock; 505bde748a4SVivek Natarajan unsigned long ps_usecount; 506bde748a4SVivek Natarajan bool ps_enabled; 5078a8572a8SVivek Natarajan bool ps_idle; 508fb9987d0SSujith 509d244f21eSSujith Manoharan #ifdef CONFIG_MAC80211_LEDS 510d244f21eSSujith Manoharan enum led_brightness brightness; 511d244f21eSSujith Manoharan bool led_registered; 512d244f21eSSujith Manoharan char led_name[32]; 513d244f21eSSujith Manoharan struct led_classdev led_cdev; 514d244f21eSSujith Manoharan struct work_struct led_work; 515d244f21eSSujith Manoharan #endif 516ca74b83bSSujith 517ca74b83bSSujith int beaconq; 518ca74b83bSSujith int cabq; 519bea843c7SSujith Manoharan int hwq_map[IEEE80211_NUM_ACS]; 520fb9987d0SSujith 5219d5b80fdSSujith Manoharan #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT 52221cb9879SVivek Natarajan struct ath_btcoex btcoex; 5239d5b80fdSSujith Manoharan #endif 5249d5b80fdSSujith Manoharan 52521cb9879SVivek Natarajan struct delayed_work coex_period_work; 52621cb9879SVivek Natarajan struct delayed_work duty_cycle_work; 527fb9987d0SSujith #ifdef CONFIG_ATH9K_HTC_DEBUGFS 528fb9987d0SSujith struct ath9k_debug debug; 529fb9987d0SSujith #endif 530fb9987d0SSujith struct mutex mutex; 531fb9987d0SSujith }; 532fb9987d0SSujith 533fb9987d0SSujith static inline void ath_read_cachesize(struct ath_common *common, int *csz) 534fb9987d0SSujith { 535fb9987d0SSujith common->bus_ops->read_cachesize(common, csz); 536fb9987d0SSujith } 537fb9987d0SSujith 53873908674SSujith Manoharan void ath9k_htc_reset(struct ath9k_htc_priv *priv); 53973908674SSujith Manoharan 540832f6a18SSujith Manoharan void ath9k_htc_assign_bslot(struct ath9k_htc_priv *priv, 541832f6a18SSujith Manoharan struct ieee80211_vif *vif); 542832f6a18SSujith Manoharan void ath9k_htc_remove_bslot(struct ath9k_htc_priv *priv, 543832f6a18SSujith Manoharan struct ieee80211_vif *vif); 5449b674a02SSujith Manoharan void ath9k_htc_set_tsfadjust(struct ath9k_htc_priv *priv, 5459b674a02SSujith Manoharan struct ieee80211_vif *vif); 546764580f5SSujith void ath9k_htc_beaconq_config(struct ath9k_htc_priv *priv); 547fb9987d0SSujith void ath9k_htc_beacon_config(struct ath9k_htc_priv *priv, 5481c3652a5SVivek Natarajan struct ieee80211_vif *vif); 5497c277349SSujith Manoharan void ath9k_htc_beacon_reconfig(struct ath9k_htc_priv *priv); 550f4c88991SSujith Manoharan void ath9k_htc_swba(struct ath9k_htc_priv *priv, 551f4c88991SSujith Manoharan struct wmi_event_swba *swba); 552fb9987d0SSujith 553fb9987d0SSujith void ath9k_htc_rxep(void *priv, struct sk_buff *skb, 554fb9987d0SSujith enum htc_endpoint_id ep_id); 555fb9987d0SSujith void ath9k_htc_txep(void *priv, struct sk_buff *skb, enum htc_endpoint_id ep_id, 556fb9987d0SSujith bool txok); 5579c6dda4eSSujith void ath9k_htc_beaconep(void *drv_priv, struct sk_buff *skb, 5589c6dda4eSSujith enum htc_endpoint_id ep_id, bool txok); 559fb9987d0SSujith 5603a0593efSSujith Manoharan int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv, 5613a0593efSSujith Manoharan u8 enable_coex); 562a236254cSSujith Manoharan void ath9k_htc_ani_work(struct work_struct *work); 563a236254cSSujith Manoharan void ath9k_htc_start_ani(struct ath9k_htc_priv *priv); 564a236254cSSujith Manoharan void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv); 565fb9987d0SSujith 566fb9987d0SSujith int ath9k_tx_init(struct ath9k_htc_priv *priv); 5677d547eb4SSujith Manoharan int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, 56836323f81SThomas Huehn struct ieee80211_sta *sta, 5692c5d57f0SSujith Manoharan struct sk_buff *skb, u8 slot, bool is_cab); 570fb9987d0SSujith void ath9k_tx_cleanup(struct ath9k_htc_priv *priv); 571e8c35a77SFelix Fietkau bool ath9k_htc_txq_setup(struct ath9k_htc_priv *priv, int subtype); 572ca74b83bSSujith int ath9k_htc_cabq_setup(struct ath9k_htc_priv *priv); 573fb9987d0SSujith int get_hw_qnum(u16 queue, int *hwq_map); 574e1572c5eSSujith int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum, 575fb9987d0SSujith struct ath9k_tx_queue_info *qinfo); 5768e86a547SSujith Manoharan void ath9k_htc_check_stop_queues(struct ath9k_htc_priv *priv); 5778e86a547SSujith Manoharan void ath9k_htc_check_wake_queues(struct ath9k_htc_priv *priv); 5782c5d57f0SSujith Manoharan int ath9k_htc_tx_get_slot(struct ath9k_htc_priv *priv); 5792c5d57f0SSujith Manoharan void ath9k_htc_tx_clear_slot(struct ath9k_htc_priv *priv, int slot); 580b587fc81SSujith Manoharan void ath9k_htc_tx_drain(struct ath9k_htc_priv *priv); 58127876a29SSujith Manoharan void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event); 58227876a29SSujith Manoharan void ath9k_tx_failed_tasklet(unsigned long data); 583859c3ca1SSujith Manoharan void ath9k_htc_tx_cleanup_timer(unsigned long data); 584fb9987d0SSujith 585fb9987d0SSujith int ath9k_rx_init(struct ath9k_htc_priv *priv); 586fb9987d0SSujith void ath9k_rx_cleanup(struct ath9k_htc_priv *priv); 587fb9987d0SSujith void ath9k_host_rx_init(struct ath9k_htc_priv *priv); 588fb9987d0SSujith void ath9k_rx_tasklet(unsigned long data); 5890995d110SSujith u32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv); 590fb9987d0SSujith 591bde748a4SVivek Natarajan void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv); 592bde748a4SVivek Natarajan void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv); 593bde748a4SVivek Natarajan void ath9k_ps_work(struct work_struct *work); 594f933ebedSSujith Manoharan bool ath9k_htc_setpower(struct ath9k_htc_priv *priv, 595f933ebedSSujith Manoharan enum ath9k_power_mode mode); 596bde748a4SVivek Natarajan 597fb9987d0SSujith void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv); 5981e1f4ad2SSujith Manoharan void ath9k_htc_rfkill_poll_state(struct ieee80211_hw *hw); 599d244f21eSSujith Manoharan 600156652bbSBen Greear struct base_eep_header *ath9k_htc_get_eeprom_base(struct ath9k_htc_priv *priv); 601156652bbSBen Greear 602d244f21eSSujith Manoharan #ifdef CONFIG_MAC80211_LEDS 6031e51acaaSOleksij Rempel void ath9k_configure_leds(struct ath9k_htc_priv *priv); 604fb9987d0SSujith void ath9k_init_leds(struct ath9k_htc_priv *priv); 605fb9987d0SSujith void ath9k_deinit_leds(struct ath9k_htc_priv *priv); 606d244f21eSSujith Manoharan void ath9k_led_work(struct work_struct *work); 607d244f21eSSujith Manoharan #else 6081e51acaaSOleksij Rempel static inline void ath9k_configure_leds(struct ath9k_htc_priv *priv) 6091e51acaaSOleksij Rempel { 6101e51acaaSOleksij Rempel } 6111e51acaaSOleksij Rempel 612d244f21eSSujith Manoharan static inline void ath9k_init_leds(struct ath9k_htc_priv *priv) 613d244f21eSSujith Manoharan { 614d244f21eSSujith Manoharan } 615d244f21eSSujith Manoharan 616d244f21eSSujith Manoharan static inline void ath9k_deinit_leds(struct ath9k_htc_priv *priv) 617d244f21eSSujith Manoharan { 618d244f21eSSujith Manoharan } 619d244f21eSSujith Manoharan 620d244f21eSSujith Manoharan static inline void ath9k_led_work(struct work_struct *work) 621d244f21eSSujith Manoharan { 622d244f21eSSujith Manoharan } 623d244f21eSSujith Manoharan #endif 624fb9987d0SSujith 625fb9987d0SSujith int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev, 626fa6e15e0SRajkumar Manoharan u16 devid, char *product, u32 drv_info); 627fb9987d0SSujith void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug); 628fb9987d0SSujith #ifdef CONFIG_PM 629f933ebedSSujith Manoharan void ath9k_htc_suspend(struct htc_target *htc_handle); 630fb9987d0SSujith int ath9k_htc_resume(struct htc_target *htc_handle); 631fb9987d0SSujith #endif 632fb9987d0SSujith #ifdef CONFIG_ATH9K_HTC_DEBUGFS 633e1572c5eSSujith int ath9k_htc_init_debug(struct ath_hw *ah); 634fb9987d0SSujith #else 635e1572c5eSSujith static inline int ath9k_htc_init_debug(struct ath_hw *ah) { return 0; }; 636fb9987d0SSujith #endif /* CONFIG_ATH9K_HTC_DEBUGFS */ 637fb9987d0SSujith 638fb9987d0SSujith #endif /* HTC_H */ 639