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/wpi/if_wpivar.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$       */
    2 
    3 /*-
    4  * Copyright (c) 2006,2007
    5  *      Damien Bergamini <damien.bergamini@free.fr>
    6  *
    7  * Permission to use, copy, modify, and distribute this software for any
    8  * purpose with or without fee is hereby granted, provided that the above
    9  * copyright notice and this permission notice appear in all copies.
   10  *
   11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   18  */
   19 struct wpi_rx_radiotap_header {
   20         struct ieee80211_radiotap_header wr_ihdr;
   21         uint64_t        wr_tsft;
   22         uint8_t         wr_flags;
   23         uint8_t         wr_rate;
   24         uint16_t        wr_chan_freq;
   25         uint16_t        wr_chan_flags;
   26         int8_t          wr_dbm_antsignal;
   27         int8_t          wr_dbm_antnoise;
   28         uint8_t         wr_antenna;
   29 } __packed __aligned(8);
   30 
   31 #define WPI_RX_RADIOTAP_PRESENT                                         \
   32         ((1 << IEEE80211_RADIOTAP_TSFT) |                               \
   33          (1 << IEEE80211_RADIOTAP_FLAGS) |                              \
   34          (1 << IEEE80211_RADIOTAP_RATE) |                               \
   35          (1 << IEEE80211_RADIOTAP_CHANNEL) |                            \
   36          (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |                      \
   37          (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) |                       \
   38          (1 << IEEE80211_RADIOTAP_ANTENNA))
   39 
   40 struct wpi_tx_radiotap_header {
   41         struct ieee80211_radiotap_header wt_ihdr;
   42         uint8_t         wt_flags;
   43         uint8_t         wt_rate;
   44         uint16_t        wt_chan_freq;
   45         uint16_t        wt_chan_flags;
   46 } __packed;
   47 
   48 #define WPI_TX_RADIOTAP_PRESENT                                         \
   49         ((1 << IEEE80211_RADIOTAP_FLAGS) |                              \
   50          (1 << IEEE80211_RADIOTAP_RATE) |                               \
   51          (1 << IEEE80211_RADIOTAP_CHANNEL))
   52 
   53 struct wpi_dma_info {
   54         bus_dma_tag_t           tag;
   55         bus_dmamap_t            map;
   56         bus_addr_t              paddr;
   57         caddr_t                 vaddr;
   58         bus_size_t              size;
   59 };
   60 
   61 struct wpi_tx_data {
   62         bus_dmamap_t            map;
   63         bus_addr_t              cmd_paddr;
   64         struct mbuf             *m;
   65         struct ieee80211_node   *ni;
   66         int                     hdrlen;
   67 };
   68 
   69 struct wpi_tx_ring {
   70         struct wpi_dma_info     desc_dma;
   71         struct wpi_dma_info     cmd_dma;
   72         struct wpi_tx_desc      *desc;
   73         struct wpi_tx_cmd       *cmd;
   74         struct wpi_tx_data      data[WPI_TX_RING_COUNT];
   75         bus_dma_tag_t           data_dmat;
   76         uint8_t                 qid;
   77         uint8_t                 cur;
   78         uint8_t                 pending;
   79         int16_t                 queued;
   80         int                     update:1;
   81 };
   82 
   83 struct wpi_rx_data {
   84         struct mbuf     *m;
   85         bus_dmamap_t    map;
   86 };
   87 
   88 struct wpi_rx_ring {
   89         struct wpi_dma_info     desc_dma;
   90         uint32_t                *desc;
   91         struct wpi_rx_data      data[WPI_RX_RING_COUNT];
   92         bus_dma_tag_t           data_dmat;
   93         uint16_t                cur;
   94         int                     update;
   95 };
   96 
   97 struct wpi_node {
   98         struct ieee80211_node   ni;     /* must be the first */
   99         uint8_t                 id;
  100 };
  101 #define WPI_NODE(ni)    ((struct wpi_node *)(ni))
  102 
  103 struct wpi_power_sample {
  104         uint8_t index;
  105         int8_t  power;
  106 };
  107 
  108 struct wpi_power_group {
  109 #define WPI_SAMPLES_COUNT       5
  110         struct wpi_power_sample samples[WPI_SAMPLES_COUNT];
  111         uint8_t chan;
  112         int8_t  maxpwr;
  113         int16_t temp;
  114 };
  115 
  116 struct wpi_buf {
  117         uint8_t                 data[56];  /* sizeof(struct wpi_cmd_beacon) */
  118         struct ieee80211_node   *ni;
  119         struct mbuf             *m;
  120         size_t                  size;
  121         uint8_t                 code;
  122         uint16_t                ac;
  123 };
  124 
  125 struct wpi_vap {
  126         struct ieee80211vap     wv_vap;
  127 
  128         struct wpi_buf          wv_bcbuf;
  129         struct mtx              wv_mtx;
  130 
  131         uint8_t                 wv_gtk;
  132 #define WPI_VAP_KEY(kid)        (1 << kid)
  133 
  134         int                     (*wv_newstate)(struct ieee80211vap *,
  135                                     enum ieee80211_state, int);
  136         void                    (*wv_recv_mgmt)(struct ieee80211_node *,
  137                                     struct mbuf *, int,
  138                                     const struct ieee80211_rx_stats *,
  139                                     int, int);
  140 };
  141 #define WPI_VAP(vap)    ((struct wpi_vap *)(vap))
  142 
  143 #define WPI_VAP_LOCK_INIT(_wvp) \
  144         mtx_init(&(_wvp)->wv_mtx, "lock for wv_bcbuf/wv_boff structures", \
  145             NULL, MTX_DEF)
  146 #define WPI_VAP_LOCK(_wvp)              mtx_lock(&(_wvp)->wv_mtx)
  147 #define WPI_VAP_UNLOCK(_wvp)            mtx_unlock(&(_wvp)->wv_mtx)
  148 #define WPI_VAP_LOCK_ASSERT(_wvp)       mtx_assert(&(_wvp)->wv_mtx, MA_OWNED)
  149 #define WPI_VAP_LOCK_DESTROY(_wvp)      mtx_destroy(&(_wvp)->wv_mtx)
  150 
  151 struct wpi_fw_part {
  152         const uint8_t   *text;
  153         uint32_t        textsz;
  154         const uint8_t   *data;
  155         uint32_t        datasz;
  156 };
  157 
  158 struct wpi_fw_info {
  159         const uint8_t           *data;
  160         size_t                  size;
  161         struct wpi_fw_part      init;
  162         struct wpi_fw_part      main;
  163         struct wpi_fw_part      boot;
  164 };
  165 
  166 struct wpi_softc {
  167         device_t                sc_dev;
  168         int                     sc_debug;
  169 
  170         int                     sc_running;
  171 
  172         struct mtx              sc_mtx;
  173         struct ieee80211com     sc_ic;
  174         struct ieee80211_ratectl_tx_status sc_txs;
  175 
  176         struct mtx              tx_mtx;
  177 
  178         /* Shared area. */
  179         struct wpi_dma_info     shared_dma;
  180         struct wpi_shared       *shared;
  181 
  182         struct wpi_tx_ring      txq[WPI_DRV_NTXQUEUES];
  183         struct mtx              txq_mtx;
  184         struct mtx              txq_state_mtx;
  185 
  186         struct wpi_rx_ring      rxq;
  187         uint64_t                rx_tstamp;
  188 
  189         /* TX Thermal Callibration. */
  190         struct callout          calib_to;
  191 
  192         struct callout          scan_timeout;
  193         struct callout          tx_timeout;
  194 
  195         /* Watch dog timer. */
  196         struct callout          watchdog_rfkill;
  197 
  198         /* Firmware image. */
  199         struct wpi_fw_info      fw;
  200         uint32_t                errptr;
  201 
  202         struct resource         *irq;
  203         struct resource         *mem;
  204         bus_space_tag_t         sc_st;
  205         bus_space_handle_t      sc_sh;
  206         void                    *sc_ih;
  207         bus_size_t              sc_sz;
  208         int                     sc_cap_off;     /* PCIe Capabilities. */
  209 
  210         struct wpi_rxon         rxon;
  211         struct mtx              rxon_mtx;
  212 
  213         int                     temp;
  214 
  215         uint32_t                nodesmsk;
  216         struct mtx              nt_mtx;
  217 
  218         void                    (*sc_node_free)(struct ieee80211_node *);
  219         void                    (*sc_update_rx_ring)(struct wpi_softc *);
  220         void                    (*sc_update_tx_ring)(struct wpi_softc *,
  221                                     struct wpi_tx_ring *);
  222 
  223         struct wpi_rx_radiotap_header   sc_rxtap;
  224         struct wpi_tx_radiotap_header   sc_txtap;
  225 
  226         /* Firmware image. */
  227         const struct firmware   *fw_fp;
  228 
  229         /* Firmware DMA transfer. */
  230         struct wpi_dma_info     fw_dma;
  231 
  232         /* Tasks used by the driver. */
  233         struct task             sc_radiooff_task;
  234         struct task             sc_radioon_task;
  235 
  236         /* Eeprom info. */
  237         uint8_t                 cap;
  238         uint16_t                rev;
  239         uint8_t                 type;
  240         struct wpi_eeprom_chan
  241             eeprom_channels[WPI_CHAN_BANDS_COUNT][WPI_MAX_CHAN_PER_BAND];
  242         struct wpi_power_group  groups[WPI_POWER_GROUPS_COUNT];
  243         int8_t                  maxpwr[IEEE80211_CHAN_MAX];
  244         char                    domain[4];      /* Regulatory domain. */
  245 };
  246 
  247 /*
  248  * Locking order:
  249  * 1. WPI_LOCK;
  250  * 2. WPI_RXON_LOCK;
  251  * 3. WPI_TX_LOCK;
  252  * 4. WPI_NT_LOCK / WPI_VAP_LOCK;
  253  * 5. WPI_TXQ_LOCK;
  254  * 6. WPI_TXQ_STATE_LOCK;
  255  */
  256 
  257 #define WPI_LOCK_INIT(_sc) \
  258         mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
  259             MTX_NETWORK_LOCK, MTX_DEF)
  260 #define WPI_LOCK(_sc)           mtx_lock(&(_sc)->sc_mtx)
  261 #define WPI_UNLOCK(_sc)         mtx_unlock(&(_sc)->sc_mtx)
  262 #define WPI_LOCK_ASSERT(_sc)    mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
  263 #define WPI_LOCK_DESTROY(_sc)   mtx_destroy(&(_sc)->sc_mtx)
  264 
  265 #define WPI_RXON_LOCK_INIT(_sc) \
  266         mtx_init(&(_sc)->rxon_mtx, "lock for wpi_rxon structure", NULL, MTX_DEF)
  267 #define WPI_RXON_LOCK(_sc)              mtx_lock(&(_sc)->rxon_mtx)
  268 #define WPI_RXON_UNLOCK(_sc)            mtx_unlock(&(_sc)->rxon_mtx)
  269 #define WPI_RXON_LOCK_ASSERT(_sc)       mtx_assert(&(_sc)->rxon_mtx, MA_OWNED)
  270 #define WPI_RXON_LOCK_DESTROY(_sc)      mtx_destroy(&(_sc)->rxon_mtx)
  271 
  272 #define WPI_TX_LOCK_INIT(_sc) \
  273         mtx_init(&(_sc)->tx_mtx, "tx path lock", NULL, MTX_DEF)
  274 #define WPI_TX_LOCK(_sc)                mtx_lock(&(_sc)->tx_mtx)
  275 #define WPI_TX_UNLOCK(_sc)              mtx_unlock(&(_sc)->tx_mtx)
  276 #define WPI_TX_LOCK_DESTROY(_sc)        mtx_destroy(&(_sc)->tx_mtx)
  277 
  278 #define WPI_NT_LOCK_INIT(_sc) \
  279         mtx_init(&(_sc)->nt_mtx, "node table lock", NULL, MTX_DEF)
  280 #define WPI_NT_LOCK(_sc)                mtx_lock(&(_sc)->nt_mtx)
  281 #define WPI_NT_UNLOCK(_sc)              mtx_unlock(&(_sc)->nt_mtx)
  282 #define WPI_NT_LOCK_DESTROY(_sc)        mtx_destroy(&(_sc)->nt_mtx)
  283 
  284 #define WPI_TXQ_LOCK_INIT(_sc) \
  285         mtx_init(&(_sc)->txq_mtx, "txq/cmdq lock", NULL, MTX_DEF)
  286 #define WPI_TXQ_LOCK(_sc)               mtx_lock(&(_sc)->txq_mtx)
  287 #define WPI_TXQ_UNLOCK(_sc)             mtx_unlock(&(_sc)->txq_mtx)
  288 #define WPI_TXQ_LOCK_DESTROY(_sc)       mtx_destroy(&(_sc)->txq_mtx)
  289 
  290 #define WPI_TXQ_STATE_LOCK_INIT(_sc) \
  291         mtx_init(&(_sc)->txq_state_mtx, "txq state lock", NULL, MTX_DEF)
  292 #define WPI_TXQ_STATE_LOCK(_sc)         mtx_lock(&(_sc)->txq_state_mtx)
  293 #define WPI_TXQ_STATE_UNLOCK(_sc)       mtx_unlock(&(_sc)->txq_state_mtx)
  294 #define WPI_TXQ_STATE_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->txq_state_mtx)

Cache object: 3ee4a4a2e9f8714c234951f649507bd2


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