iwlagn: reclaim the packets in transport layer
[deliverable/linux.git] / drivers / net / wireless / iwlwifi / iwl-dev.h
index 6c9790cac8d0b284b5c8870318349fd4b6d5f609..022cfc7389037a7f04f769541a81f28d1092c5e5 100644 (file)
@@ -50,6 +50,7 @@
 #include "iwl-agn-tt.h"
 #include "iwl-bus.h"
 #include "iwl-trans.h"
+#include "iwl-shared.h"
 
 #define DRV_NAME        "iwlagn"
 
@@ -90,14 +91,6 @@ struct iwl_tx_queue;
 #define        DEFAULT_SHORT_RETRY_LIMIT 7U
 #define        DEFAULT_LONG_RETRY_LIMIT  4U
 
-struct iwl_rx_mem_buffer {
-       dma_addr_t page_dma;
-       struct page *page;
-       struct list_head list;
-};
-
-#define rxb_addr(r) page_address(r->page)
-
 /* defined below */
 struct iwl_device_cmd;
 
@@ -173,6 +166,8 @@ struct iwl_tx_info {
  * @time_stamp: time (in jiffies) of last read_ptr change
  * @need_update: indicates need to update read/write index
  * @sched_retry: indicates queue is high-throughput aggregation (HT AGG) enabled
+ * @sta_id: valid if sched_retry is set
+ * @tid: valid if sched_retry is set
  *
  * A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame
  * descriptors) and required locking structures.
@@ -191,6 +186,9 @@ struct iwl_tx_queue {
        u8 sched_retry;
        u8 active;
        u8 swq_id;
+
+       u16 sta_id;
+       u16 tid;
 };
 
 #define IWL_NUM_SCAN_RATES         (2)
@@ -230,12 +228,23 @@ struct iwl_channel_info {
 #define IWL_TX_FIFO_BE_IPAN    4
 #define IWL_TX_FIFO_VI_IPAN    IWL_TX_FIFO_VI
 #define IWL_TX_FIFO_VO_IPAN    5
+/* re-uses the VO FIFO, uCode will properly flush/schedule */
+#define IWL_TX_FIFO_AUX                5
 #define IWL_TX_FIFO_UNUSED     -1
 
-/* Minimum number of queues. MAX_NUM is defined in hw specific files.
- * Set the minimum to accommodate the 4 standard TX queues, 1 command
- * queue, 2 (unused) HCCA queues, and 4 HT queues (one for each AC) */
-#define IWL_MIN_NUM_QUEUES     10
+/* AUX (TX during scan dwell) queue */
+#define IWL_AUX_QUEUE          10
+
+/*
+ * Minimum number of queues. MAX_NUM is defined in hw specific files.
+ * Set the minimum to accommodate
+ *  - 4 standard TX queues
+ *  - the command queue
+ *  - 4 PAN TX queues
+ *  - the PAN multicast queue, and
+ *  - the AUX (TX during scan dwell) queue.
+ */
+#define IWL_MIN_NUM_QUEUES     11
 
 /*
  * Command queue depends on iPAN support.
@@ -323,38 +332,6 @@ struct iwl_host_cmd {
 #define SUP_RATE_11B_MAX_NUM_CHANNELS  4
 #define SUP_RATE_11G_MAX_NUM_CHANNELS  12
 
-/**
- * struct iwl_rx_queue - Rx queue
- * @bd: driver's pointer to buffer of receive buffer descriptors (rbd)
- * @bd_dma: bus address of buffer of receive buffer descriptors (rbd)
- * @read: Shared index to newest available Rx buffer
- * @write: Shared index to oldest written Rx packet
- * @free_count: Number of pre-allocated buffers in rx_free
- * @rx_free: list of free SKBs for use
- * @rx_used: List of Rx buffers with no SKB
- * @need_update: flag to indicate we need to update read/write index
- * @rb_stts: driver's pointer to receive buffer status
- * @rb_stts_dma: bus address of receive buffer status
- *
- * NOTE:  rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers
- */
-struct iwl_rx_queue {
-       __le32 *bd;
-       dma_addr_t bd_dma;
-       struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS];
-       struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE];
-       u32 read;
-       u32 write;
-       u32 free_count;
-       u32 write_actual;
-       struct list_head rx_free;
-       struct list_head rx_used;
-       int need_update;
-       struct iwl_rb_status *rb_stts;
-       dma_addr_t rb_stts_dma;
-       spinlock_t lock;
-};
-
 #define IWL_SUPPORTED_RATES_IE_LEN         8
 
 #define MAX_TID_COUNT        9
@@ -564,11 +541,13 @@ enum iwl_ucode_tlv_type {
  * @IWL_UCODE_TLV_FLAGS_NEWSCAN: new uCode scan behaviour on hidden SSID,
  *     treats good CRC threshold as a boolean
  * @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
+ * @IWL_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P.
  */
 enum iwl_ucode_tlv_flag {
        IWL_UCODE_TLV_FLAGS_PAN         = BIT(0),
        IWL_UCODE_TLV_FLAGS_NEWSCAN     = BIT(1),
        IWL_UCODE_TLV_FLAGS_MFP         = BIT(2),
+       IWL_UCODE_TLV_FLAGS_P2P         = BIT(3),
 };
 
 struct iwl_ucode_tlv {
@@ -634,54 +613,6 @@ struct iwl_sensitivity_ranges {
 #define CELSIUS_TO_KELVIN(x) ((x)+273)
 
 
-/**
- * struct iwl_hw_params
- * @max_txq_num: Max # Tx queues supported
- * @scd_bc_tbls_size: size of scheduler byte count tables
- * @tfd_size: TFD size
- * @tx/rx_chains_num: Number of TX/RX chains
- * @valid_tx/rx_ant: usable antennas
- * @max_rxq_size: Max # Rx frames in Rx queue (must be power-of-2)
- * @max_rxq_log: Log-base-2 of max_rxq_size
- * @rx_page_order: Rx buffer page order
- * @rx_wrt_ptr_reg: FH{39}_RSCSR_CHNL0_WPTR
- * @max_stations:
- * @ht40_channel: is 40MHz width possible in band 2.4
- * BIT(IEEE80211_BAND_5GHZ) BIT(IEEE80211_BAND_5GHZ)
- * @sw_crypto: 0 for hw, 1 for sw
- * @max_xxx_size: for ucode uses
- * @ct_kill_threshold: temperature threshold
- * @beacon_time_tsf_bits: number of valid tsf bits for beacon time
- * @calib_init_cfg: setup initial calibrations for the hw
- * @calib_rt_cfg: setup runtime calibrations for the hw
- * @struct iwl_sensitivity_ranges: range of sensitivity values
- */
-struct iwl_hw_params {
-       u8 max_txq_num;
-       u16 scd_bc_tbls_size;
-       u32 tfd_size;
-       u8  tx_chains_num;
-       u8  rx_chains_num;
-       u8  valid_tx_ant;
-       u8  valid_rx_ant;
-       u16 max_rxq_size;
-       u16 max_rxq_log;
-       u32 rx_page_order;
-       u8  max_stations;
-       u8  ht40_channel;
-       u8  max_beacon_itrvl;   /* in 1024 ms */
-       u32 max_inst_size;
-       u32 max_data_size;
-       u32 ct_kill_threshold; /* value in hw-dependent units */
-       u32 ct_kill_exit_threshold; /* value in hw-dependent units */
-                                   /* for 1000, 6000 series and up */
-       u16 beacon_time_tsf_bits;
-       u32 calib_init_cfg;
-       u32 calib_rt_cfg;
-       const struct iwl_sensitivity_ranges *sens;
-};
-
-
 /******************************************************************************
  *
  * Functions implemented in core module which are forward declared here
@@ -884,22 +815,6 @@ enum iwl_pa_type {
        IWL_PA_INTERNAL = 1,
 };
 
-/* interrupt statistics */
-struct isr_statistics {
-       u32 hw;
-       u32 sw;
-       u32 err_code;
-       u32 sch;
-       u32 alive;
-       u32 rfkill;
-       u32 ctkill;
-       u32 wakeup;
-       u32 rx;
-       u32 rx_handlers[REPLY_MAX];
-       u32 tx;
-       u32 unhandled;
-};
-
 /* reply_tx_statistics (for _agn devices) */
 struct reply_tx_error_statistics {
        u32 pp_delay;
@@ -1168,7 +1083,7 @@ struct iwl_rxon_context {
 enum iwl_scan_type {
        IWL_SCAN_NORMAL,
        IWL_SCAN_RADIO_RESET,
-       IWL_SCAN_OFFCH_TX,
+       IWL_SCAN_ROC,
 };
 
 enum iwlagn_ucode_type {
@@ -1196,6 +1111,10 @@ struct iwl_testmode_trace {
 
 struct iwl_priv {
 
+       /*data shared among all the driver's layers */
+       struct iwl_shared _shrd;
+       struct iwl_shared *shrd;
+
        /* ieee device used by generic ieee processing code */
        struct ieee80211_hw *hw;
        struct ieee80211_channel *ieee_channels;
@@ -1225,6 +1144,9 @@ struct iwl_priv {
        /* jiffies when last recovery from statistics was performed */
        unsigned long rx_statistics_jiffies;
 
+       /*counters */
+       u32 rx_handlers_stats[REPLY_MAX];
+
        /* force reset */
        struct iwl_force_reset force_reset[IWL_MAX_FORCE_RESET];
 
@@ -1256,20 +1178,15 @@ struct iwl_priv {
        u8 mgmt_tx_ant;
 
        /* spinlock */
-       spinlock_t lock;        /* protect general shared data */
        spinlock_t hcmd_lock;   /* protect hcmd */
        spinlock_t reg_lock;    /* protect hw register access */
-       struct mutex mutex;
 
+       /*TODO: remove these pointers - use bus(priv) instead */
        struct iwl_bus *bus;    /* bus specific data */
-       struct iwl_trans trans;
 
        /* microcode/device supports multiple contexts */
        u8 valid_contexts;
 
-       /* command queue number */
-       u8 cmd_queue;
-
        /* max number of station keys */
        u8 sta_key_max_num;
 
@@ -1321,8 +1238,7 @@ struct iwl_priv {
 
        int activity_timer_active;
 
-       /* Rx and Tx DMA processing queues */
-       struct iwl_rx_queue rxq;
+       /* Tx DMA processing queues */
        struct iwl_tx_queue *txq;
        unsigned long txq_ctx_active_msk;
        struct iwl_dma_ptr  kw; /* keep warm address */
@@ -1330,22 +1246,14 @@ struct iwl_priv {
 
        u32 scd_base_addr;      /* scheduler sram base address */
 
-       unsigned long status;
-
        /* counts mgmt, ctl, and data packets */
        struct traffic_stats tx_stats;
        struct traffic_stats rx_stats;
 
-       /* counts interrupts */
-       struct isr_statistics isr_stats;
-
        struct iwl_power_mgr power_data;
        struct iwl_tt_mgmt thermal_throttle;
 
        /* station table variables */
-
-       /* Note: if lock and sta_lock are needed, lock must be acquired first */
-       spinlock_t sta_lock;
        int num_stations;
        struct iwl_station_entry stations[IWLAGN_STATION_COUNT];
        unsigned long ucode_key_table;
@@ -1361,8 +1269,6 @@ struct iwl_priv {
 
        u8 mac80211_registered;
 
-       bool wowlan;
-
        /* eeprom -- this is in the card's little endian byte order */
        u8 *eeprom;
        int    nvm_device_type;
@@ -1398,14 +1304,6 @@ struct iwl_priv {
        } accum_stats, delta_stats, max_delta_stats;
 #endif
 
-       /* INT ICT Table */
-       __le32 *ict_tbl;
-       void *ict_tbl_vir;
-       dma_addr_t ict_tbl_dma;
-       dma_addr_t aligned_ict_tbl_dma;
-       int ict_index;
-       u32 inta;
-       bool use_ict;
        /*
         * reporting the number of tids has AGG on. 0 means
         * no AGGREGATION
@@ -1438,15 +1336,11 @@ struct iwl_priv {
 
        /* remain-on-channel offload support */
        struct ieee80211_channel *hw_roc_channel;
-       struct delayed_work hw_roc_work;
+       struct delayed_work hw_roc_disable_work;
        enum nl80211_channel_type hw_roc_chantype;
        int hw_roc_duration;
        bool hw_roc_setup;
 
-       struct sk_buff *offchan_tx_skb;
-       int offchan_tx_timeout;
-       struct ieee80211_channel *offchan_tx_chan;
-
        /* bt coex */
        u8 bt_enable_flag;
        u8 bt_status;
@@ -1466,15 +1360,8 @@ struct iwl_priv {
        struct iwl_rxon_context *cur_rssi_ctx;
        bool bt_is_sco;
 
-       struct iwl_hw_params hw_params;
-
-       u32 inta_mask;
-
-       struct workqueue_struct *workqueue;
-
        struct work_struct restart;
        struct work_struct scan_completed;
-       struct work_struct rx_replenish;
        struct work_struct abort_scan;
 
        struct work_struct beacon_update;
@@ -1490,8 +1377,6 @@ struct iwl_priv {
        struct work_struct bt_full_concurrency;
        struct work_struct bt_runtime_config;
 
-       struct tasklet_struct irq_tasklet;
-
        struct delayed_work scan_check;
 
        /* TX Power */
@@ -1500,12 +1385,6 @@ struct iwl_priv {
        s8 tx_power_lmt_in_half_dbm; /* max tx power in half-dBm format */
        s8 tx_power_next;
 
-
-#ifdef CONFIG_IWLWIFI_DEBUG
-       /* debugging info */
-       u32 debug_level; /* per device debugging will override global
-                           iwl_debug_level if set */
-#endif /* CONFIG_IWLWIFI_DEBUG */
 #ifdef CONFIG_IWLWIFI_DEBUGFS
        /* debugfs */
        u16 tx_traffic_idx;
@@ -1553,28 +1432,7 @@ static inline void iwl_txq_ctx_deactivate(struct iwl_priv *priv, int txq_id)
        clear_bit(txq_id, &priv->txq_ctx_active_msk);
 }
 
-#ifdef CONFIG_IWLWIFI_DEBUG
-/*
- * iwl_get_debug_level: Return active debug level for device
- *
- * Using sysfs it is possible to set per device debug level. This debug
- * level will be used if set, otherwise the global debug level which can be
- * set via module parameter is used.
- */
-static inline u32 iwl_get_debug_level(struct iwl_priv *priv)
-{
-       if (priv->debug_level)
-               return priv->debug_level;
-       else
-               return iwl_debug_level;
-}
-#else
-static inline u32 iwl_get_debug_level(struct iwl_priv *priv)
-{
-       return iwl_debug_level;
-}
-#endif
-
+extern struct iwl_mod_params iwlagn_mod_params;
 
 static inline struct ieee80211_hdr *iwl_tx_queue_get_hdr(struct iwl_priv *priv,
                                                         int txq_id, int idx)
@@ -1652,11 +1510,11 @@ static inline int is_channel_ibss(const struct iwl_channel_info *ch)
 
 static inline void __iwl_free_pages(struct iwl_priv *priv, struct page *page)
 {
-       __free_pages(page, priv->hw_params.rx_page_order);
+       __free_pages(page, hw_params(priv).rx_page_order);
 }
 
 static inline void iwl_free_pages(struct iwl_priv *priv, unsigned long page)
 {
-       free_pages(page, priv->hw_params.rx_page_order);
+       free_pages(page, hw_params(priv).rx_page_order);
 }
 #endif                         /* __iwl_dev_h__ */
This page took 0.036471 seconds and 5 git commands to generate.