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/firmware.h>
19 #include <linux/etherdevice.h>
20 #include <linux/delay.h>
21 #include <linux/crc32.h>
22 #include <net/mac80211.h>
28 MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
29 MODULE_DESCRIPTION("Prism54 USB wireless driver");
30 MODULE_LICENSE("GPL");
31 MODULE_ALIAS("prism54usb");
32 MODULE_FIRMWARE("isl3886usb");
33 MODULE_FIRMWARE("isl3887usb");
35 static struct usb_device_id p54u_table[] __devinitdata = {
36 /* Version 1 devices (pci chip + net2280) */
37 {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
38 {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */
39 {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */
40 {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */
41 {USB_DEVICE(0x083a, 0x4502)}, /* Siemens Gigaset USB Adapter */
42 {USB_DEVICE(0x083a, 0x5501)}, /* Phillips CPWUA054 */
43 {USB_DEVICE(0x0846, 0x4200)}, /* Netgear WG121 */
44 {USB_DEVICE(0x0846, 0x4210)}, /* Netgear WG121 the second ? */
45 {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
46 {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
47 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
48 {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
49 {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
50 {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
51 {USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
52 {USB_DEVICE(0x2001, 0x3703)}, /* DLink DWL-G122 */
53 {USB_DEVICE(0x5041, 0x2234)}, /* Linksys WUSB54G */
54 {USB_DEVICE(0x5041, 0x2235)}, /* Linksys WUSB54G Portable */
56 /* Version 2 devices (3887) */
57 {USB_DEVICE(0x0471, 0x1230)}, /* Philips CPWUA054/00 */
58 {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */
59 {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */
60 {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */
61 {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */
62 {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
63 {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
64 {USB_DEVICE(0x0846, 0x4240)}, /* Netgear WG111 (v2) */
65 {USB_DEVICE(0x0915, 0x2000)}, /* Cohiba Proto board */
66 {USB_DEVICE(0x0915, 0x2002)}, /* Cohiba Proto board */
67 {USB_DEVICE(0x0baf, 0x0118)}, /* U.S. Robotics U5 802.11g Adapter*/
68 {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/
69 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */
70 {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */
71 {USB_DEVICE(0x0cde, 0x0015)}, /* Zcomax XG-705A */
72 {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */
73 {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */
74 {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */
75 {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */
76 {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */
77 {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */
78 {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
79 {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
80 {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
81 {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
85 MODULE_DEVICE_TABLE(usb, p54u_table);
89 enum p54u_hw_type type;
91 const char *fw_legacy;
93 } p54u_fwlist[__NUM_P54U_HWTYPES] = {
98 .fw_legacy = "isl3890usb",
99 .hw = "ISL3886 + net2280",
105 .fw_legacy = "isl3887usb_bare",
110 static void p54u_rx_cb(struct urb *urb)
112 struct sk_buff *skb = (struct sk_buff *) urb->context;
113 struct p54u_rx_info *info = (struct p54u_rx_info *)skb->cb;
114 struct ieee80211_hw *dev = info->dev;
115 struct p54u_priv *priv = dev->priv;
117 skb_unlink(skb, &priv->rx_queue);
119 if (unlikely(urb->status)) {
120 dev_kfree_skb_irq(skb);
124 skb_put(skb, urb->actual_length);
126 if (priv->hw_type == P54U_NET2280)
127 skb_pull(skb, priv->common.tx_hdr_len);
128 if (priv->common.fw_interface == FW_LM87) {
133 if (p54_rx(dev, skb)) {
134 skb = dev_alloc_skb(priv->common.rx_mtu + 32);
135 if (unlikely(!skb)) {
136 /* TODO check rx queue length and refill *somewhere* */
140 info = (struct p54u_rx_info *) skb->cb;
143 urb->transfer_buffer = skb_tail_pointer(skb);
146 if (priv->hw_type == P54U_NET2280)
147 skb_push(skb, priv->common.tx_hdr_len);
148 if (priv->common.fw_interface == FW_LM87) {
152 skb_reset_tail_pointer(skb);
154 urb->transfer_buffer = skb_tail_pointer(skb);
156 skb_queue_tail(&priv->rx_queue, skb);
157 usb_anchor_urb(urb, &priv->submitted);
158 if (usb_submit_urb(urb, GFP_ATOMIC)) {
159 skb_unlink(skb, &priv->rx_queue);
160 usb_unanchor_urb(urb);
161 dev_kfree_skb_irq(skb);
165 static void p54u_tx_cb(struct urb *urb)
167 struct sk_buff *skb = urb->context;
168 struct ieee80211_hw *dev = (struct ieee80211_hw *)
169 usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
171 p54_free_skb(dev, skb);
174 static void p54u_tx_dummy_cb(struct urb *urb) { }
176 static void p54u_free_urbs(struct ieee80211_hw *dev)
178 struct p54u_priv *priv = dev->priv;
179 usb_kill_anchored_urbs(&priv->submitted);
182 static int p54u_init_urbs(struct ieee80211_hw *dev)
184 struct p54u_priv *priv = dev->priv;
185 struct urb *entry = NULL;
187 struct p54u_rx_info *info;
190 while (skb_queue_len(&priv->rx_queue) < 32) {
191 skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
196 entry = usb_alloc_urb(0, GFP_KERNEL);
202 usb_fill_bulk_urb(entry, priv->udev,
203 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
204 skb_tail_pointer(skb),
205 priv->common.rx_mtu + 32, p54u_rx_cb, skb);
206 info = (struct p54u_rx_info *) skb->cb;
209 skb_queue_tail(&priv->rx_queue, skb);
211 usb_anchor_urb(entry, &priv->submitted);
212 ret = usb_submit_urb(entry, GFP_KERNEL);
214 skb_unlink(skb, &priv->rx_queue);
215 usb_unanchor_urb(entry);
231 static __le32 p54u_lm87_chksum(const __le32 *data, size_t length)
237 chk ^= le32_to_cpu(*data++);
238 chk = (chk >> 5) ^ (chk << 3);
241 return cpu_to_le32(chk);
244 static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
246 struct p54u_priv *priv = dev->priv;
247 struct urb *data_urb;
248 struct lm87_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
250 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
252 p54_free_skb(dev, skb);
256 hdr->chksum = p54u_lm87_chksum((__le32 *)skb->data, skb->len);
257 hdr->device_addr = ((struct p54_hdr *)skb->data)->req_id;
259 usb_fill_bulk_urb(data_urb, priv->udev,
260 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
261 hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
262 p54u_tx_cb : p54u_tx_dummy_cb, skb);
263 data_urb->transfer_flags |= URB_ZERO_PACKET;
265 usb_anchor_urb(data_urb, &priv->submitted);
266 if (usb_submit_urb(data_urb, GFP_ATOMIC)) {
267 usb_unanchor_urb(data_urb);
268 p54_free_skb(dev, skb);
270 usb_free_urb(data_urb);
273 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
275 struct p54u_priv *priv = dev->priv;
276 struct urb *int_urb = NULL, *data_urb = NULL;
277 struct net2280_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
278 struct net2280_reg_write *reg = NULL;
281 reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
285 int_urb = usb_alloc_urb(0, GFP_ATOMIC);
289 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
293 reg->port = cpu_to_le16(NET2280_DEV_U32);
294 reg->addr = cpu_to_le32(P54U_DEV_BASE);
295 reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
297 memset(hdr, 0, sizeof(*hdr));
298 hdr->len = cpu_to_le16(skb->len);
299 hdr->device_addr = ((struct p54_hdr *) skb->data)->req_id;
301 usb_fill_bulk_urb(int_urb, priv->udev,
302 usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
303 p54u_tx_dummy_cb, dev);
306 * URB_FREE_BUFFER triggers a code path in the USB subsystem that will
307 * free what is inside the transfer_buffer after the last reference to
308 * the int_urb is dropped.
310 int_urb->transfer_flags |= URB_FREE_BUFFER | URB_ZERO_PACKET;
313 usb_fill_bulk_urb(data_urb, priv->udev,
314 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
315 hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
316 p54u_tx_cb : p54u_tx_dummy_cb, skb);
317 data_urb->transfer_flags |= URB_ZERO_PACKET;
319 usb_anchor_urb(int_urb, &priv->submitted);
320 err = usb_submit_urb(int_urb, GFP_ATOMIC);
322 usb_unanchor_urb(int_urb);
326 usb_anchor_urb(data_urb, &priv->submitted);
327 err = usb_submit_urb(data_urb, GFP_ATOMIC);
329 usb_unanchor_urb(data_urb);
333 usb_free_urb(int_urb);
334 usb_free_urb(data_urb);
338 p54_free_skb(dev, skb);
342 static int p54u_write(struct p54u_priv *priv,
343 struct net2280_reg_write *buf,
344 enum net2280_op_type type,
345 __le32 addr, __le32 val)
351 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
353 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
355 buf->port = cpu_to_le16(type);
359 return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
362 static int p54u_read(struct p54u_priv *priv, void *buf,
363 enum net2280_op_type type,
364 __le32 addr, __le32 *val)
366 struct net2280_reg_read *read = buf;
376 read->port = cpu_to_le16(type);
379 err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
380 read, sizeof(*read), &alen, 1000);
384 err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
385 reg, sizeof(*reg), &alen, 1000);
393 static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
394 void *data, size_t len)
397 return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
398 data, len, &alen, 2000);
401 static int p54u_device_reset(struct ieee80211_hw *dev)
403 struct p54u_priv *priv = dev->priv;
404 int ret, lock = (priv->intf->condition != USB_INTERFACE_BINDING);
407 ret = usb_lock_device_for_reset(priv->udev, priv->intf);
409 dev_err(&priv->udev->dev, "(p54usb) unable to lock "
410 "device for reset (%d)!\n", ret);
415 ret = usb_reset_device(priv->udev);
417 usb_unlock_device(priv->udev);
420 dev_err(&priv->udev->dev, "(p54usb) unable to reset "
421 "device (%d)!\n", ret);
426 static const char p54u_romboot_3887[] = "~~~~";
427 static int p54u_firmware_reset_3887(struct ieee80211_hw *dev)
429 struct p54u_priv *priv = dev->priv;
433 buf = kmalloc(4, GFP_KERNEL);
436 memcpy(buf, p54u_romboot_3887, 4);
437 ret = p54u_bulk_msg(priv, P54U_PIPE_DATA,
441 dev_err(&priv->udev->dev, "(p54usb) unable to jump to "
442 "boot ROM (%d)!\n", ret);
447 static const char p54u_firmware_upload_3887[] = "<\r";
448 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
450 struct p54u_priv *priv = dev->priv;
455 unsigned int left, remains, block_size;
456 struct x2_header *hdr;
457 unsigned long timeout;
459 err = p54u_firmware_reset_3887(dev);
463 tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
465 dev_err(&priv->udev->dev, "(p54usb) cannot allocate firmware"
470 left = block_size = min((size_t)P54U_FW_BLOCK, priv->fw->size);
471 strcpy(buf, p54u_firmware_upload_3887);
472 left -= strlen(p54u_firmware_upload_3887);
473 tmp += strlen(p54u_firmware_upload_3887);
475 data = priv->fw->data;
476 remains = priv->fw->size;
478 hdr = (struct x2_header *)(buf + strlen(p54u_firmware_upload_3887));
479 memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
480 hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
481 hdr->fw_length = cpu_to_le32(priv->fw->size);
482 hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
484 left -= sizeof(*hdr);
512 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
514 dev_err(&priv->udev->dev, "(p54usb) firmware "
516 goto err_upload_failed;
520 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
523 *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, priv->fw->data,
525 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
527 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
528 goto err_upload_failed;
530 timeout = jiffies + msecs_to_jiffies(1000);
531 while (!(err = usb_bulk_msg(priv->udev,
532 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
533 if (alen > 2 && !memcmp(buf, "OK", 2))
536 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
541 if (time_after(jiffies, timeout)) {
542 dev_err(&priv->udev->dev, "(p54usb) firmware boot "
549 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
550 goto err_upload_failed;
555 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
557 dev_err(&priv->udev->dev, "(p54usb) firmware boot failed!\n");
558 goto err_upload_failed;
561 timeout = jiffies + msecs_to_jiffies(1000);
562 while (!(err = usb_bulk_msg(priv->udev,
563 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
564 if (alen > 0 && buf[0] == 'g')
567 if (time_after(jiffies, timeout)) {
573 goto err_upload_failed;
580 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
582 struct p54u_priv *priv = dev->priv;
583 const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
587 unsigned int remains, offset;
590 buf = kmalloc(512, GFP_KERNEL);
592 dev_err(&priv->udev->dev, "(p54usb) firmware buffer "
597 #define P54U_WRITE(type, addr, data) \
599 err = p54u_write(priv, buf, type,\
600 cpu_to_le32((u32)(unsigned long)addr), data);\
605 #define P54U_READ(type, addr) \
607 err = p54u_read(priv, buf, type,\
608 cpu_to_le32((u32)(unsigned long)addr), ®);\
613 /* power down net2280 bridge */
614 P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
615 reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
616 reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
617 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
621 /* power up bridge */
622 reg |= cpu_to_le32(P54U_BRG_POWER_UP);
623 reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
624 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
628 P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
629 cpu_to_le32(NET2280_CLK_30Mhz |
631 NET2280_PCI_SOFT_RESET));
635 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
636 cpu_to_le32(PCI_COMMAND_MEMORY |
637 PCI_COMMAND_MASTER));
639 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
640 cpu_to_le32(NET2280_BASE));
642 P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
643 reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
644 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
646 // TODO: we really need this?
647 P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
649 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
650 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
651 P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
652 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
654 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
655 cpu_to_le32(NET2280_BASE2));
657 /* finally done setting up the bridge */
659 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
660 cpu_to_le32(PCI_COMMAND_MEMORY |
661 PCI_COMMAND_MASTER));
663 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
664 P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
665 cpu_to_le32(P54U_DEV_BASE));
667 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
668 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
669 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
672 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
674 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
675 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
676 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
677 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
678 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
682 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
683 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
687 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
688 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
692 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
693 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
695 /* finally, we can upload firmware now! */
696 remains = priv->fw->size;
697 data = priv->fw->data;
698 offset = ISL38XX_DEV_FIRMWARE_ADDR;
701 unsigned int block_len = min(remains, (unsigned int)512);
702 memcpy(buf, data, block_len);
704 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
706 dev_err(&priv->udev->dev, "(p54usb) firmware block "
711 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
712 cpu_to_le32(0xc0000f00));
714 P54U_WRITE(NET2280_DEV_U32,
715 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
716 P54U_WRITE(NET2280_DEV_U32,
717 0x0020 | (unsigned long)&devreg->direct_mem_win,
720 P54U_WRITE(NET2280_DEV_U32,
721 0x0024 | (unsigned long)&devreg->direct_mem_win,
722 cpu_to_le32(block_len));
723 P54U_WRITE(NET2280_DEV_U32,
724 0x0028 | (unsigned long)&devreg->direct_mem_win,
725 cpu_to_le32(offset));
727 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
728 cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
729 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
730 cpu_to_le32(block_len >> 2));
731 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
732 cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
736 P54U_READ(NET2280_DEV_U32,
737 0x002C | (unsigned long)&devreg->direct_mem_win);
738 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
739 !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
740 dev_err(&priv->udev->dev, "(p54usb) firmware DMA "
741 "transfer failed\n");
745 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
746 cpu_to_le32(NET2280_FIFO_FLUSH));
748 remains -= block_len;
754 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
755 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
756 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
757 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
758 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
762 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
763 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
765 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
766 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
770 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
771 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
773 /* start up the firmware */
774 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
775 cpu_to_le32(ISL38XX_INT_IDENT_INIT));
777 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
778 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
780 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
781 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
782 NET2280_USB_INTERRUPT_ENABLE));
784 P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
785 cpu_to_le32(ISL38XX_DEV_INT_RESET));
787 err = usb_interrupt_msg(priv->udev,
788 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
789 buf, sizeof(__le32), &alen, 1000);
790 if (err || alen != sizeof(__le32))
793 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
794 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
796 if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
799 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
800 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
801 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
811 static int p54u_load_firmware(struct ieee80211_hw *dev)
813 struct p54u_priv *priv = dev->priv;
816 BUILD_BUG_ON(ARRAY_SIZE(p54u_fwlist) != __NUM_P54U_HWTYPES);
818 for (i = 0; i < __NUM_P54U_HWTYPES; i++)
819 if (p54u_fwlist[i].type == priv->hw_type)
822 if (i == __NUM_P54U_HWTYPES)
825 err = request_firmware(&priv->fw, p54u_fwlist[i].fw, &priv->udev->dev);
827 dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s "
828 "(%d)!\n", p54u_fwlist[i].fw, err);
830 err = request_firmware(&priv->fw, p54u_fwlist[i].fw_legacy,
836 err = p54_parse_firmware(dev, priv->fw);
840 if (priv->common.fw_interface != p54u_fwlist[i].intf) {
841 dev_err(&priv->udev->dev, "wrong firmware, please get "
842 "a firmware for \"%s\" and try again.\n",
849 release_firmware(priv->fw);
854 static int p54u_open(struct ieee80211_hw *dev)
856 struct p54u_priv *priv = dev->priv;
859 err = p54u_init_urbs(dev);
864 priv->common.open = p54u_init_urbs;
869 static void p54u_stop(struct ieee80211_hw *dev)
871 /* TODO: figure out how to reliably stop the 3887 and net2280 so
872 the hardware is still usable next time we want to start it.
873 until then, we just stop listening to the hardware.. */
878 static int __devinit p54u_probe(struct usb_interface *intf,
879 const struct usb_device_id *id)
881 struct usb_device *udev = interface_to_usbdev(intf);
882 struct ieee80211_hw *dev;
883 struct p54u_priv *priv;
885 unsigned int i, recognized_pipes;
887 dev = p54_init_common(sizeof(*priv));
890 dev_err(&udev->dev, "(p54usb) ieee80211 alloc failed\n");
895 priv->hw_type = P54U_INVALID_HW;
897 SET_IEEE80211_DEV(dev, &intf->dev);
898 usb_set_intfdata(intf, dev);
901 skb_queue_head_init(&priv->rx_queue);
902 init_usb_anchor(&priv->submitted);
906 /* really lazy and simple way of figuring out if we're a 3887 */
907 /* TODO: should just stick the identification in the device table */
908 i = intf->altsetting->desc.bNumEndpoints;
909 recognized_pipes = 0;
911 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
916 case P54U_PIPE_DATA | USB_DIR_IN:
917 case P54U_PIPE_MGMT | USB_DIR_IN:
918 case P54U_PIPE_BRG | USB_DIR_IN:
919 case P54U_PIPE_DEV | USB_DIR_IN:
920 case P54U_PIPE_INT | USB_DIR_IN:
924 priv->common.open = p54u_open;
925 priv->common.stop = p54u_stop;
926 if (recognized_pipes < P54U_PIPE_NUMBER) {
928 /* ISL3887 needs a full reset on resume */
929 udev->reset_resume = 1;
930 err = p54u_device_reset(dev);
933 priv->hw_type = P54U_3887;
934 dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
935 priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
936 priv->common.tx = p54u_tx_lm87;
937 priv->upload_fw = p54u_upload_firmware_3887;
939 priv->hw_type = P54U_NET2280;
940 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
941 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
942 priv->common.tx = p54u_tx_net2280;
943 priv->upload_fw = p54u_upload_firmware_net2280;
945 err = p54u_load_firmware(dev);
949 err = priv->upload_fw(dev);
954 err = p54_read_eeprom(dev);
959 err = p54_register_common(dev, &udev->dev);
966 release_firmware(priv->fw);
969 p54_free_common(dev);
970 usb_set_intfdata(intf, NULL);
975 static void __devexit p54u_disconnect(struct usb_interface *intf)
977 struct ieee80211_hw *dev = usb_get_intfdata(intf);
978 struct p54u_priv *priv;
983 p54_unregister_common(dev);
986 usb_put_dev(interface_to_usbdev(intf));
987 release_firmware(priv->fw);
988 p54_free_common(dev);
991 static int p54u_pre_reset(struct usb_interface *intf)
993 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1002 static int p54u_resume(struct usb_interface *intf)
1004 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1005 struct p54u_priv *priv;
1011 if (unlikely(!(priv->upload_fw && priv->fw)))
1014 return priv->upload_fw(dev);
1017 static int p54u_post_reset(struct usb_interface *intf)
1019 struct ieee80211_hw *dev = usb_get_intfdata(intf);
1020 struct p54u_priv *priv;
1023 err = p54u_resume(intf);
1027 /* reinitialize old device state */
1029 if (priv->common.mode != NL80211_IFTYPE_UNSPECIFIED)
1030 ieee80211_restart_hw(dev);
1037 static int p54u_suspend(struct usb_interface *intf, pm_message_t message)
1039 return p54u_pre_reset(intf);
1042 #endif /* CONFIG_PM */
1044 static struct usb_driver p54u_driver = {
1046 .id_table = p54u_table,
1047 .probe = p54u_probe,
1048 .disconnect = p54u_disconnect,
1049 .pre_reset = p54u_pre_reset,
1050 .post_reset = p54u_post_reset,
1052 .suspend = p54u_suspend,
1053 .resume = p54u_resume,
1054 .reset_resume = p54u_resume,
1055 #endif /* CONFIG_PM */
1059 static int __init p54u_init(void)
1061 return usb_register(&p54u_driver);
1064 static void __exit p54u_exit(void)
1066 usb_deregister(&p54u_driver);
1069 module_init(p54u_init);
1070 module_exit(p54u_exit);