Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/iwi/if_iwi.c
Show First 20 Lines • Show All 914 Lines • ▼ Show 20 Lines | iwi_cvtrate(int iwirate) | ||||
case IWI_RATE_OFDM36: return 72; | case IWI_RATE_OFDM36: return 72; | ||||
case IWI_RATE_OFDM48: return 96; | case IWI_RATE_OFDM48: return 96; | ||||
case IWI_RATE_OFDM54: return 108; | case IWI_RATE_OFDM54: return 108; | ||||
} | } | ||||
return 0; | return 0; | ||||
} | } | ||||
/* | /* | ||||
* Convert h/w rate code to global rate index. | |||||
*/ | |||||
static uint16_t | |||||
iwi_cvtrate_idx(uint32_t iwirate) | |||||
{ | |||||
switch (iwirate) { | |||||
case IWI_RATE_DS1: return IEEE80211_RATE_INDEX_CCK1; | |||||
case IWI_RATE_DS2: return IEEE80211_RATE_INDEX_CCK2; | |||||
case IWI_RATE_DS5: return IEEE80211_RATE_INDEX_CCK5; | |||||
case IWI_RATE_DS11: return IEEE80211_RATE_INDEX_CCK11; | |||||
case IWI_RATE_OFDM6: return IEEE80211_RATE_INDEX_OFDM6; | |||||
case IWI_RATE_OFDM9: return IEEE80211_RATE_INDEX_OFDM9; | |||||
case IWI_RATE_OFDM12: return IEEE80211_RATE_INDEX_OFDM12; | |||||
case IWI_RATE_OFDM18: return IEEE80211_RATE_INDEX_OFDM18; | |||||
case IWI_RATE_OFDM24: return IEEE80211_RATE_INDEX_OFDM24; | |||||
case IWI_RATE_OFDM36: return IEEE80211_RATE_INDEX_OFDM36; | |||||
case IWI_RATE_OFDM48: return IEEE80211_RATE_INDEX_OFDM48; | |||||
case IWI_RATE_OFDM54: return IEEE80211_RATE_INDEX_OFDM54; | |||||
default: return IEEE80211_RATE_NONEXISTENT; | |||||
} | |||||
} | |||||
/* | |||||
* The firmware automatically adapts the transmit speed. We report its current | * The firmware automatically adapts the transmit speed. We report its current | ||||
* value here. | * value here. | ||||
*/ | */ | ||||
static void | static void | ||||
iwi_media_status(struct ifnet *ifp, struct ifmediareq *imr) | iwi_media_status(struct ifnet *ifp, struct ifmediareq *imr) | ||||
{ | { | ||||
struct ieee80211vap *vap = ifp->if_softc; | struct ieee80211vap *vap = ifp->if_softc; | ||||
struct ieee80211com *ic = vap->iv_ic; | struct ieee80211com *ic = vap->iv_ic; | ||||
struct iwi_softc *sc = ic->ic_softc; | struct iwi_softc *sc = ic->ic_softc; | ||||
struct ieee80211_node *ni; | struct ieee80211_node *ni; | ||||
uint32_t reg; | |||||
/* read current transmission rate from adapter */ | /* read current transmission rate from adapter */ | ||||
reg = CSR_READ_4(sc, IWI_CSR_CURRENT_TX_RATE); | |||||
ni = ieee80211_ref_node(vap->iv_bss); | ni = ieee80211_ref_node(vap->iv_bss); | ||||
ni->ni_txrate = | ni->ni_txrate = iwi_cvtrate_idx(reg); | ||||
iwi_cvtrate(CSR_READ_4(sc, IWI_CSR_CURRENT_TX_RATE)); | |||||
ieee80211_free_node(ni); | ieee80211_free_node(ni); | ||||
ieee80211_media_status(ifp, imr); | ieee80211_media_status(ifp, imr); | ||||
} | } | ||||
static int | static int | ||||
iwi_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) | iwi_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) | ||||
{ | { | ||||
struct iwi_vap *ivp = IWI_VAP(vap); | struct iwi_vap *ivp = IWI_VAP(vap); | ||||
▲ Show 20 Lines • Show All 1,602 Lines • ▼ Show 20 Lines | iwi_setwepkeys(struct iwi_softc *sc, struct ieee80211vap *vap) | ||||
} | } | ||||
return 0; | return 0; | ||||
} | } | ||||
static int | static int | ||||
iwi_set_rateset(struct iwi_softc *sc, const struct ieee80211_rateset *net_rs, | iwi_set_rateset(struct iwi_softc *sc, const struct ieee80211_rateset *net_rs, | ||||
int mode, int type) | int mode, int type) | ||||
{ | { | ||||
const struct ieee80211_rate_t *rate; | |||||
struct iwi_rateset rs; | struct iwi_rateset rs; | ||||
int i; | |||||
memset(&rs, 0, sizeof(rs)); | memset(&rs, 0, sizeof(rs)); | ||||
rs.mode = mode; | rs.mode = mode; | ||||
rs.type = type; | rs.type = type; | ||||
rs.nrates = net_rs->rs_nrates; | rs.nrates = net_rs->rs_nrates; | ||||
if (rs.nrates > nitems(rs.rates)) { | if (rs.nrates > nitems(rs.rates)) { | ||||
DPRINTF(("Truncating negotiated rate set from %u\n", | DPRINTF(("Truncating negotiated rate set from %u\n", | ||||
rs.nrates)); | rs.nrates)); | ||||
rs.nrates = nitems(rs.rates); | rs.nrates = nitems(rs.rates); | ||||
} | } | ||||
memcpy(rs.rates, net_rs->rs_rates, rs.nrates); | for (i = 0; i < rs.nrates; i++) { | ||||
rate = ieee80211_get_rate(net_rs->rates[i].rs_index); | |||||
rs.rates[i] = rate->value; | |||||
} | |||||
DPRINTF(("Setting .11%c%s %s rates (%u)\n", | DPRINTF(("Setting .11%c%s %s rates (%u)\n", | ||||
mode == IWI_MODE_11A ? 'a' : 'b', | mode == IWI_MODE_11A ? 'a' : 'b', | ||||
mode == IWI_MODE_11G ? "g" : "", | mode == IWI_MODE_11G ? "g" : "", | ||||
type == IWI_RATESET_TYPE_SUPPORTED ? "supported" : "negotiated", | type == IWI_RATESET_TYPE_SUPPORTED ? "supported" : "negotiated", | ||||
rs.nrates)); | rs.nrates)); | ||||
return (iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof(rs))); | return (iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof(rs))); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | if (ic->ic_opmode == IEEE80211_M_IBSS) { | ||||
power.mode = IWI_MODE_11G; | power.mode = IWI_MODE_11G; | ||||
DPRINTF(("Setting .11g channels tx power\n")); | DPRINTF(("Setting .11g channels tx power\n")); | ||||
error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power); | error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power); | ||||
if (error != 0) | if (error != 0) | ||||
return error; | return error; | ||||
} | } | ||||
error = iwi_set_rateset(sc, &ic->ic_sup_rates[IEEE80211_MODE_11G], | error = iwi_set_rateset(sc, ic->ic_sup_rates[IEEE80211_MODE_11G], | ||||
IWI_MODE_11G, IWI_RATESET_TYPE_SUPPORTED); | IWI_MODE_11G, IWI_RATESET_TYPE_SUPPORTED); | ||||
if (error != 0) | if (error != 0) | ||||
return error; | return error; | ||||
error = iwi_set_rateset(sc, &ic->ic_sup_rates[IEEE80211_MODE_11A], | error = iwi_set_rateset(sc, ic->ic_sup_rates[IEEE80211_MODE_11A], | ||||
IWI_MODE_11A, IWI_RATESET_TYPE_SUPPORTED); | IWI_MODE_11A, IWI_RATESET_TYPE_SUPPORTED); | ||||
if (error != 0) | if (error != 0) | ||||
return error; | return error; | ||||
data = htole32(arc4random()); | data = htole32(arc4random()); | ||||
DPRINTF(("Setting initialization vector to %u\n", le32toh(data))); | DPRINTF(("Setting initialization vector to %u\n", le32toh(data))); | ||||
error = iwi_cmd(sc, IWI_CMD_SET_IV, &data, sizeof data); | error = iwi_cmd(sc, IWI_CMD_SET_IV, &data, sizeof data); | ||||
if (error != 0) | if (error != 0) | ||||
▲ Show 20 Lines • Show All 977 Lines • Show Last 20 Lines |