Please note: This project is no longer active. The website is kept online for historic purposes only.
If you´re looking for a Linux driver for your Atheros WLAN device, you should continue here .

Ticket #275: backout-preempt-scan.diff

File backout-preempt-scan.diff, 3.1 kB (added by mrenzmann, 12 years ago)

Proposed patch to back out preempt_scan from current trunk

  • net80211/ieee80211_wireless.c

    old new  
    4848#include <linux/netdevice.h> 
    4949#include <linux/utsname.h> 
    5050#include <linux/if_arp.h>               /* for ARPHRD_ETHER */ 
    51 #include <linux/delay.h> 
    5251 
    5352#include <linux/wireless.h> 
    5453#include <net/iw_handler.h> 
     
    7574static void 
    7675pre_announced_chanswitch(struct net_device *dev, u_int32_t channel, u_int32_t tbtt); 
    7776 
    78 static int 
    79 preempt_scan(struct net_device *dev, int max_grace, int max_wait) 
    80 { 
    81         struct ieee80211vap *vap = dev->priv; 
    82         struct ieee80211com *ic = vap->iv_ic; 
    83         int total_delay = 0; 
    84         int canceled = 0, ready = 0; 
    85  
    86         while (!ready && total_delay < max_grace + max_wait) { 
    87                 if ((ic->ic_flags & IEEE80211_F_SCAN) == 0) { 
    88                         ready = 1; 
    89                 } else { 
    90                         if (!canceled && (total_delay > max_grace)) { 
    91                                 /* Cancel any existing active scan, so that any new parameters 
    92                                  * in this scan ioctl (or the defaults) can be honored, then 
    93                                  * wait around a while to see if the scan cancels properly. */ 
    94                                 IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, 
    95                                                 "%s: cancel pending scan request\n", __func__); 
    96                                 (void) ieee80211_cancel_scan(vap); 
    97                                 canceled = 1; 
    98                         } 
    99                         mdelay (1); 
    100                         total_delay += 1; 
    101                 } 
    102         } 
    103  
    104         if (!ready) { 
    105                 IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, 
    106                                 "%s: Timeout canceling current scan.\n", 
    107                                 __func__); 
    108         } 
    109  
    110         return ready; 
    111 } 
    112  
    11377static struct iw_statistics * 
    11478ieee80211_iw_getstats(struct net_device *dev) 
    11579{ 
     
    15361500        /* XXX always manual... */ 
    15371501        IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, 
    15381502                "%s: active scan request\n", __func__); 
    1539         preempt_scan(dev, 100, 100); 
    15401503#if WIRELESS_EXT > 17 
     1504        /* XXX do we need to remove this code after backing 
     1505         * out preempt_scan? 
     1506         * => ticket 275 */ 
    15411507        if (data && (data->flags & IW_SCAN_THIS_ESSID)) { 
    15421508                struct iw_scan_req req; 
    15431509                struct ieee80211_scan_ssid ssid; 
     
    19571923        struct ieee80211com *ic = vap->iv_ic; 
    19581924        struct ifreq ifr; 
    19591925        char s[6];              /* big enough for ``11adt'' */ 
    1960         int retv, mode, ifr_mode
     1926        int retv, mode, ifr_mode, itr_count
    19611927 
    19621928        if (ic->ic_media.ifm_cur == NULL) 
    19631929                return -EINVAL;                 /* XXX: Wrong error */ 
     
    19901956 
    19911957        retv = ifmedia_ioctl(ic->ic_dev, &ifr, &ic->ic_media, SIOCSIFMEDIA); 
    19921958        if ((!retv || retv == -ENETRESET) && (mode != vap->iv_des_mode)) { 
    1993                 if (preempt_scan(dev, 100, 100)) 
    1994                         ieee80211_scan_flush(ic);       /* NB: could optimize */ 
    1995                 else 
    1996                         return -ETIMEDOUT; 
    1997  
     1959                ieee80211_scan_flush(ic);       /* NB: could optimize */ 
    19981960                vap->iv_des_mode = mode; 
    1999                 if (IS_UP_AUTO(vap)) 
     1961                                 
     1962                if (IS_UP_AUTO(vap)) { 
     1963                        ieee80211_cancel_scan(vap); 
     1964                        itr_count = 0; 
     1965                        while ((ic->ic_flags & IEEE80211_F_SCAN) != 0) { 
     1966                                mdelay(1);      /* XXX: ugly */ 
     1967                                if (itr_count < 100) { 
     1968                                        itr_count++; 
     1969                                        continue; 
     1970                                } 
     1971                                IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, 
     1972                                  "%s: Timeout cancelling current scan.}n", 
     1973                                  __func__); 
     1974                                return -ETIMEDOUT; 
     1975                        } 
    20001976                        ieee80211_new_state(vap, IEEE80211_S_SCAN, 0); 
     1977                } 
    20011978 
    20021979                retv = 0; 
    20031980        }