madwifi: improve autochannel, nuke some dead code, fix scanlist building from channel mode

SVN-Revision: 15702
owl
Felix Fietkau 2009-05-07 21:00:35 +00:00
parent 3dea7e450f
commit a8a91697ce
15 changed files with 197 additions and 74 deletions

View File

@ -16,10 +16,14 @@
sc->sc_curchan.channel = ic->ic_curchan->ic_freq; sc->sc_curchan.channel = ic->ic_curchan->ic_freq;
sc->sc_curchan.channelFlags = ath_chan2flags(ic->ic_curchan); sc->sc_curchan.channelFlags = ath_chan2flags(ic->ic_curchan);
if (!ath_hal_reset(ah, sc->sc_opmode, &sc->sc_curchan, AH_FALSE, &status)) { if (!ath_hal_reset(ah, sc->sc_opmode, &sc->sc_curchan, AH_FALSE, &status)) {
@@ -2914,6 +2916,40 @@ ath_hw_check_atim(struct ath_softc *sc, @@ -2913,6 +2915,48 @@ ath_hw_check_atim(struct ath_softc *sc,
return 0;
} }
+#define AR5K_MIBC 0x0040
+#define AR5K_MIBC_FREEZE (1 << 1)
+#define AR5K_TXFC 0x80ec
+#define AR5K_RXFC 0x80f0
+#define AR5K_RXCLEAR 0x80f4 +#define AR5K_RXCLEAR 0x80f4
+#define AR5K_CYCLES 0x80f8 +#define AR5K_CYCLES 0x80f8
+static void +static void
@ -36,13 +40,15 @@
+ if (!ic->ic_curchan || (ic->ic_curchan == IEEE80211_CHAN_ANYC)) + if (!ic->ic_curchan || (ic->ic_curchan == IEEE80211_CHAN_ANYC))
+ return; + return;
+ +
+ OS_REG_WRITE(ah, AR5K_MIBC, AR5K_MIBC_FREEZE);
+ rx = OS_REG_READ(ah, AR5K_RXCLEAR); + rx = OS_REG_READ(ah, AR5K_RXCLEAR);
+ cc = OS_REG_READ(ah, AR5K_CYCLES); + cc = OS_REG_READ(ah, AR5K_CYCLES);
+
+ if (!cc) + if (!cc)
+ return; + return;
+ +
+ if (rx > cc) + if (rx > cc)
+ return; /* wraparound */ + return; /* should not happen */
+ +
+ if (sc->sc_last_chan) + if (sc->sc_last_chan)
+ sc->sc_last_chan->ic_idletime = 100 * (cc - rx) / cc; + sc->sc_last_chan->ic_idletime = 100 * (cc - rx) / cc;
@ -50,14 +56,16 @@
+ +
+ OS_REG_WRITE(ah, AR5K_RXCLEAR, 0); + OS_REG_WRITE(ah, AR5K_RXCLEAR, 0);
+ OS_REG_WRITE(ah, AR5K_CYCLES, 0); + OS_REG_WRITE(ah, AR5K_CYCLES, 0);
+ OS_REG_WRITE(ah, AR5K_TXFC, 0);
+ OS_REG_WRITE(ah, AR5K_RXFC, 0);
+ OS_REG_WRITE(ah, AR5K_MIBC, 0);
+} +}
+#undef AR5K_RXCLEAR +#undef AR5K_RXCLEAR
+#undef AR5K_CYCLES +#undef AR5K_CYCLES
+
/* /*
* Reset the hardware w/o losing operational state. This is * Reset the hardware w/o losing operational state. This is
* basically a more efficient way of doing ath_stop, ath_init, @@ -2940,6 +2984,7 @@ ath_reset(struct net_device *dev)
@@ -2940,6 +2976,7 @@ ath_reset(struct net_device *dev)
* Convert to a HAL channel description with the flags * Convert to a HAL channel description with the flags
* constrained to reflect the current operating mode. * constrained to reflect the current operating mode.
*/ */
@ -65,14 +73,29 @@
c = ic->ic_curchan; c = ic->ic_curchan;
sc->sc_curchan.channel = c->ic_freq; sc->sc_curchan.channel = c->ic_freq;
sc->sc_curchan.channelFlags = ath_chan2flags(c); sc->sc_curchan.channelFlags = ath_chan2flags(c);
@@ -9022,6 +9059,7 @@ ath_chan_set(struct ath_softc *sc, struc @@ -9022,6 +9067,7 @@ ath_chan_set(struct ath_softc *sc, struc
u_int8_t channel_change_required = 0; u_int8_t channel_change_required = 0;
struct timeval tv; struct timeval tv;
+ ath_fetch_idle_time(sc); +
/* /*
* Convert to a HAL channel description with * Convert to a HAL channel description with
* the flags constrained to reflect the current * the flags constrained to reflect the current
@@ -9030,6 +9076,14 @@ ath_chan_set(struct ath_softc *sc, struc
memset(&hchan, 0, sizeof(HAL_CHANNEL));
hchan.channel = chan->ic_freq;
hchan.channelFlags = ath_chan2flags(chan);
+
+ /* don't do duplicate channel changes, but do
+ * store the available idle time */
+ ath_fetch_idle_time(sc);
+ if ((sc->sc_curchan.channel == hchan.channel) &&
+ (sc->sc_curchan.channelFlags == hchan.channelFlags))
+ return 0;
+
KASSERT(hchan.channel != 0,
("bogus channel %u/0x%x", hchan.channel, hchan.channelFlags));
do_gettimeofday(&tv);
--- a/ath/if_athvar.h --- a/ath/if_athvar.h
+++ b/ath/if_athvar.h +++ b/ath/if_athvar.h
@@ -773,6 +773,7 @@ struct ath_softc { @@ -773,6 +773,7 @@ struct ath_softc {
@ -123,3 +146,103 @@
EVALUATE_CRITERION(sc, ic, a, b); EVALUATE_CRITERION(sc, ic, a, b);
/* XXX: rssi useless? pick_channel evaluates it anyway */ /* XXX: rssi useless? pick_channel evaluates it anyway */
EVALUATE_CRITERION(rssi, params->ss->ss_priv, a, b); EVALUATE_CRITERION(rssi, params->ss->ss_priv, a, b);
@@ -519,16 +533,9 @@ pick_channel(struct ieee80211_scan_state
#endif
best = NULL;
- best_rssi = 0xff; /* If signal is bigger than 0xff, we'd be melting. */
for (i = 0; i < ss_last; i++) {
c = &chans[i];
- benefit = best_rssi - as->as_maxrssi[c->chan->ic_ieee];
- sta_assoc = ic->ic_sta_assoc;
-
- /* Don't switch... */
- if (benefit <= 0)
- continue;
/* Verify channel is not marked for non-occupancy */
if (IEEE80211_IS_CHAN_RADAR(c->chan))
@@ -546,31 +553,8 @@ pick_channel(struct ieee80211_scan_state
break;
}
- if (sta_assoc != 0) {
- int sl = ic->ic_cn_total -
- ic->ic_chan_nodes[c->chan->ic_ieee]; /* count */
- if (ic->ic_sc_algorithm == IEEE80211_SC_LOOSE) {
- int sl_max = ic->ic_sc_sldg * benefit;
- sl = 1000 * sl / sta_assoc; /* permil */
- IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
- "%s: chan %d, dB gained: %d, "
- "STAs lost: %d permil (max %d)\n",
- __func__, c->chan->ic_ieee,
- benefit, sl, sl_max);
- if (sl > sl_max)
- continue;
- } else if (((ic->ic_sc_algorithm ==
- IEEE80211_SC_TIGHT) ||
- (ic->ic_sc_algorithm ==
- IEEE80211_SC_STRICT)) &&
- (sl > 0)) {
- /* Break the loop as the subsequent chans
- * won't be better. */
- break;
- }
- }
best = c->chan;
- best_rssi = as->as_maxrssi[best->ic_ieee];
+ break;
}
if (best != NULL) {
@@ -599,6 +583,9 @@ ap_end(struct ieee80211_scan_state *ss,
("wrong opmode %u", vap->iv_opmode));
ic = vap->iv_ic;
+
+ /* record stats for the channel that was scanned last */
+ ic->ic_set_channel(ic);
bestchan = pick_channel(ss, vap, flags);
if (bestchan == NULL) {
if (ss->ss_last > 0) {
--- a/net80211/ieee80211_scan.c
+++ b/net80211/ieee80211_scan.c
@@ -1002,20 +1002,33 @@ ieee80211_scan_add_channels(struct ieee8
{
struct ieee80211_channel *c, *cg;
u_int modeflags;
+ int has_non_turbo = 0;
int i;
KASSERT(mode < ARRAY_SIZE(chanflags), ("Unexpected mode %u", mode));
modeflags = chanflags[mode];
for (i = 0; i < ic->ic_nchans; i++) {
+ if (c->ic_flags & (IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO))
+ continue;
+
+ has_non_turbo = 1;
+ break;
+ }
+ for (i = 0; i < ic->ic_nchans; i++) {
c = &ic->ic_channels[i];
if (c == NULL || isclr(ic->ic_chan_active, c->ic_ieee))
continue;
if (c->ic_scanflags & IEEE80211_NOSCAN_SET)
continue;
- if (modeflags &&
- ((c->ic_flags & IEEE80211_CHAN_ALLTURBO) !=
- (modeflags & IEEE80211_CHAN_ALLTURBO)))
- continue;
+ if (modeflags) {
+ if ((c->ic_flags & IEEE80211_CHAN_ALLTURBO) !=
+ (modeflags & IEEE80211_CHAN_ALLTURBO))
+ continue;
+ } else if (has_non_turbo) {
+ if ((ss->ss_vap->iv_opmode == IEEE80211_M_HOSTAP) &&
+ (c->ic_flags & (IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO)))
+ continue;
+ }
if (mode == IEEE80211_MODE_AUTO) {
/*
* XXX special-case 11b/g channels so we select

View File

@ -319,7 +319,7 @@
--- a/ath/if_ath.c --- a/ath/if_ath.c
+++ b/ath/if_ath.c +++ b/ath/if_ath.c
@@ -6580,9 +6580,8 @@ ath_recv_mgmt(struct ieee80211vap * vap, @@ -6588,9 +6588,8 @@ ath_recv_mgmt(struct ieee80211vap * vap,
sc->sc_recv_mgmt(vap, ni_or_null, skb, subtype, rssi, rtsf); sc->sc_recv_mgmt(vap, ni_or_null, skb, subtype, rssi, rtsf);
@ -330,7 +330,7 @@
(const struct ieee80211_frame_min *)skb->data); (const struct ieee80211_frame_min *)skb->data);
if (ni == NULL) { if (ni == NULL) {
DPRINTF(sc, ATH_DEBUG_BEACON, "Dropping; node unknown.\n"); DPRINTF(sc, ATH_DEBUG_BEACON, "Dropping; node unknown.\n");
@@ -6737,7 +6736,9 @@ ath_rx_poll(struct net_device *dev, int @@ -6745,7 +6744,9 @@ ath_rx_poll(struct net_device *dev, int
struct ath_desc *ds; struct ath_desc *ds;
struct ath_rx_status *rs; struct ath_rx_status *rs;
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
@ -340,7 +340,7 @@
unsigned int len; unsigned int len;
int type; int type;
u_int phyerr; u_int phyerr;
@@ -6892,12 +6893,15 @@ rx_accept: @@ -6900,12 +6901,15 @@ rx_accept:
skb_trim(skb, skb->len - IEEE80211_CRC_LEN); skb_trim(skb, skb->len - IEEE80211_CRC_LEN);
if (mic_fail) { if (mic_fail) {
@ -358,7 +358,7 @@
if (ni && ni->ni_table) { if (ni && ni->ni_table) {
ieee80211_check_mic(ni, skb); ieee80211_check_mic(ni, skb);
@@ -6959,11 +6963,24 @@ drop_micfail: @@ -6967,11 +6971,24 @@ drop_micfail:
* for its use. If the sender is unknown spam the * for its use. If the sender is unknown spam the
* frame; it'll be dropped where it's not wanted. * frame; it'll be dropped where it's not wanted.
*/ */
@ -385,7 +385,7 @@
ATH_RSSI_LPF(ATH_NODE(ni)->an_avgrssi, rs->rs_rssi); ATH_RSSI_LPF(ATH_NODE(ni)->an_avgrssi, rs->rs_rssi);
type = ieee80211_input(ni->ni_vap, ni, skb, rs->rs_rssi, bf->bf_tsf); type = ieee80211_input(ni->ni_vap, ni, skb, rs->rs_rssi, bf->bf_tsf);
ieee80211_unref_node(&ni); ieee80211_unref_node(&ni);
@@ -6972,24 +6989,35 @@ drop_micfail: @@ -6980,24 +6997,35 @@ drop_micfail:
* No key index or no entry, do a lookup and * No key index or no entry, do a lookup and
* add the node to the mapping table if possible. * add the node to the mapping table if possible.
*/ */

View File

@ -1,6 +1,6 @@
--- a/ath/if_ath.c --- a/ath/if_ath.c
+++ b/ath/if_ath.c +++ b/ath/if_ath.c
@@ -13511,7 +13511,7 @@ cleanup_ath_buf(struct ath_softc *sc, st @@ -13527,7 +13527,7 @@ cleanup_ath_buf(struct ath_softc *sc, st
bus_unmap_single( bus_unmap_single(
sc->sc_bdev, sc->sc_bdev,
bf->bf_skbaddrff[i], bf->bf_skbaddrff[i],

View File

@ -1,6 +1,6 @@
--- a/ath/if_ath.c --- a/ath/if_ath.c
+++ b/ath/if_ath.c +++ b/ath/if_ath.c
@@ -6725,10 +6725,10 @@ ath_rx_poll(struct net_device *dev, int @@ -6733,10 +6733,10 @@ ath_rx_poll(struct net_device *dev, int
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
struct ath_softc *sc = container_of(napi, struct ath_softc, sc_napi); struct ath_softc *sc = container_of(napi, struct ath_softc, sc_napi);
struct net_device *dev = sc->sc_dev; struct net_device *dev = sc->sc_dev;
@ -13,7 +13,7 @@
#endif #endif
struct ath_buf *bf; struct ath_buf *bf;
struct ieee80211com *ic = &sc->sc_ic; struct ieee80211com *ic = &sc->sc_ic;
@@ -6771,13 +6771,15 @@ process_rx_again: @@ -6779,13 +6779,15 @@ process_rx_again:
break; break;
} }
@ -33,7 +33,7 @@
skb = bf->bf_skb; skb = bf->bf_skb;
if (skb == NULL) { if (skb == NULL) {
@@ -7061,8 +7063,8 @@ rx_next: @@ -7069,8 +7071,8 @@ rx_next:
if (sc->sc_isr & HAL_INT_RX) { if (sc->sc_isr & HAL_INT_RX) {
u_int64_t hw_tsf = ath_hal_gettsf64(ah); u_int64_t hw_tsf = ath_hal_gettsf64(ah);
sc->sc_isr &= ~HAL_INT_RX; sc->sc_isr &= ~HAL_INT_RX;

View File

@ -15,7 +15,7 @@
/* /*
* Check if the MAC has multi-rate retry support. * Check if the MAC has multi-rate retry support.
* We do this by trying to setup a fake extended * We do this by trying to setup a fake extended
@@ -7555,7 +7563,7 @@ ath_txq_setup(struct ath_softc *sc, int @@ -7563,7 +7571,7 @@ ath_txq_setup(struct ath_softc *sc, int
if (qtype == HAL_TX_QUEUE_UAPSD) if (qtype == HAL_TX_QUEUE_UAPSD)
qi.tqi_qflags = HAL_TXQ_TXDESCINT_ENABLE; qi.tqi_qflags = HAL_TXQ_TXDESCINT_ENABLE;
else else

View File

@ -1,6 +1,6 @@
--- a/ath/if_ath.c --- a/ath/if_ath.c
+++ b/ath/if_ath.c +++ b/ath/if_ath.c
@@ -6521,7 +6521,7 @@ ath_capture(struct net_device *dev, cons @@ -6529,7 +6529,7 @@ ath_capture(struct net_device *dev, cons
/* Never copy the SKB, as it is ours on the RX side, and this is the /* Never copy the SKB, as it is ours on the RX side, and this is the
* last process on the TX side and we only modify our own headers. */ * last process on the TX side and we only modify our own headers. */
@ -9,7 +9,7 @@
if (tskb == NULL) { if (tskb == NULL) {
DPRINTF(sc, ATH_DEBUG_ANY, DPRINTF(sc, ATH_DEBUG_ANY,
"Dropping; ath_skb_removepad failed!\n"); "Dropping; ath_skb_removepad failed!\n");
@@ -6529,6 +6529,8 @@ ath_capture(struct net_device *dev, cons @@ -6537,6 +6537,8 @@ ath_capture(struct net_device *dev, cons
} }
ieee80211_input_monitor(ic, tskb, bf, tx, tsf, sc); ieee80211_input_monitor(ic, tskb, bf, tx, tsf, sc);

View File

@ -10,7 +10,7 @@
Please let us know if you think your name should be mentioned here! Please let us know if you think your name should be mentioned here!
--- a/ath/if_ath.c --- a/ath/if_ath.c
+++ b/ath/if_ath.c +++ b/ath/if_ath.c
@@ -3138,7 +3138,7 @@ ath_tx_startraw(struct net_device *dev, @@ -3146,7 +3146,7 @@ ath_tx_startraw(struct net_device *dev,
struct ath_softc *sc = dev->priv; struct ath_softc *sc = dev->priv;
struct ath_hal *ah = sc->sc_ah; struct ath_hal *ah = sc->sc_ah;
struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *)

View File

@ -124,7 +124,7 @@
void void
ieee80211_scan_attach(struct ieee80211com *ic) ieee80211_scan_attach(struct ieee80211com *ic)
{ {
@@ -1155,7 +1272,7 @@ ieee80211_scan_dfs_action(struct ieee802 @@ -1168,7 +1285,7 @@ ieee80211_scan_dfs_action(struct ieee802
IEEE80211_RADAR_CHANCHANGE_TBTT_COUNT; IEEE80211_RADAR_CHANCHANGE_TBTT_COUNT;
ic->ic_flags |= IEEE80211_F_CHANSWITCH; ic->ic_flags |= IEEE80211_F_CHANSWITCH;
} else { } else {
@ -133,7 +133,7 @@
IEEE80211_DPRINTF(vap, IEEE80211_MSG_DOTH, IEEE80211_DPRINTF(vap, IEEE80211_MSG_DOTH,
"%s: directly switching to channel " "%s: directly switching to channel "
"%3d (%4d MHz)\n", __func__, "%3d (%4d MHz)\n", __func__,
@@ -1166,6 +1283,9 @@ ieee80211_scan_dfs_action(struct ieee802 @@ -1179,6 +1296,9 @@ ieee80211_scan_dfs_action(struct ieee802
* change the channel here. */ * change the channel here. */
change_channel(ic, new_channel); change_channel(ic, new_channel);
ic->ic_bsschan = new_channel; ic->ic_bsschan = new_channel;
@ -307,7 +307,7 @@
} }
@@ -605,6 +613,7 @@ ap_end(struct ieee80211_scan_state *ss, @@ -575,6 +583,7 @@ ap_end(struct ieee80211_scan_state *ss,
struct ap_state *as = ss->ss_priv; struct ap_state *as = ss->ss_priv;
struct ieee80211_channel *bestchan = NULL; struct ieee80211_channel *bestchan = NULL;
struct ieee80211com *ic = NULL; struct ieee80211com *ic = NULL;
@ -315,10 +315,10 @@
int res = 1; int res = 1;
SCAN_AP_LOCK_IRQ(as); SCAN_AP_LOCK_IRQ(as);
@@ -613,8 +622,11 @@ ap_end(struct ieee80211_scan_state *ss, @@ -586,8 +595,11 @@ ap_end(struct ieee80211_scan_state *ss,
("wrong opmode %u", vap->iv_opmode));
ic = vap->iv_ic; /* record stats for the channel that was scanned last */
ic->ic_set_channel(ic);
+ spin_lock_irqsave(&channel_lock, sflags); + spin_lock_irqsave(&channel_lock, sflags);
+ ieee80211_scan_set_bss_channel(ic, NULL); + ieee80211_scan_set_bss_channel(ic, NULL);
bestchan = pick_channel(ss, vap, flags); bestchan = pick_channel(ss, vap, flags);
@ -327,7 +327,7 @@
if (ss->ss_last > 0) { if (ss->ss_last > 0) {
/* no suitable channel, should not happen */ /* no suitable channel, should not happen */
printk(KERN_ERR "%s: %s: no suitable channel! " printk(KERN_ERR "%s: %s: no suitable channel! "
@@ -633,6 +645,7 @@ ap_end(struct ieee80211_scan_state *ss, @@ -606,6 +618,7 @@ ap_end(struct ieee80211_scan_state *ss,
bestchan->ic_freq, bestchan->ic_flags & bestchan->ic_freq, bestchan->ic_flags &
~IEEE80211_CHAN_TURBO)) == NULL) { ~IEEE80211_CHAN_TURBO)) == NULL) {
/* should never happen ?? */ /* should never happen ?? */
@ -335,7 +335,7 @@
SCAN_AP_UNLOCK_IRQ_EARLY(as); SCAN_AP_UNLOCK_IRQ_EARLY(as);
return 0; return 0;
} }
@@ -645,6 +658,9 @@ ap_end(struct ieee80211_scan_state *ss, @@ -618,6 +631,9 @@ ap_end(struct ieee80211_scan_state *ss,
as->as_action = action; as->as_action = action;
as->as_selbss = se; as->as_selbss = se;

View File

@ -1,6 +1,6 @@
--- a/ath/if_ath.c --- a/ath/if_ath.c
+++ b/ath/if_ath.c +++ b/ath/if_ath.c
@@ -3675,6 +3675,7 @@ ff_bypass: @@ -3683,6 +3683,7 @@ ff_bypass:
* already alloc'd * already alloc'd
*/ */
ATH_TXBUF_LOCK_IRQ(sc); ATH_TXBUF_LOCK_IRQ(sc);

View File

@ -165,7 +165,7 @@
static void ath_poll_disable(struct net_device *dev); static void ath_poll_disable(struct net_device *dev);
static void ath_poll_enable(struct net_device *dev); static void ath_poll_enable(struct net_device *dev);
@@ -3159,7 +3158,7 @@ ath_tx_startraw(struct net_device *dev, @@ -3167,7 +3166,7 @@ ath_tx_startraw(struct net_device *dev,
try0 = ph->try0; try0 = ph->try0;
rt = sc->sc_currates; rt = sc->sc_currates;
txrate = dot11_to_ratecode(sc, rt, ph->rate0); txrate = dot11_to_ratecode(sc, rt, ph->rate0);
@ -174,7 +174,7 @@
hdrlen = ieee80211_anyhdrsize(wh); hdrlen = ieee80211_anyhdrsize(wh);
pktlen = skb->len + IEEE80211_CRC_LEN; pktlen = skb->len + IEEE80211_CRC_LEN;
@@ -8381,7 +8380,7 @@ ath_tx_start(struct net_device *dev, str @@ -8389,7 +8388,7 @@ ath_tx_start(struct net_device *dev, str
pktlen, /* packet length */ pktlen, /* packet length */
hdrlen, /* header length */ hdrlen, /* header length */
atype, /* Atheros packet type */ atype, /* Atheros packet type */
@ -183,7 +183,7 @@
txrate, try0, /* series 0 rate/tries */ txrate, try0, /* series 0 rate/tries */
keyix, /* key cache index */ keyix, /* key cache index */
antenna, /* antenna mode */ antenna, /* antenna mode */
@@ -10364,59 +10363,16 @@ ath_get_clamped_maxtxpower(struct ath_so @@ -10380,59 +10379,16 @@ ath_get_clamped_maxtxpower(struct ath_so
/* XXX: this function needs some locking to avoid being called /* XXX: this function needs some locking to avoid being called
* twice/interrupted */ * twice/interrupted */

View File

@ -419,7 +419,7 @@
/* NB: memory is reclaimed through dev->destructor callback */ /* NB: memory is reclaimed through dev->destructor callback */
if (decrease) if (decrease)
sc->sc_nvaps--; sc->sc_nvaps--;
@@ -5931,6 +5934,7 @@ ath_node_cleanup(struct ieee80211_node * @@ -5939,6 +5942,7 @@ ath_node_cleanup(struct ieee80211_node *
/* Clean up node-specific rate things - this currently appears to /* Clean up node-specific rate things - this currently appears to
* always be a no-op */ * always be a no-op */
sc->sc_rc->ops->node_cleanup(sc, ATH_NODE(ni)); sc->sc_rc->ops->node_cleanup(sc, ATH_NODE(ni));
@ -427,7 +427,7 @@
ATH_NODE_UAPSD_LOCK_IRQ(an); ATH_NODE_UAPSD_LOCK_IRQ(an);
#ifdef IEEE80211_DEBUG_REFCNT #ifdef IEEE80211_DEBUG_REFCNT
@@ -7001,6 +7005,8 @@ drop_micfail: @@ -7009,6 +7013,8 @@ drop_micfail:
goto lookup_slowpath; goto lookup_slowpath;
} }
ATH_RSSI_LPF(ATH_NODE(ni)->an_avgrssi, rs->rs_rssi); ATH_RSSI_LPF(ATH_NODE(ni)->an_avgrssi, rs->rs_rssi);
@ -436,7 +436,7 @@
type = ieee80211_input(ni->ni_vap, ni, skb, rs->rs_rssi, bf->bf_tsf); type = ieee80211_input(ni->ni_vap, ni, skb, rs->rs_rssi, bf->bf_tsf);
ieee80211_unref_node(&ni); ieee80211_unref_node(&ni);
} else { } else {
@@ -7011,15 +7017,22 @@ drop_micfail: @@ -7019,15 +7025,22 @@ drop_micfail:
lookup_slowpath: lookup_slowpath:
vap = ieee80211_find_rxvap(ic, wh->i_addr1); vap = ieee80211_find_rxvap(ic, wh->i_addr1);
@ -461,7 +461,7 @@
type = ieee80211_input(vap, ni, skb, rs->rs_rssi, bf->bf_tsf); type = ieee80211_input(vap, ni, skb, rs->rs_rssi, bf->bf_tsf);
/* /*
* If the station has a key cache slot assigned * If the station has a key cache slot assigned
@@ -8599,6 +8612,7 @@ ath_tx_processq(struct ath_softc *sc, st @@ -8607,6 +8620,7 @@ ath_tx_processq(struct ath_softc *sc, st
sc->sc_stats.ast_tx_rssi = ts->ts_rssi; sc->sc_stats.ast_tx_rssi = ts->ts_rssi;
ATH_RSSI_LPF(an->an_halstats.ns_avgtxrssi, ATH_RSSI_LPF(an->an_halstats.ns_avgtxrssi,
ts->ts_rssi); ts->ts_rssi);
@ -469,7 +469,7 @@
if (bf->bf_skb->priority == WME_AC_VO || if (bf->bf_skb->priority == WME_AC_VO ||
bf->bf_skb->priority == WME_AC_VI) bf->bf_skb->priority == WME_AC_VI)
ni->ni_ic->ic_wme.wme_hipri_traffic++; ni->ni_ic->ic_wme.wme_hipri_traffic++;
@@ -10090,6 +10104,7 @@ ath_newassoc(struct ieee80211_node *ni, @@ -10106,6 +10120,7 @@ ath_newassoc(struct ieee80211_node *ni,
struct ath_softc *sc = ic->ic_dev->priv; struct ath_softc *sc = ic->ic_dev->priv;
sc->sc_rc->ops->newassoc(sc, ATH_NODE(ni), isnew); sc->sc_rc->ops->newassoc(sc, ATH_NODE(ni), isnew);

View File

@ -9,7 +9,7 @@
static int countrycode = -1; static int countrycode = -1;
static int maxvaps = -1; static int maxvaps = -1;
static int outdoor = -1; static int outdoor = -1;
@@ -4923,6 +4923,7 @@ ath_beacon_setup(struct ath_softc *sc, s @@ -4931,6 +4931,7 @@ ath_beacon_setup(struct ath_softc *sc, s
(((_ic)->ic_flags & (IEEE80211_F_SHPREAMBLE | IEEE80211_F_USEBARKER))\ (((_ic)->ic_flags & (IEEE80211_F_SHPREAMBLE | IEEE80211_F_USEBARKER))\
== IEEE80211_F_SHPREAMBLE) == IEEE80211_F_SHPREAMBLE)
struct ieee80211com *ic = bf->bf_node->ni_ic; struct ieee80211com *ic = bf->bf_node->ni_ic;
@ -17,7 +17,7 @@
struct sk_buff *skb = bf->bf_skb; struct sk_buff *skb = bf->bf_skb;
struct ath_hal *ah = sc->sc_ah; struct ath_hal *ah = sc->sc_ah;
struct ath_desc *ds; struct ath_desc *ds;
@@ -4990,7 +4991,7 @@ ath_beacon_setup(struct ath_softc *sc, s @@ -4998,7 +4999,7 @@ ath_beacon_setup(struct ath_softc *sc, s
skb->len + IEEE80211_CRC_LEN, /* frame length */ skb->len + IEEE80211_CRC_LEN, /* frame length */
sizeof(struct ieee80211_frame), /* header length */ sizeof(struct ieee80211_frame), /* header length */
HAL_PKT_TYPE_BEACON, /* Atheros packet type */ HAL_PKT_TYPE_BEACON, /* Atheros packet type */

View File

@ -1,6 +1,6 @@
--- a/ath/if_ath.c --- a/ath/if_ath.c
+++ b/ath/if_ath.c +++ b/ath/if_ath.c
@@ -13477,7 +13477,7 @@ cleanup_ath_buf(struct ath_softc *sc, st @@ -13493,7 +13493,7 @@ cleanup_ath_buf(struct ath_softc *sc, st
if (bf == NULL) if (bf == NULL)
return bf; return bf;
@ -9,7 +9,7 @@
bus_unmap_single( bus_unmap_single(
sc->sc_bdev, sc->sc_bdev,
bf->bf_skbaddr, bf->bf_skbaddr,
@@ -13485,8 +13485,6 @@ cleanup_ath_buf(struct ath_softc *sc, st @@ -13501,8 +13501,6 @@ cleanup_ath_buf(struct ath_softc *sc, st
sc->sc_rxbufsize : bf->bf_skb->len), sc->sc_rxbufsize : bf->bf_skb->len),
direction); direction);
bf->bf_skbaddr = 0; bf->bf_skbaddr = 0;

View File

@ -18,7 +18,7 @@
/* /*
* Setup the hardware after reset: the key cache * Setup the hardware after reset: the key cache
* is filled as needed and the receive engine is * is filled as needed and the receive engine is
@@ -3010,7 +3006,6 @@ ath_reset(struct net_device *dev) @@ -3018,7 +3014,6 @@ ath_reset(struct net_device *dev)
ath_setintmit(sc); ath_setintmit(sc);
ath_update_txpow(sc); /* update tx power state */ ath_update_txpow(sc); /* update tx power state */
ath_radar_update(sc); ath_radar_update(sc);
@ -26,7 +26,7 @@
if (ath_startrecv(sc) != 0) /* restart recv */ if (ath_startrecv(sc) != 0) /* restart recv */
EPRINTF(sc, "Unable to start receive logic.\n"); EPRINTF(sc, "Unable to start receive logic.\n");
if (sc->sc_softled) if (sc->sc_softled)
@@ -5344,27 +5339,6 @@ ath_beacon_send(struct ath_softc *sc, in @@ -5352,27 +5347,6 @@ ath_beacon_send(struct ath_softc *sc, in
} else if ((sc->sc_updateslot == COMMIT) && (sc->sc_slotupdate == slot)) } else if ((sc->sc_updateslot == COMMIT) && (sc->sc_slotupdate == slot))
ath_setslottime(sc); /* commit change to hardware */ ath_setslottime(sc); /* commit change to hardware */
@ -54,7 +54,7 @@
if (bfaddr != 0) { if (bfaddr != 0) {
/* /*
* Stop any current DMA and put the new frame(s) on the queue. * Stop any current DMA and put the new frame(s) on the queue.
@@ -6725,9 +6699,8 @@ ath_setdefantenna(struct ath_softc *sc, @@ -6733,9 +6707,8 @@ ath_setdefantenna(struct ath_softc *sc,
{ {
struct ath_hal *ah = sc->sc_ah; struct ath_hal *ah = sc->sc_ah;
@ -65,7 +65,7 @@
if (sc->sc_defant != antenna) if (sc->sc_defant != antenna)
sc->sc_stats.ast_ant_defswitch++; sc->sc_stats.ast_ant_defswitch++;
sc->sc_defant = antenna; sc->sc_defant = antenna;
@@ -11138,7 +11111,7 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl @@ -11154,7 +11127,7 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
break; break;
} }
sc->sc_diversity = val; sc->sc_diversity = val;

View File

@ -184,7 +184,7 @@
#ifdef ATH_SUPERG_XR #ifdef ATH_SUPERG_XR
ic->ic_ath_cap |= (ath_hal_xrsupported(ah) ? IEEE80211_ATHC_XR : 0); ic->ic_ath_cap |= (ath_hal_xrsupported(ah) ? IEEE80211_ATHC_XR : 0);
#endif #endif
@@ -4461,17 +4477,17 @@ ath_mode_init(struct net_device *dev) @@ -4469,17 +4485,17 @@ ath_mode_init(struct net_device *dev)
* Set the slot time based on the current setting. * Set the slot time based on the current setting.
*/ */
static void static void
@ -210,7 +210,7 @@
sc->sc_updateslot = OK; sc->sc_updateslot = OK;
} }
@@ -4493,7 +4509,7 @@ ath_updateslot(struct net_device *dev) @@ -4501,7 +4517,7 @@ ath_updateslot(struct net_device *dev)
if (ic->ic_opmode == IEEE80211_M_HOSTAP) if (ic->ic_opmode == IEEE80211_M_HOSTAP)
sc->sc_updateslot = UPDATE; sc->sc_updateslot = UPDATE;
else if (dev->flags & IFF_RUNNING) else if (dev->flags & IFF_RUNNING)
@ -219,7 +219,7 @@
} }
#ifdef ATH_SUPERG_DYNTURBO #ifdef ATH_SUPERG_DYNTURBO
@@ -5337,7 +5353,7 @@ ath_beacon_send(struct ath_softc *sc, in @@ -5345,7 +5361,7 @@ ath_beacon_send(struct ath_softc *sc, in
sc->sc_updateslot = COMMIT; /* commit next beacon */ sc->sc_updateslot = COMMIT; /* commit next beacon */
sc->sc_slotupdate = slot; sc->sc_slotupdate = slot;
} else if ((sc->sc_updateslot == COMMIT) && (sc->sc_slotupdate == slot)) } else if ((sc->sc_updateslot == COMMIT) && (sc->sc_slotupdate == slot))
@ -228,7 +228,7 @@
if (bfaddr != 0) { if (bfaddr != 0) {
/* /*
@@ -7790,12 +7806,14 @@ ath_get_ivlen(struct ieee80211_key *k) @@ -7798,12 +7814,14 @@ ath_get_ivlen(struct ieee80211_key *k)
* Get transmit rate index using rate in Kbps * Get transmit rate index using rate in Kbps
*/ */
static __inline int static __inline int
@ -245,7 +245,7 @@
ndx = i; ndx = i;
break; break;
} }
@@ -8088,7 +8106,7 @@ ath_tx_start(struct net_device *dev, str @@ -8096,7 +8114,7 @@ ath_tx_start(struct net_device *dev, str
atype = HAL_PKT_TYPE_NORMAL; /* default */ atype = HAL_PKT_TYPE_NORMAL; /* default */
if (ismcast) { if (ismcast) {
@ -254,7 +254,7 @@
txrate = rt->info[rix].rateCode; txrate = rt->info[rix].rateCode;
if (shortPreamble) if (shortPreamble)
txrate |= rt->info[rix].shortPreamble; txrate |= rt->info[rix].shortPreamble;
@@ -9055,7 +9073,7 @@ ath_chan_change(struct ath_softc *sc, st @@ -9063,7 +9081,7 @@ ath_chan_change(struct ath_softc *sc, st
struct net_device *dev = sc->sc_dev; struct net_device *dev = sc->sc_dev;
enum ieee80211_phymode mode; enum ieee80211_phymode mode;
@ -263,7 +263,7 @@
ath_rate_setup(dev, mode); ath_rate_setup(dev, mode);
ath_setcurmode(sc, mode); ath_setcurmode(sc, mode);
@@ -10104,8 +10122,7 @@ ath_newassoc(struct ieee80211_node *ni, @@ -10120,8 +10138,7 @@ ath_newassoc(struct ieee80211_node *ni,
} }
static int static int
@ -273,7 +273,7 @@
{ {
struct ath_softc *sc = dev->priv; struct ath_softc *sc = dev->priv;
struct ieee80211com *ic = &sc->sc_ic; struct ieee80211com *ic = &sc->sc_ic;
@@ -10119,17 +10136,31 @@ ath_getchannels(struct net_device *dev, @@ -10135,17 +10152,31 @@ ath_getchannels(struct net_device *dev,
EPRINTF(sc, "Insufficient memory for channel table!\n"); EPRINTF(sc, "Insufficient memory for channel table!\n");
return -ENOMEM; return -ENOMEM;
} }
@ -307,7 +307,7 @@
/* /*
* Convert HAL channels to ieee80211 ones. * Convert HAL channels to ieee80211 ones.
*/ */
@@ -10373,7 +10404,7 @@ ath_xr_rate_setup(struct net_device *dev @@ -10389,7 +10420,7 @@ ath_xr_rate_setup(struct net_device *dev
struct ieee80211com *ic = &sc->sc_ic; struct ieee80211com *ic = &sc->sc_ic;
const HAL_RATE_TABLE *rt; const HAL_RATE_TABLE *rt;
struct ieee80211_rateset *rs; struct ieee80211_rateset *rs;
@ -316,7 +316,7 @@
sc->sc_xr_rates = ath_hal_getratetable(ah, HAL_MODE_XR); sc->sc_xr_rates = ath_hal_getratetable(ah, HAL_MODE_XR);
rt = sc->sc_xr_rates; rt = sc->sc_xr_rates;
if (rt == NULL) if (rt == NULL)
@@ -10386,57 +10417,16 @@ ath_xr_rate_setup(struct net_device *dev @@ -10402,57 +10433,16 @@ ath_xr_rate_setup(struct net_device *dev
} else } else
maxrates = rt->rateCount; maxrates = rt->rateCount;
rs = &ic->ic_sup_xr_rates; rs = &ic->ic_sup_xr_rates;
@ -380,7 +380,7 @@
static int static int
ath_rate_setup(struct net_device *dev, u_int mode) ath_rate_setup(struct net_device *dev, u_int mode)
{ {
@@ -10445,7 +10435,7 @@ ath_rate_setup(struct net_device *dev, u @@ -10461,7 +10451,7 @@ ath_rate_setup(struct net_device *dev, u
struct ieee80211com *ic = &sc->sc_ic; struct ieee80211com *ic = &sc->sc_ic;
const HAL_RATE_TABLE *rt; const HAL_RATE_TABLE *rt;
struct ieee80211_rateset *rs; struct ieee80211_rateset *rs;
@ -389,7 +389,7 @@
switch (mode) { switch (mode) {
case IEEE80211_MODE_11A: case IEEE80211_MODE_11A:
@@ -10463,6 +10453,12 @@ ath_rate_setup(struct net_device *dev, u @@ -10479,6 +10469,12 @@ ath_rate_setup(struct net_device *dev, u
case IEEE80211_MODE_TURBO_G: case IEEE80211_MODE_TURBO_G:
sc->sc_rates[mode] = ath_hal_getratetable(ah, HAL_MODE_108G); sc->sc_rates[mode] = ath_hal_getratetable(ah, HAL_MODE_108G);
break; break;
@ -402,7 +402,7 @@
default: default:
DPRINTF(sc, ATH_DEBUG_ANY, "Invalid mode %u\n", mode); DPRINTF(sc, ATH_DEBUG_ANY, "Invalid mode %u\n", mode);
return 0; return 0;
@@ -10477,10 +10473,16 @@ ath_rate_setup(struct net_device *dev, u @@ -10493,10 +10489,16 @@ ath_rate_setup(struct net_device *dev, u
maxrates = IEEE80211_RATE_MAXSIZE; maxrates = IEEE80211_RATE_MAXSIZE;
} else } else
maxrates = rt->rateCount; maxrates = rt->rateCount;
@ -419,7 +419,7 @@
return 1; return 1;
} }
@@ -10509,13 +10511,18 @@ ath_setcurmode(struct ath_softc *sc, enu @@ -10525,13 +10527,18 @@ ath_setcurmode(struct ath_softc *sc, enu
{ 0, 500, 130 }, { 0, 500, 130 },
}; };
const HAL_RATE_TABLE *rt; const HAL_RATE_TABLE *rt;
@ -440,7 +440,7 @@
memset(sc->sc_hwmap, 0, sizeof(sc->sc_hwmap)); memset(sc->sc_hwmap, 0, sizeof(sc->sc_hwmap));
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
u_int8_t ix = rt->rateCodeToIndex[i]; u_int8_t ix = rt->rateCodeToIndex[i];
@@ -10525,7 +10532,7 @@ ath_setcurmode(struct ath_softc *sc, enu @@ -10541,7 +10548,7 @@ ath_setcurmode(struct ath_softc *sc, enu
continue; continue;
} }
sc->sc_hwmap[i].ieeerate = sc->sc_hwmap[i].ieeerate =
@ -449,7 +449,7 @@
if (rt->info[ix].shortPreamble || if (rt->info[ix].shortPreamble ||
rt->info[ix].phy == IEEE80211_T_OFDM) rt->info[ix].phy == IEEE80211_T_OFDM)
sc->sc_hwmap[i].flags |= IEEE80211_RADIOTAP_F_SHORTPRE; sc->sc_hwmap[i].flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
@@ -10926,9 +10933,106 @@ enum { @@ -10942,9 +10949,106 @@ enum {
ATH_MAXVAPS = 26, ATH_MAXVAPS = 26,
ATH_INTMIT = 27, ATH_INTMIT = 27,
ATH_NOISE_IMMUNITY = 28, ATH_NOISE_IMMUNITY = 28,
@ -557,7 +557,7 @@
static int static int
ath_sysctl_set_intmit(struct ath_softc *sc, long ctl, u_int val) ath_sysctl_set_intmit(struct ath_softc *sc, long ctl, u_int val)
{ {
@@ -11007,6 +11111,7 @@ static int @@ -11023,6 +11127,7 @@ static int
ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl, write, filp, buffer, lenp, ppos) ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl, write, filp, buffer, lenp, ppos)
{ {
struct ath_softc *sc = ctl->extra1; struct ath_softc *sc = ctl->extra1;
@ -565,7 +565,7 @@
struct ath_hal *ah = sc->sc_ah; struct ath_hal *ah = sc->sc_ah;
u_int val; u_int val;
u_int tab_3_val[3]; u_int tab_3_val[3];
@@ -11030,25 +11135,34 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl @@ -11046,25 +11151,34 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
lenp, ppos); lenp, ppos);
if (ret == 0) { if (ret == 0) {
switch ((long)ctl->extra2) { switch ((long)ctl->extra2) {
@ -613,7 +613,7 @@
break; break;
case ATH_SOFTLED: case ATH_SOFTLED:
if (val != sc->sc_softled) { if (val != sc->sc_softled) {
@@ -11201,6 +11315,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl @@ -11217,6 +11331,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
} }
} else { } else {
switch ((long)ctl->extra2) { switch ((long)ctl->extra2) {
@ -623,7 +623,7 @@
case ATH_SLOTTIME: case ATH_SLOTTIME:
val = ath_hal_getslottime(ah); val = ath_hal_getslottime(ah);
break; break;
@@ -11219,6 +11336,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl @@ -11235,6 +11352,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
case ATH_COUNTRYCODE: case ATH_COUNTRYCODE:
ath_hal_getcountrycode(ah, &val); ath_hal_getcountrycode(ah, &val);
break; break;
@ -633,7 +633,7 @@
case ATH_MAXVAPS: case ATH_MAXVAPS:
val = ath_maxvaps; val = ath_maxvaps;
break; break;
@@ -11332,11 +11452,17 @@ static const ctl_table ath_sysctl_templa @@ -11348,11 +11468,17 @@ static const ctl_table ath_sysctl_templa
}, },
{ .ctl_name = CTL_AUTO, { .ctl_name = CTL_AUTO,
.procname = "countrycode", .procname = "countrycode",
@ -652,7 +652,7 @@
.procname = "maxvaps", .procname = "maxvaps",
.mode = 0444, .mode = 0444,
.proc_handler = ath_sysctl_halparam, .proc_handler = ath_sysctl_halparam,
@@ -11344,7 +11470,7 @@ static const ctl_table ath_sysctl_templa @@ -11360,7 +11486,7 @@ static const ctl_table ath_sysctl_templa
}, },
{ .ctl_name = CTL_AUTO, { .ctl_name = CTL_AUTO,
.procname = "regdomain", .procname = "regdomain",
@ -661,7 +661,7 @@
.proc_handler = ath_sysctl_halparam, .proc_handler = ath_sysctl_halparam,
.extra2 = (void *)ATH_REGDOMAIN, .extra2 = (void *)ATH_REGDOMAIN,
}, },
@@ -11407,6 +11533,12 @@ static const ctl_table ath_sysctl_templa @@ -11423,6 +11549,12 @@ static const ctl_table ath_sysctl_templa
.extra2 = (void *)ATH_ACKRATE, .extra2 = (void *)ATH_ACKRATE,
}, },
{ .ctl_name = CTL_AUTO, { .ctl_name = CTL_AUTO,
@ -674,7 +674,7 @@
.procname = "rp", .procname = "rp",
.mode = 0200, .mode = 0200,
.proc_handler = ath_sysctl_halparam, .proc_handler = ath_sysctl_halparam,
@@ -11647,13 +11779,6 @@ static ctl_table ath_static_sysctls[] = @@ -11663,13 +11795,6 @@ static ctl_table ath_static_sysctls[] =
}, },
#endif #endif
{ .ctl_name = CTL_AUTO, { .ctl_name = CTL_AUTO,
@ -688,7 +688,7 @@
.procname = "maxvaps", .procname = "maxvaps",
.mode = 0444, .mode = 0444,
.data = &ath_maxvaps, .data = &ath_maxvaps,
@@ -11661,13 +11786,6 @@ static ctl_table ath_static_sysctls[] = @@ -11677,13 +11802,6 @@ static ctl_table ath_static_sysctls[] =
.proc_handler = proc_dointvec .proc_handler = proc_dointvec
}, },
{ .ctl_name = CTL_AUTO, { .ctl_name = CTL_AUTO,
@ -1284,7 +1284,7 @@
for (i = 0; i < ss_last; i++) { for (i = 0; i < ss_last; i++) {
chans[i].chan = ss->ss_chans[i]; chans[i].chan = ss->ss_chans[i];
chans[i].orig = i; chans[i].orig = i;
@@ -601,6 +602,7 @@ pick_channel(struct ieee80211_scan_state @@ -571,6 +572,7 @@ pick_channel(struct ieee80211_scan_state
"%s: best: channel %u rssi %d\n", "%s: best: channel %u rssi %d\n",
__func__, i, as->as_maxrssi[i]); __func__, i, as->as_maxrssi[i]);
} }
@ -1292,7 +1292,7 @@
return best; return best;
} }
@@ -636,6 +638,7 @@ ap_end(struct ieee80211_scan_state *ss, @@ -609,6 +611,7 @@ ap_end(struct ieee80211_scan_state *ss,
res = 1; /* Do NOT restart scan */ res = 1; /* Do NOT restart scan */
} else { } else {
struct ieee80211_scan_entry se; struct ieee80211_scan_entry se;
@ -1300,7 +1300,7 @@
/* XXX: notify all VAPs? */ /* XXX: notify all VAPs? */
/* if this is a dynamic turbo frequency , start with normal /* if this is a dynamic turbo frequency , start with normal
* mode first */ * mode first */
@@ -650,6 +653,11 @@ ap_end(struct ieee80211_scan_state *ss, @@ -623,6 +626,11 @@ ap_end(struct ieee80211_scan_state *ss,
return 0; return 0;
} }
} }