1ffd7c74aSJoe Talbott /* $FreeBSD$ */ 2ffd7c74aSJoe Talbott /* $OpenBSD: if_iwnvar.h,v 1.17 2010/02/17 18:23:00 damien Exp $ */ 3ffd7c74aSJoe Talbott 4ffd7c74aSJoe Talbott /*- 5ffd7c74aSJoe Talbott * Copyright (c) 2007, 2008 6ffd7c74aSJoe Talbott * Damien Bergamini <damien.bergamini@free.fr> 7ffd7c74aSJoe Talbott * Copyright (c) 2008 Sam Leffler, Errno Consulting 8ffd7c74aSJoe Talbott * 9ffd7c74aSJoe Talbott * Permission to use, copy, modify, and distribute this software for any 10ffd7c74aSJoe Talbott * purpose with or without fee is hereby granted, provided that the above 11ffd7c74aSJoe Talbott * copyright notice and this permission notice appear in all copies. 12ffd7c74aSJoe Talbott * 13ffd7c74aSJoe Talbott * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14ffd7c74aSJoe Talbott * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15ffd7c74aSJoe Talbott * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16ffd7c74aSJoe Talbott * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17ffd7c74aSJoe Talbott * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18ffd7c74aSJoe Talbott * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19ffd7c74aSJoe Talbott * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20ffd7c74aSJoe Talbott */ 21ffd7c74aSJoe Talbott 22*3db796acSJoe Talbott #include <netproto/802_11/ieee80211_amrr.h> 23*3db796acSJoe Talbott 24ffd7c74aSJoe Talbott struct iwn_rx_radiotap_header { 25ffd7c74aSJoe Talbott struct ieee80211_radiotap_header wr_ihdr; 26ffd7c74aSJoe Talbott uint64_t wr_tsft; 27ffd7c74aSJoe Talbott uint8_t wr_flags; 28ffd7c74aSJoe Talbott uint8_t wr_rate; 29ffd7c74aSJoe Talbott uint16_t wr_chan_freq; 30ffd7c74aSJoe Talbott uint16_t wr_chan_flags; 31ffd7c74aSJoe Talbott int8_t wr_dbm_antsignal; 32ffd7c74aSJoe Talbott int8_t wr_dbm_antnoise; 33ffd7c74aSJoe Talbott } __packed; 34ffd7c74aSJoe Talbott 35ffd7c74aSJoe Talbott #define IWN_RX_RADIOTAP_PRESENT \ 36ffd7c74aSJoe Talbott ((1 << IEEE80211_RADIOTAP_TSFT) | \ 37ffd7c74aSJoe Talbott (1 << IEEE80211_RADIOTAP_FLAGS) | \ 38ffd7c74aSJoe Talbott (1 << IEEE80211_RADIOTAP_RATE) | \ 39ffd7c74aSJoe Talbott (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 40ffd7c74aSJoe Talbott (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 41ffd7c74aSJoe Talbott (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)) 42ffd7c74aSJoe Talbott 43ffd7c74aSJoe Talbott struct iwn_tx_radiotap_header { 44ffd7c74aSJoe Talbott struct ieee80211_radiotap_header wt_ihdr; 45ffd7c74aSJoe Talbott uint8_t wt_flags; 46ffd7c74aSJoe Talbott uint8_t wt_rate; 47ffd7c74aSJoe Talbott uint16_t wt_chan_freq; 48ffd7c74aSJoe Talbott uint16_t wt_chan_flags; 49ffd7c74aSJoe Talbott } __packed; 50ffd7c74aSJoe Talbott 51ffd7c74aSJoe Talbott #define IWN_TX_RADIOTAP_PRESENT \ 52ffd7c74aSJoe Talbott ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 53ffd7c74aSJoe Talbott (1 << IEEE80211_RADIOTAP_RATE) | \ 54ffd7c74aSJoe Talbott (1 << IEEE80211_RADIOTAP_CHANNEL)) 55ffd7c74aSJoe Talbott 56ffd7c74aSJoe Talbott struct iwn_dma_info { 57ffd7c74aSJoe Talbott bus_dma_tag_t tag; 58ffd7c74aSJoe Talbott bus_dmamap_t map; 59ffd7c74aSJoe Talbott bus_dma_segment_t seg; 60ffd7c74aSJoe Talbott bus_addr_t paddr; 61ffd7c74aSJoe Talbott caddr_t vaddr; 62ffd7c74aSJoe Talbott bus_size_t size; 63ffd7c74aSJoe Talbott }; 64ffd7c74aSJoe Talbott 65ffd7c74aSJoe Talbott struct iwn_tx_data { 66ffd7c74aSJoe Talbott bus_dmamap_t map; 67ffd7c74aSJoe Talbott bus_addr_t cmd_paddr; 68ffd7c74aSJoe Talbott bus_addr_t scratch_paddr; 69ffd7c74aSJoe Talbott struct mbuf *m; 70ffd7c74aSJoe Talbott struct ieee80211_node *ni; 71ffd7c74aSJoe Talbott }; 72ffd7c74aSJoe Talbott 73ffd7c74aSJoe Talbott struct iwn_tx_ring { 74ffd7c74aSJoe Talbott struct iwn_dma_info desc_dma; 75ffd7c74aSJoe Talbott struct iwn_dma_info cmd_dma; 76ffd7c74aSJoe Talbott struct iwn_tx_desc *desc; 77ffd7c74aSJoe Talbott struct iwn_tx_cmd *cmd; 78ffd7c74aSJoe Talbott struct iwn_tx_data data[IWN_TX_RING_COUNT]; 79ffd7c74aSJoe Talbott bus_dma_tag_t data_dmat; 80ffd7c74aSJoe Talbott int qid; 81ffd7c74aSJoe Talbott int queued; 82ffd7c74aSJoe Talbott int cur; 83ffd7c74aSJoe Talbott }; 84ffd7c74aSJoe Talbott 85*3db796acSJoe Talbott struct iwn_amrr { 86*3db796acSJoe Talbott struct ieee80211_node ni; /* must be the first */ 87*3db796acSJoe Talbott int txcnt; 88*3db796acSJoe Talbott int retrycnt; 89*3db796acSJoe Talbott int success; 90*3db796acSJoe Talbott int success_threshold; 91*3db796acSJoe Talbott int recovery; 92*3db796acSJoe Talbott }; 93*3db796acSJoe Talbott 94ffd7c74aSJoe Talbott struct iwn_softc; 95ffd7c74aSJoe Talbott 96ffd7c74aSJoe Talbott struct iwn_rx_data { 97ffd7c74aSJoe Talbott struct mbuf *m; 98ffd7c74aSJoe Talbott bus_dmamap_t map; 99ffd7c74aSJoe Talbott }; 100ffd7c74aSJoe Talbott 101ffd7c74aSJoe Talbott struct iwn_rx_ring { 102ffd7c74aSJoe Talbott struct iwn_dma_info desc_dma; 103ffd7c74aSJoe Talbott struct iwn_dma_info stat_dma; 104ffd7c74aSJoe Talbott uint32_t *desc; 105ffd7c74aSJoe Talbott struct iwn_rx_status *stat; 106ffd7c74aSJoe Talbott struct iwn_rx_data data[IWN_RX_RING_COUNT]; 107ffd7c74aSJoe Talbott bus_dma_tag_t data_dmat; 108ffd7c74aSJoe Talbott int cur; 109ffd7c74aSJoe Talbott }; 110ffd7c74aSJoe Talbott 111ffd7c74aSJoe Talbott struct iwn_node { 112ffd7c74aSJoe Talbott struct ieee80211_node ni; /* must be the first */ 113ffd7c74aSJoe Talbott uint16_t disable_tid; 114ffd7c74aSJoe Talbott uint8_t id; 115ffd7c74aSJoe Talbott uint8_t ridx[IEEE80211_RATE_MAXSIZE]; 116*3db796acSJoe Talbott struct ieee80211_amrr_node amn; 117ffd7c74aSJoe Talbott }; 118ffd7c74aSJoe Talbott 119ffd7c74aSJoe Talbott struct iwn_calib_state { 120ffd7c74aSJoe Talbott uint8_t state; 121ffd7c74aSJoe Talbott #define IWN_CALIB_STATE_INIT 0 122ffd7c74aSJoe Talbott #define IWN_CALIB_STATE_ASSOC 1 123ffd7c74aSJoe Talbott #define IWN_CALIB_STATE_RUN 2 124ffd7c74aSJoe Talbott 125ffd7c74aSJoe Talbott u_int nbeacons; 126ffd7c74aSJoe Talbott uint32_t noise[3]; 127ffd7c74aSJoe Talbott uint32_t rssi[3]; 128ffd7c74aSJoe Talbott uint32_t ofdm_x1; 129ffd7c74aSJoe Talbott uint32_t ofdm_mrc_x1; 130ffd7c74aSJoe Talbott uint32_t ofdm_x4; 131ffd7c74aSJoe Talbott uint32_t ofdm_mrc_x4; 132ffd7c74aSJoe Talbott uint32_t cck_x4; 133ffd7c74aSJoe Talbott uint32_t cck_mrc_x4; 134ffd7c74aSJoe Talbott uint32_t bad_plcp_ofdm; 135ffd7c74aSJoe Talbott uint32_t fa_ofdm; 136ffd7c74aSJoe Talbott uint32_t bad_plcp_cck; 137ffd7c74aSJoe Talbott uint32_t fa_cck; 138ffd7c74aSJoe Talbott uint32_t low_fa; 139ffd7c74aSJoe Talbott uint8_t cck_state; 140ffd7c74aSJoe Talbott #define IWN_CCK_STATE_INIT 0 141ffd7c74aSJoe Talbott #define IWN_CCK_STATE_LOFA 1 142ffd7c74aSJoe Talbott #define IWN_CCK_STATE_HIFA 2 143ffd7c74aSJoe Talbott 144ffd7c74aSJoe Talbott uint8_t noise_samples[20]; 145ffd7c74aSJoe Talbott u_int cur_noise_sample; 146ffd7c74aSJoe Talbott uint8_t noise_ref; 147ffd7c74aSJoe Talbott uint32_t energy_samples[10]; 148ffd7c74aSJoe Talbott u_int cur_energy_sample; 149ffd7c74aSJoe Talbott uint32_t energy_cck; 150ffd7c74aSJoe Talbott }; 151ffd7c74aSJoe Talbott 152ffd7c74aSJoe Talbott struct iwn_calib_info { 153ffd7c74aSJoe Talbott uint8_t *buf; 154ffd7c74aSJoe Talbott u_int len; 155ffd7c74aSJoe Talbott }; 156ffd7c74aSJoe Talbott 157ffd7c74aSJoe Talbott struct iwn_fw_part { 158ffd7c74aSJoe Talbott const uint8_t *text; 159ffd7c74aSJoe Talbott uint32_t textsz; 160ffd7c74aSJoe Talbott const uint8_t *data; 161ffd7c74aSJoe Talbott uint32_t datasz; 162ffd7c74aSJoe Talbott }; 163ffd7c74aSJoe Talbott 164ffd7c74aSJoe Talbott struct iwn_fw_info { 165ffd7c74aSJoe Talbott u_char *data; 166ffd7c74aSJoe Talbott struct iwn_fw_part init; 167ffd7c74aSJoe Talbott struct iwn_fw_part main; 168ffd7c74aSJoe Talbott struct iwn_fw_part boot; 169ffd7c74aSJoe Talbott }; 170ffd7c74aSJoe Talbott 171ffd7c74aSJoe Talbott struct iwn_hal { 172ffd7c74aSJoe Talbott int (*load_firmware)(struct iwn_softc *); 173ffd7c74aSJoe Talbott void (*read_eeprom)(struct iwn_softc *); 174ffd7c74aSJoe Talbott int (*post_alive)(struct iwn_softc *); 175ffd7c74aSJoe Talbott int (*nic_config)(struct iwn_softc *); 176ffd7c74aSJoe Talbott void (*update_sched)(struct iwn_softc *, int, int, uint8_t, 177ffd7c74aSJoe Talbott uint16_t); 178ffd7c74aSJoe Talbott int (*get_temperature)(struct iwn_softc *); 179ffd7c74aSJoe Talbott int (*get_rssi)(struct iwn_softc *, struct iwn_rx_stat *); 180ffd7c74aSJoe Talbott int (*set_txpower)(struct iwn_softc *, 181ffd7c74aSJoe Talbott struct ieee80211_channel *, int); 182ffd7c74aSJoe Talbott int (*init_gains)(struct iwn_softc *); 183ffd7c74aSJoe Talbott int (*set_gains)(struct iwn_softc *); 184ffd7c74aSJoe Talbott int (*add_node)(struct iwn_softc *, struct iwn_node_info *, 185ffd7c74aSJoe Talbott int); 186ffd7c74aSJoe Talbott void (*tx_done)(struct iwn_softc *, struct iwn_rx_desc *, 187ffd7c74aSJoe Talbott struct iwn_rx_data *); 188ffd7c74aSJoe Talbott #if 0 /* HT */ 189ffd7c74aSJoe Talbott void (*ampdu_tx_start)(struct iwn_softc *, 190ffd7c74aSJoe Talbott struct ieee80211_node *, uint8_t, uint16_t); 191ffd7c74aSJoe Talbott void (*ampdu_tx_stop)(struct iwn_softc *, uint8_t, 192ffd7c74aSJoe Talbott uint16_t); 193ffd7c74aSJoe Talbott #endif 194ffd7c74aSJoe Talbott int ntxqs; 195ffd7c74aSJoe Talbott int ndmachnls; 196ffd7c74aSJoe Talbott uint8_t broadcast_id; 197ffd7c74aSJoe Talbott int rxonsz; 198ffd7c74aSJoe Talbott int schedsz; 199ffd7c74aSJoe Talbott uint32_t fw_text_maxsz; 200ffd7c74aSJoe Talbott uint32_t fw_data_maxsz; 201ffd7c74aSJoe Talbott uint32_t fwsz; 202ffd7c74aSJoe Talbott bus_size_t sched_txfact_addr; 203ffd7c74aSJoe Talbott }; 204ffd7c74aSJoe Talbott 205ffd7c74aSJoe Talbott struct iwn_vap { 206ffd7c74aSJoe Talbott struct ieee80211vap iv_vap; 207ffd7c74aSJoe Talbott uint8_t iv_ridx; 208ffd7c74aSJoe Talbott 209ffd7c74aSJoe Talbott int (*iv_newstate)(struct ieee80211vap *, 210ffd7c74aSJoe Talbott enum ieee80211_state, int); 211*3db796acSJoe Talbott struct ieee80211_amrr iv_amrr; 212ffd7c74aSJoe Talbott }; 213ffd7c74aSJoe Talbott #define IWN_VAP(_vap) ((struct iwn_vap *)(_vap)) 214ffd7c74aSJoe Talbott 215ffd7c74aSJoe Talbott struct iwn_softc { 216*3db796acSJoe Talbott struct arpcom arpcom; 217ffd7c74aSJoe Talbott struct ifnet *sc_ifp; 218ffd7c74aSJoe Talbott int sc_debug; 219ffd7c74aSJoe Talbott 220ffd7c74aSJoe Talbott /* Locks */ 221ffd7c74aSJoe Talbott struct mtx sc_mtx; 222*3db796acSJoe Talbott struct lock sc_lock; 223ffd7c74aSJoe Talbott 224ffd7c74aSJoe Talbott /* Bus */ 225ffd7c74aSJoe Talbott device_t sc_dev; 226ffd7c74aSJoe Talbott int mem_rid; 227ffd7c74aSJoe Talbott int irq_rid; 228ffd7c74aSJoe Talbott struct resource *mem; 229ffd7c74aSJoe Talbott struct resource *irq; 230*3db796acSJoe Talbott bus_dma_tag_t sc_dmat; 231ffd7c74aSJoe Talbott 232ffd7c74aSJoe Talbott u_int sc_flags; 233ffd7c74aSJoe Talbott #define IWN_FLAG_HAS_5GHZ (1 << 0) 234ffd7c74aSJoe Talbott #define IWN_FLAG_HAS_OTPROM (1 << 1) 235ffd7c74aSJoe Talbott #define IWN_FLAG_CALIB_DONE (1 << 2) 236ffd7c74aSJoe Talbott #define IWN_FLAG_USE_ICT (1 << 3) 237ffd7c74aSJoe Talbott #define IWN_FLAG_INTERNAL_PA (1 << 4) 238ffd7c74aSJoe Talbott 239ffd7c74aSJoe Talbott uint8_t hw_type; 240ffd7c74aSJoe Talbott const struct iwn_hal *sc_hal; 241ffd7c74aSJoe Talbott const char *fwname; 242ffd7c74aSJoe Talbott const struct iwn_sensitivity_limits 243ffd7c74aSJoe Talbott *limits; 244ffd7c74aSJoe Talbott 245ffd7c74aSJoe Talbott /* TX scheduler rings. */ 246ffd7c74aSJoe Talbott struct iwn_dma_info sched_dma; 247ffd7c74aSJoe Talbott uint16_t *sched; 248ffd7c74aSJoe Talbott uint32_t sched_base; 249ffd7c74aSJoe Talbott 250ffd7c74aSJoe Talbott /* "Keep Warm" page. */ 251ffd7c74aSJoe Talbott struct iwn_dma_info kw_dma; 252ffd7c74aSJoe Talbott 253ffd7c74aSJoe Talbott /* Firmware image. */ 254ffd7c74aSJoe Talbott const struct firmware *fw_fp; 255ffd7c74aSJoe Talbott 256ffd7c74aSJoe Talbott /* Firmware DMA transfer. */ 257ffd7c74aSJoe Talbott struct iwn_dma_info fw_dma; 258ffd7c74aSJoe Talbott 259ffd7c74aSJoe Talbott /* ICT table. */ 260ffd7c74aSJoe Talbott struct iwn_dma_info ict_dma; 261ffd7c74aSJoe Talbott uint32_t *ict; 262ffd7c74aSJoe Talbott int ict_cur; 263ffd7c74aSJoe Talbott 264ffd7c74aSJoe Talbott /* TX/RX rings. */ 265ffd7c74aSJoe Talbott struct iwn_tx_ring txq[IWN5000_NTXQUEUES]; 266ffd7c74aSJoe Talbott struct iwn_rx_ring rxq; 267ffd7c74aSJoe Talbott 268ffd7c74aSJoe Talbott bus_space_tag_t sc_st; 269ffd7c74aSJoe Talbott bus_space_handle_t sc_sh; 270ffd7c74aSJoe Talbott void *sc_ih; 271ffd7c74aSJoe Talbott bus_size_t sc_sz; 272ffd7c74aSJoe Talbott int sc_cap_off; /* PCIe Capabilities. */ 273ffd7c74aSJoe Talbott 274ffd7c74aSJoe Talbott /* Tasks used by the driver */ 275ffd7c74aSJoe Talbott struct task sc_reinit_task; 276ffd7c74aSJoe Talbott struct task sc_radioon_task; 277ffd7c74aSJoe Talbott struct task sc_radiooff_task; 278ffd7c74aSJoe Talbott 279ffd7c74aSJoe Talbott int calib_cnt; 280ffd7c74aSJoe Talbott struct iwn_calib_state calib; 281ffd7c74aSJoe Talbott 282ffd7c74aSJoe Talbott struct iwn_fw_info fw; 283ffd7c74aSJoe Talbott struct iwn_calib_info calibcmd[5]; 284ffd7c74aSJoe Talbott uint32_t errptr; 285ffd7c74aSJoe Talbott 286ffd7c74aSJoe Talbott struct iwn_rx_stat last_rx_stat; 287ffd7c74aSJoe Talbott int last_rx_valid; 288ffd7c74aSJoe Talbott struct iwn_ucode_info ucode_info; 289ffd7c74aSJoe Talbott struct iwn_rxon rxon; 290ffd7c74aSJoe Talbott uint32_t rawtemp; 291ffd7c74aSJoe Talbott int temp; 292ffd7c74aSJoe Talbott int noise; 293ffd7c74aSJoe Talbott uint32_t qfullmsk; 294ffd7c74aSJoe Talbott 295ffd7c74aSJoe Talbott uint32_t prom_base; 296ffd7c74aSJoe Talbott struct iwn4965_eeprom_band 297ffd7c74aSJoe Talbott bands[IWN_NBANDS]; 298ffd7c74aSJoe Talbott struct iwn_eeprom_chan eeprom_channels[IWN_NBANDS][IWN_MAX_CHAN_PER_BAND]; 299ffd7c74aSJoe Talbott uint16_t rfcfg; 300ffd7c74aSJoe Talbott uint8_t calib_ver; 301ffd7c74aSJoe Talbott char eeprom_domain[4]; 302ffd7c74aSJoe Talbott uint32_t eeprom_crystal; 303ffd7c74aSJoe Talbott int16_t eeprom_voltage; 304ffd7c74aSJoe Talbott int8_t maxpwr2GHz; 305ffd7c74aSJoe Talbott int8_t maxpwr5GHz; 306ffd7c74aSJoe Talbott int8_t maxpwr[IEEE80211_CHAN_MAX]; 307ffd7c74aSJoe Talbott int8_t enh_maxpwr[35]; 308ffd7c74aSJoe Talbott 309ffd7c74aSJoe Talbott int32_t temp_off; 310ffd7c74aSJoe Talbott uint32_t int_mask; 311ffd7c74aSJoe Talbott uint8_t ntxchains; 312ffd7c74aSJoe Talbott uint8_t nrxchains; 313ffd7c74aSJoe Talbott uint8_t txchainmask; 314ffd7c74aSJoe Talbott uint8_t rxchainmask; 315ffd7c74aSJoe Talbott uint8_t chainmask; 316ffd7c74aSJoe Talbott 317ffd7c74aSJoe Talbott struct callout sc_timer_to; 318ffd7c74aSJoe Talbott int sc_tx_timer; 319ffd7c74aSJoe Talbott 320ffd7c74aSJoe Talbott struct iwn_rx_radiotap_header sc_rxtap; 321ffd7c74aSJoe Talbott struct iwn_tx_radiotap_header sc_txtap; 322*3db796acSJoe Talbott 323*3db796acSJoe Talbott struct sysctl_ctx_list sc_sysctl_ctx; 324*3db796acSJoe Talbott struct sysctl_oid *sc_sysctl_tree; 325ffd7c74aSJoe Talbott }; 326ffd7c74aSJoe Talbott 327*3db796acSJoe Talbott #define IWN_LOCK_INIT(_sc) 328*3db796acSJoe Talbott #define IWN_LOCK(_sc) lwkt_serialize_enter((_sc)->sc_ifp->if_serializer) 329*3db796acSJoe Talbott #define IWN_LOCK_ASSERT(_sc) ASSERT_SERIALIZED((_sc)->sc_ifp->if_serializer) 330*3db796acSJoe Talbott #define IWN_UNLOCK(_sc) lwkt_serialize_exit((_sc)->sc_ifp->if_serializer) 331*3db796acSJoe Talbott #define IWN_LOCK_DESTROY(_sc) 332*3db796acSJoe Talbott 333*3db796acSJoe Talbott #if 0 334ffd7c74aSJoe Talbott #define IWN_LOCK_INIT(_sc) \ 335*3db796acSJoe Talbott lockinit(&(_sc)->sc_lock, \ 336*3db796acSJoe Talbott __DECONST(char *, device_get_nameunit((_sc)->sc_dev)), \ 337*3db796acSJoe Talbott 0, LK_CANRECURSE) 338*3db796acSJoe Talbott #define IWN_LOCK(_sc) lockmgr(&(_sc)->sc_lock, LK_EXCLUSIVE) 339*3db796acSJoe Talbott #define IWN_LOCK_ASSERT(_sc) KKASSERT(lockstatus(&(sc)->sc_lock, curthred) != 0) 340*3db796acSJoe Talbott #define IWN_UNLOCK(_sc) lockmgr(&(_sc)->sc_lock, LK_RELEASE) 341*3db796acSJoe Talbott #define IWN_LOCK_DESTROY(_sc) lockuninit(&(_sc)->sc_lock) 342*3db796acSJoe Talbott #endif 343