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.1/sys/dev/iwn/if_iwnvar.h 264945 2014-04-25 21:42:52Z marius $      */
    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         struct resource         *mem;
  298         bus_space_tag_t         sc_st;
  299         bus_space_handle_t      sc_sh;
  300         struct resource         *irq;
  301         void                    *sc_ih;
  302         bus_size_t              sc_sz;
  303         int                     sc_cap_off;     /* PCIe Capabilities. */
  304 
  305         /* Tasks used by the driver */
  306         struct task             sc_reinit_task;
  307         struct task             sc_radioon_task;
  308         struct task             sc_radiooff_task;
  309 
  310         struct callout          calib_to;
  311         int                     calib_cnt;
  312         struct iwn_calib_state  calib;
  313         struct callout          watchdog_to;
  314         struct callout          ct_kill_exit_to;
  315         struct iwn_fw_info      fw;
  316         struct iwn_calib_info   calibcmd[5];
  317         uint32_t                errptr;
  318 
  319         struct iwn_rx_stat      last_rx_stat;
  320         int                     last_rx_valid;
  321         struct iwn_ucode_info   ucode_info;
  322         struct iwn_rxon         rx_on[IWN_NUM_RXON_CTX];
  323         struct iwn_rxon         *rxon;
  324         int                     ctx;
  325         struct ieee80211vap     *ivap[IWN_NUM_RXON_CTX];
  326 
  327         uint8_t                 uc_scan_progress;
  328         uint32_t                rawtemp;
  329         int                     temp;
  330         int                     noise;
  331         uint32_t                qfullmsk;
  332 
  333         uint32_t                prom_base;
  334         struct iwn4965_eeprom_band
  335                                 bands[IWN_NBANDS];
  336         struct iwn_eeprom_chan  eeprom_channels[IWN_NBANDS][IWN_MAX_CHAN_PER_BAND];
  337         uint16_t                rfcfg;
  338         uint8_t                 calib_ver;
  339         char                    eeprom_domain[4];
  340         uint32_t                eeprom_crystal;
  341         int16_t                 eeprom_temp;
  342         int16_t                 eeprom_temp_high;
  343         int16_t                 eeprom_voltage;
  344         int8_t                  maxpwr2GHz;
  345         int8_t                  maxpwr5GHz;
  346         int8_t                  maxpwr[IEEE80211_CHAN_MAX];
  347 
  348         uint32_t                tlv_feature_flags;
  349 
  350         int32_t                 temp_off;
  351         uint32_t                int_mask;
  352         uint8_t                 ntxchains;
  353         uint8_t                 nrxchains;
  354         uint8_t                 txchainmask;
  355         uint8_t                 rxchainmask;
  356         uint8_t                 chainmask;
  357 
  358         int                     sc_tx_timer;
  359         int                     sc_scan_timer;
  360 
  361         struct ieee80211_tx_ampdu *qid2tap[IWN5000_NTXQUEUES];
  362 
  363         int                     (*sc_ampdu_rx_start)(struct ieee80211_node *,
  364                                     struct ieee80211_rx_ampdu *, int, int, int);
  365         void                    (*sc_ampdu_rx_stop)(struct ieee80211_node *,
  366                                     struct ieee80211_rx_ampdu *);
  367         int                     (*sc_addba_request)(struct ieee80211_node *,
  368                                     struct ieee80211_tx_ampdu *, int, int, int);
  369         int                     (*sc_addba_response)(struct ieee80211_node *,
  370                                     struct ieee80211_tx_ampdu *, int, int, int);
  371         void                    (*sc_addba_stop)(struct ieee80211_node *,
  372                                     struct ieee80211_tx_ampdu *);
  373 
  374         struct  iwn_led_mode sc_led;
  375 
  376         struct iwn_rx_radiotap_header sc_rxtap;
  377         struct iwn_tx_radiotap_header sc_txtap;
  378 
  379         /* The power save level originally configured by user */
  380         int                     desired_pwrsave_level;
  381 
  382         /*
  383          * The current power save level, this may differ from the
  384          * configured value due to thermal throttling etc.
  385          */
  386         int                     current_pwrsave_level;
  387 
  388         /* For specifique params */
  389         struct iwn_base_params *base_params;
  390 };
  391 
  392 #define IWN_LOCK_INIT(_sc) \
  393         mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
  394             MTX_NETWORK_LOCK, MTX_DEF)
  395 #define IWN_LOCK(_sc)                   mtx_lock(&(_sc)->sc_mtx)
  396 #define IWN_LOCK_ASSERT(_sc)            mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
  397 #define IWN_UNLOCK(_sc)                 mtx_unlock(&(_sc)->sc_mtx)
  398 #define IWN_LOCK_DESTROY(_sc)           mtx_destroy(&(_sc)->sc_mtx)

Cache object: cc26e8d07058ede246e90b42426ea4d6


[ 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.