Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/iwn/if_iwn.c
Show First 20 Lines • Show All 4,444 Lines • ▼ Show 20 Lines | iwn_check_rate_needs_protection(struct iwn_softc *sc, | ||||
*/ | */ | ||||
if (! IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { | if (! IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { | ||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
* 11bg protection not enabled? Then don't use it. | * 11bg protection not enabled? Then don't use it. | ||||
*/ | */ | ||||
if ((ic->ic_flags & IEEE80211_F_USEPROT) == 0) | if ((vap->iv_flags & IEEE80211_F_USEPROT) == 0) | ||||
return (0); | return (0); | ||||
/* | /* | ||||
* If it's an 11n rate - no protection. | * If it's an 11n rate - no protection. | ||||
* We'll do it via a specific 11n check. | * We'll do it via a specific 11n check. | ||||
*/ | */ | ||||
if (rate & IEEE80211_RATE_MCS) { | if (rate & IEEE80211_RATE_MCS) { | ||||
return (0); | return (0); | ||||
▲ Show 20 Lines • Show All 469 Lines • ▼ Show 20 Lines | if (error != 0) { | ||||
return 0; | return 0; | ||||
} | } | ||||
} | } | ||||
data->m = m; | data->m = m; | ||||
data->ni = ni; | data->ni = ni; | ||||
DPRINTF(sc, IWN_DEBUG_XMIT, "%s: qid %d idx %d len %d nsegs %d " | DPRINTF(sc, IWN_DEBUG_XMIT, "%s: qid %d idx %d len %d nsegs %d " | ||||
"plcp %d\n", | "plcp 0x%x\n", | ||||
__func__, ring->qid, ring->cur, totlen, nsegs, tx->rate); | __func__, ring->qid, ring->cur, totlen, nsegs, tx->rate); | ||||
/* Fill TX descriptor. */ | /* Fill TX descriptor. */ | ||||
desc->nsegs = 1; | desc->nsegs = 1; | ||||
if (m->m_len != 0) | if (m->m_len != 0) | ||||
desc->nsegs += nsegs; | desc->nsegs += nsegs; | ||||
/* First DMA segment is used by the TX command. */ | /* First DMA segment is used by the TX command. */ | ||||
desc->segs[0].addr = htole32(IWN_LOADDR(data->cmd_paddr)); | desc->segs[0].addr = htole32(IWN_LOADDR(data->cmd_paddr)); | ||||
▲ Show 20 Lines • Show All 1,701 Lines • ▼ Show 20 Lines | iwn5000_runtime_calib(struct iwn_softc *sc) | ||||
cmd.ucode.once.enable = 0xffffffff; | cmd.ucode.once.enable = 0xffffffff; | ||||
cmd.ucode.once.start = IWN5000_CALIB_DC; | cmd.ucode.once.start = IWN5000_CALIB_DC; | ||||
DPRINTF(sc, IWN_DEBUG_CALIBRATE, | DPRINTF(sc, IWN_DEBUG_CALIBRATE, | ||||
"%s: configuring runtime calibration\n", __func__); | "%s: configuring runtime calibration\n", __func__); | ||||
return iwn_cmd(sc, IWN5000_CMD_CALIB_CONFIG, &cmd, sizeof(cmd), 0); | return iwn_cmd(sc, IWN5000_CMD_CALIB_CONFIG, &cmd, sizeof(cmd), 0); | ||||
} | } | ||||
static uint32_t | static uint32_t | ||||
iwn_get_rxon_ht_flags(struct iwn_softc *sc, struct ieee80211_channel *c) | iwn_get_rxon_ht_flags(struct iwn_softc *sc, struct ieee80211vap *vap, | ||||
struct ieee80211_channel *c) | |||||
{ | { | ||||
struct ieee80211com *ic = &sc->sc_ic; | |||||
uint32_t htflags = 0; | uint32_t htflags = 0; | ||||
if (! IEEE80211_IS_CHAN_HT(c)) | if (! IEEE80211_IS_CHAN_HT(c)) | ||||
return (0); | return (0); | ||||
htflags |= IWN_RXON_HT_PROTMODE(ic->ic_curhtprotmode); | htflags |= IWN_RXON_HT_PROTMODE(vap->iv_curhtprotmode); | ||||
if (IEEE80211_IS_CHAN_HT40(c)) { | if (IEEE80211_IS_CHAN_HT40(c)) { | ||||
switch (ic->ic_curhtprotmode) { | switch (vap->iv_curhtprotmode) { | ||||
case IEEE80211_HTINFO_OPMODE_HT20PR: | case IEEE80211_HTINFO_OPMODE_HT20PR: | ||||
htflags |= IWN_RXON_HT_MODEPURE40; | htflags |= IWN_RXON_HT_MODEPURE40; | ||||
break; | break; | ||||
default: | default: | ||||
htflags |= IWN_RXON_HT_MODEMIXED; | htflags |= IWN_RXON_HT_MODEMIXED; | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 230 Lines • ▼ Show 20 Lines | rxchain = | ||||
IWN_RXCHAIN_IDLE_COUNT(sc->nrxchains); | IWN_RXCHAIN_IDLE_COUNT(sc->nrxchains); | ||||
sc->rxon->rxchain = htole16(rxchain); | sc->rxon->rxchain = htole16(rxchain); | ||||
DPRINTF(sc, IWN_DEBUG_RESET | IWN_DEBUG_XMIT, | DPRINTF(sc, IWN_DEBUG_RESET | IWN_DEBUG_XMIT, | ||||
"%s: rxchainmask=0x%x, nrxchains=%d\n", | "%s: rxchainmask=0x%x, nrxchains=%d\n", | ||||
__func__, | __func__, | ||||
sc->rxchainmask, | sc->rxchainmask, | ||||
sc->nrxchains); | sc->nrxchains); | ||||
sc->rxon->flags |= htole32(iwn_get_rxon_ht_flags(sc, ic->ic_curchan)); | sc->rxon->flags |= htole32(iwn_get_rxon_ht_flags(sc, vap, ic->ic_curchan)); | ||||
DPRINTF(sc, IWN_DEBUG_RESET, | DPRINTF(sc, IWN_DEBUG_RESET, | ||||
"%s: setting configuration; flags=0x%08x\n", | "%s: setting configuration; flags=0x%08x\n", | ||||
__func__, le32toh(sc->rxon->flags)); | __func__, le32toh(sc->rxon->flags)); | ||||
if ((error = iwn_send_rxon(sc, 0, 0)) != 0) { | if ((error = iwn_send_rxon(sc, 0, 0)) != 0) { | ||||
device_printf(sc->sc_dev, "%s: could not send RXON\n", | device_printf(sc->sc_dev, "%s: could not send RXON\n", | ||||
__func__); | __func__); | ||||
return error; | return error; | ||||
▲ Show 20 Lines • Show All 356 Lines • ▼ Show 20 Lines | iwn_auth(struct iwn_softc *sc, struct ieee80211vap *vap) | ||||
sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX]; | sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX]; | ||||
/* Update adapter configuration. */ | /* Update adapter configuration. */ | ||||
IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid); | IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid); | ||||
sc->rxon->chan = ieee80211_chan2ieee(ic, ni->ni_chan); | sc->rxon->chan = ieee80211_chan2ieee(ic, ni->ni_chan); | ||||
sc->rxon->flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); | sc->rxon->flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); | ||||
if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) | 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) | |||||
/* | |||||
* We always set short slot on 5GHz channels. | |||||
* We optionally set it for 2.4GHz channels. | |||||
*/ | |||||
if (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan)) | |||||
sc->rxon->flags |= htole32(IWN_RXON_SHSLOT); | sc->rxon->flags |= htole32(IWN_RXON_SHSLOT); | ||||
if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) | else if (vap->iv_flags & IEEE80211_F_SHSLOT) | ||||
sc->rxon->flags |= htole32(IWN_RXON_SHSLOT); | |||||
if (vap->iv_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)) { | if (IEEE80211_IS_CHAN_A(ni->ni_chan)) { | ||||
sc->rxon->cck_mask = 0; | sc->rxon->cck_mask = 0; | ||||
sc->rxon->ofdm_mask = 0x15; | sc->rxon->ofdm_mask = 0x15; | ||||
} else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) { | } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) { | ||||
sc->rxon->cck_mask = 0x03; | sc->rxon->cck_mask = 0x03; | ||||
sc->rxon->ofdm_mask = 0; | sc->rxon->ofdm_mask = 0; | ||||
} else { | } else { | ||||
/* Assume 802.11b/g. */ | /* Assume 802.11b/g. */ | ||||
sc->rxon->cck_mask = 0x03; | sc->rxon->cck_mask = 0x03; | ||||
sc->rxon->ofdm_mask = 0x15; | sc->rxon->ofdm_mask = 0x15; | ||||
} | } | ||||
/* try HT */ | /* try HT */ | ||||
sc->rxon->flags |= htole32(iwn_get_rxon_ht_flags(sc, ic->ic_curchan)); | sc->rxon->flags |= htole32(iwn_get_rxon_ht_flags(sc, vap, ic->ic_curchan)); | ||||
DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x cck %x ofdm %x\n", | 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->chan, sc->rxon->flags, sc->rxon->cck_mask, | ||||
sc->rxon->ofdm_mask); | sc->rxon->ofdm_mask); | ||||
if ((error = iwn_send_rxon(sc, 0, 1)) != 0) { | if ((error = iwn_send_rxon(sc, 0, 1)) != 0) { | ||||
device_printf(sc->sc_dev, "%s: could not send RXON\n", | device_printf(sc->sc_dev, "%s: could not send RXON\n", | ||||
__func__); | __func__); | ||||
Show All 30 Lines | iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) | ||||
/* Update adapter configuration. */ | /* Update adapter configuration. */ | ||||
IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid); | IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid); | ||||
sc->rxon->associd = htole16(IEEE80211_AID(ni->ni_associd)); | sc->rxon->associd = htole16(IEEE80211_AID(ni->ni_associd)); | ||||
sc->rxon->chan = ieee80211_chan2ieee(ic, ni->ni_chan); | sc->rxon->chan = ieee80211_chan2ieee(ic, ni->ni_chan); | ||||
sc->rxon->flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); | sc->rxon->flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); | ||||
if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) | 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) | |||||
/* As previously - short slot only on 5GHz */ | |||||
if (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan)) | |||||
sc->rxon->flags |= htole32(IWN_RXON_SHSLOT); | sc->rxon->flags |= htole32(IWN_RXON_SHSLOT); | ||||
if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) | else if (vap->iv_flags & IEEE80211_F_SHSLOT) | ||||
sc->rxon->flags |= htole32(IWN_RXON_SHSLOT); | |||||
if (vap->iv_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)) { | if (IEEE80211_IS_CHAN_A(ni->ni_chan)) { | ||||
sc->rxon->cck_mask = 0; | sc->rxon->cck_mask = 0; | ||||
sc->rxon->ofdm_mask = 0x15; | sc->rxon->ofdm_mask = 0x15; | ||||
} else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) { | } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) { | ||||
sc->rxon->cck_mask = 0x03; | sc->rxon->cck_mask = 0x03; | ||||
sc->rxon->ofdm_mask = 0; | sc->rxon->ofdm_mask = 0; | ||||
} else { | } else { | ||||
/* Assume 802.11b/g. */ | /* Assume 802.11b/g. */ | ||||
sc->rxon->cck_mask = 0x0f; | sc->rxon->cck_mask = 0x0f; | ||||
sc->rxon->ofdm_mask = 0x15; | sc->rxon->ofdm_mask = 0x15; | ||||
} | } | ||||
/* try HT */ | /* try HT */ | ||||
sc->rxon->flags |= htole32(iwn_get_rxon_ht_flags(sc, ni->ni_chan)); | sc->rxon->flags |= htole32(iwn_get_rxon_ht_flags(sc, vap, ni->ni_chan)); | ||||
sc->rxon->filter |= htole32(IWN_FILTER_BSS); | sc->rxon->filter |= htole32(IWN_FILTER_BSS); | ||||
DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x, curhtprotmode=%d\n", | DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x, curhtprotmode=%d\n", | ||||
sc->rxon->chan, le32toh(sc->rxon->flags), ic->ic_curhtprotmode); | sc->rxon->chan, le32toh(sc->rxon->flags), vap->iv_curhtprotmode); | ||||
if ((error = iwn_send_rxon(sc, 0, 1)) != 0) { | if ((error = iwn_send_rxon(sc, 0, 1)) != 0) { | ||||
device_printf(sc->sc_dev, "%s: could not send RXON\n", | device_printf(sc->sc_dev, "%s: could not send RXON\n", | ||||
__func__); | __func__); | ||||
return error; | return error; | ||||
} | } | ||||
/* Fake a join to initialize the TX rate. */ | /* Fake a join to initialize the TX rate. */ | ||||
▲ Show 20 Lines • Show All 1,847 Lines • Show Last 20 Lines |