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");
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[] = {
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(0x0675, 0x0530)}, /* DrayTek Vigor 530 */
50 {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */
51 {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */
52 {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */
53 {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */
54 {USB_DEVICE(0x083a, 0x4502)}, /* Siemens Gigaset USB Adapter */
55 {USB_DEVICE(0x083a, 0x5501)}, /* Phillips CPWUA054 */
56 {USB_DEVICE(0x0846, 0x4200)}, /* Netgear WG121 */
57 {USB_DEVICE(0x0846, 0x4210)}, /* Netgear WG121 the second ? */
58 {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
59 {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
60 {USB_DEVICE(0x0bf8, 0x1007)}, /* Fujitsu E-5400 USB */
61 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
62 {USB_DEVICE(0x0db0, 0x6826)}, /* MSI UB54G (MS-6826) */
63 {USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */
64 {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
65 {USB_DEVICE(0x1435, 0x0210)}, /* Inventel UR054G */
66 {USB_DEVICE(0x15a9, 0x0002)}, /* Gemtek WUBI-100GW 802.11g */
67 {USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */
68 {USB_DEVICE(0x182d, 0x096b)}, /* Sitecom WL-107 */
69 {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
70 {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
71 {USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
72 {USB_DEVICE(0x2001, 0x3703)}, /* DLink DWL-G122 */
73 {USB_DEVICE(0x2001, 0x3762)}, /* Conceptronic C54U */
74 {USB_DEVICE(0x5041, 0x2234)}, /* Linksys WUSB54G */
75 {USB_DEVICE(0x5041, 0x2235)}, /* Linksys WUSB54G Portable */
77 /* Version 2 devices (3887) */
78 {USB_DEVICE(0x0471, 0x1230)}, /* Philips CPWUA054/00 */
79 {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */
80 {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */
81 {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */
82 {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */
83 {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */
84 {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
85 {USB_DEVICE(0x07aa, 0x0020)}, /* Corega WLUSB2GTST USB */
86 {USB_DEVICE(0x0803, 0x4310)}, /* Zoom 4410a */
87 {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
88 {USB_DEVICE(0x083a, 0x4531)}, /* T-Com Sinus 154 data II */
89 {USB_DEVICE(0x083a, 0xc501)}, /* Zoom Wireless-G 4410 */
90 {USB_DEVICE(0x083a, 0xf503)}, /* Accton FD7050E ver 1010ec */
91 {USB_DEVICE(0x0846, 0x4240)}, /* Netgear WG111 (v2) */
92 {USB_DEVICE(0x0915, 0x2000)}, /* Cohiba Proto board */
93 {USB_DEVICE(0x0915, 0x2002)}, /* Cohiba Proto board */
94 {USB_DEVICE(0x0baf, 0x0118)}, /* U.S. Robotics U5 802.11g Adapter*/
95 {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/
96 /* {USB_DEVICE(0x0cde, 0x0006)}, * Medion MD40900 already listed above,
97 * just noting it here for clarity */
98 {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */
99 {USB_DEVICE(0x0cde, 0x0015)}, /* Zcomax XG-705A */
100 {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */
101 {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */
102 {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */
103 {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */
104 {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */
105 {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */
106 {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
107 /* {USB_DEVICE(0x15a9, 0x0002)}, * Also SparkLAN WL-682 with 3887 */
108 {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
109 {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */
110 {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
111 {USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */
112 {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
113 {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
114 {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
118 MODULE_DEVICE_TABLE(usb, p54u_table);
120 static const struct {
122 enum p54u_hw_type type;
124 const char *fw_legacy;
126 } p54u_fwlist[__NUM_P54U_HWTYPES] = {
128 .type = P54U_NET2280,
130 .fw = "/*(DEBLOBBED)*/",
131 .fw_legacy = "/*(DEBLOBBED)*/",
132 .hw = "ISL3886 + net2280",
137 .fw = "/*(DEBLOBBED)*/",
138 .fw_legacy = "/*(DEBLOBBED)*/",
143 static void p54u_rx_cb(struct urb *urb)
145 struct sk_buff *skb = (struct sk_buff *) urb->context;
146 struct p54u_rx_info *info = (struct p54u_rx_info *)skb->cb;
147 struct ieee80211_hw *dev = info->dev;
148 struct p54u_priv *priv = dev->priv;
150 skb_unlink(skb, &priv->rx_queue);
152 if (unlikely(urb->status)) {
153 dev_kfree_skb_irq(skb);
157 skb_put(skb, urb->actual_length);
159 if (priv->hw_type == P54U_NET2280)
160 skb_pull(skb, priv->common.tx_hdr_len);
161 if (priv->common.fw_interface == FW_LM87) {
166 if (p54_rx(dev, skb)) {
167 skb = dev_alloc_skb(priv->common.rx_mtu + 32);
168 if (unlikely(!skb)) {
169 /* TODO check rx queue length and refill *somewhere* */
173 info = (struct p54u_rx_info *) skb->cb;
176 urb->transfer_buffer = skb_tail_pointer(skb);
179 if (priv->hw_type == P54U_NET2280)
180 skb_push(skb, priv->common.tx_hdr_len);
181 if (priv->common.fw_interface == FW_LM87) {
185 skb_reset_tail_pointer(skb);
187 urb->transfer_buffer = skb_tail_pointer(skb);
189 skb_queue_tail(&priv->rx_queue, skb);
190 usb_anchor_urb(urb, &priv->submitted);
191 if (usb_submit_urb(urb, GFP_ATOMIC)) {
192 skb_unlink(skb, &priv->rx_queue);
193 usb_unanchor_urb(urb);
194 dev_kfree_skb_irq(skb);
198 static void p54u_tx_cb(struct urb *urb)
200 struct sk_buff *skb = urb->context;
201 struct ieee80211_hw *dev =
202 usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
204 p54_free_skb(dev, skb);
207 static void p54u_tx_dummy_cb(struct urb *urb) { }
209 static void p54u_free_urbs(struct ieee80211_hw *dev)
211 struct p54u_priv *priv = dev->priv;
212 usb_kill_anchored_urbs(&priv->submitted);
215 static int p54u_init_urbs(struct ieee80211_hw *dev)
217 struct p54u_priv *priv = dev->priv;
218 struct urb *entry = NULL;
220 struct p54u_rx_info *info;
223 while (skb_queue_len(&priv->rx_queue) < 32) {
224 skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
229 entry = usb_alloc_urb(0, GFP_KERNEL);
235 usb_fill_bulk_urb(entry, priv->udev,
236 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
237 skb_tail_pointer(skb),
238 priv->common.rx_mtu + 32, p54u_rx_cb, skb);
239 info = (struct p54u_rx_info *) skb->cb;
242 skb_queue_tail(&priv->rx_queue, skb);
244 usb_anchor_urb(entry, &priv->submitted);
245 ret = usb_submit_urb(entry, GFP_KERNEL);
247 skb_unlink(skb, &priv->rx_queue);
248 usb_unanchor_urb(entry);
264 static __le32 p54u_lm87_chksum(const __le32 *data, size_t length)
270 chk ^= le32_to_cpu(*data++);
271 chk = (chk >> 5) ^ (chk << 3);
274 return cpu_to_le32(chk);
277 static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
279 struct p54u_priv *priv = dev->priv;
280 struct urb *data_urb;
281 struct lm87_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
283 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
285 p54_free_skb(dev, skb);
289 hdr->chksum = p54u_lm87_chksum((__le32 *)skb->data, skb->len);
290 hdr->device_addr = ((struct p54_hdr *)skb->data)->req_id;
292 usb_fill_bulk_urb(data_urb, priv->udev,
293 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
294 hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
295 p54u_tx_cb : p54u_tx_dummy_cb, skb);
296 data_urb->transfer_flags |= URB_ZERO_PACKET;
298 usb_anchor_urb(data_urb, &priv->submitted);
299 if (usb_submit_urb(data_urb, GFP_ATOMIC)) {
300 usb_unanchor_urb(data_urb);
301 p54_free_skb(dev, skb);
303 usb_free_urb(data_urb);
306 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
308 struct p54u_priv *priv = dev->priv;
309 struct urb *int_urb = NULL, *data_urb = NULL;
310 struct net2280_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
311 struct net2280_reg_write *reg = NULL;
314 reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
318 int_urb = usb_alloc_urb(0, GFP_ATOMIC);
322 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
326 reg->port = cpu_to_le16(NET2280_DEV_U32);
327 reg->addr = cpu_to_le32(P54U_DEV_BASE);
328 reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
330 memset(hdr, 0, sizeof(*hdr));
331 hdr->len = cpu_to_le16(skb->len);
332 hdr->device_addr = ((struct p54_hdr *) skb->data)->req_id;
334 usb_fill_bulk_urb(int_urb, priv->udev,
335 usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
336 p54u_tx_dummy_cb, dev);
339 * URB_FREE_BUFFER triggers a code path in the USB subsystem that will
340 * free what is inside the transfer_buffer after the last reference to
341 * the int_urb is dropped.
343 int_urb->transfer_flags |= URB_FREE_BUFFER | URB_ZERO_PACKET;
346 usb_fill_bulk_urb(data_urb, priv->udev,
347 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
348 hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
349 p54u_tx_cb : p54u_tx_dummy_cb, skb);
350 data_urb->transfer_flags |= URB_ZERO_PACKET;
352 usb_anchor_urb(int_urb, &priv->submitted);
353 err = usb_submit_urb(int_urb, GFP_ATOMIC);
355 usb_unanchor_urb(int_urb);
359 usb_anchor_urb(data_urb, &priv->submitted);
360 err = usb_submit_urb(data_urb, GFP_ATOMIC);
362 usb_unanchor_urb(data_urb);
366 usb_free_urb(int_urb);
367 usb_free_urb(data_urb);
371 p54_free_skb(dev, skb);
375 static int p54u_write(struct p54u_priv *priv,
376 struct net2280_reg_write *buf,
377 enum net2280_op_type type,
378 __le32 addr, __le32 val)
384 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
386 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
388 buf->port = cpu_to_le16(type);
392 return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
395 static int p54u_read(struct p54u_priv *priv, void *buf,
396 enum net2280_op_type type,
397 __le32 addr, __le32 *val)
399 struct net2280_reg_read *read = buf;
409 read->port = cpu_to_le16(type);
412 err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
413 read, sizeof(*read), &alen, 1000);
417 err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
418 reg, sizeof(*reg), &alen, 1000);
426 static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
427 void *data, size_t len)
430 return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
431 data, len, &alen, 2000);
434 static int p54u_device_reset(struct ieee80211_hw *dev)
436 struct p54u_priv *priv = dev->priv;
437 int ret, lock = (priv->intf->condition != USB_INTERFACE_BINDING);
440 ret = usb_lock_device_for_reset(priv->udev, priv->intf);
442 dev_err(&priv->udev->dev, "(p54usb) unable to lock "
443 "device for reset (%d)!\n", ret);
448 ret = usb_reset_device(priv->udev);
450 usb_unlock_device(priv->udev);
453 dev_err(&priv->udev->dev, "(p54usb) unable to reset "
454 "device (%d)!\n", ret);
459 static const char p54u_romboot_3887[] = "~~~~";
460 static int p54u_firmware_reset_3887(struct ieee80211_hw *dev)
462 struct p54u_priv *priv = dev->priv;
466 buf = kmemdup(p54u_romboot_3887, 4, GFP_KERNEL);
469 ret = p54u_bulk_msg(priv, P54U_PIPE_DATA,
473 dev_err(&priv->udev->dev, "(p54usb) unable to jump to "
474 "boot ROM (%d)!\n", ret);
479 static const char p54u_firmware_upload_3887[] = "<\r";
480 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
482 struct p54u_priv *priv = dev->priv;
487 unsigned int left, remains, block_size;
488 struct x2_header *hdr;
489 unsigned long timeout;
491 err = p54u_firmware_reset_3887(dev);
495 tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
497 dev_err(&priv->udev->dev, "(p54usb) cannot allocate firmware"
502 left = block_size = min((size_t)P54U_FW_BLOCK, priv->fw->size);
503 strcpy(buf, p54u_firmware_upload_3887);
504 left -= strlen(p54u_firmware_upload_3887);
505 tmp += strlen(p54u_firmware_upload_3887);
507 data = priv->fw->data;
508 remains = priv->fw->size;
510 hdr = (struct x2_header *)(buf + strlen(p54u_firmware_upload_3887));
511 memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
512 hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
513 hdr->fw_length = cpu_to_le32(priv->fw->size);
514 hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
516 left -= sizeof(*hdr);
544 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
546 dev_err(&priv->udev->dev, "(p54usb) firmware "
548 goto err_upload_failed;
552 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
555 *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, priv->fw->data,
557 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
559 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
560 goto err_upload_failed;
562 timeout = jiffies + msecs_to_jiffies(1000);
563 while (!(err = usb_bulk_msg(priv->udev,
564 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
565 if (alen > 2 && !memcmp(buf, "OK", 2))
568 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
573 if (time_after(jiffies, timeout)) {
574 dev_err(&priv->udev->dev, "(p54usb) firmware boot "
581 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
582 goto err_upload_failed;
587 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
589 dev_err(&priv->udev->dev, "(p54usb) firmware boot failed!\n");
590 goto err_upload_failed;
593 timeout = jiffies + msecs_to_jiffies(1000);
594 while (!(err = usb_bulk_msg(priv->udev,
595 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
596 if (alen > 0 && buf[0] == 'g')
599 if (time_after(jiffies, timeout)) {
605 goto err_upload_failed;
612 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
614 struct p54u_priv *priv = dev->priv;
615 const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
619 unsigned int remains, offset;
622 buf = kmalloc(512, GFP_KERNEL);
624 dev_err(&priv->udev->dev, "(p54usb) firmware buffer "
629 #define P54U_WRITE(type, addr, data) \
631 err = p54u_write(priv, buf, type,\
632 cpu_to_le32((u32)(unsigned long)addr), data);\
637 #define P54U_READ(type, addr) \
639 err = p54u_read(priv, buf, type,\
640 cpu_to_le32((u32)(unsigned long)addr), ®);\
645 /* power down net2280 bridge */
646 P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
647 reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
648 reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
649 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
653 /* power up bridge */
654 reg |= cpu_to_le32(P54U_BRG_POWER_UP);
655 reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
656 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
660 P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
661 cpu_to_le32(NET2280_CLK_30Mhz |
663 NET2280_PCI_SOFT_RESET));
667 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
668 cpu_to_le32(PCI_COMMAND_MEMORY |
669 PCI_COMMAND_MASTER));
671 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
672 cpu_to_le32(NET2280_BASE));
674 P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
675 reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
676 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
678 // TODO: we really need this?
679 P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
681 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
682 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
683 P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
684 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
686 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
687 cpu_to_le32(NET2280_BASE2));
689 /* finally done setting up the bridge */
691 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
692 cpu_to_le32(PCI_COMMAND_MEMORY |
693 PCI_COMMAND_MASTER));
695 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
696 P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
697 cpu_to_le32(P54U_DEV_BASE));
699 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
700 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
701 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
704 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
706 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
707 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
708 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
709 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
710 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
714 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
715 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
719 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
720 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
724 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
725 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
727 /* finally, we can upload firmware now! */
728 remains = priv->fw->size;
729 data = priv->fw->data;
730 offset = ISL38XX_DEV_FIRMWARE_ADDR;
733 unsigned int block_len = min(remains, (unsigned int)512);
734 memcpy(buf, data, block_len);
736 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
738 dev_err(&priv->udev->dev, "(p54usb) firmware block "
743 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
744 cpu_to_le32(0xc0000f00));
746 P54U_WRITE(NET2280_DEV_U32,
747 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
748 P54U_WRITE(NET2280_DEV_U32,
749 0x0020 | (unsigned long)&devreg->direct_mem_win,
752 P54U_WRITE(NET2280_DEV_U32,
753 0x0024 | (unsigned long)&devreg->direct_mem_win,
754 cpu_to_le32(block_len));
755 P54U_WRITE(NET2280_DEV_U32,
756 0x0028 | (unsigned long)&devreg->direct_mem_win,
757 cpu_to_le32(offset));
759 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
760 cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
761 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
762 cpu_to_le32(block_len >> 2));
763 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
764 cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
768 P54U_READ(NET2280_DEV_U32,
769 0x002C | (unsigned long)&devreg->direct_mem_win);
770 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
771 !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
772 dev_err(&priv->udev->dev, "(p54usb) firmware DMA "
773 "transfer failed\n");
777 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
778 cpu_to_le32(NET2280_FIFO_FLUSH));
780 remains -= block_len;
786 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
787 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
788 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
789 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
790 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
794 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
795 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
797 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
798 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
802 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
803 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
805 /* start up the firmware */
806 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
807 cpu_to_le32(ISL38XX_INT_IDENT_INIT));
809 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
810 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
812 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
813 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
814 NET2280_USB_INTERRUPT_ENABLE));
816 P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
817 cpu_to_le32(ISL38XX_DEV_INT_RESET));
819 err = usb_interrupt_msg(priv->udev,
820 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
821 buf, sizeof(__le32), &alen, 1000);
822 if (err || alen != sizeof(__le32))
825 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
826 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
828 if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
831 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
832 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
833 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
843 static int p54u_load_firmware(struct ieee80211_hw *dev)
845 struct p54u_priv *priv = dev->priv;
848 BUILD_BUG_ON(ARRAY_SIZE(p54u_fwlist) != __NUM_P54U_HWTYPES);
850 for (i = 0; i < __NUM_P54U_HWTYPES; i++)
851 if (p54u_fwlist[i].type == priv->hw_type)
854 if (i == __NUM_P54U_HWTYPES)
857 err = reject_firmware(&priv->fw, p54u_fwlist[i].fw, &priv->udev->dev);
859 dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s "
860 "(%d)!\n", p54u_fwlist[i].fw, err);
862 err = reject_firmware(&priv->fw, p54u_fwlist[i].fw_legacy,
868 err = p54_parse_firmware(dev, priv->fw);
872 if (priv->common.fw_interface != p54u_fwlist[i].intf) {
873 dev_err(&priv->udev->dev, "wrong firmware, please get "
874 "a firmware for \"%s\" and try again.\n",
881 release_firmware(priv->fw);
886 static int p54u_open(struct ieee80211_hw *dev)
888 struct p54u_priv *priv = dev->priv;
891 err = p54u_init_urbs(dev);
896 priv->common.open = p54u_init_urbs;
901 static void p54u_stop(struct ieee80211_hw *dev)
903 /* TODO: figure out how to reliably stop the 3887 and net2280 so
904 the hardware is still usable next time we want to start it.
905 until then, we just stop listening to the hardware.. */
909 static int __devinit p54u_probe(struct usb_interface *intf,
910 const struct usb_device_id *id)
912 struct usb_device *udev = interface_to_usbdev(intf);
913 struct ieee80211_hw *dev;
914 struct p54u_priv *priv;
916 unsigned int i, recognized_pipes;
918 dev = p54_init_common(sizeof(*priv));
921 dev_err(&udev->dev, "(p54usb) ieee80211 alloc failed\n");
926 priv->hw_type = P54U_INVALID_HW;
928 SET_IEEE80211_DEV(dev, &intf->dev);
929 usb_set_intfdata(intf, dev);
932 skb_queue_head_init(&priv->rx_queue);
933 init_usb_anchor(&priv->submitted);
937 /* really lazy and simple way of figuring out if we're a 3887 */
938 /* TODO: should just stick the identification in the device table */
939 i = intf->altsetting->desc.bNumEndpoints;
940 recognized_pipes = 0;
942 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
947 case P54U_PIPE_DATA | USB_DIR_IN:
948 case P54U_PIPE_MGMT | USB_DIR_IN:
949 case P54U_PIPE_BRG | USB_DIR_IN:
950 case P54U_PIPE_DEV | USB_DIR_IN:
951 case P54U_PIPE_INT | USB_DIR_IN:
955 priv->common.open = p54u_open;
956 priv->common.stop = p54u_stop;
957 if (recognized_pipes < P54U_PIPE_NUMBER) {
959 /* ISL3887 needs a full reset on resume */
960 udev->reset_resume = 1;
961 #endif /* CONFIG_PM */
962 err = p54u_device_reset(dev);
964 priv->hw_type = P54U_3887;
965 dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
966 priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
967 priv->common.tx = p54u_tx_lm87;
968 priv->upload_fw = p54u_upload_firmware_3887;
970 priv->hw_type = P54U_NET2280;
971 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
972 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
973 priv->common.tx = p54u_tx_net2280;
974 priv->upload_fw = p54u_upload_firmware_net2280;
976 err = p54u_load_firmware(dev);
980 err = priv->upload_fw(dev);
985 err = p54_read_eeprom(dev);
990 err = p54_register_common(dev, &udev->dev);
997 release_firmware(priv->fw);
1000 p54_free_common(dev);
1001 usb_set_intfdata(intf, NULL);
1006 static void __devexit p54u_disconnect(struct usb_interface *intf)
1008 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1009 struct p54u_priv *priv;
1014 p54_unregister_common(dev);
1017 usb_put_dev(interface_to_usbdev(intf));
1018 release_firmware(priv->fw);
1019 p54_free_common(dev);
1022 static int p54u_pre_reset(struct usb_interface *intf)
1024 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1033 static int p54u_resume(struct usb_interface *intf)
1035 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1036 struct p54u_priv *priv;
1042 if (unlikely(!(priv->upload_fw && priv->fw)))
1045 return priv->upload_fw(dev);
1048 static int p54u_post_reset(struct usb_interface *intf)
1050 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1051 struct p54u_priv *priv;
1054 err = p54u_resume(intf);
1058 /* reinitialize old device state */
1060 if (priv->common.mode != NL80211_IFTYPE_UNSPECIFIED)
1061 ieee80211_restart_hw(dev);
1068 static int p54u_suspend(struct usb_interface *intf, pm_message_t message)
1070 return p54u_pre_reset(intf);
1073 #endif /* CONFIG_PM */
1075 static struct usb_driver p54u_driver = {
1077 .id_table = p54u_table,
1078 .probe = p54u_probe,
1079 .disconnect = p54u_disconnect,
1080 .pre_reset = p54u_pre_reset,
1081 .post_reset = p54u_post_reset,
1083 .suspend = p54u_suspend,
1084 .resume = p54u_resume,
1085 .reset_resume = p54u_resume,
1086 #endif /* CONFIG_PM */
1090 static int __init p54u_init(void)
1092 return usb_register(&p54u_driver);
1095 static void __exit p54u_exit(void)
1097 usb_deregister(&p54u_driver);
1100 module_init(p54u_init);
1101 module_exit(p54u_exit);