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 <cg@gross.info>
This commit is contained in:
parent
aca5021d5f
commit
da8848ffb4
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=254204
@ -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 @@ 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, const char name[IFNAMSIZ], int unit,
|
||||
{
|
||||
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, enum ieee80211_state nstate, int arg)
|
||||
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, enum ieee80211_state nstate, int arg)
|
||||
* !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 *sc, int async)
|
||||
|
||||
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, struct ieee80211_channel *ch,
|
||||
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 ieee80211vap *vap)
|
||||
|
||||
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 ieee80211vap *vap)
|
||||
|
||||
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 ieee80211vap *vap)
|
||||
}
|
||||
|
||||
/* 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 ieee80211vap *vap)
|
||||
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, struct iwn_fw_info *fw,
|
||||
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));
|
||||
|
@ -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,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) \
|
||||
|
Loading…
Reference in New Issue
Block a user