]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
authorDavid S. Miller <davem@davemloft.net>
Tue, 17 Mar 2009 22:01:30 +0000 (15:01 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 17 Mar 2009 22:01:30 +0000 (15:01 -0700)
Conflicts:
drivers/net/igb/igb_main.c
drivers/net/qlge/qlge_main.c
drivers/net/wireless/ath9k/ath9k.h
drivers/net/wireless/ath9k/core.h
drivers/net/wireless/ath9k/hw.c

19 files changed:
1  2 
MAINTAINERS
drivers/net/Kconfig
drivers/net/Makefile
drivers/net/igb/igb_main.c
drivers/net/ixgbe/ixgbe_main.c
drivers/net/mv643xx_eth.c
drivers/net/netxen/netxen_nic.h
drivers/net/netxen/netxen_nic_hw.c
drivers/net/netxen/netxen_nic_main.c
drivers/net/qlge/qlge_main.c
drivers/net/r8169.c
drivers/net/wireless/ath9k/ath9k.h
drivers/net/wireless/ath9k/hw.c
drivers/net/wireless/ath9k/hw.h
drivers/net/wireless/ath9k/main.c
drivers/net/wireless/zd1211rw/zd_mac.c
net/core/dev.c
net/ipv6/af_inet6.c
net/mac80211/tx.c

diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
index 7124f59fb99fdb59527da0be1fc0776b1c04f6ef,9dd13ad12ce48a502469c96474e8210ccb5c00a1..7c4481b994abedfb186ade8f2684ec38ea768870
@@@ -1128,15 -1023,23 +1128,14 @@@ static int __devinit igb_probe(struct p
        struct net_device *netdev;
        struct igb_adapter *adapter;
        struct e1000_hw *hw;
-       struct pci_dev *us_dev;
        const struct e1000_info *ei = igb_info_tbl[ent->driver_data];
        unsigned long mmio_start, mmio_len;
-       int err, pci_using_dac, pos;
-       u16 eeprom_data = 0, state = 0;
 -      int i, err, pci_using_dac;
++      int err, pci_using_dac;
+       u16 eeprom_data = 0;
        u16 eeprom_apme_mask = IGB_EEPROM_APME;
        u32 part_num;
 -      int bars, need_ioport;
  
 -      /* do not allocate ioport bars when not needed */
 -      need_ioport = igb_is_need_ioport(pdev);
 -      if (need_ioport) {
 -              bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
 -              err = pci_enable_device(pdev);
 -      } else {
 -              bars = pci_select_bars(pdev, IORESOURCE_MEM);
 -              err = pci_enable_device_mem(pdev);
 -      }
 +      err = pci_enable_device_mem(pdev);
        if (err)
                return err;
  
                }
        }
  
-       /* 82575 requires that the pci-e link partner disable the L0s state */
-       switch (pdev->device) {
-       case E1000_DEV_ID_82575EB_COPPER:
-       case E1000_DEV_ID_82575EB_FIBER_SERDES:
-       case E1000_DEV_ID_82575GB_QUAD_COPPER:
-               us_dev = pdev->bus->self;
-               pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP);
-               if (pos) {
-                       pci_read_config_word(us_dev, pos + PCI_EXP_LNKCTL,
-                                            &state);
-                       state &= ~PCIE_LINK_STATE_L0S;
-                       pci_write_config_word(us_dev, pos + PCI_EXP_LNKCTL,
-                                             state);
-                       dev_info(&pdev->dev,
-                                "Disabling ASPM L0s upstream switch port %s\n",
-                                pci_name(us_dev));
-               }
-       default:
-               break;
-       }
 -      err = pci_request_selected_regions(pdev, bars, igb_driver_name);
 +      err = pci_request_selected_regions(pdev, pci_select_bars(pdev,
 +                                         IORESOURCE_MEM),
 +                                         igb_driver_name);
        if (err)
                goto err_pci_reg;
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index b91b700a081b0053b81e056aaa5b95b4ce818c55,91191f761fbaae3ae1bc15c0d9a05560c885b3da..170d3540f9c9fb7185d66c9c0af5ce872a3f66e5
@@@ -3247,7 -3171,6 +3246,8 @@@ static int ql_adapter_down(struct ql_ad
        for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++)
                netif_napi_del(&qdev->rx_ring[i].napi);
  
 +      ql_free_rx_buffers(qdev);
++
        spin_lock(&qdev->hw_lock);
        status = ql_adapter_reset(qdev);
        if (status)
Simple merge
index f0b105a11ae2b6144fbfe7601775ed3e02c9846f,6650f609ece4eaf82925ceea690b09b0d0cb8a3f..b64be8e9a69029ba067b241de1a771f8a2060803
  #ifndef ATH9K_H
  #define ATH9K_H
  
 -#include <linux/io.h>
 -
 -#define ATHEROS_VENDOR_ID     0x168c
 -
 -#define AR5416_DEVID_PCI      0x0023
 -#define AR5416_DEVID_PCIE     0x0024
 -#define AR9160_DEVID_PCI      0x0027
 -#define AR9280_DEVID_PCI      0x0029
 -#define AR9280_DEVID_PCIE     0x002a
 -#define AR9285_DEVID_PCIE     0x002b
 -
 -#define AR5416_AR9100_DEVID   0x000b
 -
 -#define       AR_SUBVENDOR_ID_NOG     0x0e11
 -#define AR_SUBVENDOR_ID_NEW_A 0x7065
 -
 -#define ATH9K_TXERR_XRETRY         0x01
 -#define ATH9K_TXERR_FILT           0x02
 -#define ATH9K_TXERR_FIFO           0x04
 -#define ATH9K_TXERR_XTXOP          0x08
 -#define ATH9K_TXERR_TIMER_EXPIRED  0x10
 -
 -#define ATH9K_TX_BA                0x01
 -#define ATH9K_TX_PWRMGMT           0x02
 -#define ATH9K_TX_DESC_CFG_ERR      0x04
 -#define ATH9K_TX_DATA_UNDERRUN     0x08
 -#define ATH9K_TX_DELIM_UNDERRUN    0x10
 -#define ATH9K_TX_SW_ABORTED        0x40
 -#define ATH9K_TX_SW_FILTERED       0x80
 -
 -#define NBBY    8
 -
 -struct ath_tx_status {
 -      u32 ts_tstamp;
 -      u16 ts_seqnum;
 -      u8 ts_status;
 -      u8 ts_ratecode;
 -      u8 ts_rateindex;
 -      int8_t ts_rssi;
 -      u8 ts_shortretry;
 -      u8 ts_longretry;
 -      u8 ts_virtcol;
 -      u8 ts_antenna;
 -      u8 ts_flags;
 -      int8_t ts_rssi_ctl0;
 -      int8_t ts_rssi_ctl1;
 -      int8_t ts_rssi_ctl2;
 -      int8_t ts_rssi_ext0;
 -      int8_t ts_rssi_ext1;
 -      int8_t ts_rssi_ext2;
 -      u8 pad[3];
 -      u32 ba_low;
 -      u32 ba_high;
 -      u32 evm0;
 -      u32 evm1;
 -      u32 evm2;
 -};
 -
 -struct ath_rx_status {
 -      u32 rs_tstamp;
 -      u16 rs_datalen;
 -      u8 rs_status;
 -      u8 rs_phyerr;
 -      int8_t rs_rssi;
 -      u8 rs_keyix;
 -      u8 rs_rate;
 -      u8 rs_antenna;
 -      u8 rs_more;
 -      int8_t rs_rssi_ctl0;
 -      int8_t rs_rssi_ctl1;
 -      int8_t rs_rssi_ctl2;
 -      int8_t rs_rssi_ext0;
 -      int8_t rs_rssi_ext1;
 -      int8_t rs_rssi_ext2;
 -      u8 rs_isaggr;
 -      u8 rs_moreaggr;
 -      u8 rs_num_delims;
 -      u8 rs_flags;
 -      u32 evm0;
 -      u32 evm1;
 -      u32 evm2;
 -};
 -
 -#define ATH9K_RXERR_CRC           0x01
 -#define ATH9K_RXERR_PHY           0x02
 -#define ATH9K_RXERR_FIFO          0x04
 -#define ATH9K_RXERR_DECRYPT       0x08
 -#define ATH9K_RXERR_MIC           0x10
 -
 -#define ATH9K_RX_MORE             0x01
 -#define ATH9K_RX_MORE_AGGR        0x02
 -#define ATH9K_RX_GI               0x04
 -#define ATH9K_RX_2040             0x08
 -#define ATH9K_RX_DELIM_CRC_PRE    0x10
 -#define ATH9K_RX_DELIM_CRC_POST   0x20
 -#define ATH9K_RX_DECRYPT_BUSY     0x40
 -
 -#define ATH9K_RXKEYIX_INVALID ((u8)-1)
 -#define ATH9K_TXKEYIX_INVALID ((u32)-1)
 -
 -struct ath_desc {
 -      u32 ds_link;
 -      u32 ds_data;
 -      u32 ds_ctl0;
 -      u32 ds_ctl1;
 -      u32 ds_hw[20];
 -      union {
 -              struct ath_tx_status tx;
 -              struct ath_rx_status rx;
 -              void *stats;
 -      } ds_us;
 -      void *ds_vdata;
 -} __packed;
 -
 -#define       ds_txstat       ds_us.tx
 -#define       ds_rxstat       ds_us.rx
 -#define ds_stat               ds_us.stats
 -
 -#define ATH9K_TXDESC_CLRDMASK         0x0001
 -#define ATH9K_TXDESC_NOACK            0x0002
 -#define ATH9K_TXDESC_RTSENA           0x0004
 -#define ATH9K_TXDESC_CTSENA           0x0008
 -/* ATH9K_TXDESC_INTREQ forces a tx interrupt to be generated for
 - * the descriptor its marked on.  We take a tx interrupt to reap
 - * descriptors when the h/w hits an EOL condition or
 - * when the descriptor is specifically marked to generate
 - * an interrupt with this flag. Descriptors should be
 - * marked periodically to insure timely replenishing of the
 - * supply needed for sending frames. Defering interrupts
 - * reduces system load and potentially allows more concurrent
 - * work to be done but if done to aggressively can cause
 - * senders to backup. When the hardware queue is left too
 - * large rate control information may also be too out of
 - * date. An Alternative for this is TX interrupt mitigation
 - * but this needs more testing. */
 -#define ATH9K_TXDESC_INTREQ           0x0010
 -#define ATH9K_TXDESC_VEOL             0x0020
 -#define ATH9K_TXDESC_EXT_ONLY         0x0040
 -#define ATH9K_TXDESC_EXT_AND_CTL      0x0080
 -#define ATH9K_TXDESC_VMF              0x0100
 -#define ATH9K_TXDESC_FRAG_IS_ON       0x0200
 -#define ATH9K_TXDESC_CAB              0x0400
 -
 -#define ATH9K_RXDESC_INTREQ           0x0020
 -
 -enum wireless_mode {
 -      ATH9K_MODE_11A = 0,
 -      ATH9K_MODE_11B = 2,
 -      ATH9K_MODE_11G = 3,
 -      ATH9K_MODE_11NA_HT20 = 6,
 -      ATH9K_MODE_11NG_HT20 = 7,
 -      ATH9K_MODE_11NA_HT40PLUS = 8,
 -      ATH9K_MODE_11NA_HT40MINUS = 9,
 -      ATH9K_MODE_11NG_HT40PLUS = 10,
 -      ATH9K_MODE_11NG_HT40MINUS = 11,
 -      ATH9K_MODE_MAX
 -};
 -
 -enum ath9k_hw_caps {
 -      ATH9K_HW_CAP_CHAN_SPREAD                = BIT(0),
 -      ATH9K_HW_CAP_MIC_AESCCM                 = BIT(1),
 -      ATH9K_HW_CAP_MIC_CKIP                   = BIT(2),
 -      ATH9K_HW_CAP_MIC_TKIP                   = BIT(3),
 -      ATH9K_HW_CAP_CIPHER_AESCCM              = BIT(4),
 -      ATH9K_HW_CAP_CIPHER_CKIP                = BIT(5),
 -      ATH9K_HW_CAP_CIPHER_TKIP                = BIT(6),
 -      ATH9K_HW_CAP_VEOL                       = BIT(7),
 -      ATH9K_HW_CAP_BSSIDMASK                  = BIT(8),
 -      ATH9K_HW_CAP_MCAST_KEYSEARCH            = BIT(9),
 -      ATH9K_HW_CAP_CHAN_HALFRATE              = BIT(10),
 -      ATH9K_HW_CAP_CHAN_QUARTERRATE           = BIT(11),
 -      ATH9K_HW_CAP_HT                         = BIT(12),
 -      ATH9K_HW_CAP_GTT                        = BIT(13),
 -      ATH9K_HW_CAP_FASTCC                     = BIT(14),
 -      ATH9K_HW_CAP_RFSILENT                   = BIT(15),
 -      ATH9K_HW_CAP_WOW                        = BIT(16),
 -      ATH9K_HW_CAP_CST                        = BIT(17),
 -      ATH9K_HW_CAP_ENHANCEDPM                 = BIT(18),
 -      ATH9K_HW_CAP_AUTOSLEEP                  = BIT(19),
 -      ATH9K_HW_CAP_4KB_SPLITTRANS             = BIT(20),
 -      ATH9K_HW_CAP_WOW_MATCHPATTERN_EXACT     = BIT(21),
 -};
 -
 -enum ath9k_capability_type {
 -      ATH9K_CAP_CIPHER = 0,
 -      ATH9K_CAP_TKIP_MIC,
 -      ATH9K_CAP_TKIP_SPLIT,
 -      ATH9K_CAP_PHYCOUNTERS,
 -      ATH9K_CAP_DIVERSITY,
 -      ATH9K_CAP_TXPOW,
 -      ATH9K_CAP_PHYDIAG,
 -      ATH9K_CAP_MCAST_KEYSRCH,
 -      ATH9K_CAP_TSF_ADJUST,
 -      ATH9K_CAP_WME_TKIPMIC,
 -      ATH9K_CAP_RFSILENT,
 -      ATH9K_CAP_ANT_CFG_2GHZ,
 -      ATH9K_CAP_ANT_CFG_5GHZ
 -};
 -
 -struct ath9k_hw_capabilities {
 -      u32 hw_caps; /* ATH9K_HW_CAP_* from ath9k_hw_caps */
 -      DECLARE_BITMAP(wireless_modes, ATH9K_MODE_MAX); /* ATH9K_MODE_* */
 -      u16 total_queues;
 -      u16 keycache_size;
 -      u16 low_5ghz_chan, high_5ghz_chan;
 -      u16 low_2ghz_chan, high_2ghz_chan;
 -      u16 num_mr_retries;
 -      u16 rts_aggr_limit;
 -      u8 tx_chainmask;
 -      u8 rx_chainmask;
 -      u16 tx_triglevel_max;
 -      u16 reg_cap;
 -      u8 num_gpio_pins;
 -      u8 num_antcfg_2ghz;
 -      u8 num_antcfg_5ghz;
 -};
 -
 -struct ath9k_ops_config {
 -      int dma_beacon_response_time;
 -      int sw_beacon_response_time;
 -      int additional_swba_backoff;
 -      int ack_6mb;
 -      int cwm_ignore_extcca;
 -      u8 pcie_powersave_enable;
 -      u8 pcie_l1skp_enable;
 -      u8 pcie_clock_req;
 -      u32 pcie_waen;
 -      int pcie_power_reset;
 -      u8 pcie_restore;
 -      u8 analog_shiftreg;
 -      u8 ht_enable;
 -      u32 ofdm_trig_low;
 -      u32 ofdm_trig_high;
 -      u32 cck_trig_high;
 -      u32 cck_trig_low;
 -      u32 enable_ani;
 -      u8 noise_immunity_level;
 -      u32 ofdm_weaksignal_det;
 -      u32 cck_weaksignal_thr;
 -      u8 spur_immunity_level;
 -      u8 firstep_level;
 -      int8_t rssi_thr_high;
 -      int8_t rssi_thr_low;
 -      u16 diversity_control;
 -      u16 antenna_switch_swap;
 -      int serialize_regmode;
 -      int intr_mitigation;
 -#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
 -#define AR_BASE_FREQ_2GHZ     2300
 -#define AR_BASE_FREQ_5GHZ     4900
 -#define AR_SPUR_FEEQ_BOUND_HT40 19
 -#define AR_SPUR_FEEQ_BOUND_HT20 10
 -      int spurmode;
 -      u16 spurchans[AR_EEPROM_MODAL_SPURS][2];
 -};
 -
 -enum ath9k_tx_queue {
 -      ATH9K_TX_QUEUE_INACTIVE = 0,
 -      ATH9K_TX_QUEUE_DATA,
 -      ATH9K_TX_QUEUE_BEACON,
 -      ATH9K_TX_QUEUE_CAB,
 -      ATH9K_TX_QUEUE_UAPSD,
 -      ATH9K_TX_QUEUE_PSPOLL
 -};
 -
 -#define       ATH9K_NUM_TX_QUEUES 10
 -
 -enum ath9k_tx_queue_subtype {
 -      ATH9K_WME_AC_BK = 0,
 -      ATH9K_WME_AC_BE,
 -      ATH9K_WME_AC_VI,
 -      ATH9K_WME_AC_VO,
 -      ATH9K_WME_UPSD
 -};
 -
 -enum ath9k_tx_queue_flags {
 -      TXQ_FLAG_TXOKINT_ENABLE = 0x0001,
 -      TXQ_FLAG_TXERRINT_ENABLE = 0x0001,
 -      TXQ_FLAG_TXDESCINT_ENABLE = 0x0002,
 -      TXQ_FLAG_TXEOLINT_ENABLE = 0x0004,
 -      TXQ_FLAG_TXURNINT_ENABLE = 0x0008,
 -      TXQ_FLAG_BACKOFF_DISABLE = 0x0010,
 -      TXQ_FLAG_COMPRESSION_ENABLE = 0x0020,
 -      TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE = 0x0040,
 -      TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE = 0x0080,
 -};
 -
 -#define ATH9K_TXQ_USEDEFAULT ((u32) -1)
 -
 -#define ATH9K_DECOMP_MASK_SIZE     128
 -#define ATH9K_READY_TIME_LO_BOUND  50
 -#define ATH9K_READY_TIME_HI_BOUND  96
 -
 -enum ath9k_pkt_type {
 -      ATH9K_PKT_TYPE_NORMAL = 0,
 -      ATH9K_PKT_TYPE_ATIM,
 -      ATH9K_PKT_TYPE_PSPOLL,
 -      ATH9K_PKT_TYPE_BEACON,
 -      ATH9K_PKT_TYPE_PROBE_RESP,
 -      ATH9K_PKT_TYPE_CHIRP,
 -      ATH9K_PKT_TYPE_GRP_POLL,
 -};
 -
 -struct ath9k_tx_queue_info {
 -      u32 tqi_ver;
 -      enum ath9k_tx_queue tqi_type;
 -      enum ath9k_tx_queue_subtype tqi_subtype;
 -      enum ath9k_tx_queue_flags tqi_qflags;
 -      u32 tqi_priority;
 -      u32 tqi_aifs;
 -      u32 tqi_cwmin;
 -      u32 tqi_cwmax;
 -      u16 tqi_shretry;
 -      u16 tqi_lgretry;
 -      u32 tqi_cbrPeriod;
 -      u32 tqi_cbrOverflowLimit;
 -      u32 tqi_burstTime;
 -      u32 tqi_readyTime;
 -      u32 tqi_physCompBuf;
 -      u32 tqi_intFlags;
 -};
 -
 -enum ath9k_rx_filter {
 -      ATH9K_RX_FILTER_UCAST = 0x00000001,
 -      ATH9K_RX_FILTER_MCAST = 0x00000002,
 -      ATH9K_RX_FILTER_BCAST = 0x00000004,
 -      ATH9K_RX_FILTER_CONTROL = 0x00000008,
 -      ATH9K_RX_FILTER_BEACON = 0x00000010,
 -      ATH9K_RX_FILTER_PROM = 0x00000020,
 -      ATH9K_RX_FILTER_PROBEREQ = 0x00000080,
 -      ATH9K_RX_FILTER_PSPOLL = 0x00004000,
 -      ATH9K_RX_FILTER_PHYERR = 0x00000100,
 -      ATH9K_RX_FILTER_PHYRADAR = 0x00002000,
 -};
 -
 -enum ath9k_int {
 -      ATH9K_INT_RX = 0x00000001,
 -      ATH9K_INT_RXDESC = 0x00000002,
 -      ATH9K_INT_RXNOFRM = 0x00000008,
 -      ATH9K_INT_RXEOL = 0x00000010,
 -      ATH9K_INT_RXORN = 0x00000020,
 -      ATH9K_INT_TX = 0x00000040,
 -      ATH9K_INT_TXDESC = 0x00000080,
 -      ATH9K_INT_TIM_TIMER = 0x00000100,
 -      ATH9K_INT_TXURN = 0x00000800,
 -      ATH9K_INT_MIB = 0x00001000,
 -      ATH9K_INT_RXPHY = 0x00004000,
 -      ATH9K_INT_RXKCM = 0x00008000,
 -      ATH9K_INT_SWBA = 0x00010000,
 -      ATH9K_INT_BMISS = 0x00040000,
 -      ATH9K_INT_BNR = 0x00100000,
 -      ATH9K_INT_TIM = 0x00200000,
 -      ATH9K_INT_DTIM = 0x00400000,
 -      ATH9K_INT_DTIMSYNC = 0x00800000,
 -      ATH9K_INT_GPIO = 0x01000000,
 -      ATH9K_INT_CABEND = 0x02000000,
 -      ATH9K_INT_CST = 0x10000000,
 -      ATH9K_INT_GTT = 0x20000000,
 -      ATH9K_INT_FATAL = 0x40000000,
 -      ATH9K_INT_GLOBAL = 0x80000000,
 -      ATH9K_INT_BMISC = ATH9K_INT_TIM |
 -              ATH9K_INT_DTIM |
 -              ATH9K_INT_DTIMSYNC |
 -              ATH9K_INT_CABEND,
 -      ATH9K_INT_COMMON = ATH9K_INT_RXNOFRM |
 -              ATH9K_INT_RXDESC |
 -              ATH9K_INT_RXEOL |
 -              ATH9K_INT_RXORN |
 -              ATH9K_INT_TXURN |
 -              ATH9K_INT_TXDESC |
 -              ATH9K_INT_MIB |
 -              ATH9K_INT_RXPHY |
 -              ATH9K_INT_RXKCM |
 -              ATH9K_INT_SWBA |
 -              ATH9K_INT_BMISS |
 -              ATH9K_INT_GPIO,
 -      ATH9K_INT_NOCARD = 0xffffffff
 -};
 -
 -#define ATH9K_RATESERIES_RTS_CTS  0x0001
 -#define ATH9K_RATESERIES_2040     0x0002
 -#define ATH9K_RATESERIES_HALFGI   0x0004
 -
 -struct ath9k_11n_rate_series {
 -      u32 Tries;
 -      u32 Rate;
 -      u32 PktDuration;
 -      u32 ChSel;
 -      u32 RateFlags;
 -};
 +#include <linux/etherdevice.h>
 +#include <linux/device.h>
 +#include <net/mac80211.h>
 +#include <linux/leds.h>
 +#include <linux/rfkill.h>
 +
 +#include "hw.h"
 +#include "rc.h"
 +#include "debug.h"
 +
 +struct ath_node;
 +
 +/* Macro to expand scalars to 64-bit objects */
 +
 +#define       ito64(x) (sizeof(x) == 8) ?                     \
 +      (((unsigned long long int)(x)) & (0xff)) :      \
 +      (sizeof(x) == 16) ?                             \
 +      (((unsigned long long int)(x)) & 0xffff) :      \
 +      ((sizeof(x) == 32) ?                            \
 +       (((unsigned long long int)(x)) & 0xffffffff) : \
 +       (unsigned long long int)(x))
 +
 +/* increment with wrap-around */
 +#define INCR(_l, _sz)   do {                  \
 +              (_l)++;                         \
 +              (_l) &= ((_sz) - 1);            \
 +      } while (0)
 +
 +/* decrement with wrap-around */
 +#define DECR(_l,  _sz)  do {                  \
 +              (_l)--;                         \
 +              (_l) &= ((_sz) - 1);            \
 +      } while (0)
 +
 +#define A_MAX(a, b) ((a) > (b) ? (a) : (b))
 +
 +#define ASSERT(exp) do {                      \
 +              if (unlikely(!(exp))) {         \
 +                      BUG();                  \
 +              }                               \
 +      } while (0)
 +
 +#define TSF_TO_TU(_h,_l) \
 +      ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10))
 +
 +#define       ATH_TXQ_SETUP(sc, i)        ((sc)->tx.txqsetup & (1<<i))
 +
 +static const u8 ath_bcast_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
 +
 +struct ath_config {
 +      u32 ath_aggr_prot;
 +      u16 txpowlimit;
 +      u8 cabqReadytime;
 +      u8 swBeaconProcess;
 +};
 +
 +/*************************/
 +/* Descriptor Management */
 +/*************************/
 +
 +#define ATH_TXBUF_RESET(_bf) do {                             \
 +              (_bf)->bf_status = 0;                           \
 +              (_bf)->bf_lastbf = NULL;                        \
 +              (_bf)->bf_next = NULL;                          \
 +              memset(&((_bf)->bf_state), 0,                   \
 +                     sizeof(struct ath_buf_state));           \
 +      } while (0)
 +
 +/**
 + * enum buffer_type - Buffer type flags
 + *
 + * @BUF_HT: Send this buffer using HT capabilities
 + * @BUF_AMPDU: This buffer is an ampdu, as part of an aggregate (during TX)
 + * @BUF_AGGR: Indicates whether the buffer can be aggregated
 + *    (used in aggregation scheduling)
 + * @BUF_RETRY: Indicates whether the buffer is retried
 + * @BUF_XRETRY: To denote excessive retries of the buffer
 + */
 +enum buffer_type {
 +      BUF_HT                  = BIT(1),
 +      BUF_AMPDU               = BIT(2),
 +      BUF_AGGR                = BIT(3),
 +      BUF_RETRY               = BIT(4),
 +      BUF_XRETRY              = BIT(5),
 +};
 +
 +struct ath_buf_state {
 +      int bfs_nframes;
 +      u16 bfs_al;
 +      u16 bfs_frmlen;
 +      int bfs_seqno;
 +      int bfs_tidno;
 +      int bfs_retries;
 +      u32 bf_type;
 +      u32 bfs_keyix;
 +      enum ath9k_key_type bfs_keytype;
 +};
 +
 +#define bf_nframes            bf_state.bfs_nframes
 +#define bf_al                 bf_state.bfs_al
 +#define bf_frmlen             bf_state.bfs_frmlen
 +#define bf_retries            bf_state.bfs_retries
 +#define bf_seqno              bf_state.bfs_seqno
 +#define bf_tidno              bf_state.bfs_tidno
 +#define bf_keyix                bf_state.bfs_keyix
 +#define bf_keytype            bf_state.bfs_keytype
 +#define bf_isht(bf)           (bf->bf_state.bf_type & BUF_HT)
 +#define bf_isampdu(bf)                (bf->bf_state.bf_type & BUF_AMPDU)
 +#define bf_isaggr(bf)         (bf->bf_state.bf_type & BUF_AGGR)
 +#define bf_isretried(bf)      (bf->bf_state.bf_type & BUF_RETRY)
 +#define bf_isxretried(bf)     (bf->bf_state.bf_type & BUF_XRETRY)
 +
 +struct ath_buf {
 +      struct list_head list;
 +      struct ath_buf *bf_lastbf;      /* last buf of this unit (a frame or
 +                                         an aggregate) */
 +      struct ath_buf *bf_next;        /* next subframe in the aggregate */
 +      void *bf_mpdu;                  /* enclosing frame structure */
 +      struct ath_desc *bf_desc;       /* virtual addr of desc */
 +      dma_addr_t bf_daddr;            /* physical addr of desc */
 +      dma_addr_t bf_buf_addr;         /* physical addr of data buffer */
 +      u32 bf_status;
 +      u16 bf_flags;
 +      struct ath_buf_state bf_state;
 +      dma_addr_t bf_dmacontext;
 +};
 +
 +#define ATH_RXBUF_RESET(_bf)    ((_bf)->bf_status = 0)
 +#define ATH_BUFSTATUS_STALE     0x00000002
 +
 +struct ath_descdma {
 +      const char *dd_name;
 +      struct ath_desc *dd_desc;
 +      dma_addr_t dd_desc_paddr;
 +      u32 dd_desc_len;
 +      struct ath_buf *dd_bufptr;
 +      dma_addr_t dd_dmacontext;
 +};
 +
 +int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
 +                    struct list_head *head, const char *name,
 +                    int nbuf, int ndesc);
 +void ath_descdma_cleanup(struct ath_softc *sc, struct ath_descdma *dd,
 +                       struct list_head *head);
 +
 +/***********/
 +/* RX / TX */
 +/***********/
 +
 +#define ATH_MAX_ANTENNA         3
 +#define ATH_RXBUF               512
 +#define WME_NUM_TID             16
 +#define ATH_TXBUF               512
 +#define ATH_TXMAXTRY            13
 +#define ATH_11N_TXMAXTRY        10
 +#define ATH_MGT_TXMAXTRY        4
 +#define WME_BA_BMP_SIZE         64
 +#define WME_MAX_BA              WME_BA_BMP_SIZE
 +#define ATH_TID_MAX_BUFS        (2 * WME_MAX_BA)
 +
 +#define TID_TO_WME_AC(_tid)                           \
 +      ((((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE : \
 +       (((_tid) == 1) || ((_tid) == 2)) ? WME_AC_BK : \
 +       (((_tid) == 4) || ((_tid) == 5)) ? WME_AC_VI : \
 +       WME_AC_VO)
 +
 +#define WME_AC_BE   0
 +#define WME_AC_BK   1
 +#define WME_AC_VI   2
 +#define WME_AC_VO   3
 +#define WME_NUM_AC  4
 +
 +#define ADDBA_EXCHANGE_ATTEMPTS    10
 +#define ATH_AGGR_DELIM_SZ          4
 +#define ATH_AGGR_MINPLEN           256 /* in bytes, minimum packet length */
 +/* number of delimiters for encryption padding */
 +#define ATH_AGGR_ENCRYPTDELIM      10
 +/* minimum h/w qdepth to be sustained to maximize aggregation */
 +#define ATH_AGGR_MIN_QDEPTH        2
 +#define ATH_AMPDU_SUBFRAME_DEFAULT 32
 +#define ATH_AMPDU_LIMIT_MAX        (64 * 1024 - 1)
 +#define ATH_AMPDU_LIMIT_DEFAULT    ATH_AMPDU_LIMIT_MAX
 +
 +#define IEEE80211_SEQ_SEQ_SHIFT    4
 +#define IEEE80211_SEQ_MAX          4096
 +#define IEEE80211_MIN_AMPDU_BUF    0x8
 +#define IEEE80211_HTCAP_MAXRXAMPDU_FACTOR 13
 +#define IEEE80211_WEP_IVLEN        3
 +#define IEEE80211_WEP_KIDLEN       1
 +#define IEEE80211_WEP_CRCLEN       4
 +#define IEEE80211_MAX_MPDU_LEN     (3840 + FCS_LEN +          \
 +                                  (IEEE80211_WEP_IVLEN +      \
 +                                   IEEE80211_WEP_KIDLEN +     \
 +                                   IEEE80211_WEP_CRCLEN))
 +
 +/* return whether a bit at index _n in bitmap _bm is set
 + * _sz is the size of the bitmap  */
 +#define ATH_BA_ISSET(_bm, _n)  (((_n) < (WME_BA_BMP_SIZE)) &&         \
 +                              ((_bm)[(_n) >> 5] & (1 << ((_n) & 31))))
 +
 +/* return block-ack bitmap index given sequence and starting sequence */
 +#define ATH_BA_INDEX(_st, _seq) (((_seq) - (_st)) & (IEEE80211_SEQ_MAX - 1))
 +
 +/* returns delimiter padding required given the packet length */
 +#define ATH_AGGR_GET_NDELIM(_len)                                     \
 +      (((((_len) + ATH_AGGR_DELIM_SZ) < ATH_AGGR_MINPLEN) ?           \
 +        (ATH_AGGR_MINPLEN - (_len) - ATH_AGGR_DELIM_SZ) : 0) >> 2)
 +
 +#define BAW_WITHIN(_start, _bawsz, _seqno) \
 +      ((((_seqno) - (_start)) & 4095) < (_bawsz))
 +
 +#define ATH_DS_BA_SEQ(_ds)         ((_ds)->ds_us.tx.ts_seqnum)
 +#define ATH_DS_BA_BITMAP(_ds)      (&(_ds)->ds_us.tx.ba_low)
 +#define ATH_DS_TX_BA(_ds)          ((_ds)->ds_us.tx.ts_flags & ATH9K_TX_BA)
 +#define ATH_AN_2_TID(_an, _tidno)  (&(_an)->tid[(_tidno)])
 +
 +enum ATH_AGGR_STATUS {
 +      ATH_AGGR_DONE,
 +      ATH_AGGR_BAW_CLOSED,
 +      ATH_AGGR_LIMITED,
 +};
 +
 +struct ath_txq {
 +      u32 axq_qnum;
 +      u32 *axq_link;
 +      struct list_head axq_q;
 +      spinlock_t axq_lock;
 +      u32 axq_depth;
 +      u8 axq_aggr_depth;
 +      u32 axq_totalqueued;
 +      bool stopped;
 +      struct ath_buf *axq_linkbuf;
 +
 +      /* first desc of the last descriptor that contains CTS */
 +      struct ath_desc *axq_lastdsWithCTS;
 +
 +      /* final desc of the gating desc that determines whether
 +         lastdsWithCTS has been DMA'ed or not */
 +      struct ath_desc *axq_gatingds;
 +
 +      struct list_head axq_acq;
 +};
 +
 +#define AGGR_CLEANUP         BIT(1)
 +#define AGGR_ADDBA_COMPLETE  BIT(2)
 +#define AGGR_ADDBA_PROGRESS  BIT(3)
 +
 +struct ath_atx_tid {
 +      struct list_head list;
 +      struct list_head buf_q;
 +      struct ath_node *an;
 +      struct ath_atx_ac *ac;
 +      struct ath_buf *tx_buf[ATH_TID_MAX_BUFS];
 +      u16 seq_start;
 +      u16 seq_next;
 +      u16 baw_size;
 +      int tidno;
 +      int baw_head;   /* first un-acked tx buffer */
 +      int baw_tail;   /* next unused tx buffer slot */
 +      int sched;
 +      int paused;
 +      u8 state;
 +      int addba_exchangeattempts;
 +};
 +
 +struct ath_atx_ac {
 +      int sched;
 +      int qnum;
 +      struct list_head list;
 +      struct list_head tid_q;
 +};
 +
 +struct ath_tx_control {
 +      struct ath_txq *txq;
 +      int if_id;
 +      enum ath9k_internal_frame_type frame_type;
 +};
 +
 +struct ath_xmit_status {
 +      int retries;
 +      int flags;
 +#define ATH_TX_ERROR        0x01
 +#define ATH_TX_XRETRY       0x02
 +#define ATH_TX_BAR          0x04
 +};
 +
 +/* All RSSI values are noise floor adjusted */
 +struct ath_tx_stat {
 +      int rssi;
 +      int rssictl[ATH_MAX_ANTENNA];
 +      int rssiextn[ATH_MAX_ANTENNA];
 +      int rateieee;
 +      int rateKbps;
 +      int ratecode;
 +      int flags;
 +      u32 airtime;    /* time on air per final tx rate */
 +};
 +
 +struct aggr_rifs_param {
 +      int param_max_frames;
 +      int param_max_len;
 +      int param_rl;
 +      int param_al;
 +      struct ath_rc_series *param_rcs;
 +};
 +
 +struct ath_node {
 +      struct ath_softc *an_sc;
 +      struct ath_atx_tid tid[WME_NUM_TID];
 +      struct ath_atx_ac ac[WME_NUM_AC];
 +      u16 maxampdu;
 +      u8 mpdudensity;
 +};
 +
 +struct ath_tx {
 +      u16 seq_no;
 +      u32 txqsetup;
 +      int hwq_map[ATH9K_WME_AC_VO+1];
 +      spinlock_t txbuflock;
 +      struct list_head txbuf;
 +      struct ath_txq txq[ATH9K_NUM_TX_QUEUES];
 +      struct ath_descdma txdma;
 +};
 +
 +struct ath_rx {
 +      u8 defant;
 +      u8 rxotherant;
 +      u32 *rxlink;
 +      int bufsize;
 +      unsigned int rxfilter;
 +      spinlock_t rxflushlock;
 +      spinlock_t rxbuflock;
 +      struct list_head rxbuf;
 +      struct ath_descdma rxdma;
 +};
 +
 +int ath_startrecv(struct ath_softc *sc);
 +bool ath_stoprecv(struct ath_softc *sc);
 +void ath_flushrecv(struct ath_softc *sc);
 +u32 ath_calcrxfilter(struct ath_softc *sc);
 +int ath_rx_init(struct ath_softc *sc, int nbufs);
 +void ath_rx_cleanup(struct ath_softc *sc);
 +int ath_rx_tasklet(struct ath_softc *sc, int flush);
 +struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype);
 +void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq);
 +int ath_tx_setup(struct ath_softc *sc, int haltype);
 +void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx);
 +void ath_draintxq(struct ath_softc *sc,
 +                   struct ath_txq *txq, bool retry_tx);
 +void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an);
 +void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an);
 +void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq);
 +int ath_tx_init(struct ath_softc *sc, int nbufs);
 +int ath_tx_cleanup(struct ath_softc *sc);
 +struct ath_txq *ath_test_get_txq(struct ath_softc *sc, struct sk_buff *skb);
 +int ath_txq_update(struct ath_softc *sc, int qnum,
 +                 struct ath9k_tx_queue_info *q);
 +int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
 +               struct ath_tx_control *txctl);
 +void ath_tx_tasklet(struct ath_softc *sc);
 +void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb);
 +bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno);
 +int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
 +                    u16 tid, u16 *ssn);
 +int ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
 +void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
 +
 +/********/
 +/* VIFs */
 +/********/
 +
 +struct ath_vif {
 +      int av_bslot;
 +      enum nl80211_iftype av_opmode;
 +      struct ath_buf *av_bcbuf;
 +      struct ath_tx_control av_btxctl;
 +      u8 bssid[ETH_ALEN]; /* current BSSID from config_interface */
 +};
 +
 +/*******************/
 +/* Beacon Handling */
 +/*******************/
  
 -#define CHANNEL_CW_INT    0x00002
 -#define CHANNEL_CCK       0x00020
 -#define CHANNEL_OFDM      0x00040
 -#define CHANNEL_2GHZ      0x00080
 -#define CHANNEL_5GHZ      0x00100
 -#define CHANNEL_PASSIVE   0x00200
 -#define CHANNEL_DYN       0x00400
 -#define CHANNEL_HALF      0x04000
 -#define CHANNEL_QUARTER   0x08000
 -#define CHANNEL_HT20      0x10000
 -#define CHANNEL_HT40PLUS  0x20000
 -#define CHANNEL_HT40MINUS 0x40000
 -
 -#define CHANNEL_INTERFERENCE    0x01
 -#define CHANNEL_DFS             0x02
 -#define CHANNEL_4MS_LIMIT       0x04
 -#define CHANNEL_DFS_CLEAR       0x08
 -#define CHANNEL_DISALLOW_ADHOC  0x10
 -#define CHANNEL_PER_11D_ADHOC   0x20
 -
 -#define CHANNEL_A           (CHANNEL_5GHZ|CHANNEL_OFDM)
 -#define CHANNEL_B           (CHANNEL_2GHZ|CHANNEL_CCK)
 -#define CHANNEL_G           (CHANNEL_2GHZ|CHANNEL_OFDM)
 -#define CHANNEL_G_HT20      (CHANNEL_2GHZ|CHANNEL_HT20)
 -#define CHANNEL_A_HT20      (CHANNEL_5GHZ|CHANNEL_HT20)
 -#define CHANNEL_G_HT40PLUS  (CHANNEL_2GHZ|CHANNEL_HT40PLUS)
 -#define CHANNEL_G_HT40MINUS (CHANNEL_2GHZ|CHANNEL_HT40MINUS)
 -#define CHANNEL_A_HT40PLUS  (CHANNEL_5GHZ|CHANNEL_HT40PLUS)
 -#define CHANNEL_A_HT40MINUS (CHANNEL_5GHZ|CHANNEL_HT40MINUS)
 -#define CHANNEL_ALL                           \
 -      (CHANNEL_OFDM|                          \
 -       CHANNEL_CCK|                           \
 -       CHANNEL_2GHZ |                         \
 -       CHANNEL_5GHZ |                         \
 -       CHANNEL_HT20 |                         \
 -       CHANNEL_HT40PLUS |                     \
 -       CHANNEL_HT40MINUS)
 -
 -struct ath9k_channel {
 -      u16 channel;
 -      u32 channelFlags;
 -      u8 privFlags;
 -      int8_t maxRegTxPower;
 -      int8_t maxTxPower;
 -      int8_t minTxPower;
 -      u32 chanmode;
 -      int32_t CalValid;
 -      bool oneTimeCalsDone;
 -      int8_t iCoff;
 -      int8_t qCoff;
 -      int16_t rawNoiseFloor;
 -      int8_t antennaMax;
 -      u32 regDmnFlags;
 -      u32 conformanceTestLimit[3]; /* 0:11a, 1: 11b, 2:11g */
 -#ifdef ATH_NF_PER_CHAN
 -      struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
 -#endif
 -};
 +/*
 + * Regardless of the number of beacons we stagger, (i.e. regardless of the
 + * number of BSSIDs) if a given beacon does not go out even after waiting this
 + * number of beacon intervals, the game's up.
 + */
 +#define BSTUCK_THRESH                 (9 * ATH_BCBUF)
 +#define       ATH_BCBUF                       1
 +#define ATH_DEFAULT_BINTVAL           100 /* TU */
 +#define ATH_DEFAULT_BMISS_LIMIT       10
 +#define IEEE80211_MS_TO_TU(x)           (((x) * 1000) / 1024)
 +
 +struct ath_beacon_config {
 +      u16 beacon_interval;
 +      u16 listen_interval;
 +      u16 dtim_period;
 +      u16 bmiss_timeout;
 +      u8 dtim_count;
 +};
 +
 +struct ath_beacon {
 +      enum {
 +              OK,             /* no change needed */
 +              UPDATE,         /* update pending */
 +              COMMIT          /* beacon sent, commit change */
 +      } updateslot;           /* slot time update fsm */
 +
 +      u32 beaconq;
 +      u32 bmisscnt;
 +      u32 ast_be_xmit;
 +      u64 bc_tstamp;
 +      struct ieee80211_vif *bslot[ATH_BCBUF];
 +      struct ath_wiphy *bslot_aphy[ATH_BCBUF];
 +      int slottime;
 +      int slotupdate;
 +      struct ath9k_tx_queue_info beacon_qi;
 +      struct ath_descdma bdma;
 +      struct ath_txq *cabq;
 +      struct list_head bbuf;
 +};
 +
 +void ath_beacon_tasklet(unsigned long data);
 +void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif);
 +int ath_beaconq_setup(struct ath_hw *ah);
 +int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif);
 +void ath_beacon_return(struct ath_softc *sc, struct ath_vif *avp);
 +
 +/*******/
 +/* ANI */
 +/*******/
  
 -#define IS_CHAN_A(_c) ((((_c)->channelFlags & CHANNEL_A) == CHANNEL_A) || \
 -       (((_c)->channelFlags & CHANNEL_A_HT20) == CHANNEL_A_HT20) || \
 -       (((_c)->channelFlags & CHANNEL_A_HT40PLUS) == CHANNEL_A_HT40PLUS) || \
 -       (((_c)->channelFlags & CHANNEL_A_HT40MINUS) == CHANNEL_A_HT40MINUS))
 -#define IS_CHAN_G(_c) ((((_c)->channelFlags & (CHANNEL_G)) == CHANNEL_G) || \
 -       (((_c)->channelFlags & CHANNEL_G_HT20) == CHANNEL_G_HT20) || \
 -       (((_c)->channelFlags & CHANNEL_G_HT40PLUS) == CHANNEL_G_HT40PLUS) || \
 -       (((_c)->channelFlags & CHANNEL_G_HT40MINUS) == CHANNEL_G_HT40MINUS))
 -#define IS_CHAN_OFDM(_c) (((_c)->channelFlags & CHANNEL_OFDM) != 0)
 -#define IS_CHAN_5GHZ(_c) (((_c)->channelFlags & CHANNEL_5GHZ) != 0)
 -#define IS_CHAN_2GHZ(_c) (((_c)->channelFlags & CHANNEL_2GHZ) != 0)
 -#define IS_CHAN_PASSIVE(_c) (((_c)->channelFlags & CHANNEL_PASSIVE) != 0)
 -#define IS_CHAN_HALF_RATE(_c) (((_c)->channelFlags & CHANNEL_HALF) != 0)
 -#define IS_CHAN_QUARTER_RATE(_c) (((_c)->channelFlags & CHANNEL_QUARTER) != 0)
 -
 -/* These macros check chanmode and not channelFlags */
 -#define IS_CHAN_B(_c) ((_c)->chanmode == CHANNEL_B)
 -#define IS_CHAN_HT20(_c) (((_c)->chanmode == CHANNEL_A_HT20) ||       \
 -                        ((_c)->chanmode == CHANNEL_G_HT20))
 -#define IS_CHAN_HT40(_c) (((_c)->chanmode == CHANNEL_A_HT40PLUS) ||   \
 -                        ((_c)->chanmode == CHANNEL_A_HT40MINUS) ||    \
 -                        ((_c)->chanmode == CHANNEL_G_HT40PLUS) ||     \
 -                        ((_c)->chanmode == CHANNEL_G_HT40MINUS))
 -#define IS_CHAN_HT(_c) (IS_CHAN_HT20((_c)) || IS_CHAN_HT40((_c)))
 -
 -#define IS_CHAN_IN_PUBLIC_SAFETY_BAND(_c) ((_c) > 4940 && (_c) < 4990)
 -#define IS_CHAN_A_5MHZ_SPACED(_c)                     \
 -      ((((_c)->channelFlags & CHANNEL_5GHZ) != 0) &&  \
 -       (((_c)->channel % 20) != 0) &&                 \
 -       (((_c)->channel % 10) != 0))
 -
 -struct ath9k_keyval {
 -      u8 kv_type;
 -      u8 kv_pad;
 -      u16 kv_len;
 -      u8 kv_val[16];
 -      u8 kv_mic[8];
 -      u8 kv_txmic[8];
 -};
 +#define ATH_STA_SHORT_CALINTERVAL 1000    /* 1 second */
 +#define ATH_AP_SHORT_CALINTERVAL  100     /* 100 ms */
 +#define ATH_ANI_POLLINTERVAL      100     /* 100 ms */
 +#define ATH_LONG_CALINTERVAL      30000   /* 30 seconds */
 +#define ATH_RESTART_CALINTERVAL   1200000 /* 20 minutes */
  
 -enum ath9k_key_type {
 -      ATH9K_KEY_TYPE_CLEAR,
 -      ATH9K_KEY_TYPE_WEP,
 -      ATH9K_KEY_TYPE_AES,
 -      ATH9K_KEY_TYPE_TKIP,
 +struct ath_ani {
 +      bool caldone;
 +      int16_t noise_floor;
 +      unsigned int longcal_timer;
 +      unsigned int shortcal_timer;
 +      unsigned int resetcal_timer;
 +      unsigned int checkani_timer;
 +      struct timer_list timer;
  };
  
 -enum ath9k_cipher {
 -      ATH9K_CIPHER_WEP = 0,
 -      ATH9K_CIPHER_AES_OCB = 1,
 -      ATH9K_CIPHER_AES_CCM = 2,
 -      ATH9K_CIPHER_CKIP = 3,
 -      ATH9K_CIPHER_TKIP = 4,
 -      ATH9K_CIPHER_CLR = 5,
 -      ATH9K_CIPHER_MIC = 127
 -};
 +/********************/
 +/*   LED Control    */
 +/********************/
  
 -#define AR_EEPROM_EEPCAP_COMPRESS_DIS   0x0001
 -#define AR_EEPROM_EEPCAP_AES_DIS        0x0002
 -#define AR_EEPROM_EEPCAP_FASTFRAME_DIS  0x0004
 -#define AR_EEPROM_EEPCAP_BURST_DIS      0x0008
 -#define AR_EEPROM_EEPCAP_MAXQCU         0x01F0
 -#define AR_EEPROM_EEPCAP_MAXQCU_S       4
 -#define AR_EEPROM_EEPCAP_HEAVY_CLIP_EN  0x0200
 -#define AR_EEPROM_EEPCAP_KC_ENTRIES     0xF000
 -#define AR_EEPROM_EEPCAP_KC_ENTRIES_S   12
 -
 -#define AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND   0x0040
 -#define AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN    0x0080
 -#define AR_EEPROM_EEREGCAP_EN_KK_U2         0x0100
 -#define AR_EEPROM_EEREGCAP_EN_KK_MIDBAND    0x0200
 -#define AR_EEPROM_EEREGCAP_EN_KK_U1_ODD     0x0400
 -#define AR_EEPROM_EEREGCAP_EN_KK_NEW_11A    0x0800
 -
 -#define AR_EEPROM_EEREGCAP_EN_KK_U1_ODD_PRE4_0  0x4000
 -#define AR_EEPROM_EEREGCAP_EN_KK_NEW_11A_PRE4_0 0x8000
 -
 -#define SD_NO_CTL               0xE0
 -#define NO_CTL                  0xff
 -#define CTL_MODE_M              7
 -#define CTL_11A                 0
 -#define CTL_11B                 1
 -#define CTL_11G                 2
 -#define CTL_2GHT20              5
 -#define CTL_5GHT20              6
 -#define CTL_2GHT40              7
 -#define CTL_5GHT40              8
 -
 -#define AR_EEPROM_MAC(i)        (0x1d+(i))
 -
 -#define AR_EEPROM_RFSILENT_GPIO_SEL     0x001c
 -#define AR_EEPROM_RFSILENT_GPIO_SEL_S   2
 -#define AR_EEPROM_RFSILENT_POLARITY     0x0002
 -#define AR_EEPROM_RFSILENT_POLARITY_S   1
 -
 -#define CTRY_DEBUG 0x1ff
 -#define       CTRY_DEFAULT 0
 -
 -enum reg_ext_bitmap {
 -      REG_EXT_JAPAN_MIDBAND = 1,
 -      REG_EXT_FCC_DFS_HT40 = 2,
 -      REG_EXT_JAPAN_NONDFS_HT40 = 3,
 -      REG_EXT_JAPAN_DFS_HT40 = 4
 -};
 +#define ATH_LED_PIN   1
 +#define ATH_LED_ON_DURATION_IDLE      350     /* in msecs */
 +#define ATH_LED_OFF_DURATION_IDLE     250     /* in msecs */
  
 -struct ath9k_country_entry {
 -      u16 countryCode;
 -      u16 regDmnEnum;
 -      u16 regDmn5G;
 -      u16 regDmn2G;
 -      u8 isMultidomain;
 -      u8 iso[3];
 +enum ath_led_type {
 +      ATH_LED_RADIO,
 +      ATH_LED_ASSOC,
 +      ATH_LED_TX,
 +      ATH_LED_RX
  };
  
 -#define REG_WRITE(_ah, _reg, _val) ath9k_iowrite32((_ah), (_reg), (_val))
 -#define REG_READ(_ah, _reg) ath9k_ioread32((_ah), (_reg))
 -
 -#define SM(_v, _f)  (((_v) << _f##_S) & _f)
 -#define MS(_v, _f)  (((_v) & _f) >> _f##_S)
 -#define REG_RMW(_a, _r, _set, _clr)    \
 -      REG_WRITE(_a, _r, (REG_READ(_a, _r) & ~(_clr)) | (_set))
 -#define REG_RMW_FIELD(_a, _r, _f, _v) \
 -      REG_WRITE(_a, _r, \
 -      (REG_READ(_a, _r) & ~_f) | (((_v) << _f##_S) & _f))
 -#define REG_SET_BIT(_a, _r, _f) \
 -      REG_WRITE(_a, _r, REG_READ(_a, _r) | _f)
 -#define REG_CLR_BIT(_a, _r, _f) \
 -      REG_WRITE(_a, _r, REG_READ(_a, _r) & ~_f)
 -
 -#define ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS   0x00000001
 -
 -#define INIT_AIFS       2
 -#define INIT_CWMIN      15
 -#define INIT_CWMIN_11B  31
 -#define INIT_CWMAX      1023
 -#define INIT_SH_RETRY   10
 -#define INIT_LG_RETRY   10
 -#define INIT_SSH_RETRY  32
 -#define INIT_SLG_RETRY  32
 -
 -#define WLAN_CTRL_FRAME_SIZE (2+2+6+4)
 -
 -#define ATH_AMPDU_LIMIT_MAX      (64 * 1024 - 1)
 -#define ATH_AMPDU_LIMIT_DEFAULT  ATH_AMPDU_LIMIT_MAX
 -
 -#define IEEE80211_WEP_IVLEN      3
 -#define IEEE80211_WEP_KIDLEN     1
 -#define IEEE80211_WEP_CRCLEN     4
 -#define IEEE80211_MAX_MPDU_LEN  (3840 + FCS_LEN +             \
 -                               (IEEE80211_WEP_IVLEN +         \
 -                                IEEE80211_WEP_KIDLEN +        \
 -                                IEEE80211_WEP_CRCLEN))
 -#define MAX_RATE_POWER 63
 -
 -enum ath9k_power_mode {
 -      ATH9K_PM_AWAKE = 0,
 -      ATH9K_PM_FULL_SLEEP,
 -      ATH9K_PM_NETWORK_SLEEP,
 -      ATH9K_PM_UNDEFINED
 +struct ath_led {
 +      struct ath_softc *sc;
 +      struct led_classdev led_cdev;
 +      enum ath_led_type led_type;
 +      char name[32];
 +      bool registered;
  };
  
 -struct ath9k_mib_stats {
 -      u32 ackrcv_bad;
 -      u32 rts_bad;
 -      u32 rts_good;
 -      u32 fcs_bad;
 -      u32 beacons;
 -};
 +/* Rfkill */
 +#define ATH_RFKILL_POLL_INTERVAL      2000 /* msecs */
  
 -enum ath9k_ant_setting {
 -      ATH9K_ANT_VARIABLE = 0,
 -      ATH9K_ANT_FIXED_A,
 -      ATH9K_ANT_FIXED_B
 +struct ath_rfkill {
 +      struct rfkill *rfkill;
 +      struct delayed_work rfkill_poll;
 +      char rfkill_name[32];
  };
  
 -#define ATH9K_SLOT_TIME_6 6
 -#define ATH9K_SLOT_TIME_9 9
 -#define ATH9K_SLOT_TIME_20 20
 -
 -enum ath9k_ht_macmode {
 -      ATH9K_HT_MACMODE_20 = 0,
 -      ATH9K_HT_MACMODE_2040 = 1,
 -};
 +/********************/
 +/* Main driver core */
 +/********************/
  
 -enum ath9k_ht_extprotspacing {
 -      ATH9K_HT_EXTPROTSPACING_20 = 0,
 -      ATH9K_HT_EXTPROTSPACING_25 = 1,
 -};
 +/*
 + * Default cache line size, in bytes.
 + * Used when PCI device not fully initialized by bootrom/BIOS
 +*/
 +#define DEFAULT_CACHELINE       32
 +#define       ATH_DEFAULT_NOISE_FLOOR -95
 +#define ATH_REGCLASSIDS_MAX     10
 +#define ATH_CABQ_READY_TIME     80      /* % of beacon interval */
 +#define ATH_MAX_SW_RETRIES      10
 +#define ATH_CHAN_MAX            255
 +#define IEEE80211_WEP_NKID      4       /* number of key ids */
  
 -struct ath9k_ht_cwm {
 -      enum ath9k_ht_macmode ht_macmode;
 +/*
 + * The key cache is used for h/w cipher state and also for
 + * tracking station state such as the current tx antenna.
 + * We also setup a mapping table between key cache slot indices
 + * and station state to short-circuit node lookups on rx.
 + * Different parts have different size key caches.  We handle
 + * up to ATH_KEYMAX entries (could dynamically allocate state).
 + */
 +#define       ATH_KEYMAX              128     /* max key cache size we handle */
 +
 +#define ATH_TXPOWER_MAX         100     /* .5 dBm units */
 +#define ATH_RSSI_DUMMY_MARKER   0x127
 +#define ATH_RATE_DUMMY_MARKER   0
 +
 +#define SC_OP_INVALID           BIT(0)
 +#define SC_OP_BEACONS           BIT(1)
 +#define SC_OP_RXAGGR            BIT(2)
 +#define SC_OP_TXAGGR            BIT(3)
 +#define SC_OP_CHAINMASK_UPDATE  BIT(4)
 +#define SC_OP_FULL_RESET        BIT(5)
 +#define SC_OP_PREAMBLE_SHORT    BIT(6)
 +#define SC_OP_PROTECT_ENABLE    BIT(7)
 +#define SC_OP_RXFLUSH           BIT(8)
 +#define SC_OP_LED_ASSOCIATED    BIT(9)
 +#define SC_OP_RFKILL_REGISTERED BIT(10)
 +#define SC_OP_RFKILL_SW_BLOCKED BIT(11)
 +#define SC_OP_RFKILL_HW_BLOCKED BIT(12)
 +#define SC_OP_WAIT_FOR_BEACON   BIT(13)
 +#define SC_OP_LED_ON            BIT(14)
 +#define SC_OP_SCANNING          BIT(15)
 +#define SC_OP_TSF_RESET         BIT(16)
 +
 +struct ath_bus_ops {
 +      void            (*read_cachesize)(struct ath_softc *sc, int *csz);
 +      void            (*cleanup)(struct ath_softc *sc);
 +      bool            (*eeprom_read)(struct ath_hw *ah, u32 off, u16 *data);
 +};
 +
 +struct ath_wiphy;
 +
 +struct ath_softc {
 +      struct ieee80211_hw *hw;
 +      struct device *dev;
 +
 +      spinlock_t wiphy_lock; /* spinlock to protect ath_wiphy data */
 +      struct ath_wiphy *pri_wiphy;
 +      struct ath_wiphy **sec_wiphy; /* secondary wiphys (virtual radios); may
 +                                     * have NULL entries */
 +      int num_sec_wiphy; /* number of sec_wiphy pointers in the array */
 +      int chan_idx;
 +      int chan_is_ht;
 +      struct ath_wiphy *next_wiphy;
 +      struct work_struct chan_work;
 +      int wiphy_select_failures;
 +      unsigned long wiphy_select_first_fail;
 +      struct delayed_work wiphy_work;
 +      unsigned long wiphy_scheduler_int;
 +      int wiphy_scheduler_index;
 +
 +      struct tasklet_struct intr_tq;
 +      struct tasklet_struct bcon_tasklet;
 +      struct ath_hw *sc_ah;
 +      void __iomem *mem;
 +      int irq;
 +      spinlock_t sc_resetlock;
++      spinlock_t sc_serial_rw;
 +      struct mutex mutex;
 +
 +      u8 curbssid[ETH_ALEN];
 +      u8 bssidmask[ETH_ALEN];
 +      u32 intrstatus;
 +      u32 sc_flags; /* SC_OP_* */
 +      u16 curtxpow;
 +      u16 curaid;
 +      u16 cachelsz;
 +      u8 nbcnvifs;
 +      u16 nvifs;
 +      u8 tx_chainmask;
 +      u8 rx_chainmask;
 +      u32 keymax;
 +      DECLARE_BITMAP(keymap, ATH_KEYMAX);
 +      u8 splitmic;
 +      atomic_t ps_usecount;
 +      enum ath9k_int imask;
        enum ath9k_ht_extprotspacing ht_extprotspacing;
 -};
 -
 -enum ath9k_ani_cmd {
 -      ATH9K_ANI_PRESENT = 0x1,
 -      ATH9K_ANI_NOISE_IMMUNITY_LEVEL = 0x2,
 -      ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION = 0x4,
 -      ATH9K_ANI_CCK_WEAK_SIGNAL_THR = 0x8,
 -      ATH9K_ANI_FIRSTEP_LEVEL = 0x10,
 -      ATH9K_ANI_SPUR_IMMUNITY_LEVEL = 0x20,
 -      ATH9K_ANI_MODE = 0x40,
 -      ATH9K_ANI_PHYERR_RESET = 0x80,
 -      ATH9K_ANI_ALL = 0xff
 -};
 -
 -enum {
 -      WLAN_RC_PHY_OFDM,
 -      WLAN_RC_PHY_CCK,
 -      WLAN_RC_PHY_HT_20_SS,
 -      WLAN_RC_PHY_HT_20_DS,
 -      WLAN_RC_PHY_HT_40_SS,
 -      WLAN_RC_PHY_HT_40_DS,
 -      WLAN_RC_PHY_HT_20_SS_HGI,
 -      WLAN_RC_PHY_HT_20_DS_HGI,
 -      WLAN_RC_PHY_HT_40_SS_HGI,
 -      WLAN_RC_PHY_HT_40_DS_HGI,
 -      WLAN_RC_PHY_MAX
 -};
 -
 -enum ath9k_tp_scale {
 -      ATH9K_TP_SCALE_MAX = 0,
 -      ATH9K_TP_SCALE_50,
 -      ATH9K_TP_SCALE_25,
 -      ATH9K_TP_SCALE_12,
 -      ATH9K_TP_SCALE_MIN
 -};
 -
 -enum ser_reg_mode {
 -      SER_REG_MODE_OFF = 0,
 -      SER_REG_MODE_ON = 1,
 -      SER_REG_MODE_AUTO = 2,
 -};
 -
 -#define AR_PHY_CCA_MAX_GOOD_VALUE                     -85
 -#define AR_PHY_CCA_MAX_HIGH_VALUE                     -62
 -#define AR_PHY_CCA_MIN_BAD_VALUE                      -121
 -#define AR_PHY_CCA_FILTERWINDOW_LENGTH_INIT     3
 -#define AR_PHY_CCA_FILTERWINDOW_LENGTH          5
 -
 -#define ATH9K_NF_CAL_HIST_MAX           5
 -#define NUM_NF_READINGS                 6
 -
 -struct ath9k_nfcal_hist {
 -      int16_t nfCalBuffer[ATH9K_NF_CAL_HIST_MAX];
 -      u8 currIndex;
 -      int16_t privNF;
 -      u8 invalidNFcount;
 -};
 -
 -struct ath9k_beacon_state {
 -      u32 bs_nexttbtt;
 -      u32 bs_nextdtim;
 -      u32 bs_intval;
 -#define ATH9K_BEACON_PERIOD       0x0000ffff
 -#define ATH9K_BEACON_ENA          0x00800000
 -#define ATH9K_BEACON_RESET_TSF    0x01000000
 -      u32 bs_dtimperiod;
 -      u16 bs_cfpperiod;
 -      u16 bs_cfpmaxduration;
 -      u32 bs_cfpnext;
 -      u16 bs_timoffset;
 -      u16 bs_bmissthreshold;
 -      u32 bs_sleepduration;
 -};
 -
 -struct ath9k_node_stats {
 -      u32 ns_avgbrssi;
 -      u32 ns_avgrssi;
 -      u32 ns_avgtxrssi;
 -      u32 ns_avgtxrate;
 -};
 -
 -#define ATH9K_RSSI_EP_MULTIPLIER  (1<<7)
 -
 -#define AR_GPIO_OUTPUT_MUX_AS_OUTPUT             0
 -#define AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED 1
 -#define AR_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED     2
 -#define AR_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED    5
 -#define AR_GPIO_OUTPUT_MUX_AS_MAC_POWER_LED      6
 -
 -enum {
 -      ATH9K_RESET_POWER_ON,
 -      ATH9K_RESET_WARM,
 -      ATH9K_RESET_COLD,
 -};
 -
 -#define AH_USE_EEPROM   0x1
 -
 -struct ath_hal {
 -      u32 ah_magic;
 -      u16 ah_devid;
 -      u16 ah_subvendorid;
 -      u32 ah_macVersion;
 -      u16 ah_macRev;
 -      u16 ah_phyRev;
 -      u16 ah_analog5GhzRev;
 -      u16 ah_analog2GhzRev;
 -
 -      void __iomem *ah_sh;
 -      struct ath_softc *ah_sc;
 -
 -      enum nl80211_iftype ah_opmode;
 -      struct ath9k_ops_config ah_config;
 -      struct ath9k_hw_capabilities ah_caps;
 -
 -      u16 ah_countryCode;
 -      u32 ah_flags;
 -      int16_t ah_powerLimit;
 -      u16 ah_maxPowerLevel;
 -      u32 ah_tpScale;
 -      u16 ah_currentRD;
 -      u16 ah_currentRDExt;
 -      u16 ah_currentRDInUse;
 -      u16 ah_currentRD5G;
 -      u16 ah_currentRD2G;
 -      char ah_iso[4];
 -
 -      struct ath9k_channel ah_channels[150];
 -      struct ath9k_channel *ah_curchan;
 -      u32 ah_nchan;
 -
 -      bool ah_isPciExpress;
 -      u16 ah_txTrigLevel;
 -      u16 ah_rfsilent;
 -      u32 ah_rfkill_gpio;
 -      u32 ah_rfkill_polarity;
 -
 -#ifndef ATH_NF_PER_CHAN
 -      struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
 +      enum ath9k_ht_macmode tx_chan_width;
 +
 +      struct ath_config config;
 +      struct ath_rx rx;
 +      struct ath_tx tx;
 +      struct ath_beacon beacon;
 +      struct ieee80211_rate rates[IEEE80211_NUM_BANDS][ATH_RATE_MAX];
 +      struct ath_rate_table *hw_rate_table[ATH9K_MODE_MAX];
 +      struct ath_rate_table *cur_rate_table;
 +      struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
 +
 +      struct ath_led radio_led;
 +      struct ath_led assoc_led;
 +      struct ath_led tx_led;
 +      struct ath_led rx_led;
 +      struct delayed_work ath_led_blink_work;
 +      int led_on_duration;
 +      int led_off_duration;
 +      int led_on_cnt;
 +      int led_off_cnt;
 +
 +      struct ath_rfkill rf_kill;
 +      struct ath_ani ani;
 +      struct ath9k_node_stats nodestats;
 +#ifdef CONFIG_ATH9K_DEBUG
 +      struct ath9k_debug debug;
 +#endif
 +      struct ath_bus_ops *bus_ops;
 +};
 +
 +struct ath_wiphy {
 +      struct ath_softc *sc; /* shared for all virtual wiphys */
 +      struct ieee80211_hw *hw;
 +      enum ath_wiphy_state {
 +              ATH_WIPHY_INACTIVE,
 +              ATH_WIPHY_ACTIVE,
 +              ATH_WIPHY_PAUSING,
 +              ATH_WIPHY_PAUSED,
 +              ATH_WIPHY_SCAN,
 +      } state;
 +      int chan_idx;
 +      int chan_is_ht;
 +};
 +
 +int ath_reset(struct ath_softc *sc, bool retry_tx);
 +int ath_get_hal_qnum(u16 queue, struct ath_softc *sc);
 +int ath_get_mac80211_qnum(u32 queue, struct ath_softc *sc);
 +int ath_cabq_update(struct ath_softc *);
 +
 +static inline void ath_read_cachesize(struct ath_softc *sc, int *csz)
 +{
 +      sc->bus_ops->read_cachesize(sc, csz);
 +}
 +
 +static inline void ath_bus_cleanup(struct ath_softc *sc)
 +{
 +      sc->bus_ops->cleanup(sc);
 +}
 +
 +extern struct ieee80211_ops ath9k_ops;
 +
 +irqreturn_t ath_isr(int irq, void *dev);
 +void ath_cleanup(struct ath_softc *sc);
 +int ath_attach(u16 devid, struct ath_softc *sc);
 +void ath_detach(struct ath_softc *sc);
 +const char *ath_mac_bb_name(u32 mac_bb_version);
 +const char *ath_rf_name(u16 rf_version);
 +void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw);
 +void ath9k_update_ichannel(struct ath_softc *sc, struct ieee80211_hw *hw,
 +                         struct ath9k_channel *ichan);
 +void ath_update_chainmask(struct ath_softc *sc, int is_ht);
 +int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
 +                  struct ath9k_channel *hchan);
 +void ath_radio_enable(struct ath_softc *sc);
 +void ath_radio_disable(struct ath_softc *sc);
 +
 +#ifdef CONFIG_PCI
 +int ath_pci_init(void);
 +void ath_pci_exit(void);
 +#else
 +static inline int ath_pci_init(void) { return 0; };
 +static inline void ath_pci_exit(void) {};
  #endif
 -};
 -
 -struct chan_centers {
 -      u16 synth_center;
 -      u16 ctl_center;
 -      u16 ext_center;
 -};
  
 -struct ath_rate_table;
 -
 -/* Helpers */
 -
 -enum wireless_mode ath9k_hw_chan2wmode(struct ath_hal *ah,
 -                             const struct ath9k_channel *chan);
 -bool ath9k_hw_wait(struct ath_hal *ah, u32 reg, u32 mask, u32 val);
 -u32 ath9k_hw_reverse_bits(u32 val, u32 n);
 -bool ath9k_get_channel_edges(struct ath_hal *ah,
 -                           u16 flags, u16 *low,
 -                           u16 *high);
 -u16 ath9k_hw_computetxtime(struct ath_hal *ah,
 -                         struct ath_rate_table *rates,
 -                         u32 frameLen, u16 rateix,
 -                         bool shortPreamble);
 -u32 ath9k_hw_mhz2ieee(struct ath_hal *ah, u32 freq, u32 flags);
 -void ath9k_hw_get_channel_centers(struct ath_hal *ah,
 -                                struct ath9k_channel *chan,
 -                                struct chan_centers *centers);
 -
 -/* Attach, Detach */
 -
 -const char *ath9k_hw_probe(u16 vendorid, u16 devid);
 -void ath9k_hw_detach(struct ath_hal *ah);
 -struct ath_hal *ath9k_hw_attach(u16 devid, struct ath_softc *sc,
 -                              void __iomem *mem, int *error);
 -void ath9k_hw_rfdetach(struct ath_hal *ah);
 -
 -
 -/* HW Reset */
 -
 -bool ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
 -                  enum ath9k_ht_macmode macmode,
 -                  u8 txchainmask, u8 rxchainmask,
 -                  enum ath9k_ht_extprotspacing extprotspacing,
 -                  bool bChannelChange, int *status);
 -
 -/* Key Cache Management */
 -
 -bool ath9k_hw_keyreset(struct ath_hal *ah, u16 entry);
 -bool ath9k_hw_keysetmac(struct ath_hal *ah, u16 entry, const u8 *mac);
 -bool ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry,
 -                               const struct ath9k_keyval *k,
 -                               const u8 *mac, int xorKey);
 -bool ath9k_hw_keyisvalid(struct ath_hal *ah, u16 entry);
 -
 -/* Power Management */
 -
 -bool ath9k_hw_setpower(struct ath_hal *ah,
 -                     enum ath9k_power_mode mode);
 -void ath9k_hw_configpcipowersave(struct ath_hal *ah, int restore);
 -
 -/* Beacon timers */
 -
 -void ath9k_hw_beaconinit(struct ath_hal *ah, u32 next_beacon, u32 beacon_period);
 -void ath9k_hw_set_sta_beacon_timers(struct ath_hal *ah,
 -                                  const struct ath9k_beacon_state *bs);
 -/* HW Capabilities */
 -
 -bool ath9k_hw_fill_cap_info(struct ath_hal *ah);
 -bool ath9k_hw_getcapability(struct ath_hal *ah, enum ath9k_capability_type type,
 -                          u32 capability, u32 *result);
 -bool ath9k_hw_setcapability(struct ath_hal *ah, enum ath9k_capability_type type,
 -                          u32 capability, u32 setting, int *status);
 -
 -/* GPIO / RFKILL / Antennae */
 -
 -void ath9k_hw_cfg_gpio_input(struct ath_hal *ah, u32 gpio);
 -u32 ath9k_hw_gpio_get(struct ath_hal *ah, u32 gpio);
 -void ath9k_hw_cfg_output(struct ath_hal *ah, u32 gpio,
 -                       u32 ah_signal_type);
 -void ath9k_hw_set_gpio(struct ath_hal *ah, u32 gpio, u32 val);
 -#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
 -void ath9k_enable_rfkill(struct ath_hal *ah);
 +#ifdef CONFIG_ATHEROS_AR71XX
 +int ath_ahb_init(void);
 +void ath_ahb_exit(void);
 +#else
 +static inline int ath_ahb_init(void) { return 0; };
 +static inline void ath_ahb_exit(void) {};
  #endif
 -int ath9k_hw_select_antconfig(struct ath_hal *ah, u32 cfg);
 -u32 ath9k_hw_getdefantenna(struct ath_hal *ah);
 -void ath9k_hw_setantenna(struct ath_hal *ah, u32 antenna);
 -bool ath9k_hw_setantennaswitch(struct ath_hal *ah,
 -                             enum ath9k_ant_setting settings,
 -                             struct ath9k_channel *chan,
 -                             u8 *tx_chainmask,
 -                             u8 *rx_chainmask,
 -                             u8 *antenna_cfgd);
 -
 -/* General Operation */
 -
 -u32 ath9k_hw_getrxfilter(struct ath_hal *ah);
 -void ath9k_hw_setrxfilter(struct ath_hal *ah, u32 bits);
 -bool ath9k_hw_phy_disable(struct ath_hal *ah);
 -bool ath9k_hw_disable(struct ath_hal *ah);
 -bool ath9k_hw_set_txpowerlimit(struct ath_hal *ah, u32 limit);
 -void ath9k_hw_getmac(struct ath_hal *ah, u8 *mac);
 -bool ath9k_hw_setmac(struct ath_hal *ah, const u8 *mac);
 -void ath9k_hw_setopmode(struct ath_hal *ah);
 -void ath9k_hw_setmcastfilter(struct ath_hal *ah, u32 filter0, u32 filter1);
 -void ath9k_hw_getbssidmask(struct ath_hal *ah, u8 *mask);
 -bool ath9k_hw_setbssidmask(struct ath_hal *ah, const u8 *mask);
 -void ath9k_hw_write_associd(struct ath_hal *ah, const u8 *bssid, u16 assocId);
 -u64 ath9k_hw_gettsf64(struct ath_hal *ah);
 -void ath9k_hw_reset_tsf(struct ath_hal *ah);
 -bool ath9k_hw_set_tsfadjust(struct ath_hal *ah, u32 setting);
 -bool ath9k_hw_setslottime(struct ath_hal *ah, u32 us);
 -void ath9k_hw_set11nmac2040(struct ath_hal *ah, enum ath9k_ht_macmode mode);
 -
 -/* Regulatory */
 -
 -bool ath9k_regd_is_public_safety_sku(struct ath_hal *ah);
 -struct ath9k_channel* ath9k_regd_check_channel(struct ath_hal *ah,
 -                       const struct ath9k_channel *c);
 -u32 ath9k_regd_get_ctl(struct ath_hal *ah, struct ath9k_channel *chan);
 -u32 ath9k_regd_get_antenna_allowed(struct ath_hal *ah,
 -                                 struct ath9k_channel *chan);
 -bool ath9k_regd_init_channels(struct ath_hal *ah,
 -                            u32 maxchans, u32 *nchans, u8 *regclassids,
 -                            u32 maxregids, u32 *nregids, u16 cc,
 -                            bool enableOutdoor, bool enableExtendedChannels);
  
 -/* ANI */
 +static inline void ath9k_ps_wakeup(struct ath_softc *sc)
 +{
 +      if (atomic_inc_return(&sc->ps_usecount) == 1)
 +              if (sc->sc_ah->power_mode !=  ATH9K_PM_AWAKE) {
 +                      sc->sc_ah->restore_mode = sc->sc_ah->power_mode;
 +                      ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
 +              }
 +}
 +
 +static inline void ath9k_ps_restore(struct ath_softc *sc)
 +{
 +      if (atomic_dec_and_test(&sc->ps_usecount))
 +              if ((sc->hw->conf.flags & IEEE80211_CONF_PS) &&
 +                  !(sc->sc_flags & SC_OP_WAIT_FOR_BEACON))
 +                      ath9k_hw_setpower(sc->sc_ah,
 +                                        sc->sc_ah->restore_mode);
 +}
 +
 +
 +void ath9k_set_bssid_mask(struct ieee80211_hw *hw);
 +int ath9k_wiphy_add(struct ath_softc *sc);
 +int ath9k_wiphy_del(struct ath_wiphy *aphy);
 +void ath9k_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb);
 +int ath9k_wiphy_pause(struct ath_wiphy *aphy);
 +int ath9k_wiphy_unpause(struct ath_wiphy *aphy);
 +int ath9k_wiphy_select(struct ath_wiphy *aphy);
 +void ath9k_wiphy_set_scheduler(struct ath_softc *sc, unsigned int msec_int);
 +void ath9k_wiphy_chan_work(struct work_struct *work);
 +bool ath9k_wiphy_started(struct ath_softc *sc);
 +void ath9k_wiphy_pause_all_forced(struct ath_softc *sc,
 +                                struct ath_wiphy *selected);
 +bool ath9k_wiphy_scanning(struct ath_softc *sc);
 +void ath9k_wiphy_work(struct work_struct *work);
  
 -void ath9k_ani_reset(struct ath_hal *ah);
 -void ath9k_hw_ani_monitor(struct ath_hal *ah,
 -                        const struct ath9k_node_stats *stats,
 -                        struct ath9k_channel *chan);
 -bool ath9k_hw_phycounters(struct ath_hal *ah);
 -void ath9k_enable_mib_counters(struct ath_hal *ah);
 -void ath9k_hw_disable_mib_counters(struct ath_hal *ah);
 -u32 ath9k_hw_GetMibCycleCountsPct(struct ath_hal *ah,
 -                                u32 *rxc_pcnt,
 -                                u32 *rxf_pcnt,
 -                                u32 *txf_pcnt);
 -void ath9k_hw_procmibevent(struct ath_hal *ah,
 -                         const struct ath9k_node_stats *stats);
 -void ath9k_hw_ani_setup(struct ath_hal *ah);
 -void ath9k_hw_ani_attach(struct ath_hal *ah);
 -void ath9k_hw_ani_detach(struct ath_hal *ah);
 -
 -/* Calibration */
 -
 -void ath9k_hw_reset_calvalid(struct ath_hal *ah, struct ath9k_channel *chan,
 -                           bool *isCalDone);
 -void ath9k_hw_start_nfcal(struct ath_hal *ah);
 -void ath9k_hw_loadnf(struct ath_hal *ah, struct ath9k_channel *chan);
 -int16_t ath9k_hw_getnf(struct ath_hal *ah,
 -                     struct ath9k_channel *chan);
 -void ath9k_init_nfcal_hist_buffer(struct ath_hal *ah);
 -s16 ath9k_hw_getchan_noise(struct ath_hal *ah, struct ath9k_channel *chan);
 -bool ath9k_hw_calibrate(struct ath_hal *ah, struct ath9k_channel *chan,
 -                      u8 rxchainmask, bool longcal,
 -                      bool *isCalDone);
 -bool ath9k_hw_init_cal(struct ath_hal *ah,
 -                     struct ath9k_channel *chan);
 -
 -
 -/* EEPROM */
 -
 -int ath9k_hw_set_txpower(struct ath_hal *ah,
 -                       struct ath9k_channel *chan,
 -                       u16 cfgCtl,
 -                       u8 twiceAntennaReduction,
 -                       u8 twiceMaxRegulatoryPower,
 -                       u8 powerLimit);
 -void ath9k_hw_set_addac(struct ath_hal *ah, struct ath9k_channel *chan);
 -bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah,
 -                                     struct ath9k_channel *chan,
 -                                     int16_t *ratesArray,
 -                                     u16 cfgCtl,
 -                                     u8 AntennaReduction,
 -                                     u8 twiceMaxRegulatoryPower,
 -                                     u8 powerLimit);
 -bool ath9k_hw_set_power_cal_table(struct ath_hal *ah,
 -                                struct ath9k_channel *chan,
 -                                int16_t *pTxPowerIndexOffset);
 -bool ath9k_hw_eeprom_set_board_values(struct ath_hal *ah,
 -                                    struct ath9k_channel *chan);
 -int ath9k_hw_get_eeprom_antenna_cfg(struct ath_hal *ah,
 -                                  struct ath9k_channel *chan,
 -                                  u8 index, u16 *config);
 -u8 ath9k_hw_get_num_ant_config(struct ath_hal *ah,
 -                             enum ieee80211_band freq_band);
 -u16 ath9k_hw_eeprom_get_spur_chan(struct ath_hal *ah, u16 i, bool is2GHz);
 -int ath9k_hw_eeprom_attach(struct ath_hal *ah);
 -
 -/* Interrupt Handling */
 -
 -bool ath9k_hw_intrpend(struct ath_hal *ah);
 -bool ath9k_hw_getisr(struct ath_hal *ah, enum ath9k_int *masked);
 -enum ath9k_int ath9k_hw_intrget(struct ath_hal *ah);
 -enum ath9k_int ath9k_hw_set_interrupts(struct ath_hal *ah, enum ath9k_int ints);
 -
 -/* MAC (PCU/QCU) */
 -
 -u32 ath9k_hw_gettxbuf(struct ath_hal *ah, u32 q);
 -bool ath9k_hw_puttxbuf(struct ath_hal *ah, u32 q, u32 txdp);
 -bool ath9k_hw_txstart(struct ath_hal *ah, u32 q);
 -u32 ath9k_hw_numtxpending(struct ath_hal *ah, u32 q);
 -bool ath9k_hw_updatetxtriglevel(struct ath_hal *ah, bool bIncTrigLevel);
 -bool ath9k_hw_stoptxdma(struct ath_hal *ah, u32 q);
 -bool ath9k_hw_filltxdesc(struct ath_hal *ah, struct ath_desc *ds,
 -                       u32 segLen, bool firstSeg,
 -                       bool lastSeg, const struct ath_desc *ds0);
 -void ath9k_hw_cleartxdesc(struct ath_hal *ah, struct ath_desc *ds);
 -int ath9k_hw_txprocdesc(struct ath_hal *ah, struct ath_desc *ds);
 -void ath9k_hw_set11n_txdesc(struct ath_hal *ah, struct ath_desc *ds,
 -                          u32 pktLen, enum ath9k_pkt_type type, u32 txPower,
 -                          u32 keyIx, enum ath9k_key_type keyType, u32 flags);
 -void ath9k_hw_set11n_ratescenario(struct ath_hal *ah, struct ath_desc *ds,
 -                                struct ath_desc *lastds,
 -                                u32 durUpdateEn, u32 rtsctsRate,
 -                                u32 rtsctsDuration,
 -                                struct ath9k_11n_rate_series series[],
 -                                u32 nseries, u32 flags);
 -void ath9k_hw_set11n_aggr_first(struct ath_hal *ah, struct ath_desc *ds,
 -                              u32 aggrLen);
 -void ath9k_hw_set11n_aggr_middle(struct ath_hal *ah, struct ath_desc *ds,
 -                               u32 numDelims);
 -void ath9k_hw_set11n_aggr_last(struct ath_hal *ah, struct ath_desc *ds);
 -void ath9k_hw_clr11n_aggr(struct ath_hal *ah, struct ath_desc *ds);
 -void ath9k_hw_set11n_burstduration(struct ath_hal *ah, struct ath_desc *ds,
 -                                 u32 burstDuration);
 -void ath9k_hw_set11n_virtualmorefrag(struct ath_hal *ah, struct ath_desc *ds,
 -                                   u32 vmf);
 -void ath9k_hw_gettxintrtxqs(struct ath_hal *ah, u32 *txqs);
 -bool ath9k_hw_set_txq_props(struct ath_hal *ah, int q,
 -                          const struct ath9k_tx_queue_info *qinfo);
 -bool ath9k_hw_get_txq_props(struct ath_hal *ah, int q,
 -                          struct ath9k_tx_queue_info *qinfo);
 -int ath9k_hw_setuptxqueue(struct ath_hal *ah, enum ath9k_tx_queue type,
 -                        const struct ath9k_tx_queue_info *qinfo);
 -bool ath9k_hw_releasetxqueue(struct ath_hal *ah, u32 q);
 -bool ath9k_hw_resettxqueue(struct ath_hal *ah, u32 q);
 -int ath9k_hw_rxprocdesc(struct ath_hal *ah, struct ath_desc *ds,
 -                      u32 pa, struct ath_desc *nds, u64 tsf);
 -bool ath9k_hw_setuprxdesc(struct ath_hal *ah, struct ath_desc *ds,
 -                        u32 size, u32 flags);
 -bool ath9k_hw_setrxabort(struct ath_hal *ah, bool set);
 -void ath9k_hw_putrxbuf(struct ath_hal *ah, u32 rxdp);
 -void ath9k_hw_rxena(struct ath_hal *ah);
 -void ath9k_hw_startpcureceive(struct ath_hal *ah);
 -void ath9k_hw_stoppcurecv(struct ath_hal *ah);
 -bool ath9k_hw_stopdmarecv(struct ath_hal *ah);
++/*
++ * Read and write, they both share the same lock. We do this to serialize
++ * reads and writes on Atheros 802.11n PCI devices only. This is required
++ * as the FIFO on these devices can only accept sanely 2 requests. After
++ * that the device goes bananas. Serializing the reads/writes prevents this
++ * from happening.
++ */
 -#endif
++static inline void ath9k_iowrite32(struct ath_hw *ah, u32 reg_offset, u32 val)
++{
++      if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
++              unsigned long flags;
++              spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
++              iowrite32(val, ah->ah_sc->mem + reg_offset);
++              spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
++      } else
++              iowrite32(val, ah->ah_sc->mem + reg_offset);
++}
++
++static inline unsigned int ath9k_ioread32(struct ath_hw *ah, u32 reg_offset)
++{
++      u32 val;
++      if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
++              unsigned long flags;
++              spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
++              val = ioread32(ah->ah_sc->mem + reg_offset);
++              spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
++      } else
++              val = ioread32(ah->ah_sc->mem + reg_offset);
++      return val;
++}
++
 +#endif /* ATH9K_H */
index eb750a503999aac80853b6cb0c7a69eea4aba54e,c38a00bbce64664caa1042be4ee37da97e1f6c46..60e55d8c510ba2efe3692a1fe498bf477373ec21
@@@ -357,49 -403,73 +357,68 @@@ static void ath9k_hw_set_defaults(struc
  {
        int i;
  
 -      ah->ah_config.dma_beacon_response_time = 2;
 -      ah->ah_config.sw_beacon_response_time = 10;
 -      ah->ah_config.additional_swba_backoff = 0;
 -      ah->ah_config.ack_6mb = 0x0;
 -      ah->ah_config.cwm_ignore_extcca = 0;
 -      ah->ah_config.pcie_powersave_enable = 0;
 -      ah->ah_config.pcie_l1skp_enable = 0;
 -      ah->ah_config.pcie_clock_req = 0;
 -      ah->ah_config.pcie_power_reset = 0x100;
 -      ah->ah_config.pcie_restore = 0;
 -      ah->ah_config.pcie_waen = 0;
 -      ah->ah_config.analog_shiftreg = 1;
 -      ah->ah_config.ht_enable = 1;
 -      ah->ah_config.ofdm_trig_low = 200;
 -      ah->ah_config.ofdm_trig_high = 500;
 -      ah->ah_config.cck_trig_high = 200;
 -      ah->ah_config.cck_trig_low = 100;
 -      ah->ah_config.enable_ani = 1;
 -      ah->ah_config.noise_immunity_level = 4;
 -      ah->ah_config.ofdm_weaksignal_det = 1;
 -      ah->ah_config.cck_weaksignal_thr = 0;
 -      ah->ah_config.spur_immunity_level = 2;
 -      ah->ah_config.firstep_level = 0;
 -      ah->ah_config.rssi_thr_high = 40;
 -      ah->ah_config.rssi_thr_low = 7;
 -      ah->ah_config.diversity_control = 0;
 -      ah->ah_config.antenna_switch_swap = 0;
 +      ah->config.dma_beacon_response_time = 2;
 +      ah->config.sw_beacon_response_time = 10;
 +      ah->config.additional_swba_backoff = 0;
 +      ah->config.ack_6mb = 0x0;
 +      ah->config.cwm_ignore_extcca = 0;
 +      ah->config.pcie_powersave_enable = 0;
 +      ah->config.pcie_l1skp_enable = 0;
 +      ah->config.pcie_clock_req = 0;
 +      ah->config.pcie_power_reset = 0x100;
 +      ah->config.pcie_restore = 0;
 +      ah->config.pcie_waen = 0;
 +      ah->config.analog_shiftreg = 1;
 +      ah->config.ht_enable = 1;
 +      ah->config.ofdm_trig_low = 200;
 +      ah->config.ofdm_trig_high = 500;
 +      ah->config.cck_trig_high = 200;
 +      ah->config.cck_trig_low = 100;
 +      ah->config.enable_ani = 1;
 +      ah->config.noise_immunity_level = 4;
 +      ah->config.ofdm_weaksignal_det = 1;
 +      ah->config.cck_weaksignal_thr = 0;
 +      ah->config.spur_immunity_level = 2;
 +      ah->config.firstep_level = 0;
 +      ah->config.rssi_thr_high = 40;
 +      ah->config.rssi_thr_low = 7;
 +      ah->config.diversity_control = 0;
 +      ah->config.antenna_switch_swap = 0;
  
        for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
 -              ah->ah_config.spurchans[i][0] = AR_NO_SPUR;
 -              ah->ah_config.spurchans[i][1] = AR_NO_SPUR;
 +              ah->config.spurchans[i][0] = AR_NO_SPUR;
 +              ah->config.spurchans[i][1] = AR_NO_SPUR;
        }
  
 -      ah->ah_config.intr_mitigation = 1;
 +      ah->config.intr_mitigation = 1;
+       /*
+        * We need this for PCI devices only (Cardbus, PCI, miniPCI)
+        * _and_ if on non-uniprocessor systems (Multiprocessor/HT).
+        * This means we use it for all AR5416 devices, and the few
+        * minor PCI AR9280 devices out there.
+        *
+        * Serialization is required because these devices do not handle
+        * well the case of two concurrent reads/writes due to the latency
+        * involved. During one read/write another read/write can be issued
+        * on another CPU while the previous read/write may still be working
+        * on our hardware, if we hit this case the hardware poops in a loop.
+        * We prevent this by serializing reads and writes.
+        *
+        * This issue is not present on PCI-Express devices or pre-AR5416
+        * devices (legacy, 802.11abg).
+        */
+       if (num_possible_cpus() > 1)
 -              ah->ah_config.serialize_regmode = SER_REG_MODE_AUTO;
++              ah->config.serialize_regmode = SER_REG_MODE_AUTO;
  }
  
 -static struct ath_hal_5416 *ath9k_hw_newstate(u16 devid,
 -                                            struct ath_softc *sc,
 -                                            void __iomem *mem,
 -                                            int *status)
 +static struct ath_hw *ath9k_hw_newstate(u16 devid, struct ath_softc *sc,
 +                                      int *status)
  {
 -      static const u8 defbssidmask[ETH_ALEN] =
 -              { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 -      struct ath_hal_5416 *ahp;
 -      struct ath_hal *ah;
 +      struct ath_hw *ah;
  
 -      ahp = kzalloc(sizeof(struct ath_hal_5416), GFP_KERNEL);
 -      if (ahp == NULL) {
 +      ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
 +      if (ah == NULL) {
                DPRINTF(sc, ATH_DBG_FATAL,
                        "Cannot allocate memory for state block\n");
                *status = -ENOMEM;
@@@ -609,12 -686,13 +628,13 @@@ static struct ath_hw *ath9k_hw_do_attac
                goto bad;
        }
  
 -      if (ah->ah_config.serialize_regmode == SER_REG_MODE_AUTO) {
 -              if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI ||
 -                  (AR_SREV_9280(ah) && !ah->ah_isPciExpress)) {
 -                      ah->ah_config.serialize_regmode =
 +      if (ah->config.serialize_regmode == SER_REG_MODE_AUTO) {
-               if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI) {
++              if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI ||
++                  (AR_SREV_9280(ah) && !ah->is_pciexpress)) {
 +                      ah->config.serialize_regmode =
                                SER_REG_MODE_ON;
                } else {
 -                      ah->ah_config.serialize_regmode =
 +                      ah->config.serialize_regmode =
                                SER_REG_MODE_OFF;
                }
        }
index 89936a038da3604d345c6feb34423a07e67dba26,91d8f594af813a9d1d5100ea117c4ffef0e841d7..dc681f011fdfa1b3be21686c6b1ce0805b7405b7
  
  #include <linux/if_ether.h>
  #include <linux/delay.h>
- #define REG_WRITE(_ah, _reg, _val) iowrite32(_val, _ah->ah_sc->mem + _reg)
- #define REG_READ(_ah, _reg) ioread32(_ah->ah_sc->mem + _reg)
 +#include <linux/io.h>
 +
 +#include "mac.h"
 +#include "ani.h"
 +#include "eeprom.h"
 +#include "calib.h"
 +#include "regd.h"
 +#include "reg.h"
 +#include "phy.h"
 +
 +#define ATHEROS_VENDOR_ID     0x168c
 +#define AR5416_DEVID_PCI      0x0023
 +#define AR5416_DEVID_PCIE     0x0024
 +#define AR9160_DEVID_PCI      0x0027
 +#define AR9280_DEVID_PCI      0x0029
 +#define AR9280_DEVID_PCIE     0x002a
 +#define AR9285_DEVID_PCIE     0x002b
 +#define AR5416_AR9100_DEVID   0x000b
 +#define       AR_SUBVENDOR_ID_NOG     0x0e11
 +#define AR_SUBVENDOR_ID_NEW_A 0x7065
 +#define AR5416_MAGIC          0x19641014
 +
 +/* Register read/write primitives */
++#define REG_WRITE(_ah, _reg, _val) ath9k_iowrite32((_ah), (_reg), (_val))
++#define REG_READ(_ah, _reg) ath9k_ioread32((_ah), (_reg))
 +
 +#define SM(_v, _f)  (((_v) << _f##_S) & _f)
 +#define MS(_v, _f)  (((_v) & _f) >> _f##_S)
 +#define REG_RMW(_a, _r, _set, _clr)    \
 +      REG_WRITE(_a, _r, (REG_READ(_a, _r) & ~(_clr)) | (_set))
 +#define REG_RMW_FIELD(_a, _r, _f, _v) \
 +      REG_WRITE(_a, _r, \
 +      (REG_READ(_a, _r) & ~_f) | (((_v) << _f##_S) & _f))
 +#define REG_SET_BIT(_a, _r, _f) \
 +      REG_WRITE(_a, _r, REG_READ(_a, _r) | _f)
 +#define REG_CLR_BIT(_a, _r, _f) \
 +      REG_WRITE(_a, _r, REG_READ(_a, _r) & ~_f)
  
 -struct ar5416_desc {
 -      u32 ds_link;
 -      u32 ds_data;
 -      u32 ds_ctl0;
 -      u32 ds_ctl1;
 -      union {
 -              struct {
 -                      u32 ctl2;
 -                      u32 ctl3;
 -                      u32 ctl4;
 -                      u32 ctl5;
 -                      u32 ctl6;
 -                      u32 ctl7;
 -                      u32 ctl8;
 -                      u32 ctl9;
 -                      u32 ctl10;
 -                      u32 ctl11;
 -                      u32 status0;
 -                      u32 status1;
 -                      u32 status2;
 -                      u32 status3;
 -                      u32 status4;
 -                      u32 status5;
 -                      u32 status6;
 -                      u32 status7;
 -                      u32 status8;
 -                      u32 status9;
 -              } tx;
 -              struct {
 -                      u32 status0;
 -                      u32 status1;
 -                      u32 status2;
 -                      u32 status3;
 -                      u32 status4;
 -                      u32 status5;
 -                      u32 status6;
 -                      u32 status7;
 -                      u32 status8;
 -              } rx;
 -      } u;
 -} __packed;
 -
 -#define AR5416DESC(_ds)         ((struct ar5416_desc *)(_ds))
 -#define AR5416DESC_CONST(_ds)   ((const struct ar5416_desc *)(_ds))
 -
 -#define ds_ctl2     u.tx.ctl2
 -#define ds_ctl3     u.tx.ctl3
 -#define ds_ctl4     u.tx.ctl4
 -#define ds_ctl5     u.tx.ctl5
 -#define ds_ctl6     u.tx.ctl6
 -#define ds_ctl7     u.tx.ctl7
 -#define ds_ctl8     u.tx.ctl8
 -#define ds_ctl9     u.tx.ctl9
 -#define ds_ctl10    u.tx.ctl10
 -#define ds_ctl11    u.tx.ctl11
 -
 -#define ds_txstatus0    u.tx.status0
 -#define ds_txstatus1    u.tx.status1
 -#define ds_txstatus2    u.tx.status2
 -#define ds_txstatus3    u.tx.status3
 -#define ds_txstatus4    u.tx.status4
 -#define ds_txstatus5    u.tx.status5
 -#define ds_txstatus6    u.tx.status6
 -#define ds_txstatus7    u.tx.status7
 -#define ds_txstatus8    u.tx.status8
 -#define ds_txstatus9    u.tx.status9
 -
 -#define ds_rxstatus0    u.rx.status0
 -#define ds_rxstatus1    u.rx.status1
 -#define ds_rxstatus2    u.rx.status2
 -#define ds_rxstatus3    u.rx.status3
 -#define ds_rxstatus4    u.rx.status4
 -#define ds_rxstatus5    u.rx.status5
 -#define ds_rxstatus6    u.rx.status6
 -#define ds_rxstatus7    u.rx.status7
 -#define ds_rxstatus8    u.rx.status8
 -
 -#define AR_FrameLen         0x00000fff
 -#define AR_VirtMoreFrag     0x00001000
 -#define AR_TxCtlRsvd00      0x0000e000
 -#define AR_XmitPower        0x003f0000
 -#define AR_XmitPower_S      16
 -#define AR_RTSEnable        0x00400000
 -#define AR_VEOL             0x00800000
 -#define AR_ClrDestMask      0x01000000
 -#define AR_TxCtlRsvd01      0x1e000000
 -#define AR_TxIntrReq        0x20000000
 -#define AR_DestIdxValid     0x40000000
 -#define AR_CTSEnable        0x80000000
 -
 -#define AR_BufLen           0x00000fff
 -#define AR_TxMore           0x00001000
 -#define AR_DestIdx          0x000fe000
 -#define AR_DestIdx_S        13
 -#define AR_FrameType        0x00f00000
 -#define AR_FrameType_S      20
 -#define AR_NoAck            0x01000000
 -#define AR_InsertTS         0x02000000
 -#define AR_CorruptFCS       0x04000000
 -#define AR_ExtOnly          0x08000000
 -#define AR_ExtAndCtl        0x10000000
 -#define AR_MoreAggr         0x20000000
 -#define AR_IsAggr           0x40000000
 -
 -#define AR_BurstDur         0x00007fff
 -#define AR_BurstDur_S       0
 -#define AR_DurUpdateEna     0x00008000
 -#define AR_XmitDataTries0   0x000f0000
 -#define AR_XmitDataTries0_S 16
 -#define AR_XmitDataTries1   0x00f00000
 -#define AR_XmitDataTries1_S 20
 -#define AR_XmitDataTries2   0x0f000000
 -#define AR_XmitDataTries2_S 24
 -#define AR_XmitDataTries3   0xf0000000
 -#define AR_XmitDataTries3_S 28
 -
 -#define AR_XmitRate0        0x000000ff
 -#define AR_XmitRate0_S      0
 -#define AR_XmitRate1        0x0000ff00
 -#define AR_XmitRate1_S      8
 -#define AR_XmitRate2        0x00ff0000
 -#define AR_XmitRate2_S      16
 -#define AR_XmitRate3        0xff000000
 -#define AR_XmitRate3_S      24
 -
 -#define AR_PacketDur0       0x00007fff
 -#define AR_PacketDur0_S     0
 -#define AR_RTSCTSQual0      0x00008000
 -#define AR_PacketDur1       0x7fff0000
 -#define AR_PacketDur1_S     16
 -#define AR_RTSCTSQual1      0x80000000
 -
 -#define AR_PacketDur2       0x00007fff
 -#define AR_PacketDur2_S     0
 -#define AR_RTSCTSQual2      0x00008000
 -#define AR_PacketDur3       0x7fff0000
 -#define AR_PacketDur3_S     16
 -#define AR_RTSCTSQual3      0x80000000
 -
 -#define AR_AggrLen          0x0000ffff
 -#define AR_AggrLen_S        0
 -#define AR_TxCtlRsvd60      0x00030000
 -#define AR_PadDelim         0x03fc0000
 -#define AR_PadDelim_S       18
 -#define AR_EncrType         0x0c000000
 -#define AR_EncrType_S       26
 -#define AR_TxCtlRsvd61      0xf0000000
 -
 -#define AR_2040_0           0x00000001
 -#define AR_GI0              0x00000002
 -#define AR_ChainSel0        0x0000001c
 -#define AR_ChainSel0_S      2
 -#define AR_2040_1           0x00000020
 -#define AR_GI1              0x00000040
 -#define AR_ChainSel1        0x00000380
 -#define AR_ChainSel1_S      7
 -#define AR_2040_2           0x00000400
 -#define AR_GI2              0x00000800
 -#define AR_ChainSel2        0x00007000
 -#define AR_ChainSel2_S      12
 -#define AR_2040_3           0x00008000
 -#define AR_GI3              0x00010000
 -#define AR_ChainSel3        0x000e0000
 -#define AR_ChainSel3_S      17
 -#define AR_RTSCTSRate       0x0ff00000
 -#define AR_RTSCTSRate_S     20
 -#define AR_TxCtlRsvd70      0xf0000000
 -
 -#define AR_TxRSSIAnt00      0x000000ff
 -#define AR_TxRSSIAnt00_S    0
 -#define AR_TxRSSIAnt01      0x0000ff00
 -#define AR_TxRSSIAnt01_S    8
 -#define AR_TxRSSIAnt02      0x00ff0000
 -#define AR_TxRSSIAnt02_S    16
 -#define AR_TxStatusRsvd00   0x3f000000
 -#define AR_TxBaStatus       0x40000000
 -#define AR_TxStatusRsvd01   0x80000000
 -
 -#define AR_FrmXmitOK            0x00000001
 -#define AR_ExcessiveRetries     0x00000002
 -#define AR_FIFOUnderrun         0x00000004
 -#define AR_Filtered             0x00000008
 -#define AR_RTSFailCnt           0x000000f0
 -#define AR_RTSFailCnt_S         4
 -#define AR_DataFailCnt          0x00000f00
 -#define AR_DataFailCnt_S        8
 -#define AR_VirtRetryCnt         0x0000f000
 -#define AR_VirtRetryCnt_S       12
 -#define AR_TxDelimUnderrun      0x00010000
 -#define AR_TxDataUnderrun       0x00020000
 -#define AR_DescCfgErr           0x00040000
 -#define AR_TxTimerExpired       0x00080000
 -#define AR_TxStatusRsvd10       0xfff00000
 -
 -#define AR_SendTimestamp    ds_txstatus2
 -#define AR_BaBitmapLow      ds_txstatus3
 -#define AR_BaBitmapHigh     ds_txstatus4
 -
 -#define AR_TxRSSIAnt10      0x000000ff
 -#define AR_TxRSSIAnt10_S    0
 -#define AR_TxRSSIAnt11      0x0000ff00
 -#define AR_TxRSSIAnt11_S    8
 -#define AR_TxRSSIAnt12      0x00ff0000
 -#define AR_TxRSSIAnt12_S    16
 -#define AR_TxRSSICombined   0xff000000
 -#define AR_TxRSSICombined_S 24
 -
 -#define AR_TxEVM0           ds_txstatus5
 -#define AR_TxEVM1           ds_txstatus6
 -#define AR_TxEVM2           ds_txstatus7
 -
 -#define AR_TxDone           0x00000001
 -#define AR_SeqNum           0x00001ffe
 -#define AR_SeqNum_S         1
 -#define AR_TxStatusRsvd80   0x0001e000
 -#define AR_TxOpExceeded     0x00020000
 -#define AR_TxStatusRsvd81   0x001c0000
 -#define AR_FinalTxIdx       0x00600000
 -#define AR_FinalTxIdx_S     21
 -#define AR_TxStatusRsvd82   0x01800000
 -#define AR_PowerMgmt        0x02000000
 -#define AR_TxStatusRsvd83   0xfc000000
 -
 -#define AR_RxCTLRsvd00  0xffffffff
 -
 -#define AR_BufLen       0x00000fff
 -#define AR_RxCtlRsvd00  0x00001000
 -#define AR_RxIntrReq    0x00002000
 -#define AR_RxCtlRsvd01  0xffffc000
 -
 -#define AR_RxRSSIAnt00      0x000000ff
 -#define AR_RxRSSIAnt00_S    0
 -#define AR_RxRSSIAnt01      0x0000ff00
 -#define AR_RxRSSIAnt01_S    8
 -#define AR_RxRSSIAnt02      0x00ff0000
 -#define AR_RxRSSIAnt02_S    16
 -#define AR_RxRate           0xff000000
 -#define AR_RxRate_S         24
 -#define AR_RxStatusRsvd00   0xff000000
 -
 -#define AR_DataLen          0x00000fff
 -#define AR_RxMore           0x00001000
 -#define AR_NumDelim         0x003fc000
 -#define AR_NumDelim_S       14
 -#define AR_RxStatusRsvd10   0xff800000
 -
 -#define AR_RcvTimestamp     ds_rxstatus2
 -
 -#define AR_GI               0x00000001
 -#define AR_2040             0x00000002
 -#define AR_Parallel40       0x00000004
 -#define AR_Parallel40_S     2
 -#define AR_RxStatusRsvd30   0x000000f8
 -#define AR_RxAntenna      0xffffff00
 -#define AR_RxAntenna_S            8
 -
 -#define AR_RxRSSIAnt10            0x000000ff
 -#define AR_RxRSSIAnt10_S          0
 -#define AR_RxRSSIAnt11            0x0000ff00
 -#define AR_RxRSSIAnt11_S          8
 -#define AR_RxRSSIAnt12            0x00ff0000
 -#define AR_RxRSSIAnt12_S          16
 -#define AR_RxRSSICombined         0xff000000
 -#define AR_RxRSSICombined_S       24
 -
 -#define AR_RxEVM0           ds_rxstatus4
 -#define AR_RxEVM1           ds_rxstatus5
 -#define AR_RxEVM2           ds_rxstatus6
 -
 -#define AR_RxDone           0x00000001
 -#define AR_RxFrameOK        0x00000002
 -#define AR_CRCErr           0x00000004
 -#define AR_DecryptCRCErr    0x00000008
 -#define AR_PHYErr           0x00000010
 -#define AR_MichaelErr       0x00000020
 -#define AR_PreDelimCRCErr   0x00000040
 -#define AR_RxStatusRsvd70   0x00000080
 -#define AR_RxKeyIdxValid    0x00000100
 -#define AR_KeyIdx           0x0000fe00
 -#define AR_KeyIdx_S         9
 -#define AR_PHYErrCode       0x0000ff00
 -#define AR_PHYErrCode_S     8
 -#define AR_RxMoreAggr       0x00010000
 -#define AR_RxAggr           0x00020000
 -#define AR_PostDelimCRCErr  0x00040000
 -#define AR_RxStatusRsvd71   0x3ff80000
 -#define AR_DecryptBusyErr   0x40000000
 -#define AR_KeyMiss          0x80000000
 -
 -#define AR5416_MAGIC        0x19641014
 -
 -#define RXSTATUS_RATE(ah, ads)  (AR_SREV_5416_V20_OR_LATER(ah) ?      \
 -                               MS(ads->ds_rxstatus0, AR_RxRate) :     \
 -                               (ads->ds_rxstatus3 >> 2) & 0xFF)
 -
 -#define set11nTries(_series, _index) \
 -      (SM((_series)[_index].Tries, AR_XmitDataTries##_index))
 -
 -#define set11nRate(_series, _index) \
 -      (SM((_series)[_index].Rate, AR_XmitRate##_index))
 -
 -#define set11nPktDurRTSCTS(_series, _index)                           \
 -      (SM((_series)[_index].PktDuration, AR_PacketDur##_index) |      \
 -      ((_series)[_index].RateFlags & ATH9K_RATESERIES_RTS_CTS   ?     \
 -              AR_RTSCTSQual##_index : 0))
 +#define DO_DELAY(x) do {                      \
 +              if ((++(x) % 64) == 0)          \
 +                      udelay(1);              \
 +      } while (0)
  
 -#define set11nRateFlags(_series, _index)                              \
 -      (((_series)[_index].RateFlags & ATH9K_RATESERIES_2040 ?         \
 -        AR_2040_##_index : 0)                                         \
 -       |((_series)[_index].RateFlags & ATH9K_RATESERIES_HALFGI ?      \
 -         AR_GI##_index : 0)                                           \
 -       |SM((_series)[_index].ChSel, AR_ChainSel##_index))
 +#define REG_WRITE_ARRAY(iniarray, column, regWr) do {                   \
 +              int r;                                                  \
 +              for (r = 0; r < ((iniarray)->ia_rows); r++) {           \
 +                      REG_WRITE(ah, INI_RA((iniarray), (r), 0),       \
 +                                INI_RA((iniarray), r, (column)));     \
 +                      DO_DELAY(regWr);                                \
 +              }                                                       \
 +      } while (0)
  
 -#define AR_SREV_9100(ah) ((ah->ah_macVersion) == AR_SREV_VERSION_9100)
 +#define AR_GPIO_OUTPUT_MUX_AS_OUTPUT             0
 +#define AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED 1
 +#define AR_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED     2
 +#define AR_GPIO_OUTPUT_MUX_AS_TX_FRAME           3
 +#define AR_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED    5
 +#define AR_GPIO_OUTPUT_MUX_AS_MAC_POWER_LED      6
  
 -#define INIT_CONFIG_STATUS  0x00000000
 -#define INIT_RSSI_THR       0x00000700
 -#define INIT_BCON_CNTRL_REG 0x00000000
 +#define AR_GPIOD_MASK               0x00001FFF
 +#define AR_GPIO_BIT(_gpio)          (1 << (_gpio))
  
 -#define MIN_TX_FIFO_THRESHOLD   0x1
 -#define MAX_TX_FIFO_THRESHOLD   ((4096 / 64) - 1)
 -#define INIT_TX_FIFO_THRESHOLD  MIN_TX_FIFO_THRESHOLD
 +#define BASE_ACTIVATE_DELAY         100
 +#define RTC_PLL_SETTLE_DELAY        1000
 +#define COEF_SCALE_S                24
 +#define HT40_CHANNEL_CENTER_SHIFT   10
  
 -struct ar5416AniState {
 -      struct ath9k_channel c;
 -      u8 noiseImmunityLevel;
 -      u8 spurImmunityLevel;
 -      u8 firstepLevel;
 -      u8 ofdmWeakSigDetectOff;
 -      u8 cckWeakSigThreshold;
 -      u32 listenTime;
 -      u32 ofdmTrigHigh;
 -      u32 ofdmTrigLow;
 -      int32_t cckTrigHigh;
 -      int32_t cckTrigLow;
 -      int32_t rssiThrLow;
 -      int32_t rssiThrHigh;
 -      u32 noiseFloor;
 -      u32 txFrameCount;
 -      u32 rxFrameCount;
 -      u32 cycleCount;
 -      u32 ofdmPhyErrCount;
 -      u32 cckPhyErrCount;
 -      u32 ofdmPhyErrBase;
 -      u32 cckPhyErrBase;
 -      int16_t pktRssi[2];
 -      int16_t ofdmErrRssi[2];
 -      int16_t cckErrRssi[2];
 +#define ATH9K_ANTENNA0_CHAINMASK    0x1
 +#define ATH9K_ANTENNA1_CHAINMASK    0x2
 +
 +#define ATH9K_NUM_DMA_DEBUG_REGS    8
 +#define ATH9K_NUM_QUEUES            10
 +
 +#define MAX_RATE_POWER              63
 +#define AH_WAIT_TIMEOUT             100000 /* (us) */
 +#define AH_TIME_QUANTUM             10
 +#define AR_KEYTABLE_SIZE            128
 +#define POWER_UP_TIME               200000
 +#define SPUR_RSSI_THRESH            40
 +
 +#define CAB_TIMEOUT_VAL             10
 +#define BEACON_TIMEOUT_VAL          10
 +#define MIN_BEACON_TIMEOUT_VAL      1
 +#define SLEEP_SLOP                  3
 +
 +#define INIT_CONFIG_STATUS          0x00000000
 +#define INIT_RSSI_THR               0x00000700
 +#define INIT_BCON_CNTRL_REG         0x00000000
 +
 +#define TU_TO_USEC(_tu)             ((_tu) << 10)
 +
 +enum wireless_mode {
 +      ATH9K_MODE_11A = 0,
 +      ATH9K_MODE_11B = 2,
 +      ATH9K_MODE_11G = 3,
 +      ATH9K_MODE_11NA_HT20 = 6,
 +      ATH9K_MODE_11NG_HT20 = 7,
 +      ATH9K_MODE_11NA_HT40PLUS = 8,
 +      ATH9K_MODE_11NA_HT40MINUS = 9,
 +      ATH9K_MODE_11NG_HT40PLUS = 10,
 +      ATH9K_MODE_11NG_HT40MINUS = 11,
 +      ATH9K_MODE_MAX
  };
  
 -#define HAL_PROCESS_ANI     0x00000001
 -#define DO_ANI(ah) \
 -      ((AH5416(ah)->ah_procPhyErr & HAL_PROCESS_ANI))
 -
 -struct ar5416Stats {
 -      u32 ast_ani_niup;
 -      u32 ast_ani_nidown;
 -      u32 ast_ani_spurup;
 -      u32 ast_ani_spurdown;
 -      u32 ast_ani_ofdmon;
 -      u32 ast_ani_ofdmoff;
 -      u32 ast_ani_cckhigh;
 -      u32 ast_ani_ccklow;
 -      u32 ast_ani_stepup;
 -      u32 ast_ani_stepdown;
 -      u32 ast_ani_ofdmerrs;
 -      u32 ast_ani_cckerrs;
 -      u32 ast_ani_reset;
 -      u32 ast_ani_lzero;
 -      u32 ast_ani_lneg;
 -      struct ath9k_mib_stats ast_mibstats;
 -      struct ath9k_node_stats ast_nodestats;
 +enum ath9k_hw_caps {
 +      ATH9K_HW_CAP_CHAN_SPREAD                = BIT(0),
 +      ATH9K_HW_CAP_MIC_AESCCM                 = BIT(1),
 +      ATH9K_HW_CAP_MIC_CKIP                   = BIT(2),
 +      ATH9K_HW_CAP_MIC_TKIP                   = BIT(3),
 +      ATH9K_HW_CAP_CIPHER_AESCCM              = BIT(4),
 +      ATH9K_HW_CAP_CIPHER_CKIP                = BIT(5),
 +      ATH9K_HW_CAP_CIPHER_TKIP                = BIT(6),
 +      ATH9K_HW_CAP_VEOL                       = BIT(7),
 +      ATH9K_HW_CAP_BSSIDMASK                  = BIT(8),
 +      ATH9K_HW_CAP_MCAST_KEYSEARCH            = BIT(9),
 +      ATH9K_HW_CAP_CHAN_HALFRATE              = BIT(10),
 +      ATH9K_HW_CAP_CHAN_QUARTERRATE           = BIT(11),
 +      ATH9K_HW_CAP_HT                         = BIT(12),
 +      ATH9K_HW_CAP_GTT                        = BIT(13),
 +      ATH9K_HW_CAP_FASTCC                     = BIT(14),
 +      ATH9K_HW_CAP_RFSILENT                   = BIT(15),
 +      ATH9K_HW_CAP_WOW                        = BIT(16),
 +      ATH9K_HW_CAP_CST                        = BIT(17),
 +      ATH9K_HW_CAP_ENHANCEDPM                 = BIT(18),
 +      ATH9K_HW_CAP_AUTOSLEEP                  = BIT(19),
 +      ATH9K_HW_CAP_4KB_SPLITTRANS             = BIT(20),
 +      ATH9K_HW_CAP_WOW_MATCHPATTERN_EXACT     = BIT(21),
 +      ATH9K_HW_CAP_BT_COEX                    = BIT(22)
  };
  
 -#define AR5416_OPFLAGS_11A           0x01
 -#define AR5416_OPFLAGS_11G           0x02
 -#define AR5416_OPFLAGS_N_5G_HT40     0x04
 -#define AR5416_OPFLAGS_N_2G_HT40     0x08
 -#define AR5416_OPFLAGS_N_5G_HT20     0x10
 -#define AR5416_OPFLAGS_N_2G_HT20     0x20
 -
 -#define EEP_RFSILENT_ENABLED        0x0001
 -#define EEP_RFSILENT_ENABLED_S      0
 -#define EEP_RFSILENT_POLARITY       0x0002
 -#define EEP_RFSILENT_POLARITY_S     1
 -#define EEP_RFSILENT_GPIO_SEL       0x001c
 -#define EEP_RFSILENT_GPIO_SEL_S     2
 -
 -#define AR5416_EEP_NO_BACK_VER       0x1
 -#define AR5416_EEP_VER               0xE
 -#define AR5416_EEP_VER_MINOR_MASK    0x0FFF
 -#define AR5416_EEP_MINOR_VER_2       0x2
 -#define AR5416_EEP_MINOR_VER_3       0x3
 -#define AR5416_EEP_MINOR_VER_7       0x7
 -#define AR5416_EEP_MINOR_VER_9       0x9
 -#define AR5416_EEP_MINOR_VER_16      0x10
 -#define AR5416_EEP_MINOR_VER_17      0x11
 -#define AR5416_EEP_MINOR_VER_19      0x13
 -
 -#define AR5416_NUM_5G_CAL_PIERS         8
 -#define AR5416_NUM_2G_CAL_PIERS         4
 -#define AR5416_NUM_5G_20_TARGET_POWERS  8
 -#define AR5416_NUM_5G_40_TARGET_POWERS  8
 -#define AR5416_NUM_2G_CCK_TARGET_POWERS 3
 -#define AR5416_NUM_2G_20_TARGET_POWERS  4
 -#define AR5416_NUM_2G_40_TARGET_POWERS  4
 -#define AR5416_NUM_CTLS                 24
 -#define AR5416_NUM_BAND_EDGES           8
 -#define AR5416_NUM_PD_GAINS             4
 -#define AR5416_PD_GAINS_IN_MASK         4
 -#define AR5416_PD_GAIN_ICEPTS           5
 -#define AR5416_EEPROM_MODAL_SPURS       5
 -#define AR5416_MAX_RATE_POWER           63
 -#define AR5416_NUM_PDADC_VALUES         128
 -#define AR5416_BCHAN_UNUSED             0xFF
 -#define AR5416_MAX_PWR_RANGE_IN_HALF_DB 64
 -#define AR5416_MAX_CHAINS               3
 -#define AR5416_PWR_TABLE_OFFSET         -5
 -
 -/* Rx gain type values */
 -#define AR5416_EEP_RXGAIN_23DB_BACKOFF     0
 -#define AR5416_EEP_RXGAIN_13DB_BACKOFF     1
 -#define AR5416_EEP_RXGAIN_ORIG             2
 -
 -/* Tx gain type values */
 -#define AR5416_EEP_TXGAIN_ORIGINAL         0
 -#define AR5416_EEP_TXGAIN_HIGH_POWER       1
 -
 -#define AR5416_EEP4K_START_LOC         64
 -#define AR5416_EEP4K_NUM_2G_CAL_PIERS      3
 -#define AR5416_EEP4K_NUM_2G_CCK_TARGET_POWERS 3
 -#define AR5416_EEP4K_NUM_2G_20_TARGET_POWERS  3
 -#define AR5416_EEP4K_NUM_2G_40_TARGET_POWERS  3
 -#define AR5416_EEP4K_NUM_CTLS              12
 -#define AR5416_EEP4K_NUM_BAND_EDGES        4
 -#define AR5416_EEP4K_NUM_PD_GAINS          2
 -#define AR5416_EEP4K_PD_GAINS_IN_MASK      4
 -#define AR5416_EEP4K_PD_GAIN_ICEPTS        5
 -#define AR5416_EEP4K_MAX_CHAINS            1
 -
 -enum eeprom_param {
 -      EEP_NFTHRESH_5,
 -      EEP_NFTHRESH_2,
 -      EEP_MAC_MSW,
 -      EEP_MAC_MID,
 -      EEP_MAC_LSW,
 -      EEP_REG_0,
 -      EEP_REG_1,
 -      EEP_OP_CAP,
 -      EEP_OP_MODE,
 -      EEP_RF_SILENT,
 -      EEP_OB_5,
 -      EEP_DB_5,
 -      EEP_OB_2,
 -      EEP_DB_2,
 -      EEP_MINOR_REV,
 -      EEP_TX_MASK,
 -      EEP_RX_MASK,
 -      EEP_RXGAIN_TYPE,
 -      EEP_TXGAIN_TYPE,
 +enum ath9k_capability_type {
 +      ATH9K_CAP_CIPHER = 0,
 +      ATH9K_CAP_TKIP_MIC,
 +      ATH9K_CAP_TKIP_SPLIT,
 +      ATH9K_CAP_DIVERSITY,
 +      ATH9K_CAP_TXPOW,
 +      ATH9K_CAP_MCAST_KEYSRCH,
 +      ATH9K_CAP_DS
  };
  
 -enum ar5416_rates {
 -      rate6mb, rate9mb, rate12mb, rate18mb,
 -      rate24mb, rate36mb, rate48mb, rate54mb,
 -      rate1l, rate2l, rate2s, rate5_5l,
 -      rate5_5s, rate11l, rate11s, rateXr,
 -      rateHt20_0, rateHt20_1, rateHt20_2, rateHt20_3,
 -      rateHt20_4, rateHt20_5, rateHt20_6, rateHt20_7,
 -      rateHt40_0, rateHt40_1, rateHt40_2, rateHt40_3,
 -      rateHt40_4, rateHt40_5, rateHt40_6, rateHt40_7,
 -      rateDupCck, rateDupOfdm, rateExtCck, rateExtOfdm,
 -      Ar5416RateSize
 +struct ath9k_hw_capabilities {
 +      u32 hw_caps; /* ATH9K_HW_CAP_* from ath9k_hw_caps */
 +      DECLARE_BITMAP(wireless_modes, ATH9K_MODE_MAX); /* ATH9K_MODE_* */
 +      u16 total_queues;
 +      u16 keycache_size;
 +      u16 low_5ghz_chan, high_5ghz_chan;
 +      u16 low_2ghz_chan, high_2ghz_chan;
 +      u16 num_mr_retries;
 +      u16 rts_aggr_limit;
 +      u8 tx_chainmask;
 +      u8 rx_chainmask;
 +      u16 tx_triglevel_max;
 +      u16 reg_cap;
 +      u8 num_gpio_pins;
 +      u8 num_antcfg_2ghz;
 +      u8 num_antcfg_5ghz;
  };
  
 -enum ath9k_hal_freq_band {
 -      ATH9K_HAL_FREQ_BAND_5GHZ = 0,
 -      ATH9K_HAL_FREQ_BAND_2GHZ = 1
 +struct ath9k_ops_config {
 +      int dma_beacon_response_time;
 +      int sw_beacon_response_time;
 +      int additional_swba_backoff;
 +      int ack_6mb;
 +      int cwm_ignore_extcca;
 +      u8 pcie_powersave_enable;
 +      u8 pcie_l1skp_enable;
 +      u8 pcie_clock_req;
 +      u32 pcie_waen;
 +      int pcie_power_reset;
 +      u8 pcie_restore;
 +      u8 analog_shiftreg;
 +      u8 ht_enable;
 +      u32 ofdm_trig_low;
 +      u32 ofdm_trig_high;
 +      u32 cck_trig_high;
 +      u32 cck_trig_low;
 +      u32 enable_ani;
 +      u8 noise_immunity_level;
 +      u32 ofdm_weaksignal_det;
 +      u32 cck_weaksignal_thr;
 +      u8 spur_immunity_level;
 +      u8 firstep_level;
 +      int8_t rssi_thr_high;
 +      int8_t rssi_thr_low;
 +      u16 diversity_control;
 +      u16 antenna_switch_swap;
 +      int serialize_regmode;
 +      int intr_mitigation;
 +#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
 +#define AR_BASE_FREQ_2GHZ     2300
 +#define AR_BASE_FREQ_5GHZ     4900
 +#define AR_SPUR_FEEQ_BOUND_HT40 19
 +#define AR_SPUR_FEEQ_BOUND_HT20 10
 +      int spurmode;
 +      u16 spurchans[AR_EEPROM_MODAL_SPURS][2];
  };
  
 -struct base_eep_header {
 -      u16 length;
 -      u16 checksum;
 -      u16 version;
 -      u8 opCapFlags;
 -      u8 eepMisc;
 -      u16 regDmn[2];
 -      u8 macAddr[6];
 -      u8 rxMask;
 -      u8 txMask;
 -      u16 rfSilent;
 -      u16 blueToothOptions;
 -      u16 deviceCap;
 -      u32 binBuildNumber;
 -      u8 deviceType;
 -      u8 pwdclkind;
 -      u8 futureBase_1[2];
 -      u8 rxGainType;
 -      u8 futureBase_2[3];
 -      u8 txGainType;
 -      u8 futureBase_3[25];
 -} __packed;
 -
 -struct base_eep_header_4k {
 -      u16 length;
 -      u16 checksum;
 -      u16 version;
 -      u8 opCapFlags;
 -      u8 eepMisc;
 -      u16 regDmn[2];
 -      u8 macAddr[6];
 -      u8 rxMask;
 -      u8 txMask;
 -      u16 rfSilent;
 -      u16 blueToothOptions;
 -      u16 deviceCap;
 -      u32 binBuildNumber;
 -      u8 deviceType;
 -      u8 futureBase[1];
 -} __packed;
 -
 -
 -struct spur_chan {
 -      u16 spurChan;
 -      u8 spurRangeLow;
 -      u8 spurRangeHigh;
 -} __packed;
 -
 -struct modal_eep_header {
 -      u32 antCtrlChain[AR5416_MAX_CHAINS];
 -      u32 antCtrlCommon;
 -      u8 antennaGainCh[AR5416_MAX_CHAINS];
 -      u8 switchSettling;
 -      u8 txRxAttenCh[AR5416_MAX_CHAINS];
 -      u8 rxTxMarginCh[AR5416_MAX_CHAINS];
 -      u8 adcDesiredSize;
 -      u8 pgaDesiredSize;
 -      u8 xlnaGainCh[AR5416_MAX_CHAINS];
 -      u8 txEndToXpaOff;
 -      u8 txEndToRxOn;
 -      u8 txFrameToXpaOn;
 -      u8 thresh62;
 -      u8 noiseFloorThreshCh[AR5416_MAX_CHAINS];
 -      u8 xpdGain;
 -      u8 xpd;
 -      u8 iqCalICh[AR5416_MAX_CHAINS];
 -      u8 iqCalQCh[AR5416_MAX_CHAINS];
 -      u8 pdGainOverlap;
 -      u8 ob;
 -      u8 db;
 -      u8 xpaBiasLvl;
 -      u8 pwrDecreaseFor2Chain;
 -      u8 pwrDecreaseFor3Chain;
 -      u8 txFrameToDataStart;
 -      u8 txFrameToPaOn;
 -      u8 ht40PowerIncForPdadc;
 -      u8 bswAtten[AR5416_MAX_CHAINS];
 -      u8 bswMargin[AR5416_MAX_CHAINS];
 -      u8 swSettleHt40;
 -      u8 xatten2Db[AR5416_MAX_CHAINS];
 -      u8 xatten2Margin[AR5416_MAX_CHAINS];
 -      u8 ob_ch1;
 -      u8 db_ch1;
 -      u8 useAnt1:1,
 -          force_xpaon:1,
 -          local_bias:1,
 -          femBandSelectUsed:1, xlnabufin:1, xlnaisel:2, xlnabufmode:1;
 -      u8 futureModalar9280;
 -      u16 xpaBiasLvlFreq[3];
 -      u8 futureModal[6];
 -
 -      struct spur_chan spurChans[AR5416_EEPROM_MODAL_SPURS];
 -} __packed;
 -
 -struct modal_eep_4k_header {
 -    u32  antCtrlChain[AR5416_EEP4K_MAX_CHAINS];
 -    u32  antCtrlCommon;
 -    u8   antennaGainCh[AR5416_EEP4K_MAX_CHAINS];
 -    u8   switchSettling;
 -    u8   txRxAttenCh[AR5416_EEP4K_MAX_CHAINS];
 -    u8   rxTxMarginCh[AR5416_EEP4K_MAX_CHAINS];
 -    u8   adcDesiredSize;
 -    u8   pgaDesiredSize;
 -    u8   xlnaGainCh[AR5416_EEP4K_MAX_CHAINS];
 -    u8   txEndToXpaOff;
 -    u8   txEndToRxOn;
 -    u8   txFrameToXpaOn;
 -    u8   thresh62;
 -    u8   noiseFloorThreshCh[AR5416_EEP4K_MAX_CHAINS];
 -    u8   xpdGain;
 -    u8   xpd;
 -    u8   iqCalICh[AR5416_EEP4K_MAX_CHAINS];
 -    u8   iqCalQCh[AR5416_EEP4K_MAX_CHAINS];
 -    u8   pdGainOverlap;
 -    u8   ob_01;
 -    u8   db1_01;
 -    u8   xpaBiasLvl;
 -    u8   txFrameToDataStart;
 -    u8   txFrameToPaOn;
 -    u8   ht40PowerIncForPdadc;
 -    u8   bswAtten[AR5416_EEP4K_MAX_CHAINS];
 -    u8   bswMargin[AR5416_EEP4K_MAX_CHAINS];
 -    u8   swSettleHt40;
 -    u8   xatten2Db[AR5416_EEP4K_MAX_CHAINS];
 -    u8   xatten2Margin[AR5416_EEP4K_MAX_CHAINS];
 -    u8   db2_01;
 -    u8   version;
 -    u16  ob_234;
 -    u16  db1_234;
 -    u16  db2_234;
 -    u8   futureModal[4];
 -
 -    struct spur_chan spurChans[AR5416_EEPROM_MODAL_SPURS];
 -} __packed;
 -
 -
 -struct cal_data_per_freq {
 -      u8 pwrPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
 -      u8 vpdPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
 -} __packed;
 -
 -struct cal_data_per_freq_4k {
 -      u8 pwrPdg[AR5416_EEP4K_NUM_PD_GAINS][AR5416_EEP4K_PD_GAIN_ICEPTS];
 -      u8 vpdPdg[AR5416_EEP4K_NUM_PD_GAINS][AR5416_EEP4K_PD_GAIN_ICEPTS];
 -} __packed;
 -
 -struct cal_target_power_leg {
 -      u8 bChannel;
 -      u8 tPow2x[4];
 -} __packed;
 -
 -struct cal_target_power_ht {
 -      u8 bChannel;
 -      u8 tPow2x[8];
 -} __packed;
 -
 -
 -#ifdef __BIG_ENDIAN_BITFIELD
 -struct cal_ctl_edges {
 -      u8 bChannel;
 -      u8 flag:2, tPower:6;
 -} __packed;
 -#else
 -struct cal_ctl_edges {
 -      u8 bChannel;
 -      u8 tPower:6, flag:2;
 -} __packed;
 -#endif
 -
 -struct cal_ctl_data {
 -      struct cal_ctl_edges
 -      ctlEdges[AR5416_MAX_CHAINS][AR5416_NUM_BAND_EDGES];
 -} __packed;
 -
 -struct cal_ctl_data_4k {
 -      struct cal_ctl_edges
 -      ctlEdges[AR5416_EEP4K_MAX_CHAINS][AR5416_EEP4K_NUM_BAND_EDGES];
 -} __packed;
 -
 -struct ar5416_eeprom_def {
 -      struct base_eep_header baseEepHeader;
 -      u8 custData[64];
 -      struct modal_eep_header modalHeader[2];
 -      u8 calFreqPier5G[AR5416_NUM_5G_CAL_PIERS];
 -      u8 calFreqPier2G[AR5416_NUM_2G_CAL_PIERS];
 -      struct cal_data_per_freq
 -       calPierData5G[AR5416_MAX_CHAINS][AR5416_NUM_5G_CAL_PIERS];
 -      struct cal_data_per_freq
 -       calPierData2G[AR5416_MAX_CHAINS][AR5416_NUM_2G_CAL_PIERS];
 -      struct cal_target_power_leg
 -       calTargetPower5G[AR5416_NUM_5G_20_TARGET_POWERS];
 -      struct cal_target_power_ht
 -       calTargetPower5GHT20[AR5416_NUM_5G_20_TARGET_POWERS];
 -      struct cal_target_power_ht
 -       calTargetPower5GHT40[AR5416_NUM_5G_40_TARGET_POWERS];
 -      struct cal_target_power_leg
 -       calTargetPowerCck[AR5416_NUM_2G_CCK_TARGET_POWERS];
 -      struct cal_target_power_leg
 -       calTargetPower2G[AR5416_NUM_2G_20_TARGET_POWERS];
 -      struct cal_target_power_ht
 -       calTargetPower2GHT20[AR5416_NUM_2G_20_TARGET_POWERS];
 -      struct cal_target_power_ht
 -       calTargetPower2GHT40[AR5416_NUM_2G_40_TARGET_POWERS];
 -      u8 ctlIndex[AR5416_NUM_CTLS];
 -      struct cal_ctl_data ctlData[AR5416_NUM_CTLS];
 -      u8 padding;
 -} __packed;
 -
 -struct ar5416_eeprom_4k {
 -      struct base_eep_header_4k baseEepHeader;
 -      u8 custData[20];
 -      struct modal_eep_4k_header modalHeader;
 -      u8 calFreqPier2G[AR5416_EEP4K_NUM_2G_CAL_PIERS];
 -      struct cal_data_per_freq_4k
 -      calPierData2G[AR5416_EEP4K_MAX_CHAINS][AR5416_EEP4K_NUM_2G_CAL_PIERS];
 -      struct cal_target_power_leg
 -      calTargetPowerCck[AR5416_EEP4K_NUM_2G_CCK_TARGET_POWERS];
 -      struct cal_target_power_leg
 -      calTargetPower2G[AR5416_EEP4K_NUM_2G_20_TARGET_POWERS];
 -      struct cal_target_power_ht
 -      calTargetPower2GHT20[AR5416_EEP4K_NUM_2G_20_TARGET_POWERS];
 -      struct cal_target_power_ht
 -      calTargetPower2GHT40[AR5416_EEP4K_NUM_2G_40_TARGET_POWERS];
 -      u8 ctlIndex[AR5416_EEP4K_NUM_CTLS];
 -      struct cal_ctl_data_4k ctlData[AR5416_EEP4K_NUM_CTLS];
 -      u8 padding;
 -} __packed;
 -
 -struct ar5416IniArray {
 -      u32 *ia_array;
 -      u32 ia_rows;
 -      u32 ia_columns;
 +enum ath9k_int {
 +      ATH9K_INT_RX = 0x00000001,
 +      ATH9K_INT_RXDESC = 0x00000002,
 +      ATH9K_INT_RXNOFRM = 0x00000008,
 +      ATH9K_INT_RXEOL = 0x00000010,
 +      ATH9K_INT_RXORN = 0x00000020,
 +      ATH9K_INT_TX = 0x00000040,
 +      ATH9K_INT_TXDESC = 0x00000080,
 +      ATH9K_INT_TIM_TIMER = 0x00000100,
 +      ATH9K_INT_TXURN = 0x00000800,
 +      ATH9K_INT_MIB = 0x00001000,
 +      ATH9K_INT_RXPHY = 0x00004000,
 +      ATH9K_INT_RXKCM = 0x00008000,
 +      ATH9K_INT_SWBA = 0x00010000,
 +      ATH9K_INT_BMISS = 0x00040000,
 +      ATH9K_INT_BNR = 0x00100000,
 +      ATH9K_INT_TIM = 0x00200000,
 +      ATH9K_INT_DTIM = 0x00400000,
 +      ATH9K_INT_DTIMSYNC = 0x00800000,
 +      ATH9K_INT_GPIO = 0x01000000,
 +      ATH9K_INT_CABEND = 0x02000000,
 +      ATH9K_INT_TSFOOR = 0x04000000,
 +      ATH9K_INT_CST = 0x10000000,
 +      ATH9K_INT_GTT = 0x20000000,
 +      ATH9K_INT_FATAL = 0x40000000,
 +      ATH9K_INT_GLOBAL = 0x80000000,
 +      ATH9K_INT_BMISC = ATH9K_INT_TIM |
 +              ATH9K_INT_DTIM |
 +              ATH9K_INT_DTIMSYNC |
 +              ATH9K_INT_TSFOOR |
 +              ATH9K_INT_CABEND,
 +      ATH9K_INT_COMMON = ATH9K_INT_RXNOFRM |
 +              ATH9K_INT_RXDESC |
 +              ATH9K_INT_RXEOL |
 +              ATH9K_INT_RXORN |
 +              ATH9K_INT_TXURN |
 +              ATH9K_INT_TXDESC |
 +              ATH9K_INT_MIB |
 +              ATH9K_INT_RXPHY |
 +              ATH9K_INT_RXKCM |
 +              ATH9K_INT_SWBA |
 +              ATH9K_INT_BMISS |
 +              ATH9K_INT_GPIO,
 +      ATH9K_INT_NOCARD = 0xffffffff
  };
  
 -#define INIT_INI_ARRAY(iniarray, array, rows, columns) do {   \
 -              (iniarray)->ia_array = (u32 *)(array);          \
 -              (iniarray)->ia_rows = (rows);                   \
 -              (iniarray)->ia_columns = (columns);             \
 -      } while (0)
 -
 -#define INI_RA(iniarray, row, column) \
 -      (((iniarray)->ia_array)[(row) * ((iniarray)->ia_columns) + (column)])
 +#define CHANNEL_CW_INT    0x00002
 +#define CHANNEL_CCK       0x00020
 +#define CHANNEL_OFDM      0x00040
 +#define CHANNEL_2GHZ      0x00080
 +#define CHANNEL_5GHZ      0x00100
 +#define CHANNEL_PASSIVE   0x00200
 +#define CHANNEL_DYN       0x00400
 +#define CHANNEL_HALF      0x04000
 +#define CHANNEL_QUARTER   0x08000
 +#define CHANNEL_HT20      0x10000
 +#define CHANNEL_HT40PLUS  0x20000
 +#define CHANNEL_HT40MINUS 0x40000
 +
 +#define CHANNEL_INTERFERENCE    0x01
 +#define CHANNEL_DFS             0x02
 +#define CHANNEL_4MS_LIMIT       0x04
 +#define CHANNEL_DFS_CLEAR       0x08
 +#define CHANNEL_DISALLOW_ADHOC  0x10
 +#define CHANNEL_PER_11D_ADHOC   0x20
 +
 +#define CHANNEL_A           (CHANNEL_5GHZ|CHANNEL_OFDM)
 +#define CHANNEL_B           (CHANNEL_2GHZ|CHANNEL_CCK)
 +#define CHANNEL_G           (CHANNEL_2GHZ|CHANNEL_OFDM)
 +#define CHANNEL_G_HT20      (CHANNEL_2GHZ|CHANNEL_HT20)
 +#define CHANNEL_A_HT20      (CHANNEL_5GHZ|CHANNEL_HT20)
 +#define CHANNEL_G_HT40PLUS  (CHANNEL_2GHZ|CHANNEL_HT40PLUS)
 +#define CHANNEL_G_HT40MINUS (CHANNEL_2GHZ|CHANNEL_HT40MINUS)
 +#define CHANNEL_A_HT40PLUS  (CHANNEL_5GHZ|CHANNEL_HT40PLUS)
 +#define CHANNEL_A_HT40MINUS (CHANNEL_5GHZ|CHANNEL_HT40MINUS)
 +#define CHANNEL_ALL                           \
 +      (CHANNEL_OFDM|                          \
 +       CHANNEL_CCK|                           \
 +       CHANNEL_2GHZ |                         \
 +       CHANNEL_5GHZ |                         \
 +       CHANNEL_HT20 |                         \
 +       CHANNEL_HT40PLUS |                     \
 +       CHANNEL_HT40MINUS)
 +
 +struct ath9k_channel {
 +      struct ieee80211_channel *chan;
 +      u16 channel;
 +      u32 channelFlags;
 +      u32 chanmode;
 +      int32_t CalValid;
 +      bool oneTimeCalsDone;
 +      int8_t iCoff;
 +      int8_t qCoff;
 +      int16_t rawNoiseFloor;
 +};
  
 -#define INIT_CAL(_perCal) do {                                \
 -              (_perCal)->calState = CAL_WAITING;      \
 -              (_perCal)->calNext = NULL;              \
 -      } while (0)
 +#define IS_CHAN_A(_c) ((((_c)->channelFlags & CHANNEL_A) == CHANNEL_A) || \
 +       (((_c)->channelFlags & CHANNEL_A_HT20) == CHANNEL_A_HT20) || \
 +       (((_c)->channelFlags & CHANNEL_A_HT40PLUS) == CHANNEL_A_HT40PLUS) || \
 +       (((_c)->channelFlags & CHANNEL_A_HT40MINUS) == CHANNEL_A_HT40MINUS))
 +#define IS_CHAN_G(_c) ((((_c)->channelFlags & (CHANNEL_G)) == CHANNEL_G) || \
 +       (((_c)->channelFlags & CHANNEL_G_HT20) == CHANNEL_G_HT20) || \
 +       (((_c)->channelFlags & CHANNEL_G_HT40PLUS) == CHANNEL_G_HT40PLUS) || \
 +       (((_c)->channelFlags & CHANNEL_G_HT40MINUS) == CHANNEL_G_HT40MINUS))
 +#define IS_CHAN_OFDM(_c) (((_c)->channelFlags & CHANNEL_OFDM) != 0)
 +#define IS_CHAN_5GHZ(_c) (((_c)->channelFlags & CHANNEL_5GHZ) != 0)
 +#define IS_CHAN_2GHZ(_c) (((_c)->channelFlags & CHANNEL_2GHZ) != 0)
 +#define IS_CHAN_PASSIVE(_c) (((_c)->channelFlags & CHANNEL_PASSIVE) != 0)
 +#define IS_CHAN_HALF_RATE(_c) (((_c)->channelFlags & CHANNEL_HALF) != 0)
 +#define IS_CHAN_QUARTER_RATE(_c) (((_c)->channelFlags & CHANNEL_QUARTER) != 0)
 +#define IS_CHAN_A_5MHZ_SPACED(_c)                     \
 +      ((((_c)->channelFlags & CHANNEL_5GHZ) != 0) &&  \
 +       (((_c)->channel % 20) != 0) &&                 \
 +       (((_c)->channel % 10) != 0))
 +
 +/* These macros check chanmode and not channelFlags */
 +#define IS_CHAN_B(_c) ((_c)->chanmode == CHANNEL_B)
 +#define IS_CHAN_HT20(_c) (((_c)->chanmode == CHANNEL_A_HT20) ||       \
 +                        ((_c)->chanmode == CHANNEL_G_HT20))
 +#define IS_CHAN_HT40(_c) (((_c)->chanmode == CHANNEL_A_HT40PLUS) ||   \
 +                        ((_c)->chanmode == CHANNEL_A_HT40MINUS) ||    \
 +                        ((_c)->chanmode == CHANNEL_G_HT40PLUS) ||     \
 +                        ((_c)->chanmode == CHANNEL_G_HT40MINUS))
 +#define IS_CHAN_HT(_c) (IS_CHAN_HT20((_c)) || IS_CHAN_HT40((_c)))
 +
 +enum ath9k_power_mode {
 +      ATH9K_PM_AWAKE = 0,
 +      ATH9K_PM_FULL_SLEEP,
 +      ATH9K_PM_NETWORK_SLEEP,
 +      ATH9K_PM_UNDEFINED
 +};
  
 -#define INSERT_CAL(_ahp, _perCal)                                     \
 -      do {                                                            \
 -              if ((_ahp)->ah_cal_list_last == NULL) {                 \
 -                      (_ahp)->ah_cal_list =                           \
 -                              (_ahp)->ah_cal_list_last = (_perCal);   \
 -                      ((_ahp)->ah_cal_list_last)->calNext = (_perCal); \
 -              } else {                                                \
 -                      ((_ahp)->ah_cal_list_last)->calNext = (_perCal); \
 -                      (_ahp)->ah_cal_list_last = (_perCal);           \
 -                      (_perCal)->calNext = (_ahp)->ah_cal_list;       \
 -              }                                                       \
 -      } while (0)
 +enum ath9k_ant_setting {
 +      ATH9K_ANT_VARIABLE = 0,
 +      ATH9K_ANT_FIXED_A,
 +      ATH9K_ANT_FIXED_B
 +};
  
 -enum hal_cal_types {
 -      ADC_DC_INIT_CAL = 0x1,
 -      ADC_GAIN_CAL = 0x2,
 -      ADC_DC_CAL = 0x4,
 -      IQ_MISMATCH_CAL = 0x8
 +enum ath9k_tp_scale {
 +      ATH9K_TP_SCALE_MAX = 0,
 +      ATH9K_TP_SCALE_50,
 +      ATH9K_TP_SCALE_25,
 +      ATH9K_TP_SCALE_12,
 +      ATH9K_TP_SCALE_MIN
  };
  
 -enum hal_cal_state {
 -      CAL_INACTIVE,
 -      CAL_WAITING,
 -      CAL_RUNNING,
 -      CAL_DONE
 +enum ser_reg_mode {
 +      SER_REG_MODE_OFF = 0,
 +      SER_REG_MODE_ON = 1,
 +      SER_REG_MODE_AUTO = 2,
  };
  
 -#define MIN_CAL_SAMPLES     1
 -#define MAX_CAL_SAMPLES    64
 -#define INIT_LOG_COUNT      5
 -#define PER_MIN_LOG_COUNT   2
 -#define PER_MAX_LOG_COUNT  10
 +struct ath9k_beacon_state {
 +      u32 bs_nexttbtt;
 +      u32 bs_nextdtim;
 +      u32 bs_intval;
 +#define ATH9K_BEACON_PERIOD       0x0000ffff
 +#define ATH9K_BEACON_ENA          0x00800000
 +#define ATH9K_BEACON_RESET_TSF    0x01000000
 +#define ATH9K_TSFOOR_THRESHOLD    0x00004240 /* 16k us */
 +      u32 bs_dtimperiod;
 +      u16 bs_cfpperiod;
 +      u16 bs_cfpmaxduration;
 +      u32 bs_cfpnext;
 +      u16 bs_timoffset;
 +      u16 bs_bmissthreshold;
 +      u32 bs_sleepduration;
 +      u32 bs_tsfoor_threshold;
 +};
  
 -struct hal_percal_data {
 -      enum hal_cal_types calType;
 -      u32 calNumSamples;
 -      u32 calCountMax;
 -      void (*calCollect) (struct ath_hal *);
 -      void (*calPostProc) (struct ath_hal *, u8);
 +struct chan_centers {
 +      u16 synth_center;
 +      u16 ctl_center;
 +      u16 ext_center;
  };
  
 -struct hal_cal_list {
 -      const struct hal_percal_data *calData;
 -      enum hal_cal_state calState;
 -      struct hal_cal_list *calNext;
 +enum {
 +      ATH9K_RESET_POWER_ON,
 +      ATH9K_RESET_WARM,
 +      ATH9K_RESET_COLD,
  };
  
 -/*
 - * Enum to indentify the eeprom mappings
 - */
 -enum hal_eep_map {
 -      EEP_MAP_DEFAULT = 0x0,
 -      EEP_MAP_4KBITS,
 -      EEP_MAP_MAX
 +struct ath9k_hw_version {
 +      u32 magic;
 +      u16 devid;
 +      u16 subvendorid;
 +      u32 macVersion;
 +      u16 macRev;
 +      u16 phyRev;
 +      u16 analog5GhzRev;
 +      u16 analog2GhzRev;
  };
  
 +struct ath_hw {
 +      struct ath_softc *ah_sc;
 +      struct ath9k_hw_version hw_version;
 +      struct ath9k_ops_config config;
 +      struct ath9k_hw_capabilities caps;
 +      struct ath9k_regulatory regulatory;
 +      struct ath9k_channel channels[38];
 +      struct ath9k_channel *curchan;
  
 -struct ath_hal_5416 {
 -      struct ath_hal ah;
        union {
                struct ar5416_eeprom_def def;
                struct ar5416_eeprom_4k map4k;
index f473fee72a2e49666b0011ae714e55c68ac9953c,3c04044a60bdffe5441c610436fafcf3ff9d4646..a9715f5b0af6f05712a9ed0fd88a29db875e7bf2
@@@ -1368,11 -1335,11 +1368,12 @@@ static int ath_init(u16 devid, struct a
        if (ath9k_init_debug(sc) < 0)
                printk(KERN_ERR "Unable to create debugfs files\n");
  
 +      spin_lock_init(&sc->wiphy_lock);
        spin_lock_init(&sc->sc_resetlock);
+       spin_lock_init(&sc->sc_serial_rw);
        mutex_init(&sc->mutex);
        tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
 -      tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet,
 +      tasklet_init(&sc->bcon_tasklet, ath_beacon_tasklet,
                     (unsigned long)sc);
  
        /*
diff --cc net/core/dev.c
Simple merge
Simple merge
Simple merge