Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[pandora-kernel.git] / drivers / net / wireless / ath / ath9k / hw.h
index d47d1b4..ef79f4c 100644 (file)
@@ -30,7 +30,6 @@
 #include "btcoex.h"
 
 #include "../regd.h"
-#include "../debug.h"
 
 #define ATHEROS_VENDOR_ID      0x168c
 
@@ -44,6 +43,7 @@
 #define AR9287_DEVID_PCI       0x002d
 #define AR9287_DEVID_PCIE      0x002e
 #define AR9300_DEVID_PCIE      0x0030
+#define AR9300_DEVID_AR9485_PCIE 0x0032
 
 #define AR5416_AR9100_DEVID    0x000b
 
@@ -70,6 +70,9 @@
 #define REG_READ(_ah, _reg) \
        ath9k_hw_common(_ah)->ops->read((_ah), (_reg))
 
+#define REG_READ_MULTI(_ah, _addr, _val, _cnt)         \
+       ath9k_hw_common(_ah)->ops->multi_read((_ah), (_addr), (_val), (_cnt))
+
 #define ENABLE_REGWRITE_BUFFER(_ah)                                    \
        do {                                                            \
                if (ath9k_hw_common(_ah)->ops->enable_write_buffer)     \
 #define PAPRD_GAIN_TABLE_ENTRIES    32
 #define PAPRD_TABLE_SZ              24
 
+enum ath_hw_txq_subtype {
+       ATH_TXQ_AC_BE = 0,
+       ATH_TXQ_AC_BK = 1,
+       ATH_TXQ_AC_VI = 2,
+       ATH_TXQ_AC_VO = 3,
+};
+
 enum ath_ini_subsys {
        ATH_INI_PRE = 0,
        ATH_INI_CORE,
@@ -180,6 +190,7 @@ enum ath9k_hw_caps {
        ATH9K_HW_CAP_ANT_DIV_COMB               = BIT(12),
        ATH9K_HW_CAP_2GHZ                       = BIT(13),
        ATH9K_HW_CAP_5GHZ                       = BIT(14),
+       ATH9K_HW_CAP_APM                        = BIT(15),
 };
 
 struct ath9k_hw_capabilities {
@@ -191,16 +202,18 @@ struct ath9k_hw_capabilities {
        u16 rts_aggr_limit;
        u8 tx_chainmask;
        u8 rx_chainmask;
+       u8 max_txchains;
+       u8 max_rxchains;
        u16 tx_triglevel_max;
        u16 reg_cap;
        u8 num_gpio_pins;
-       u8 num_antcfg_2ghz;
-       u8 num_antcfg_5ghz;
        u8 rx_hp_qdepth;
        u8 rx_lp_qdepth;
        u8 rx_status_len;
        u8 tx_desc_len;
        u8 txs_len;
+       u16 pcie_lcr_offset;
+       bool pcie_lcr_extsync_en;
 };
 
 struct ath9k_ops_config {
@@ -215,6 +228,7 @@ struct ath9k_ops_config {
        u32 pcie_waen;
        u8 analog_shiftreg;
        u8 ht_enable;
+       u8 paprd_disable;
        u32 ofdm_trig_low;
        u32 ofdm_trig_high;
        u32 cck_trig_high;
@@ -226,7 +240,6 @@ struct ath9k_ops_config {
 #define SPUR_DISABLE           0
 #define SPUR_ENABLE_IOCTL      1
 #define SPUR_ENABLE_EEPROM     2
-#define AR_EEPROM_MODAL_SPURS   5
 #define AR_SPUR_5413_1         1640
 #define AR_SPUR_5413_2         1200
 #define AR_NO_SPUR             0x8000
@@ -434,6 +447,7 @@ struct ath9k_hw_version {
        u16 analog5GhzRev;
        u16 analog2GhzRev;
        u16 subsysid;
+       enum ath_usb_dev usbdev;
 };
 
 /* Generic TSF timer definitions */
@@ -477,6 +491,40 @@ struct ath_hw_antcomb_conf {
        u8 fast_div_bias;
 };
 
+/**
+ * struct ath_hw_radar_conf - radar detection initialization parameters
+ *
+ * @pulse_inband: threshold for checking the ratio of in-band power
+ *     to total power for short radar pulses (half dB steps)
+ * @pulse_inband_step: threshold for checking an in-band power to total
+ *     power ratio increase for short radar pulses (half dB steps)
+ * @pulse_height: threshold for detecting the beginning of a short
+ *     radar pulse (dB step)
+ * @pulse_rssi: threshold for detecting if a short radar pulse is
+ *     gone (dB step)
+ * @pulse_maxlen: maximum pulse length (0.8 us steps)
+ *
+ * @radar_rssi: RSSI threshold for starting long radar detection (dB steps)
+ * @radar_inband: threshold for checking the ratio of in-band power
+ *     to total power for long radar pulses (half dB steps)
+ * @fir_power: threshold for detecting the end of a long radar pulse (dB)
+ *
+ * @ext_channel: enable extension channel radar detection
+ */
+struct ath_hw_radar_conf {
+       unsigned int pulse_inband;
+       unsigned int pulse_inband_step;
+       unsigned int pulse_height;
+       unsigned int pulse_rssi;
+       unsigned int pulse_maxlen;
+
+       unsigned int radar_rssi;
+       unsigned int radar_inband;
+       int fir_power;
+
+       bool ext_channel;
+};
+
 /**
  * struct ath_hw_private_ops - callbacks used internally by hardware code
  *
@@ -488,7 +536,6 @@ struct ath_hw_antcomb_conf {
  *
  * @init_mode_regs: Initializes mode registers
  * @init_mode_gain_regs: Initialize TX/RX gain registers
- * @macversion_supported: If this specific mac revision is supported
  *
  * @rf_set_freq: change frequency
  * @spur_mitigate_freq: spur mitigation
@@ -510,7 +557,6 @@ struct ath_hw_private_ops {
 
        void (*init_mode_regs)(struct ath_hw *ah);
        void (*init_mode_gain_regs)(struct ath_hw *ah);
-       bool (*macversion_supported)(u32 macversion);
        void (*setup_calibration)(struct ath_hw *ah,
                                  struct ath9k_cal_list *currCal);
 
@@ -534,7 +580,6 @@ struct ath_hw_private_ops {
        void (*set_delta_slope)(struct ath_hw *ah, struct ath9k_channel *chan);
        bool (*rfbus_req)(struct ath_hw *ah);
        void (*rfbus_done)(struct ath_hw *ah);
-       void (*enable_rfkill)(struct ath_hw *ah);
        void (*restore_chainmask)(struct ath_hw *ah);
        void (*set_diversity)(struct ath_hw *ah, bool value);
        u32 (*compute_pll_control)(struct ath_hw *ah,
@@ -542,6 +587,8 @@ struct ath_hw_private_ops {
        bool (*ani_control)(struct ath_hw *ah, enum ath9k_ani_cmd cmd,
                            int param);
        void (*do_getnf)(struct ath_hw *ah, int16_t nfarray[NUM_NF_READINGS]);
+       void (*set_radar_params)(struct ath_hw *ah,
+                                struct ath_hw_radar_conf *conf);
 
        /* ANI */
        void (*ani_cache_ini_regs)(struct ath_hw *ah);
@@ -603,6 +650,10 @@ struct ath_nf_limits {
        s16 nominal;
 };
 
+/* ah_flags */
+#define AH_USE_EEPROM   0x1
+#define AH_UNPLUGGED    0x2 /* The card has been physically removed. */
+
 struct ath_hw {
        struct ieee80211_hw *hw;
        struct ath_common common;
@@ -718,9 +769,7 @@ struct ath_hw {
        u32 *bank6Temp;
 
        u8 txpower_limit;
-       int16_t txpower_indexoffset;
        int coverage_class;
-       u32 beacon_interval;
        u32 slottime;
        u32 globaltxtimeout;
 
@@ -740,6 +789,8 @@ struct ath_hw {
        u8 txchainmask;
        u8 rxchainmask;
 
+       struct ath_hw_radar_conf radar_conf;
+
        u32 originalGain[22];
        int initPDADC;
        int PDADCdelta;
@@ -789,6 +840,11 @@ struct ath_hw {
        u32 bb_watchdog_last_status;
        u32 bb_watchdog_timeout_ms; /* in ms, 0 to disable */
 
+       unsigned int paprd_target_power;
+       unsigned int paprd_training_power;
+       unsigned int paprd_ratemask;
+       unsigned int paprd_ratemask_ht40;
+       bool paprd_table_write_done;
        u32 paprd_gain_table_entries[PAPRD_GAIN_TABLE_ENTRIES];
        u8 paprd_gain_table_index[PAPRD_GAIN_TABLE_ENTRIES];
        /*
@@ -797,6 +853,9 @@ struct ath_hw {
         * this register when in sleep states.
         */
        u32 WARegVal;
+
+       /* Enterprise mode cap */
+       u32 ent_mode;
 };
 
 static inline struct ath_common *ath9k_hw_common(struct ath_hw *ah)
@@ -819,10 +878,9 @@ static inline struct ath_hw_ops *ath9k_hw_ops(struct ath_hw *ah)
        return &ah->ops;
 }
 
-static inline int sign_extend(int val, const int nbits)
+static inline u8 get_streams(int mask)
 {
-       int order = BIT(nbits-1);
-       return (val ^ order) - order;
+       return !!(mask & BIT(0)) + !!(mask & BIT(1)) + !!(mask & BIT(2));
 }
 
 /* Initialization, Detach, Reset */
@@ -861,7 +919,7 @@ u32 ath9k_hw_getrxfilter(struct ath_hw *ah);
 void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits);
 bool ath9k_hw_phy_disable(struct ath_hw *ah);
 bool ath9k_hw_disable(struct ath_hw *ah);
-void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit);
+void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test);
 void ath9k_hw_setopmode(struct ath_hw *ah);
 void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1);
 void ath9k_hw_setbssidmask(struct ath_hw *ah);
@@ -871,6 +929,7 @@ void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64);
 void ath9k_hw_reset_tsf(struct ath_hw *ah);
 void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting);
 void ath9k_hw_init_global_settings(struct ath_hw *ah);
+unsigned long ar9003_get_pll_sqsum_dvc(struct ath_hw *ah);
 void ath9k_hw_set11nmac2040(struct ath_hw *ah);
 void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period);
 void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
@@ -893,7 +952,6 @@ void ath9k_hw_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer);
 
 void ath_gen_timer_free(struct ath_hw *ah, struct ath_gen_timer *timer);
 void ath_gen_timer_isr(struct ath_hw *hw);
-u32 ath9k_hw_gettsf32(struct ath_hw *ah);
 
 void ath9k_hw_name(struct ath_hw *ah, char *hw_name, size_t len);