madwifi: improve mode selection, do not scan channels which do not fit the desired...
[openwrt/svn-archive/archive.git] / package / madwifi / patches / 411-autochannel_multi.patch
index ab48e70b2ce152e940c60d77c1df6cf9388e6973..b6093cfcd567a0a28bffd97c72dba12a4ac42bd1 100644 (file)
        /* 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;
 +      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;
  
  }
  
  
-@@ -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;
        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;
                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 ?? */
                                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;