1fb9987d0SSujith /* 2fb9987d0SSujith * Copyright (c) 2010 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> 25fb9987d0SSujith #include <linux/leds.h> 26617f3d0dSTejun Heo #include <linux/slab.h> 27fb9987d0SSujith #include <net/mac80211.h> 28fb9987d0SSujith 29fb9987d0SSujith #include "common.h" 30fb9987d0SSujith #include "htc_hst.h" 31fb9987d0SSujith #include "hif_usb.h" 32fb9987d0SSujith #include "wmi.h" 33fb9987d0SSujith 34fb9987d0SSujith #define ATH_STA_SHORT_CALINTERVAL 1000 /* 1 second */ 35a236254cSSujith Manoharan #define ATH_AP_SHORT_CALINTERVAL 100 /* 100 ms */ 36fb9987d0SSujith #define ATH_ANI_POLLINTERVAL 100 /* 100 ms */ 37fb9987d0SSujith #define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */ 38fb9987d0SSujith #define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */ 39fb9987d0SSujith 40fb9987d0SSujith #define ATH_DEFAULT_BMISS_LIMIT 10 41fb9987d0SSujith #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024) 42fb9987d0SSujith #define TSF_TO_TU(_h, _l) \ 43fb9987d0SSujith ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10)) 44fb9987d0SSujith 45fb9987d0SSujith extern struct ieee80211_ops ath9k_htc_ops; 46e1572c5eSSujith extern int htc_modparam_nohwcrypt; 47fb9987d0SSujith 48fb9987d0SSujith enum htc_phymode { 49fb9987d0SSujith HTC_MODE_AUTO = 0, 50fb9987d0SSujith HTC_MODE_11A = 1, 51fb9987d0SSujith HTC_MODE_11B = 2, 52fb9987d0SSujith HTC_MODE_11G = 3, 53fb9987d0SSujith HTC_MODE_FH = 4, 54fb9987d0SSujith HTC_MODE_TURBO_A = 5, 55fb9987d0SSujith HTC_MODE_TURBO_G = 6, 56fb9987d0SSujith HTC_MODE_11NA = 7, 57fb9987d0SSujith HTC_MODE_11NG = 8 58fb9987d0SSujith }; 59fb9987d0SSujith 60fb9987d0SSujith enum htc_opmode { 61fb9987d0SSujith HTC_M_STA = 1, 62fb9987d0SSujith HTC_M_IBSS = 0, 63fb9987d0SSujith HTC_M_AHDEMO = 3, 64fb9987d0SSujith HTC_M_HOSTAP = 6, 65fb9987d0SSujith HTC_M_MONITOR = 8, 66fb9987d0SSujith HTC_M_WDS = 2 67fb9987d0SSujith }; 68fb9987d0SSujith 69fb9987d0SSujith #define ATH9K_HTC_HDRSPACE sizeof(struct htc_frame_hdr) 7040dc9e4bSSujith Manoharan 71fb9987d0SSujith #define ATH9K_HTC_AMPDU 1 72fb9987d0SSujith #define ATH9K_HTC_NORMAL 2 7340dc9e4bSSujith Manoharan #define ATH9K_HTC_BEACON 3 7440dc9e4bSSujith Manoharan #define ATH9K_HTC_MGMT 4 75fb9987d0SSujith 76fb9987d0SSujith #define ATH9K_HTC_TX_CTSONLY 0x1 77fb9987d0SSujith #define ATH9K_HTC_TX_RTSCTS 0x2 78fb9987d0SSujith #define ATH9K_HTC_TX_USE_MIN_RATE 0x100 79fb9987d0SSujith 80fb9987d0SSujith struct tx_frame_hdr { 81fb9987d0SSujith u8 data_type; 82fb9987d0SSujith u8 node_idx; 83fb9987d0SSujith u8 vif_idx; 84fb9987d0SSujith u8 tidno; 85dc738cb6SRajkumar Manoharan __be32 flags; /* ATH9K_HTC_TX_* */ 86fb9987d0SSujith u8 key_type; 87fb9987d0SSujith u8 keyix; 88e8e38607SSujith Manoharan u8 cookie; 89e8e38607SSujith Manoharan u8 pad; 90fb9987d0SSujith } __packed; 91fb9987d0SSujith 92fb9987d0SSujith struct tx_mgmt_hdr { 93fb9987d0SSujith u8 node_idx; 94fb9987d0SSujith u8 vif_idx; 95fb9987d0SSujith u8 tidno; 96fb9987d0SSujith u8 flags; 97fb9987d0SSujith u8 key_type; 98fb9987d0SSujith u8 keyix; 99e8e38607SSujith Manoharan u8 cookie; 100e8e38607SSujith Manoharan u8 pad; 101fb9987d0SSujith } __packed; 102fb9987d0SSujith 103fb9987d0SSujith struct tx_beacon_header { 104fb9987d0SSujith u8 vif_index; 1051c165c97SSujith Manoharan u8 len_changed; 106fb9987d0SSujith u16 rev; 107fb9987d0SSujith } __packed; 108fb9987d0SSujith 109fb9987d0SSujith struct ath9k_htc_cap_target { 110fb9987d0SSujith u32 flags; 111fb9987d0SSujith u32 flags_ext; 112fb9987d0SSujith u32 ampdu_limit; 113fb9987d0SSujith u8 ampdu_subframes; 114fb9987d0SSujith u8 tx_chainmask; 115fb9987d0SSujith u8 tx_chainmask_legacy; 116fb9987d0SSujith u8 rtscts_ratecode; 117fb9987d0SSujith u8 protmode; 1180a8579f6SSujith Manoharan u8 pad; 119fb9987d0SSujith } __packed; 120fb9987d0SSujith 121fb9987d0SSujith struct ath9k_htc_target_vif { 122fb9987d0SSujith u8 index; 123e4c62506SSujith Manoharan u8 opmode; 124fb9987d0SSujith u8 myaddr[ETH_ALEN]; 125fb9987d0SSujith u8 ath_cap; 126e4c62506SSujith Manoharan __be16 rtsthreshold; 127e4c62506SSujith Manoharan u8 pad; 128fb9987d0SSujith } __packed; 129fb9987d0SSujith 130fb9987d0SSujith #define ATH_HTC_STA_AUTH 0x0001 131fb9987d0SSujith #define ATH_HTC_STA_QOS 0x0002 132fb9987d0SSujith #define ATH_HTC_STA_ERP 0x0004 133fb9987d0SSujith #define ATH_HTC_STA_HT 0x0008 134fb9987d0SSujith 135fb9987d0SSujith struct ath9k_htc_target_sta { 136fb9987d0SSujith u8 macaddr[ETH_ALEN]; 137fb9987d0SSujith u8 bssid[ETH_ALEN]; 138fb9987d0SSujith u8 sta_index; 139fb9987d0SSujith u8 vif_index; 140fb9987d0SSujith u8 is_vif_sta; 141b97c57ffSSujith Manoharan __be16 flags; /* ATH_HTC_STA_* */ 142b97c57ffSSujith Manoharan __be16 htcap; 143b97c57ffSSujith Manoharan __be16 maxampdu; 144b97c57ffSSujith Manoharan u8 pad; 145fb9987d0SSujith } __packed; 146fb9987d0SSujith 147fb9987d0SSujith struct ath9k_htc_target_aggr { 148fb9987d0SSujith u8 sta_index; 149fb9987d0SSujith u8 tidno; 150fb9987d0SSujith u8 aggr_enable; 151fb9987d0SSujith u8 padding; 152fb9987d0SSujith } __packed; 153fb9987d0SSujith 154fb9987d0SSujith #define ATH_HTC_RATE_MAX 30 155fb9987d0SSujith 156fb9987d0SSujith #define WLAN_RC_DS_FLAG 0x01 157fb9987d0SSujith #define WLAN_RC_40_FLAG 0x02 158fb9987d0SSujith #define WLAN_RC_SGI_FLAG 0x04 159fb9987d0SSujith #define WLAN_RC_HT_FLAG 0x08 160fb9987d0SSujith 161fb9987d0SSujith struct ath9k_htc_rateset { 162fb9987d0SSujith u8 rs_nrates; 163fb9987d0SSujith u8 rs_rates[ATH_HTC_RATE_MAX]; 164fb9987d0SSujith }; 165fb9987d0SSujith 166fb9987d0SSujith struct ath9k_htc_rate { 167fb9987d0SSujith struct ath9k_htc_rateset legacy_rates; 168fb9987d0SSujith struct ath9k_htc_rateset ht_rates; 169fb9987d0SSujith } __packed; 170fb9987d0SSujith 171fb9987d0SSujith struct ath9k_htc_target_rate { 172fb9987d0SSujith u8 sta_index; 173fb9987d0SSujith u8 isnew; 1747f1f5a00SSujith __be32 capflags; 175fb9987d0SSujith struct ath9k_htc_rate rates; 176fb9987d0SSujith }; 177fb9987d0SSujith 178fb9987d0SSujith struct ath9k_htc_target_stats { 1797f1f5a00SSujith __be32 tx_shortretry; 1807f1f5a00SSujith __be32 tx_longretry; 1817f1f5a00SSujith __be32 tx_xretries; 1827f1f5a00SSujith __be32 ht_txunaggr_xretry; 1837f1f5a00SSujith __be32 ht_tx_xretries; 184fb9987d0SSujith } __packed; 185fb9987d0SSujith 186a97b478cSSujith Manoharan #define ATH9K_HTC_MAX_VIF 2 187da8d9d93SSujith Manoharan #define ATH9K_HTC_MAX_BCN_VIF 2 188a97b478cSSujith Manoharan 1890df8359aSSujith Manoharan #define INC_VIF(_priv, _type) do { \ 1900df8359aSSujith Manoharan switch (_type) { \ 1910df8359aSSujith Manoharan case NL80211_IFTYPE_STATION: \ 1920df8359aSSujith Manoharan _priv->num_sta_vif++; \ 1930df8359aSSujith Manoharan break; \ 1940df8359aSSujith Manoharan case NL80211_IFTYPE_ADHOC: \ 1950df8359aSSujith Manoharan _priv->num_ibss_vif++; \ 1960df8359aSSujith Manoharan break; \ 197da8d9d93SSujith Manoharan case NL80211_IFTYPE_AP: \ 198da8d9d93SSujith Manoharan _priv->num_ap_vif++; \ 199da8d9d93SSujith Manoharan break; \ 2000df8359aSSujith Manoharan default: \ 2010df8359aSSujith Manoharan break; \ 2020df8359aSSujith Manoharan } \ 2030df8359aSSujith Manoharan } while (0) 2040df8359aSSujith Manoharan 2050df8359aSSujith Manoharan #define DEC_VIF(_priv, _type) do { \ 2060df8359aSSujith Manoharan switch (_type) { \ 2070df8359aSSujith Manoharan case NL80211_IFTYPE_STATION: \ 2080df8359aSSujith Manoharan _priv->num_sta_vif--; \ 2090df8359aSSujith Manoharan break; \ 2100df8359aSSujith Manoharan case NL80211_IFTYPE_ADHOC: \ 2110df8359aSSujith Manoharan _priv->num_ibss_vif--; \ 2120df8359aSSujith Manoharan break; \ 213da8d9d93SSujith Manoharan case NL80211_IFTYPE_AP: \ 214da8d9d93SSujith Manoharan _priv->num_ap_vif--; \ 215da8d9d93SSujith Manoharan break; \ 2160df8359aSSujith Manoharan default: \ 2170df8359aSSujith Manoharan break; \ 2180df8359aSSujith Manoharan } \ 2190df8359aSSujith Manoharan } while (0) 2200df8359aSSujith Manoharan 221fb9987d0SSujith struct ath9k_htc_vif { 222fb9987d0SSujith u8 index; 2239a3d025bSSujith Manoharan u16 seq_no; 224e7a2a4f5SSujith Manoharan bool beacon_configured; 225832f6a18SSujith Manoharan int bslot; 2269b674a02SSujith Manoharan __le64 tsfadjust; 227fb9987d0SSujith }; 228fb9987d0SSujith 229585895cdSSujith Manoharan struct ath9k_vif_iter_data { 230585895cdSSujith Manoharan const u8 *hw_macaddr; 231585895cdSSujith Manoharan u8 mask[ETH_ALEN]; 232585895cdSSujith Manoharan }; 233585895cdSSujith Manoharan 234fb9987d0SSujith #define ATH9K_HTC_MAX_STA 8 235fb9987d0SSujith #define ATH9K_HTC_MAX_TID 8 236fb9987d0SSujith 237fb9987d0SSujith enum tid_aggr_state { 238fb9987d0SSujith AGGR_STOP = 0, 239fb9987d0SSujith AGGR_PROGRESS, 240fb9987d0SSujith AGGR_START, 241fb9987d0SSujith AGGR_OPERATIONAL 242fb9987d0SSujith }; 243fb9987d0SSujith 244fb9987d0SSujith struct ath9k_htc_sta { 245fb9987d0SSujith u8 index; 246fb9987d0SSujith enum tid_aggr_state tid_state[ATH9K_HTC_MAX_TID]; 247fb9987d0SSujith }; 248fb9987d0SSujith 249fb9987d0SSujith #define ATH9K_HTC_RXBUF 256 250fb9987d0SSujith #define HTC_RX_FRAME_HEADER_SIZE 40 251fb9987d0SSujith 252fb9987d0SSujith struct ath9k_htc_rxbuf { 253fb9987d0SSujith bool in_process; 254fb9987d0SSujith struct sk_buff *skb; 255fb9987d0SSujith struct ath_htc_rx_status rxstatus; 256fb9987d0SSujith struct list_head list; 257fb9987d0SSujith }; 258fb9987d0SSujith 259fb9987d0SSujith struct ath9k_htc_rx { 260fb9987d0SSujith int last_rssi; /* FIXME: per-STA */ 261fb9987d0SSujith struct list_head rxbuf; 262fb9987d0SSujith spinlock_t rxbuflock; 263fb9987d0SSujith }; 264fb9987d0SSujith 2658e86a547SSujith Manoharan #define ATH9K_HTC_TX_RESERVE 10 2668e86a547SSujith Manoharan #define ATH9K_HTC_TX_THRESHOLD (MAX_TX_BUF_NUM - ATH9K_HTC_TX_RESERVE) 267658ef04fSSujith Manoharan 2688e86a547SSujith Manoharan #define ATH9K_HTC_OP_TX_QUEUES_STOP BIT(0) 2698e86a547SSujith Manoharan 2708e86a547SSujith Manoharan struct ath9k_htc_tx { 2718e86a547SSujith Manoharan u8 flags; 2728e86a547SSujith Manoharan int queued_cnt; 273658ef04fSSujith Manoharan struct sk_buff_head tx_queue; 274b587fc81SSujith Manoharan struct sk_buff_head tx_failed; 2752c5d57f0SSujith Manoharan DECLARE_BITMAP(tx_slot, MAX_TX_BUF_NUM); 2768e86a547SSujith Manoharan spinlock_t tx_lock; 277658ef04fSSujith Manoharan }; 278658ef04fSSujith Manoharan 279fb9987d0SSujith struct ath9k_htc_tx_ctl { 280fb9987d0SSujith u8 type; /* ATH9K_HTC_* */ 281d67ee533SSujith Manoharan u8 epid; 282729bd3abSSujith Manoharan u8 txok; 28384c9e164SSujith Manoharan u8 sta_idx; 284fb9987d0SSujith }; 285fb9987d0SSujith 28640dc9e4bSSujith Manoharan static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb) 28740dc9e4bSSujith Manoharan { 28840dc9e4bSSujith Manoharan struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 28940dc9e4bSSujith Manoharan 29040dc9e4bSSujith Manoharan BUILD_BUG_ON(sizeof(struct ath9k_htc_tx_ctl) > 29140dc9e4bSSujith Manoharan IEEE80211_TX_INFO_DRIVER_DATA_SIZE); 29240dc9e4bSSujith Manoharan return (struct ath9k_htc_tx_ctl *) &tx_info->driver_data; 29340dc9e4bSSujith Manoharan } 29440dc9e4bSSujith Manoharan 295fb9987d0SSujith #ifdef CONFIG_ATH9K_HTC_DEBUGFS 296fb9987d0SSujith 297fb9987d0SSujith #define TX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c++) 298fb9987d0SSujith #define RX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c++) 2997d547eb4SSujith Manoharan #define CAB_STAT_INC priv->debug.tx_stats.cab_queued++ 300fb9987d0SSujith 3012edb4583SSujith #define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++) 3022edb4583SSujith 303719c4cf6SSujith Manoharan void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv, 304719c4cf6SSujith Manoharan struct ath_htc_rx_status *rxs); 305719c4cf6SSujith Manoharan 306fb9987d0SSujith struct ath_tx_stats { 307fb9987d0SSujith u32 buf_queued; 308fb9987d0SSujith u32 buf_completed; 309fb9987d0SSujith u32 skb_queued; 310b587fc81SSujith Manoharan u32 skb_success; 311b587fc81SSujith Manoharan u32 skb_failed; 3127d547eb4SSujith Manoharan u32 cab_queued; 3132edb4583SSujith u32 queue_stats[WME_NUM_AC]; 314fb9987d0SSujith }; 315fb9987d0SSujith 316fb9987d0SSujith struct ath_rx_stats { 317fb9987d0SSujith u32 skb_allocated; 318fb9987d0SSujith u32 skb_completed; 319fb9987d0SSujith u32 skb_dropped; 320719c4cf6SSujith Manoharan u32 err_crc; 321719c4cf6SSujith Manoharan u32 err_decrypt_crc; 322719c4cf6SSujith Manoharan u32 err_mic; 323719c4cf6SSujith Manoharan u32 err_pre_delim; 324719c4cf6SSujith Manoharan u32 err_post_delim; 325719c4cf6SSujith Manoharan u32 err_decrypt_busy; 326719c4cf6SSujith Manoharan u32 err_phy; 327719c4cf6SSujith Manoharan u32 err_phy_stats[ATH9K_PHYERR_MAX]; 328fb9987d0SSujith }; 329fb9987d0SSujith 330fb9987d0SSujith struct ath9k_debug { 331fb9987d0SSujith struct dentry *debugfs_phy; 332fb9987d0SSujith struct dentry *debugfs_tgt_stats; 333fb9987d0SSujith struct dentry *debugfs_xmit; 334fb9987d0SSujith struct dentry *debugfs_recv; 335fb9987d0SSujith struct ath_tx_stats tx_stats; 336fb9987d0SSujith struct ath_rx_stats rx_stats; 337fb9987d0SSujith u32 txrate; 338fb9987d0SSujith }; 339fb9987d0SSujith 340fb9987d0SSujith #else 341fb9987d0SSujith 342fb9987d0SSujith #define TX_STAT_INC(c) do { } while (0) 343fb9987d0SSujith #define RX_STAT_INC(c) do { } while (0) 3447d547eb4SSujith Manoharan #define CAB_STAT_INC do { } while (0) 345fb9987d0SSujith 346ed3305b4SJohn W. Linville #define TX_QSTAT_INC(c) do { } while (0) 347ed3305b4SJohn W. Linville 348719c4cf6SSujith Manoharan static inline void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv, 349719c4cf6SSujith Manoharan struct ath_htc_rx_status *rxs) 350719c4cf6SSujith Manoharan { 351719c4cf6SSujith Manoharan } 352719c4cf6SSujith Manoharan 353fb9987d0SSujith #endif /* CONFIG_ATH9K_HTC_DEBUGFS */ 354fb9987d0SSujith 355fb9987d0SSujith #define ATH_LED_PIN_DEF 1 3566d64ab7fSRajkumar Manoharan #define ATH_LED_PIN_9287 10 357fb9987d0SSujith #define ATH_LED_PIN_9271 15 35888c1f4f6SSujith #define ATH_LED_PIN_7010 12 359fb9987d0SSujith #define ATH_LED_ON_DURATION_IDLE 350 /* in msecs */ 360fb9987d0SSujith #define ATH_LED_OFF_DURATION_IDLE 250 /* in msecs */ 361fb9987d0SSujith 362fb9987d0SSujith enum ath_led_type { 363fb9987d0SSujith ATH_LED_RADIO, 364fb9987d0SSujith ATH_LED_ASSOC, 365fb9987d0SSujith ATH_LED_TX, 366fb9987d0SSujith ATH_LED_RX 367fb9987d0SSujith }; 368fb9987d0SSujith 369fb9987d0SSujith struct ath_led { 370fb9987d0SSujith struct ath9k_htc_priv *priv; 371fb9987d0SSujith struct led_classdev led_cdev; 372fb9987d0SSujith enum ath_led_type led_type; 373fb9987d0SSujith struct delayed_work brightness_work; 374fb9987d0SSujith char name[32]; 375fb9987d0SSujith bool registered; 376fb9987d0SSujith int brightness; 377fb9987d0SSujith }; 378fb9987d0SSujith 379832f6a18SSujith Manoharan #define BSTUCK_THRESHOLD 10 380832f6a18SSujith Manoharan 381b0a6ba98SSujith Manoharan /* 382b0a6ba98SSujith Manoharan * Adjust these when the max. no of beaconing interfaces is 383b0a6ba98SSujith Manoharan * increased. 384b0a6ba98SSujith Manoharan */ 385b0a6ba98SSujith Manoharan #define DEFAULT_SWBA_RESPONSE 40 /* in TUs */ 386b0a6ba98SSujith Manoharan #define MIN_SWBA_RESPONSE 10 /* in TUs */ 387b0a6ba98SSujith Manoharan 3881c3652a5SVivek Natarajan struct htc_beacon_config { 389832f6a18SSujith Manoharan struct ieee80211_vif *bslot[ATH9K_HTC_MAX_BCN_VIF]; 3901c3652a5SVivek Natarajan u16 beacon_interval; 3911c3652a5SVivek Natarajan u16 dtim_period; 3921c3652a5SVivek Natarajan u16 bmiss_timeout; 393832f6a18SSujith Manoharan u32 bmiss_cnt; 3941c3652a5SVivek Natarajan }; 3951c3652a5SVivek Natarajan 39621cb9879SVivek Natarajan struct ath_btcoex { 39721cb9879SVivek Natarajan u32 bt_priority_cnt; 39821cb9879SVivek Natarajan unsigned long bt_priority_time; 39921cb9879SVivek Natarajan int bt_stomp_type; /* Types of BT stomping */ 40021cb9879SVivek Natarajan u32 btcoex_no_stomp; 40121cb9879SVivek Natarajan u32 btcoex_period; 40221cb9879SVivek Natarajan u32 btscan_no_stomp; 40321cb9879SVivek Natarajan }; 40421cb9879SVivek Natarajan 40521cb9879SVivek Natarajan void ath_htc_init_btcoex_work(struct ath9k_htc_priv *priv); 40621cb9879SVivek Natarajan void ath_htc_resume_btcoex_work(struct ath9k_htc_priv *priv); 40721cb9879SVivek Natarajan void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv); 40821cb9879SVivek Natarajan 409fb9987d0SSujith #define OP_INVALID BIT(0) 410fb9987d0SSujith #define OP_SCANNING BIT(1) 411039a0721SSujith Manoharan #define OP_LED_ASSOCIATED BIT(2) 412039a0721SSujith Manoharan #define OP_LED_ON BIT(3) 4137c277349SSujith Manoharan #define OP_ENABLE_BEACON BIT(4) 4147c277349SSujith Manoharan #define OP_LED_DEINIT BIT(5) 4157c277349SSujith Manoharan #define OP_BT_PRIORITY_DETECTED BIT(6) 4167c277349SSujith Manoharan #define OP_BT_SCAN BIT(7) 417a236254cSSujith Manoharan #define OP_ANI_RUNNING BIT(8) 418a5fae37dSSujith Manoharan #define OP_TSF_RESET BIT(9) 419fb9987d0SSujith 420fb9987d0SSujith struct ath9k_htc_priv { 421fb9987d0SSujith struct device *dev; 422fb9987d0SSujith struct ieee80211_hw *hw; 423fb9987d0SSujith struct ath_hw *ah; 424fb9987d0SSujith struct htc_target *htc; 425fb9987d0SSujith struct wmi *wmi; 426fb9987d0SSujith 42729bbfb24SSujith Manoharan u16 fw_version_major; 42829bbfb24SSujith Manoharan u16 fw_version_minor; 42929bbfb24SSujith Manoharan 430fb9987d0SSujith enum htc_endpoint_id wmi_cmd_ep; 431fb9987d0SSujith enum htc_endpoint_id beacon_ep; 432fb9987d0SSujith enum htc_endpoint_id cab_ep; 433fb9987d0SSujith enum htc_endpoint_id uapsd_ep; 434fb9987d0SSujith enum htc_endpoint_id mgmt_ep; 435fb9987d0SSujith enum htc_endpoint_id data_be_ep; 436fb9987d0SSujith enum htc_endpoint_id data_bk_ep; 437fb9987d0SSujith enum htc_endpoint_id data_vi_ep; 438fb9987d0SSujith enum htc_endpoint_id data_vo_ep; 439fb9987d0SSujith 440a97b478cSSujith Manoharan u8 vif_slot; 441a97b478cSSujith Manoharan u8 mon_vif_idx; 442a97b478cSSujith Manoharan u8 sta_slot; 443a97b478cSSujith Manoharan u8 vif_sta_pos[ATH9K_HTC_MAX_VIF]; 4440df8359aSSujith Manoharan u8 num_ibss_vif; 4450df8359aSSujith Manoharan u8 num_sta_vif; 446da8d9d93SSujith Manoharan u8 num_ap_vif; 447a97b478cSSujith Manoharan 448fb9987d0SSujith u16 op_flags; 449fb9987d0SSujith u16 curtxpow; 450fb9987d0SSujith u16 txpowlimit; 451fb9987d0SSujith u16 nvifs; 452fb9987d0SSujith u16 nstations; 4537c277349SSujith Manoharan bool rearm_ani; 4547c277349SSujith Manoharan bool reconfig_beacon; 455658ef04fSSujith Manoharan unsigned int rxfilter; 456fb9987d0SSujith 4574e3ae387SRajkumar Manoharan struct ath9k_hw_cal_data caldata; 458658ef04fSSujith Manoharan struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; 45920bd2a09SFelix Fietkau 460fb9987d0SSujith spinlock_t beacon_lock; 4611c3652a5SVivek Natarajan struct htc_beacon_config cur_beacon_conf; 462658ef04fSSujith Manoharan 463658ef04fSSujith Manoharan struct ath9k_htc_rx rx; 464658ef04fSSujith Manoharan struct ath9k_htc_tx tx; 465658ef04fSSujith Manoharan 46673908674SSujith Manoharan struct tasklet_struct swba_tasklet; 467fb9987d0SSujith struct tasklet_struct rx_tasklet; 468fb9987d0SSujith struct tasklet_struct tx_tasklet; 469a236254cSSujith Manoharan struct delayed_work ani_work; 470bde748a4SVivek Natarajan struct work_struct ps_work; 47173908674SSujith Manoharan struct work_struct fatal_work; 472bde748a4SVivek Natarajan 473bde748a4SVivek Natarajan struct mutex htc_pm_lock; 474bde748a4SVivek Natarajan unsigned long ps_usecount; 475bde748a4SVivek Natarajan bool ps_enabled; 4768a8572a8SVivek Natarajan bool ps_idle; 477fb9987d0SSujith 478fb9987d0SSujith struct ath_led radio_led; 479fb9987d0SSujith struct ath_led assoc_led; 480fb9987d0SSujith struct ath_led tx_led; 481fb9987d0SSujith struct ath_led rx_led; 482fb9987d0SSujith struct delayed_work ath9k_led_blink_work; 483fb9987d0SSujith int led_on_duration; 484fb9987d0SSujith int led_off_duration; 485fb9987d0SSujith int led_on_cnt; 486fb9987d0SSujith int led_off_cnt; 487ca74b83bSSujith 488ca74b83bSSujith int beaconq; 489ca74b83bSSujith int cabq; 490e8c35a77SFelix Fietkau int hwq_map[WME_NUM_AC]; 491fb9987d0SSujith 49221cb9879SVivek Natarajan struct ath_btcoex btcoex; 49321cb9879SVivek Natarajan struct delayed_work coex_period_work; 49421cb9879SVivek Natarajan struct delayed_work duty_cycle_work; 495fb9987d0SSujith #ifdef CONFIG_ATH9K_HTC_DEBUGFS 496fb9987d0SSujith struct ath9k_debug debug; 497fb9987d0SSujith #endif 498fb9987d0SSujith struct mutex mutex; 499fb9987d0SSujith }; 500fb9987d0SSujith 501fb9987d0SSujith static inline void ath_read_cachesize(struct ath_common *common, int *csz) 502fb9987d0SSujith { 503fb9987d0SSujith common->bus_ops->read_cachesize(common, csz); 504fb9987d0SSujith } 505fb9987d0SSujith 50673908674SSujith Manoharan void ath9k_htc_reset(struct ath9k_htc_priv *priv); 50773908674SSujith Manoharan 508832f6a18SSujith Manoharan void ath9k_htc_assign_bslot(struct ath9k_htc_priv *priv, 509832f6a18SSujith Manoharan struct ieee80211_vif *vif); 510832f6a18SSujith Manoharan void ath9k_htc_remove_bslot(struct ath9k_htc_priv *priv, 511832f6a18SSujith Manoharan struct ieee80211_vif *vif); 5129b674a02SSujith Manoharan void ath9k_htc_set_tsfadjust(struct ath9k_htc_priv *priv, 5139b674a02SSujith Manoharan struct ieee80211_vif *vif); 514764580f5SSujith void ath9k_htc_beaconq_config(struct ath9k_htc_priv *priv); 515fb9987d0SSujith void ath9k_htc_beacon_config(struct ath9k_htc_priv *priv, 5161c3652a5SVivek Natarajan struct ieee80211_vif *vif); 5177c277349SSujith Manoharan void ath9k_htc_beacon_reconfig(struct ath9k_htc_priv *priv); 518f4c88991SSujith Manoharan void ath9k_htc_swba(struct ath9k_htc_priv *priv, 519f4c88991SSujith Manoharan struct wmi_event_swba *swba); 520fb9987d0SSujith 521fb9987d0SSujith void ath9k_htc_rxep(void *priv, struct sk_buff *skb, 522fb9987d0SSujith enum htc_endpoint_id ep_id); 523fb9987d0SSujith void ath9k_htc_txep(void *priv, struct sk_buff *skb, enum htc_endpoint_id ep_id, 524fb9987d0SSujith bool txok); 5259c6dda4eSSujith void ath9k_htc_beaconep(void *drv_priv, struct sk_buff *skb, 5269c6dda4eSSujith enum htc_endpoint_id ep_id, bool txok); 527fb9987d0SSujith 52855de80d6SSujith Manoharan int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv); 529fb9987d0SSujith void ath9k_htc_station_work(struct work_struct *work); 530fb9987d0SSujith void ath9k_htc_aggr_work(struct work_struct *work); 531a236254cSSujith Manoharan void ath9k_htc_ani_work(struct work_struct *work); 532a236254cSSujith Manoharan void ath9k_htc_start_ani(struct ath9k_htc_priv *priv); 533a236254cSSujith Manoharan void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv); 534fb9987d0SSujith 535fb9987d0SSujith int ath9k_tx_init(struct ath9k_htc_priv *priv); 536fb9987d0SSujith void ath9k_tx_tasklet(unsigned long data); 5377d547eb4SSujith Manoharan int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, 5382c5d57f0SSujith Manoharan struct sk_buff *skb, u8 slot, bool is_cab); 539fb9987d0SSujith void ath9k_tx_cleanup(struct ath9k_htc_priv *priv); 540e8c35a77SFelix Fietkau bool ath9k_htc_txq_setup(struct ath9k_htc_priv *priv, int subtype); 541ca74b83bSSujith int ath9k_htc_cabq_setup(struct ath9k_htc_priv *priv); 542fb9987d0SSujith int get_hw_qnum(u16 queue, int *hwq_map); 543e1572c5eSSujith int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum, 544fb9987d0SSujith struct ath9k_tx_queue_info *qinfo); 5458e86a547SSujith Manoharan void ath9k_htc_check_stop_queues(struct ath9k_htc_priv *priv); 5468e86a547SSujith Manoharan void ath9k_htc_check_wake_queues(struct ath9k_htc_priv *priv); 5472c5d57f0SSujith Manoharan int ath9k_htc_tx_get_slot(struct ath9k_htc_priv *priv); 5482c5d57f0SSujith Manoharan void ath9k_htc_tx_clear_slot(struct ath9k_htc_priv *priv, int slot); 549b587fc81SSujith Manoharan void ath9k_htc_tx_drain(struct ath9k_htc_priv *priv); 550fb9987d0SSujith 551fb9987d0SSujith int ath9k_rx_init(struct ath9k_htc_priv *priv); 552fb9987d0SSujith void ath9k_rx_cleanup(struct ath9k_htc_priv *priv); 553fb9987d0SSujith void ath9k_host_rx_init(struct ath9k_htc_priv *priv); 554fb9987d0SSujith void ath9k_rx_tasklet(unsigned long data); 5550995d110SSujith u32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv); 556fb9987d0SSujith 557bde748a4SVivek Natarajan void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv); 558bde748a4SVivek Natarajan void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv); 559bde748a4SVivek Natarajan void ath9k_ps_work(struct work_struct *work); 560f933ebedSSujith Manoharan bool ath9k_htc_setpower(struct ath9k_htc_priv *priv, 561f933ebedSSujith Manoharan enum ath9k_power_mode mode); 562bde748a4SVivek Natarajan 563fb9987d0SSujith void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv); 5641e1f4ad2SSujith Manoharan void ath9k_htc_rfkill_poll_state(struct ieee80211_hw *hw); 5651e1f4ad2SSujith Manoharan void ath9k_htc_radio_enable(struct ieee80211_hw *hw); 5661e1f4ad2SSujith Manoharan void ath9k_htc_radio_disable(struct ieee80211_hw *hw); 5671e1f4ad2SSujith Manoharan void ath9k_led_stop_brightness(struct ath9k_htc_priv *priv); 568fb9987d0SSujith void ath9k_init_leds(struct ath9k_htc_priv *priv); 569fb9987d0SSujith void ath9k_deinit_leds(struct ath9k_htc_priv *priv); 570fb9987d0SSujith 571fb9987d0SSujith int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev, 572fa6e15e0SRajkumar Manoharan u16 devid, char *product, u32 drv_info); 573fb9987d0SSujith void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug); 574fb9987d0SSujith #ifdef CONFIG_PM 575f933ebedSSujith Manoharan void ath9k_htc_suspend(struct htc_target *htc_handle); 576fb9987d0SSujith int ath9k_htc_resume(struct htc_target *htc_handle); 577fb9987d0SSujith #endif 578fb9987d0SSujith #ifdef CONFIG_ATH9K_HTC_DEBUGFS 579e1572c5eSSujith int ath9k_htc_debug_create_root(void); 580e1572c5eSSujith void ath9k_htc_debug_remove_root(void); 581e1572c5eSSujith int ath9k_htc_init_debug(struct ath_hw *ah); 582e1572c5eSSujith void ath9k_htc_exit_debug(struct ath_hw *ah); 583fb9987d0SSujith #else 584e1572c5eSSujith static inline int ath9k_htc_debug_create_root(void) { return 0; }; 585e1572c5eSSujith static inline void ath9k_htc_debug_remove_root(void) {}; 586e1572c5eSSujith static inline int ath9k_htc_init_debug(struct ath_hw *ah) { return 0; }; 587e1572c5eSSujith static inline void ath9k_htc_exit_debug(struct ath_hw *ah) {}; 588fb9987d0SSujith #endif /* CONFIG_ATH9K_HTC_DEBUGFS */ 589fb9987d0SSujith 590fb9987d0SSujith #endif /* HTC_H */ 591