IPVS: fix netns if reading ip_vs_* procfs entries
[linux-2.6/linux-mips.git] / drivers / net / wireless / p54 / p54usb.c
blobe18358725b69813077de8d9e55f8a98d5fa7a021
2 /*
3 * Linux device driver for USB based Prism54
5 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
7 * Based on the islsm (softmac prism54) driver, which is:
8 * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
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.
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>
25 #include "p54.h"
26 #include "lmac.h"
27 #include "p54usb.h"
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");
37 * Note:
39 * Always update our wiki's device list (located at:
40 * http://wireless.kernel.org/en/users/Drivers/p54/devices ),
41 * whenever you add a new device.
44 static struct usb_device_id p54u_table[] __devinitdata = {
45 /* Version 1 devices (pci chip + net2280) */
46 {USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */
47 {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */
48 {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
49 {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */
50 {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */
51 {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */
52 {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */
53 {USB_DEVICE(0x083a, 0x4502)}, /* Siemens Gigaset USB Adapter */
54 {USB_DEVICE(0x083a, 0x5501)}, /* Phillips CPWUA054 */
55 {USB_DEVICE(0x0846, 0x4200)}, /* Netgear WG121 */
56 {USB_DEVICE(0x0846, 0x4210)}, /* Netgear WG121 the second ? */
57 {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
58 {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
59 {USB_DEVICE(0x0bf8, 0x1007)}, /* Fujitsu E-5400 USB */
60 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
61 {USB_DEVICE(0x0db0, 0x6826)}, /* MSI UB54G (MS-6826) */
62 {USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */
63 {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
64 {USB_DEVICE(0x1435, 0x0210)}, /* Inventel UR054G */
65 {USB_DEVICE(0x15a9, 0x0002)}, /* Gemtek WUBI-100GW 802.11g */
66 {USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */
67 {USB_DEVICE(0x182d, 0x096b)}, /* Sitecom WL-107 */
68 {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
69 {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
70 {USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
71 {USB_DEVICE(0x2001, 0x3703)}, /* DLink DWL-G122 */
72 {USB_DEVICE(0x2001, 0x3762)}, /* Conceptronic C54U */
73 {USB_DEVICE(0x5041, 0x2234)}, /* Linksys WUSB54G */
74 {USB_DEVICE(0x5041, 0x2235)}, /* Linksys WUSB54G Portable */
76 /* Version 2 devices (3887) */
77 {USB_DEVICE(0x0471, 0x1230)}, /* Philips CPWUA054/00 */
78 {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */
79 {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */
80 {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */
81 {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */
82 {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */
83 {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
84 {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
85 {USB_DEVICE(0x083a, 0xf503)}, /* Accton FD7050E ver 1010ec */
86 {USB_DEVICE(0x0846, 0x4240)}, /* Netgear WG111 (v2) */
87 {USB_DEVICE(0x0915, 0x2000)}, /* Cohiba Proto board */
88 {USB_DEVICE(0x0915, 0x2002)}, /* Cohiba Proto board */
89 {USB_DEVICE(0x0baf, 0x0118)}, /* U.S. Robotics U5 802.11g Adapter*/
90 {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/
91 /* {USB_DEVICE(0x0cde, 0x0006)}, * Medion MD40900 already listed above,
92 * just noting it here for clarity */
93 {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */
94 {USB_DEVICE(0x0cde, 0x0015)}, /* Zcomax XG-705A */
95 {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */
96 {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */
97 {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */
98 {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */
99 {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */
100 {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */
101 {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
102 {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
103 {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */
104 {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
105 {USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */
106 {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
107 {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
108 {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
112 MODULE_DEVICE_TABLE(usb, p54u_table);
114 static const struct {
115 u32 intf;
116 enum p54u_hw_type type;
117 const char *fw;
118 const char *fw_legacy;
119 char hw[20];
120 } p54u_fwlist[__NUM_P54U_HWTYPES] = {
122 .type = P54U_NET2280,
123 .intf = FW_LM86,
124 .fw = "isl3886usb",
125 .fw_legacy = "isl3890usb",
126 .hw = "ISL3886 + net2280",
129 .type = P54U_3887,
130 .intf = FW_LM87,
131 .fw = "isl3887usb",
132 .fw_legacy = "isl3887usb_bare",
133 .hw = "ISL3887",
137 static void p54u_rx_cb(struct urb *urb)
139 struct sk_buff *skb = (struct sk_buff *) urb->context;
140 struct p54u_rx_info *info = (struct p54u_rx_info *)skb->cb;
141 struct ieee80211_hw *dev = info->dev;
142 struct p54u_priv *priv = dev->priv;
144 skb_unlink(skb, &priv->rx_queue);
146 if (unlikely(urb->status)) {
147 dev_kfree_skb_irq(skb);
148 return;
151 skb_put(skb, urb->actual_length);
153 if (priv->hw_type == P54U_NET2280)
154 skb_pull(skb, priv->common.tx_hdr_len);
155 if (priv->common.fw_interface == FW_LM87) {
156 skb_pull(skb, 4);
157 skb_put(skb, 4);
160 if (p54_rx(dev, skb)) {
161 skb = dev_alloc_skb(priv->common.rx_mtu + 32);
162 if (unlikely(!skb)) {
163 /* TODO check rx queue length and refill *somewhere* */
164 return;
167 info = (struct p54u_rx_info *) skb->cb;
168 info->urb = urb;
169 info->dev = dev;
170 urb->transfer_buffer = skb_tail_pointer(skb);
171 urb->context = skb;
172 } else {
173 if (priv->hw_type == P54U_NET2280)
174 skb_push(skb, priv->common.tx_hdr_len);
175 if (priv->common.fw_interface == FW_LM87) {
176 skb_push(skb, 4);
177 skb_put(skb, 4);
179 skb_reset_tail_pointer(skb);
180 skb_trim(skb, 0);
181 urb->transfer_buffer = skb_tail_pointer(skb);
183 skb_queue_tail(&priv->rx_queue, skb);
184 usb_anchor_urb(urb, &priv->submitted);
185 if (usb_submit_urb(urb, GFP_ATOMIC)) {
186 skb_unlink(skb, &priv->rx_queue);
187 usb_unanchor_urb(urb);
188 dev_kfree_skb_irq(skb);
192 static void p54u_tx_cb(struct urb *urb)
194 struct sk_buff *skb = urb->context;
195 struct ieee80211_hw *dev =
196 usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
198 p54_free_skb(dev, skb);
201 static void p54u_tx_dummy_cb(struct urb *urb) { }
203 static void p54u_free_urbs(struct ieee80211_hw *dev)
205 struct p54u_priv *priv = dev->priv;
206 usb_kill_anchored_urbs(&priv->submitted);
209 static int p54u_init_urbs(struct ieee80211_hw *dev)
211 struct p54u_priv *priv = dev->priv;
212 struct urb *entry = NULL;
213 struct sk_buff *skb;
214 struct p54u_rx_info *info;
215 int ret = 0;
217 while (skb_queue_len(&priv->rx_queue) < 32) {
218 skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
219 if (!skb) {
220 ret = -ENOMEM;
221 goto err;
223 entry = usb_alloc_urb(0, GFP_KERNEL);
224 if (!entry) {
225 ret = -ENOMEM;
226 goto err;
229 usb_fill_bulk_urb(entry, priv->udev,
230 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
231 skb_tail_pointer(skb),
232 priv->common.rx_mtu + 32, p54u_rx_cb, skb);
233 info = (struct p54u_rx_info *) skb->cb;
234 info->urb = entry;
235 info->dev = dev;
236 skb_queue_tail(&priv->rx_queue, skb);
238 usb_anchor_urb(entry, &priv->submitted);
239 ret = usb_submit_urb(entry, GFP_KERNEL);
240 if (ret) {
241 skb_unlink(skb, &priv->rx_queue);
242 usb_unanchor_urb(entry);
243 goto err;
245 usb_free_urb(entry);
246 entry = NULL;
249 return 0;
251 err:
252 usb_free_urb(entry);
253 kfree_skb(skb);
254 p54u_free_urbs(dev);
255 return ret;
258 static __le32 p54u_lm87_chksum(const __le32 *data, size_t length)
260 u32 chk = 0;
262 length >>= 2;
263 while (length--) {
264 chk ^= le32_to_cpu(*data++);
265 chk = (chk >> 5) ^ (chk << 3);
268 return cpu_to_le32(chk);
271 static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
273 struct p54u_priv *priv = dev->priv;
274 struct urb *data_urb;
275 struct lm87_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
277 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
278 if (!data_urb) {
279 p54_free_skb(dev, skb);
280 return;
283 hdr->chksum = p54u_lm87_chksum((__le32 *)skb->data, skb->len);
284 hdr->device_addr = ((struct p54_hdr *)skb->data)->req_id;
286 usb_fill_bulk_urb(data_urb, priv->udev,
287 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
288 hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
289 p54u_tx_cb : p54u_tx_dummy_cb, skb);
290 data_urb->transfer_flags |= URB_ZERO_PACKET;
292 usb_anchor_urb(data_urb, &priv->submitted);
293 if (usb_submit_urb(data_urb, GFP_ATOMIC)) {
294 usb_unanchor_urb(data_urb);
295 p54_free_skb(dev, skb);
297 usb_free_urb(data_urb);
300 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
302 struct p54u_priv *priv = dev->priv;
303 struct urb *int_urb = NULL, *data_urb = NULL;
304 struct net2280_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
305 struct net2280_reg_write *reg = NULL;
306 int err = -ENOMEM;
308 reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
309 if (!reg)
310 goto out;
312 int_urb = usb_alloc_urb(0, GFP_ATOMIC);
313 if (!int_urb)
314 goto out;
316 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
317 if (!data_urb)
318 goto out;
320 reg->port = cpu_to_le16(NET2280_DEV_U32);
321 reg->addr = cpu_to_le32(P54U_DEV_BASE);
322 reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
324 memset(hdr, 0, sizeof(*hdr));
325 hdr->len = cpu_to_le16(skb->len);
326 hdr->device_addr = ((struct p54_hdr *) skb->data)->req_id;
328 usb_fill_bulk_urb(int_urb, priv->udev,
329 usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
330 p54u_tx_dummy_cb, dev);
333 * URB_FREE_BUFFER triggers a code path in the USB subsystem that will
334 * free what is inside the transfer_buffer after the last reference to
335 * the int_urb is dropped.
337 int_urb->transfer_flags |= URB_FREE_BUFFER | URB_ZERO_PACKET;
338 reg = NULL;
340 usb_fill_bulk_urb(data_urb, priv->udev,
341 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
342 hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
343 p54u_tx_cb : p54u_tx_dummy_cb, skb);
344 data_urb->transfer_flags |= URB_ZERO_PACKET;
346 usb_anchor_urb(int_urb, &priv->submitted);
347 err = usb_submit_urb(int_urb, GFP_ATOMIC);
348 if (err) {
349 usb_unanchor_urb(int_urb);
350 goto out;
353 usb_anchor_urb(data_urb, &priv->submitted);
354 err = usb_submit_urb(data_urb, GFP_ATOMIC);
355 if (err) {
356 usb_unanchor_urb(data_urb);
357 goto out;
359 out:
360 usb_free_urb(int_urb);
361 usb_free_urb(data_urb);
363 if (err) {
364 kfree(reg);
365 p54_free_skb(dev, skb);
369 static int p54u_write(struct p54u_priv *priv,
370 struct net2280_reg_write *buf,
371 enum net2280_op_type type,
372 __le32 addr, __le32 val)
374 unsigned int ep;
375 int alen;
377 if (type & 0x0800)
378 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
379 else
380 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
382 buf->port = cpu_to_le16(type);
383 buf->addr = addr;
384 buf->val = val;
386 return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
389 static int p54u_read(struct p54u_priv *priv, void *buf,
390 enum net2280_op_type type,
391 __le32 addr, __le32 *val)
393 struct net2280_reg_read *read = buf;
394 __le32 *reg = buf;
395 unsigned int ep;
396 int alen, err;
398 if (type & 0x0800)
399 ep = P54U_PIPE_DEV;
400 else
401 ep = P54U_PIPE_BRG;
403 read->port = cpu_to_le16(type);
404 read->addr = addr;
406 err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
407 read, sizeof(*read), &alen, 1000);
408 if (err)
409 return err;
411 err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
412 reg, sizeof(*reg), &alen, 1000);
413 if (err)
414 return err;
416 *val = *reg;
417 return 0;
420 static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
421 void *data, size_t len)
423 int alen;
424 return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
425 data, len, &alen, 2000);
428 static int p54u_device_reset(struct ieee80211_hw *dev)
430 struct p54u_priv *priv = dev->priv;
431 int ret, lock = (priv->intf->condition != USB_INTERFACE_BINDING);
433 if (lock) {
434 ret = usb_lock_device_for_reset(priv->udev, priv->intf);
435 if (ret < 0) {
436 dev_err(&priv->udev->dev, "(p54usb) unable to lock "
437 "device for reset (%d)!\n", ret);
438 return ret;
442 ret = usb_reset_device(priv->udev);
443 if (lock)
444 usb_unlock_device(priv->udev);
446 if (ret)
447 dev_err(&priv->udev->dev, "(p54usb) unable to reset "
448 "device (%d)!\n", ret);
450 return ret;
453 static const char p54u_romboot_3887[] = "~~~~";
454 static int p54u_firmware_reset_3887(struct ieee80211_hw *dev)
456 struct p54u_priv *priv = dev->priv;
457 u8 *buf;
458 int ret;
460 buf = kmemdup(p54u_romboot_3887, 4, GFP_KERNEL);
461 if (!buf)
462 return -ENOMEM;
463 ret = p54u_bulk_msg(priv, P54U_PIPE_DATA,
464 buf, 4);
465 kfree(buf);
466 if (ret)
467 dev_err(&priv->udev->dev, "(p54usb) unable to jump to "
468 "boot ROM (%d)!\n", ret);
470 return ret;
473 static const char p54u_firmware_upload_3887[] = "<\r";
474 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
476 struct p54u_priv *priv = dev->priv;
477 int err, alen;
478 u8 carry = 0;
479 u8 *buf, *tmp;
480 const u8 *data;
481 unsigned int left, remains, block_size;
482 struct x2_header *hdr;
483 unsigned long timeout;
485 err = p54u_firmware_reset_3887(dev);
486 if (err)
487 return err;
489 tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
490 if (!buf) {
491 dev_err(&priv->udev->dev, "(p54usb) cannot allocate firmware"
492 "upload buffer!\n");
493 return -ENOMEM;
496 left = block_size = min((size_t)P54U_FW_BLOCK, priv->fw->size);
497 strcpy(buf, p54u_firmware_upload_3887);
498 left -= strlen(p54u_firmware_upload_3887);
499 tmp += strlen(p54u_firmware_upload_3887);
501 data = priv->fw->data;
502 remains = priv->fw->size;
504 hdr = (struct x2_header *)(buf + strlen(p54u_firmware_upload_3887));
505 memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
506 hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
507 hdr->fw_length = cpu_to_le32(priv->fw->size);
508 hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
509 sizeof(u32)*2));
510 left -= sizeof(*hdr);
511 tmp += sizeof(*hdr);
513 while (remains) {
514 while (left--) {
515 if (carry) {
516 *tmp++ = carry;
517 carry = 0;
518 remains--;
519 continue;
521 switch (*data) {
522 case '~':
523 *tmp++ = '}';
524 carry = '^';
525 break;
526 case '}':
527 *tmp++ = '}';
528 carry = ']';
529 break;
530 default:
531 *tmp++ = *data;
532 remains--;
533 break;
535 data++;
538 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
539 if (err) {
540 dev_err(&priv->udev->dev, "(p54usb) firmware "
541 "upload failed!\n");
542 goto err_upload_failed;
545 tmp = buf;
546 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
549 *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, priv->fw->data,
550 priv->fw->size));
551 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
552 if (err) {
553 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
554 goto err_upload_failed;
556 timeout = jiffies + msecs_to_jiffies(1000);
557 while (!(err = usb_bulk_msg(priv->udev,
558 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
559 if (alen > 2 && !memcmp(buf, "OK", 2))
560 break;
562 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
563 err = -EINVAL;
564 break;
567 if (time_after(jiffies, timeout)) {
568 dev_err(&priv->udev->dev, "(p54usb) firmware boot "
569 "timed out!\n");
570 err = -ETIMEDOUT;
571 break;
574 if (err) {
575 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
576 goto err_upload_failed;
579 buf[0] = 'g';
580 buf[1] = '\r';
581 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
582 if (err) {
583 dev_err(&priv->udev->dev, "(p54usb) firmware boot failed!\n");
584 goto err_upload_failed;
587 timeout = jiffies + msecs_to_jiffies(1000);
588 while (!(err = usb_bulk_msg(priv->udev,
589 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
590 if (alen > 0 && buf[0] == 'g')
591 break;
593 if (time_after(jiffies, timeout)) {
594 err = -ETIMEDOUT;
595 break;
598 if (err)
599 goto err_upload_failed;
601 err_upload_failed:
602 kfree(buf);
603 return err;
606 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
608 struct p54u_priv *priv = dev->priv;
609 const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
610 int err, alen;
611 void *buf;
612 __le32 reg;
613 unsigned int remains, offset;
614 const u8 *data;
616 buf = kmalloc(512, GFP_KERNEL);
617 if (!buf) {
618 dev_err(&priv->udev->dev, "(p54usb) firmware buffer "
619 "alloc failed!\n");
620 return -ENOMEM;
623 #define P54U_WRITE(type, addr, data) \
624 do {\
625 err = p54u_write(priv, buf, type,\
626 cpu_to_le32((u32)(unsigned long)addr), data);\
627 if (err) \
628 goto fail;\
629 } while (0)
631 #define P54U_READ(type, addr) \
632 do {\
633 err = p54u_read(priv, buf, type,\
634 cpu_to_le32((u32)(unsigned long)addr), &reg);\
635 if (err)\
636 goto fail;\
637 } while (0)
639 /* power down net2280 bridge */
640 P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
641 reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
642 reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
643 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
645 mdelay(100);
647 /* power up bridge */
648 reg |= cpu_to_le32(P54U_BRG_POWER_UP);
649 reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
650 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
652 mdelay(100);
654 P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
655 cpu_to_le32(NET2280_CLK_30Mhz |
656 NET2280_PCI_ENABLE |
657 NET2280_PCI_SOFT_RESET));
659 mdelay(20);
661 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
662 cpu_to_le32(PCI_COMMAND_MEMORY |
663 PCI_COMMAND_MASTER));
665 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
666 cpu_to_le32(NET2280_BASE));
668 P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
669 reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
670 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
672 // TODO: we really need this?
673 P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
675 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
676 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
677 P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
678 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
680 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
681 cpu_to_le32(NET2280_BASE2));
683 /* finally done setting up the bridge */
685 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
686 cpu_to_le32(PCI_COMMAND_MEMORY |
687 PCI_COMMAND_MASTER));
689 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
690 P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
691 cpu_to_le32(P54U_DEV_BASE));
693 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
694 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
695 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
697 /* do romboot */
698 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
700 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
701 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
702 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
703 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
704 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
706 mdelay(20);
708 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
709 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
711 mdelay(20);
713 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
714 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
716 mdelay(100);
718 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
719 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
721 /* finally, we can upload firmware now! */
722 remains = priv->fw->size;
723 data = priv->fw->data;
724 offset = ISL38XX_DEV_FIRMWARE_ADDR;
726 while (remains) {
727 unsigned int block_len = min(remains, (unsigned int)512);
728 memcpy(buf, data, block_len);
730 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
731 if (err) {
732 dev_err(&priv->udev->dev, "(p54usb) firmware block "
733 "upload failed\n");
734 goto fail;
737 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
738 cpu_to_le32(0xc0000f00));
740 P54U_WRITE(NET2280_DEV_U32,
741 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
742 P54U_WRITE(NET2280_DEV_U32,
743 0x0020 | (unsigned long)&devreg->direct_mem_win,
744 cpu_to_le32(1));
746 P54U_WRITE(NET2280_DEV_U32,
747 0x0024 | (unsigned long)&devreg->direct_mem_win,
748 cpu_to_le32(block_len));
749 P54U_WRITE(NET2280_DEV_U32,
750 0x0028 | (unsigned long)&devreg->direct_mem_win,
751 cpu_to_le32(offset));
753 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
754 cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
755 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
756 cpu_to_le32(block_len >> 2));
757 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
758 cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
760 mdelay(10);
762 P54U_READ(NET2280_DEV_U32,
763 0x002C | (unsigned long)&devreg->direct_mem_win);
764 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
765 !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
766 dev_err(&priv->udev->dev, "(p54usb) firmware DMA "
767 "transfer failed\n");
768 goto fail;
771 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
772 cpu_to_le32(NET2280_FIFO_FLUSH));
774 remains -= block_len;
775 data += block_len;
776 offset += block_len;
779 /* do ramboot */
780 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
781 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
782 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
783 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
784 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
786 mdelay(20);
788 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
789 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
791 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
792 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
794 mdelay(100);
796 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
797 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
799 /* start up the firmware */
800 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
801 cpu_to_le32(ISL38XX_INT_IDENT_INIT));
803 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
804 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
806 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
807 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
808 NET2280_USB_INTERRUPT_ENABLE));
810 P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
811 cpu_to_le32(ISL38XX_DEV_INT_RESET));
813 err = usb_interrupt_msg(priv->udev,
814 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
815 buf, sizeof(__le32), &alen, 1000);
816 if (err || alen != sizeof(__le32))
817 goto fail;
819 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
820 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
822 if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
823 err = -EINVAL;
825 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
826 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
827 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
829 #undef P54U_WRITE
830 #undef P54U_READ
832 fail:
833 kfree(buf);
834 return err;
837 static int p54u_load_firmware(struct ieee80211_hw *dev)
839 struct p54u_priv *priv = dev->priv;
840 int err, i;
842 BUILD_BUG_ON(ARRAY_SIZE(p54u_fwlist) != __NUM_P54U_HWTYPES);
844 for (i = 0; i < __NUM_P54U_HWTYPES; i++)
845 if (p54u_fwlist[i].type == priv->hw_type)
846 break;
848 if (i == __NUM_P54U_HWTYPES)
849 return -EOPNOTSUPP;
851 err = request_firmware(&priv->fw, p54u_fwlist[i].fw, &priv->udev->dev);
852 if (err) {
853 dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s "
854 "(%d)!\n", p54u_fwlist[i].fw, err);
856 err = request_firmware(&priv->fw, p54u_fwlist[i].fw_legacy,
857 &priv->udev->dev);
858 if (err)
859 return err;
862 err = p54_parse_firmware(dev, priv->fw);
863 if (err)
864 goto out;
866 if (priv->common.fw_interface != p54u_fwlist[i].intf) {
867 dev_err(&priv->udev->dev, "wrong firmware, please get "
868 "a firmware for \"%s\" and try again.\n",
869 p54u_fwlist[i].hw);
870 err = -EINVAL;
873 out:
874 if (err)
875 release_firmware(priv->fw);
877 return err;
880 static int p54u_open(struct ieee80211_hw *dev)
882 struct p54u_priv *priv = dev->priv;
883 int err;
885 err = p54u_init_urbs(dev);
886 if (err) {
887 return err;
890 priv->common.open = p54u_init_urbs;
892 return 0;
895 static void p54u_stop(struct ieee80211_hw *dev)
897 /* TODO: figure out how to reliably stop the 3887 and net2280 so
898 the hardware is still usable next time we want to start it.
899 until then, we just stop listening to the hardware.. */
900 p54u_free_urbs(dev);
903 static int __devinit p54u_probe(struct usb_interface *intf,
904 const struct usb_device_id *id)
906 struct usb_device *udev = interface_to_usbdev(intf);
907 struct ieee80211_hw *dev;
908 struct p54u_priv *priv;
909 int err;
910 unsigned int i, recognized_pipes;
912 dev = p54_init_common(sizeof(*priv));
914 if (!dev) {
915 dev_err(&udev->dev, "(p54usb) ieee80211 alloc failed\n");
916 return -ENOMEM;
919 priv = dev->priv;
920 priv->hw_type = P54U_INVALID_HW;
922 SET_IEEE80211_DEV(dev, &intf->dev);
923 usb_set_intfdata(intf, dev);
924 priv->udev = udev;
925 priv->intf = intf;
926 skb_queue_head_init(&priv->rx_queue);
927 init_usb_anchor(&priv->submitted);
929 usb_get_dev(udev);
931 /* really lazy and simple way of figuring out if we're a 3887 */
932 /* TODO: should just stick the identification in the device table */
933 i = intf->altsetting->desc.bNumEndpoints;
934 recognized_pipes = 0;
935 while (i--) {
936 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
937 case P54U_PIPE_DATA:
938 case P54U_PIPE_MGMT:
939 case P54U_PIPE_BRG:
940 case P54U_PIPE_DEV:
941 case P54U_PIPE_DATA | USB_DIR_IN:
942 case P54U_PIPE_MGMT | USB_DIR_IN:
943 case P54U_PIPE_BRG | USB_DIR_IN:
944 case P54U_PIPE_DEV | USB_DIR_IN:
945 case P54U_PIPE_INT | USB_DIR_IN:
946 recognized_pipes++;
949 priv->common.open = p54u_open;
950 priv->common.stop = p54u_stop;
951 if (recognized_pipes < P54U_PIPE_NUMBER) {
952 #ifdef CONFIG_PM
953 /* ISL3887 needs a full reset on resume */
954 udev->reset_resume = 1;
955 #endif /* CONFIG_PM */
956 err = p54u_device_reset(dev);
958 priv->hw_type = P54U_3887;
959 dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
960 priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
961 priv->common.tx = p54u_tx_lm87;
962 priv->upload_fw = p54u_upload_firmware_3887;
963 } else {
964 priv->hw_type = P54U_NET2280;
965 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
966 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
967 priv->common.tx = p54u_tx_net2280;
968 priv->upload_fw = p54u_upload_firmware_net2280;
970 err = p54u_load_firmware(dev);
971 if (err)
972 goto err_free_dev;
974 err = priv->upload_fw(dev);
975 if (err)
976 goto err_free_fw;
978 p54u_open(dev);
979 err = p54_read_eeprom(dev);
980 p54u_stop(dev);
981 if (err)
982 goto err_free_fw;
984 err = p54_register_common(dev, &udev->dev);
985 if (err)
986 goto err_free_fw;
988 return 0;
990 err_free_fw:
991 release_firmware(priv->fw);
993 err_free_dev:
994 p54_free_common(dev);
995 usb_set_intfdata(intf, NULL);
996 usb_put_dev(udev);
997 return err;
1000 static void __devexit p54u_disconnect(struct usb_interface *intf)
1002 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1003 struct p54u_priv *priv;
1005 if (!dev)
1006 return;
1008 p54_unregister_common(dev);
1010 priv = dev->priv;
1011 usb_put_dev(interface_to_usbdev(intf));
1012 release_firmware(priv->fw);
1013 p54_free_common(dev);
1016 static int p54u_pre_reset(struct usb_interface *intf)
1018 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1020 if (!dev)
1021 return -ENODEV;
1023 p54u_stop(dev);
1024 return 0;
1027 static int p54u_resume(struct usb_interface *intf)
1029 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1030 struct p54u_priv *priv;
1032 if (!dev)
1033 return -ENODEV;
1035 priv = dev->priv;
1036 if (unlikely(!(priv->upload_fw && priv->fw)))
1037 return 0;
1039 return priv->upload_fw(dev);
1042 static int p54u_post_reset(struct usb_interface *intf)
1044 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1045 struct p54u_priv *priv;
1046 int err;
1048 err = p54u_resume(intf);
1049 if (err)
1050 return err;
1052 /* reinitialize old device state */
1053 priv = dev->priv;
1054 if (priv->common.mode != NL80211_IFTYPE_UNSPECIFIED)
1055 ieee80211_restart_hw(dev);
1057 return 0;
1060 #ifdef CONFIG_PM
1062 static int p54u_suspend(struct usb_interface *intf, pm_message_t message)
1064 return p54u_pre_reset(intf);
1067 #endif /* CONFIG_PM */
1069 static struct usb_driver p54u_driver = {
1070 .name = "p54usb",
1071 .id_table = p54u_table,
1072 .probe = p54u_probe,
1073 .disconnect = p54u_disconnect,
1074 .pre_reset = p54u_pre_reset,
1075 .post_reset = p54u_post_reset,
1076 #ifdef CONFIG_PM
1077 .suspend = p54u_suspend,
1078 .resume = p54u_resume,
1079 .reset_resume = p54u_resume,
1080 #endif /* CONFIG_PM */
1081 .soft_unbind = 1,
1084 static int __init p54u_init(void)
1086 return usb_register(&p54u_driver);
1089 static void __exit p54u_exit(void)
1091 usb_deregister(&p54u_driver);
1094 module_init(p54u_init);
1095 module_exit(p54u_exit);