OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [net/] [wireless/] [zd1201.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 *      Driver for ZyDAS zd1201 based wireless USB devices.
3
 *
4
 *      Copyright (c) 2004, 2005 Jeroen Vreeken (pe1rxq@amsat.org)
5
 *
6
 *      This program is free software; you can redistribute it and/or
7
 *      modify it under the terms of the GNU General Public License
8
 *      version 2 as published by the Free Software Foundation.
9
 *
10
 *      Parts of this driver have been derived from a wlan-ng version
11
 *      modified by ZyDAS. They also made documentation available, thanks!
12
 *      Copyright (C) 1999 AbsoluteValue Systems, Inc.  All Rights Reserved.
13
 */
14
 
15
#include <linux/module.h>
16
#include <linux/usb.h>
17
#include <linux/netdevice.h>
18
#include <linux/etherdevice.h>
19
#include <linux/wireless.h>
20
#include <net/iw_handler.h>
21
#include <linux/string.h>
22
#include <linux/if_arp.h>
23
#include <linux/firmware.h>
24
#include <net/ieee80211.h>
25
#include "zd1201.h"
26
 
27
static struct usb_device_id zd1201_table[] = {
28
        {USB_DEVICE(0x0586, 0x3400)}, /* Peabird Wireless USB Adapter */
29
        {USB_DEVICE(0x0ace, 0x1201)}, /* ZyDAS ZD1201 Wireless USB Adapter */
30
        {USB_DEVICE(0x050d, 0x6051)}, /* Belkin F5D6051 usb  adapter */
31
        {USB_DEVICE(0x0db0, 0x6823)}, /* MSI UB11B usb  adapter */
32
        {USB_DEVICE(0x1044, 0x8005)}, /* GIGABYTE GN-WLBZ201 usb adapter */
33
        {}
34
};
35
 
36
static int ap;  /* Are we an AP or a normal station? */
37
 
38
#define ZD1201_VERSION  "0.15"
39
 
40
MODULE_AUTHOR("Jeroen Vreeken <pe1rxq@amsat.org>");
41
MODULE_DESCRIPTION("Driver for ZyDAS ZD1201 based USB Wireless adapters");
42
MODULE_VERSION(ZD1201_VERSION);
43
MODULE_LICENSE("GPL");
44
module_param(ap, int, 0);
45
MODULE_PARM_DESC(ap, "If non-zero Access Point firmware will be loaded");
46
MODULE_DEVICE_TABLE(usb, zd1201_table);
47
 
48
 
49
static int zd1201_fw_upload(struct usb_device *dev, int apfw)
50
{
51
        const struct firmware *fw_entry;
52
        char *data;
53
        unsigned long len;
54
        int err;
55
        unsigned char ret;
56
        char *buf;
57
        char *fwfile;
58
 
59
        if (apfw)
60
                fwfile = "zd1201-ap.fw";
61
        else
62
                fwfile = "zd1201.fw";
63
 
64
        err = request_firmware(&fw_entry, fwfile, &dev->dev);
65
        if (err) {
66
                dev_err(&dev->dev, "Failed to load %s firmware file!\n", fwfile);
67
                dev_err(&dev->dev, "Make sure the hotplug firmware loader is installed.\n");
68
                dev_err(&dev->dev, "Goto http://linux-lc100020.sourceforge.net for more info.\n");
69
                return err;
70
        }
71
 
72
        data = fw_entry->data;
73
        len = fw_entry->size;
74
 
75
        buf = kmalloc(1024, GFP_ATOMIC);
76
        if (!buf)
77
                goto exit;
78
 
79
        while (len > 0) {
80
                int translen = (len > 1024) ? 1024 : len;
81
                memcpy(buf, data, translen);
82
 
83
                err = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 0,
84
                    USB_DIR_OUT | 0x40, 0, 0, buf, translen,
85
                    ZD1201_FW_TIMEOUT);
86
                if (err < 0)
87
                        goto exit;
88
 
89
                len -= translen;
90
                data += translen;
91
        }
92
 
93
        err = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 0x2,
94
            USB_DIR_OUT | 0x40, 0, 0, NULL, 0, ZD1201_FW_TIMEOUT);
95
        if (err < 0)
96
                goto exit;
97
 
98
        err = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x4,
99
            USB_DIR_IN | 0x40, 0,0, &ret, sizeof(ret), ZD1201_FW_TIMEOUT);
100
        if (err < 0)
101
                goto exit;
102
 
103
        if (ret & 0x80) {
104
                err = -EIO;
105
                goto exit;
106
        }
107
 
108
        err = 0;
109
exit:
110
        kfree(buf);
111
        release_firmware(fw_entry);
112
        return err;
113
}
114
 
115
static void zd1201_usbfree(struct urb *urb)
116
{
117
        struct zd1201 *zd = urb->context;
118
 
119
        switch(urb->status) {
120
                case -EILSEQ:
121
                case -ENODEV:
122
                case -ETIME:
123
                case -ENOENT:
124
                case -EPIPE:
125
                case -EOVERFLOW:
126
                case -ESHUTDOWN:
127
                        dev_warn(&zd->usb->dev, "%s: urb failed: %d\n",
128
                            zd->dev->name, urb->status);
129
        }
130
 
131
        kfree(urb->transfer_buffer);
132
        usb_free_urb(urb);
133
        return;
134
}
135
 
136
/* cmdreq message:
137
        u32 type
138
        u16 cmd
139
        u16 parm0
140
        u16 parm1
141
        u16 parm2
142
        u8  pad[4]
143
 
144
        total: 4 + 2 + 2 + 2 + 2 + 4 = 16
145
*/
146
static int zd1201_docmd(struct zd1201 *zd, int cmd, int parm0,
147
                        int parm1, int parm2)
148
{
149
        unsigned char *command;
150
        int ret;
151
        struct urb *urb;
152
 
153
        command = kmalloc(16, GFP_ATOMIC);
154
        if (!command)
155
                return -ENOMEM;
156
 
157
        *((__le32*)command) = cpu_to_le32(ZD1201_USB_CMDREQ);
158
        *((__le16*)&command[4]) = cpu_to_le16(cmd);
159
        *((__le16*)&command[6]) = cpu_to_le16(parm0);
160
        *((__le16*)&command[8]) = cpu_to_le16(parm1);
161
        *((__le16*)&command[10])= cpu_to_le16(parm2);
162
 
163
        urb = usb_alloc_urb(0, GFP_ATOMIC);
164
        if (!urb) {
165
                kfree(command);
166
                return -ENOMEM;
167
        }
168
        usb_fill_bulk_urb(urb, zd->usb, usb_sndbulkpipe(zd->usb, zd->endp_out2),
169
                          command, 16, zd1201_usbfree, zd);
170
        ret = usb_submit_urb(urb, GFP_ATOMIC);
171
        if (ret) {
172
                kfree(command);
173
                usb_free_urb(urb);
174
        }
175
 
176
        return ret;
177
}
178
 
179
/* Callback after sending out a packet */
180
static void zd1201_usbtx(struct urb *urb)
181
{
182
        struct zd1201 *zd = urb->context;
183
        netif_wake_queue(zd->dev);
184
        return;
185
}
186
 
187
/* Incoming data */
188
static void zd1201_usbrx(struct urb *urb)
189
{
190
        struct zd1201 *zd = urb->context;
191
        int free = 0;
192
        unsigned char *data = urb->transfer_buffer;
193
        struct sk_buff *skb;
194
        unsigned char type;
195
 
196
        if (!zd)
197
                return;
198
 
199
        switch(urb->status) {
200
                case -EILSEQ:
201
                case -ENODEV:
202
                case -ETIME:
203
                case -ENOENT:
204
                case -EPIPE:
205
                case -EOVERFLOW:
206
                case -ESHUTDOWN:
207
                        dev_warn(&zd->usb->dev, "%s: rx urb failed: %d\n",
208
                            zd->dev->name, urb->status);
209
                        free = 1;
210
                        goto exit;
211
        }
212
 
213
        if (urb->status != 0 || urb->actual_length == 0)
214
                goto resubmit;
215
 
216
        type = data[0];
217
        if (type == ZD1201_PACKET_EVENTSTAT || type == ZD1201_PACKET_RESOURCE) {
218
                memcpy(zd->rxdata, data, urb->actual_length);
219
                zd->rxlen = urb->actual_length;
220
                zd->rxdatas = 1;
221
                wake_up(&zd->rxdataq);
222
        }
223
        /* Info frame */
224
        if (type == ZD1201_PACKET_INQUIRE) {
225
                int i = 0;
226
                unsigned short infotype, framelen, copylen;
227
                framelen = le16_to_cpu(*(__le16*)&data[4]);
228
                infotype = le16_to_cpu(*(__le16*)&data[6]);
229
 
230
                if (infotype == ZD1201_INF_LINKSTATUS) {
231
                        short linkstatus;
232
 
233
                        linkstatus = le16_to_cpu(*(__le16*)&data[8]);
234
                        switch(linkstatus) {
235
                                case 1:
236
                                        netif_carrier_on(zd->dev);
237
                                        break;
238
                                case 2:
239
                                        netif_carrier_off(zd->dev);
240
                                        break;
241
                                case 3:
242
                                        netif_carrier_off(zd->dev);
243
                                        break;
244
                                case 4:
245
                                        netif_carrier_on(zd->dev);
246
                                        break;
247
                                default:
248
                                        netif_carrier_off(zd->dev);
249
                        }
250
                        goto resubmit;
251
                }
252
                if (infotype == ZD1201_INF_ASSOCSTATUS) {
253
                        short status = le16_to_cpu(*(__le16*)(data+8));
254
                        int event;
255
                        union iwreq_data wrqu;
256
 
257
                        switch (status) {
258
                                case ZD1201_ASSOCSTATUS_STAASSOC:
259
                                case ZD1201_ASSOCSTATUS_REASSOC:
260
                                        event = IWEVREGISTERED;
261
                                        break;
262
                                case ZD1201_ASSOCSTATUS_DISASSOC:
263
                                case ZD1201_ASSOCSTATUS_ASSOCFAIL:
264
                                case ZD1201_ASSOCSTATUS_AUTHFAIL:
265
                                default:
266
                                        event = IWEVEXPIRED;
267
                        }
268
                        memcpy(wrqu.addr.sa_data, data+10, ETH_ALEN);
269
                        wrqu.addr.sa_family = ARPHRD_ETHER;
270
 
271
                        /* Send event to user space */
272
                        wireless_send_event(zd->dev, event, &wrqu, NULL);
273
 
274
                        goto resubmit;
275
                }
276
                if (infotype == ZD1201_INF_AUTHREQ) {
277
                        union iwreq_data wrqu;
278
 
279
                        memcpy(wrqu.addr.sa_data, data+8, ETH_ALEN);
280
                        wrqu.addr.sa_family = ARPHRD_ETHER;
281
                        /* There isn't a event that trully fits this request.
282
                           We assume that userspace will be smart enough to
283
                           see a new station being expired and sends back a
284
                           authstation ioctl to authorize it. */
285
                        wireless_send_event(zd->dev, IWEVEXPIRED, &wrqu, NULL);
286
                        goto resubmit;
287
                }
288
                /* Other infotypes are handled outside this handler */
289
                zd->rxlen = 0;
290
                while (i < urb->actual_length) {
291
                        copylen = le16_to_cpu(*(__le16*)&data[i+2]);
292
                        /* Sanity check, sometimes we get junk */
293
                        if (copylen+zd->rxlen > sizeof(zd->rxdata))
294
                                break;
295
                        memcpy(zd->rxdata+zd->rxlen, data+i+4, copylen);
296
                        zd->rxlen += copylen;
297
                        i += 64;
298
                }
299
                if (i >= urb->actual_length) {
300
                        zd->rxdatas = 1;
301
                        wake_up(&zd->rxdataq);
302
                }
303
                goto  resubmit;
304
        }
305
        /* Actual data */
306
        if (data[urb->actual_length-1] == ZD1201_PACKET_RXDATA) {
307
                int datalen = urb->actual_length-1;
308
                unsigned short len, fc, seq;
309
                struct hlist_node *node;
310
 
311
                len = ntohs(*(__be16 *)&data[datalen-2]);
312
                if (len>datalen)
313
                        len=datalen;
314
                fc = le16_to_cpu(*(__le16 *)&data[datalen-16]);
315
                seq = le16_to_cpu(*(__le16 *)&data[datalen-24]);
316
 
317
                if (zd->monitor) {
318
                        if (datalen < 24)
319
                                goto resubmit;
320
                        if (!(skb = dev_alloc_skb(datalen+24)))
321
                                goto resubmit;
322
 
323
                        memcpy(skb_put(skb, 2), &data[datalen-16], 2);
324
                        memcpy(skb_put(skb, 2), &data[datalen-2], 2);
325
                        memcpy(skb_put(skb, 6), &data[datalen-14], 6);
326
                        memcpy(skb_put(skb, 6), &data[datalen-22], 6);
327
                        memcpy(skb_put(skb, 6), &data[datalen-8], 6);
328
                        memcpy(skb_put(skb, 2), &data[datalen-24], 2);
329
                        memcpy(skb_put(skb, len), data, len);
330
                        skb->protocol = eth_type_trans(skb, zd->dev);
331
                        skb->dev->last_rx = jiffies;
332
                        zd->stats.rx_packets++;
333
                        zd->stats.rx_bytes += skb->len;
334
                        netif_rx(skb);
335
                        goto resubmit;
336
                }
337
 
338
                if ((seq & IEEE80211_SCTL_FRAG) ||
339
                    (fc & IEEE80211_FCTL_MOREFRAGS)) {
340
                        struct zd1201_frag *frag = NULL;
341
                        char *ptr;
342
 
343
                        if (datalen<14)
344
                                goto resubmit;
345
                        if ((seq & IEEE80211_SCTL_FRAG) == 0) {
346
                                frag = kmalloc(sizeof(*frag), GFP_ATOMIC);
347
                                if (!frag)
348
                                        goto resubmit;
349
                                skb = dev_alloc_skb(IEEE80211_DATA_LEN +14+2);
350
                                if (!skb) {
351
                                        kfree(frag);
352
                                        goto resubmit;
353
                                }
354
                                frag->skb = skb;
355
                                frag->seq = seq & IEEE80211_SCTL_SEQ;
356
                                skb_reserve(skb, 2);
357
                                memcpy(skb_put(skb, 12), &data[datalen-14], 12);
358
                                memcpy(skb_put(skb, 2), &data[6], 2);
359
                                memcpy(skb_put(skb, len), data+8, len);
360
                                hlist_add_head(&frag->fnode, &zd->fraglist);
361
                                goto resubmit;
362
                        }
363
                        hlist_for_each_entry(frag, node, &zd->fraglist, fnode)
364
                                if (frag->seq == (seq&IEEE80211_SCTL_SEQ))
365
                                        break;
366
                        if (!frag)
367
                                goto resubmit;
368
                        skb = frag->skb;
369
                        ptr = skb_put(skb, len);
370
                        if (ptr)
371
                                memcpy(ptr, data+8, len);
372
                        if (fc & IEEE80211_FCTL_MOREFRAGS)
373
                                goto resubmit;
374
                        hlist_del_init(&frag->fnode);
375
                        kfree(frag);
376
                } else {
377
                        if (datalen<14)
378
                                goto resubmit;
379
                        skb = dev_alloc_skb(len + 14 + 2);
380
                        if (!skb)
381
                                goto resubmit;
382
                        skb_reserve(skb, 2);
383
                        memcpy(skb_put(skb, 12), &data[datalen-14], 12);
384
                        memcpy(skb_put(skb, 2), &data[6], 2);
385
                        memcpy(skb_put(skb, len), data+8, len);
386
                }
387
                skb->protocol = eth_type_trans(skb, zd->dev);
388
                skb->dev->last_rx = jiffies;
389
                zd->stats.rx_packets++;
390
                zd->stats.rx_bytes += skb->len;
391
                netif_rx(skb);
392
        }
393
resubmit:
394
        memset(data, 0, ZD1201_RXSIZE);
395
 
396
        urb->status = 0;
397
        urb->dev = zd->usb;
398
        if(usb_submit_urb(urb, GFP_ATOMIC))
399
                free = 1;
400
 
401
exit:
402
        if (free) {
403
                zd->rxlen = 0;
404
                zd->rxdatas = 1;
405
                wake_up(&zd->rxdataq);
406
                kfree(urb->transfer_buffer);
407
        }
408
        return;
409
}
410
 
411
static int zd1201_getconfig(struct zd1201 *zd, int rid, void *riddata,
412
        unsigned int riddatalen)
413
{
414
        int err;
415
        int i = 0;
416
        int code;
417
        int rid_fid;
418
        int length;
419
        unsigned char *pdata;
420
 
421
        zd->rxdatas = 0;
422
        err = zd1201_docmd(zd, ZD1201_CMDCODE_ACCESS, rid, 0, 0);
423
        if (err)
424
                return err;
425
 
426
        wait_event_interruptible(zd->rxdataq, zd->rxdatas);
427
        if (!zd->rxlen)
428
                return -EIO;
429
 
430
        code = le16_to_cpu(*(__le16*)(&zd->rxdata[4]));
431
        rid_fid = le16_to_cpu(*(__le16*)(&zd->rxdata[6]));
432
        length = le16_to_cpu(*(__le16*)(&zd->rxdata[8]));
433
        if (length > zd->rxlen)
434
                length = zd->rxlen-6;
435
 
436
        /* If access bit is not on, then error */
437
        if ((code & ZD1201_ACCESSBIT) != ZD1201_ACCESSBIT || rid_fid != rid )
438
                return -EINVAL;
439
 
440
        /* Not enough buffer for allocating data */
441
        if (riddatalen != (length - 4)) {
442
                dev_dbg(&zd->usb->dev, "riddatalen mismatches, expected=%u, (packet=%u) length=%u, rid=0x%04X, rid_fid=0x%04X\n",
443
                    riddatalen, zd->rxlen, length, rid, rid_fid);
444
                return -ENODATA;
445
        }
446
 
447
        zd->rxdatas = 0;
448
        /* Issue SetRxRid commnd */
449
        err = zd1201_docmd(zd, ZD1201_CMDCODE_SETRXRID, rid, 0, length);
450
        if (err)
451
                return err;
452
 
453
        /* Receive RID record from resource packets */
454
        wait_event_interruptible(zd->rxdataq, zd->rxdatas);
455
        if (!zd->rxlen)
456
                return -EIO;
457
 
458
        if (zd->rxdata[zd->rxlen - 1] != ZD1201_PACKET_RESOURCE) {
459
                dev_dbg(&zd->usb->dev, "Packet type mismatch: 0x%x not 0x3\n",
460
                    zd->rxdata[zd->rxlen-1]);
461
                return -EINVAL;
462
        }
463
 
464
        /* Set the data pointer and received data length */
465
        pdata = zd->rxdata;
466
        length = zd->rxlen;
467
 
468
        do {
469
                int actual_length;
470
 
471
                actual_length = (length > 64) ? 64 : length;
472
 
473
                if (pdata[0] != 0x3) {
474
                        dev_dbg(&zd->usb->dev, "Rx Resource packet type error: %02X\n",
475
                            pdata[0]);
476
                        return -EINVAL;
477
                }
478
 
479
                if (actual_length != 64) {
480
                        /* Trim the last packet type byte */
481
                        actual_length--;
482
                }
483
 
484
                /* Skip the 4 bytes header (RID length and RID) */
485
                if (i == 0) {
486
                        pdata += 8;
487
                        actual_length -= 8;
488
                } else {
489
                        pdata += 4;
490
                        actual_length -= 4;
491
                }
492
 
493
                memcpy(riddata, pdata, actual_length);
494
                riddata += actual_length;
495
                pdata += actual_length;
496
                length -= 64;
497
                i++;
498
        } while (length > 0);
499
 
500
        return 0;
501
}
502
 
503
/*
504
 *      resreq:
505
 *              byte    type
506
 *              byte    sequence
507
 *              u16     reserved
508
 *              byte    data[12]
509
 *      total: 16
510
 */
511
static int zd1201_setconfig(struct zd1201 *zd, int rid, void *buf, int len, int wait)
512
{
513
        int err;
514
        unsigned char *request;
515
        int reqlen;
516
        char seq=0;
517
        struct urb *urb;
518
        gfp_t gfp_mask = wait ? GFP_NOIO : GFP_ATOMIC;
519
 
520
        len += 4;                       /* first 4 are for header */
521
 
522
        zd->rxdatas = 0;
523
        zd->rxlen = 0;
524
        for (seq=0; len > 0; seq++) {
525
                request = kmalloc(16, gfp_mask);
526
                if (!request)
527
                        return -ENOMEM;
528
                urb = usb_alloc_urb(0, gfp_mask);
529
                if (!urb) {
530
                        kfree(request);
531
                        return -ENOMEM;
532
                }
533
                memset(request, 0, 16);
534
                reqlen = len>12 ? 12 : len;
535
                request[0] = ZD1201_USB_RESREQ;
536
                request[1] = seq;
537
                request[2] = 0;
538
                request[3] = 0;
539
                if (request[1] == 0) {
540
                        /* add header */
541
                        *(__le16*)&request[4] = cpu_to_le16((len-2+1)/2);
542
                        *(__le16*)&request[6] = cpu_to_le16(rid);
543
                        memcpy(request+8, buf, reqlen-4);
544
                        buf += reqlen-4;
545
                } else {
546
                        memcpy(request+4, buf, reqlen);
547
                        buf += reqlen;
548
                }
549
 
550
                len -= reqlen;
551
 
552
                usb_fill_bulk_urb(urb, zd->usb, usb_sndbulkpipe(zd->usb,
553
                    zd->endp_out2), request, 16, zd1201_usbfree, zd);
554
                err = usb_submit_urb(urb, gfp_mask);
555
                if (err)
556
                        goto err;
557
        }
558
 
559
        request = kmalloc(16, gfp_mask);
560
        if (!request)
561
                return -ENOMEM;
562
        urb = usb_alloc_urb(0, gfp_mask);
563
        if (!urb) {
564
                kfree(request);
565
                return -ENOMEM;
566
        }
567
        *((__le32*)request) = cpu_to_le32(ZD1201_USB_CMDREQ);
568
        *((__le16*)&request[4]) =
569
            cpu_to_le16(ZD1201_CMDCODE_ACCESS|ZD1201_ACCESSBIT);
570
        *((__le16*)&request[6]) = cpu_to_le16(rid);
571
        *((__le16*)&request[8]) = cpu_to_le16(0);
572
        *((__le16*)&request[10]) = cpu_to_le16(0);
573
        usb_fill_bulk_urb(urb, zd->usb, usb_sndbulkpipe(zd->usb, zd->endp_out2),
574
             request, 16, zd1201_usbfree, zd);
575
        err = usb_submit_urb(urb, gfp_mask);
576
        if (err)
577
                goto err;
578
 
579
        if (wait) {
580
                wait_event_interruptible(zd->rxdataq, zd->rxdatas);
581
                if (!zd->rxlen || le16_to_cpu(*(__le16*)&zd->rxdata[6]) != rid) {
582
                        dev_dbg(&zd->usb->dev, "wrong or no RID received\n");
583
                }
584
        }
585
 
586
        return 0;
587
err:
588
        kfree(request);
589
        usb_free_urb(urb);
590
        return err;
591
}
592
 
593
static inline int zd1201_getconfig16(struct zd1201 *zd, int rid, short *val)
594
{
595
        int err;
596
        __le16 zdval;
597
 
598
        err = zd1201_getconfig(zd, rid, &zdval, sizeof(__le16));
599
        if (err)
600
                return err;
601
        *val = le16_to_cpu(zdval);
602
        return 0;
603
}
604
 
605
static inline int zd1201_setconfig16(struct zd1201 *zd, int rid, short val)
606
{
607
        __le16 zdval = cpu_to_le16(val);
608
        return (zd1201_setconfig(zd, rid, &zdval, sizeof(__le16), 1));
609
}
610
 
611
static int zd1201_drvr_start(struct zd1201 *zd)
612
{
613
        int err, i;
614
        short max;
615
        __le16 zdmax;
616
        unsigned char *buffer;
617
 
618
        buffer = kzalloc(ZD1201_RXSIZE, GFP_KERNEL);
619
        if (!buffer)
620
                return -ENOMEM;
621
 
622
        usb_fill_bulk_urb(zd->rx_urb, zd->usb,
623
            usb_rcvbulkpipe(zd->usb, zd->endp_in), buffer, ZD1201_RXSIZE,
624
            zd1201_usbrx, zd);
625
 
626
        err = usb_submit_urb(zd->rx_urb, GFP_KERNEL);
627
        if (err)
628
                goto err_buffer;
629
 
630
        err = zd1201_docmd(zd, ZD1201_CMDCODE_INIT, 0, 0, 0);
631
        if (err)
632
                goto err_urb;
633
 
634
        err = zd1201_getconfig(zd, ZD1201_RID_CNFMAXTXBUFFERNUMBER, &zdmax,
635
            sizeof(__le16));
636
        if (err)
637
                goto err_urb;
638
 
639
        max = le16_to_cpu(zdmax);
640
        for (i=0; i<max; i++) {
641
                err = zd1201_docmd(zd, ZD1201_CMDCODE_ALLOC, 1514, 0, 0);
642
                if (err)
643
                        goto err_urb;
644
        }
645
 
646
        return 0;
647
 
648
err_urb:
649
        usb_kill_urb(zd->rx_urb);
650
        return err;
651
err_buffer:
652
        kfree(buffer);
653
        return err;
654
}
655
 
656
/*      Magic alert: The firmware doesn't seem to like the MAC state being
657
 *      toggled in promisc (aka monitor) mode.
658
 *      (It works a number of times, but will halt eventually)
659
 *      So we turn it of before disabling and on after enabling if needed.
660
 */
661
static int zd1201_enable(struct zd1201 *zd)
662
{
663
        int err;
664
 
665
        if (zd->mac_enabled)
666
                return 0;
667
 
668
        err = zd1201_docmd(zd, ZD1201_CMDCODE_ENABLE, 0, 0, 0);
669
        if (!err)
670
                zd->mac_enabled = 1;
671
 
672
        if (zd->monitor)
673
                err = zd1201_setconfig16(zd, ZD1201_RID_PROMISCUOUSMODE, 1);
674
 
675
        return err;
676
}
677
 
678
static int zd1201_disable(struct zd1201 *zd)
679
{
680
        int err;
681
 
682
        if (!zd->mac_enabled)
683
                return 0;
684
        if (zd->monitor) {
685
                err = zd1201_setconfig16(zd, ZD1201_RID_PROMISCUOUSMODE, 0);
686
                if (err)
687
                        return err;
688
        }
689
 
690
        err = zd1201_docmd(zd, ZD1201_CMDCODE_DISABLE, 0, 0, 0);
691
        if (!err)
692
                zd->mac_enabled = 0;
693
        return err;
694
}
695
 
696
static int zd1201_mac_reset(struct zd1201 *zd)
697
{
698
        if (!zd->mac_enabled)
699
                return 0;
700
        zd1201_disable(zd);
701
        return zd1201_enable(zd);
702
}
703
 
704
static int zd1201_join(struct zd1201 *zd, char *essid, int essidlen)
705
{
706
        int err, val;
707
        char buf[IW_ESSID_MAX_SIZE+2];
708
 
709
        err = zd1201_disable(zd);
710
        if (err)
711
                return err;
712
 
713
        val = ZD1201_CNFAUTHENTICATION_OPENSYSTEM;
714
        val |= ZD1201_CNFAUTHENTICATION_SHAREDKEY;
715
        err = zd1201_setconfig16(zd, ZD1201_RID_CNFAUTHENTICATION, val);
716
        if (err)
717
                return err;
718
 
719
        *(__le16 *)buf = cpu_to_le16(essidlen);
720
        memcpy(buf+2, essid, essidlen);
721
        if (!zd->ap) {  /* Normal station */
722
                err = zd1201_setconfig(zd, ZD1201_RID_CNFDESIREDSSID, buf,
723
                    IW_ESSID_MAX_SIZE+2, 1);
724
                if (err)
725
                        return err;
726
        } else {        /* AP */
727
                err = zd1201_setconfig(zd, ZD1201_RID_CNFOWNSSID, buf,
728
                    IW_ESSID_MAX_SIZE+2, 1);
729
                if (err)
730
                        return err;
731
        }
732
 
733
        err = zd1201_setconfig(zd, ZD1201_RID_CNFOWNMACADDR,
734
            zd->dev->dev_addr, zd->dev->addr_len, 1);
735
        if (err)
736
                return err;
737
 
738
        err = zd1201_enable(zd);
739
        if (err)
740
                return err;
741
 
742
        msleep(100);
743
        return 0;
744
}
745
 
746
static int zd1201_net_open(struct net_device *dev)
747
{
748
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
749
 
750
        /* Start MAC with wildcard if no essid set */
751
        if (!zd->mac_enabled)
752
                zd1201_join(zd, zd->essid, zd->essidlen);
753
        netif_start_queue(dev);
754
 
755
        return 0;
756
}
757
 
758
static int zd1201_net_stop(struct net_device *dev)
759
{
760
        netif_stop_queue(dev);
761
        return 0;
762
}
763
 
764
/*
765
        RFC 1042 encapsulates Ethernet frames in 802.11 frames
766
        by prefixing them with 0xaa, 0xaa, 0x03) followed by a SNAP OID of 0
767
        (0x00, 0x00, 0x00). Zd requires an additional padding, copy
768
        of ethernet addresses, length of the standard RFC 1042 packet
769
        and a command byte (which is nul for tx).
770
 
771
        tx frame (from Wlan NG):
772
        RFC 1042:
773
                llc             0xAA 0xAA 0x03 (802.2 LLC)
774
                snap            0x00 0x00 0x00 (Ethernet encapsulated)
775
                type            2 bytes, Ethernet type field
776
                payload         (minus eth header)
777
        Zydas specific:
778
                padding         1B if (skb->len+8+1)%64==0
779
                Eth MAC addr    12 bytes, Ethernet MAC addresses
780
                length          2 bytes, RFC 1042 packet length
781
                                (llc+snap+type+payload)
782
                zd              1 null byte, zd1201 packet type
783
 */
784
static int zd1201_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
785
{
786
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
787
        unsigned char *txbuf = zd->txdata;
788
        int txbuflen, pad = 0, err;
789
        struct urb *urb = zd->tx_urb;
790
 
791
        if (!zd->mac_enabled || zd->monitor) {
792
                zd->stats.tx_dropped++;
793
                kfree_skb(skb);
794
                return 0;
795
        }
796
        netif_stop_queue(dev);
797
 
798
        txbuflen = skb->len + 8 + 1;
799
        if (txbuflen%64 == 0) {
800
                pad = 1;
801
                txbuflen++;
802
        }
803
        txbuf[0] = 0xAA;
804
        txbuf[1] = 0xAA;
805
        txbuf[2] = 0x03;
806
        txbuf[3] = 0x00;        /* rfc1042 */
807
        txbuf[4] = 0x00;
808
        txbuf[5] = 0x00;
809
 
810
        skb_copy_from_linear_data_offset(skb, 12, txbuf + 6, skb->len - 12);
811
        if (pad)
812
                txbuf[skb->len-12+6]=0;
813
        skb_copy_from_linear_data(skb, txbuf + skb->len - 12 + 6 + pad, 12);
814
        *(__be16*)&txbuf[skb->len+6+pad] = htons(skb->len-12+6);
815
        txbuf[txbuflen-1] = 0;
816
 
817
        usb_fill_bulk_urb(urb, zd->usb, usb_sndbulkpipe(zd->usb, zd->endp_out),
818
            txbuf, txbuflen, zd1201_usbtx, zd);
819
 
820
        err = usb_submit_urb(zd->tx_urb, GFP_ATOMIC);
821
        if (err) {
822
                zd->stats.tx_errors++;
823
                netif_start_queue(dev);
824
                return err;
825
        }
826
        zd->stats.tx_packets++;
827
        zd->stats.tx_bytes += skb->len;
828
        dev->trans_start = jiffies;
829
        kfree_skb(skb);
830
 
831
        return 0;
832
}
833
 
834
static void zd1201_tx_timeout(struct net_device *dev)
835
{
836
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
837
 
838
        if (!zd)
839
                return;
840
        dev_warn(&zd->usb->dev, "%s: TX timeout, shooting down urb\n",
841
            dev->name);
842
        usb_unlink_urb(zd->tx_urb);
843
        zd->stats.tx_errors++;
844
        /* Restart the timeout to quiet the watchdog: */
845
        dev->trans_start = jiffies;
846
}
847
 
848
static int zd1201_set_mac_address(struct net_device *dev, void *p)
849
{
850
        struct sockaddr *addr = p;
851
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
852
        int err;
853
 
854
        if (!zd)
855
                return -ENODEV;
856
 
857
        err = zd1201_setconfig(zd, ZD1201_RID_CNFOWNMACADDR,
858
            addr->sa_data, dev->addr_len, 1);
859
        if (err)
860
                return err;
861
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
862
 
863
        return zd1201_mac_reset(zd);
864
}
865
 
866
static struct net_device_stats *zd1201_get_stats(struct net_device *dev)
867
{
868
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
869
 
870
        return &zd->stats;
871
}
872
 
873
static struct iw_statistics *zd1201_get_wireless_stats(struct net_device *dev)
874
{
875
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
876
 
877
        return &zd->iwstats;
878
}
879
 
880
static void zd1201_set_multicast(struct net_device *dev)
881
{
882
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
883
        struct dev_mc_list *mc = dev->mc_list;
884
        unsigned char reqbuf[ETH_ALEN*ZD1201_MAXMULTI];
885
        int i;
886
 
887
        if (dev->mc_count > ZD1201_MAXMULTI)
888
                return;
889
 
890
        for (i=0; i<dev->mc_count; i++) {
891
                memcpy(reqbuf+i*ETH_ALEN, mc->dmi_addr, ETH_ALEN);
892
                mc = mc->next;
893
        }
894
        zd1201_setconfig(zd, ZD1201_RID_CNFGROUPADDRESS, reqbuf,
895
            dev->mc_count*ETH_ALEN, 0);
896
 
897
}
898
 
899
static int zd1201_config_commit(struct net_device *dev,
900
    struct iw_request_info *info, struct iw_point *data, char *essid)
901
{
902
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
903
 
904
        return zd1201_mac_reset(zd);
905
}
906
 
907
static int zd1201_get_name(struct net_device *dev,
908
    struct iw_request_info *info, char *name, char *extra)
909
{
910
        strcpy(name, "IEEE 802.11b");
911
        return 0;
912
}
913
 
914
static int zd1201_set_freq(struct net_device *dev,
915
    struct iw_request_info *info, struct iw_freq *freq, char *extra)
916
{
917
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
918
        short channel = 0;
919
        int err;
920
 
921
        if (freq->e == 0)
922
                channel = freq->m;
923
        else {
924
                if (freq->m >= 2482)
925
                        channel = 14;
926
                if (freq->m >= 2407)
927
                        channel = (freq->m-2407)/5;
928
        }
929
 
930
        err = zd1201_setconfig16(zd, ZD1201_RID_CNFOWNCHANNEL, channel);
931
        if (err)
932
                return err;
933
 
934
        zd1201_mac_reset(zd);
935
 
936
        return 0;
937
}
938
 
939
static int zd1201_get_freq(struct net_device *dev,
940
    struct iw_request_info *info, struct iw_freq *freq, char *extra)
941
{
942
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
943
        short channel;
944
        int err;
945
 
946
        err = zd1201_getconfig16(zd, ZD1201_RID_CNFOWNCHANNEL, &channel);
947
        if (err)
948
                return err;
949
        freq->e = 0;
950
        freq->m = channel;
951
 
952
        return 0;
953
}
954
 
955
static int zd1201_set_mode(struct net_device *dev,
956
    struct iw_request_info *info, __u32 *mode, char *extra)
957
{
958
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
959
        short porttype, monitor = 0;
960
        unsigned char buffer[IW_ESSID_MAX_SIZE+2];
961
        int err;
962
 
963
        if (zd->ap) {
964
                if (*mode != IW_MODE_MASTER)
965
                        return -EINVAL;
966
                return 0;
967
        }
968
 
969
        err = zd1201_setconfig16(zd, ZD1201_RID_PROMISCUOUSMODE, 0);
970
        if (err)
971
                return err;
972
        zd->dev->type = ARPHRD_ETHER;
973
        switch(*mode) {
974
                case IW_MODE_MONITOR:
975
                        monitor = 1;
976
                        zd->dev->type = ARPHRD_IEEE80211;
977
                        /* Make sure we are no longer associated with by
978
                           setting an 'impossible' essid.
979
                           (otherwise we mess up firmware)
980
                         */
981
                        zd1201_join(zd, "\0-*#\0", 5);
982
                        /* Put port in pIBSS */
983
                case 8: /* No pseudo-IBSS in wireless extensions (yet) */
984
                        porttype = ZD1201_PORTTYPE_PSEUDOIBSS;
985
                        break;
986
                case IW_MODE_ADHOC:
987
                        porttype = ZD1201_PORTTYPE_IBSS;
988
                        break;
989
                case IW_MODE_INFRA:
990
                        porttype = ZD1201_PORTTYPE_BSS;
991
                        break;
992
                default:
993
                        return -EINVAL;
994
        }
995
 
996
        err = zd1201_setconfig16(zd, ZD1201_RID_CNFPORTTYPE, porttype);
997
        if (err)
998
                return err;
999
        if (zd->monitor && !monitor) {
1000
                        zd1201_disable(zd);
1001
                        *(__le16 *)buffer = cpu_to_le16(zd->essidlen);
1002
                        memcpy(buffer+2, zd->essid, zd->essidlen);
1003
                        err = zd1201_setconfig(zd, ZD1201_RID_CNFDESIREDSSID,
1004
                            buffer, IW_ESSID_MAX_SIZE+2, 1);
1005
                        if (err)
1006
                                return err;
1007
        }
1008
        zd->monitor = monitor;
1009
        /* If monitor mode is set we don't actually turn it on here since it
1010
         * is done during mac reset anyway (see zd1201_mac_enable).
1011
         */
1012
        zd1201_mac_reset(zd);
1013
 
1014
        return 0;
1015
}
1016
 
1017
static int zd1201_get_mode(struct net_device *dev,
1018
    struct iw_request_info *info, __u32 *mode, char *extra)
1019
{
1020
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1021
        short porttype;
1022
        int err;
1023
 
1024
        err = zd1201_getconfig16(zd, ZD1201_RID_CNFPORTTYPE, &porttype);
1025
        if (err)
1026
                return err;
1027
        switch(porttype) {
1028
                case ZD1201_PORTTYPE_IBSS:
1029
                        *mode = IW_MODE_ADHOC;
1030
                        break;
1031
                case ZD1201_PORTTYPE_BSS:
1032
                        *mode = IW_MODE_INFRA;
1033
                        break;
1034
                case ZD1201_PORTTYPE_WDS:
1035
                        *mode = IW_MODE_REPEAT;
1036
                        break;
1037
                case ZD1201_PORTTYPE_PSEUDOIBSS:
1038
                        *mode = 8;/* No Pseudo-IBSS... */
1039
                        break;
1040
                case ZD1201_PORTTYPE_AP:
1041
                        *mode = IW_MODE_MASTER;
1042
                        break;
1043
                default:
1044
                        dev_dbg(&zd->usb->dev, "Unknown porttype: %d\n",
1045
                            porttype);
1046
                        *mode = IW_MODE_AUTO;
1047
        }
1048
        if (zd->monitor)
1049
                *mode = IW_MODE_MONITOR;
1050
 
1051
        return 0;
1052
}
1053
 
1054
static int zd1201_get_range(struct net_device *dev,
1055
    struct iw_request_info *info, struct iw_point *wrq, char *extra)
1056
{
1057
        struct iw_range *range = (struct iw_range *)extra;
1058
 
1059
        wrq->length = sizeof(struct iw_range);
1060
        memset(range, 0, sizeof(struct iw_range));
1061
        range->we_version_compiled = WIRELESS_EXT;
1062
        range->we_version_source = WIRELESS_EXT;
1063
 
1064
        range->max_qual.qual = 128;
1065
        range->max_qual.level = 128;
1066
        range->max_qual.noise = 128;
1067
        range->max_qual.updated = 7;
1068
 
1069
        range->encoding_size[0] = 5;
1070
        range->encoding_size[1] = 13;
1071
        range->num_encoding_sizes = 2;
1072
        range->max_encoding_tokens = ZD1201_NUMKEYS;
1073
 
1074
        range->num_bitrates = 4;
1075
        range->bitrate[0] = 1000000;
1076
        range->bitrate[1] = 2000000;
1077
        range->bitrate[2] = 5500000;
1078
        range->bitrate[3] = 11000000;
1079
 
1080
        range->min_rts = 0;
1081
        range->min_frag = ZD1201_FRAGMIN;
1082
        range->max_rts = ZD1201_RTSMAX;
1083
        range->min_frag = ZD1201_FRAGMAX;
1084
 
1085
        return 0;
1086
}
1087
 
1088
/*      Little bit of magic here: we only get the quality if we poll
1089
 *      for it, and we never get an actual request to trigger such
1090
 *      a poll. Therefore we 'assume' that the user will soon ask for
1091
 *      the stats after asking the bssid.
1092
 */
1093
static int zd1201_get_wap(struct net_device *dev,
1094
    struct iw_request_info *info, struct sockaddr *ap_addr, char *extra)
1095
{
1096
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1097
        unsigned char buffer[6];
1098
 
1099
        if (!zd1201_getconfig(zd, ZD1201_RID_COMMSQUALITY, buffer, 6)) {
1100
                /* Unfortunately the quality and noise reported is useless.
1101
                   they seem to be accumulators that increase until you
1102
                   read them, unless we poll on a fixed interval we can't
1103
                   use them
1104
                 */
1105
                /*zd->iwstats.qual.qual = le16_to_cpu(((__le16 *)buffer)[0]);*/
1106
                zd->iwstats.qual.level = le16_to_cpu(((__le16 *)buffer)[1]);
1107
                /*zd->iwstats.qual.noise = le16_to_cpu(((__le16 *)buffer)[2]);*/
1108
                zd->iwstats.qual.updated = 2;
1109
        }
1110
 
1111
        return zd1201_getconfig(zd, ZD1201_RID_CURRENTBSSID, ap_addr->sa_data, 6);
1112
}
1113
 
1114
static int zd1201_set_scan(struct net_device *dev,
1115
    struct iw_request_info *info, struct iw_point *srq, char *extra)
1116
{
1117
        /* We do everything in get_scan */
1118
        return 0;
1119
}
1120
 
1121
static int zd1201_get_scan(struct net_device *dev,
1122
    struct iw_request_info *info, struct iw_point *srq, char *extra)
1123
{
1124
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1125
        int err, i, j, enabled_save;
1126
        struct iw_event iwe;
1127
        char *cev = extra;
1128
        char *end_buf = extra + IW_SCAN_MAX_DATA;
1129
 
1130
        /* No scanning in AP mode */
1131
        if (zd->ap)
1132
                return -EOPNOTSUPP;
1133
 
1134
        /* Scan doesn't seem to work if disabled */
1135
        enabled_save = zd->mac_enabled;
1136
        zd1201_enable(zd);
1137
 
1138
        zd->rxdatas = 0;
1139
        err = zd1201_docmd(zd, ZD1201_CMDCODE_INQUIRE,
1140
             ZD1201_INQ_SCANRESULTS, 0, 0);
1141
        if (err)
1142
                return err;
1143
 
1144
        wait_event_interruptible(zd->rxdataq, zd->rxdatas);
1145
        if (!zd->rxlen)
1146
                return -EIO;
1147
 
1148
        if (le16_to_cpu(*(__le16*)&zd->rxdata[2]) != ZD1201_INQ_SCANRESULTS)
1149
                return -EIO;
1150
 
1151
        for(i=8; i<zd->rxlen; i+=62) {
1152
                iwe.cmd = SIOCGIWAP;
1153
                iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
1154
                memcpy(iwe.u.ap_addr.sa_data, zd->rxdata+i+6, 6);
1155
                cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_ADDR_LEN);
1156
 
1157
                iwe.cmd = SIOCGIWESSID;
1158
                iwe.u.data.length = zd->rxdata[i+16];
1159
                iwe.u.data.flags = 1;
1160
                cev = iwe_stream_add_point(cev, end_buf, &iwe, zd->rxdata+i+18);
1161
 
1162
                iwe.cmd = SIOCGIWMODE;
1163
                if (zd->rxdata[i+14]&0x01)
1164
                        iwe.u.mode = IW_MODE_MASTER;
1165
                else
1166
                        iwe.u.mode = IW_MODE_ADHOC;
1167
                cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_UINT_LEN);
1168
 
1169
                iwe.cmd = SIOCGIWFREQ;
1170
                iwe.u.freq.m = zd->rxdata[i+0];
1171
                iwe.u.freq.e = 0;
1172
                cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_FREQ_LEN);
1173
 
1174
                iwe.cmd = SIOCGIWRATE;
1175
                iwe.u.bitrate.fixed = 0;
1176
                iwe.u.bitrate.disabled = 0;
1177
                for (j=0; j<10; j++) if (zd->rxdata[i+50+j]) {
1178
                        iwe.u.bitrate.value = (zd->rxdata[i+50+j]&0x7f)*500000;
1179
                        cev=iwe_stream_add_event(cev, end_buf, &iwe,
1180
                            IW_EV_PARAM_LEN);
1181
                }
1182
 
1183
                iwe.cmd = SIOCGIWENCODE;
1184
                iwe.u.data.length = 0;
1185
                if (zd->rxdata[i+14]&0x10)
1186
                        iwe.u.data.flags = IW_ENCODE_ENABLED;
1187
                else
1188
                        iwe.u.data.flags = IW_ENCODE_DISABLED;
1189
                cev = iwe_stream_add_point(cev, end_buf, &iwe, NULL);
1190
 
1191
                iwe.cmd = IWEVQUAL;
1192
                iwe.u.qual.qual = zd->rxdata[i+4];
1193
                iwe.u.qual.noise= zd->rxdata[i+2]/10-100;
1194
                iwe.u.qual.level = (256+zd->rxdata[i+4]*100)/255-100;
1195
                iwe.u.qual.updated = 7;
1196
                cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_QUAL_LEN);
1197
        }
1198
 
1199
        if (!enabled_save)
1200
                zd1201_disable(zd);
1201
 
1202
        srq->length = cev - extra;
1203
        srq->flags = 0;
1204
 
1205
        return 0;
1206
}
1207
 
1208
static int zd1201_set_essid(struct net_device *dev,
1209
    struct iw_request_info *info, struct iw_point *data, char *essid)
1210
{
1211
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1212
 
1213
        if (data->length > IW_ESSID_MAX_SIZE)
1214
                return -EINVAL;
1215
        if (data->length < 1)
1216
                data->length = 1;
1217
        zd->essidlen = data->length;
1218
        memset(zd->essid, 0, IW_ESSID_MAX_SIZE+1);
1219
        memcpy(zd->essid, essid, data->length);
1220
        return zd1201_join(zd, zd->essid, zd->essidlen);
1221
}
1222
 
1223
static int zd1201_get_essid(struct net_device *dev,
1224
    struct iw_request_info *info, struct iw_point *data, char *essid)
1225
{
1226
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1227
 
1228
        memcpy(essid, zd->essid, zd->essidlen);
1229
        data->flags = 1;
1230
        data->length = zd->essidlen;
1231
 
1232
        return 0;
1233
}
1234
 
1235
static int zd1201_get_nick(struct net_device *dev, struct iw_request_info *info,
1236
    struct iw_point *data, char *nick)
1237
{
1238
        strcpy(nick, "zd1201");
1239
        data->flags = 1;
1240
        data->length = strlen(nick);
1241
        return 0;
1242
}
1243
 
1244
static int zd1201_set_rate(struct net_device *dev,
1245
    struct iw_request_info *info, struct iw_param *rrq, char *extra)
1246
{
1247
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1248
        short rate;
1249
        int err;
1250
 
1251
        switch (rrq->value) {
1252
                case 1000000:
1253
                        rate = ZD1201_RATEB1;
1254
                        break;
1255
                case 2000000:
1256
                        rate = ZD1201_RATEB2;
1257
                        break;
1258
                case 5500000:
1259
                        rate = ZD1201_RATEB5;
1260
                        break;
1261
                case 11000000:
1262
                default:
1263
                        rate = ZD1201_RATEB11;
1264
                        break;
1265
        }
1266
        if (!rrq->fixed) { /* Also enable all lower bitrates */
1267
                rate |= rate-1;
1268
        }
1269
 
1270
        err = zd1201_setconfig16(zd, ZD1201_RID_TXRATECNTL, rate);
1271
        if (err)
1272
                return err;
1273
 
1274
        return zd1201_mac_reset(zd);
1275
}
1276
 
1277
static int zd1201_get_rate(struct net_device *dev,
1278
    struct iw_request_info *info, struct iw_param *rrq, char *extra)
1279
{
1280
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1281
        short rate;
1282
        int err;
1283
 
1284
        err = zd1201_getconfig16(zd, ZD1201_RID_CURRENTTXRATE, &rate);
1285
        if (err)
1286
                return err;
1287
 
1288
        switch(rate) {
1289
                case 1:
1290
                        rrq->value = 1000000;
1291
                        break;
1292
                case 2:
1293
                        rrq->value = 2000000;
1294
                        break;
1295
                case 5:
1296
                        rrq->value = 5500000;
1297
                        break;
1298
                case 11:
1299
                        rrq->value = 11000000;
1300
                        break;
1301
                default:
1302
                        rrq->value = 0;
1303
        }
1304
        rrq->fixed = 0;
1305
        rrq->disabled = 0;
1306
 
1307
        return 0;
1308
}
1309
 
1310
static int zd1201_set_rts(struct net_device *dev, struct iw_request_info *info,
1311
    struct iw_param *rts, char *extra)
1312
{
1313
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1314
        int err;
1315
        short val = rts->value;
1316
 
1317
        if (rts->disabled || !rts->fixed)
1318
                val = ZD1201_RTSMAX;
1319
        if (val > ZD1201_RTSMAX)
1320
                return -EINVAL;
1321
        if (val < 0)
1322
                return -EINVAL;
1323
 
1324
        err = zd1201_setconfig16(zd, ZD1201_RID_CNFRTSTHRESHOLD, val);
1325
        if (err)
1326
                return err;
1327
        return zd1201_mac_reset(zd);
1328
}
1329
 
1330
static int zd1201_get_rts(struct net_device *dev, struct iw_request_info *info,
1331
    struct iw_param *rts, char *extra)
1332
{
1333
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1334
        short rtst;
1335
        int err;
1336
 
1337
        err = zd1201_getconfig16(zd, ZD1201_RID_CNFRTSTHRESHOLD, &rtst);
1338
        if (err)
1339
                return err;
1340
        rts->value = rtst;
1341
        rts->disabled = (rts->value == ZD1201_RTSMAX);
1342
        rts->fixed = 1;
1343
 
1344
        return 0;
1345
}
1346
 
1347
static int zd1201_set_frag(struct net_device *dev, struct iw_request_info *info,
1348
    struct iw_param *frag, char *extra)
1349
{
1350
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1351
        int err;
1352
        short val = frag->value;
1353
 
1354
        if (frag->disabled || !frag->fixed)
1355
                val = ZD1201_FRAGMAX;
1356
        if (val > ZD1201_FRAGMAX)
1357
                return -EINVAL;
1358
        if (val < ZD1201_FRAGMIN)
1359
                return -EINVAL;
1360
        if (val & 1)
1361
                return -EINVAL;
1362
        err = zd1201_setconfig16(zd, ZD1201_RID_CNFFRAGTHRESHOLD, val);
1363
        if (err)
1364
                return err;
1365
        return zd1201_mac_reset(zd);
1366
}
1367
 
1368
static int zd1201_get_frag(struct net_device *dev, struct iw_request_info *info,
1369
    struct iw_param *frag, char *extra)
1370
{
1371
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1372
        short fragt;
1373
        int err;
1374
 
1375
        err = zd1201_getconfig16(zd, ZD1201_RID_CNFFRAGTHRESHOLD, &fragt);
1376
        if (err)
1377
                return err;
1378
        frag->value = fragt;
1379
        frag->disabled = (frag->value == ZD1201_FRAGMAX);
1380
        frag->fixed = 1;
1381
 
1382
        return 0;
1383
}
1384
 
1385
static int zd1201_set_retry(struct net_device *dev,
1386
    struct iw_request_info *info, struct iw_param *rrq, char *extra)
1387
{
1388
        return 0;
1389
}
1390
 
1391
static int zd1201_get_retry(struct net_device *dev,
1392
    struct iw_request_info *info, struct iw_param *rrq, char *extra)
1393
{
1394
        return 0;
1395
}
1396
 
1397
static int zd1201_set_encode(struct net_device *dev,
1398
    struct iw_request_info *info, struct iw_point *erq, char *key)
1399
{
1400
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1401
        short i;
1402
        int err, rid;
1403
 
1404
        if (erq->length > ZD1201_MAXKEYLEN)
1405
                return -EINVAL;
1406
 
1407
        i = (erq->flags & IW_ENCODE_INDEX)-1;
1408
        if (i == -1) {
1409
                err = zd1201_getconfig16(zd,ZD1201_RID_CNFDEFAULTKEYID,&i);
1410
                if (err)
1411
                        return err;
1412
        } else {
1413
                err = zd1201_setconfig16(zd, ZD1201_RID_CNFDEFAULTKEYID, i);
1414
                if (err)
1415
                        return err;
1416
        }
1417
 
1418
        if (i < 0 || i >= ZD1201_NUMKEYS)
1419
                return -EINVAL;
1420
 
1421
        rid = ZD1201_RID_CNFDEFAULTKEY0 + i;
1422
        err = zd1201_setconfig(zd, rid, key, erq->length, 1);
1423
        if (err)
1424
                return err;
1425
        zd->encode_keylen[i] = erq->length;
1426
        memcpy(zd->encode_keys[i], key, erq->length);
1427
 
1428
        i=0;
1429
        if (!(erq->flags & IW_ENCODE_DISABLED & IW_ENCODE_MODE)) {
1430
                i |= 0x01;
1431
                zd->encode_enabled = 1;
1432
        } else
1433
                zd->encode_enabled = 0;
1434
        if (erq->flags & IW_ENCODE_RESTRICTED & IW_ENCODE_MODE) {
1435
                i |= 0x02;
1436
                zd->encode_restricted = 1;
1437
        } else
1438
                zd->encode_restricted = 0;
1439
        err = zd1201_setconfig16(zd, ZD1201_RID_CNFWEBFLAGS, i);
1440
        if (err)
1441
                return err;
1442
 
1443
        if (zd->encode_enabled)
1444
                i = ZD1201_CNFAUTHENTICATION_SHAREDKEY;
1445
        else
1446
                i = ZD1201_CNFAUTHENTICATION_OPENSYSTEM;
1447
        err = zd1201_setconfig16(zd, ZD1201_RID_CNFAUTHENTICATION, i);
1448
        if (err)
1449
                return err;
1450
 
1451
        return zd1201_mac_reset(zd);
1452
}
1453
 
1454
static int zd1201_get_encode(struct net_device *dev,
1455
    struct iw_request_info *info, struct iw_point *erq, char *key)
1456
{
1457
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1458
        short i;
1459
        int err;
1460
 
1461
        if (zd->encode_enabled)
1462
                erq->flags = IW_ENCODE_ENABLED;
1463
        else
1464
                erq->flags = IW_ENCODE_DISABLED;
1465
        if (zd->encode_restricted)
1466
                erq->flags |= IW_ENCODE_RESTRICTED;
1467
        else
1468
                erq->flags |= IW_ENCODE_OPEN;
1469
 
1470
        i = (erq->flags & IW_ENCODE_INDEX) -1;
1471
        if (i == -1) {
1472
                err = zd1201_getconfig16(zd, ZD1201_RID_CNFDEFAULTKEYID, &i);
1473
                if (err)
1474
                        return err;
1475
        }
1476
        if (i<0 || i>= ZD1201_NUMKEYS)
1477
                return -EINVAL;
1478
 
1479
        erq->flags |= i+1;
1480
 
1481
        erq->length = zd->encode_keylen[i];
1482
        memcpy(key, zd->encode_keys[i], erq->length);
1483
 
1484
        return 0;
1485
}
1486
 
1487
static int zd1201_set_power(struct net_device *dev,
1488
    struct iw_request_info *info, struct iw_param *vwrq, char *extra)
1489
{
1490
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1491
        short enabled, duration, level;
1492
        int err;
1493
 
1494
        enabled = vwrq->disabled ? 0 : 1;
1495
        if (enabled) {
1496
                if (vwrq->flags & IW_POWER_PERIOD) {
1497
                        duration = vwrq->value;
1498
                        err = zd1201_setconfig16(zd,
1499
                            ZD1201_RID_CNFMAXSLEEPDURATION, duration);
1500
                        if (err)
1501
                                return err;
1502
                        goto out;
1503
                }
1504
                if (vwrq->flags & IW_POWER_TIMEOUT) {
1505
                        err = zd1201_getconfig16(zd,
1506
                            ZD1201_RID_CNFMAXSLEEPDURATION, &duration);
1507
                        if (err)
1508
                                return err;
1509
                        level = vwrq->value * 4 / duration;
1510
                        if (level > 4)
1511
                                level = 4;
1512
                        if (level < 0)
1513
                                level = 0;
1514
                        err = zd1201_setconfig16(zd, ZD1201_RID_CNFPMEPS,
1515
                            level);
1516
                        if (err)
1517
                                return err;
1518
                        goto out;
1519
                }
1520
                return -EINVAL;
1521
        }
1522
out:
1523
        return zd1201_setconfig16(zd, ZD1201_RID_CNFPMENABLED, enabled);
1524
}
1525
 
1526
static int zd1201_get_power(struct net_device *dev,
1527
    struct iw_request_info *info, struct iw_param *vwrq, char *extra)
1528
{
1529
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1530
        short enabled, level, duration;
1531
        int err;
1532
 
1533
        err = zd1201_getconfig16(zd, ZD1201_RID_CNFPMENABLED, &enabled);
1534
        if (err)
1535
                return err;
1536
        err = zd1201_getconfig16(zd, ZD1201_RID_CNFPMEPS, &level);
1537
        if (err)
1538
                return err;
1539
        err = zd1201_getconfig16(zd, ZD1201_RID_CNFMAXSLEEPDURATION, &duration);
1540
        if (err)
1541
                return err;
1542
        vwrq->disabled = enabled ? 0 : 1;
1543
        if (vwrq->flags & IW_POWER_TYPE) {
1544
                if (vwrq->flags & IW_POWER_PERIOD) {
1545
                        vwrq->value = duration;
1546
                        vwrq->flags = IW_POWER_PERIOD;
1547
                } else {
1548
                        vwrq->value = duration * level / 4;
1549
                        vwrq->flags = IW_POWER_TIMEOUT;
1550
                }
1551
        }
1552
        if (vwrq->flags & IW_POWER_MODE) {
1553
                if (enabled && level)
1554
                        vwrq->flags = IW_POWER_UNICAST_R;
1555
                else
1556
                        vwrq->flags = IW_POWER_ALL_R;
1557
        }
1558
 
1559
        return 0;
1560
}
1561
 
1562
 
1563
static const iw_handler zd1201_iw_handler[] =
1564
{
1565
        (iw_handler) zd1201_config_commit,      /* SIOCSIWCOMMIT */
1566
        (iw_handler) zd1201_get_name,           /* SIOCGIWNAME */
1567
        (iw_handler) NULL,                      /* SIOCSIWNWID */
1568
        (iw_handler) NULL,                      /* SIOCGIWNWID */
1569
        (iw_handler) zd1201_set_freq,           /* SIOCSIWFREQ */
1570
        (iw_handler) zd1201_get_freq,           /* SIOCGIWFREQ */
1571
        (iw_handler) zd1201_set_mode,           /* SIOCSIWMODE */
1572
        (iw_handler) zd1201_get_mode,           /* SIOCGIWMODE */
1573
        (iw_handler) NULL,                      /* SIOCSIWSENS */
1574
        (iw_handler) NULL,                      /* SIOCGIWSENS */
1575
        (iw_handler) NULL,                      /* SIOCSIWRANGE */
1576
        (iw_handler) zd1201_get_range,           /* SIOCGIWRANGE */
1577
        (iw_handler) NULL,                      /* SIOCSIWPRIV */
1578
        (iw_handler) NULL,                      /* SIOCGIWPRIV */
1579
        (iw_handler) NULL,                      /* SIOCSIWSTATS */
1580
        (iw_handler) NULL,                      /* SIOCGIWSTATS */
1581
        (iw_handler) NULL,                      /* SIOCSIWSPY */
1582
        (iw_handler) NULL,                      /* SIOCGIWSPY */
1583
        (iw_handler) NULL,                      /* -- hole -- */
1584
        (iw_handler) NULL,                      /* -- hole -- */
1585
        (iw_handler) NULL/*zd1201_set_wap*/,            /* SIOCSIWAP */
1586
        (iw_handler) zd1201_get_wap,            /* SIOCGIWAP */
1587
        (iw_handler) NULL,                      /* -- hole -- */
1588
        (iw_handler) NULL,                      /* SIOCGIWAPLIST */
1589
        (iw_handler) zd1201_set_scan,           /* SIOCSIWSCAN */
1590
        (iw_handler) zd1201_get_scan,           /* SIOCGIWSCAN */
1591
        (iw_handler) zd1201_set_essid,          /* SIOCSIWESSID */
1592
        (iw_handler) zd1201_get_essid,          /* SIOCGIWESSID */
1593
        (iw_handler) NULL,                      /* SIOCSIWNICKN */
1594
        (iw_handler) zd1201_get_nick,           /* SIOCGIWNICKN */
1595
        (iw_handler) NULL,                      /* -- hole -- */
1596
        (iw_handler) NULL,                      /* -- hole -- */
1597
        (iw_handler) zd1201_set_rate,           /* SIOCSIWRATE */
1598
        (iw_handler) zd1201_get_rate,           /* SIOCGIWRATE */
1599
        (iw_handler) zd1201_set_rts,            /* SIOCSIWRTS */
1600
        (iw_handler) zd1201_get_rts,            /* SIOCGIWRTS */
1601
        (iw_handler) zd1201_set_frag,           /* SIOCSIWFRAG */
1602
        (iw_handler) zd1201_get_frag,           /* SIOCGIWFRAG */
1603
        (iw_handler) NULL,                      /* SIOCSIWTXPOW */
1604
        (iw_handler) NULL,                      /* SIOCGIWTXPOW */
1605
        (iw_handler) zd1201_set_retry,          /* SIOCSIWRETRY */
1606
        (iw_handler) zd1201_get_retry,          /* SIOCGIWRETRY */
1607
        (iw_handler) zd1201_set_encode,         /* SIOCSIWENCODE */
1608
        (iw_handler) zd1201_get_encode,         /* SIOCGIWENCODE */
1609
        (iw_handler) zd1201_set_power,          /* SIOCSIWPOWER */
1610
        (iw_handler) zd1201_get_power,          /* SIOCGIWPOWER */
1611
};
1612
 
1613
static int zd1201_set_hostauth(struct net_device *dev,
1614
    struct iw_request_info *info, struct iw_param *rrq, char *extra)
1615
{
1616
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1617
 
1618
        if (!zd->ap)
1619
                return -EOPNOTSUPP;
1620
 
1621
        return zd1201_setconfig16(zd, ZD1201_RID_CNFHOSTAUTH, rrq->value);
1622
}
1623
 
1624
static int zd1201_get_hostauth(struct net_device *dev,
1625
    struct iw_request_info *info, struct iw_param *rrq, char *extra)
1626
{
1627
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1628
        short hostauth;
1629
        int err;
1630
 
1631
        if (!zd->ap)
1632
                return -EOPNOTSUPP;
1633
 
1634
        err = zd1201_getconfig16(zd, ZD1201_RID_CNFHOSTAUTH, &hostauth);
1635
        if (err)
1636
                return err;
1637
        rrq->value = hostauth;
1638
        rrq->fixed = 1;
1639
 
1640
        return 0;
1641
}
1642
 
1643
static int zd1201_auth_sta(struct net_device *dev,
1644
    struct iw_request_info *info, struct sockaddr *sta, char *extra)
1645
{
1646
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1647
        unsigned char buffer[10];
1648
 
1649
        if (!zd->ap)
1650
                return -EOPNOTSUPP;
1651
 
1652
        memcpy(buffer, sta->sa_data, ETH_ALEN);
1653
        *(short*)(buffer+6) = 0; /* 0==success, 1==failure */
1654
        *(short*)(buffer+8) = 0;
1655
 
1656
        return zd1201_setconfig(zd, ZD1201_RID_AUTHENTICATESTA, buffer, 10, 1);
1657
}
1658
 
1659
static int zd1201_set_maxassoc(struct net_device *dev,
1660
    struct iw_request_info *info, struct iw_param *rrq, char *extra)
1661
{
1662
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1663
        int err;
1664
 
1665
        if (!zd->ap)
1666
                return -EOPNOTSUPP;
1667
 
1668
        err = zd1201_setconfig16(zd, ZD1201_RID_CNFMAXASSOCSTATIONS, rrq->value);
1669
        if (err)
1670
                return err;
1671
        return 0;
1672
}
1673
 
1674
static int zd1201_get_maxassoc(struct net_device *dev,
1675
    struct iw_request_info *info, struct iw_param *rrq, char *extra)
1676
{
1677
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
1678
        short maxassoc;
1679
        int err;
1680
 
1681
        if (!zd->ap)
1682
                return -EOPNOTSUPP;
1683
 
1684
        err = zd1201_getconfig16(zd, ZD1201_RID_CNFMAXASSOCSTATIONS, &maxassoc);
1685
        if (err)
1686
                return err;
1687
        rrq->value = maxassoc;
1688
        rrq->fixed = 1;
1689
 
1690
        return 0;
1691
}
1692
 
1693
static const iw_handler zd1201_private_handler[] = {
1694
        (iw_handler) zd1201_set_hostauth,       /* ZD1201SIWHOSTAUTH */
1695
        (iw_handler) zd1201_get_hostauth,       /* ZD1201GIWHOSTAUTH */
1696
        (iw_handler) zd1201_auth_sta,           /* ZD1201SIWAUTHSTA */
1697
        (iw_handler) NULL,                      /* nothing to get */
1698
        (iw_handler) zd1201_set_maxassoc,       /* ZD1201SIMAXASSOC */
1699
        (iw_handler) zd1201_get_maxassoc,       /* ZD1201GIMAXASSOC */
1700
};
1701
 
1702
static const struct iw_priv_args zd1201_private_args[] = {
1703
        { ZD1201SIWHOSTAUTH, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
1704
            IW_PRIV_TYPE_NONE, "sethostauth" },
1705
        { ZD1201GIWHOSTAUTH, IW_PRIV_TYPE_NONE,
1706
            IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gethostauth" },
1707
        { ZD1201SIWAUTHSTA, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1,
1708
            IW_PRIV_TYPE_NONE, "authstation" },
1709
        { ZD1201SIWMAXASSOC, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
1710
            IW_PRIV_TYPE_NONE, "setmaxassoc" },
1711
        { ZD1201GIWMAXASSOC, IW_PRIV_TYPE_NONE,
1712
            IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getmaxassoc" },
1713
};
1714
 
1715
static const struct iw_handler_def zd1201_iw_handlers = {
1716
        .num_standard           = ARRAY_SIZE(zd1201_iw_handler),
1717
        .num_private            = ARRAY_SIZE(zd1201_private_handler),
1718
        .num_private_args       = ARRAY_SIZE(zd1201_private_args),
1719
        .standard               = (iw_handler *)zd1201_iw_handler,
1720
        .private                = (iw_handler *)zd1201_private_handler,
1721
        .private_args           = (struct iw_priv_args *) zd1201_private_args,
1722
        .get_wireless_stats     = zd1201_get_wireless_stats,
1723
};
1724
 
1725
static int zd1201_probe(struct usb_interface *interface,
1726
                        const struct usb_device_id *id)
1727
{
1728
        struct zd1201 *zd;
1729
        struct usb_device *usb;
1730
        int err;
1731
        short porttype;
1732
        char buf[IW_ESSID_MAX_SIZE+2];
1733
 
1734
        usb = interface_to_usbdev(interface);
1735
 
1736
        zd = kzalloc(sizeof(struct zd1201), GFP_KERNEL);
1737
        if (!zd)
1738
                return -ENOMEM;
1739
        zd->ap = ap;
1740
        zd->usb = usb;
1741
        zd->removed = 0;
1742
        init_waitqueue_head(&zd->rxdataq);
1743
        INIT_HLIST_HEAD(&zd->fraglist);
1744
 
1745
        err = zd1201_fw_upload(usb, zd->ap);
1746
        if (err) {
1747
                dev_err(&usb->dev, "zd1201 firmware upload failed: %d\n", err);
1748
                goto err_zd;
1749
        }
1750
 
1751
        zd->endp_in = 1;
1752
        zd->endp_out = 1;
1753
        zd->endp_out2 = 2;
1754
        zd->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
1755
        zd->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
1756
        if (!zd->rx_urb || !zd->tx_urb)
1757
                goto err_zd;
1758
 
1759
        mdelay(100);
1760
        err = zd1201_drvr_start(zd);
1761
        if (err)
1762
                goto err_zd;
1763
 
1764
        err = zd1201_setconfig16(zd, ZD1201_RID_CNFMAXDATALEN, 2312);
1765
        if (err)
1766
                goto err_start;
1767
 
1768
        err = zd1201_setconfig16(zd, ZD1201_RID_TXRATECNTL,
1769
            ZD1201_RATEB1 | ZD1201_RATEB2 | ZD1201_RATEB5 | ZD1201_RATEB11);
1770
        if (err)
1771
                goto err_start;
1772
 
1773
        zd->dev = alloc_etherdev(0);
1774
        if (!zd->dev)
1775
                goto err_start;
1776
 
1777
        zd->dev->priv = zd;
1778
        zd->dev->open = zd1201_net_open;
1779
        zd->dev->stop = zd1201_net_stop;
1780
        zd->dev->get_stats = zd1201_get_stats;
1781
        zd->dev->wireless_handlers =
1782
            (struct iw_handler_def *)&zd1201_iw_handlers;
1783
        zd->dev->hard_start_xmit = zd1201_hard_start_xmit;
1784
        zd->dev->watchdog_timeo = ZD1201_TX_TIMEOUT;
1785
        zd->dev->tx_timeout = zd1201_tx_timeout;
1786
        zd->dev->set_multicast_list = zd1201_set_multicast;
1787
        zd->dev->set_mac_address = zd1201_set_mac_address;
1788
        strcpy(zd->dev->name, "wlan%d");
1789
 
1790
        err = zd1201_getconfig(zd, ZD1201_RID_CNFOWNMACADDR,
1791
            zd->dev->dev_addr, zd->dev->addr_len);
1792
        if (err)
1793
                goto err_net;
1794
 
1795
        /* Set wildcard essid to match zd->essid */
1796
        *(__le16 *)buf = cpu_to_le16(0);
1797
        err = zd1201_setconfig(zd, ZD1201_RID_CNFDESIREDSSID, buf,
1798
            IW_ESSID_MAX_SIZE+2, 1);
1799
        if (err)
1800
                goto err_net;
1801
 
1802
        if (zd->ap)
1803
                porttype = ZD1201_PORTTYPE_AP;
1804
        else
1805
                porttype = ZD1201_PORTTYPE_BSS;
1806
        err = zd1201_setconfig16(zd, ZD1201_RID_CNFPORTTYPE, porttype);
1807
        if (err)
1808
                goto err_net;
1809
 
1810
        SET_NETDEV_DEV(zd->dev, &usb->dev);
1811
 
1812
        err = register_netdev(zd->dev);
1813
        if (err)
1814
                goto err_net;
1815
        dev_info(&usb->dev, "%s: ZD1201 USB Wireless interface\n",
1816
            zd->dev->name);
1817
 
1818
        usb_set_intfdata(interface, zd);
1819
        zd1201_enable(zd);      /* zd1201 likes to startup enabled, */
1820
        zd1201_disable(zd);     /* interfering with all the wifis in range */
1821
        return 0;
1822
 
1823
err_net:
1824
        free_netdev(zd->dev);
1825
err_start:
1826
        /* Leave the device in reset state */
1827
        zd1201_docmd(zd, ZD1201_CMDCODE_INIT, 0, 0, 0);
1828
err_zd:
1829
        usb_free_urb(zd->tx_urb);
1830
        usb_free_urb(zd->rx_urb);
1831
        kfree(zd);
1832
        return err;
1833
}
1834
 
1835
static void zd1201_disconnect(struct usb_interface *interface)
1836
{
1837
        struct zd1201 *zd=(struct zd1201 *)usb_get_intfdata(interface);
1838
        struct hlist_node *node, *node2;
1839
        struct zd1201_frag *frag;
1840
 
1841
        if (!zd)
1842
                return;
1843
        usb_set_intfdata(interface, NULL);
1844
        if (zd->dev) {
1845
                unregister_netdev(zd->dev);
1846
                free_netdev(zd->dev);
1847
        }
1848
 
1849
        hlist_for_each_entry_safe(frag, node, node2, &zd->fraglist, fnode) {
1850
                hlist_del_init(&frag->fnode);
1851
                kfree_skb(frag->skb);
1852
                kfree(frag);
1853
        }
1854
 
1855
        if (zd->tx_urb) {
1856
                usb_kill_urb(zd->tx_urb);
1857
                usb_free_urb(zd->tx_urb);
1858
        }
1859
        if (zd->rx_urb) {
1860
                usb_kill_urb(zd->rx_urb);
1861
                usb_free_urb(zd->rx_urb);
1862
        }
1863
        kfree(zd);
1864
}
1865
 
1866
#ifdef CONFIG_PM
1867
 
1868
static int zd1201_suspend(struct usb_interface *interface,
1869
                           pm_message_t message)
1870
{
1871
        struct zd1201 *zd = usb_get_intfdata(interface);
1872
 
1873
        netif_device_detach(zd->dev);
1874
 
1875
        zd->was_enabled = zd->mac_enabled;
1876
 
1877
        if (zd->was_enabled)
1878
                return zd1201_disable(zd);
1879
        else
1880
                return 0;
1881
}
1882
 
1883
static int zd1201_resume(struct usb_interface *interface)
1884
{
1885
        struct zd1201 *zd = usb_get_intfdata(interface);
1886
 
1887
        if (!zd || !zd->dev)
1888
                return -ENODEV;
1889
 
1890
        netif_device_attach(zd->dev);
1891
 
1892
        if (zd->was_enabled)
1893
                return zd1201_enable(zd);
1894
        else
1895
                return 0;
1896
}
1897
 
1898
#else
1899
 
1900
#define zd1201_suspend NULL
1901
#define zd1201_resume  NULL
1902
 
1903
#endif
1904
 
1905
static struct usb_driver zd1201_usb = {
1906
        .name = "zd1201",
1907
        .probe = zd1201_probe,
1908
        .disconnect = zd1201_disconnect,
1909
        .id_table = zd1201_table,
1910
        .suspend = zd1201_suspend,
1911
        .resume = zd1201_resume,
1912
};
1913
 
1914
static int __init zd1201_init(void)
1915
{
1916
        return usb_register(&zd1201_usb);
1917
}
1918
 
1919
static void __exit zd1201_cleanup(void)
1920
{
1921
        usb_deregister(&zd1201_usb);
1922
}
1923
 
1924
module_init(zd1201_init);
1925
module_exit(zd1201_cleanup);

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.