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 <linux/module.h>
24 #include <net/mac80211.h>
30 MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
31 MODULE_DESCRIPTION("Prism54 USB wireless driver");
32 MODULE_LICENSE("GPL");
33 MODULE_ALIAS("prism54usb");
34 MODULE_FIRMWARE("isl3886usb");
35 MODULE_FIRMWARE("isl3887usb");
40 * Always update our wiki's device list (located at:
41 * http://wireless.kernel.org/en/users/Drivers/p54/devices ),
42 * whenever you add a new device.
45 static struct usb_device_id p54u_table[] = {
46 /* Version 1 devices (pci chip + net2280) */
47 {USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */
48 {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */
49 {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
50 {USB_DEVICE(0x0675, 0x0530)}, /* DrayTek Vigor 530 */
51 {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */
52 {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */
53 {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */
54 {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */
55 {USB_DEVICE(0x083a, 0x4502)}, /* Siemens Gigaset USB Adapter */
56 {USB_DEVICE(0x083a, 0x5501)}, /* Phillips CPWUA054 */
57 {USB_DEVICE(0x0846, 0x4200)}, /* Netgear WG121 */
58 {USB_DEVICE(0x0846, 0x4210)}, /* Netgear WG121 the second ? */
59 {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
60 {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
61 {USB_DEVICE(0x0bf8, 0x1007)}, /* Fujitsu E-5400 USB */
62 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
63 {USB_DEVICE(0x0db0, 0x6826)}, /* MSI UB54G (MS-6826) */
64 {USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */
65 {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
66 {USB_DEVICE(0x1435, 0x0210)}, /* Inventel UR054G */
67 {USB_DEVICE(0x15a9, 0x0002)}, /* Gemtek WUBI-100GW 802.11g */
68 {USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */
69 {USB_DEVICE(0x182d, 0x096b)}, /* Sitecom WL-107 */
70 {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
71 {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
72 {USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
73 {USB_DEVICE(0x2001, 0x3703)}, /* DLink DWL-G122 */
74 {USB_DEVICE(0x2001, 0x3762)}, /* Conceptronic C54U */
75 {USB_DEVICE(0x5041, 0x2234)}, /* Linksys WUSB54G */
76 {USB_DEVICE(0x5041, 0x2235)}, /* Linksys WUSB54G Portable */
78 /* Version 2 devices (3887) */
79 {USB_DEVICE(0x0471, 0x1230)}, /* Philips CPWUA054/00 */
80 {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */
81 {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */
82 {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */
83 {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */
84 {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */
85 {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
86 {USB_DEVICE(0x07aa, 0x0020)}, /* Corega WLUSB2GTST USB */
87 {USB_DEVICE(0x0803, 0x4310)}, /* Zoom 4410a */
88 {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
89 {USB_DEVICE(0x083a, 0x4531)}, /* T-Com Sinus 154 data II */
90 {USB_DEVICE(0x083a, 0xc501)}, /* Zoom Wireless-G 4410 */
91 {USB_DEVICE(0x083a, 0xf503)}, /* Accton FD7050E ver 1010ec */
92 {USB_DEVICE(0x0846, 0x4240)}, /* Netgear WG111 (v2) */
93 {USB_DEVICE(0x0915, 0x2000)}, /* Cohiba Proto board */
94 {USB_DEVICE(0x0915, 0x2002)}, /* Cohiba Proto board */
95 {USB_DEVICE(0x0baf, 0x0118)}, /* U.S. Robotics U5 802.11g Adapter*/
96 {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/
97 /* {USB_DEVICE(0x0cde, 0x0006)}, * Medion MD40900 already listed above,
98 * just noting it here for clarity */
99 {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */
100 {USB_DEVICE(0x0cde, 0x0015)}, /* Zcomax XG-705A */
101 {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */
102 {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */
103 {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */
104 {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */
105 {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */
106 {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */
107 {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
108 /* {USB_DEVICE(0x15a9, 0x0002)}, * Also SparkLAN WL-682 with 3887 */
109 {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
110 {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */
111 {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
112 {USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */
113 {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
114 {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
115 {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
119 MODULE_DEVICE_TABLE(usb, p54u_table);
121 static const struct {
123 enum p54u_hw_type type;
125 const char *fw_legacy;
127 } p54u_fwlist[__NUM_P54U_HWTYPES] = {
129 .type = P54U_NET2280,
132 .fw_legacy = "isl3890usb",
133 .hw = "ISL3886 + net2280",
139 .fw_legacy = "isl3887usb_bare",
144 static void p54u_rx_cb(struct urb *urb)
146 struct sk_buff *skb = (struct sk_buff *) urb->context;
147 struct p54u_rx_info *info = (struct p54u_rx_info *)skb->cb;
148 struct ieee80211_hw *dev = info->dev;
149 struct p54u_priv *priv = dev->priv;
151 skb_unlink(skb, &priv->rx_queue);
153 if (unlikely(urb->status)) {
154 dev_kfree_skb_irq(skb);
158 skb_put(skb, urb->actual_length);
160 if (priv->hw_type == P54U_NET2280)
161 skb_pull(skb, priv->common.tx_hdr_len);
162 if (priv->common.fw_interface == FW_LM87) {
167 if (p54_rx(dev, skb)) {
168 skb = dev_alloc_skb(priv->common.rx_mtu + 32);
169 if (unlikely(!skb)) {
170 /* TODO check rx queue length and refill *somewhere* */
174 info = (struct p54u_rx_info *) skb->cb;
177 urb->transfer_buffer = skb_tail_pointer(skb);
180 if (priv->hw_type == P54U_NET2280)
181 skb_push(skb, priv->common.tx_hdr_len);
182 if (priv->common.fw_interface == FW_LM87) {
186 skb_reset_tail_pointer(skb);
188 urb->transfer_buffer = skb_tail_pointer(skb);
190 skb_queue_tail(&priv->rx_queue, skb);
191 usb_anchor_urb(urb, &priv->submitted);
192 if (usb_submit_urb(urb, GFP_ATOMIC)) {
193 skb_unlink(skb, &priv->rx_queue);
194 usb_unanchor_urb(urb);
195 dev_kfree_skb_irq(skb);
199 static void p54u_tx_cb(struct urb *urb)
201 struct sk_buff *skb = urb->context;
202 struct ieee80211_hw *dev =
203 usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
205 p54_free_skb(dev, skb);
208 static void p54u_tx_dummy_cb(struct urb *urb) { }
210 static void p54u_free_urbs(struct ieee80211_hw *dev)
212 struct p54u_priv *priv = dev->priv;
213 usb_kill_anchored_urbs(&priv->submitted);
216 static int p54u_init_urbs(struct ieee80211_hw *dev)
218 struct p54u_priv *priv = dev->priv;
219 struct urb *entry = NULL;
221 struct p54u_rx_info *info;
224 while (skb_queue_len(&priv->rx_queue) < 32) {
225 skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
230 entry = usb_alloc_urb(0, GFP_KERNEL);
236 usb_fill_bulk_urb(entry, priv->udev,
237 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
238 skb_tail_pointer(skb),
239 priv->common.rx_mtu + 32, p54u_rx_cb, skb);
240 info = (struct p54u_rx_info *) skb->cb;
243 skb_queue_tail(&priv->rx_queue, skb);
245 usb_anchor_urb(entry, &priv->submitted);
246 ret = usb_submit_urb(entry, GFP_KERNEL);
248 skb_unlink(skb, &priv->rx_queue);
249 usb_unanchor_urb(entry);
265 static __le32 p54u_lm87_chksum(const __le32 *data, size_t length)
271 chk ^= le32_to_cpu(*data++);
272 chk = (chk >> 5) ^ (chk << 3);
275 return cpu_to_le32(chk);
278 static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
280 struct p54u_priv *priv = dev->priv;
281 struct urb *data_urb;
282 struct lm87_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
284 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
286 p54_free_skb(dev, skb);
290 hdr->chksum = p54u_lm87_chksum((__le32 *)skb->data, skb->len);
291 hdr->device_addr = ((struct p54_hdr *)skb->data)->req_id;
293 usb_fill_bulk_urb(data_urb, priv->udev,
294 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
295 hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
296 p54u_tx_cb : p54u_tx_dummy_cb, skb);
297 data_urb->transfer_flags |= URB_ZERO_PACKET;
299 usb_anchor_urb(data_urb, &priv->submitted);
300 if (usb_submit_urb(data_urb, GFP_ATOMIC)) {
301 usb_unanchor_urb(data_urb);
302 p54_free_skb(dev, skb);
304 usb_free_urb(data_urb);
307 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
309 struct p54u_priv *priv = dev->priv;
310 struct urb *int_urb = NULL, *data_urb = NULL;
311 struct net2280_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
312 struct net2280_reg_write *reg = NULL;
315 reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
319 int_urb = usb_alloc_urb(0, GFP_ATOMIC);
323 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
327 reg->port = cpu_to_le16(NET2280_DEV_U32);
328 reg->addr = cpu_to_le32(P54U_DEV_BASE);
329 reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
331 memset(hdr, 0, sizeof(*hdr));
332 hdr->len = cpu_to_le16(skb->len);
333 hdr->device_addr = ((struct p54_hdr *) skb->data)->req_id;
335 usb_fill_bulk_urb(int_urb, priv->udev,
336 usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
337 p54u_tx_dummy_cb, dev);
340 * URB_FREE_BUFFER triggers a code path in the USB subsystem that will
341 * free what is inside the transfer_buffer after the last reference to
342 * the int_urb is dropped.
344 int_urb->transfer_flags |= URB_FREE_BUFFER | URB_ZERO_PACKET;
347 usb_fill_bulk_urb(data_urb, priv->udev,
348 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
349 hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
350 p54u_tx_cb : p54u_tx_dummy_cb, skb);
351 data_urb->transfer_flags |= URB_ZERO_PACKET;
353 usb_anchor_urb(int_urb, &priv->submitted);
354 err = usb_submit_urb(int_urb, GFP_ATOMIC);
356 usb_unanchor_urb(int_urb);
360 usb_anchor_urb(data_urb, &priv->submitted);
361 err = usb_submit_urb(data_urb, GFP_ATOMIC);
363 usb_unanchor_urb(data_urb);
367 usb_free_urb(int_urb);
368 usb_free_urb(data_urb);
372 p54_free_skb(dev, skb);
376 static int p54u_write(struct p54u_priv *priv,
377 struct net2280_reg_write *buf,
378 enum net2280_op_type type,
379 __le32 addr, __le32 val)
385 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
387 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
389 buf->port = cpu_to_le16(type);
393 return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
396 static int p54u_read(struct p54u_priv *priv, void *buf,
397 enum net2280_op_type type,
398 __le32 addr, __le32 *val)
400 struct net2280_reg_read *read = buf;
410 read->port = cpu_to_le16(type);
413 err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
414 read, sizeof(*read), &alen, 1000);
418 err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
419 reg, sizeof(*reg), &alen, 1000);
427 static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
428 void *data, size_t len)
431 return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
432 data, len, &alen, 2000);
435 static int p54u_device_reset(struct ieee80211_hw *dev)
437 struct p54u_priv *priv = dev->priv;
438 int ret, lock = (priv->intf->condition != USB_INTERFACE_BINDING);
441 ret = usb_lock_device_for_reset(priv->udev, priv->intf);
443 dev_err(&priv->udev->dev, "(p54usb) unable to lock "
444 "device for reset (%d)!\n", ret);
449 ret = usb_reset_device(priv->udev);
451 usb_unlock_device(priv->udev);
454 dev_err(&priv->udev->dev, "(p54usb) unable to reset "
455 "device (%d)!\n", ret);
460 static const char p54u_romboot_3887[] = "~~~~";
461 static int p54u_firmware_reset_3887(struct ieee80211_hw *dev)
463 struct p54u_priv *priv = dev->priv;
467 buf = kmemdup(p54u_romboot_3887, 4, GFP_KERNEL);
470 ret = p54u_bulk_msg(priv, P54U_PIPE_DATA,
474 dev_err(&priv->udev->dev, "(p54usb) unable to jump to "
475 "boot ROM (%d)!\n", ret);
480 static const char p54u_firmware_upload_3887[] = "<\r";
481 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
483 struct p54u_priv *priv = dev->priv;
488 unsigned int left, remains, block_size;
489 struct x2_header *hdr;
490 unsigned long timeout;
492 err = p54u_firmware_reset_3887(dev);
496 tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
498 dev_err(&priv->udev->dev, "(p54usb) cannot allocate firmware"
503 left = block_size = min((size_t)P54U_FW_BLOCK, priv->fw->size);
504 strcpy(buf, p54u_firmware_upload_3887);
505 left -= strlen(p54u_firmware_upload_3887);
506 tmp += strlen(p54u_firmware_upload_3887);
508 data = priv->fw->data;
509 remains = priv->fw->size;
511 hdr = (struct x2_header *)(buf + strlen(p54u_firmware_upload_3887));
512 memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
513 hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
514 hdr->fw_length = cpu_to_le32(priv->fw->size);
515 hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
517 left -= sizeof(*hdr);
545 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
547 dev_err(&priv->udev->dev, "(p54usb) firmware "
549 goto err_upload_failed;
553 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
556 *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, priv->fw->data,
558 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
560 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
561 goto err_upload_failed;
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 > 2 && !memcmp(buf, "OK", 2))
569 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
574 if (time_after(jiffies, timeout)) {
575 dev_err(&priv->udev->dev, "(p54usb) firmware boot "
582 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
583 goto err_upload_failed;
588 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
590 dev_err(&priv->udev->dev, "(p54usb) firmware boot failed!\n");
591 goto err_upload_failed;
594 timeout = jiffies + msecs_to_jiffies(1000);
595 while (!(err = usb_bulk_msg(priv->udev,
596 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
597 if (alen > 0 && buf[0] == 'g')
600 if (time_after(jiffies, timeout)) {
606 goto err_upload_failed;
613 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
615 struct p54u_priv *priv = dev->priv;
616 const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
620 unsigned int remains, offset;
623 buf = kmalloc(512, GFP_KERNEL);
625 dev_err(&priv->udev->dev, "(p54usb) firmware buffer "
630 #define P54U_WRITE(type, addr, data) \
632 err = p54u_write(priv, buf, type,\
633 cpu_to_le32((u32)(unsigned long)addr), data);\
638 #define P54U_READ(type, addr) \
640 err = p54u_read(priv, buf, type,\
641 cpu_to_le32((u32)(unsigned long)addr), ®);\
646 /* power down net2280 bridge */
647 P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
648 reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
649 reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
650 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
654 /* power up bridge */
655 reg |= cpu_to_le32(P54U_BRG_POWER_UP);
656 reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
657 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
661 P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
662 cpu_to_le32(NET2280_CLK_30Mhz |
664 NET2280_PCI_SOFT_RESET));
668 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
669 cpu_to_le32(PCI_COMMAND_MEMORY |
670 PCI_COMMAND_MASTER));
672 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
673 cpu_to_le32(NET2280_BASE));
675 P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
676 reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
677 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
679 // TODO: we really need this?
680 P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
682 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
683 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
684 P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
685 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
687 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
688 cpu_to_le32(NET2280_BASE2));
690 /* finally done setting up the bridge */
692 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
693 cpu_to_le32(PCI_COMMAND_MEMORY |
694 PCI_COMMAND_MASTER));
696 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
697 P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
698 cpu_to_le32(P54U_DEV_BASE));
700 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
701 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
702 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
705 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
707 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
708 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
709 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
710 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
711 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
715 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
716 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
720 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
721 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
725 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
726 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
728 /* finally, we can upload firmware now! */
729 remains = priv->fw->size;
730 data = priv->fw->data;
731 offset = ISL38XX_DEV_FIRMWARE_ADDR;
734 unsigned int block_len = min(remains, (unsigned int)512);
735 memcpy(buf, data, block_len);
737 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
739 dev_err(&priv->udev->dev, "(p54usb) firmware block "
744 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
745 cpu_to_le32(0xc0000f00));
747 P54U_WRITE(NET2280_DEV_U32,
748 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
749 P54U_WRITE(NET2280_DEV_U32,
750 0x0020 | (unsigned long)&devreg->direct_mem_win,
753 P54U_WRITE(NET2280_DEV_U32,
754 0x0024 | (unsigned long)&devreg->direct_mem_win,
755 cpu_to_le32(block_len));
756 P54U_WRITE(NET2280_DEV_U32,
757 0x0028 | (unsigned long)&devreg->direct_mem_win,
758 cpu_to_le32(offset));
760 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
761 cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
762 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
763 cpu_to_le32(block_len >> 2));
764 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
765 cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
769 P54U_READ(NET2280_DEV_U32,
770 0x002C | (unsigned long)&devreg->direct_mem_win);
771 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
772 !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
773 dev_err(&priv->udev->dev, "(p54usb) firmware DMA "
774 "transfer failed\n");
778 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
779 cpu_to_le32(NET2280_FIFO_FLUSH));
781 remains -= block_len;
787 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
788 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
789 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
790 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
791 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
795 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
796 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
798 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
799 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
803 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
804 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
806 /* start up the firmware */
807 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
808 cpu_to_le32(ISL38XX_INT_IDENT_INIT));
810 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
811 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
813 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
814 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
815 NET2280_USB_INTERRUPT_ENABLE));
817 P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
818 cpu_to_le32(ISL38XX_DEV_INT_RESET));
820 err = usb_interrupt_msg(priv->udev,
821 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
822 buf, sizeof(__le32), &alen, 1000);
823 if (err || alen != sizeof(__le32))
826 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
827 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
829 if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
832 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
833 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
834 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
844 static int p54u_load_firmware(struct ieee80211_hw *dev)
846 struct p54u_priv *priv = dev->priv;
849 BUILD_BUG_ON(ARRAY_SIZE(p54u_fwlist) != __NUM_P54U_HWTYPES);
851 for (i = 0; i < __NUM_P54U_HWTYPES; i++)
852 if (p54u_fwlist[i].type == priv->hw_type)
855 if (i == __NUM_P54U_HWTYPES)
858 err = request_firmware(&priv->fw, p54u_fwlist[i].fw, &priv->udev->dev);
860 dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s "
861 "(%d)!\n", p54u_fwlist[i].fw, err);
863 err = request_firmware(&priv->fw, p54u_fwlist[i].fw_legacy,
869 err = p54_parse_firmware(dev, priv->fw);
873 if (priv->common.fw_interface != p54u_fwlist[i].intf) {
874 dev_err(&priv->udev->dev, "wrong firmware, please get "
875 "a firmware for \"%s\" and try again.\n",
882 release_firmware(priv->fw);
887 static int p54u_open(struct ieee80211_hw *dev)
889 struct p54u_priv *priv = dev->priv;
892 err = p54u_init_urbs(dev);
897 priv->common.open = p54u_init_urbs;
902 static void p54u_stop(struct ieee80211_hw *dev)
904 /* TODO: figure out how to reliably stop the 3887 and net2280 so
905 the hardware is still usable next time we want to start it.
906 until then, we just stop listening to the hardware.. */
910 static int __devinit p54u_probe(struct usb_interface *intf,
911 const struct usb_device_id *id)
913 struct usb_device *udev = interface_to_usbdev(intf);
914 struct ieee80211_hw *dev;
915 struct p54u_priv *priv;
917 unsigned int i, recognized_pipes;
919 dev = p54_init_common(sizeof(*priv));
922 dev_err(&udev->dev, "(p54usb) ieee80211 alloc failed\n");
927 priv->hw_type = P54U_INVALID_HW;
929 SET_IEEE80211_DEV(dev, &intf->dev);
930 usb_set_intfdata(intf, dev);
933 skb_queue_head_init(&priv->rx_queue);
934 init_usb_anchor(&priv->submitted);
938 /* really lazy and simple way of figuring out if we're a 3887 */
939 /* TODO: should just stick the identification in the device table */
940 i = intf->altsetting->desc.bNumEndpoints;
941 recognized_pipes = 0;
943 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
948 case P54U_PIPE_DATA | USB_DIR_IN:
949 case P54U_PIPE_MGMT | USB_DIR_IN:
950 case P54U_PIPE_BRG | USB_DIR_IN:
951 case P54U_PIPE_DEV | USB_DIR_IN:
952 case P54U_PIPE_INT | USB_DIR_IN:
956 priv->common.open = p54u_open;
957 priv->common.stop = p54u_stop;
958 if (recognized_pipes < P54U_PIPE_NUMBER) {
960 /* ISL3887 needs a full reset on resume */
961 udev->reset_resume = 1;
962 #endif /* CONFIG_PM */
963 err = p54u_device_reset(dev);
965 priv->hw_type = P54U_3887;
966 dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
967 priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
968 priv->common.tx = p54u_tx_lm87;
969 priv->upload_fw = p54u_upload_firmware_3887;
971 priv->hw_type = P54U_NET2280;
972 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
973 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
974 priv->common.tx = p54u_tx_net2280;
975 priv->upload_fw = p54u_upload_firmware_net2280;
977 err = p54u_load_firmware(dev);
981 err = priv->upload_fw(dev);
986 err = p54_read_eeprom(dev);
991 err = p54_register_common(dev, &udev->dev);
998 release_firmware(priv->fw);
1001 p54_free_common(dev);
1002 usb_set_intfdata(intf, NULL);
1007 static void __devexit p54u_disconnect(struct usb_interface *intf)
1009 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1010 struct p54u_priv *priv;
1015 p54_unregister_common(dev);
1018 usb_put_dev(interface_to_usbdev(intf));
1019 release_firmware(priv->fw);
1020 p54_free_common(dev);
1023 static int p54u_pre_reset(struct usb_interface *intf)
1025 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1034 static int p54u_resume(struct usb_interface *intf)
1036 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1037 struct p54u_priv *priv;
1043 if (unlikely(!(priv->upload_fw && priv->fw)))
1046 return priv->upload_fw(dev);
1049 static int p54u_post_reset(struct usb_interface *intf)
1051 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1052 struct p54u_priv *priv;
1055 err = p54u_resume(intf);
1059 /* reinitialize old device state */
1061 if (priv->common.mode != NL80211_IFTYPE_UNSPECIFIED)
1062 ieee80211_restart_hw(dev);
1069 static int p54u_suspend(struct usb_interface *intf, pm_message_t message)
1071 return p54u_pre_reset(intf);
1074 #endif /* CONFIG_PM */
1076 static struct usb_driver p54u_driver = {
1078 .id_table = p54u_table,
1079 .probe = p54u_probe,
1080 .disconnect = p54u_disconnect,
1081 .pre_reset = p54u_pre_reset,
1082 .post_reset = p54u_post_reset,
1084 .suspend = p54u_suspend,
1085 .resume = p54u_resume,
1086 .reset_resume = p54u_resume,
1087 #endif /* CONFIG_PM */
1091 static int __init p54u_init(void)
1093 return usb_register(&p54u_driver);
1096 static void __exit p54u_exit(void)
1098 usb_deregister(&p54u_driver);
1101 module_init(p54u_init);
1102 module_exit(p54u_exit);