include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / net / wireless / p54 / p54usb.c
1
2 /*
3  * Linux device driver for USB based Prism54
4  *
5  * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
6  *
7  * Based on the islsm (softmac prism54) driver, which is:
8  * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  */
14
15 #include <linux/init.h>
16 #include <linux/usb.h>
17 #include <linux/pci.h>
18 #include <linux/slab.h>
19 #include <linux/firmware.h>
20 #include <linux/etherdevice.h>
21 #include <linux/delay.h>
22 #include <linux/crc32.h>
23 #include <net/mac80211.h>
24
25 #include "p54.h"
26 #include "lmac.h"
27 #include "p54usb.h"
28
29 MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
30 MODULE_DESCRIPTION("Prism54 USB wireless driver");
31 MODULE_LICENSE("GPL");
32 MODULE_ALIAS("prism54usb");
33 MODULE_FIRMWARE("isl3886usb");
34 MODULE_FIRMWARE("isl3887usb");
35
36 static struct usb_device_id p54u_table[] __devinitdata = {
37         /* Version 1 devices (pci chip + net2280) */
38         {USB_DEVICE(0x0506, 0x0a11)},   /* 3COM 3CRWE254G72 */
39         {USB_DEVICE(0x0707, 0xee06)},   /* SMC 2862W-G */
40         {USB_DEVICE(0x07aa, 0x001c)},   /* Corega CG-WLUSB2GT */
41         {USB_DEVICE(0x083a, 0x4501)},   /* Accton 802.11g WN4501 USB */
42         {USB_DEVICE(0x083a, 0x4502)},   /* Siemens Gigaset USB Adapter */
43         {USB_DEVICE(0x083a, 0x5501)},   /* Phillips CPWUA054 */
44         {USB_DEVICE(0x0846, 0x4200)},   /* Netgear WG121 */
45         {USB_DEVICE(0x0846, 0x4210)},   /* Netgear WG121 the second ? */
46         {USB_DEVICE(0x0846, 0x4220)},   /* Netgear WG111 */
47         {USB_DEVICE(0x09aa, 0x1000)},   /* Spinnaker Proto board */
48         {USB_DEVICE(0x0cde, 0x0006)},   /* Medion 40900, Roper Europe */
49         {USB_DEVICE(0x124a, 0x4023)},   /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
50         {USB_DEVICE(0x1915, 0x2234)},   /* Linksys WUSB54G OEM */
51         {USB_DEVICE(0x1915, 0x2235)},   /* Linksys WUSB54G Portable OEM */
52         {USB_DEVICE(0x2001, 0x3701)},   /* DLink DWL-G120 Spinnaker */
53         {USB_DEVICE(0x2001, 0x3703)},   /* DLink DWL-G122 */
54         {USB_DEVICE(0x5041, 0x2234)},   /* Linksys WUSB54G */
55         {USB_DEVICE(0x5041, 0x2235)},   /* Linksys WUSB54G Portable */
56
57         /* Version 2 devices (3887) */
58         {USB_DEVICE(0x0471, 0x1230)},   /* Philips CPWUA054/00 */
59         {USB_DEVICE(0x050d, 0x7050)},   /* Belkin F5D7050 ver 1000 */
60         {USB_DEVICE(0x0572, 0x2000)},   /* Cohiba Proto board */
61         {USB_DEVICE(0x0572, 0x2002)},   /* Cohiba Proto board */
62         {USB_DEVICE(0x06b9, 0x0121)},   /* Thomson SpeedTouch 121g */
63         {USB_DEVICE(0x0707, 0xee13)},   /* SMC 2862W-G version 2 */
64         {USB_DEVICE(0x083a, 0x4521)},   /* Siemens Gigaset USB Adapter 54 version 2 */
65         {USB_DEVICE(0x083a, 0xf503)},   /* Accton FD7050E ver 1010ec  */
66         {USB_DEVICE(0x0846, 0x4240)},   /* Netgear WG111 (v2) */
67         {USB_DEVICE(0x0915, 0x2000)},   /* Cohiba Proto board */
68         {USB_DEVICE(0x0915, 0x2002)},   /* Cohiba Proto board */
69         {USB_DEVICE(0x0baf, 0x0118)},   /* U.S. Robotics U5 802.11g Adapter*/
70         {USB_DEVICE(0x0bf8, 0x1009)},   /* FUJITSU E-5400 USB D1700*/
71         {USB_DEVICE(0x0cde, 0x0006)},   /* Medion MD40900 */
72         {USB_DEVICE(0x0cde, 0x0008)},   /* Sagem XG703A */
73         {USB_DEVICE(0x0cde, 0x0015)},   /* Zcomax XG-705A */
74         {USB_DEVICE(0x0d8e, 0x3762)},   /* DLink DWL-G120 Cohiba */
75         {USB_DEVICE(0x124a, 0x4025)},   /* IOGear GWU513 (GW3887IK chip) */
76         {USB_DEVICE(0x1260, 0xee22)},   /* SMC 2862W-G version 2 */
77         {USB_DEVICE(0x13b1, 0x000a)},   /* Linksys WUSB54G ver 2 */
78         {USB_DEVICE(0x13B1, 0x000C)},   /* Linksys WUSB54AG */
79         {USB_DEVICE(0x1413, 0x5400)},   /* Telsey 802.11g USB2.0 Adapter */
80         {USB_DEVICE(0x1435, 0x0427)},   /* Inventel UR054G */
81         {USB_DEVICE(0x2001, 0x3704)},   /* DLink DWL-G122 rev A2 */
82         {USB_DEVICE(0x413c, 0x8102)},   /* Spinnaker DUT */
83         {USB_DEVICE(0x413c, 0x8104)},   /* Cohiba Proto board */
84         {}
85 };
86
87 MODULE_DEVICE_TABLE(usb, p54u_table);
88
89 static const struct {
90         u32 intf;
91         enum p54u_hw_type type;
92         const char *fw;
93         const char *fw_legacy;
94         char hw[20];
95 } p54u_fwlist[__NUM_P54U_HWTYPES] = {
96         {
97                 .type = P54U_NET2280,
98                 .intf = FW_LM86,
99                 .fw = "isl3886usb",
100                 .fw_legacy = "isl3890usb",
101                 .hw = "ISL3886 + net2280",
102         },
103         {
104                 .type = P54U_3887,
105                 .intf = FW_LM87,
106                 .fw = "isl3887usb",
107                 .fw_legacy = "isl3887usb_bare",
108                 .hw = "ISL3887",
109         },
110 };
111
112 static void p54u_rx_cb(struct urb *urb)
113 {
114         struct sk_buff *skb = (struct sk_buff *) urb->context;
115         struct p54u_rx_info *info = (struct p54u_rx_info *)skb->cb;
116         struct ieee80211_hw *dev = info->dev;
117         struct p54u_priv *priv = dev->priv;
118
119         skb_unlink(skb, &priv->rx_queue);
120
121         if (unlikely(urb->status)) {
122                 dev_kfree_skb_irq(skb);
123                 return;
124         }
125
126         skb_put(skb, urb->actual_length);
127
128         if (priv->hw_type == P54U_NET2280)
129                 skb_pull(skb, priv->common.tx_hdr_len);
130         if (priv->common.fw_interface == FW_LM87) {
131                 skb_pull(skb, 4);
132                 skb_put(skb, 4);
133         }
134
135         if (p54_rx(dev, skb)) {
136                 skb = dev_alloc_skb(priv->common.rx_mtu + 32);
137                 if (unlikely(!skb)) {
138                         /* TODO check rx queue length and refill *somewhere* */
139                         return;
140                 }
141
142                 info = (struct p54u_rx_info *) skb->cb;
143                 info->urb = urb;
144                 info->dev = dev;
145                 urb->transfer_buffer = skb_tail_pointer(skb);
146                 urb->context = skb;
147         } else {
148                 if (priv->hw_type == P54U_NET2280)
149                         skb_push(skb, priv->common.tx_hdr_len);
150                 if (priv->common.fw_interface == FW_LM87) {
151                         skb_push(skb, 4);
152                         skb_put(skb, 4);
153                 }
154                 skb_reset_tail_pointer(skb);
155                 skb_trim(skb, 0);
156                 urb->transfer_buffer = skb_tail_pointer(skb);
157         }
158         skb_queue_tail(&priv->rx_queue, skb);
159         usb_anchor_urb(urb, &priv->submitted);
160         if (usb_submit_urb(urb, GFP_ATOMIC)) {
161                 skb_unlink(skb, &priv->rx_queue);
162                 usb_unanchor_urb(urb);
163                 dev_kfree_skb_irq(skb);
164         }
165 }
166
167 static void p54u_tx_cb(struct urb *urb)
168 {
169         struct sk_buff *skb = urb->context;
170         struct ieee80211_hw *dev = (struct ieee80211_hw *)
171                 usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
172
173         p54_free_skb(dev, skb);
174 }
175
176 static void p54u_tx_dummy_cb(struct urb *urb) { }
177
178 static void p54u_free_urbs(struct ieee80211_hw *dev)
179 {
180         struct p54u_priv *priv = dev->priv;
181         usb_kill_anchored_urbs(&priv->submitted);
182 }
183
184 static int p54u_init_urbs(struct ieee80211_hw *dev)
185 {
186         struct p54u_priv *priv = dev->priv;
187         struct urb *entry = NULL;
188         struct sk_buff *skb;
189         struct p54u_rx_info *info;
190         int ret = 0;
191
192         while (skb_queue_len(&priv->rx_queue) < 32) {
193                 skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
194                 if (!skb) {
195                         ret = -ENOMEM;
196                         goto err;
197                 }
198                 entry = usb_alloc_urb(0, GFP_KERNEL);
199                 if (!entry) {
200                         ret = -ENOMEM;
201                         goto err;
202                 }
203
204                 usb_fill_bulk_urb(entry, priv->udev,
205                                   usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
206                                   skb_tail_pointer(skb),
207                                   priv->common.rx_mtu + 32, p54u_rx_cb, skb);
208                 info = (struct p54u_rx_info *) skb->cb;
209                 info->urb = entry;
210                 info->dev = dev;
211                 skb_queue_tail(&priv->rx_queue, skb);
212
213                 usb_anchor_urb(entry, &priv->submitted);
214                 ret = usb_submit_urb(entry, GFP_KERNEL);
215                 if (ret) {
216                         skb_unlink(skb, &priv->rx_queue);
217                         usb_unanchor_urb(entry);
218                         goto err;
219                 }
220                 usb_free_urb(entry);
221                 entry = NULL;
222         }
223
224         return 0;
225
226  err:
227         usb_free_urb(entry);
228         kfree_skb(skb);
229         p54u_free_urbs(dev);
230         return ret;
231 }
232
233 static __le32 p54u_lm87_chksum(const __le32 *data, size_t length)
234 {
235         u32 chk = 0;
236
237         length >>= 2;
238         while (length--) {
239                 chk ^= le32_to_cpu(*data++);
240                 chk = (chk >> 5) ^ (chk << 3);
241         }
242
243         return cpu_to_le32(chk);
244 }
245
246 static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
247 {
248         struct p54u_priv *priv = dev->priv;
249         struct urb *data_urb;
250         struct lm87_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
251
252         data_urb = usb_alloc_urb(0, GFP_ATOMIC);
253         if (!data_urb) {
254                 p54_free_skb(dev, skb);
255                 return;
256         }
257
258         hdr->chksum = p54u_lm87_chksum((__le32 *)skb->data, skb->len);
259         hdr->device_addr = ((struct p54_hdr *)skb->data)->req_id;
260
261         usb_fill_bulk_urb(data_urb, priv->udev,
262                           usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
263                           hdr, skb->len + sizeof(*hdr),  FREE_AFTER_TX(skb) ?
264                           p54u_tx_cb : p54u_tx_dummy_cb, skb);
265         data_urb->transfer_flags |= URB_ZERO_PACKET;
266
267         usb_anchor_urb(data_urb, &priv->submitted);
268         if (usb_submit_urb(data_urb, GFP_ATOMIC)) {
269                 usb_unanchor_urb(data_urb);
270                 p54_free_skb(dev, skb);
271         }
272         usb_free_urb(data_urb);
273 }
274
275 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
276 {
277         struct p54u_priv *priv = dev->priv;
278         struct urb *int_urb = NULL, *data_urb = NULL;
279         struct net2280_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
280         struct net2280_reg_write *reg = NULL;
281         int err = -ENOMEM;
282
283         reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
284         if (!reg)
285                 goto out;
286
287         int_urb = usb_alloc_urb(0, GFP_ATOMIC);
288         if (!int_urb)
289                 goto out;
290
291         data_urb = usb_alloc_urb(0, GFP_ATOMIC);
292         if (!data_urb)
293                 goto out;
294
295         reg->port = cpu_to_le16(NET2280_DEV_U32);
296         reg->addr = cpu_to_le32(P54U_DEV_BASE);
297         reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
298
299         memset(hdr, 0, sizeof(*hdr));
300         hdr->len = cpu_to_le16(skb->len);
301         hdr->device_addr = ((struct p54_hdr *) skb->data)->req_id;
302
303         usb_fill_bulk_urb(int_urb, priv->udev,
304                 usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
305                 p54u_tx_dummy_cb, dev);
306
307         /*
308          * URB_FREE_BUFFER triggers a code path in the USB subsystem that will
309          * free what is inside the transfer_buffer after the last reference to
310          * the int_urb is dropped.
311          */
312         int_urb->transfer_flags |= URB_FREE_BUFFER | URB_ZERO_PACKET;
313         reg = NULL;
314
315         usb_fill_bulk_urb(data_urb, priv->udev,
316                           usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
317                           hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
318                           p54u_tx_cb : p54u_tx_dummy_cb, skb);
319         data_urb->transfer_flags |= URB_ZERO_PACKET;
320
321         usb_anchor_urb(int_urb, &priv->submitted);
322         err = usb_submit_urb(int_urb, GFP_ATOMIC);
323         if (err) {
324                 usb_unanchor_urb(int_urb);
325                 goto out;
326         }
327
328         usb_anchor_urb(data_urb, &priv->submitted);
329         err = usb_submit_urb(data_urb, GFP_ATOMIC);
330         if (err) {
331                 usb_unanchor_urb(data_urb);
332                 goto out;
333         }
334 out:
335         usb_free_urb(int_urb);
336         usb_free_urb(data_urb);
337
338         if (err) {
339                 kfree(reg);
340                 p54_free_skb(dev, skb);
341         }
342 }
343
344 static int p54u_write(struct p54u_priv *priv,
345                       struct net2280_reg_write *buf,
346                       enum net2280_op_type type,
347                       __le32 addr, __le32 val)
348 {
349         unsigned int ep;
350         int alen;
351
352         if (type & 0x0800)
353                 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
354         else
355                 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
356
357         buf->port = cpu_to_le16(type);
358         buf->addr = addr;
359         buf->val = val;
360
361         return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
362 }
363
364 static int p54u_read(struct p54u_priv *priv, void *buf,
365                      enum net2280_op_type type,
366                      __le32 addr, __le32 *val)
367 {
368         struct net2280_reg_read *read = buf;
369         __le32 *reg = buf;
370         unsigned int ep;
371         int alen, err;
372
373         if (type & 0x0800)
374                 ep = P54U_PIPE_DEV;
375         else
376                 ep = P54U_PIPE_BRG;
377
378         read->port = cpu_to_le16(type);
379         read->addr = addr;
380
381         err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
382                            read, sizeof(*read), &alen, 1000);
383         if (err)
384                 return err;
385
386         err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
387                            reg, sizeof(*reg), &alen, 1000);
388         if (err)
389                 return err;
390
391         *val = *reg;
392         return 0;
393 }
394
395 static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
396                          void *data, size_t len)
397 {
398         int alen;
399         return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
400                             data, len, &alen, 2000);
401 }
402
403 static int p54u_device_reset(struct ieee80211_hw *dev)
404 {
405         struct p54u_priv *priv = dev->priv;
406         int ret, lock = (priv->intf->condition != USB_INTERFACE_BINDING);
407
408         if (lock) {
409                 ret = usb_lock_device_for_reset(priv->udev, priv->intf);
410                 if (ret < 0) {
411                         dev_err(&priv->udev->dev, "(p54usb) unable to lock "
412                                 "device for reset (%d)!\n", ret);
413                         return ret;
414                 }
415         }
416
417         ret = usb_reset_device(priv->udev);
418         if (lock)
419                 usb_unlock_device(priv->udev);
420
421         if (ret)
422                 dev_err(&priv->udev->dev, "(p54usb) unable to reset "
423                         "device (%d)!\n", ret);
424
425         return ret;
426 }
427
428 static const char p54u_romboot_3887[] = "~~~~";
429 static int p54u_firmware_reset_3887(struct ieee80211_hw *dev)
430 {
431         struct p54u_priv *priv = dev->priv;
432         u8 *buf;
433         int ret;
434
435         buf = kmalloc(4, GFP_KERNEL);
436         if (!buf)
437                 return -ENOMEM;
438         memcpy(buf, p54u_romboot_3887, 4);
439         ret = p54u_bulk_msg(priv, P54U_PIPE_DATA,
440                             buf, 4);
441         kfree(buf);
442         if (ret)
443                 dev_err(&priv->udev->dev, "(p54usb) unable to jump to "
444                         "boot ROM (%d)!\n", ret);
445
446         return ret;
447 }
448
449 static const char p54u_firmware_upload_3887[] = "<\r";
450 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
451 {
452         struct p54u_priv *priv = dev->priv;
453         int err, alen;
454         u8 carry = 0;
455         u8 *buf, *tmp;
456         const u8 *data;
457         unsigned int left, remains, block_size;
458         struct x2_header *hdr;
459         unsigned long timeout;
460
461         err = p54u_firmware_reset_3887(dev);
462         if (err)
463                 return err;
464
465         tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
466         if (!buf) {
467                 dev_err(&priv->udev->dev, "(p54usb) cannot allocate firmware"
468                                           "upload buffer!\n");
469                 return -ENOMEM;
470         }
471
472         left = block_size = min((size_t)P54U_FW_BLOCK, priv->fw->size);
473         strcpy(buf, p54u_firmware_upload_3887);
474         left -= strlen(p54u_firmware_upload_3887);
475         tmp += strlen(p54u_firmware_upload_3887);
476
477         data = priv->fw->data;
478         remains = priv->fw->size;
479
480         hdr = (struct x2_header *)(buf + strlen(p54u_firmware_upload_3887));
481         memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
482         hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
483         hdr->fw_length = cpu_to_le32(priv->fw->size);
484         hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
485                                          sizeof(u32)*2));
486         left -= sizeof(*hdr);
487         tmp += sizeof(*hdr);
488
489         while (remains) {
490                 while (left--) {
491                         if (carry) {
492                                 *tmp++ = carry;
493                                 carry = 0;
494                                 remains--;
495                                 continue;
496                         }
497                         switch (*data) {
498                         case '~':
499                                 *tmp++ = '}';
500                                 carry = '^';
501                                 break;
502                         case '}':
503                                 *tmp++ = '}';
504                                 carry = ']';
505                                 break;
506                         default:
507                                 *tmp++ = *data;
508                                 remains--;
509                                 break;
510                         }
511                         data++;
512                 }
513
514                 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
515                 if (err) {
516                         dev_err(&priv->udev->dev, "(p54usb) firmware "
517                                                   "upload failed!\n");
518                         goto err_upload_failed;
519                 }
520
521                 tmp = buf;
522                 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
523         }
524
525         *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, priv->fw->data,
526                                                  priv->fw->size));
527         err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
528         if (err) {
529                 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
530                 goto err_upload_failed;
531         }
532         timeout = jiffies + msecs_to_jiffies(1000);
533         while (!(err = usb_bulk_msg(priv->udev,
534                 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
535                 if (alen > 2 && !memcmp(buf, "OK", 2))
536                         break;
537
538                 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
539                         err = -EINVAL;
540                         break;
541                 }
542
543                 if (time_after(jiffies, timeout)) {
544                         dev_err(&priv->udev->dev, "(p54usb) firmware boot "
545                                                   "timed out!\n");
546                         err = -ETIMEDOUT;
547                         break;
548                 }
549         }
550         if (err) {
551                 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
552                 goto err_upload_failed;
553         }
554
555         buf[0] = 'g';
556         buf[1] = '\r';
557         err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
558         if (err) {
559                 dev_err(&priv->udev->dev, "(p54usb) firmware boot failed!\n");
560                 goto err_upload_failed;
561         }
562
563         timeout = jiffies + msecs_to_jiffies(1000);
564         while (!(err = usb_bulk_msg(priv->udev,
565                 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
566                 if (alen > 0 && buf[0] == 'g')
567                         break;
568
569                 if (time_after(jiffies, timeout)) {
570                         err = -ETIMEDOUT;
571                         break;
572                 }
573         }
574         if (err)
575                 goto err_upload_failed;
576
577 err_upload_failed:
578         kfree(buf);
579         return err;
580 }
581
582 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
583 {
584         struct p54u_priv *priv = dev->priv;
585         const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
586         int err, alen;
587         void *buf;
588         __le32 reg;
589         unsigned int remains, offset;
590         const u8 *data;
591
592         buf = kmalloc(512, GFP_KERNEL);
593         if (!buf) {
594                 dev_err(&priv->udev->dev, "(p54usb) firmware buffer "
595                                           "alloc failed!\n");
596                 return -ENOMEM;
597         }
598
599 #define P54U_WRITE(type, addr, data) \
600         do {\
601                 err = p54u_write(priv, buf, type,\
602                                  cpu_to_le32((u32)(unsigned long)addr), data);\
603                 if (err) \
604                         goto fail;\
605         } while (0)
606
607 #define P54U_READ(type, addr) \
608         do {\
609                 err = p54u_read(priv, buf, type,\
610                                 cpu_to_le32((u32)(unsigned long)addr), &reg);\
611                 if (err)\
612                         goto fail;\
613         } while (0)
614
615         /* power down net2280 bridge */
616         P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
617         reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
618         reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
619         P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
620
621         mdelay(100);
622
623         /* power up bridge */
624         reg |= cpu_to_le32(P54U_BRG_POWER_UP);
625         reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
626         P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
627
628         mdelay(100);
629
630         P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
631                    cpu_to_le32(NET2280_CLK_30Mhz |
632                                NET2280_PCI_ENABLE |
633                                NET2280_PCI_SOFT_RESET));
634
635         mdelay(20);
636
637         P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
638                    cpu_to_le32(PCI_COMMAND_MEMORY |
639                                PCI_COMMAND_MASTER));
640
641         P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
642                    cpu_to_le32(NET2280_BASE));
643
644         P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
645         reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
646         P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
647
648         // TODO: we really need this?
649         P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
650
651         P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
652                    cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
653         P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
654                    cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
655
656         P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
657                    cpu_to_le32(NET2280_BASE2));
658
659         /* finally done setting up the bridge */
660
661         P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
662                    cpu_to_le32(PCI_COMMAND_MEMORY |
663                                PCI_COMMAND_MASTER));
664
665         P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
666         P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
667                    cpu_to_le32(P54U_DEV_BASE));
668
669         P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
670         P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
671                    cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
672
673         /* do romboot */
674         P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
675
676         P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
677         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
678         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
679         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
680         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
681
682         mdelay(20);
683
684         reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
685         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
686
687         mdelay(20);
688
689         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
690         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
691
692         mdelay(100);
693
694         P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
695         P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
696
697         /* finally, we can upload firmware now! */
698         remains = priv->fw->size;
699         data = priv->fw->data;
700         offset = ISL38XX_DEV_FIRMWARE_ADDR;
701
702         while (remains) {
703                 unsigned int block_len = min(remains, (unsigned int)512);
704                 memcpy(buf, data, block_len);
705
706                 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
707                 if (err) {
708                         dev_err(&priv->udev->dev, "(p54usb) firmware block "
709                                                   "upload failed\n");
710                         goto fail;
711                 }
712
713                 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
714                            cpu_to_le32(0xc0000f00));
715
716                 P54U_WRITE(NET2280_DEV_U32,
717                            0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
718                 P54U_WRITE(NET2280_DEV_U32,
719                            0x0020 | (unsigned long)&devreg->direct_mem_win,
720                            cpu_to_le32(1));
721
722                 P54U_WRITE(NET2280_DEV_U32,
723                            0x0024 | (unsigned long)&devreg->direct_mem_win,
724                            cpu_to_le32(block_len));
725                 P54U_WRITE(NET2280_DEV_U32,
726                            0x0028 | (unsigned long)&devreg->direct_mem_win,
727                            cpu_to_le32(offset));
728
729                 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
730                            cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
731                 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
732                            cpu_to_le32(block_len >> 2));
733                 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
734                            cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
735
736                 mdelay(10);
737
738                 P54U_READ(NET2280_DEV_U32,
739                           0x002C | (unsigned long)&devreg->direct_mem_win);
740                 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
741                     !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
742                         dev_err(&priv->udev->dev, "(p54usb) firmware DMA "
743                                                   "transfer failed\n");
744                         goto fail;
745                 }
746
747                 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
748                            cpu_to_le32(NET2280_FIFO_FLUSH));
749
750                 remains -= block_len;
751                 data += block_len;
752                 offset += block_len;
753         }
754
755         /* do ramboot */
756         P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
757         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
758         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
759         reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
760         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
761
762         mdelay(20);
763
764         reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
765         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
766
767         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
768         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
769
770         mdelay(100);
771
772         P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
773         P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
774
775         /* start up the firmware */
776         P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
777                    cpu_to_le32(ISL38XX_INT_IDENT_INIT));
778
779         P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
780                    cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
781
782         P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
783                    cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
784                                NET2280_USB_INTERRUPT_ENABLE));
785
786         P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
787                    cpu_to_le32(ISL38XX_DEV_INT_RESET));
788
789         err = usb_interrupt_msg(priv->udev,
790                                 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
791                                 buf, sizeof(__le32), &alen, 1000);
792         if (err || alen != sizeof(__le32))
793                 goto fail;
794
795         P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
796         P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
797
798         if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
799                 err = -EINVAL;
800
801         P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
802         P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
803                    cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
804
805 #undef P54U_WRITE
806 #undef P54U_READ
807
808 fail:
809         kfree(buf);
810         return err;
811 }
812
813 static int p54u_load_firmware(struct ieee80211_hw *dev)
814 {
815         struct p54u_priv *priv = dev->priv;
816         int err, i;
817
818         BUILD_BUG_ON(ARRAY_SIZE(p54u_fwlist) != __NUM_P54U_HWTYPES);
819
820         for (i = 0; i < __NUM_P54U_HWTYPES; i++)
821                 if (p54u_fwlist[i].type == priv->hw_type)
822                         break;
823
824         if (i == __NUM_P54U_HWTYPES)
825                 return -EOPNOTSUPP;
826
827         err = request_firmware(&priv->fw, p54u_fwlist[i].fw, &priv->udev->dev);
828         if (err) {
829                 dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s "
830                                           "(%d)!\n", p54u_fwlist[i].fw, err);
831
832                 err = request_firmware(&priv->fw, p54u_fwlist[i].fw_legacy,
833                                        &priv->udev->dev);
834                 if (err)
835                         return err;
836         }
837
838         err = p54_parse_firmware(dev, priv->fw);
839         if (err)
840                 goto out;
841
842         if (priv->common.fw_interface != p54u_fwlist[i].intf) {
843                 dev_err(&priv->udev->dev, "wrong firmware, please get "
844                         "a firmware for \"%s\" and try again.\n",
845                         p54u_fwlist[i].hw);
846                 err = -EINVAL;
847         }
848
849 out:
850         if (err)
851                 release_firmware(priv->fw);
852
853         return err;
854 }
855
856 static int p54u_open(struct ieee80211_hw *dev)
857 {
858         struct p54u_priv *priv = dev->priv;
859         int err;
860
861         err = p54u_init_urbs(dev);
862         if (err) {
863                 return err;
864         }
865
866         priv->common.open = p54u_init_urbs;
867
868         return 0;
869 }
870
871 static void p54u_stop(struct ieee80211_hw *dev)
872 {
873         /* TODO: figure out how to reliably stop the 3887 and net2280 so
874            the hardware is still usable next time we want to start it.
875            until then, we just stop listening to the hardware.. */
876         p54u_free_urbs(dev);
877         return;
878 }
879
880 static int __devinit p54u_probe(struct usb_interface *intf,
881                                 const struct usb_device_id *id)
882 {
883         struct usb_device *udev = interface_to_usbdev(intf);
884         struct ieee80211_hw *dev;
885         struct p54u_priv *priv;
886         int err;
887         unsigned int i, recognized_pipes;
888
889         dev = p54_init_common(sizeof(*priv));
890
891         if (!dev) {
892                 dev_err(&udev->dev, "(p54usb) ieee80211 alloc failed\n");
893                 return -ENOMEM;
894         }
895
896         priv = dev->priv;
897         priv->hw_type = P54U_INVALID_HW;
898
899         SET_IEEE80211_DEV(dev, &intf->dev);
900         usb_set_intfdata(intf, dev);
901         priv->udev = udev;
902         priv->intf = intf;
903         skb_queue_head_init(&priv->rx_queue);
904         init_usb_anchor(&priv->submitted);
905
906         usb_get_dev(udev);
907
908         /* really lazy and simple way of figuring out if we're a 3887 */
909         /* TODO: should just stick the identification in the device table */
910         i = intf->altsetting->desc.bNumEndpoints;
911         recognized_pipes = 0;
912         while (i--) {
913                 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
914                 case P54U_PIPE_DATA:
915                 case P54U_PIPE_MGMT:
916                 case P54U_PIPE_BRG:
917                 case P54U_PIPE_DEV:
918                 case P54U_PIPE_DATA | USB_DIR_IN:
919                 case P54U_PIPE_MGMT | USB_DIR_IN:
920                 case P54U_PIPE_BRG | USB_DIR_IN:
921                 case P54U_PIPE_DEV | USB_DIR_IN:
922                 case P54U_PIPE_INT | USB_DIR_IN:
923                         recognized_pipes++;
924                 }
925         }
926         priv->common.open = p54u_open;
927         priv->common.stop = p54u_stop;
928         if (recognized_pipes < P54U_PIPE_NUMBER) {
929 #ifdef CONFIG_PM
930                 /* ISL3887 needs a full reset on resume */
931                 udev->reset_resume = 1;
932                 err = p54u_device_reset(dev);
933 #endif
934
935                 priv->hw_type = P54U_3887;
936                 dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
937                 priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
938                 priv->common.tx = p54u_tx_lm87;
939                 priv->upload_fw = p54u_upload_firmware_3887;
940         } else {
941                 priv->hw_type = P54U_NET2280;
942                 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
943                 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
944                 priv->common.tx = p54u_tx_net2280;
945                 priv->upload_fw = p54u_upload_firmware_net2280;
946         }
947         err = p54u_load_firmware(dev);
948         if (err)
949                 goto err_free_dev;
950
951         err = priv->upload_fw(dev);
952         if (err)
953                 goto err_free_fw;
954
955         p54u_open(dev);
956         err = p54_read_eeprom(dev);
957         p54u_stop(dev);
958         if (err)
959                 goto err_free_fw;
960
961         err = p54_register_common(dev, &udev->dev);
962         if (err)
963                 goto err_free_fw;
964
965         return 0;
966
967 err_free_fw:
968         release_firmware(priv->fw);
969
970 err_free_dev:
971         p54_free_common(dev);
972         usb_set_intfdata(intf, NULL);
973         usb_put_dev(udev);
974         return err;
975 }
976
977 static void __devexit p54u_disconnect(struct usb_interface *intf)
978 {
979         struct ieee80211_hw *dev = usb_get_intfdata(intf);
980         struct p54u_priv *priv;
981
982         if (!dev)
983                 return;
984
985         p54_unregister_common(dev);
986
987         priv = dev->priv;
988         usb_put_dev(interface_to_usbdev(intf));
989         release_firmware(priv->fw);
990         p54_free_common(dev);
991 }
992
993 static int p54u_pre_reset(struct usb_interface *intf)
994 {
995         struct ieee80211_hw *dev = usb_get_intfdata(intf);
996
997         if (!dev)
998                 return -ENODEV;
999
1000         p54u_stop(dev);
1001         return 0;
1002 }
1003
1004 static int p54u_resume(struct usb_interface *intf)
1005 {
1006         struct ieee80211_hw *dev = usb_get_intfdata(intf);
1007         struct p54u_priv *priv;
1008
1009         if (!dev)
1010                 return -ENODEV;
1011
1012         priv = dev->priv;
1013         if (unlikely(!(priv->upload_fw && priv->fw)))
1014                 return 0;
1015
1016         return priv->upload_fw(dev);
1017 }
1018
1019 static int p54u_post_reset(struct usb_interface *intf)
1020 {
1021         struct ieee80211_hw *dev = usb_get_intfdata(intf);
1022         struct p54u_priv *priv;
1023         int err;
1024
1025         err = p54u_resume(intf);
1026         if (err)
1027                 return err;
1028
1029         /* reinitialize old device state */
1030         priv = dev->priv;
1031         if (priv->common.mode != NL80211_IFTYPE_UNSPECIFIED)
1032                 ieee80211_restart_hw(dev);
1033
1034         return 0;
1035 }
1036
1037 #ifdef CONFIG_PM
1038
1039 static int p54u_suspend(struct usb_interface *intf, pm_message_t message)
1040 {
1041         return p54u_pre_reset(intf);
1042 }
1043
1044 #endif /* CONFIG_PM */
1045
1046 static struct usb_driver p54u_driver = {
1047         .name   = "p54usb",
1048         .id_table = p54u_table,
1049         .probe = p54u_probe,
1050         .disconnect = p54u_disconnect,
1051         .pre_reset = p54u_pre_reset,
1052         .post_reset = p54u_post_reset,
1053 #ifdef CONFIG_PM
1054         .suspend = p54u_suspend,
1055         .resume = p54u_resume,
1056         .reset_resume = p54u_resume,
1057 #endif /* CONFIG_PM */
1058         .soft_unbind = 1,
1059 };
1060
1061 static int __init p54u_init(void)
1062 {
1063         return usb_register(&p54u_driver);
1064 }
1065
1066 static void __exit p54u_exit(void)
1067 {
1068         usb_deregister(&p54u_driver);
1069 }
1070
1071 module_init(p54u_init);
1072 module_exit(p54u_exit);