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 <c...@gross.info>

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 <c.gr...@kreiz-it.fr>
+ * Copyright (c) 2011 Intel Corporation
  * Copyright (c) 2007-2009
  *     Damien Bergamini <damien.bergam...@free.fr>
  * 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 <c...@cgross.info>
+ * Copyright (c) 2011 Intel Corporation
  * Copyright (c) 2007, 2008
  *     Damien Bergamini <damien.bergam...@free.fr>
  * 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) \
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to