struct sk_buff_head skb_queue;
 
-       int auth_tries, assoc_tries;
+       int assoc_scan_tries; /* number of scans done pre-association */
+       int auth_tries; /* retries for auth req */
+       int assoc_tries; /* retries for assoc req */
 
        unsigned long request;
 
 
 #include "led.h"
 #include "mesh.h"
 
+#define IEEE80211_ASSOC_SCANS_MAX_TRIES 2
 #define IEEE80211_AUTH_TIMEOUT (HZ / 5)
 #define IEEE80211_AUTH_MAX_TRIES 3
 #define IEEE80211_ASSOC_TIMEOUT (HZ / 5)
 {
        if (deauth)
                ifsta->auth_tries = 0;
+       ifsta->assoc_scan_tries = 0;
        ifsta->assoc_tries = 0;
        ieee80211_set_associated(sdata, ifsta, 0);
 }
                ifsta->auth_alg = WLAN_AUTH_OPEN;
        ifsta->auth_transaction = -1;
        ifsta->flags &= ~IEEE80211_STA_ASSOCIATED;
-       ifsta->auth_tries = ifsta->assoc_tries = 0;
+       ifsta->assoc_scan_tries = 0;
+       ifsta->auth_tries = 0;
+       ifsta->assoc_tries = 0;
        netif_carrier_off(sdata->dev);
 }
 
                ieee80211_sta_reset_auth(sdata, ifsta);
                return 0;
        } else {
-               if (ifsta->state != IEEE80211_STA_MLME_AUTHENTICATE) {
+               if (ifsta->assoc_scan_tries < IEEE80211_ASSOC_SCANS_MAX_TRIES) {
+                       ifsta->assoc_scan_tries++;
                        if (ifsta->flags & IEEE80211_STA_AUTO_SSID_SEL)
                                ieee80211_sta_start_scan(sdata, NULL, 0);
                        else