diff options
Diffstat (limited to 'drivers/net/wireless/airo.c')
-rw-r--r-- | drivers/net/wireless/airo.c | 46 |
1 files changed, 17 insertions, 29 deletions
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index 108d9fed8f07..00764ddd74d8 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
@@ -3139,6 +3139,7 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) | |||
3139 | } | 3139 | } |
3140 | if ( status & EV_LINK ) { | 3140 | if ( status & EV_LINK ) { |
3141 | union iwreq_data wrqu; | 3141 | union iwreq_data wrqu; |
3142 | int scan_forceloss = 0; | ||
3142 | /* The link status has changed, if you want to put a | 3143 | /* The link status has changed, if you want to put a |
3143 | monitor hook in, do it here. (Remember that | 3144 | monitor hook in, do it here. (Remember that |
3144 | interrupts are still disabled!) | 3145 | interrupts are still disabled!) |
@@ -3157,7 +3158,8 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) | |||
3157 | code) */ | 3158 | code) */ |
3158 | #define AUTHFAIL 0x0300 /* Authentication failure (low byte is reason | 3159 | #define AUTHFAIL 0x0300 /* Authentication failure (low byte is reason |
3159 | code) */ | 3160 | code) */ |
3160 | #define ASSOCIATED 0x0400 /* Assocatied */ | 3161 | #define ASSOCIATED 0x0400 /* Associated */ |
3162 | #define REASSOCIATED 0x0600 /* Reassociated? Only on firmware >= 5.30.17 */ | ||
3161 | #define RC_RESERVED 0 /* Reserved return code */ | 3163 | #define RC_RESERVED 0 /* Reserved return code */ |
3162 | #define RC_NOREASON 1 /* Unspecified reason */ | 3164 | #define RC_NOREASON 1 /* Unspecified reason */ |
3163 | #define RC_AUTHINV 2 /* Previous authentication invalid */ | 3165 | #define RC_AUTHINV 2 /* Previous authentication invalid */ |
@@ -3174,44 +3176,30 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) | |||
3174 | leaving BSS */ | 3176 | leaving BSS */ |
3175 | #define RC_NOAUTH 9 /* Station requesting (Re)Association is not | 3177 | #define RC_NOAUTH 9 /* Station requesting (Re)Association is not |
3176 | Authenticated with the responding station */ | 3178 | Authenticated with the responding station */ |
3177 | if (newStatus != ASSOCIATED) { | 3179 | if (newStatus == FORCELOSS && apriv->scan_timeout > 0) |
3178 | if (auto_wep && !apriv->expires) { | 3180 | scan_forceloss = 1; |
3179 | apriv->expires = RUN_AT(3*HZ); | 3181 | if(newStatus == ASSOCIATED || newStatus == REASSOCIATED) { |
3180 | wake_up_interruptible(&apriv->thr_wait); | ||
3181 | } | ||
3182 | } else { | ||
3183 | struct task_struct *task = apriv->task; | ||
3184 | if (auto_wep) | 3182 | if (auto_wep) |
3185 | apriv->expires = 0; | 3183 | apriv->expires = 0; |
3186 | if (task) | 3184 | if (apriv->task) |
3187 | wake_up_process (task); | 3185 | wake_up_process (apriv->task); |
3188 | set_bit(FLAG_UPDATE_UNI, &apriv->flags); | 3186 | set_bit(FLAG_UPDATE_UNI, &apriv->flags); |
3189 | set_bit(FLAG_UPDATE_MULTI, &apriv->flags); | 3187 | set_bit(FLAG_UPDATE_MULTI, &apriv->flags); |
3190 | } | 3188 | |
3191 | /* Question : is ASSOCIATED the only status | ||
3192 | * that is valid ? We want to catch handover | ||
3193 | * and reassociations as valid status | ||
3194 | * Jean II */ | ||
3195 | if(newStatus == ASSOCIATED) { | ||
3196 | #if 0 | ||
3197 | /* FIXME: Grabbing scan results here | ||
3198 | * seems to be too early??? Just wait for | ||
3199 | * timeout instead. */ | ||
3200 | if (apriv->scan_timeout > 0) { | ||
3201 | set_bit(JOB_SCAN_RESULTS, &apriv->flags); | ||
3202 | wake_up_interruptible(&apriv->thr_wait); | ||
3203 | } | ||
3204 | #endif | ||
3205 | if (down_trylock(&apriv->sem) != 0) { | 3189 | if (down_trylock(&apriv->sem) != 0) { |
3206 | set_bit(JOB_EVENT, &apriv->flags); | 3190 | set_bit(JOB_EVENT, &apriv->flags); |
3207 | wake_up_interruptible(&apriv->thr_wait); | 3191 | wake_up_interruptible(&apriv->thr_wait); |
3208 | } else | 3192 | } else |
3209 | airo_send_event(dev); | 3193 | airo_send_event(dev); |
3210 | } else { | 3194 | } else if (!scan_forceloss) { |
3211 | memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN); | 3195 | if (auto_wep && !apriv->expires) { |
3212 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; | 3196 | apriv->expires = RUN_AT(3*HZ); |
3197 | wake_up_interruptible(&apriv->thr_wait); | ||
3198 | } | ||
3213 | 3199 | ||
3214 | /* Send event to user space */ | 3200 | /* Send event to user space */ |
3201 | memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN); | ||
3202 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; | ||
3215 | wireless_send_event(dev, SIOCGIWAP, &wrqu,NULL); | 3203 | wireless_send_event(dev, SIOCGIWAP, &wrqu,NULL); |
3216 | } | 3204 | } |
3217 | } | 3205 | } |
@@ -7136,10 +7124,10 @@ static int airo_set_scan(struct net_device *dev, | |||
7136 | goto out; | 7124 | goto out; |
7137 | 7125 | ||
7138 | /* Initiate a scan command */ | 7126 | /* Initiate a scan command */ |
7127 | ai->scan_timeout = RUN_AT(3*HZ); | ||
7139 | memset(&cmd, 0, sizeof(cmd)); | 7128 | memset(&cmd, 0, sizeof(cmd)); |
7140 | cmd.cmd=CMD_LISTBSS; | 7129 | cmd.cmd=CMD_LISTBSS; |
7141 | issuecommand(ai, &cmd, &rsp); | 7130 | issuecommand(ai, &cmd, &rsp); |
7142 | ai->scan_timeout = RUN_AT(3*HZ); | ||
7143 | wake = 1; | 7131 | wake = 1; |
7144 | 7132 | ||
7145 | out: | 7133 | out: |