1fb9987d0f748c983bb795a86f47522313f701a08Sujith/* 25b68138e5659cbfd5df2879d17f9ba0b66477fecSujith Manoharan * Copyright (c) 2010-2011 Atheros Communications Inc. 3fb9987d0f748c983bb795a86f47522313f701a08Sujith * 4fb9987d0f748c983bb795a86f47522313f701a08Sujith * Permission to use, copy, modify, and/or distribute this software for any 5fb9987d0f748c983bb795a86f47522313f701a08Sujith * purpose with or without fee is hereby granted, provided that the above 6fb9987d0f748c983bb795a86f47522313f701a08Sujith * copyright notice and this permission notice appear in all copies. 7fb9987d0f748c983bb795a86f47522313f701a08Sujith * 8fb9987d0f748c983bb795a86f47522313f701a08Sujith * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9fb9987d0f748c983bb795a86f47522313f701a08Sujith * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10fb9987d0f748c983bb795a86f47522313f701a08Sujith * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11fb9987d0f748c983bb795a86f47522313f701a08Sujith * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12fb9987d0f748c983bb795a86f47522313f701a08Sujith * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13fb9987d0f748c983bb795a86f47522313f701a08Sujith * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14fb9987d0f748c983bb795a86f47522313f701a08Sujith * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15fb9987d0f748c983bb795a86f47522313f701a08Sujith */ 16fb9987d0f748c983bb795a86f47522313f701a08Sujith 17fb9987d0f748c983bb795a86f47522313f701a08Sujith#ifndef HTC_H 18fb9987d0f748c983bb795a86f47522313f701a08Sujith#define HTC_H 19fb9987d0f748c983bb795a86f47522313f701a08Sujith 20fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/module.h> 21fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/usb.h> 22fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/firmware.h> 23fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/skbuff.h> 24fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/netdevice.h> 25fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/leds.h> 26617f3d0d71e2eae4d8d475cefe9363b140e52083Tejun Heo#include <linux/slab.h> 27fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <net/mac80211.h> 28fb9987d0f748c983bb795a86f47522313f701a08Sujith 29fb9987d0f748c983bb795a86f47522313f701a08Sujith#include "common.h" 30fb9987d0f748c983bb795a86f47522313f701a08Sujith#include "htc_hst.h" 31fb9987d0f748c983bb795a86f47522313f701a08Sujith#include "hif_usb.h" 32fb9987d0f748c983bb795a86f47522313f701a08Sujith#include "wmi.h" 33fb9987d0f748c983bb795a86f47522313f701a08Sujith 34fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_STA_SHORT_CALINTERVAL 1000 /* 1 second */ 35a236254c35f04a4d47c701ed3ec4a0b5dcb097b0Sujith Manoharan#define ATH_AP_SHORT_CALINTERVAL 100 /* 100 ms */ 36fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_ANI_POLLINTERVAL 100 /* 100 ms */ 37fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */ 38fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */ 39fb9987d0f748c983bb795a86f47522313f701a08Sujith 40fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_DEFAULT_BMISS_LIMIT 10 41fb9987d0f748c983bb795a86f47522313f701a08Sujith#define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024) 42fb9987d0f748c983bb795a86f47522313f701a08Sujith#define TSF_TO_TU(_h, _l) \ 43fb9987d0f748c983bb795a86f47522313f701a08Sujith ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10)) 44fb9987d0f748c983bb795a86f47522313f701a08Sujith 45fb9987d0f748c983bb795a86f47522313f701a08Sujithextern struct ieee80211_ops ath9k_htc_ops; 46e1572c5eeca8ef87a250322364584458b2dadb35Sujithextern int htc_modparam_nohwcrypt; 47fb9987d0f748c983bb795a86f47522313f701a08Sujith 48fb9987d0f748c983bb795a86f47522313f701a08Sujithenum htc_phymode { 49c75197a779b6f5ee4c5b859423a0d5257475ebeeSujith Manoharan HTC_MODE_11NA = 0, 50c75197a779b6f5ee4c5b859423a0d5257475ebeeSujith Manoharan HTC_MODE_11NG = 1 51fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 52fb9987d0f748c983bb795a86f47522313f701a08Sujith 53fb9987d0f748c983bb795a86f47522313f701a08Sujithenum htc_opmode { 54fb9987d0f748c983bb795a86f47522313f701a08Sujith HTC_M_STA = 1, 55fb9987d0f748c983bb795a86f47522313f701a08Sujith HTC_M_IBSS = 0, 56fb9987d0f748c983bb795a86f47522313f701a08Sujith HTC_M_AHDEMO = 3, 57fb9987d0f748c983bb795a86f47522313f701a08Sujith HTC_M_HOSTAP = 6, 58fb9987d0f748c983bb795a86f47522313f701a08Sujith HTC_M_MONITOR = 8, 59fb9987d0f748c983bb795a86f47522313f701a08Sujith HTC_M_WDS = 2 60fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 61fb9987d0f748c983bb795a86f47522313f701a08Sujith 6240dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan#define ATH9K_HTC_AMPDU 1 63fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_NORMAL 2 6440dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan#define ATH9K_HTC_BEACON 3 6540dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan#define ATH9K_HTC_MGMT 4 66fb9987d0f748c983bb795a86f47522313f701a08Sujith 67fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_TX_CTSONLY 0x1 68fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_TX_RTSCTS 0x2 69fb9987d0f748c983bb795a86f47522313f701a08Sujith 70fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct tx_frame_hdr { 71fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 data_type; 72fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 node_idx; 73fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 vif_idx; 74fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 tidno; 75dc738cb6c5d5594de4bdf3b7839a250b032152e7Rajkumar Manoharan __be32 flags; /* ATH9K_HTC_TX_* */ 76fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 key_type; 77fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 keyix; 78e8e3860765641d5e9d1607ec50191cb33c28371dSujith Manoharan u8 cookie; 79e8e3860765641d5e9d1607ec50191cb33c28371dSujith Manoharan u8 pad; 80fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed; 81fb9987d0f748c983bb795a86f47522313f701a08Sujith 82fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct tx_mgmt_hdr { 83fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 node_idx; 84fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 vif_idx; 85fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 tidno; 86fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 flags; 87fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 key_type; 88fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 keyix; 89e8e3860765641d5e9d1607ec50191cb33c28371dSujith Manoharan u8 cookie; 90e8e3860765641d5e9d1607ec50191cb33c28371dSujith Manoharan u8 pad; 91fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed; 92fb9987d0f748c983bb795a86f47522313f701a08Sujith 93fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct tx_beacon_header { 94fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 vif_index; 951c165c972b040f9ce199b8d8d3cc4f619872cba5Sujith Manoharan u8 len_changed; 96fb9987d0f748c983bb795a86f47522313f701a08Sujith u16 rev; 97fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed; 98fb9987d0f748c983bb795a86f47522313f701a08Sujith 993a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan#define MAX_TX_AMPDU_SUBFRAMES_9271 17 1003a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan#define MAX_TX_AMPDU_SUBFRAMES_7010 22 1013a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan 102fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_cap_target { 1033a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan __be32 ampdu_limit; 104fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 ampdu_subframes; 1053a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan u8 enable_coex; 106fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 tx_chainmask; 1070a8579f6b7c3f4332ad9eb6615c7631ef9cd4ed6Sujith Manoharan u8 pad; 108fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed; 109fb9987d0f748c983bb795a86f47522313f701a08Sujith 110fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_target_vif { 111fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 index; 112e4c62506fcfa7c1fa7c586ab518a172c3a65db0fSujith Manoharan u8 opmode; 113fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 myaddr[ETH_ALEN]; 114fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 ath_cap; 115e4c62506fcfa7c1fa7c586ab518a172c3a65db0fSujith Manoharan __be16 rtsthreshold; 116e4c62506fcfa7c1fa7c586ab518a172c3a65db0fSujith Manoharan u8 pad; 117fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed; 118fb9987d0f748c983bb795a86f47522313f701a08Sujith 119fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_target_sta { 120fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 macaddr[ETH_ALEN]; 121fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 bssid[ETH_ALEN]; 122fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 sta_index; 123fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 vif_index; 124fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 is_vif_sta; 12584dfa7308ccba190ad7efe655c25ca80793c029eSujith Manoharan __be16 flags; 126b97c57ff3f568b33ed91915f48431feae2dab288Sujith Manoharan __be16 htcap; 127b97c57ff3f568b33ed91915f48431feae2dab288Sujith Manoharan __be16 maxampdu; 128b97c57ff3f568b33ed91915f48431feae2dab288Sujith Manoharan u8 pad; 129fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed; 130fb9987d0f748c983bb795a86f47522313f701a08Sujith 131fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_target_aggr { 132fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 sta_index; 133fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 tidno; 134fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 aggr_enable; 135fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 padding; 136fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed; 137fb9987d0f748c983bb795a86f47522313f701a08Sujith 138fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_HTC_RATE_MAX 30 139fb9987d0f748c983bb795a86f47522313f701a08Sujith 140fb9987d0f748c983bb795a86f47522313f701a08Sujith#define WLAN_RC_DS_FLAG 0x01 141fb9987d0f748c983bb795a86f47522313f701a08Sujith#define WLAN_RC_40_FLAG 0x02 142fb9987d0f748c983bb795a86f47522313f701a08Sujith#define WLAN_RC_SGI_FLAG 0x04 143fb9987d0f748c983bb795a86f47522313f701a08Sujith#define WLAN_RC_HT_FLAG 0x08 144fb9987d0f748c983bb795a86f47522313f701a08Sujith 145fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_rateset { 146fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 rs_nrates; 147fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 rs_rates[ATH_HTC_RATE_MAX]; 148fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 149fb9987d0f748c983bb795a86f47522313f701a08Sujith 150fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_rate { 151fb9987d0f748c983bb795a86f47522313f701a08Sujith struct ath9k_htc_rateset legacy_rates; 152fb9987d0f748c983bb795a86f47522313f701a08Sujith struct ath9k_htc_rateset ht_rates; 153fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed; 154fb9987d0f748c983bb795a86f47522313f701a08Sujith 155fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_target_rate { 156fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 sta_index; 157fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 isnew; 1587f1f5a0060e377ff6a15903487b39223e12b8568Sujith __be32 capflags; 159fb9987d0f748c983bb795a86f47522313f701a08Sujith struct ath9k_htc_rate rates; 160fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 161fb9987d0f748c983bb795a86f47522313f701a08Sujith 162a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharanstruct ath9k_htc_target_rate_mask { 163a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan u8 vif_index; 164a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan u8 band; 165a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan __be32 mask; 166a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan u16 pad; 167a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan} __packed; 168a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan 169fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharanstruct ath9k_htc_target_int_stats { 170fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 rx; 171fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 rxorn; 172fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 rxeol; 173fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 txurn; 174fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 txto; 175fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 cst; 176fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan} __packed; 177fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan 178fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharanstruct ath9k_htc_target_tx_stats { 179fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 xretries; 180fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 fifoerr; 181fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 filtered; 182fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 timer_exp; 183fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 shortretries; 184fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 longretries; 185fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 qnull; 186fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 encap_fail; 187fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 nobuf; 188fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan} __packed; 189fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan 190fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharanstruct ath9k_htc_target_rx_stats { 191fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 nobuf; 192fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 host_send; 193fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan __be32 host_done; 194fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed; 195fb9987d0f748c983bb795a86f47522313f701a08Sujith 196a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan#define ATH9K_HTC_MAX_VIF 2 197da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan#define ATH9K_HTC_MAX_BCN_VIF 2 198a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan 1990df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan#define INC_VIF(_priv, _type) do { \ 2000df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan switch (_type) { \ 2010df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan case NL80211_IFTYPE_STATION: \ 2020df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan _priv->num_sta_vif++; \ 2030df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan break; \ 2040df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan case NL80211_IFTYPE_ADHOC: \ 2050df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan _priv->num_ibss_vif++; \ 2060df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan break; \ 207da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan case NL80211_IFTYPE_AP: \ 208da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan _priv->num_ap_vif++; \ 209da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan break; \ 2100df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan default: \ 2110df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan break; \ 2120df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan } \ 2130df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan } while (0) 2140df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan 2150df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan#define DEC_VIF(_priv, _type) do { \ 2160df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan switch (_type) { \ 2170df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan case NL80211_IFTYPE_STATION: \ 2180df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan _priv->num_sta_vif--; \ 2190df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan break; \ 2200df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan case NL80211_IFTYPE_ADHOC: \ 2210df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan _priv->num_ibss_vif--; \ 2220df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan break; \ 223da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan case NL80211_IFTYPE_AP: \ 224da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan _priv->num_ap_vif--; \ 225da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan break; \ 2260df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan default: \ 2270df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan break; \ 2280df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan } \ 2290df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan } while (0) 2300df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan 231fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_vif { 232fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 index; 2339a3d025be11a1da625f8a71636b55a3bd3718574Sujith Manoharan u16 seq_no; 234e7a2a4f5e61ccfae03185384e06b852dbb1e3630Sujith Manoharan bool beacon_configured; 235832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan int bslot; 2369b674a0207c9b75ddcdcdb07e46843fac8267507Sujith Manoharan __le64 tsfadjust; 237fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 238fb9987d0f748c983bb795a86f47522313f701a08Sujith 239585895cdfc683a067d803fead83267cee309ffd0Sujith Manoharanstruct ath9k_vif_iter_data { 240585895cdfc683a067d803fead83267cee309ffd0Sujith Manoharan const u8 *hw_macaddr; 241585895cdfc683a067d803fead83267cee309ffd0Sujith Manoharan u8 mask[ETH_ALEN]; 242585895cdfc683a067d803fead83267cee309ffd0Sujith Manoharan}; 243585895cdfc683a067d803fead83267cee309ffd0Sujith Manoharan 244fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_MAX_STA 8 245fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_MAX_TID 8 246fb9987d0f748c983bb795a86f47522313f701a08Sujith 247fb9987d0f748c983bb795a86f47522313f701a08Sujithenum tid_aggr_state { 248fb9987d0f748c983bb795a86f47522313f701a08Sujith AGGR_STOP = 0, 249fb9987d0f748c983bb795a86f47522313f701a08Sujith AGGR_PROGRESS, 250fb9987d0f748c983bb795a86f47522313f701a08Sujith AGGR_START, 251fb9987d0f748c983bb795a86f47522313f701a08Sujith AGGR_OPERATIONAL 252fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 253fb9987d0f748c983bb795a86f47522313f701a08Sujith 254fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_sta { 255fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 index; 256fb9987d0f748c983bb795a86f47522313f701a08Sujith enum tid_aggr_state tid_state[ATH9K_HTC_MAX_TID]; 257fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 258fb9987d0f748c983bb795a86f47522313f701a08Sujith 259fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_RXBUF 256 260fb9987d0f748c983bb795a86f47522313f701a08Sujith#define HTC_RX_FRAME_HEADER_SIZE 40 261fb9987d0f748c983bb795a86f47522313f701a08Sujith 262fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_rxbuf { 263fb9987d0f748c983bb795a86f47522313f701a08Sujith bool in_process; 264fb9987d0f748c983bb795a86f47522313f701a08Sujith struct sk_buff *skb; 265fb9987d0f748c983bb795a86f47522313f701a08Sujith struct ath_htc_rx_status rxstatus; 266fb9987d0f748c983bb795a86f47522313f701a08Sujith struct list_head list; 267fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 268fb9987d0f748c983bb795a86f47522313f701a08Sujith 269fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_rx { 270fb9987d0f748c983bb795a86f47522313f701a08Sujith int last_rssi; /* FIXME: per-STA */ 271fb9987d0f748c983bb795a86f47522313f701a08Sujith struct list_head rxbuf; 272fb9987d0f748c983bb795a86f47522313f701a08Sujith spinlock_t rxbuflock; 273fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 274fb9987d0f748c983bb795a86f47522313f701a08Sujith 275859c3ca1e4608615788dc6cbc199210fe4b5efa2Sujith Manoharan#define ATH9K_HTC_TX_CLEANUP_INTERVAL 50 /* ms */ 27689ea674565611908e11f92f57b15bf50d82f1f22Sujith Manoharan#define ATH9K_HTC_TX_TIMEOUT_INTERVAL 3000 /* ms */ 277859c3ca1e4608615788dc6cbc199210fe4b5efa2Sujith Manoharan#define ATH9K_HTC_TX_RESERVE 10 27889ea674565611908e11f92f57b15bf50d82f1f22Sujith Manoharan#define ATH9K_HTC_TX_TIMEOUT_COUNT 40 2798e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan#define ATH9K_HTC_TX_THRESHOLD (MAX_TX_BUF_NUM - ATH9K_HTC_TX_RESERVE) 2808e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan 2818e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan#define ATH9K_HTC_OP_TX_QUEUES_STOP BIT(0) 28227876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan#define ATH9K_HTC_OP_TX_DRAIN BIT(1) 283658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan 2848e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharanstruct ath9k_htc_tx { 2858e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan u8 flags; 2868e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan int queued_cnt; 28727876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan struct sk_buff_head mgmt_ep_queue; 28827876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan struct sk_buff_head cab_ep_queue; 28927876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan struct sk_buff_head data_be_queue; 29027876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan struct sk_buff_head data_bk_queue; 29127876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan struct sk_buff_head data_vi_queue; 29227876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan struct sk_buff_head data_vo_queue; 293b587fc81a80b9656f64e89fe0a106ffa4b35abcaSujith Manoharan struct sk_buff_head tx_failed; 2942c5d57f004673a9c8658e20b1fa3f992b5a10f70Sujith Manoharan DECLARE_BITMAP(tx_slot, MAX_TX_BUF_NUM); 295859c3ca1e4608615788dc6cbc199210fe4b5efa2Sujith Manoharan struct timer_list cleanup_timer; 2968e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan spinlock_t tx_lock; 297658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan}; 298658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan 299fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_tx_ctl { 300fb9987d0f748c983bb795a86f47522313f701a08Sujith u8 type; /* ATH9K_HTC_* */ 301d67ee5339363608adce786ec8fd62a0fb2b66116Sujith Manoharan u8 epid; 302729bd3ab460d3bb8236cc8f6fd0289201124112dSujith Manoharan u8 txok; 30384c9e164468bd707e52b440e1c34bc3c85299332Sujith Manoharan u8 sta_idx; 304859c3ca1e4608615788dc6cbc199210fe4b5efa2Sujith Manoharan unsigned long timestamp; 305fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 306fb9987d0f748c983bb795a86f47522313f701a08Sujith 30740dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharanstatic inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb) 30840dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan{ 30940dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 31040dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan 31140dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan BUILD_BUG_ON(sizeof(struct ath9k_htc_tx_ctl) > 31240dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan IEEE80211_TX_INFO_DRIVER_DATA_SIZE); 31340dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan return (struct ath9k_htc_tx_ctl *) &tx_info->driver_data; 31440dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan} 31540dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan 316fb9987d0f748c983bb795a86f47522313f701a08Sujith#ifdef CONFIG_ATH9K_HTC_DEBUGFS 317fb9987d0f748c983bb795a86f47522313f701a08Sujith 318fb9987d0f748c983bb795a86f47522313f701a08Sujith#define TX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c++) 319fb9987d0f748c983bb795a86f47522313f701a08Sujith#define RX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c++) 3207d547eb4bb664c5a6b7c8790c2ecb0aec5d15385Sujith Manoharan#define CAB_STAT_INC priv->debug.tx_stats.cab_queued++ 321fb9987d0f748c983bb795a86f47522313f701a08Sujith 3222edb4583c6a581e1e48af259db2a2d467d11551dSujith#define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++) 3232edb4583c6a581e1e48af259db2a2d467d11551dSujith 324719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharanvoid ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv, 325719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan struct ath_htc_rx_status *rxs); 326719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan 327fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath_tx_stats { 328fb9987d0f748c983bb795a86f47522313f701a08Sujith u32 buf_queued; 329fb9987d0f748c983bb795a86f47522313f701a08Sujith u32 buf_completed; 330fb9987d0f748c983bb795a86f47522313f701a08Sujith u32 skb_queued; 331b587fc81a80b9656f64e89fe0a106ffa4b35abcaSujith Manoharan u32 skb_success; 332b587fc81a80b9656f64e89fe0a106ffa4b35abcaSujith Manoharan u32 skb_failed; 3337d547eb4bb664c5a6b7c8790c2ecb0aec5d15385Sujith Manoharan u32 cab_queued; 3342edb4583c6a581e1e48af259db2a2d467d11551dSujith u32 queue_stats[WME_NUM_AC]; 335fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 336fb9987d0f748c983bb795a86f47522313f701a08Sujith 337fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath_rx_stats { 338fb9987d0f748c983bb795a86f47522313f701a08Sujith u32 skb_allocated; 339fb9987d0f748c983bb795a86f47522313f701a08Sujith u32 skb_completed; 340fb9987d0f748c983bb795a86f47522313f701a08Sujith u32 skb_dropped; 341719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan u32 err_crc; 342719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan u32 err_decrypt_crc; 343719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan u32 err_mic; 344719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan u32 err_pre_delim; 345719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan u32 err_post_delim; 346719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan u32 err_decrypt_busy; 347719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan u32 err_phy; 348719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan u32 err_phy_stats[ATH9K_PHYERR_MAX]; 349fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 350fb9987d0f748c983bb795a86f47522313f701a08Sujith 351fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_debug { 352fb9987d0f748c983bb795a86f47522313f701a08Sujith struct dentry *debugfs_phy; 353fb9987d0f748c983bb795a86f47522313f701a08Sujith struct ath_tx_stats tx_stats; 354fb9987d0f748c983bb795a86f47522313f701a08Sujith struct ath_rx_stats rx_stats; 355fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 356fb9987d0f748c983bb795a86f47522313f701a08Sujith 357fb9987d0f748c983bb795a86f47522313f701a08Sujith#else 358fb9987d0f748c983bb795a86f47522313f701a08Sujith 359fb9987d0f748c983bb795a86f47522313f701a08Sujith#define TX_STAT_INC(c) do { } while (0) 360fb9987d0f748c983bb795a86f47522313f701a08Sujith#define RX_STAT_INC(c) do { } while (0) 3617d547eb4bb664c5a6b7c8790c2ecb0aec5d15385Sujith Manoharan#define CAB_STAT_INC do { } while (0) 362fb9987d0f748c983bb795a86f47522313f701a08Sujith 363ed3305b4bb1fadff22e2f254bccfb3301e0b6b4fJohn W. Linville#define TX_QSTAT_INC(c) do { } while (0) 364ed3305b4bb1fadff22e2f254bccfb3301e0b6b4fJohn W. Linville 365719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharanstatic inline void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv, 366719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan struct ath_htc_rx_status *rxs) 367719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan{ 368719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan} 369719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan 370fb9987d0f748c983bb795a86f47522313f701a08Sujith#endif /* CONFIG_ATH9K_HTC_DEBUGFS */ 371fb9987d0f748c983bb795a86f47522313f701a08Sujith 372fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_LED_PIN_DEF 1 3736d64ab7f9240e3201fde3fd16ce4227bd795d2abRajkumar Manoharan#define ATH_LED_PIN_9287 10 374fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_LED_PIN_9271 15 37588c1f4f6dffe66e2fed8e7e3276e091ee850bed0Sujith#define ATH_LED_PIN_7010 12 376fb9987d0f748c983bb795a86f47522313f701a08Sujith 377832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan#define BSTUCK_THRESHOLD 10 378832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan 379b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan/* 380b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan * Adjust these when the max. no of beaconing interfaces is 381b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan * increased. 382b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan */ 383b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan#define DEFAULT_SWBA_RESPONSE 40 /* in TUs */ 384b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan#define MIN_SWBA_RESPONSE 10 /* in TUs */ 385b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan 3861c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajanstruct htc_beacon_config { 387832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan struct ieee80211_vif *bslot[ATH9K_HTC_MAX_BCN_VIF]; 3881c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan u16 beacon_interval; 3891c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan u16 dtim_period; 3901c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan u16 bmiss_timeout; 391832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan u32 bmiss_cnt; 3921c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan}; 3931c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan 39421cb987914cb5334af78378141efed77505ea987Vivek Natarajanstruct ath_btcoex { 39521cb987914cb5334af78378141efed77505ea987Vivek Natarajan u32 bt_priority_cnt; 39621cb987914cb5334af78378141efed77505ea987Vivek Natarajan unsigned long bt_priority_time; 39721cb987914cb5334af78378141efed77505ea987Vivek Natarajan int bt_stomp_type; /* Types of BT stomping */ 39821cb987914cb5334af78378141efed77505ea987Vivek Natarajan u32 btcoex_no_stomp; 39921cb987914cb5334af78378141efed77505ea987Vivek Natarajan u32 btcoex_period; 40021cb987914cb5334af78378141efed77505ea987Vivek Natarajan u32 btscan_no_stomp; 40121cb987914cb5334af78378141efed77505ea987Vivek Natarajan}; 40221cb987914cb5334af78378141efed77505ea987Vivek Natarajan 4039d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT 404cee5341d47fcd1cb79bbb71e430f502285fef8dbSujith Manoharanvoid ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product); 405bf047fcdaca3481fd6ce7d54011d2a774b8b7900Sujith Manoharanvoid ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv); 406bf047fcdaca3481fd6ce7d54011d2a774b8b7900Sujith Manoharanvoid ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv); 4079d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan#else 4089d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharanstatic inline void ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product) 4099d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan{ 4109d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan} 4119d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharanstatic inline void ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv) 4129d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan{ 4139d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan} 4149d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharanstatic inline void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv) 4159d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan{ 4169d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan} 4179d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */ 41821cb987914cb5334af78378141efed77505ea987Vivek Natarajan 41921cb987914cb5334af78378141efed77505ea987Vivek Natarajan#define OP_INVALID BIT(0) 42021cb987914cb5334af78378141efed77505ea987Vivek Natarajan#define OP_SCANNING BIT(1) 421d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#define OP_ENABLE_BEACON BIT(2) 422d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#define OP_BT_PRIORITY_DETECTED BIT(3) 423d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#define OP_BT_SCAN BIT(4) 424d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#define OP_ANI_RUNNING BIT(5) 425d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#define OP_TSF_RESET BIT(6) 426fb9987d0f748c983bb795a86f47522313f701a08Sujith 427fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_priv { 428fb9987d0f748c983bb795a86f47522313f701a08Sujith struct device *dev; 429fb9987d0f748c983bb795a86f47522313f701a08Sujith struct ieee80211_hw *hw; 430fb9987d0f748c983bb795a86f47522313f701a08Sujith struct ath_hw *ah; 431fb9987d0f748c983bb795a86f47522313f701a08Sujith struct htc_target *htc; 432fb9987d0f748c983bb795a86f47522313f701a08Sujith struct wmi *wmi; 433fb9987d0f748c983bb795a86f47522313f701a08Sujith 43429bbfb2491316f9a3888e74b0de7fccdbde67aaaSujith Manoharan u16 fw_version_major; 43529bbfb2491316f9a3888e74b0de7fccdbde67aaaSujith Manoharan u16 fw_version_minor; 43629bbfb2491316f9a3888e74b0de7fccdbde67aaaSujith Manoharan 437fb9987d0f748c983bb795a86f47522313f701a08Sujith enum htc_endpoint_id wmi_cmd_ep; 438fb9987d0f748c983bb795a86f47522313f701a08Sujith enum htc_endpoint_id beacon_ep; 439fb9987d0f748c983bb795a86f47522313f701a08Sujith enum htc_endpoint_id cab_ep; 440fb9987d0f748c983bb795a86f47522313f701a08Sujith enum htc_endpoint_id uapsd_ep; 441fb9987d0f748c983bb795a86f47522313f701a08Sujith enum htc_endpoint_id mgmt_ep; 442fb9987d0f748c983bb795a86f47522313f701a08Sujith enum htc_endpoint_id data_be_ep; 443fb9987d0f748c983bb795a86f47522313f701a08Sujith enum htc_endpoint_id data_bk_ep; 444fb9987d0f748c983bb795a86f47522313f701a08Sujith enum htc_endpoint_id data_vi_ep; 445fb9987d0f748c983bb795a86f47522313f701a08Sujith enum htc_endpoint_id data_vo_ep; 446fb9987d0f748c983bb795a86f47522313f701a08Sujith 447a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan u8 vif_slot; 448a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan u8 mon_vif_idx; 449a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan u8 sta_slot; 450a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan u8 vif_sta_pos[ATH9K_HTC_MAX_VIF]; 4510df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan u8 num_ibss_vif; 4520df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan u8 num_sta_vif; 4530cd075d74b319b88bbaad666c2b9b911859a5b0eSujith Manoharan u8 num_sta_assoc_vif; 454da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan u8 num_ap_vif; 455a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan 456fb9987d0f748c983bb795a86f47522313f701a08Sujith u16 op_flags; 457fb9987d0f748c983bb795a86f47522313f701a08Sujith u16 curtxpow; 458fb9987d0f748c983bb795a86f47522313f701a08Sujith u16 txpowlimit; 459fb9987d0f748c983bb795a86f47522313f701a08Sujith u16 nvifs; 460fb9987d0f748c983bb795a86f47522313f701a08Sujith u16 nstations; 4617c277349ecbd66e19fad3d949fa6ef6c131a3b62Sujith Manoharan bool rearm_ani; 4627c277349ecbd66e19fad3d949fa6ef6c131a3b62Sujith Manoharan bool reconfig_beacon; 463658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan unsigned int rxfilter; 464fb9987d0f748c983bb795a86f47522313f701a08Sujith 4654e3ae3873858f1e64afb19975360000bee15b502Rajkumar Manoharan struct ath9k_hw_cal_data caldata; 466658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; 46720bd2a0952d01ba82a99b3f22d46e3832c255529Felix Fietkau 468fb9987d0f748c983bb795a86f47522313f701a08Sujith spinlock_t beacon_lock; 469658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan struct htc_beacon_config cur_beacon_conf; 470fb9987d0f748c983bb795a86f47522313f701a08Sujith 471658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan struct ath9k_htc_rx rx; 472658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan struct ath9k_htc_tx tx; 4737757dfed5809b03aa61c7d7f5ff8092f85df8583Sujith 47473908674c6957082e8ab57daed57d2bb97a1ebbaSujith Manoharan struct tasklet_struct swba_tasklet; 475fb9987d0f748c983bb795a86f47522313f701a08Sujith struct tasklet_struct rx_tasklet; 476a236254c35f04a4d47c701ed3ec4a0b5dcb097b0Sujith Manoharan struct delayed_work ani_work; 47727876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan struct tasklet_struct tx_failed_tasklet; 478bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan struct work_struct ps_work; 47973908674c6957082e8ab57daed57d2bb97a1ebbaSujith Manoharan struct work_struct fatal_work; 480bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan 481bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan struct mutex htc_pm_lock; 482bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan unsigned long ps_usecount; 483bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan bool ps_enabled; 4848a8572a821e5763525f5e4ac104bc28fd798fd5eVivek Natarajan bool ps_idle; 485fb9987d0f748c983bb795a86f47522313f701a08Sujith 486d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#ifdef CONFIG_MAC80211_LEDS 487d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan enum led_brightness brightness; 488d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan bool led_registered; 489d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan char led_name[32]; 490d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan struct led_classdev led_cdev; 491d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan struct work_struct led_work; 492d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#endif 493ca74b83b66dbd289a395c6243695d746c76676ccSujith 494ca74b83b66dbd289a395c6243695d746c76676ccSujith int beaconq; 495ca74b83b66dbd289a395c6243695d746c76676ccSujith int cabq; 496e8c35a77e3408171852bde4914b650cf5b83e0d1Felix Fietkau int hwq_map[WME_NUM_AC]; 497fb9987d0f748c983bb795a86f47522313f701a08Sujith 4989d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT 49921cb987914cb5334af78378141efed77505ea987Vivek Natarajan struct ath_btcoex btcoex; 5009d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan#endif 5019d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan 50221cb987914cb5334af78378141efed77505ea987Vivek Natarajan struct delayed_work coex_period_work; 50321cb987914cb5334af78378141efed77505ea987Vivek Natarajan struct delayed_work duty_cycle_work; 504fb9987d0f748c983bb795a86f47522313f701a08Sujith#ifdef CONFIG_ATH9K_HTC_DEBUGFS 505fb9987d0f748c983bb795a86f47522313f701a08Sujith struct ath9k_debug debug; 506fb9987d0f748c983bb795a86f47522313f701a08Sujith#endif 507fb9987d0f748c983bb795a86f47522313f701a08Sujith struct mutex mutex; 508fb9987d0f748c983bb795a86f47522313f701a08Sujith}; 509fb9987d0f748c983bb795a86f47522313f701a08Sujith 510fb9987d0f748c983bb795a86f47522313f701a08Sujithstatic inline void ath_read_cachesize(struct ath_common *common, int *csz) 511fb9987d0f748c983bb795a86f47522313f701a08Sujith{ 512fb9987d0f748c983bb795a86f47522313f701a08Sujith common->bus_ops->read_cachesize(common, csz); 513fb9987d0f748c983bb795a86f47522313f701a08Sujith} 514fb9987d0f748c983bb795a86f47522313f701a08Sujith 51573908674c6957082e8ab57daed57d2bb97a1ebbaSujith Manoharanvoid ath9k_htc_reset(struct ath9k_htc_priv *priv); 51673908674c6957082e8ab57daed57d2bb97a1ebbaSujith Manoharan 517832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharanvoid ath9k_htc_assign_bslot(struct ath9k_htc_priv *priv, 518832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan struct ieee80211_vif *vif); 519832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharanvoid ath9k_htc_remove_bslot(struct ath9k_htc_priv *priv, 520832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan struct ieee80211_vif *vif); 5219b674a0207c9b75ddcdcdb07e46843fac8267507Sujith Manoharanvoid ath9k_htc_set_tsfadjust(struct ath9k_htc_priv *priv, 5229b674a0207c9b75ddcdcdb07e46843fac8267507Sujith Manoharan struct ieee80211_vif *vif); 523764580f577a46adce6ad6717a9b34aa8e3a09159Sujithvoid ath9k_htc_beaconq_config(struct ath9k_htc_priv *priv); 524fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_htc_beacon_config(struct ath9k_htc_priv *priv, 5251c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan struct ieee80211_vif *vif); 5267c277349ecbd66e19fad3d949fa6ef6c131a3b62Sujith Manoharanvoid ath9k_htc_beacon_reconfig(struct ath9k_htc_priv *priv); 527f4c88991f51e097b6541f998fd23d477999e5886Sujith Manoharanvoid ath9k_htc_swba(struct ath9k_htc_priv *priv, 528f4c88991f51e097b6541f998fd23d477999e5886Sujith Manoharan struct wmi_event_swba *swba); 529fb9987d0f748c983bb795a86f47522313f701a08Sujith 530fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_htc_rxep(void *priv, struct sk_buff *skb, 531fb9987d0f748c983bb795a86f47522313f701a08Sujith enum htc_endpoint_id ep_id); 532fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_htc_txep(void *priv, struct sk_buff *skb, enum htc_endpoint_id ep_id, 533fb9987d0f748c983bb795a86f47522313f701a08Sujith bool txok); 5349c6dda4e2dfea970a7105e3805f0195bc3079f2fSujithvoid ath9k_htc_beaconep(void *drv_priv, struct sk_buff *skb, 5359c6dda4e2dfea970a7105e3805f0195bc3079f2fSujith enum htc_endpoint_id ep_id, bool txok); 536fb9987d0f748c983bb795a86f47522313f701a08Sujith 5373a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharanint ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv, 5383a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan u8 enable_coex); 539a236254c35f04a4d47c701ed3ec4a0b5dcb097b0Sujith Manoharanvoid ath9k_htc_ani_work(struct work_struct *work); 540a236254c35f04a4d47c701ed3ec4a0b5dcb097b0Sujith Manoharanvoid ath9k_htc_start_ani(struct ath9k_htc_priv *priv); 541a236254c35f04a4d47c701ed3ec4a0b5dcb097b0Sujith Manoharanvoid ath9k_htc_stop_ani(struct ath9k_htc_priv *priv); 542fb9987d0f748c983bb795a86f47522313f701a08Sujith 543fb9987d0f748c983bb795a86f47522313f701a08Sujithint ath9k_tx_init(struct ath9k_htc_priv *priv); 5447d547eb4bb664c5a6b7c8790c2ecb0aec5d15385Sujith Manoharanint ath9k_htc_tx_start(struct ath9k_htc_priv *priv, 5452c5d57f004673a9c8658e20b1fa3f992b5a10f70Sujith Manoharan struct sk_buff *skb, u8 slot, bool is_cab); 546fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_tx_cleanup(struct ath9k_htc_priv *priv); 547e8c35a77e3408171852bde4914b650cf5b83e0d1Felix Fietkaubool ath9k_htc_txq_setup(struct ath9k_htc_priv *priv, int subtype); 548ca74b83b66dbd289a395c6243695d746c76676ccSujithint ath9k_htc_cabq_setup(struct ath9k_htc_priv *priv); 549fb9987d0f748c983bb795a86f47522313f701a08Sujithint get_hw_qnum(u16 queue, int *hwq_map); 550e1572c5eeca8ef87a250322364584458b2dadb35Sujithint ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum, 551e1572c5eeca8ef87a250322364584458b2dadb35Sujith struct ath9k_tx_queue_info *qinfo); 5528e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharanvoid ath9k_htc_check_stop_queues(struct ath9k_htc_priv *priv); 5538e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharanvoid ath9k_htc_check_wake_queues(struct ath9k_htc_priv *priv); 5542c5d57f004673a9c8658e20b1fa3f992b5a10f70Sujith Manoharanint ath9k_htc_tx_get_slot(struct ath9k_htc_priv *priv); 5552c5d57f004673a9c8658e20b1fa3f992b5a10f70Sujith Manoharanvoid ath9k_htc_tx_clear_slot(struct ath9k_htc_priv *priv, int slot); 556b587fc81a80b9656f64e89fe0a106ffa4b35abcaSujith Manoharanvoid ath9k_htc_tx_drain(struct ath9k_htc_priv *priv); 55727876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharanvoid ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event); 55827876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharanvoid ath9k_tx_failed_tasklet(unsigned long data); 559859c3ca1e4608615788dc6cbc199210fe4b5efa2Sujith Manoharanvoid ath9k_htc_tx_cleanup_timer(unsigned long data); 560fb9987d0f748c983bb795a86f47522313f701a08Sujith 561fb9987d0f748c983bb795a86f47522313f701a08Sujithint ath9k_rx_init(struct ath9k_htc_priv *priv); 562fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_rx_cleanup(struct ath9k_htc_priv *priv); 563fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_host_rx_init(struct ath9k_htc_priv *priv); 564fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_rx_tasklet(unsigned long data); 5650995d110118b35c0dc5195e3ddddcc0dec263830Sujithu32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv); 566fb9987d0f748c983bb795a86f47522313f701a08Sujith 567bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajanvoid ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv); 568bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajanvoid ath9k_htc_ps_restore(struct ath9k_htc_priv *priv); 569bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajanvoid ath9k_ps_work(struct work_struct *work); 570f933ebed7888a9a7d73ebeeb6bcbb3f710c423b4Sujith Manoharanbool ath9k_htc_setpower(struct ath9k_htc_priv *priv, 571f933ebed7888a9a7d73ebeeb6bcbb3f710c423b4Sujith Manoharan enum ath9k_power_mode mode); 572bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan 573fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv); 5741e1f4ad25fab29ca48b1166e74a81e9c89ddf0fbSujith Manoharanvoid ath9k_htc_rfkill_poll_state(struct ieee80211_hw *hw); 5751e1f4ad25fab29ca48b1166e74a81e9c89ddf0fbSujith Manoharanvoid ath9k_htc_radio_enable(struct ieee80211_hw *hw); 5761e1f4ad25fab29ca48b1166e74a81e9c89ddf0fbSujith Manoharanvoid ath9k_htc_radio_disable(struct ieee80211_hw *hw); 577d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan 578d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#ifdef CONFIG_MAC80211_LEDS 579fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_init_leds(struct ath9k_htc_priv *priv); 580fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_deinit_leds(struct ath9k_htc_priv *priv); 581d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharanvoid ath9k_led_work(struct work_struct *work); 582d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#else 583d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharanstatic inline void ath9k_init_leds(struct ath9k_htc_priv *priv) 584d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan{ 585d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan} 586d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan 587d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharanstatic inline void ath9k_deinit_leds(struct ath9k_htc_priv *priv) 588d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan{ 589d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan} 590d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan 591d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharanstatic inline void ath9k_led_work(struct work_struct *work) 592d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan{ 593d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan} 594d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#endif 595fb9987d0f748c983bb795a86f47522313f701a08Sujith 596fb9987d0f748c983bb795a86f47522313f701a08Sujithint ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev, 597fa6e15e0b5952fd2cd99fc6d4f4473f6b9da18dfRajkumar Manoharan u16 devid, char *product, u32 drv_info); 598fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug); 599fb9987d0f748c983bb795a86f47522313f701a08Sujith#ifdef CONFIG_PM 600f933ebed7888a9a7d73ebeeb6bcbb3f710c423b4Sujith Manoharanvoid ath9k_htc_suspend(struct htc_target *htc_handle); 601fb9987d0f748c983bb795a86f47522313f701a08Sujithint ath9k_htc_resume(struct htc_target *htc_handle); 602fb9987d0f748c983bb795a86f47522313f701a08Sujith#endif 603fb9987d0f748c983bb795a86f47522313f701a08Sujith#ifdef CONFIG_ATH9K_HTC_DEBUGFS 604e1572c5eeca8ef87a250322364584458b2dadb35Sujithint ath9k_htc_init_debug(struct ath_hw *ah); 605fb9987d0f748c983bb795a86f47522313f701a08Sujith#else 606e1572c5eeca8ef87a250322364584458b2dadb35Sujithstatic inline int ath9k_htc_init_debug(struct ath_hw *ah) { return 0; }; 607fb9987d0f748c983bb795a86f47522313f701a08Sujith#endif /* CONFIG_ATH9K_HTC_DEBUGFS */ 608fb9987d0f748c983bb795a86f47522313f701a08Sujith 609fb9987d0f748c983bb795a86f47522313f701a08Sujith#endif /* HTC_H */ 610