From owner-svn-src-all@FreeBSD.ORG Sun Aug 11 01:57:55 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 170C2228; Sun, 11 Aug 2013 01:57:55 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 01E6C2A9E; Sun, 11 Aug 2013 01:57:55 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7B1vsos091209; Sun, 11 Aug 2013 01:57:54 GMT (envelope-from adrian@svn.freebsd.org) Received: (from adrian@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7B1vsXY091207; Sun, 11 Aug 2013 01:57:54 GMT (envelope-from adrian@svn.freebsd.org) Message-Id: <201308110157.r7B1vsXY091207@svn.freebsd.org> From: Adrian Chadd Date: Sun, 11 Aug 2013 01:57:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r254204 - head/sys/dev/iwn X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Aug 2013 01:57:55 -0000 Author: adrian Date: Sun Aug 11 01:57:54 2013 New Revision: 254204 URL: http://svnweb.freebsd.org/changeset/base/254204 Log: Prepare for the PAN (personal area network) support for iwn(4). * Break out the single, static RX context into a pointer, and .. * .. extend it to two RX contexts - a default and a PAN context. Whilst here, add a few extra fields in preparation for further iwn(4) work. Tested: * Intel 4965, STA mode - same level of stability * Intel 5100, STA mode - no change Submitted by: Cedric Gross Modified: head/sys/dev/iwn/if_iwn.c head/sys/dev/iwn/if_iwnvar.h Modified: head/sys/dev/iwn/if_iwn.c ============================================================================== --- head/sys/dev/iwn/if_iwn.c Sun Aug 11 01:14:46 2013 (r254203) +++ head/sys/dev/iwn/if_iwn.c Sun Aug 11 01:57:54 2013 (r254204) @@ -1,4 +1,6 @@ /*- + * Copyright (c) 2013 Cedric GROSS + * Copyright (c) 2011 Intel Corporation * Copyright (c) 2007-2009 * Damien Bergamini * Copyright (c) 2008 @@ -521,6 +523,7 @@ iwn_attach(device_t dev) /* Read hardware revision and attach. */ sc->hw_type = (IWN_READ(sc, IWN_HW_REV) >> IWN_HW_REV_TYPE_SHIFT) & IWN_HW_REV_TYPE_MASK; + sc->subdevice_id = pci_get_subdevice(dev); if (sc->hw_type == IWN_HW_REV_TYPE_4965) error = iwn4965_attach(sc, pci_get_device(dev)); else @@ -908,19 +911,27 @@ iwn_vap_create(struct ieee80211com *ic, { struct iwn_vap *ivp; struct ieee80211vap *vap; + uint8_t mac1[IEEE80211_ADDR_LEN]; + struct iwn_softc *sc = ic->ic_ifp->if_softc; if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ return NULL; + + IEEE80211_ADDR_COPY(mac1, mac); + ivp = (struct iwn_vap *) malloc(sizeof(struct iwn_vap), M_80211_VAP, M_NOWAIT | M_ZERO); if (ivp == NULL) return NULL; vap = &ivp->iv_vap; - ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac); + ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac1); + ivp->ctx = IWN_RXON_BSS_CTX; + IEEE80211_ADDR_COPY(ivp->macaddr, mac1); vap->iv_bmissthreshold = 10; /* override default */ /* Override with driver methods. */ ivp->iv_newstate = vap->iv_newstate; vap->iv_newstate = iwn_newstate; + sc->ivap[IWN_RXON_BSS_CTX] = vap; ieee80211_ratectl_init(vap); /* Complete setup. */ @@ -2339,6 +2350,8 @@ iwn_newstate(struct ieee80211vap *vap, e IWN_LOCK(sc); callout_stop(&sc->calib_to); + sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX]; + switch (nstate) { case IEEE80211_S_ASSOC: if (vap->iv_state != IEEE80211_S_RUN) @@ -2352,8 +2365,8 @@ iwn_newstate(struct ieee80211vap *vap, e * !AUTH -> AUTH transition requires state reset to handle * reassociations correctly. */ - sc->rxon.associd = 0; - sc->rxon.filter &= ~htole32(IWN_FILTER_BSS); + sc->rxon->associd = 0; + sc->rxon->filter &= ~htole32(IWN_FILTER_BSS); sc->calib.state = IWN_CALIB_STATE_INIT; if ((error = iwn_auth(sc, vap)) != 0) { @@ -4367,6 +4380,8 @@ iwn_add_broadcast_node(struct iwn_softc DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__); + sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX]; + memset(&node, 0, sizeof node); IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr); node.id = sc->broadcast_id; @@ -4550,8 +4565,9 @@ iwn4965_set_txpower(struct iwn_softc *sc int i, c, grp, maxpwr; uint8_t chan; + sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX]; /* Retrieve current channel from last RXON. */ - chan = sc->rxon.chan; + chan = sc->rxon->chan; DPRINTF(sc, IWN_DEBUG_RESET, "setting TX power for channel %d\n", chan); @@ -4910,8 +4926,8 @@ iwn_collect_noise(struct iwn_softc *sc, #ifdef notyet /* XXX Disable RX chains with no antennas connected. */ - sc->rxon.rxchain = htole16(IWN_RXCHAIN_SEL(sc->chainmask)); - (void)iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 1); + sc->rxon->rxchain = htole16(IWN_RXCHAIN_SEL(sc->chainmask)); + (void)iwn_cmd(sc, IWN_CMD_RXON, sc->rxon, sc->rxonsz, 1); #endif /* Enable power-saving mode if requested by user. */ @@ -5440,39 +5456,40 @@ iwn_config(struct iwn_softc *sc) } /* Set mode, channel, RX filter and enable RX. */ - memset(&sc->rxon, 0, sizeof (struct iwn_rxon)); - IEEE80211_ADDR_COPY(sc->rxon.myaddr, IF_LLADDR(ifp)); - IEEE80211_ADDR_COPY(sc->rxon.wlap, IF_LLADDR(ifp)); - sc->rxon.chan = ieee80211_chan2ieee(ic, ic->ic_curchan); - sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); + sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX]; + memset(sc->rxon, 0, sizeof (struct iwn_rxon)); + IEEE80211_ADDR_COPY(sc->rxon->myaddr, IF_LLADDR(ifp)); + IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp)); + sc->rxon->chan = ieee80211_chan2ieee(ic, ic->ic_curchan); + sc->rxon->flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) - sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); + sc->rxon->flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); switch (ic->ic_opmode) { case IEEE80211_M_STA: - sc->rxon.mode = IWN_MODE_STA; - sc->rxon.filter = htole32(IWN_FILTER_MULTICAST); + sc->rxon->mode = IWN_MODE_STA; + sc->rxon->filter = htole32(IWN_FILTER_MULTICAST); break; case IEEE80211_M_MONITOR: - sc->rxon.mode = IWN_MODE_MONITOR; - sc->rxon.filter = htole32(IWN_FILTER_MULTICAST | + sc->rxon->mode = IWN_MODE_MONITOR; + sc->rxon->filter = htole32(IWN_FILTER_MULTICAST | IWN_FILTER_CTL | IWN_FILTER_PROMISC); break; default: /* Should not get there. */ break; } - sc->rxon.cck_mask = 0x0f; /* not yet negotiated */ - sc->rxon.ofdm_mask = 0xff; /* not yet negotiated */ - sc->rxon.ht_single_mask = 0xff; - sc->rxon.ht_dual_mask = 0xff; - sc->rxon.ht_triple_mask = 0xff; + sc->rxon->cck_mask = 0x0f; /* not yet negotiated */ + sc->rxon->ofdm_mask = 0xff; /* not yet negotiated */ + sc->rxon->ht_single_mask = 0xff; + sc->rxon->ht_dual_mask = 0xff; + sc->rxon->ht_triple_mask = 0xff; rxchain = IWN_RXCHAIN_VALID(sc->rxchainmask) | IWN_RXCHAIN_MIMO_COUNT(2) | IWN_RXCHAIN_IDLE_COUNT(2); - sc->rxon.rxchain = htole16(rxchain); + sc->rxon->rxchain = htole16(rxchain); DPRINTF(sc, IWN_DEBUG_RESET, "%s: setting configuration\n", __func__); - error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 0); + error = iwn_cmd(sc, IWN_CMD_RXON, sc->rxon, sc->rxonsz, 0); if (error != 0) { device_printf(sc->sc_dev, "%s: RXON command failed\n", __func__); @@ -5543,6 +5560,7 @@ iwn_scan(struct iwn_softc *sc) DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__); + sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX]; buf = malloc(IWN_SCAN_MAXSZ, M_DEVBUF, M_NOWAIT | M_ZERO); if (buf == NULL) { device_printf(sc->sc_dev, @@ -5584,7 +5602,7 @@ iwn_scan(struct iwn_softc *sc) } else { hdr->flags = htole32(IWN_RXON_24GHZ | IWN_RXON_AUTO); if (sc->hw_type == IWN_HW_REV_TYPE_4965 && - sc->rxon.associd && sc->rxon.chan > 14) + sc->rxon->associd && sc->rxon->chan > 14) tx->rate = htole32(0xd); else { /* Send probe requests at 1Mbps. */ @@ -5643,7 +5661,7 @@ iwn_scan(struct iwn_softc *sc) } else if (IEEE80211_IS_CHAN_5GHZ(c)) { chan->rf_gain = 0x3b; chan->active = htole16(24); - if (sc->rxon.associd) + if (sc->rxon->associd) chan->passive = htole16(78); else chan->passive = htole16(110); @@ -5656,7 +5674,7 @@ iwn_scan(struct iwn_softc *sc) } else { chan->rf_gain = 0x28; chan->active = htole16(36); - if (sc->rxon.associd) + if (sc->rxon->associd) chan->passive = htole16(88); else chan->passive = htole16(120); @@ -5695,31 +5713,32 @@ iwn_auth(struct iwn_softc *sc, struct ie DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__); + sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX]; /* Update adapter configuration. */ - IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid); - sc->rxon.chan = ieee80211_chan2ieee(ic, ni->ni_chan); - sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); + IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid); + sc->rxon->chan = ieee80211_chan2ieee(ic, ni->ni_chan); + sc->rxon->flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) - sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); + sc->rxon->flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); if (ic->ic_flags & IEEE80211_F_SHSLOT) - sc->rxon.flags |= htole32(IWN_RXON_SHSLOT); + sc->rxon->flags |= htole32(IWN_RXON_SHSLOT); if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) - sc->rxon.flags |= htole32(IWN_RXON_SHPREAMBLE); + sc->rxon->flags |= htole32(IWN_RXON_SHPREAMBLE); if (IEEE80211_IS_CHAN_A(ni->ni_chan)) { - sc->rxon.cck_mask = 0; - sc->rxon.ofdm_mask = 0x15; + sc->rxon->cck_mask = 0; + sc->rxon->ofdm_mask = 0x15; } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) { - sc->rxon.cck_mask = 0x03; - sc->rxon.ofdm_mask = 0; + sc->rxon->cck_mask = 0x03; + sc->rxon->ofdm_mask = 0; } else { /* Assume 802.11b/g. */ - sc->rxon.cck_mask = 0x0f; - sc->rxon.ofdm_mask = 0x15; + sc->rxon->cck_mask = 0x0f; + sc->rxon->ofdm_mask = 0x15; } DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x cck %x ofdm %x\n", - sc->rxon.chan, sc->rxon.flags, sc->rxon.cck_mask, - sc->rxon.ofdm_mask); - error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 1); + sc->rxon->chan, sc->rxon->flags, sc->rxon->cck_mask, + sc->rxon->ofdm_mask); + error = iwn_cmd(sc, IWN_CMD_RXON, sc->rxon, sc->rxonsz, 1); if (error != 0) { device_printf(sc->sc_dev, "%s: RXON command failed, error %d\n", __func__, error); @@ -5761,6 +5780,7 @@ iwn_run(struct iwn_softc *sc, struct iee DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__); + sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX]; if (ic->ic_opmode == IEEE80211_M_MONITOR) { /* Link LED blinks while monitoring. */ iwn_set_led(sc, IWN_LED_LINK, 5, 5); @@ -5773,26 +5793,26 @@ iwn_run(struct iwn_softc *sc, struct iee } /* Update adapter configuration. */ - IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid); - sc->rxon.associd = htole16(IEEE80211_AID(ni->ni_associd)); - sc->rxon.chan = ieee80211_chan2ieee(ic, ni->ni_chan); - sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); + IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid); + sc->rxon->associd = htole16(IEEE80211_AID(ni->ni_associd)); + sc->rxon->chan = ieee80211_chan2ieee(ic, ni->ni_chan); + sc->rxon->flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) - sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); + sc->rxon->flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); if (ic->ic_flags & IEEE80211_F_SHSLOT) - sc->rxon.flags |= htole32(IWN_RXON_SHSLOT); + sc->rxon->flags |= htole32(IWN_RXON_SHSLOT); if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) - sc->rxon.flags |= htole32(IWN_RXON_SHPREAMBLE); + sc->rxon->flags |= htole32(IWN_RXON_SHPREAMBLE); if (IEEE80211_IS_CHAN_A(ni->ni_chan)) { - sc->rxon.cck_mask = 0; - sc->rxon.ofdm_mask = 0x15; + sc->rxon->cck_mask = 0; + sc->rxon->ofdm_mask = 0x15; } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) { - sc->rxon.cck_mask = 0x03; - sc->rxon.ofdm_mask = 0; + sc->rxon->cck_mask = 0x03; + sc->rxon->ofdm_mask = 0; } else { /* Assume 802.11b/g. */ - sc->rxon.cck_mask = 0x0f; - sc->rxon.ofdm_mask = 0x15; + sc->rxon->cck_mask = 0x0f; + sc->rxon->ofdm_mask = 0x15; } if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) { htflags |= IWN_RXON_HT_PROTMODE(ic->ic_curhtprotmode); @@ -5809,11 +5829,11 @@ iwn_run(struct iwn_softc *sc, struct iee if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan)) htflags |= IWN_RXON_HT_HT40MINUS; } - sc->rxon.flags |= htole32(htflags); - sc->rxon.filter |= htole32(IWN_FILTER_BSS); + sc->rxon->flags |= htole32(htflags); + sc->rxon->filter |= htole32(IWN_FILTER_BSS); DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x\n", - sc->rxon.chan, sc->rxon.flags); - error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 1); + sc->rxon->chan, sc->rxon->flags); + error = iwn_cmd(sc, IWN_CMD_RXON, sc->rxon, sc->rxonsz, 1); if (error != 0) { device_printf(sc->sc_dev, "%s: could not update configuration, error %d\n", __func__, @@ -6795,6 +6815,27 @@ iwn_read_firmware_tlv(struct iwn_softc * sc->noise_gain = tmp + 1; } break; + case IWN_FW_TLV_PAN: + sc->sc_flags |= IWN_FLAG_PAN_SUPPORT; + DPRINTF(sc, IWN_DEBUG_RESET, + "PAN Support found: %d\n", 1); + break; + case IWN_FW_TLV_FLAGS : + sc->tlv_feature_flags = htole32(*ptr); + break; + case IWN_FW_TLV_PBREQ_MAXLEN: + case IWN_FW_TLV_RUNT_EVTLOG_PTR: + case IWN_FW_TLV_RUNT_EVTLOG_SIZE: + case IWN_FW_TLV_RUNT_ERRLOG_PTR: + case IWN_FW_TLV_INIT_EVTLOG_PTR: + case IWN_FW_TLV_INIT_EVTLOG_SIZE: + case IWN_FW_TLV_INIT_ERRLOG_PTR: + case IWN_FW_TLV_WOWLAN_INST: + case IWN_FW_TLV_WOWLAN_DATA: + DPRINTF(sc, IWN_DEBUG_RESET, + "TLV type %d reconized but not handled\n", + le16toh(tlv->type)); + break; default: DPRINTF(sc, IWN_DEBUG_RESET, "TLV type %d not handled\n", le16toh(tlv->type)); Modified: head/sys/dev/iwn/if_iwnvar.h ============================================================================== --- head/sys/dev/iwn/if_iwnvar.h Sun Aug 11 01:14:46 2013 (r254203) +++ head/sys/dev/iwn/if_iwnvar.h Sun Aug 11 01:57:54 2013 (r254204) @@ -2,6 +2,8 @@ /* $OpenBSD: if_iwnvar.h,v 1.18 2010/04/30 16:06:46 damien Exp $ */ /*- + * Copyright (c) 2013 Cedric GROSS + * Copyright (c) 2011 Intel Corporation * Copyright (c) 2007, 2008 * Damien Bergamini * Copyright (c) 2008 Sam Leffler, Errno Consulting @@ -18,6 +20,38 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +enum iwn_rxon_ctx_id { + IWN_RXON_BSS_CTX, + IWN_RXON_PAN_CTX, + IWN_NUM_RXON_CTX +}; + +struct iwn_pan_slot { + uint16_t time; + uint8_t type; + uint8_t reserved; +} __packed; + +struct iwn_pan_params_cmd { + uint16_t flags; +#define IWN_PAN_PARAMS_FLG_SLOTTED_MODE (1 << 3) + + uint8_t reserved; + uint8_t num_slots; + struct iwn_pan_slot slots[10]; +} __packed; + +struct iwn_led_mode +{ + uint8_t led_cur_mode; + uint64_t led_cur_bt; + uint64_t led_last_bt; + uint64_t led_cur_tpt; + uint64_t led_last_tpt; + uint64_t led_bt_diff; + int led_cur_time; + int led_last_time; +}; struct iwn_rx_radiotap_header { struct ieee80211_radiotap_header wr_ihdr; @@ -191,6 +225,10 @@ struct iwn_vap { int (*iv_newstate)(struct ieee80211vap *, enum ieee80211_state, int); + int ctx; + int beacon_int; + uint8_t macaddr[IEEE80211_ADDR_LEN]; + }; #define IWN_VAP(_vap) ((struct iwn_vap *)(_vap)) @@ -210,8 +248,11 @@ struct iwn_softc { #define IWN_FLAG_HAS_11N (1 << 6) #define IWN_FLAG_ENH_SENS (1 << 7) #define IWN_FLAG_ADV_BTCOEX (1 << 8) +#define IWN_FLAG_PAN_SUPPORT (1 << 9) uint8_t hw_type; + /* subdevice_id used to adjust configuration */ + uint16_t subdevice_id; struct iwn_ops ops; const char *fwname; @@ -272,7 +313,7 @@ struct iwn_softc { int calib_cnt; struct iwn_calib_state calib; struct callout watchdog_to; - + struct callout ct_kill_exit_to; struct iwn_fw_info fw; struct iwn_calib_info calibcmd[5]; uint32_t errptr; @@ -280,7 +321,12 @@ struct iwn_softc { struct iwn_rx_stat last_rx_stat; int last_rx_valid; struct iwn_ucode_info ucode_info; - struct iwn_rxon rxon; + struct iwn_rxon rx_on[IWN_NUM_RXON_CTX]; + struct iwn_rxon *rxon; + int ctx; + struct ieee80211vap *ivap[IWN_NUM_RXON_CTX]; + + uint8_t uc_scan_progress; uint32_t rawtemp; int temp; int noise; @@ -295,11 +341,14 @@ struct iwn_softc { char eeprom_domain[4]; uint32_t eeprom_crystal; int16_t eeprom_temp; + int16_t eeprom_temp_high; int16_t eeprom_voltage; int8_t maxpwr2GHz; int8_t maxpwr5GHz; int8_t maxpwr[IEEE80211_CHAN_MAX]; + uint32_t tlv_feature_flags; + int32_t temp_off; uint32_t int_mask; uint8_t ntxchains; @@ -309,6 +358,7 @@ struct iwn_softc { uint8_t chainmask; int sc_tx_timer; + int sc_scan_timer; struct ieee80211_tx_ampdu *qid2tap[IWN5000_NTXQUEUES]; @@ -323,9 +373,22 @@ struct iwn_softc { void (*sc_addba_stop)(struct ieee80211_node *, struct ieee80211_tx_ampdu *); + struct iwn_led_mode sc_led; struct iwn_rx_radiotap_header sc_rxtap; struct iwn_tx_radiotap_header sc_txtap; + + /* The power save level originally configured by user */ + int desired_pwrsave_level; + + /* + * The current power save level, this may differ from the + * configured value due to thermal throttling etc. + */ + int current_pwrsave_level; + + /* For specifique params */ + struct iwn_base_params *base_params; }; #define IWN_LOCK_INIT(_sc) \