The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/iwn/if_iwnvar.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $FreeBSD: releng/10.0/sys/dev/iwn/if_iwnvar.h 254204 2013-08-11 01:57:54Z adrian $      */
    2 /*      $OpenBSD: if_iwnvar.h,v 1.18 2010/04/30 16:06:46 damien Exp $   */
    3 
    4 /*-
    5  * Copyright (c) 2013 Cedric GROSS <cg@cgross.info>
    6  * Copyright (c) 2011 Intel Corporation
    7  * Copyright (c) 2007, 2008
    8  *      Damien Bergamini <damien.bergamini@free.fr>
    9  * Copyright (c) 2008 Sam Leffler, Errno Consulting
   10  *
   11  * Permission to use, copy, modify, and distribute this software for any
   12  * purpose with or without fee is hereby granted, provided that the above
   13  * copyright notice and this permission notice appear in all copies.
   14  *
   15  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   16  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   17  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   18  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   19  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   20  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   21  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   22  */
   23 enum iwn_rxon_ctx_id {
   24                 IWN_RXON_BSS_CTX,
   25                 IWN_RXON_PAN_CTX,
   26                 IWN_NUM_RXON_CTX
   27 };
   28 
   29 struct iwn_pan_slot {
   30         uint16_t        time;
   31         uint8_t         type;
   32         uint8_t         reserved;
   33 } __packed;
   34 
   35 struct iwn_pan_params_cmd {
   36         uint16_t flags;
   37 #define IWN_PAN_PARAMS_FLG_SLOTTED_MODE (1 << 3)
   38 
   39         uint8_t reserved;
   40         uint8_t num_slots;
   41         struct iwn_pan_slot slots[10];
   42 } __packed;
   43 
   44 struct iwn_led_mode
   45 {
   46         uint8_t         led_cur_mode;
   47         uint64_t        led_cur_bt;
   48         uint64_t        led_last_bt;
   49         uint64_t        led_cur_tpt;
   50         uint64_t        led_last_tpt;
   51         uint64_t        led_bt_diff;
   52         int             led_cur_time;
   53         int             led_last_time;
   54 };
   55 
   56 struct iwn_rx_radiotap_header {
   57         struct ieee80211_radiotap_header wr_ihdr;
   58         uint64_t        wr_tsft;
   59         uint8_t         wr_flags;
   60         uint8_t         wr_rate;
   61         uint16_t        wr_chan_freq;
   62         uint16_t        wr_chan_flags;
   63         int8_t          wr_dbm_antsignal;
   64         int8_t          wr_dbm_antnoise;
   65 } __packed;
   66 
   67 #define IWN_RX_RADIOTAP_PRESENT                                         \
   68         ((1 << IEEE80211_RADIOTAP_TSFT) |                               \
   69          (1 << IEEE80211_RADIOTAP_FLAGS) |                              \
   70          (1 << IEEE80211_RADIOTAP_RATE) |                               \
   71          (1 << IEEE80211_RADIOTAP_CHANNEL) |                            \
   72          (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |                      \
   73          (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
   74 
   75 struct iwn_tx_radiotap_header {
   76         struct ieee80211_radiotap_header wt_ihdr;
   77         uint8_t         wt_flags;
   78         uint8_t         wt_rate;
   79         uint16_t        wt_chan_freq;
   80         uint16_t        wt_chan_flags;
   81 } __packed;
   82 
   83 #define IWN_TX_RADIOTAP_PRESENT                                         \
   84         ((1 << IEEE80211_RADIOTAP_FLAGS) |                              \
   85          (1 << IEEE80211_RADIOTAP_RATE) |                               \
   86          (1 << IEEE80211_RADIOTAP_CHANNEL))
   87 
   88 struct iwn_dma_info {
   89         bus_dma_tag_t           tag;
   90         bus_dmamap_t            map;
   91         bus_dma_segment_t       seg;
   92         bus_addr_t              paddr;
   93         caddr_t                 vaddr;
   94         bus_size_t              size;
   95 };
   96 
   97 struct iwn_tx_data {
   98         bus_dmamap_t            map;
   99         bus_addr_t              cmd_paddr;
  100         bus_addr_t              scratch_paddr;
  101         struct mbuf             *m;
  102         struct ieee80211_node   *ni;
  103 };
  104 
  105 struct iwn_tx_ring {
  106         struct iwn_dma_info     desc_dma;
  107         struct iwn_dma_info     cmd_dma;
  108         struct iwn_tx_desc      *desc;
  109         struct iwn_tx_cmd       *cmd;
  110         struct iwn_tx_data      data[IWN_TX_RING_COUNT];
  111         bus_dma_tag_t           data_dmat;
  112         int                     qid;
  113         int                     queued;
  114         int                     cur;
  115         int                     read;
  116 };
  117 
  118 struct iwn_softc;
  119 
  120 struct iwn_rx_data {
  121         struct mbuf     *m;
  122         bus_dmamap_t    map;
  123 };
  124 
  125 struct iwn_rx_ring {
  126         struct iwn_dma_info     desc_dma;
  127         struct iwn_dma_info     stat_dma;
  128         uint32_t                *desc;
  129         struct iwn_rx_status    *stat;
  130         struct iwn_rx_data      data[IWN_RX_RING_COUNT];
  131         bus_dma_tag_t           data_dmat;
  132         int                     cur;
  133 };
  134 
  135 struct iwn_node {
  136         struct  ieee80211_node          ni;     /* must be the first */
  137         uint16_t                        disable_tid;
  138         uint8_t                         id;
  139         struct {
  140                 uint64_t                bitmap;
  141                 int                     startidx;
  142                 int                     nframes;
  143         } agg[IEEE80211_TID_SIZE];
  144 };
  145 
  146 struct iwn_calib_state {
  147         uint8_t         state;
  148 #define IWN_CALIB_STATE_INIT    0
  149 #define IWN_CALIB_STATE_ASSOC   1
  150 #define IWN_CALIB_STATE_RUN     2
  151 
  152         u_int           nbeacons;
  153         uint32_t        noise[3];
  154         uint32_t        rssi[3];
  155         uint32_t        ofdm_x1;
  156         uint32_t        ofdm_mrc_x1;
  157         uint32_t        ofdm_x4;
  158         uint32_t        ofdm_mrc_x4;
  159         uint32_t        cck_x4;
  160         uint32_t        cck_mrc_x4;
  161         uint32_t        bad_plcp_ofdm;
  162         uint32_t        fa_ofdm;
  163         uint32_t        bad_plcp_cck;
  164         uint32_t        fa_cck;
  165         uint32_t        low_fa;
  166         uint8_t         cck_state;
  167 #define IWN_CCK_STATE_INIT      0
  168 #define IWN_CCK_STATE_LOFA      1
  169 #define IWN_CCK_STATE_HIFA      2
  170 
  171         uint8_t         noise_samples[20];
  172         u_int           cur_noise_sample;
  173         uint8_t         noise_ref;
  174         uint32_t        energy_samples[10];
  175         u_int           cur_energy_sample;
  176         uint32_t        energy_cck;
  177 };
  178 
  179 struct iwn_calib_info {
  180         uint8_t         *buf;
  181         u_int           len;
  182 };
  183 
  184 struct iwn_fw_part {
  185         const uint8_t   *text;
  186         uint32_t        textsz;
  187         const uint8_t   *data;
  188         uint32_t        datasz;
  189 };
  190 
  191 struct iwn_fw_info {
  192         const uint8_t           *data;
  193         size_t                  size;
  194         struct iwn_fw_part      init;
  195         struct iwn_fw_part      main;
  196         struct iwn_fw_part      boot;
  197 };
  198 
  199 struct iwn_ops {
  200         int             (*load_firmware)(struct iwn_softc *);
  201         void            (*read_eeprom)(struct iwn_softc *);
  202         int             (*post_alive)(struct iwn_softc *);
  203         int             (*nic_config)(struct iwn_softc *);
  204         void            (*update_sched)(struct iwn_softc *, int, int, uint8_t,
  205                             uint16_t);
  206         int             (*get_temperature)(struct iwn_softc *);
  207         int             (*get_rssi)(struct iwn_softc *, struct iwn_rx_stat *);
  208         int             (*set_txpower)(struct iwn_softc *,
  209                             struct ieee80211_channel *, int);
  210         int             (*init_gains)(struct iwn_softc *);
  211         int             (*set_gains)(struct iwn_softc *);
  212         int             (*add_node)(struct iwn_softc *, struct iwn_node_info *,
  213                             int);
  214         void            (*tx_done)(struct iwn_softc *, struct iwn_rx_desc *,
  215                             struct iwn_rx_data *);
  216         void            (*ampdu_tx_start)(struct iwn_softc *,
  217                             struct ieee80211_node *, int, uint8_t, uint16_t);
  218         void            (*ampdu_tx_stop)(struct iwn_softc *, int, uint8_t,
  219                             uint16_t);
  220 };
  221 
  222 struct iwn_vap {
  223         struct ieee80211vap     iv_vap;
  224         uint8_t                 iv_ridx;
  225 
  226         int                     (*iv_newstate)(struct ieee80211vap *,
  227                                     enum ieee80211_state, int);
  228         int                     ctx;
  229         int                     beacon_int;
  230         uint8_t         macaddr[IEEE80211_ADDR_LEN];
  231 
  232 };
  233 #define IWN_VAP(_vap)   ((struct iwn_vap *)(_vap))
  234 
  235 struct iwn_softc {
  236         device_t                sc_dev;
  237 
  238         struct ifnet            *sc_ifp;
  239         int                     sc_debug;
  240 
  241         struct mtx              sc_mtx;
  242 
  243         u_int                   sc_flags;
  244 #define IWN_FLAG_HAS_OTPROM     (1 << 1)
  245 #define IWN_FLAG_CALIB_DONE     (1 << 2)
  246 #define IWN_FLAG_USE_ICT        (1 << 3)
  247 #define IWN_FLAG_INTERNAL_PA    (1 << 4)
  248 #define IWN_FLAG_HAS_11N        (1 << 6)
  249 #define IWN_FLAG_ENH_SENS       (1 << 7)
  250 #define IWN_FLAG_ADV_BTCOEX     (1 << 8)
  251 #define IWN_FLAG_PAN_SUPPORT    (1 << 9)
  252 
  253         uint8_t                 hw_type;
  254         /* subdevice_id used to adjust configuration */
  255         uint16_t                subdevice_id;
  256 
  257         struct iwn_ops          ops;
  258         const char              *fwname;
  259         const struct iwn_sensitivity_limits
  260                                 *limits;
  261         int                     ntxqs;
  262         int                     firstaggqueue;
  263         int                     ndmachnls;
  264         uint8_t                 broadcast_id;
  265         int                     rxonsz;
  266         int                     schedsz;
  267         uint32_t                fw_text_maxsz;
  268         uint32_t                fw_data_maxsz;
  269         uint32_t                fwsz;
  270         bus_size_t              sched_txfact_addr;
  271         uint32_t                reset_noise_gain;
  272         uint32_t                noise_gain;
  273 
  274         /* TX scheduler rings. */
  275         struct iwn_dma_info     sched_dma;
  276         uint16_t                *sched;
  277         uint32_t                sched_base;
  278 
  279         /* "Keep Warm" page. */
  280         struct iwn_dma_info     kw_dma;
  281 
  282         /* Firmware image. */
  283         const struct firmware   *fw_fp;
  284 
  285         /* Firmware DMA transfer. */
  286         struct iwn_dma_info     fw_dma;
  287 
  288         /* ICT table. */
  289         struct iwn_dma_info     ict_dma;
  290         uint32_t                *ict;
  291         int                     ict_cur;
  292 
  293         /* TX/RX rings. */
  294         struct iwn_tx_ring      txq[IWN5000_NTXQUEUES];
  295         struct iwn_rx_ring      rxq;
  296 
  297         int                     mem_rid;
  298         struct resource         *mem;
  299         bus_space_tag_t         sc_st;
  300         bus_space_handle_t      sc_sh;
  301         int                     irq_rid;
  302         struct resource         *irq;
  303         void                    *sc_ih;
  304         bus_size_t              sc_sz;
  305         int                     sc_cap_off;     /* PCIe Capabilities. */
  306 
  307         /* Tasks used by the driver */
  308         struct task             sc_reinit_task;
  309         struct task             sc_radioon_task;
  310         struct task             sc_radiooff_task;
  311 
  312         struct callout          calib_to;
  313         int                     calib_cnt;
  314         struct iwn_calib_state  calib;
  315         struct callout          watchdog_to;
  316         struct callout          ct_kill_exit_to;
  317         struct iwn_fw_info      fw;
  318         struct iwn_calib_info   calibcmd[5];
  319         uint32_t                errptr;
  320 
  321         struct iwn_rx_stat      last_rx_stat;
  322         int                     last_rx_valid;
  323         struct iwn_ucode_info   ucode_info;
  324         struct iwn_rxon         rx_on[IWN_NUM_RXON_CTX];
  325         struct iwn_rxon         *rxon;
  326         int                     ctx;
  327         struct ieee80211vap     *ivap[IWN_NUM_RXON_CTX];
  328 
  329         uint8_t                 uc_scan_progress;
  330         uint32_t                rawtemp;
  331         int                     temp;
  332         int                     noise;
  333         uint32_t                qfullmsk;
  334 
  335         uint32_t                prom_base;
  336         struct iwn4965_eeprom_band
  337                                 bands[IWN_NBANDS];
  338         struct iwn_eeprom_chan  eeprom_channels[IWN_NBANDS][IWN_MAX_CHAN_PER_BAND];
  339         uint16_t                rfcfg;
  340         uint8_t                 calib_ver;
  341         char                    eeprom_domain[4];
  342         uint32_t                eeprom_crystal;
  343         int16_t                 eeprom_temp;
  344         int16_t                 eeprom_temp_high;
  345         int16_t                 eeprom_voltage;
  346         int8_t                  maxpwr2GHz;
  347         int8_t                  maxpwr5GHz;
  348         int8_t                  maxpwr[IEEE80211_CHAN_MAX];
  349 
  350         uint32_t                tlv_feature_flags;
  351 
  352         int32_t                 temp_off;
  353         uint32_t                int_mask;
  354         uint8_t                 ntxchains;
  355         uint8_t                 nrxchains;
  356         uint8_t                 txchainmask;
  357         uint8_t                 rxchainmask;
  358         uint8_t                 chainmask;
  359 
  360         int                     sc_tx_timer;
  361         int                     sc_scan_timer;
  362 
  363         struct ieee80211_tx_ampdu *qid2tap[IWN5000_NTXQUEUES];
  364 
  365         int                     (*sc_ampdu_rx_start)(struct ieee80211_node *,
  366                                     struct ieee80211_rx_ampdu *, int, int, int);
  367         void                    (*sc_ampdu_rx_stop)(struct ieee80211_node *,
  368                                     struct ieee80211_rx_ampdu *);
  369         int                     (*sc_addba_request)(struct ieee80211_node *,
  370                                     struct ieee80211_tx_ampdu *, int, int, int);
  371         int                     (*sc_addba_response)(struct ieee80211_node *,
  372                                     struct ieee80211_tx_ampdu *, int, int, int);
  373         void                    (*sc_addba_stop)(struct ieee80211_node *,
  374                                     struct ieee80211_tx_ampdu *);
  375 
  376         struct  iwn_led_mode sc_led;
  377 
  378         struct iwn_rx_radiotap_header sc_rxtap;
  379         struct iwn_tx_radiotap_header sc_txtap;
  380 
  381         /* The power save level originally configured by user */
  382         int                     desired_pwrsave_level;
  383 
  384         /*
  385          * The current power save level, this may differ from the
  386          * configured value due to thermal throttling etc.
  387          */
  388         int                     current_pwrsave_level;
  389 
  390         /* For specifique params */
  391         struct iwn_base_params *base_params;
  392 };
  393 
  394 #define IWN_LOCK_INIT(_sc) \
  395         mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
  396             MTX_NETWORK_LOCK, MTX_DEF)
  397 #define IWN_LOCK(_sc)                   mtx_lock(&(_sc)->sc_mtx)
  398 #define IWN_LOCK_ASSERT(_sc)            mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
  399 #define IWN_UNLOCK(_sc)                 mtx_unlock(&(_sc)->sc_mtx)
  400 #define IWN_LOCK_DESTROY(_sc)           mtx_destroy(&(_sc)->sc_mtx)

Cache object: 4e2200c1cb162eb4b262652d9a24dd77


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.