Date: Mon, 5 Aug 2013 19:23:39 +0200 From: "Cedric GROSS" <cg@cgross.info> To: <freebsd-wireless@freebsd.org> Subject: [iwn] Review split 5 Message-ID: <002d01ce9200$88b19dc0$9a14d940$@info>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hello,
Here is another split.
This one update if_iwnvar.h with new structure for later but also modify
iwn_softc for context selection.
Context will be used later when PAN context will be set in next diff.
uCode TLV detection has been updated also.
Cedric
[-- Attachment #2 --]
Index: sys/dev/iwn/if_iwn.c
===================================================================
--- sys/dev/iwn/if_iwn.c (revision 253965)
+++ sys/dev/iwn/if_iwn.c (working copy)
@@ -1,4 +1,6 @@
/*-
+ * Copyright (c) 2013 Cedric GROSS <c.gross@kreiz-it.fr>
+ * Copyright (c) 2011 Intel Corporation
* Copyright (c) 2007-2009
* Damien Bergamini <damien.bergamini@free.fr>
* Copyright (c) 2008
@@ -521,6 +523,7 @@
/* 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
@@ -894,19 +897,27 @@
{
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. */
@@ -2325,6 +2336,8 @@
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)
@@ -2338,8 +2351,8 @@
* !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) {
@@ -3681,7 +3694,7 @@
if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
type != IEEE80211_FC0_TYPE_DATA)
- tx->id = sc->broadcast_id;
+ tx->id = IWN5000_ID_BROADCAST;
else
tx->id = wn->id;
@@ -3712,7 +3725,7 @@
tx->data_ntries = 15;
tx->lifetime = htole32(IWN_LIFETIME_INFINITE);
tx->rate = iwn_rate_to_plcp(sc, ni, rate);
- if (tx->id == sc->broadcast_id) {
+ if (tx->id == IWN5000_ID_BROADCAST) {
/* Group or management frame. */
tx->linkq = 0;
/* XXX Alternate between antenna A and B? */
@@ -3919,7 +3932,7 @@
tx->len = htole16(totlen);
tx->tid = 0;
- tx->id = sc->broadcast_id;
+ tx->id = IWN5000_ID_BROADCAST;
tx->rts_ntries = params->ibp_try1;
tx->data_ntries = params->ibp_try0;
tx->lifetime = htole32(IWN_LIFETIME_INFINITE);
@@ -4353,9 +4366,11 @@
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;
+ node.id = IWN5000_ID_BROADCAST;
DPRINTF(sc, IWN_DEBUG_RESET, "%s: adding broadcast node\n", __func__);
if ((error = ops->add_node(sc, &node, async)) != 0)
return error;
@@ -4364,7 +4379,7 @@
txant = IWN_LSB(sc->txchainmask);
memset(&linkq, 0, sizeof linkq);
- linkq.id = sc->broadcast_id;
+ linkq.id = IWN5000_ID_BROADCAST;
linkq.antmsk_1stream = txant;
linkq.antmsk_2stream = IWN_ANT_AB;
linkq.ampdu_max = 64;
@@ -4536,8 +4551,9 @@
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);
@@ -4896,8 +4912,8 @@
#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. */
@@ -5426,21 +5442,22 @@
}
/* 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:
@@ -5447,18 +5464,18 @@
/* 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__);
@@ -5529,6 +5546,7 @@
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,
@@ -5560,7 +5578,7 @@
tx = (struct iwn_cmd_data *)(hdr + 1);
tx->flags = htole32(IWN_TX_AUTO_SEQ);
- tx->id = sc->broadcast_id;
+ tx->id = IWN5000_ID_BROADCAST;
tx->lifetime = htole32(IWN_LIFETIME_INFINITE);
if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) {
@@ -5570,7 +5588,7 @@
} 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. */
@@ -5629,7 +5647,7 @@
} 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);
@@ -5642,7 +5660,7 @@
} 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);
@@ -5681,31 +5699,32 @@
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);
@@ -5747,6 +5766,7 @@
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);
@@ -5759,26 +5779,26 @@
}
/* 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);
@@ -5795,11 +5815,11 @@
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__,
@@ -6781,6 +6801,25 @@
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));
Index: sys/dev/iwn/if_iwnvar.h
===================================================================
--- sys/dev/iwn/if_iwnvar.h (revision 253965)
+++ sys/dev/iwn/if_iwnvar.h (working copy)
@@ -2,6 +2,8 @@
/* $OpenBSD: if_iwnvar.h,v 1.18 2010/04/30 16:06:46 damien Exp $ */
/*-
+ * Copyright (c) 2013 Cedric GROSS <cg@cgross.info>
+ * Copyright (c) 2011 Intel Corporation
* Copyright (c) 2007, 2008
* Damien Bergamini <damien.bergamini@free.fr>
* Copyright (c) 2008 Sam Leffler, Errno Consulting
@@ -18,7 +20,39 @@
* 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;
uint64_t wr_tsft;
@@ -191,6 +225,10 @@
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 @@
#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 @@
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_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 @@
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 @@
uint8_t chainmask;
int sc_tx_timer;
+ int sc_scan_timer;
struct ieee80211_tx_ampdu *qid2tap[IWN5000_NTXQUEUES];
@@ -323,9 +373,21 @@
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) \
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?002d01ce9200$88b19dc0$9a14d940$>
