3164
static void airo_handle_cisco_mic(struct airo_info *ai)
3166
if (test_bit(FLAG_MIC_CAPABLE, &ai->flags)) {
3167
set_bit(JOB_MIC, &ai->jobs);
3168
wake_up_interruptible(&ai->thr_wait);
3172
/* Airo Status codes */
3173
#define STAT_NOBEACON 0x8000 /* Loss of sync - missed beacons */
3174
#define STAT_MAXRETRIES 0x8001 /* Loss of sync - max retries */
3175
#define STAT_MAXARL 0x8002 /* Loss of sync - average retry level exceeded*/
3176
#define STAT_FORCELOSS 0x8003 /* Loss of sync - host request */
3177
#define STAT_TSFSYNC 0x8004 /* Loss of sync - TSF synchronization */
3178
#define STAT_DEAUTH 0x8100 /* low byte is 802.11 reason code */
3179
#define STAT_DISASSOC 0x8200 /* low byte is 802.11 reason code */
3180
#define STAT_ASSOC_FAIL 0x8400 /* low byte is 802.11 reason code */
3181
#define STAT_AUTH_FAIL 0x0300 /* low byte is 802.11 reason code */
3182
#define STAT_ASSOC 0x0400 /* Associated */
3183
#define STAT_REASSOC 0x0600 /* Reassociated? Only on firmware >= 5.30.17 */
3185
static void airo_print_status(const char *devname, u16 status)
3187
u8 reason = status & 0xFF;
3191
airo_print_dbg(devname, "link lost (missed beacons)");
3193
case STAT_MAXRETRIES:
3195
airo_print_dbg(devname, "link lost (max retries)");
3197
case STAT_FORCELOSS:
3198
airo_print_dbg(devname, "link lost (local choice)");
3201
airo_print_dbg(devname, "link lost (TSF sync lost)");
3204
airo_print_dbg(devname, "deauthenticated (reason: %d)", reason);
3207
airo_print_dbg(devname, "disassociated (reason: %d)", reason);
3209
case STAT_ASSOC_FAIL:
3210
airo_print_dbg(devname, "association failed (reason: %d)",
3213
case STAT_AUTH_FAIL:
3214
airo_print_dbg(devname, "authentication failed (reason: %d)",
3222
static void airo_handle_link(struct airo_info *ai)
3224
union iwreq_data wrqu;
3225
int scan_forceloss = 0;
3228
/* Get new status and acknowledge the link change */
3229
status = le16_to_cpu(IN4500(ai, LINKSTAT));
3230
OUT4500(ai, EVACK, EV_LINK);
3232
if ((status == STAT_FORCELOSS) && (ai->scan_timeout > 0))
3235
airo_print_status(ai->dev->name, status);
3237
if ((status == STAT_ASSOC) || (status == STAT_REASSOC)) {
3240
if (ai->list_bss_task)
3241
wake_up_process(ai->list_bss_task);
3242
set_bit(FLAG_UPDATE_UNI, &ai->flags);
3243
set_bit(FLAG_UPDATE_MULTI, &ai->flags);
3245
if (down_trylock(&ai->sem) != 0) {
3246
set_bit(JOB_EVENT, &ai->jobs);
3247
wake_up_interruptible(&ai->thr_wait);
3249
airo_send_event(ai->dev);
3250
} else if (!scan_forceloss) {
3251
if (auto_wep && !ai->expires) {
3252
ai->expires = RUN_AT(3*HZ);
3253
wake_up_interruptible(&ai->thr_wait);
3256
/* Send event to user space */
3257
memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN);
3258
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
3259
wireless_send_event(ai->dev, SIOCGIWAP, &wrqu, NULL);
3263
static void airo_handle_rx(struct airo_info *ai)
3265
struct sk_buff *skb = NULL;
3266
__le16 fc, v, *buffer, tmpbuf[4];
3267
u16 len, hdrlen = 0, gap, fid;
3271
if (test_bit(FLAG_MPI, &ai->flags)) {
3272
if (test_bit(FLAG_802_11, &ai->flags))
3273
mpi_receive_802_11(ai);
3275
mpi_receive_802_3(ai);
3276
OUT4500(ai, EVACK, EV_RX);
3280
fid = IN4500(ai, RXFID);
3282
/* Get the packet length */
3283
if (test_bit(FLAG_802_11, &ai->flags)) {
3284
bap_setup (ai, fid, 4, BAP0);
3285
bap_read (ai, (__le16*)&hdr, sizeof(hdr), BAP0);
3286
/* Bad CRC. Ignore packet */
3287
if (le16_to_cpu(hdr.status) & 2)
3289
if (ai->wifidev == NULL)
3292
bap_setup(ai, fid, 0x36, BAP0);
3293
bap_read(ai, &hdr.len, 2, BAP0);
3295
len = le16_to_cpu(hdr.len);
3297
if (len > AIRO_DEF_MTU) {
3298
airo_print_err(ai->dev->name, "Bad size %d", len);
3304
if (test_bit(FLAG_802_11, &ai->flags)) {
3305
bap_read(ai, &fc, sizeof (fc), BAP0);
3306
hdrlen = header_len(fc);
3308
hdrlen = ETH_ALEN * 2;
3310
skb = dev_alloc_skb(len + hdrlen + 2 + 2);
3312
ai->dev->stats.rx_dropped++;
3316
skb_reserve(skb, 2); /* This way the IP header is aligned */
3317
buffer = (__le16 *) skb_put(skb, len + hdrlen);
3318
if (test_bit(FLAG_802_11, &ai->flags)) {
3320
bap_read(ai, buffer + 1, hdrlen - 2, BAP0);
3322
bap_read(ai, tmpbuf, 6, BAP0);
3324
bap_read(ai, &v, sizeof(v), BAP0);
3325
gap = le16_to_cpu(v);
3328
bap_read(ai, tmpbuf, gap, BAP0);
3330
airo_print_err(ai->dev->name, "gaplen too "
3331
"big. Problems will follow...");
3334
bap_read(ai, buffer + hdrlen/2, len, BAP0);
3338
bap_read(ai, buffer, ETH_ALEN * 2, BAP0);
3339
if (ai->micstats.enabled) {
3340
bap_read(ai, (__le16 *) &micbuf, sizeof (micbuf), BAP0);
3341
if (ntohs(micbuf.typelen) > 0x05DC)
3342
bap_setup(ai, fid, 0x44, BAP0);
3344
if (len <= sizeof (micbuf)) {
3345
dev_kfree_skb_irq(skb);
3349
len -= sizeof(micbuf);
3350
skb_trim(skb, len + hdrlen);
3354
bap_read(ai, buffer + ETH_ALEN, len, BAP0);
3355
if (decapsulate(ai, &micbuf, (etherHead*) buffer, len))
3356
dev_kfree_skb_irq (skb);
3362
if (success && (ai->spy_data.spy_number > 0)) {
3364
struct iw_quality wstats;
3366
/* Prepare spy data : addr + qual */
3367
if (!test_bit(FLAG_802_11, &ai->flags)) {
3368
sa = (char *) buffer + 6;
3369
bap_setup(ai, fid, 8, BAP0);
3370
bap_read(ai, (__le16 *) hdr.rssi, 2, BAP0);
3372
sa = (char *) buffer + 10;
3373
wstats.qual = hdr.rssi[0];
3375
wstats.level = 0x100 - ai->rssi[hdr.rssi[1]].rssidBm;
3377
wstats.level = (hdr.rssi[1] + 321) / 2;
3378
wstats.noise = ai->wstats.qual.noise;
3379
wstats.updated = IW_QUAL_LEVEL_UPDATED
3380
| IW_QUAL_QUAL_UPDATED
3382
/* Update spy records */
3383
wireless_spy_update(ai->dev, sa, &wstats);
3385
#endif /* WIRELESS_SPY */
3388
OUT4500(ai, EVACK, EV_RX);
3391
if (test_bit(FLAG_802_11, &ai->flags)) {
3392
skb_reset_mac_header(skb);
3393
skb->pkt_type = PACKET_OTHERHOST;
3394
skb->dev = ai->wifidev;
3395
skb->protocol = htons(ETH_P_802_2);
3397
skb->protocol = eth_type_trans(skb, ai->dev);
3398
skb->ip_summed = CHECKSUM_NONE;
3404
static void airo_handle_tx(struct airo_info *ai, u16 status)
3406
int i, len = 0, index = -1;
3409
if (test_bit(FLAG_MPI, &ai->flags)) {
3410
unsigned long flags;
3412
if (status & EV_TXEXC)
3413
get_tx_error(ai, -1);
3415
spin_lock_irqsave(&ai->aux_lock, flags);
3416
if (!skb_queue_empty(&ai->txq)) {
3417
spin_unlock_irqrestore(&ai->aux_lock,flags);
3418
mpi_send_packet(ai->dev);
3420
clear_bit(FLAG_PENDING_XMIT, &ai->flags);
3421
spin_unlock_irqrestore(&ai->aux_lock,flags);
3422
netif_wake_queue(ai->dev);
3424
OUT4500(ai, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC));
3428
fid = IN4500(ai, TXCOMPLFID);
3430
for(i = 0; i < MAX_FIDS; i++) {
3431
if ((ai->fids[i] & 0xffff) == fid) {
3432
len = ai->fids[i] >> 16;
3438
if (status & EV_TXEXC)
3439
get_tx_error(ai, index);
3441
OUT4500(ai, EVACK, status & (EV_TX | EV_TXEXC));
3443
/* Set up to be used again */
3444
ai->fids[index] &= 0xffff;
3445
if (index < MAX_FIDS / 2) {
3446
if (!test_bit(FLAG_PENDING_XMIT, &ai->flags))
3447
netif_wake_queue(ai->dev);
3449
if (!test_bit(FLAG_PENDING_XMIT11, &ai->flags))
3450
netif_wake_queue(ai->wifidev);
3453
OUT4500(ai, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC));
3454
airo_print_err(ai->dev->name, "Unallocated FID was used to xmit");
3130
3458
static irqreturn_t airo_interrupt(int irq, void *dev_id)
3132
3460
struct net_device *dev = dev_id;
3135
struct airo_info *apriv = dev->ml_priv;
3136
u16 savedInterrupts = 0;
3461
u16 status, savedInterrupts = 0;
3462
struct airo_info *ai = dev->ml_priv;
3137
3463
int handled = 0;
3139
3465
if (!netif_device_present(dev))
3140
3466
return IRQ_NONE;
3143
status = IN4500( apriv, EVSTAT );
3144
if ( !(status & STATUS_INTS) || status == 0xffff ) break;
3469
status = IN4500(ai, EVSTAT);
3470
if (!(status & STATUS_INTS) || (status == 0xffff))
3148
if ( status & EV_AWAKE ) {
3149
OUT4500( apriv, EVACK, EV_AWAKE );
3150
OUT4500( apriv, EVACK, EV_AWAKE );
3475
if (status & EV_AWAKE) {
3476
OUT4500(ai, EVACK, EV_AWAKE);
3477
OUT4500(ai, EVACK, EV_AWAKE);
3153
3480
if (!savedInterrupts) {
3154
savedInterrupts = IN4500( apriv, EVINTEN );
3155
OUT4500( apriv, EVINTEN, 0 );
3158
if ( status & EV_MIC ) {
3159
OUT4500( apriv, EVACK, EV_MIC );
3160
if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) {
3161
set_bit(JOB_MIC, &apriv->jobs);
3162
wake_up_interruptible(&apriv->thr_wait);
3165
if ( status & EV_LINK ) {
3166
union iwreq_data wrqu;
3167
int scan_forceloss = 0;
3168
/* The link status has changed, if you want to put a
3169
monitor hook in, do it here. (Remember that
3170
interrupts are still disabled!)
3172
u16 newStatus = IN4500(apriv, LINKSTAT);
3173
OUT4500( apriv, EVACK, EV_LINK);
3174
/* Here is what newStatus means: */
3175
#define NOBEACON 0x8000 /* Loss of sync - missed beacons */
3176
#define MAXRETRIES 0x8001 /* Loss of sync - max retries */
3177
#define MAXARL 0x8002 /* Loss of sync - average retry level exceeded*/
3178
#define FORCELOSS 0x8003 /* Loss of sync - host request */
3179
#define TSFSYNC 0x8004 /* Loss of sync - TSF synchronization */
3180
#define DEAUTH 0x8100 /* Deauthentication (low byte is reason code) */
3181
#define DISASS 0x8200 /* Disassociation (low byte is reason code) */
3182
#define ASSFAIL 0x8400 /* Association failure (low byte is reason
3184
#define AUTHFAIL 0x0300 /* Authentication failure (low byte is reason
3186
#define ASSOCIATED 0x0400 /* Associated */
3187
#define REASSOCIATED 0x0600 /* Reassociated? Only on firmware >= 5.30.17 */
3188
#define RC_RESERVED 0 /* Reserved return code */
3189
#define RC_NOREASON 1 /* Unspecified reason */
3190
#define RC_AUTHINV 2 /* Previous authentication invalid */
3191
#define RC_DEAUTH 3 /* Deauthenticated because sending station is
3193
#define RC_NOACT 4 /* Disassociated due to inactivity */
3194
#define RC_MAXLOAD 5 /* Disassociated because AP is unable to handle
3195
all currently associated stations */
3196
#define RC_BADCLASS2 6 /* Class 2 frame received from
3197
non-Authenticated station */
3198
#define RC_BADCLASS3 7 /* Class 3 frame received from
3199
non-Associated station */
3200
#define RC_STATLEAVE 8 /* Disassociated because sending station is
3202
#define RC_NOAUTH 9 /* Station requesting (Re)Association is not
3203
Authenticated with the responding station */
3204
if (newStatus == FORCELOSS && apriv->scan_timeout > 0)
3206
if(newStatus == ASSOCIATED || newStatus == REASSOCIATED) {
3209
if (apriv->list_bss_task)
3210
wake_up_process(apriv->list_bss_task);
3211
set_bit(FLAG_UPDATE_UNI, &apriv->flags);
3212
set_bit(FLAG_UPDATE_MULTI, &apriv->flags);
3214
if (down_trylock(&apriv->sem) != 0) {
3215
set_bit(JOB_EVENT, &apriv->jobs);
3216
wake_up_interruptible(&apriv->thr_wait);
3218
airo_send_event(dev);
3219
} else if (!scan_forceloss) {
3220
if (auto_wep && !apriv->expires) {
3221
apriv->expires = RUN_AT(3*HZ);
3222
wake_up_interruptible(&apriv->thr_wait);
3225
/* Send event to user space */
3226
memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN);
3227
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
3228
wireless_send_event(dev, SIOCGIWAP, &wrqu,NULL);
3481
savedInterrupts = IN4500(ai, EVINTEN);
3482
OUT4500(ai, EVINTEN, 0);
3485
if (status & EV_MIC) {
3486
OUT4500(ai, EVACK, EV_MIC);
3487
airo_handle_cisco_mic(ai);
3490
if (status & EV_LINK) {
3491
/* Link status changed */
3492
airo_handle_link(ai);
3232
3495
/* Check to see if there is something to receive */
3233
if ( status & EV_RX ) {
3234
struct sk_buff *skb = NULL;
3236
u16 len, hdrlen = 0;
3250
if (test_bit(FLAG_MPI,&apriv->flags)) {
3251
if (test_bit(FLAG_802_11, &apriv->flags))
3252
mpi_receive_802_11(apriv);
3254
mpi_receive_802_3(apriv);
3255
OUT4500(apriv, EVACK, EV_RX);
3259
fid = IN4500( apriv, RXFID );
3261
/* Get the packet length */
3262
if (test_bit(FLAG_802_11, &apriv->flags)) {
3263
bap_setup (apriv, fid, 4, BAP0);
3264
bap_read (apriv, (__le16*)&hdr, sizeof(hdr), BAP0);
3265
/* Bad CRC. Ignore packet */
3266
if (le16_to_cpu(hdr.status) & 2)
3268
if (apriv->wifidev == NULL)
3271
bap_setup (apriv, fid, 0x36, BAP0);
3272
bap_read (apriv, &hdr.len, 2, BAP0);
3274
len = le16_to_cpu(hdr.len);
3276
if (len > AIRO_DEF_MTU) {
3277
airo_print_err(apriv->dev->name, "Bad size %d", len);
3283
if (test_bit(FLAG_802_11, &apriv->flags)) {
3284
bap_read (apriv, &fc, sizeof(fc), BAP0);
3285
hdrlen = header_len(fc);
3287
hdrlen = ETH_ALEN * 2;
3289
skb = dev_alloc_skb( len + hdrlen + 2 + 2 );
3291
dev->stats.rx_dropped++;
3294
skb_reserve(skb, 2); /* This way the IP header is aligned */
3295
buffer = (__le16*)skb_put (skb, len + hdrlen);
3296
if (test_bit(FLAG_802_11, &apriv->flags)) {
3298
bap_read (apriv, buffer + 1, hdrlen - 2, BAP0);
3300
bap_read (apriv, tmpbuf, 6, BAP0);
3302
bap_read (apriv, &v, sizeof(v), BAP0);
3303
gap = le16_to_cpu(v);
3306
bap_read (apriv, tmpbuf, gap, BAP0);
3308
airo_print_err(apriv->dev->name, "gaplen too "
3309
"big. Problems will follow...");
3312
bap_read (apriv, buffer + hdrlen/2, len, BAP0);
3315
bap_read (apriv, buffer, ETH_ALEN*2, BAP0);
3316
if (apriv->micstats.enabled) {
3317
bap_read (apriv,(__le16*)&micbuf,sizeof(micbuf),BAP0);
3318
if (ntohs(micbuf.typelen) > 0x05DC)
3319
bap_setup (apriv, fid, 0x44, BAP0);
3321
if (len <= sizeof(micbuf))
3324
len -= sizeof(micbuf);
3325
skb_trim (skb, len + hdrlen);
3328
bap_read(apriv,buffer+ETH_ALEN,len,BAP0);
3329
if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) {
3331
dev_kfree_skb_irq (skb);
3333
OUT4500( apriv, EVACK, EV_RX);
3338
if (apriv->spy_data.spy_number > 0) {
3340
struct iw_quality wstats;
3341
/* Prepare spy data : addr + qual */
3342
if (!test_bit(FLAG_802_11, &apriv->flags)) {
3343
sa = (char*)buffer + 6;
3344
bap_setup (apriv, fid, 8, BAP0);
3345
bap_read (apriv, (__le16*)hdr.rssi, 2, BAP0);
3347
sa = (char*)buffer + 10;
3348
wstats.qual = hdr.rssi[0];
3350
wstats.level = 0x100 - apriv->rssi[hdr.rssi[1]].rssidBm;
3352
wstats.level = (hdr.rssi[1] + 321) / 2;
3353
wstats.noise = apriv->wstats.qual.noise;
3354
wstats.updated = IW_QUAL_LEVEL_UPDATED
3355
| IW_QUAL_QUAL_UPDATED
3357
/* Update spy records */
3358
wireless_spy_update(dev, sa, &wstats);
3360
#endif /* WIRELESS_SPY */
3361
OUT4500( apriv, EVACK, EV_RX);
3363
if (test_bit(FLAG_802_11, &apriv->flags)) {
3364
skb_reset_mac_header(skb);
3365
skb->pkt_type = PACKET_OTHERHOST;
3366
skb->dev = apriv->wifidev;
3367
skb->protocol = htons(ETH_P_802_2);
3369
skb->protocol = eth_type_trans(skb,dev);
3370
skb->ip_summed = CHECKSUM_NONE;
3376
3499
/* Check to see if a packet has been transmitted */
3377
if ( status & ( EV_TX|EV_TXCPY|EV_TXEXC ) ) {
3382
if (test_bit(FLAG_MPI,&apriv->flags)) {
3383
unsigned long flags;
3385
if (status & EV_TXEXC)
3386
get_tx_error(apriv, -1);
3387
spin_lock_irqsave(&apriv->aux_lock, flags);
3388
if (!skb_queue_empty(&apriv->txq)) {
3389
spin_unlock_irqrestore(&apriv->aux_lock,flags);
3390
mpi_send_packet (dev);
3392
clear_bit(FLAG_PENDING_XMIT, &apriv->flags);
3393
spin_unlock_irqrestore(&apriv->aux_lock,flags);
3394
netif_wake_queue (dev);
3396
OUT4500( apriv, EVACK,
3397
status & (EV_TX|EV_TXCPY|EV_TXEXC));
3401
fid = IN4500(apriv, TXCOMPLFID);
3403
for( i = 0; i < MAX_FIDS; i++ ) {
3404
if ( ( apriv->fids[i] & 0xffff ) == fid ) {
3405
len = apriv->fids[i] >> 16;
3410
if (status & EV_TXEXC)
3411
get_tx_error(apriv, index);
3412
OUT4500( apriv, EVACK, status & (EV_TX | EV_TXEXC));
3413
/* Set up to be used again */
3414
apriv->fids[index] &= 0xffff;
3415
if (index < MAX_FIDS / 2) {
3416
if (!test_bit(FLAG_PENDING_XMIT, &apriv->flags))
3417
netif_wake_queue(dev);
3419
if (!test_bit(FLAG_PENDING_XMIT11, &apriv->flags))
3420
netif_wake_queue(apriv->wifidev);
3423
OUT4500( apriv, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC));
3424
airo_print_err(apriv->dev->name, "Unallocated FID was "
3429
if ( status & ~STATUS_INTS & ~IGNORE_INTS )
3430
airo_print_warn(apriv->dev->name, "Got weird status %x",
3500
if (status & (EV_TX | EV_TXCPY | EV_TXEXC))
3501
airo_handle_tx(ai, status);
3503
if ( status & ~STATUS_INTS & ~IGNORE_INTS ) {
3504
airo_print_warn(ai->dev->name, "Got weird status %x",
3431
3505
status & ~STATUS_INTS & ~IGNORE_INTS );
3434
3509
if (savedInterrupts)
3435
OUT4500( apriv, EVINTEN, savedInterrupts );
3510
OUT4500(ai, EVINTEN, savedInterrupts);
3438
3512
return IRQ_RETVAL(handled);
5134
/* Returns the length of the key at the index. If index == 0xffff
5135
* the index of the transmit key is returned. If the key doesn't exist,
5136
* -1 will be returned.
5199
/* Returns the WEP key at the specified index, or -1 if that key does
5200
* not exist. The buffer is assumed to be at least 16 bytes in length.
5138
static int get_wep_key(struct airo_info *ai, u16 index) {
5202
static int get_wep_key(struct airo_info *ai, u16 index, char *buf, u16 buflen)
5141
5206
__le16 lastindex;
5143
5208
rc = readWepKeyRid(ai, &wkr, 1, 1);
5144
if (rc == SUCCESS) do {
5145
5212
lastindex = wkr.kindex;
5146
if (wkr.kindex == cpu_to_le16(index)) {
5147
if (index == 0xffff) {
5150
return le16_to_cpu(wkr.klen);
5213
if (le16_to_cpu(wkr.kindex) == index) {
5214
int klen = min_t(int, buflen, le16_to_cpu(wkr.klen));
5215
memcpy(buf, wkr.key, klen);
5152
readWepKeyRid(ai, &wkr, 0, 1);
5153
} while (lastindex != wkr.kindex);
5157
static int set_wep_key(struct airo_info *ai, u16 index,
5158
const char *key, u16 keylen, int perm, int lock )
5218
rc = readWepKeyRid(ai, &wkr, 0, 1);
5221
} while (lastindex != wkr.kindex);
5225
static int get_wep_tx_idx(struct airo_info *ai)
5231
rc = readWepKeyRid(ai, &wkr, 1, 1);
5235
lastindex = wkr.kindex;
5236
if (wkr.kindex == cpu_to_le16(0xffff))
5238
rc = readWepKeyRid(ai, &wkr, 0, 1);
5241
} while (lastindex != wkr.kindex);
5245
static int set_wep_key(struct airo_info *ai, u16 index, const char *key,
5246
u16 keylen, int perm, int lock)
5160
5248
static const unsigned char macaddr[ETH_ALEN] = { 0x01, 0, 0, 0, 0, 0 };
5163
memset(&wkr, 0, sizeof(wkr));
5164
5252
if (keylen == 0) {
5165
// We are selecting which key to use
5166
wkr.len = cpu_to_le16(sizeof(wkr));
5167
wkr.kindex = cpu_to_le16(0xffff);
5168
wkr.mac[0] = (char)index;
5169
if (perm) ai->defindex = (char)index;
5171
// We are actually setting the key
5172
wkr.len = cpu_to_le16(sizeof(wkr));
5173
wkr.kindex = cpu_to_le16(index);
5174
wkr.klen = cpu_to_le16(keylen);
5175
memcpy( wkr.key, key, keylen );
5176
memcpy( wkr.mac, macaddr, ETH_ALEN );
5253
airo_print_err(ai->dev->name, "%s: key length to set was zero",
5258
memset(&wkr, 0, sizeof(wkr));
5259
wkr.len = cpu_to_le16(sizeof(wkr));
5260
wkr.kindex = cpu_to_le16(index);
5261
wkr.klen = cpu_to_le16(keylen);
5262
memcpy(wkr.key, key, keylen);
5263
memcpy(wkr.mac, macaddr, ETH_ALEN);
5179
5265
if (perm) disable_MAC(ai, lock);
5180
writeWepKeyRid(ai, &wkr, perm, lock);
5266
rc = writeWepKeyRid(ai, &wkr, perm, lock);
5181
5267
if (perm) enable_MAC(ai, lock);
5271
static int set_wep_tx_idx(struct airo_info *ai, u16 index, int perm, int lock)
5276
memset(&wkr, 0, sizeof(wkr));
5277
wkr.len = cpu_to_le16(sizeof(wkr));
5278
wkr.kindex = cpu_to_le16(0xffff);
5279
wkr.mac[0] = (char)index;
5282
ai->defindex = (char)index;
5283
disable_MAC(ai, lock);
5286
rc = writeWepKeyRid(ai, &wkr, perm, lock);
5289
enable_MAC(ai, lock);
5185
5293
static void proc_wepkey_on_close( struct inode *inode, struct file *file ) {