From b4574b5b03437da68522be96dcc28634d9f0f42a Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 7 May 2009 11:32:43 +0000 Subject: [PATCH] madwifi: improve mode selection, do not scan channels which do not fit the desired mode SVN-Revision: 15663 --- package/madwifi/patches/351-scanlist.patch | 57 ++++++++++++++----- package/madwifi/patches/389-autochannel.patch | 4 +- .../patches/411-autochannel_multi.patch | 16 +++--- package/madwifi/patches/418-turbo.patch | 15 ----- .../patches/421-channel_handling.patch | 12 ++-- 5 files changed, 59 insertions(+), 45 deletions(-) delete mode 100644 package/madwifi/patches/418-turbo.patch diff --git a/package/madwifi/patches/351-scanlist.patch b/package/madwifi/patches/351-scanlist.patch index 67e757468b..c11f28e39d 100644 --- a/package/madwifi/patches/351-scanlist.patch +++ b/package/madwifi/patches/351-scanlist.patch @@ -353,6 +353,17 @@ /* Identify mode capabilities. */ if (IEEE80211_IS_CHAN_A(c)) ic->ic_modecaps |= 1 << IEEE80211_MODE_11A; +@@ -1447,10 +1452,6 @@ ieee80211_media_change(struct net_device + vap->iv_fixed_rate = newrate; /* fixed TX rate */ + error = -ENETRESET; + } +- if (vap->iv_des_mode != newmode) { +- vap->iv_des_mode = newmode; /* desired PHY mode */ +- error = -ENETRESET; +- } + return error; + } + EXPORT_SYMBOL(ieee80211_media_change); --- a/net80211/_ieee80211.h +++ b/net80211/_ieee80211.h @@ -132,6 +132,11 @@ enum ieee80211_scanmode { @@ -387,7 +398,19 @@ IEEE80211_WMMPARAMS_CWMIN = 1, --- a/net80211/ieee80211_scan_ap.c +++ b/net80211/ieee80211_scan_ap.c -@@ -129,131 +129,7 @@ struct ap_state { +@@ -105,11 +105,6 @@ struct scan_entry { + }; + + struct ap_state { +- unsigned int as_vap_desired_mode; /* Used for channel selection, +- * vap->iv_des_mode */ +- unsigned int as_required_mode; /* Used for channel selection, +- * filtered version of +- * as_vap_desired_mode */ + int as_maxrssi[IEEE80211_CHAN_MAX]; /* Used for channel selection */ + + /* These fields are just for scan caching for returning responses to +@@ -129,131 +124,7 @@ struct ap_state { static int ap_flush(struct ieee80211_scan_state *); static void action_tasklet(IEEE80211_TQUEUE_ARG); @@ -519,7 +542,7 @@ /* * Attach prior to any scanning work. -@@ -327,29 +203,6 @@ saveie(u_int8_t **iep, const u_int8_t *i +@@ -327,29 +198,6 @@ saveie(u_int8_t **iep, const u_int8_t *i ieee80211_saveie(iep, ie); } @@ -549,7 +572,7 @@ /* * Start an ap scan by populating the channel list. */ -@@ -358,8 +211,6 @@ ap_start(struct ieee80211_scan_state *ss +@@ -358,90 +206,15 @@ ap_start(struct ieee80211_scan_state *ss { struct ap_state *as = ss->ss_priv; struct ieee80211com *ic = NULL; @@ -558,10 +581,11 @@ int i; unsigned int mode = 0; -@@ -368,80 +219,8 @@ ap_start(struct ieee80211_scan_state *ss + SCAN_AP_LOCK_IRQ(as); + ic = vap->iv_ic; /* Determine mode flags to match, or leave zero for auto mode */ - as->as_vap_desired_mode = vap->iv_des_mode; - as->as_required_mode = 0; +- as->as_vap_desired_mode = vap->iv_des_mode; +- as->as_required_mode = 0; - if (as->as_vap_desired_mode != IEEE80211_MODE_AUTO) { - as->as_required_mode = chanflags[as->as_vap_desired_mode]; - if ((vap->iv_ath_cap & IEEE80211_ATHC_TURBOP) && @@ -574,7 +598,7 @@ - } - } - -- ss->ss_last = 0; + ss->ss_last = 0; - /* Use the table of ordered channels to construct the list - * of channels for scanning. Any channels in the ordered - * list not in the master list will be discarded. */ @@ -609,8 +633,7 @@ - /* XR is not supported on turbo channels */ - if (IEEE80211_IS_CHAN_TURBO(c) && vap->iv_flags & IEEE80211_F_XR) - continue; -+ ieee80211_scan_add_channels(ic, ss, vap->iv_des_mode); - +- - /* Dynamic channels are scanned in base mode */ - if (!as->as_required_mode && !IEEE80211_IS_CHAN_ST(c)) - continue; @@ -630,7 +653,8 @@ - /* Make sure the channel is active */ - if ((c == NULL) || isclr(ic->ic_chan_active, c->ic_ieee)) - continue; -- ++ ieee80211_scan_add_channels(ic, ss, vap->iv_des_mode); + - /* Don't overrun */ - if (ss->ss_last >= IEEE80211_SCAN_MAX) - break; @@ -640,7 +664,7 @@ ss->ss_next = 0; /* XXX tunables */ ss->ss_mindwell = msecs_to_jiffies(200); /* 200ms */ -@@ -761,13 +540,6 @@ pick_channel(struct ieee80211_scan_state +@@ -761,18 +534,6 @@ pick_channel(struct ieee80211_scan_state if (IEEE80211_IS_CHAN_RADAR(c->chan)) continue; @@ -651,9 +675,14 @@ - (as->as_vap_desired_mode != IEEE80211_MODE_TURBO_STATIC_A)) - continue; - - /* Verify mode matches any fixed mode specified */ - if((c->chan->ic_flags & as->as_required_mode) != - as->as_required_mode) +- /* Verify mode matches any fixed mode specified */ +- if((c->chan->ic_flags & as->as_required_mode) != +- as->as_required_mode) +- continue; +- + if ((ic->ic_bsschan != NULL) && + (ic->ic_bsschan != IEEE80211_CHAN_ANYC)) { + --- a/net80211/ieee80211_scan.c +++ b/net80211/ieee80211_scan.c @@ -958,6 +958,80 @@ ieee80211_scan_flush(struct ieee80211com diff --git a/package/madwifi/patches/389-autochannel.patch b/package/madwifi/patches/389-autochannel.patch index 1c62285904..65e03e7381 100644 --- a/package/madwifi/patches/389-autochannel.patch +++ b/package/madwifi/patches/389-autochannel.patch @@ -95,7 +95,7 @@ #define IEEE80211_CHAN_MAX 255 --- a/net80211/ieee80211_scan_ap.c +++ b/net80211/ieee80211_scan_ap.c -@@ -423,6 +423,19 @@ pc_cmp_rssi(struct ap_state *as, struct +@@ -417,6 +417,19 @@ pc_cmp_rssi(struct ap_state *as, struct /* This function must be invoked with locks acquired */ static int @@ -115,7 +115,7 @@ pc_cmp_samechan(struct ieee80211com *ic, struct ieee80211_channel *a, struct ieee80211_channel *b) { -@@ -457,6 +470,7 @@ pc_cmp(const void *_a, const void *_b) +@@ -451,6 +464,7 @@ pc_cmp(const void *_a, const void *_b) EVALUATE_CRITERION(radar, a, b); EVALUATE_CRITERION(keepmode, params, a, b); diff --git a/package/madwifi/patches/411-autochannel_multi.patch b/package/madwifi/patches/411-autochannel_multi.patch index ab48e70b2c..b6093cfcd5 100644 --- a/package/madwifi/patches/411-autochannel_multi.patch +++ b/package/madwifi/patches/411-autochannel_multi.patch @@ -278,7 +278,7 @@ /* update Supported Channels information element */ --- a/net80211/ieee80211_scan_ap.c +++ b/net80211/ieee80211_scan_ap.c -@@ -213,9 +213,15 @@ ap_start(struct ieee80211_scan_state *ss +@@ -208,9 +208,15 @@ ap_start(struct ieee80211_scan_state *ss struct ieee80211com *ic = NULL; int i; unsigned int mode = 0; @@ -292,9 +292,9 @@ + spin_unlock_irqrestore(&channel_lock, sflags); + /* Determine mode flags to match, or leave zero for auto mode */ - as->as_vap_desired_mode = vap->iv_des_mode; - as->as_required_mode = 0; -@@ -429,8 +435,10 @@ pc_cmp_idletime(struct ieee80211_channel + ss->ss_last = 0; + ieee80211_scan_add_channels(ic, ss, vap->iv_des_mode); +@@ -423,8 +429,10 @@ pc_cmp_idletime(struct ieee80211_channel if (!a->ic_idletime || !b->ic_idletime) return 0; @@ -307,7 +307,7 @@ } -@@ -616,6 +624,7 @@ ap_end(struct ieee80211_scan_state *ss, +@@ -605,6 +613,7 @@ ap_end(struct ieee80211_scan_state *ss, struct ap_state *as = ss->ss_priv; struct ieee80211_channel *bestchan = NULL; struct ieee80211com *ic = NULL; @@ -315,7 +315,7 @@ int res = 1; SCAN_AP_LOCK_IRQ(as); -@@ -624,8 +633,11 @@ ap_end(struct ieee80211_scan_state *ss, +@@ -613,8 +622,11 @@ ap_end(struct ieee80211_scan_state *ss, ("wrong opmode %u", vap->iv_opmode)); ic = vap->iv_ic; @@ -327,7 +327,7 @@ if (ss->ss_last > 0) { /* no suitable channel, should not happen */ printk(KERN_ERR "%s: %s: no suitable channel! " -@@ -644,6 +656,7 @@ ap_end(struct ieee80211_scan_state *ss, +@@ -633,6 +645,7 @@ ap_end(struct ieee80211_scan_state *ss, bestchan->ic_freq, bestchan->ic_flags & ~IEEE80211_CHAN_TURBO)) == NULL) { /* should never happen ?? */ @@ -335,7 +335,7 @@ SCAN_AP_UNLOCK_IRQ_EARLY(as); return 0; } -@@ -656,6 +669,9 @@ ap_end(struct ieee80211_scan_state *ss, +@@ -645,6 +658,9 @@ ap_end(struct ieee80211_scan_state *ss, as->as_action = action; as->as_selbss = se; diff --git a/package/madwifi/patches/418-turbo.patch b/package/madwifi/patches/418-turbo.patch deleted file mode 100644 index 4e13f90d20..0000000000 --- a/package/madwifi/patches/418-turbo.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/net80211/ieee80211_scan.c -+++ b/net80211/ieee80211_scan.c -@@ -1129,7 +1129,11 @@ ieee80211_scan_add_channels(struct ieee8 - continue; - if (c->ic_scanflags & IEEE80211_NOSCAN_SET) - continue; -- if (modeflags && -+ if (ss->ss_vap->iv_opmode == IEEE80211_M_HOSTAP) { -+ if ((c->ic_flags & (IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO)) != -+ (modeflags & (IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO))) -+ continue; -+ } else if (modeflags && - ((c->ic_flags & IEEE80211_CHAN_ALLTURBO) != - (modeflags & IEEE80211_CHAN_ALLTURBO))) - continue; diff --git a/package/madwifi/patches/421-channel_handling.patch b/package/madwifi/patches/421-channel_handling.patch index 5418f1b007..697dfcf99c 100644 --- a/package/madwifi/patches/421-channel_handling.patch +++ b/package/madwifi/patches/421-channel_handling.patch @@ -965,7 +965,7 @@ for (i = 0; i < nrates; i++) if (IEEERATE(ic, mode, i) == rate) return i; -@@ -1881,11 +1915,6 @@ ieee80211_build_countryie(struct ieee802 +@@ -1877,11 +1911,6 @@ ieee80211_build_countryie(struct ieee802 if (ieee80211_chan2mode(c) != curmode_noturbo) continue; @@ -977,7 +977,7 @@ if (*cur_runlen == 0) { (*cur_runlen)++; *cur_pow = c->ic_maxregpower; -@@ -1919,7 +1948,7 @@ void +@@ -1915,7 +1944,7 @@ void ieee80211_build_sc_ie(struct ieee80211com *ic) { struct ieee80211_ie_sc *ie = &ic->ic_sc_ie; @@ -1268,7 +1268,7 @@ --- a/net80211/ieee80211_scan_ap.c +++ b/net80211/ieee80211_scan_ap.c -@@ -518,12 +518,13 @@ pick_channel(struct ieee80211_scan_state +@@ -512,12 +512,13 @@ pick_channel(struct ieee80211_scan_state int ss_last = ss->ss_last; struct ieee80211_channel *best; struct ap_state *as = ss->ss_priv; @@ -1283,7 +1283,7 @@ for (i = 0; i < ss_last; i++) { chans[i].chan = ss->ss_chans[i]; chans[i].orig = i; -@@ -612,6 +613,7 @@ pick_channel(struct ieee80211_scan_state +@@ -601,6 +602,7 @@ pick_channel(struct ieee80211_scan_state "%s: best: channel %u rssi %d\n", __func__, i, as->as_maxrssi[i]); } @@ -1291,7 +1291,7 @@ return best; } -@@ -647,6 +649,7 @@ ap_end(struct ieee80211_scan_state *ss, +@@ -636,6 +638,7 @@ ap_end(struct ieee80211_scan_state *ss, res = 1; /* Do NOT restart scan */ } else { struct ieee80211_scan_entry se; @@ -1299,7 +1299,7 @@ /* XXX: notify all VAPs? */ /* if this is a dynamic turbo frequency , start with normal * mode first */ -@@ -661,6 +664,11 @@ ap_end(struct ieee80211_scan_state *ss, +@@ -650,6 +653,11 @@ ap_end(struct ieee80211_scan_state *ss, return 0; } } -- 2.30.2