[BACK]Return to if_iwmvar.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / dev / pci

Annotation of src/sys/dev/pci/if_iwmvar.h, Revision 1.3

1.3     ! nonaka      1: /*     $NetBSD: if_iwmvar.h,v 1.2 2015/02/13 17:14:06 nonaka Exp $     */
1.1       pooka       2: /*     OpenBSD: if_iwmvar.h,v 1.3 2015/02/07 07:10:44 phessler Exp     */
                      3:
                      4: /*
                      5:  * Copyright (c) 2014 genua mbh <info@genua.de>
                      6:  * Copyright (c) 2014 Fixup Software Ltd.
                      7:  *
                      8:  * Permission to use, copy, modify, and distribute this software for any
                      9:  * purpose with or without fee is hereby granted, provided that the above
                     10:  * copyright notice and this permission notice appear in all copies.
                     11:  *
                     12:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     13:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     14:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     15:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     16:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     17:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     18:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     19:  */
                     20:
                     21: /*-
                     22:  * Based on BSD-licensed source modules in the Linux iwlwifi driver,
                     23:  * which were used as the reference documentation for this implementation.
                     24:  *
                     25:  * Driver version we are currently based off of is
                     26:  * Linux 3.14.3 (tag id a2df521e42b1d9a23f620ac79dbfe8655a8391dd)
                     27:  *
                     28:  ***********************************************************************
                     29:  *
                     30:  * This file is provided under a dual BSD/GPLv2 license.  When using or
                     31:  * redistributing this file, you may do so under either license.
                     32:  *
                     33:  * GPL LICENSE SUMMARY
                     34:  *
                     35:  * Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved.
                     36:  *
                     37:  * This program is free software; you can redistribute it and/or modify
                     38:  * it under the terms of version 2 of the GNU General Public License as
                     39:  * published by the Free Software Foundation.
                     40:  *
                     41:  * This program is distributed in the hope that it will be useful, but
                     42:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     43:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     44:  * General Public License for more details.
                     45:  *
                     46:  * You should have received a copy of the GNU General Public License
                     47:  * along with this program; if not, write to the Free Software
                     48:  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
                     49:  * USA
                     50:  *
                     51:  * The full GNU General Public License is included in this distribution
                     52:  * in the file called COPYING.
                     53:  *
                     54:  * Contact Information:
                     55:  *  Intel Linux Wireless <ilw@linux.intel.com>
                     56:  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
                     57:  *
                     58:  *
                     59:  * BSD LICENSE
                     60:  *
                     61:  * Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
                     62:  * All rights reserved.
                     63:  *
                     64:  * Redistribution and use in source and binary forms, with or without
                     65:  * modification, are permitted provided that the following conditions
                     66:  * are met:
                     67:  *
                     68:  *  * Redistributions of source code must retain the above copyright
                     69:  *    notice, this list of conditions and the following disclaimer.
                     70:  *  * Redistributions in binary form must reproduce the above copyright
                     71:  *    notice, this list of conditions and the following disclaimer in
                     72:  *    the documentation and/or other materials provided with the
                     73:  *    distribution.
                     74:  *  * Neither the name Intel Corporation nor the names of its
                     75:  *    contributors may be used to endorse or promote products derived
                     76:  *    from this software without specific prior written permission.
                     77:  *
                     78:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                     79:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                     80:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
                     81:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
                     82:  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
                     83:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
                     84:  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     85:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     86:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     87:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
                     88:  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     89:  */
                     90:
                     91: /*-
                     92:  * Copyright (c) 2007-2010 Damien Bergamini <damien.bergamini@free.fr>
                     93:  *
                     94:  * Permission to use, copy, modify, and distribute this software for any
                     95:  * purpose with or without fee is hereby granted, provided that the above
                     96:  * copyright notice and this permission notice appear in all copies.
                     97:  *
                     98:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     99:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                    100:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                    101:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                    102:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                    103:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                    104:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                    105:  */
                    106:
                    107: struct iwm_rx_radiotap_header {
                    108:        struct ieee80211_radiotap_header wr_ihdr;
                    109:        uint64_t        wr_tsft;
                    110:        uint8_t         wr_flags;
                    111:        uint8_t         wr_rate;
                    112:        uint16_t        wr_chan_freq;
                    113:        uint16_t        wr_chan_flags;
                    114:        int8_t          wr_dbm_antsignal;
                    115:        int8_t          wr_dbm_antnoise;
                    116: } __packed;
                    117:
                    118: #define IWM_RX_RADIOTAP_PRESENT                                                \
                    119:        ((1 << IEEE80211_RADIOTAP_TSFT) |                               \
                    120:         (1 << IEEE80211_RADIOTAP_FLAGS) |                              \
                    121:         (1 << IEEE80211_RADIOTAP_RATE) |                               \
                    122:         (1 << IEEE80211_RADIOTAP_CHANNEL) |                            \
                    123:         (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |                      \
                    124:         (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
                    125:
                    126: struct iwm_tx_radiotap_header {
                    127:        struct ieee80211_radiotap_header wt_ihdr;
                    128:        uint8_t         wt_flags;
                    129:        uint8_t         wt_rate;
                    130:        uint16_t        wt_chan_freq;
                    131:        uint16_t        wt_chan_flags;
                    132:        uint8_t         wt_hwqueue;
                    133: } __packed;
                    134:
                    135: #define IWM_TX_RADIOTAP_PRESENT                                                \
                    136:        ((1 << IEEE80211_RADIOTAP_FLAGS) |                              \
                    137:         (1 << IEEE80211_RADIOTAP_RATE) |                               \
                    138:         (1 << IEEE80211_RADIOTAP_CHANNEL))
                    139:
                    140: #define IWM_UCODE_SECT_MAX 6
                    141: #define IWM_FWDMASEGSZ (192*1024)
                    142: /* sanity check value */
                    143: #define IWM_FWMAXSIZE (2*1024*1024)
                    144:
                    145: /*
                    146:  * fw_status is used to determine if we've already parsed the firmware file
                    147:  *
                    148:  * In addition to the following, status < 0 ==> -error
                    149:  */
                    150: #define IWM_FW_STATUS_NONE             0
                    151: #define IWM_FW_STATUS_INPROGRESS       1
                    152: #define IWM_FW_STATUS_DONE             2
                    153:
                    154: enum iwm_ucode_type {
                    155:        IWM_UCODE_TYPE_INIT,
                    156:        IWM_UCODE_TYPE_REGULAR,
                    157:        IWM_UCODE_TYPE_WOW,
                    158:        IWM_UCODE_TYPE_MAX
                    159: };
                    160:
                    161: struct iwm_fw_info {
                    162:        void *fw_rawdata;
                    163:        size_t fw_rawsize;
                    164:        int fw_status;
                    165:
                    166:        struct iwm_fw_sects {
                    167:                struct iwm_fw_onesect {
                    168:                        void *fws_data;
                    169:                        uint32_t fws_len;
                    170:                        uint32_t fws_devoff;
                    171:
                    172:                        void *fws_alloc;
                    173:                        size_t fws_allocsize;
                    174:                } fw_sect[IWM_UCODE_SECT_MAX];
                    175:                size_t fw_totlen;
                    176:                int fw_count;
                    177:        } fw_sects[IWM_UCODE_TYPE_MAX];
                    178: };
                    179:
                    180: struct iwm_nvm_data {
                    181:        int n_hw_addrs;
                    182:        uint8_t hw_addr[ETHER_ADDR_LEN];
                    183:
                    184:        uint8_t calib_version;
                    185:        uint16_t calib_voltage;
                    186:
                    187:        uint16_t raw_temperature;
                    188:        uint16_t kelvin_temperature;
                    189:        uint16_t kelvin_voltage;
                    190:        uint16_t xtal_calib[2];
                    191:
                    192:        int sku_cap_band_24GHz_enable;
                    193:        int sku_cap_band_52GHz_enable;
                    194:        int sku_cap_11n_enable;
                    195:        int sku_cap_amt_enable;
                    196:        int sku_cap_ipan_enable;
                    197:
                    198:        uint8_t radio_cfg_type;
                    199:        uint8_t radio_cfg_step;
                    200:        uint8_t radio_cfg_dash;
                    201:        uint8_t radio_cfg_pnum;
                    202:        uint8_t valid_tx_ant, valid_rx_ant;
                    203:
                    204:        uint16_t nvm_version;
                    205:        uint8_t max_tx_pwr_half_dbm;
                    206: };
                    207:
                    208: /* max bufs per tfd the driver will use */
                    209: #define IWM_MAX_CMD_TBS_PER_TFD 2
                    210:
                    211: struct iwm_rx_packet;
                    212: struct iwm_host_cmd {
                    213:        const void *data[IWM_MAX_CMD_TBS_PER_TFD];
                    214:        struct iwm_rx_packet *resp_pkt;
                    215:        unsigned long _rx_page_addr;
                    216:        uint32_t _rx_page_order;
                    217:        int handler_status;
                    218:
                    219:        uint32_t flags;
                    220:        uint16_t len[IWM_MAX_CMD_TBS_PER_TFD];
                    221:        uint8_t dataflags[IWM_MAX_CMD_TBS_PER_TFD];
                    222:        uint8_t id;
                    223: };
                    224:
                    225: /*
                    226:  * DMA glue is from iwn
                    227:  */
                    228:
                    229: struct iwm_dma_info {
                    230:        bus_dma_tag_t           tag;
                    231:        bus_dmamap_t            map;
                    232:        bus_dma_segment_t       seg;
                    233:        bus_addr_t              paddr;
                    234:        void                    *vaddr;
                    235:        bus_size_t              size;
                    236: };
                    237:
                    238: #define IWM_TX_RING_COUNT      256
                    239: #define IWM_TX_RING_LOMARK     192
                    240: #define IWM_TX_RING_HIMARK     224
                    241:
                    242: struct iwm_tx_data {
                    243:        bus_dmamap_t    map;
                    244:        bus_addr_t      cmd_paddr;
                    245:        bus_addr_t      scratch_paddr;
                    246:        struct mbuf     *m;
                    247:        struct iwm_node *in;
                    248:        int done;
                    249: };
                    250:
                    251: struct iwm_tx_ring {
                    252:        struct iwm_dma_info     desc_dma;
                    253:        struct iwm_dma_info     cmd_dma;
                    254:        struct iwm_tfd          *desc;
                    255:        struct iwm_device_cmd   *cmd;
                    256:        struct iwm_tx_data      data[IWM_TX_RING_COUNT];
                    257:        int                     qid;
                    258:        int                     queued;
                    259:        int                     cur;
                    260: };
                    261:
                    262: #define IWM_RX_RING_COUNT      256
                    263: #define IWM_RBUF_COUNT         (IWM_RX_RING_COUNT + 32)
                    264: /* Linux driver optionally uses 8k buffer */
                    265: #define IWM_RBUF_SIZE          4096
                    266:
                    267: struct iwm_softc;
                    268: struct iwm_rbuf {
                    269:        struct iwm_softc        *sc;
                    270:        void                    *vaddr;
                    271:        bus_addr_t              paddr;
                    272: };
                    273:
                    274: struct iwm_rx_data {
                    275:        struct mbuf     *m;
                    276:        bus_dmamap_t    map;
                    277:        int             wantresp;
                    278: };
                    279:
                    280: struct iwm_rx_ring {
                    281:        struct iwm_dma_info     desc_dma;
                    282:        struct iwm_dma_info     stat_dma;
                    283:        struct iwm_dma_info     buf_dma;
                    284:        uint32_t                *desc;
                    285:        struct iwm_rb_status    *stat;
                    286:        struct iwm_rx_data      data[IWM_RX_RING_COUNT];
                    287:        int                     cur;
                    288: };
                    289:
                    290: #define IWM_FLAG_USE_ICT       0x01
                    291: #define IWM_FLAG_HW_INITED     0x02
                    292: #define IWM_FLAG_STOPPED       0x04
                    293: #define IWM_FLAG_RFKILL                0x08
                    294: #define IWM_FLAG_BUSY          0x10
1.2       nonaka    295: #define IWM_FLAG_ATTACHED      0x20
1.1       pooka     296:
                    297: struct iwm_ucode_status {
                    298:        uint32_t uc_error_event_table;
                    299:        uint32_t uc_log_event_table;
                    300:
                    301:        int uc_ok;
                    302:        int uc_intr;
                    303: };
                    304:
                    305: #define IWM_CMD_RESP_MAX PAGE_SIZE
                    306:
                    307: #define IWM_OTP_LOW_IMAGE_SIZE 2048
                    308:
                    309: #define IWM_MVM_TE_SESSION_PROTECTION_MAX_TIME_MS 500
                    310: #define IWM_MVM_TE_SESSION_PROTECTION_MIN_TIME_MS 400
                    311:
                    312: /*
                    313:  * Command headers are in iwl-trans.h, which is full of all
                    314:  * kinds of other junk, so we just replicate the structures here.
                    315:  * First the software bits:
                    316:  */
                    317: enum IWM_CMD_MODE {
                    318:        IWM_CMD_SYNC            = 0,
                    319:        IWM_CMD_ASYNC           = (1 << 0),
                    320:        IWM_CMD_WANT_SKB        = (1 << 1),
                    321:        IWM_CMD_SEND_IN_RFKILL  = (1 << 2),
                    322: };
                    323: enum iwm_hcmd_dataflag {
                    324:         IWM_HCMD_DFL_NOCOPY     = (1 << 0),
                    325:         IWM_HCMD_DFL_DUP        = (1 << 1),
                    326: };
                    327:
                    328: /*
                    329:  * iwlwifi/iwl-phy-db
                    330:  */
                    331:
                    332: #define IWM_NUM_PAPD_CH_GROUPS 4
                    333: #define IWM_NUM_TXP_CH_GROUPS  9
                    334:
                    335: struct iwm_phy_db_entry {
                    336:        uint16_t size;
                    337:        uint8_t *data;
                    338: };
                    339:
                    340: struct iwm_phy_db {
                    341:        struct iwm_phy_db_entry cfg;
                    342:        struct iwm_phy_db_entry calib_nch;
                    343:        struct iwm_phy_db_entry calib_ch_group_papd[IWM_NUM_PAPD_CH_GROUPS];
                    344:        struct iwm_phy_db_entry calib_ch_group_txp[IWM_NUM_TXP_CH_GROUPS];
                    345: };
                    346:
                    347: struct iwm_int_sta {
                    348:        uint32_t sta_id;
                    349:        uint32_t tfd_queue_msk;
                    350: };
                    351:
                    352: struct iwm_mvm_phy_ctxt {
                    353:        uint16_t id;
                    354:        uint16_t color;
                    355:        uint32_t ref;
                    356:        struct ieee80211_channel *channel;
                    357: };
                    358:
                    359: struct iwm_bf_data {
                    360:        int bf_enabled;         /* filtering    */
                    361:        int ba_enabled;         /* abort        */
                    362:        int ave_beacon_signal;
                    363:        int last_cqm_event;
                    364: };
                    365:
                    366: struct iwm_softc {
1.3     ! nonaka    367:        device_t sc_dev;
1.1       pooka     368:        struct ethercom sc_ec;
                    369:        struct ieee80211com sc_ic;
                    370:
                    371:        int (*sc_newstate)(struct ieee80211com *, enum ieee80211_state, int);
                    372:        int sc_newstate_pending;
                    373:
                    374:        struct ieee80211_amrr sc_amrr;
                    375:        struct callout sc_calib_to;
                    376:
                    377:        bus_space_tag_t sc_st;
                    378:        bus_space_handle_t sc_sh;
                    379:
                    380:        bus_size_t sc_sz;
                    381:        bus_dma_tag_t sc_dmat;
                    382:        pci_chipset_tag_t sc_pct;
                    383:        pcitag_t sc_pcitag;
1.3     ! nonaka    384:        pcireg_t sc_pciid;
1.1       pooka     385:        const void *sc_ih;
                    386:
                    387:        /* TX scheduler rings. */
                    388:        struct iwm_dma_info             sched_dma;
                    389:        uint32_t                        sched_base;
                    390:
                    391:         /* TX/RX rings. */
                    392:        struct iwm_tx_ring txq[IWM_MVM_MAX_QUEUES];
                    393:        struct iwm_rx_ring rxq;
                    394:        int qfullmsk;
                    395:
                    396:        int sc_sf_state;
                    397:
                    398:         /* ICT table. */
                    399:        struct iwm_dma_info     ict_dma;
                    400:        int                     ict_cur;
                    401:
                    402:        int sc_hw_rev;
                    403:        int sc_hw_id;
                    404:
                    405:        struct iwm_dma_info kw_dma;
                    406:        struct iwm_dma_info fw_dma;
                    407:
                    408:        int sc_fw_chunk_done;
                    409:        int sc_init_complete;
                    410:
                    411:        struct iwm_ucode_status sc_uc;
                    412:        enum iwm_ucode_type sc_uc_current;
                    413:        int sc_fwver;
                    414:
                    415:        int sc_capaflags;
                    416:        int sc_capa_max_probe_len;
                    417:
                    418:        int sc_intmask;
                    419:        int sc_flags;
                    420:
                    421:        /*
                    422:         * So why do we need a separate stopped flag and a generation?
                    423:         * the former protects the device from issueing commands when it's
                    424:         * stopped (duh).  The latter protects against race from a very
                    425:         * fast stop/unstop cycle where threads waiting for responses do
                    426:         * not have a chance to run in between.  Notably: we want to stop
                    427:         * the device from interrupt context when it craps out, so we
                    428:         * don't have the luxury of waiting for quiescense.
                    429:         */
                    430:        int sc_generation;
                    431:
                    432:        int sc_cap_off; /* PCIe caps */
                    433:
                    434:        const char *sc_fwname;
                    435:        bus_size_t sc_fwdmasegsz;
                    436:        struct iwm_fw_info sc_fw;
                    437:        int sc_fw_phy_config;
                    438:        struct iwm_tlv_calib_ctrl sc_default_calib[IWM_UCODE_TYPE_MAX];
                    439:
                    440:        struct iwm_nvm_data sc_nvm;
                    441:        struct iwm_phy_db sc_phy_db;
                    442:
                    443:        struct iwm_bf_data sc_bf;
                    444:
                    445:        int sc_tx_timer;
                    446:
                    447:        struct iwm_scan_cmd *sc_scan_cmd;
                    448:        size_t sc_scan_cmd_len;
                    449:        int sc_scan_last_antenna;
                    450:        int sc_scanband;
                    451:
                    452:        int sc_auth_prot;
                    453:
                    454:        int sc_fixed_ridx;
                    455:
                    456:        int sc_staid;
                    457:        int sc_nodecolor;
                    458:
                    459:        uint8_t sc_cmd_resp[IWM_CMD_RESP_MAX];
                    460:        int sc_wantresp;
                    461:
                    462:        struct workqueue *sc_nswq, *sc_eswq;
                    463:        struct work sc_eswk;
                    464:
                    465:        struct iwm_rx_phy_info sc_last_phy_info;
                    466:        int sc_ampdu_ref;
                    467:
                    468:        struct iwm_int_sta sc_aux_sta;
                    469:
                    470:        /* phy contexts.  we only use the first one */
                    471:        struct iwm_mvm_phy_ctxt sc_phyctxt[IWM_NUM_PHY_CTX];
                    472:
                    473:        struct iwm_notif_statistics sc_stats;
                    474:        int sc_noise;
                    475:
                    476:        struct bpf_if *         sc_drvbpf;
                    477:
                    478:        union {
                    479:                struct iwm_rx_radiotap_header th;
                    480:                uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
                    481:        } sc_rxtapu;
                    482: #define sc_rxtap       sc_rxtapu.th
                    483:        int                     sc_rxtap_len;
                    484:
                    485:        union {
                    486:                struct iwm_tx_radiotap_header th;
                    487:                uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
                    488:        } sc_txtapu;
                    489: #define sc_txtap       sc_txtapu.th
                    490:        int                     sc_txtap_len;
                    491: };
                    492:
                    493: struct iwm_node {
                    494:        struct ieee80211_node in_ni;
                    495:        struct iwm_mvm_phy_ctxt *in_phyctxt;
                    496:
                    497:        uint16_t in_id;
                    498:        uint16_t in_color;
                    499:        int in_tsfid;
                    500:
                    501:        /* status "bits" */
                    502:        int in_assoc;
                    503:
                    504:        struct iwm_lq_cmd in_lq;
                    505:        struct ieee80211_amrr_node in_amn;
                    506:
                    507:        uint8_t in_ridx[IEEE80211_RATE_MAXSIZE];
                    508: };
                    509: #define IWM_STATION_ID 0
                    510:
                    511: #define IWM_ICT_SIZE           4096
                    512: #define IWM_ICT_COUNT          (IWM_ICT_SIZE / sizeof (uint32_t))
                    513: #define IWM_ICT_PADDR_SHIFT    12

CVSweb <webmaster@jp.NetBSD.org>