linux/drivers/net/wireless/iwlwifi/iwl-dev.h
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of version 2 of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along with
  15 * this program; if not, write to the Free Software Foundation, Inc.,
  16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17 *
  18 * The full GNU General Public License is included in this distribution in the
  19 * file called LICENSE.
  20 *
  21 * Contact Information:
  22 *  Intel Linux Wireless <ilw@linux.intel.com>
  23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  24 *
  25 *****************************************************************************/
  26/*
  27 * Please use this file (iwl-dev.h) for driver implementation definitions.
  28 * Please use iwl-commands.h for uCode API definitions.
  29 * Please use iwl-4965-hw.h for hardware-related definitions.
  30 */
  31
  32#ifndef __iwl_dev_h__
  33#define __iwl_dev_h__
  34
  35#include <linux/pci.h> /* for struct pci_device_id */
  36#include <linux/kernel.h>
  37#include <net/ieee80211_radiotap.h>
  38
  39#include "iwl-eeprom.h"
  40#include "iwl-csr.h"
  41#include "iwl-prph.h"
  42#include "iwl-fh.h"
  43#include "iwl-debug.h"
  44#include "iwl-rfkill.h"
  45#include "iwl-4965-hw.h"
  46#include "iwl-3945-hw.h"
  47#include "iwl-3945-led.h"
  48#include "iwl-led.h"
  49#include "iwl-power.h"
  50#include "iwl-agn-rs.h"
  51
  52/* configuration for the iwl4965 */
  53extern struct iwl_cfg iwl4965_agn_cfg;
  54extern struct iwl_cfg iwl5300_agn_cfg;
  55extern struct iwl_cfg iwl5100_agn_cfg;
  56extern struct iwl_cfg iwl5350_agn_cfg;
  57extern struct iwl_cfg iwl5100_bg_cfg;
  58extern struct iwl_cfg iwl5100_abg_cfg;
  59extern struct iwl_cfg iwl5150_agn_cfg;
  60extern struct iwl_cfg iwl6000_2ag_cfg;
  61extern struct iwl_cfg iwl6000_2agn_cfg;
  62extern struct iwl_cfg iwl6000_3agn_cfg;
  63extern struct iwl_cfg iwl6050_2agn_cfg;
  64extern struct iwl_cfg iwl6050_3agn_cfg;
  65extern struct iwl_cfg iwl1000_bgn_cfg;
  66
  67/* shared structures from iwl-5000.c */
  68extern struct iwl_mod_params iwl50_mod_params;
  69extern struct iwl_ops iwl5000_ops;
  70extern struct iwl_lib_ops iwl5000_lib;
  71extern struct iwl_hcmd_ops iwl5000_hcmd;
  72extern struct iwl_hcmd_utils_ops iwl5000_hcmd_utils;
  73
  74/* shared functions from iwl-5000.c */
  75extern u16 iwl5000_get_hcmd_size(u8 cmd_id, u16 len);
  76extern u16 iwl5000_build_addsta_hcmd(const struct iwl_addsta_cmd *cmd,
  77                                     u8 *data);
  78extern void iwl5000_rts_tx_cmd_flag(struct ieee80211_tx_info *info,
  79                                    __le32 *tx_flags);
  80extern int iwl5000_calc_rssi(struct iwl_priv *priv,
  81                             struct iwl_rx_phy_res *rx_resp);
  82
  83/* CT-KILL constants */
  84#define CT_KILL_THRESHOLD       110 /* in Celsius */
  85
  86/* Default noise level to report when noise measurement is not available.
  87 *   This may be because we're:
  88 *   1)  Not associated (4965, no beacon statistics being sent to driver)
  89 *   2)  Scanning (noise measurement does not apply to associated channel)
  90 *   3)  Receiving CCK (3945 delivers noise info only for OFDM frames)
  91 * Use default noise value of -127 ... this is below the range of measurable
  92 *   Rx dBm for either 3945 or 4965, so it can indicate "unmeasurable" to user.
  93 *   Also, -127 works better than 0 when averaging frames with/without
  94 *   noise info (e.g. averaging might be done in app); measured dBm values are
  95 *   always negative ... using a negative value as the default keeps all
  96 *   averages within an s8's (used in some apps) range of negative values. */
  97#define IWL_NOISE_MEAS_NOT_AVAILABLE (-127)
  98
  99/*
 100 * RTS threshold here is total size [2347] minus 4 FCS bytes
 101 * Per spec:
 102 *   a value of 0 means RTS on all data/management packets
 103 *   a value > max MSDU size means no RTS
 104 * else RTS for data/management frames where MPDU is larger
 105 *   than RTS value.
 106 */
 107#define DEFAULT_RTS_THRESHOLD     2347U
 108#define MIN_RTS_THRESHOLD         0U
 109#define MAX_RTS_THRESHOLD         2347U
 110#define MAX_MSDU_SIZE             2304U
 111#define MAX_MPDU_SIZE             2346U
 112#define DEFAULT_BEACON_INTERVAL   100U
 113#define DEFAULT_SHORT_RETRY_LIMIT 7U
 114#define DEFAULT_LONG_RETRY_LIMIT  4U
 115
 116struct iwl_rx_mem_buffer {
 117        dma_addr_t real_dma_addr;
 118        dma_addr_t aligned_dma_addr;
 119        struct sk_buff *skb;
 120        struct list_head list;
 121};
 122
 123/*
 124 * Generic queue structure
 125 *
 126 * Contains common data for Rx and Tx queues
 127 */
 128struct iwl_queue {
 129        int n_bd;              /* number of BDs in this queue */
 130        int write_ptr;       /* 1-st empty entry (index) host_w*/
 131        int read_ptr;         /* last used entry (index) host_r*/
 132        dma_addr_t dma_addr;   /* physical addr for BD's */
 133        int n_window;          /* safe queue window */
 134        u32 id;
 135        int low_mark;          /* low watermark, resume queue if free
 136                                * space more than this */
 137        int high_mark;         /* high watermark, stop queue if free
 138                                * space less than this */
 139} __attribute__ ((packed));
 140
 141/* One for each TFD */
 142struct iwl_tx_info {
 143        struct sk_buff *skb[IWL_NUM_OF_TBS - 1];
 144};
 145
 146/**
 147 * struct iwl_tx_queue - Tx Queue for DMA
 148 * @q: generic Rx/Tx queue descriptor
 149 * @bd: base of circular buffer of TFDs
 150 * @cmd: array of command/Tx buffers
 151 * @dma_addr_cmd: physical address of cmd/tx buffer array
 152 * @txb: array of per-TFD driver data
 153 * @need_update: indicates need to update read/write index
 154 * @sched_retry: indicates queue is high-throughput aggregation (HT AGG) enabled
 155 *
 156 * A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame
 157 * descriptors) and required locking structures.
 158 */
 159#define TFD_TX_CMD_SLOTS 256
 160#define TFD_CMD_SLOTS 32
 161
 162struct iwl_tx_queue {
 163        struct iwl_queue q;
 164        void *tfds;
 165        struct iwl_cmd *cmd[TFD_TX_CMD_SLOTS];
 166        struct iwl_tx_info *txb;
 167        u8 need_update;
 168        u8 sched_retry;
 169        u8 active;
 170        u8 swq_id;
 171};
 172
 173#define IWL_NUM_SCAN_RATES         (2)
 174
 175struct iwl4965_channel_tgd_info {
 176        u8 type;
 177        s8 max_power;
 178};
 179
 180struct iwl4965_channel_tgh_info {
 181        s64 last_radar_time;
 182};
 183
 184#define IWL4965_MAX_RATE (33)
 185
 186struct iwl3945_clip_group {
 187        /* maximum power level to prevent clipping for each rate, derived by
 188         *   us from this band's saturation power in EEPROM */
 189        const s8 clip_powers[IWL_MAX_RATES];
 190};
 191
 192/* current Tx power values to use, one for each rate for each channel.
 193 * requested power is limited by:
 194 * -- regulatory EEPROM limits for this channel
 195 * -- hardware capabilities (clip-powers)
 196 * -- spectrum management
 197 * -- user preference (e.g. iwconfig)
 198 * when requested power is set, base power index must also be set. */
 199struct iwl3945_channel_power_info {
 200        struct iwl3945_tx_power tpc;    /* actual radio and DSP gain settings */
 201        s8 power_table_index;   /* actual (compenst'd) index into gain table */
 202        s8 base_power_index;    /* gain index for power at factory temp. */
 203        s8 requested_power;     /* power (dBm) requested for this chnl/rate */
 204};
 205
 206/* current scan Tx power values to use, one for each scan rate for each
 207 * channel. */
 208struct iwl3945_scan_power_info {
 209        struct iwl3945_tx_power tpc;    /* actual radio and DSP gain settings */
 210        s8 power_table_index;   /* actual (compenst'd) index into gain table */
 211        s8 requested_power;     /* scan pwr (dBm) requested for chnl/rate */
 212};
 213
 214/*
 215 * One for each channel, holds all channel setup data
 216 * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant
 217 *     with one another!
 218 */
 219struct iwl_channel_info {
 220        struct iwl4965_channel_tgd_info tgd;
 221        struct iwl4965_channel_tgh_info tgh;
 222        struct iwl_eeprom_channel eeprom;       /* EEPROM regulatory limit */
 223        struct iwl_eeprom_channel fat_eeprom;   /* EEPROM regulatory limit for
 224                                                 * FAT channel */
 225
 226        u8 channel;       /* channel number */
 227        u8 flags;         /* flags copied from EEPROM */
 228        s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */
 229        s8 curr_txpow;    /* (dBm) regulatory/spectrum/user (not h/w) limit */
 230        s8 min_power;     /* always 0 */
 231        s8 scan_power;    /* (dBm) regul. eeprom, direct scans, any rate */
 232
 233        u8 group_index;   /* 0-4, maps channel to group1/2/3/4/5 */
 234        u8 band_index;    /* 0-4, maps channel to band1/2/3/4/5 */
 235        enum ieee80211_band band;
 236
 237        /* FAT channel info */
 238        s8 fat_max_power_avg;   /* (dBm) regul. eeprom, normal Tx, any rate */
 239        s8 fat_curr_txpow;      /* (dBm) regulatory/spectrum/user (not h/w) */
 240        s8 fat_min_power;       /* always 0 */
 241        s8 fat_scan_power;      /* (dBm) eeprom, direct scans, any rate */
 242        u8 fat_flags;           /* flags copied from EEPROM */
 243        u8 fat_extension_channel; /* HT_IE_EXT_CHANNEL_* */
 244
 245        /* Radio/DSP gain settings for each "normal" data Tx rate.
 246         * These include, in addition to RF and DSP gain, a few fields for
 247         *   remembering/modifying gain settings (indexes). */
 248        struct iwl3945_channel_power_info power_info[IWL4965_MAX_RATE];
 249
 250        /* Radio/DSP gain settings for each scan rate, for directed scans. */
 251        struct iwl3945_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES];
 252};
 253
 254#define IWL_TX_FIFO_AC0 0
 255#define IWL_TX_FIFO_AC1 1
 256#define IWL_TX_FIFO_AC2 2
 257#define IWL_TX_FIFO_AC3 3
 258#define IWL_TX_FIFO_HCCA_1      5
 259#define IWL_TX_FIFO_HCCA_2      6
 260#define IWL_TX_FIFO_NONE        7
 261
 262/* Minimum number of queues. MAX_NUM is defined in hw specific files */
 263#define IWL_MIN_NUM_QUEUES      4
 264
 265/* Power management (not Tx power) structures */
 266
 267enum iwl_pwr_src {
 268        IWL_PWR_SRC_VMAIN,
 269        IWL_PWR_SRC_VAUX,
 270};
 271
 272#define IEEE80211_DATA_LEN              2304
 273#define IEEE80211_4ADDR_LEN             30
 274#define IEEE80211_HLEN                  (IEEE80211_4ADDR_LEN)
 275#define IEEE80211_FRAME_LEN             (IEEE80211_DATA_LEN + IEEE80211_HLEN)
 276
 277struct iwl_frame {
 278        union {
 279                struct ieee80211_hdr frame;
 280                struct iwl_tx_beacon_cmd beacon;
 281                u8 raw[IEEE80211_FRAME_LEN];
 282                u8 cmd[360];
 283        } u;
 284        struct list_head list;
 285};
 286
 287#define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
 288#define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
 289#define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4)
 290
 291enum {
 292        /* CMD_SIZE_NORMAL = 0, */
 293        CMD_SIZE_HUGE = (1 << 0),
 294        /* CMD_SYNC = 0, */
 295        CMD_ASYNC = (1 << 1),
 296        /* CMD_NO_SKB = 0, */
 297        CMD_WANT_SKB = (1 << 2),
 298};
 299
 300struct iwl_cmd;
 301struct iwl_priv;
 302
 303struct iwl_cmd_meta {
 304        struct iwl_cmd_meta *source;
 305        union {
 306                struct sk_buff *skb;
 307                int (*callback)(struct iwl_priv *priv,
 308                                struct iwl_cmd *cmd, struct sk_buff *skb);
 309        } __attribute__ ((packed)) u;
 310
 311        /* The CMD_SIZE_HUGE flag bit indicates that the command
 312         * structure is stored at the end of the shared queue memory. */
 313        u32 flags;
 314        DECLARE_PCI_UNMAP_ADDR(mapping)
 315        DECLARE_PCI_UNMAP_LEN(len)
 316} __attribute__ ((packed));
 317
 318#define IWL_CMD_MAX_PAYLOAD 320
 319
 320/**
 321 * struct iwl_cmd
 322 *
 323 * For allocation of the command and tx queues, this establishes the overall
 324 * size of the largest command we send to uCode, except for a scan command
 325 * (which is relatively huge; space is allocated separately).
 326 */
 327struct iwl_cmd {
 328        struct iwl_cmd_meta meta;       /* driver data */
 329        struct iwl_cmd_header hdr;      /* uCode API */
 330        union {
 331                u32 flags;
 332                u8 val8;
 333                u16 val16;
 334                u32 val32;
 335                struct iwl_tx_cmd tx;
 336                u8 payload[IWL_CMD_MAX_PAYLOAD];
 337        } __attribute__ ((packed)) cmd;
 338} __attribute__ ((packed));
 339
 340
 341struct iwl_host_cmd {
 342        u8 id;
 343        u16 len;
 344        struct iwl_cmd_meta meta;
 345        const void *data;
 346};
 347
 348#define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_cmd) - \
 349                              sizeof(struct iwl_cmd_meta))
 350
 351/*
 352 * RX related structures and functions
 353 */
 354#define RX_FREE_BUFFERS 64
 355#define RX_LOW_WATERMARK 8
 356
 357#define SUP_RATE_11A_MAX_NUM_CHANNELS  8
 358#define SUP_RATE_11B_MAX_NUM_CHANNELS  4
 359#define SUP_RATE_11G_MAX_NUM_CHANNELS  12
 360
 361/**
 362 * struct iwl_rx_queue - Rx queue
 363 * @bd: driver's pointer to buffer of receive buffer descriptors (rbd)
 364 * @dma_addr: bus address of buffer of receive buffer descriptors (rbd)
 365 * @read: Shared index to newest available Rx buffer
 366 * @write: Shared index to oldest written Rx packet
 367 * @free_count: Number of pre-allocated buffers in rx_free
 368 * @rx_free: list of free SKBs for use
 369 * @rx_used: List of Rx buffers with no SKB
 370 * @need_update: flag to indicate we need to update read/write index
 371 * @rb_stts: driver's pointer to receive buffer status
 372 * @rb_stts_dma: bus address of receive buffer status
 373 *
 374 * NOTE:  rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers
 375 */
 376struct iwl_rx_queue {
 377        __le32 *bd;
 378        dma_addr_t dma_addr;
 379        struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS];
 380        struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE];
 381        u32 read;
 382        u32 write;
 383        u32 free_count;
 384        struct list_head rx_free;
 385        struct list_head rx_used;
 386        int need_update;
 387        struct iwl_rb_status *rb_stts;
 388        dma_addr_t rb_stts_dma;
 389        spinlock_t lock;
 390};
 391
 392#define IWL_SUPPORTED_RATES_IE_LEN         8
 393
 394#define MAX_TID_COUNT        9
 395
 396#define IWL_INVALID_RATE     0xFF
 397#define IWL_INVALID_VALUE    -1
 398
 399/**
 400 * struct iwl_ht_agg -- aggregation status while waiting for block-ack
 401 * @txq_id: Tx queue used for Tx attempt
 402 * @frame_count: # frames attempted by Tx command
 403 * @wait_for_ba: Expect block-ack before next Tx reply
 404 * @start_idx: Index of 1st Transmit Frame Descriptor (TFD) in Tx window
 405 * @bitmap0: Low order bitmap, one bit for each frame pending ACK in Tx window
 406 * @bitmap1: High order, one bit for each frame pending ACK in Tx window
 407 * @rate_n_flags: Rate at which Tx was attempted
 408 *
 409 * If REPLY_TX indicates that aggregation was attempted, driver must wait
 410 * for block ack (REPLY_COMPRESSED_BA).  This struct stores tx reply info
 411 * until block ack arrives.
 412 */
 413struct iwl_ht_agg {
 414        u16 txq_id;
 415        u16 frame_count;
 416        u16 wait_for_ba;
 417        u16 start_idx;
 418        u64 bitmap;
 419        u32 rate_n_flags;
 420#define IWL_AGG_OFF 0
 421#define IWL_AGG_ON 1
 422#define IWL_EMPTYING_HW_QUEUE_ADDBA 2
 423#define IWL_EMPTYING_HW_QUEUE_DELBA 3
 424        u8 state;
 425};
 426
 427
 428struct iwl_tid_data {
 429        u16 seq_number;
 430        u16 tfds_in_queue;
 431        struct iwl_ht_agg agg;
 432};
 433
 434struct iwl_hw_key {
 435        enum ieee80211_key_alg alg;
 436        int keylen;
 437        u8 keyidx;
 438        u8 key[32];
 439};
 440
 441union iwl_ht_rate_supp {
 442        u16 rates;
 443        struct {
 444                u8 siso_rate;
 445                u8 mimo_rate;
 446        };
 447};
 448
 449#define CFG_HT_RX_AMPDU_FACTOR_DEF  (0x3)
 450#define CFG_HT_MPDU_DENSITY_2USEC   (0x5)
 451#define CFG_HT_MPDU_DENSITY_DEF CFG_HT_MPDU_DENSITY_2USEC
 452
 453struct iwl_ht_info {
 454        /* self configuration data */
 455        u8 is_ht;
 456        u8 supported_chan_width;
 457        u8 sm_ps;
 458        u8 is_green_field;
 459        u8 sgf;                 /* HT_SHORT_GI_* short guard interval */
 460        u8 max_amsdu_size;
 461        u8 ampdu_factor;
 462        u8 mpdu_density;
 463        struct ieee80211_mcs_info mcs;
 464        /* BSS related data */
 465        u8 extension_chan_offset;
 466        u8 tx_chan_width;
 467        u8 ht_protection;
 468        u8 non_GF_STA_present;
 469};
 470
 471union iwl_qos_capabity {
 472        struct {
 473                u8 edca_count:4;        /* bit 0-3 */
 474                u8 q_ack:1;             /* bit 4 */
 475                u8 queue_request:1;     /* bit 5 */
 476                u8 txop_request:1;      /* bit 6 */
 477                u8 reserved:1;          /* bit 7 */
 478        } q_AP;
 479        struct {
 480                u8 acvo_APSD:1;         /* bit 0 */
 481                u8 acvi_APSD:1;         /* bit 1 */
 482                u8 ac_bk_APSD:1;        /* bit 2 */
 483                u8 ac_be_APSD:1;        /* bit 3 */
 484                u8 q_ack:1;             /* bit 4 */
 485                u8 max_len:2;           /* bit 5-6 */
 486                u8 more_data_ack:1;     /* bit 7 */
 487        } q_STA;
 488        u8 val;
 489};
 490
 491/* QoS structures */
 492struct iwl_qos_info {
 493        int qos_active;
 494        union iwl_qos_capabity qos_cap;
 495        struct iwl_qosparam_cmd def_qos_parm;
 496};
 497
 498#define STA_PS_STATUS_WAKE             0
 499#define STA_PS_STATUS_SLEEP            1
 500
 501struct iwl3945_tid_data {
 502        u16 seq_number;
 503};
 504
 505struct iwl3945_hw_key {
 506        enum ieee80211_key_alg alg;
 507        int keylen;
 508        u8 key[32];
 509};
 510
 511struct iwl3945_station_entry {
 512        struct iwl3945_addsta_cmd sta;
 513        struct iwl3945_tid_data tid[MAX_TID_COUNT];
 514        u8 used;
 515        u8 ps_status;
 516        struct iwl3945_hw_key keyinfo;
 517};
 518
 519struct iwl_station_entry {
 520        struct iwl_addsta_cmd sta;
 521        struct iwl_tid_data tid[MAX_TID_COUNT];
 522        u8 used;
 523        u8 ps_status;
 524        struct iwl_hw_key keyinfo;
 525};
 526
 527/* one for each uCode image (inst/data, boot/init/runtime) */
 528struct fw_desc {
 529        void *v_addr;           /* access by driver */
 530        dma_addr_t p_addr;      /* access by card's busmaster DMA */
 531        u32 len;                /* bytes */
 532};
 533
 534/* uCode file layout */
 535struct iwl_ucode {
 536        __le32 ver;             /* major/minor/API/serial */
 537        __le32 inst_size;       /* bytes of runtime instructions */
 538        __le32 data_size;       /* bytes of runtime data */
 539        __le32 init_size;       /* bytes of initialization instructions */
 540        __le32 init_data_size;  /* bytes of initialization data */
 541        __le32 boot_size;       /* bytes of bootstrap instructions */
 542        u8 data[0];             /* data in same order as "size" elements */
 543};
 544
 545struct iwl4965_ibss_seq {
 546        u8 mac[ETH_ALEN];
 547        u16 seq_num;
 548        u16 frag_num;
 549        unsigned long packet_time;
 550        struct list_head list;
 551};
 552
 553struct iwl_sensitivity_ranges {
 554        u16 min_nrg_cck;
 555        u16 max_nrg_cck;
 556
 557        u16 nrg_th_cck;
 558        u16 nrg_th_ofdm;
 559
 560        u16 auto_corr_min_ofdm;
 561        u16 auto_corr_min_ofdm_mrc;
 562        u16 auto_corr_min_ofdm_x1;
 563        u16 auto_corr_min_ofdm_mrc_x1;
 564
 565        u16 auto_corr_max_ofdm;
 566        u16 auto_corr_max_ofdm_mrc;
 567        u16 auto_corr_max_ofdm_x1;
 568        u16 auto_corr_max_ofdm_mrc_x1;
 569
 570        u16 auto_corr_max_cck;
 571        u16 auto_corr_max_cck_mrc;
 572        u16 auto_corr_min_cck;
 573        u16 auto_corr_min_cck_mrc;
 574};
 575
 576
 577#define KELVIN_TO_CELSIUS(x) ((x)-273)
 578#define CELSIUS_TO_KELVIN(x) ((x)+273)
 579
 580
 581/**
 582 * struct iwl_hw_params
 583 * @max_txq_num: Max # Tx queues supported
 584 * @dma_chnl_num: Number of Tx DMA/FIFO channels
 585 * @scd_bc_tbls_size: size of scheduler byte count tables
 586 * @tfd_size: TFD size
 587 * @tx/rx_chains_num: Number of TX/RX chains
 588 * @valid_tx/rx_ant: usable antennas
 589 * @max_rxq_size: Max # Rx frames in Rx queue (must be power-of-2)
 590 * @max_rxq_log: Log-base-2 of max_rxq_size
 591 * @rx_buf_size: Rx buffer size
 592 * @rx_wrt_ptr_reg: FH{39}_RSCSR_CHNL0_WPTR
 593 * @max_stations:
 594 * @bcast_sta_id:
 595 * @fat_channel: is 40MHz width possible in band 2.4
 596 * BIT(IEEE80211_BAND_5GHZ) BIT(IEEE80211_BAND_5GHZ)
 597 * @sw_crypto: 0 for hw, 1 for sw
 598 * @max_xxx_size: for ucode uses
 599 * @ct_kill_threshold: temperature threshold
 600 * @calib_init_cfg: setup initial calibrations for the hw
 601 * @struct iwl_sensitivity_ranges: range of sensitivity values
 602 */
 603struct iwl_hw_params {
 604        u8 max_txq_num;
 605        u8 dma_chnl_num;
 606        u16 scd_bc_tbls_size;
 607        u32 tfd_size;
 608        u8  tx_chains_num;
 609        u8  rx_chains_num;
 610        u8  valid_tx_ant;
 611        u8  valid_rx_ant;
 612        u16 max_rxq_size;
 613        u16 max_rxq_log;
 614        u32 rx_buf_size;
 615        u32 rx_wrt_ptr_reg;
 616        u32 max_pkt_size;
 617        u8  max_stations;
 618        u8  bcast_sta_id;
 619        u8 fat_channel;
 620        u8 sw_crypto;
 621        u32 max_inst_size;
 622        u32 max_data_size;
 623        u32 max_bsm_size;
 624        u32 ct_kill_threshold; /* value in hw-dependent units */
 625        u32 calib_init_cfg;
 626        const struct iwl_sensitivity_ranges *sens;
 627};
 628
 629
 630/******************************************************************************
 631 *
 632 * Functions implemented in core module which are forward declared here
 633 * for use by iwl-[4-5].c
 634 *
 635 * NOTE:  The implementation of these functions are not hardware specific
 636 * which is why they are in the core module files.
 637 *
 638 * Naming convention --
 639 * iwl_         <-- Is part of iwlwifi
 640 * iwlXXXX_     <-- Hardware specific (implemented in iwl-XXXX.c for XXXX)
 641 * iwl4965_bg_      <-- Called from work queue context
 642 * iwl4965_mac_     <-- mac80211 callback
 643 *
 644 ****************************************************************************/
 645extern void iwl_update_chain_flags(struct iwl_priv *priv);
 646extern int iwl_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src);
 647extern const u8 iwl_bcast_addr[ETH_ALEN];
 648extern int iwl_rxq_stop(struct iwl_priv *priv);
 649extern void iwl_txq_ctx_stop(struct iwl_priv *priv);
 650extern int iwl_queue_space(const struct iwl_queue *q);
 651static inline int iwl_queue_used(const struct iwl_queue *q, int i)
 652{
 653        return q->write_ptr > q->read_ptr ?
 654                (i >= q->read_ptr && i < q->write_ptr) :
 655                !(i < q->read_ptr && i >= q->write_ptr);
 656}
 657
 658
 659static inline u8 get_cmd_index(struct iwl_queue *q, u32 index, int is_huge)
 660{
 661        /* This is for scan command, the big buffer at end of command array */
 662        if (is_huge)
 663                return q->n_window;     /* must be power of 2 */
 664
 665        /* Otherwise, use normal size buffers */
 666        return index & (q->n_window - 1);
 667}
 668
 669
 670struct iwl_dma_ptr {
 671        dma_addr_t dma;
 672        void *addr;
 673        size_t size;
 674};
 675
 676#define HT_SHORT_GI_20MHZ       (1 << 0)
 677#define HT_SHORT_GI_40MHZ       (1 << 1)
 678
 679#define IWL_CHANNEL_WIDTH_20MHZ   0
 680#define IWL_CHANNEL_WIDTH_40MHZ   1
 681
 682#define IWL_OPERATION_MODE_AUTO     0
 683#define IWL_OPERATION_MODE_HT_ONLY  1
 684#define IWL_OPERATION_MODE_MIXED    2
 685#define IWL_OPERATION_MODE_20MHZ    3
 686
 687#define IWL_TX_CRC_SIZE 4
 688#define IWL_TX_DELIMITER_SIZE 4
 689
 690#define TX_POWER_IWL_ILLEGAL_VOLTAGE -10000
 691
 692/* Sensitivity and chain noise calibration */
 693#define INITIALIZATION_VALUE            0xFFFF
 694#define CAL_NUM_OF_BEACONS              20
 695#define MAXIMUM_ALLOWED_PATHLOSS        15
 696
 697#define CHAIN_NOISE_MAX_DELTA_GAIN_CODE 3
 698
 699#define MAX_FA_OFDM  50
 700#define MIN_FA_OFDM  5
 701#define MAX_FA_CCK   50
 702#define MIN_FA_CCK   5
 703
 704#define AUTO_CORR_STEP_OFDM       1
 705
 706#define AUTO_CORR_STEP_CCK     3
 707#define AUTO_CORR_MAX_TH_CCK   160
 708
 709#define NRG_DIFF               2
 710#define NRG_STEP_CCK           2
 711#define NRG_MARGIN             8
 712#define MAX_NUMBER_CCK_NO_FA 100
 713
 714#define AUTO_CORR_CCK_MIN_VAL_DEF    (125)
 715
 716#define CHAIN_A             0
 717#define CHAIN_B             1
 718#define CHAIN_C             2
 719#define CHAIN_NOISE_DELTA_GAIN_INIT_VAL 4
 720#define ALL_BAND_FILTER                 0xFF00
 721#define IN_BAND_FILTER                  0xFF
 722#define MIN_AVERAGE_NOISE_MAX_VALUE     0xFFFFFFFF
 723
 724#define NRG_NUM_PREV_STAT_L     20
 725#define NUM_RX_CHAINS           3
 726
 727enum iwl4965_false_alarm_state {
 728        IWL_FA_TOO_MANY = 0,
 729        IWL_FA_TOO_FEW = 1,
 730        IWL_FA_GOOD_RANGE = 2,
 731};
 732
 733enum iwl4965_chain_noise_state {
 734        IWL_CHAIN_NOISE_ALIVE = 0,  /* must be 0 */
 735        IWL_CHAIN_NOISE_ACCUMULATE,
 736        IWL_CHAIN_NOISE_CALIBRATED,
 737        IWL_CHAIN_NOISE_DONE,
 738};
 739
 740enum iwl4965_calib_enabled_state {
 741        IWL_CALIB_DISABLED = 0,  /* must be 0 */
 742        IWL_CALIB_ENABLED = 1,
 743};
 744
 745
 746/*
 747 * enum iwl_calib
 748 * defines the order in which results of initial calibrations
 749 * should be sent to the runtime uCode
 750 */
 751enum iwl_calib {
 752        IWL_CALIB_XTAL,
 753        IWL_CALIB_DC,
 754        IWL_CALIB_LO,
 755        IWL_CALIB_TX_IQ,
 756        IWL_CALIB_TX_IQ_PERD,
 757        IWL_CALIB_BASE_BAND,
 758        IWL_CALIB_MAX
 759};
 760
 761/* Opaque calibration results */
 762struct iwl_calib_result {
 763        void *buf;
 764        size_t buf_len;
 765};
 766
 767enum ucode_type {
 768        UCODE_NONE = 0,
 769        UCODE_INIT,
 770        UCODE_RT
 771};
 772
 773/* Sensitivity calib data */
 774struct iwl_sensitivity_data {
 775        u32 auto_corr_ofdm;
 776        u32 auto_corr_ofdm_mrc;
 777        u32 auto_corr_ofdm_x1;
 778        u32 auto_corr_ofdm_mrc_x1;
 779        u32 auto_corr_cck;
 780        u32 auto_corr_cck_mrc;
 781
 782        u32 last_bad_plcp_cnt_ofdm;
 783        u32 last_fa_cnt_ofdm;
 784        u32 last_bad_plcp_cnt_cck;
 785        u32 last_fa_cnt_cck;
 786
 787        u32 nrg_curr_state;
 788        u32 nrg_prev_state;
 789        u32 nrg_value[10];
 790        u8  nrg_silence_rssi[NRG_NUM_PREV_STAT_L];
 791        u32 nrg_silence_ref;
 792        u32 nrg_energy_idx;
 793        u32 nrg_silence_idx;
 794        u32 nrg_th_cck;
 795        s32 nrg_auto_corr_silence_diff;
 796        u32 num_in_cck_no_fa;
 797        u32 nrg_th_ofdm;
 798};
 799
 800/* Chain noise (differential Rx gain) calib data */
 801struct iwl_chain_noise_data {
 802        u32 active_chains;
 803        u32 chain_noise_a;
 804        u32 chain_noise_b;
 805        u32 chain_noise_c;
 806        u32 chain_signal_a;
 807        u32 chain_signal_b;
 808        u32 chain_signal_c;
 809        u16 beacon_count;
 810        u8 disconn_array[NUM_RX_CHAINS];
 811        u8 delta_gain_code[NUM_RX_CHAINS];
 812        u8 radio_write;
 813        u8 state;
 814};
 815
 816#define EEPROM_SEM_TIMEOUT 10           /* milliseconds */
 817#define EEPROM_SEM_RETRY_LIMIT 1000     /* number of attempts (not time) */
 818
 819
 820enum {
 821        MEASUREMENT_READY = (1 << 0),
 822        MEASUREMENT_ACTIVE = (1 << 1),
 823};
 824
 825
 826#define IWL_MAX_NUM_QUEUES      20 /* FIXME: do dynamic allocation */
 827
 828struct iwl_priv {
 829
 830        /* ieee device used by generic ieee processing code */
 831        struct ieee80211_hw *hw;
 832        struct ieee80211_channel *ieee_channels;
 833        struct ieee80211_rate *ieee_rates;
 834        struct iwl_cfg *cfg;
 835
 836        /* temporary frame storage list */
 837        struct list_head free_frames;
 838        int frames_count;
 839
 840        enum ieee80211_band band;
 841        int alloc_rxb_skb;
 842
 843        void (*rx_handlers[REPLY_MAX])(struct iwl_priv *priv,
 844                                       struct iwl_rx_mem_buffer *rxb);
 845
 846        struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS];
 847
 848#if defined(CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT) || defined(CONFIG_IWL3945_SPECTRUM_MEASUREMENT)
 849        /* spectrum measurement report caching */
 850        struct iwl_spectrum_notification measure_report;
 851        u8 measurement_status;
 852#endif
 853        /* ucode beacon time */
 854        u32 ucode_beacon_time;
 855
 856        /* we allocate array of iwl4965_channel_info for NIC's valid channels.
 857         *    Access via channel # using indirect index array */
 858        struct iwl_channel_info *channel_info;  /* channel info array */
 859        u8 channel_count;       /* # of channels */
 860
 861        /* each calibration channel group in the EEPROM has a derived
 862         * clip setting for each rate. 3945 only.*/
 863        const struct iwl3945_clip_group clip39_groups[5];
 864
 865        /* thermal calibration */
 866        s32 temperature;        /* degrees Kelvin */
 867        s32 last_temperature;
 868
 869        /* init calibration results */
 870        struct iwl_calib_result calib_results[IWL_CALIB_MAX];
 871
 872        /* Scan related variables */
 873        unsigned long last_scan_jiffies;
 874        unsigned long next_scan_jiffies;
 875        unsigned long scan_start;
 876        unsigned long scan_pass_start;
 877        unsigned long scan_start_tsf;
 878        void *scan;
 879        int scan_bands;
 880        int one_direct_scan;
 881        u8 direct_ssid_len;
 882        u8 direct_ssid[IW_ESSID_MAX_SIZE];
 883        u8 scan_tx_ant[IEEE80211_NUM_BANDS];
 884        u8 mgmt_tx_ant;
 885
 886        /* spinlock */
 887        spinlock_t lock;        /* protect general shared data */
 888        spinlock_t hcmd_lock;   /* protect hcmd */
 889        struct mutex mutex;
 890
 891        /* basic pci-network driver stuff */
 892        struct pci_dev *pci_dev;
 893
 894        /* pci hardware address support */
 895        void __iomem *hw_base;
 896        u32  hw_rev;
 897        u32  hw_wa_rev;
 898        u8   rev_id;
 899
 900        /* uCode images, save to reload in case of failure */
 901        u32 ucode_ver;                  /* version of ucode, copy of
 902                                           iwl_ucode.ver */
 903        struct fw_desc ucode_code;      /* runtime inst */
 904        struct fw_desc ucode_data;      /* runtime data original */
 905        struct fw_desc ucode_data_backup;       /* runtime data save/restore */
 906        struct fw_desc ucode_init;      /* initialization inst */
 907        struct fw_desc ucode_init_data; /* initialization data */
 908        struct fw_desc ucode_boot;      /* bootstrap inst */
 909        enum ucode_type ucode_type;
 910        u8 ucode_write_complete;        /* the image write is complete */
 911
 912
 913        struct iwl_rxon_time_cmd rxon_timing;
 914
 915        /* We declare this const so it can only be
 916         * changed via explicit cast within the
 917         * routines that actually update the physical
 918         * hardware */
 919        const struct iwl_rxon_cmd active_rxon;
 920        struct iwl_rxon_cmd staging_rxon;
 921
 922        int error_recovering;
 923        struct iwl_rxon_cmd recovery_rxon;
 924
 925        /* 1st responses from initialize and runtime uCode images.
 926         * 4965's initialize alive response contains some calibration data. */
 927        struct iwl_init_alive_resp card_alive_init;
 928        struct iwl_alive_resp card_alive;
 929#if defined(CONFIG_IWLWIFI_RFKILL)
 930        struct rfkill *rfkill;
 931#endif
 932
 933#ifdef CONFIG_IWLWIFI_LEDS
 934        unsigned long last_blink_time;
 935        u8 last_blink_rate;
 936        u8 allow_blinking;
 937        u64 led_tpt;
 938        struct iwl_led led[IWL_LED_TRG_MAX];
 939        unsigned int rxtxpackets;
 940#endif
 941        u16 active_rate;
 942        u16 active_rate_basic;
 943
 944        u8 assoc_station_added;
 945        u8 start_calib;
 946        struct iwl_sensitivity_data sensitivity_data;
 947        struct iwl_chain_noise_data chain_noise_data;
 948        __le16 sensitivity_tbl[HD_TABLE_SIZE];
 949
 950        struct iwl_ht_info current_ht_config;
 951        u8 last_phy_res[100];
 952
 953        /* Rate scaling data */
 954        s8 data_retry_limit;
 955        u8 retry_rate;
 956
 957        wait_queue_head_t wait_command_queue;
 958
 959        int activity_timer_active;
 960
 961        /* Rx and Tx DMA processing queues */
 962        struct iwl_rx_queue rxq;
 963        struct iwl_tx_queue txq[IWL_MAX_NUM_QUEUES];
 964        unsigned long txq_ctx_active_msk;
 965        struct iwl_dma_ptr  kw; /* keep warm address */
 966        struct iwl_dma_ptr  scd_bc_tbls;
 967
 968        u32 scd_base_addr;      /* scheduler sram base address */
 969
 970        unsigned long status;
 971
 972        int last_rx_rssi;       /* From Rx packet statistics */
 973        int last_rx_noise;      /* From beacon statistics */
 974
 975        /* counts mgmt, ctl, and data packets */
 976        struct traffic_stats {
 977                u32 cnt;
 978                u64 bytes;
 979        } tx_stats[3], rx_stats[3];
 980
 981        struct iwl_power_mgr power_data;
 982
 983        struct iwl_notif_statistics statistics;
 984        unsigned long last_statistics_time;
 985
 986        /* context information */
 987        u16 rates_mask;
 988
 989        u32 power_mode;
 990        u8 bssid[ETH_ALEN];
 991        u16 rts_threshold;
 992        u8 mac_addr[ETH_ALEN];
 993
 994        /*station table variables */
 995        spinlock_t sta_lock;
 996        int num_stations;
 997        struct iwl_station_entry stations[IWL_STATION_COUNT];
 998        struct iwl_wep_key wep_keys[WEP_KEYS_MAX];
 999        u8 default_wep_key;
1000        u8 key_mapping_key;
1001        unsigned long ucode_key_table;
1002
1003        /* queue refcounts */
1004#define IWL_MAX_HW_QUEUES       32
1005        unsigned long queue_stopped[BITS_TO_LONGS(IWL_MAX_HW_QUEUES)];
1006        /* for each AC */
1007        atomic_t queue_stop_count[4];
1008
1009        /* Indication if ieee80211_ops->open has been called */
1010        u8 is_open;
1011
1012        u8 mac80211_registered;
1013
1014        /* Rx'd packet timing information */
1015        u32 last_beacon_time;
1016        u64 last_tsf;
1017
1018        /* eeprom */
1019        u8 *eeprom;
1020        struct iwl_eeprom_calib_info *calib_info;
1021
1022        enum nl80211_iftype iw_mode;
1023
1024        struct sk_buff *ibss_beacon;
1025
1026        /* Last Rx'd beacon timestamp */
1027        u64 timestamp;
1028        u16 beacon_int;
1029        struct ieee80211_vif *vif;
1030
1031        /*Added for 3945 */
1032        void *shared_virt;
1033        dma_addr_t shared_phys;
1034        /*End*/
1035        struct iwl_hw_params hw_params;
1036
1037
1038        /* Current association information needed to configure the
1039         * hardware */
1040        u16 assoc_id;
1041        u16 assoc_capability;
1042
1043        struct iwl_qos_info qos_data;
1044
1045        struct workqueue_struct *workqueue;
1046
1047        struct work_struct up;
1048        struct work_struct restart;
1049        struct work_struct calibrated_work;
1050        struct work_struct scan_completed;
1051        struct work_struct rx_replenish;
1052        struct work_struct rf_kill;
1053        struct work_struct abort_scan;
1054        struct work_struct update_link_led;
1055        struct work_struct auth_work;
1056        struct work_struct report_work;
1057        struct work_struct request_scan;
1058        struct work_struct beacon_update;
1059
1060        struct tasklet_struct irq_tasklet;
1061
1062        struct delayed_work set_power_save;
1063        struct delayed_work init_alive_start;
1064        struct delayed_work alive_start;
1065        struct delayed_work scan_check;
1066
1067        /*For 3945 only*/
1068        struct delayed_work thermal_periodic;
1069        struct delayed_work rfkill_poll;
1070
1071        /* TX Power */
1072        s8 tx_power_user_lmt;
1073        s8 tx_power_channel_lmt;
1074
1075
1076#ifdef CONFIG_IWLWIFI_DEBUG
1077        /* debugging info */
1078        u32 debug_level;
1079        u32 framecnt_to_us;
1080        atomic_t restrict_refcnt;
1081#ifdef CONFIG_IWLWIFI_DEBUGFS
1082        /* debugfs */
1083        struct iwl_debugfs *dbgfs;
1084#endif /* CONFIG_IWLWIFI_DEBUGFS */
1085#endif /* CONFIG_IWLWIFI_DEBUG */
1086
1087        struct work_struct txpower_work;
1088        u32 disable_sens_cal;
1089        u32 disable_chain_noise_cal;
1090        u32 disable_tx_power_cal;
1091        struct work_struct run_time_calib_work;
1092        struct timer_list statistics_periodic;
1093
1094        /*For 3945*/
1095#define IWL_DEFAULT_TX_POWER 0x0F
1096
1097        struct iwl3945_notif_statistics statistics_39;
1098
1099        struct iwl3945_station_entry stations_39[IWL_STATION_COUNT];
1100
1101        u32 sta_supp_rates;
1102}; /*iwl_priv */
1103
1104static inline void iwl_txq_ctx_activate(struct iwl_priv *priv, int txq_id)
1105{
1106        set_bit(txq_id, &priv->txq_ctx_active_msk);
1107}
1108
1109static inline void iwl_txq_ctx_deactivate(struct iwl_priv *priv, int txq_id)
1110{
1111        clear_bit(txq_id, &priv->txq_ctx_active_msk);
1112}
1113
1114#ifdef CONFIG_IWLWIFI_DEBUG
1115const char *iwl_get_tx_fail_reason(u32 status);
1116#else
1117static inline const char *iwl_get_tx_fail_reason(u32 status) { return ""; }
1118#endif
1119
1120
1121static inline struct ieee80211_hdr *iwl_tx_queue_get_hdr(struct iwl_priv *priv,
1122                                                         int txq_id, int idx)
1123{
1124        if (priv->txq[txq_id].txb[idx].skb[0])
1125                return (struct ieee80211_hdr *)priv->txq[txq_id].
1126                                txb[idx].skb[0]->data;
1127        return NULL;
1128}
1129
1130
1131static inline int iwl_is_associated(struct iwl_priv *priv)
1132{
1133        return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0;
1134}
1135
1136static inline int is_channel_valid(const struct iwl_channel_info *ch_info)
1137{
1138        if (ch_info == NULL)
1139                return 0;
1140        return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0;
1141}
1142
1143static inline int is_channel_radar(const struct iwl_channel_info *ch_info)
1144{
1145        return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0;
1146}
1147
1148static inline u8 is_channel_a_band(const struct iwl_channel_info *ch_info)
1149{
1150        return ch_info->band == IEEE80211_BAND_5GHZ;
1151}
1152
1153static inline u8 is_channel_bg_band(const struct iwl_channel_info *ch_info)
1154{
1155        return ch_info->band == IEEE80211_BAND_2GHZ;
1156}
1157
1158static inline int is_channel_passive(const struct iwl_channel_info *ch)
1159{
1160        return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0;
1161}
1162
1163static inline int is_channel_ibss(const struct iwl_channel_info *ch)
1164{
1165        return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0;
1166}
1167
1168#endif                          /* __iwl_dev_h__ */
1169
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.