1ceaec73dSDamien Bergamini 2ceaec73dSDamien Bergamini /*- 3*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 4718cf2ccSPedro F. Giffuni * 584ca7670SDamien Bergamini * Copyright (c) 2004-2006 6ceaec73dSDamien Bergamini * Damien Bergamini <damien.bergamini@free.fr>. All rights reserved. 7ceaec73dSDamien Bergamini * 8ceaec73dSDamien Bergamini * Redistribution and use in source and binary forms, with or without 9ceaec73dSDamien Bergamini * modification, are permitted provided that the following conditions 10ceaec73dSDamien Bergamini * are met: 11ceaec73dSDamien Bergamini * 1. Redistributions of source code must retain the above copyright 12ceaec73dSDamien Bergamini * notice unmodified, this list of conditions, and the following 13ceaec73dSDamien Bergamini * disclaimer. 14ceaec73dSDamien Bergamini * 2. Redistributions in binary form must reproduce the above copyright 15ceaec73dSDamien Bergamini * notice, this list of conditions and the following disclaimer in the 16ceaec73dSDamien Bergamini * documentation and/or other materials provided with the distribution. 17ceaec73dSDamien Bergamini * 18ceaec73dSDamien Bergamini * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19ceaec73dSDamien Bergamini * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20ceaec73dSDamien Bergamini * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21ceaec73dSDamien Bergamini * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22ceaec73dSDamien Bergamini * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23ceaec73dSDamien Bergamini * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24ceaec73dSDamien Bergamini * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25ceaec73dSDamien Bergamini * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26ceaec73dSDamien Bergamini * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27ceaec73dSDamien Bergamini * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28ceaec73dSDamien Bergamini * SUCH DAMAGE. 29ceaec73dSDamien Bergamini */ 30ceaec73dSDamien Bergamini 31ceaec73dSDamien Bergamini #define IPW_MAX_NSEG 1 32ceaec73dSDamien Bergamini 33ceaec73dSDamien Bergamini struct ipw_soft_bd { 34ceaec73dSDamien Bergamini struct ipw_bd *bd; 35ceaec73dSDamien Bergamini int type; 36ceaec73dSDamien Bergamini #define IPW_SBD_TYPE_NOASSOC 0 37ceaec73dSDamien Bergamini #define IPW_SBD_TYPE_COMMAND 1 38ceaec73dSDamien Bergamini #define IPW_SBD_TYPE_HEADER 2 39ceaec73dSDamien Bergamini #define IPW_SBD_TYPE_DATA 3 40ceaec73dSDamien Bergamini void *priv; 41ceaec73dSDamien Bergamini }; 42ceaec73dSDamien Bergamini 43ceaec73dSDamien Bergamini struct ipw_soft_hdr { 44ceaec73dSDamien Bergamini struct ipw_hdr hdr; 45ceaec73dSDamien Bergamini bus_dmamap_t map; 46ceaec73dSDamien Bergamini SLIST_ENTRY(ipw_soft_hdr) next; 47ceaec73dSDamien Bergamini }; 48ceaec73dSDamien Bergamini 49ceaec73dSDamien Bergamini struct ipw_soft_buf { 50ceaec73dSDamien Bergamini struct mbuf *m; 51ceaec73dSDamien Bergamini struct ieee80211_node *ni; 52ceaec73dSDamien Bergamini bus_dmamap_t map; 53ceaec73dSDamien Bergamini SLIST_ENTRY(ipw_soft_buf) next; 54ceaec73dSDamien Bergamini }; 55ceaec73dSDamien Bergamini 56ceaec73dSDamien Bergamini struct ipw_rx_radiotap_header { 57ceaec73dSDamien Bergamini struct ieee80211_radiotap_header wr_ihdr; 58ceaec73dSDamien Bergamini uint8_t wr_flags; 59786ac703SAndriy Voskoboinyk uint8_t wr_pad; 60ceaec73dSDamien Bergamini uint16_t wr_chan_freq; 61ceaec73dSDamien Bergamini uint16_t wr_chan_flags; 625463c4a4SSam Leffler int8_t wr_antsignal; 635463c4a4SSam Leffler int8_t wr_antnoise; 64786ac703SAndriy Voskoboinyk } __packed __aligned(8); 65ceaec73dSDamien Bergamini 66ceaec73dSDamien Bergamini #define IPW_RX_RADIOTAP_PRESENT \ 67ceaec73dSDamien Bergamini ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 68ceaec73dSDamien Bergamini (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 695463c4a4SSam Leffler (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \ 705463c4a4SSam Leffler (1 << IEEE80211_RADIOTAP_DB_ANTNOISE)) 71ceaec73dSDamien Bergamini 72ceaec73dSDamien Bergamini struct ipw_tx_radiotap_header { 73ceaec73dSDamien Bergamini struct ieee80211_radiotap_header wt_ihdr; 74ceaec73dSDamien Bergamini uint8_t wt_flags; 75786ac703SAndriy Voskoboinyk uint8_t wt_pad; 76ceaec73dSDamien Bergamini uint16_t wt_chan_freq; 77ceaec73dSDamien Bergamini uint16_t wt_chan_flags; 78786ac703SAndriy Voskoboinyk } __packed; 79ceaec73dSDamien Bergamini 80ceaec73dSDamien Bergamini #define IPW_TX_RADIOTAP_PRESENT \ 81ceaec73dSDamien Bergamini ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 82ceaec73dSDamien Bergamini (1 << IEEE80211_RADIOTAP_CHANNEL)) 83ceaec73dSDamien Bergamini 84b032f27cSSam Leffler struct ipw_vap { 85b032f27cSSam Leffler struct ieee80211vap vap; 86b032f27cSSam Leffler 87b032f27cSSam Leffler int (*newstate)(struct ieee80211vap *, 88b032f27cSSam Leffler enum ieee80211_state, int); 89b032f27cSSam Leffler }; 90b032f27cSSam Leffler #define IPW_VAP(vap) ((struct ipw_vap *)(vap)) 91b032f27cSSam Leffler 92ceaec73dSDamien Bergamini struct ipw_softc { 937a79cebfSGleb Smirnoff struct ieee80211com sc_ic; 947a79cebfSGleb Smirnoff struct mbufq sc_snd; 95ceaec73dSDamien Bergamini device_t sc_dev; 96ceaec73dSDamien Bergamini 97ceaec73dSDamien Bergamini struct mtx sc_mtx; 9884ca7670SDamien Bergamini struct task sc_init_task; 9988d3b172SAndrew Thompson struct callout sc_wdtimer; /* watchdog timer */ 100ceaec73dSDamien Bergamini 101ceaec73dSDamien Bergamini uint32_t flags; 102b032f27cSSam Leffler #define IPW_FLAG_FW_INITED 0x0001 103b032f27cSSam Leffler #define IPW_FLAG_INIT_LOCKED 0x0002 104b032f27cSSam Leffler #define IPW_FLAG_HAS_RADIO_SWITCH 0x0004 105b032f27cSSam Leffler #define IPW_FLAG_HACK 0x0008 106b032f27cSSam Leffler #define IPW_FLAG_SCANNING 0x0010 107b032f27cSSam Leffler #define IPW_FLAG_ENABLED 0x0020 108b032f27cSSam Leffler #define IPW_FLAG_BUSY 0x0040 109b032f27cSSam Leffler #define IPW_FLAG_ASSOCIATING 0x0080 110b032f27cSSam Leffler #define IPW_FLAG_ASSOCIATED 0x0100 1117a79cebfSGleb Smirnoff #define IPW_FLAG_RUNNING 0x0200 112ceaec73dSDamien Bergamini 113ceaec73dSDamien Bergamini struct resource *irq; 114ceaec73dSDamien Bergamini struct resource *mem; 115ceaec73dSDamien Bergamini bus_space_tag_t sc_st; 116ceaec73dSDamien Bergamini bus_space_handle_t sc_sh; 117ceaec73dSDamien Bergamini void *sc_ih; 11833d54970SLuigi Rizzo const struct firmware *sc_firmware; 119ceaec73dSDamien Bergamini 120ceaec73dSDamien Bergamini int sc_tx_timer; 12188d3b172SAndrew Thompson int sc_scan_timer; 122ceaec73dSDamien Bergamini 12362ce43ccSScott Long bus_dma_tag_t parent_dmat; 124ceaec73dSDamien Bergamini bus_dma_tag_t tbd_dmat; 125ceaec73dSDamien Bergamini bus_dma_tag_t rbd_dmat; 126ceaec73dSDamien Bergamini bus_dma_tag_t status_dmat; 127ceaec73dSDamien Bergamini bus_dma_tag_t cmd_dmat; 128ceaec73dSDamien Bergamini bus_dma_tag_t hdr_dmat; 129ceaec73dSDamien Bergamini bus_dma_tag_t txbuf_dmat; 130ceaec73dSDamien Bergamini bus_dma_tag_t rxbuf_dmat; 131ceaec73dSDamien Bergamini 132ceaec73dSDamien Bergamini bus_dmamap_t tbd_map; 133ceaec73dSDamien Bergamini bus_dmamap_t rbd_map; 134ceaec73dSDamien Bergamini bus_dmamap_t status_map; 135ceaec73dSDamien Bergamini bus_dmamap_t cmd_map; 136ceaec73dSDamien Bergamini 137ceaec73dSDamien Bergamini bus_addr_t tbd_phys; 138ceaec73dSDamien Bergamini bus_addr_t rbd_phys; 139ceaec73dSDamien Bergamini bus_addr_t status_phys; 140ceaec73dSDamien Bergamini 141ceaec73dSDamien Bergamini struct ipw_bd *tbd_list; 142ceaec73dSDamien Bergamini struct ipw_bd *rbd_list; 143ceaec73dSDamien Bergamini struct ipw_status *status_list; 144ceaec73dSDamien Bergamini 145ceaec73dSDamien Bergamini struct ipw_cmd cmd; 146ceaec73dSDamien Bergamini struct ipw_soft_bd stbd_list[IPW_NTBD]; 147ceaec73dSDamien Bergamini struct ipw_soft_buf tx_sbuf_list[IPW_NDATA]; 148ceaec73dSDamien Bergamini struct ipw_soft_hdr shdr_list[IPW_NDATA]; 149ceaec73dSDamien Bergamini struct ipw_soft_bd srbd_list[IPW_NRBD]; 150ceaec73dSDamien Bergamini struct ipw_soft_buf rx_sbuf_list[IPW_NRBD]; 151ceaec73dSDamien Bergamini 152ceaec73dSDamien Bergamini SLIST_HEAD(, ipw_soft_hdr) free_shdr; 153ceaec73dSDamien Bergamini SLIST_HEAD(, ipw_soft_buf) free_sbuf; 154ceaec73dSDamien Bergamini 155ceaec73dSDamien Bergamini uint32_t table1_base; 156ceaec73dSDamien Bergamini uint32_t table2_base; 157ceaec73dSDamien Bergamini 158ceaec73dSDamien Bergamini uint32_t txcur; 159ceaec73dSDamien Bergamini uint32_t txold; 160ceaec73dSDamien Bergamini uint32_t rxcur; 161ceaec73dSDamien Bergamini int txfree; 162ceaec73dSDamien Bergamini 1630587ad6bSAndriy Voskoboinyk uint16_t chanmask; 1640587ad6bSAndriy Voskoboinyk 165b032f27cSSam Leffler struct ipw_rx_radiotap_header sc_rxtap; 166b032f27cSSam Leffler struct ipw_tx_radiotap_header sc_txtap; 167ceaec73dSDamien Bergamini }; 16888d3b172SAndrew Thompson 16988d3b172SAndrew Thompson /* 17088d3b172SAndrew Thompson * NB.: This models the only instance of async locking in ipw_init_locked 17188d3b172SAndrew Thompson * and must be kept in sync. 17288d3b172SAndrew Thompson */ 17382ff07c0SBernhard Schmidt #define IPW_LOCK(sc) mtx_lock(&sc->sc_mtx); 17482ff07c0SBernhard Schmidt #define IPW_UNLOCK(sc) mtx_unlock(&sc->sc_mtx); 17588d3b172SAndrew Thompson #define IPW_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) 176