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>
27 MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
28 MODULE_DESCRIPTION("Prism54 USB wireless driver");
29 MODULE_LICENSE("GPL");
30 MODULE_ALIAS("prism54usb");
31 MODULE_FIRMWARE("isl3886usb");
32 MODULE_FIRMWARE("isl3887usb");
34 static struct usb_device_id p54u_table[] __devinitdata = {
35 /* Version 1 devices (pci chip + net2280) */
36 {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
37 {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */
38 {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */
39 {USB_DEVICE(0x083a, 0x4502)}, /* Siemens Gigaset USB Adapter */
40 {USB_DEVICE(0x083a, 0x5501)}, /* Phillips CPWUA054 */
41 {USB_DEVICE(0x0846, 0x4200)}, /* Netgear WG121 */
42 {USB_DEVICE(0x0846, 0x4210)}, /* Netgear WG121 the second ? */
43 {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
44 {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
45 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
46 {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
47 {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
48 {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
49 {USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
50 {USB_DEVICE(0x2001, 0x3703)}, /* DLink DWL-G122 */
51 {USB_DEVICE(0x5041, 0x2234)}, /* Linksys WUSB54G */
52 {USB_DEVICE(0x5041, 0x2235)}, /* Linksys WUSB54G Portable */
54 /* Version 2 devices (3887) */
55 {USB_DEVICE(0x0471, 0x1230)}, /* Philips CPWUA054/00 */
56 {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */
57 {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */
58 {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */
59 {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */
60 {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
61 {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
62 {USB_DEVICE(0x0846, 0x4240)}, /* Netgear WG111 (v2) */
63 {USB_DEVICE(0x0915, 0x2000)}, /* Cohiba Proto board */
64 {USB_DEVICE(0x0915, 0x2002)}, /* Cohiba Proto board */
65 {USB_DEVICE(0x0baf, 0x0118)}, /* U.S. Robotics U5 802.11g Adapter*/
66 {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/
67 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */
68 {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */
69 {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */
70 {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */
71 {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */
72 {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */
73 {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */
74 {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
75 {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
76 {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
77 {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
81 MODULE_DEVICE_TABLE(usb, p54u_table);
83 static void p54u_rx_cb(struct urb *urb)
85 struct sk_buff *skb = (struct sk_buff *) urb->context;
86 struct p54u_rx_info *info = (struct p54u_rx_info *)skb->cb;
87 struct ieee80211_hw *dev = info->dev;
88 struct p54u_priv *priv = dev->priv;
90 skb_unlink(skb, &priv->rx_queue);
92 if (unlikely(urb->status)) {
93 dev_kfree_skb_irq(skb);
97 skb_put(skb, urb->actual_length);
99 if (priv->hw_type == P54U_NET2280)
100 skb_pull(skb, priv->common.tx_hdr_len);
101 if (priv->common.fw_interface == FW_LM87) {
106 if (p54_rx(dev, skb)) {
107 skb = dev_alloc_skb(priv->common.rx_mtu + 32);
108 if (unlikely(!skb)) {
109 /* TODO check rx queue length and refill *somewhere* */
113 info = (struct p54u_rx_info *) skb->cb;
116 urb->transfer_buffer = skb_tail_pointer(skb);
119 if (priv->hw_type == P54U_NET2280)
120 skb_push(skb, priv->common.tx_hdr_len);
121 if (priv->common.fw_interface == FW_LM87) {
125 skb_reset_tail_pointer(skb);
127 if (urb->transfer_buffer != skb_tail_pointer(skb)) {
128 /* this should not happen */
130 urb->transfer_buffer = skb_tail_pointer(skb);
133 skb_queue_tail(&priv->rx_queue, skb);
134 usb_anchor_urb(urb, &priv->submitted);
135 if (usb_submit_urb(urb, GFP_ATOMIC)) {
136 skb_unlink(skb, &priv->rx_queue);
137 usb_unanchor_urb(urb);
138 dev_kfree_skb_irq(skb);
142 static void p54u_tx_cb(struct urb *urb)
144 struct sk_buff *skb = urb->context;
145 struct ieee80211_hw *dev = (struct ieee80211_hw *)
146 usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
147 struct p54u_priv *priv = dev->priv;
149 skb_pull(skb, priv->common.tx_hdr_len);
150 if (FREE_AFTER_TX(skb))
151 p54_free_skb(dev, skb);
154 static void p54u_tx_dummy_cb(struct urb *urb) { }
156 static void p54u_free_urbs(struct ieee80211_hw *dev)
158 struct p54u_priv *priv = dev->priv;
159 usb_kill_anchored_urbs(&priv->submitted);
162 static int p54u_init_urbs(struct ieee80211_hw *dev)
164 struct p54u_priv *priv = dev->priv;
165 struct urb *entry = NULL;
167 struct p54u_rx_info *info;
170 while (skb_queue_len(&priv->rx_queue) < 32) {
171 skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
176 entry = usb_alloc_urb(0, GFP_KERNEL);
182 usb_fill_bulk_urb(entry, priv->udev,
183 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
184 skb_tail_pointer(skb),
185 priv->common.rx_mtu + 32, p54u_rx_cb, skb);
186 info = (struct p54u_rx_info *) skb->cb;
189 skb_queue_tail(&priv->rx_queue, skb);
191 usb_anchor_urb(entry, &priv->submitted);
192 ret = usb_submit_urb(entry, GFP_KERNEL);
194 skb_unlink(skb, &priv->rx_queue);
195 usb_unanchor_urb(entry);
211 static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb)
213 struct p54u_priv *priv = dev->priv;
214 struct urb *addr_urb, *data_urb;
217 addr_urb = usb_alloc_urb(0, GFP_ATOMIC);
221 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
223 usb_free_urb(addr_urb);
227 usb_fill_bulk_urb(addr_urb, priv->udev,
228 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
229 &((struct p54_hdr *)skb->data)->req_id, 4,
230 p54u_tx_dummy_cb, dev);
231 usb_fill_bulk_urb(data_urb, priv->udev,
232 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
233 skb->data, skb->len, p54u_tx_cb, skb);
235 usb_anchor_urb(addr_urb, &priv->submitted);
236 err = usb_submit_urb(addr_urb, GFP_ATOMIC);
238 usb_unanchor_urb(addr_urb);
242 usb_anchor_urb(addr_urb, &priv->submitted);
243 err = usb_submit_urb(data_urb, GFP_ATOMIC);
245 usb_unanchor_urb(data_urb);
248 usb_free_urb(addr_urb);
249 usb_free_urb(data_urb);
252 p54_free_skb(dev, skb);
255 static __le32 p54u_lm87_chksum(const __le32 *data, size_t length)
261 chk ^= le32_to_cpu(*data++);
262 chk = (chk >> 5) ^ (chk << 3);
265 return cpu_to_le32(chk);
268 static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
270 struct p54u_priv *priv = dev->priv;
271 struct urb *data_urb;
272 struct lm87_tx_hdr *hdr;
274 __le32 addr = ((struct p54_hdr *)skb->data)->req_id;
276 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
280 checksum = p54u_lm87_chksum((__le32 *)skb->data, skb->len);
281 hdr = (struct lm87_tx_hdr *)skb_push(skb, sizeof(*hdr));
282 hdr->chksum = checksum;
283 hdr->device_addr = addr;
285 usb_fill_bulk_urb(data_urb, priv->udev,
286 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
287 skb->data, skb->len, p54u_tx_cb, skb);
288 data_urb->transfer_flags |= URB_ZERO_PACKET;
290 usb_anchor_urb(data_urb, &priv->submitted);
291 if (usb_submit_urb(data_urb, GFP_ATOMIC)) {
292 usb_unanchor_urb(data_urb);
293 skb_pull(skb, sizeof(*hdr));
294 p54_free_skb(dev, skb);
296 usb_free_urb(data_urb);
299 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
301 struct p54u_priv *priv = dev->priv;
302 struct urb *int_urb, *data_urb;
303 struct net2280_tx_hdr *hdr;
304 struct net2280_reg_write *reg;
306 __le32 addr = ((struct p54_hdr *) skb->data)->req_id;
307 __le16 len = cpu_to_le16(skb->len);
309 reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
313 int_urb = usb_alloc_urb(0, GFP_ATOMIC);
319 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
322 usb_free_urb(int_urb);
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 hdr = (void *)skb_push(skb, sizeof(*hdr));
331 memset(hdr, 0, sizeof(*hdr));
333 hdr->device_addr = addr;
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 * This flag triggers a code path in the USB subsystem that will
341 * free what's inside the transfer_buffer after the callback routine
344 int_urb->transfer_flags |= URB_FREE_BUFFER;
346 usb_fill_bulk_urb(data_urb, priv->udev,
347 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
348 skb->data, skb->len, p54u_tx_cb, skb);
350 usb_anchor_urb(int_urb, &priv->submitted);
351 err = usb_submit_urb(int_urb, GFP_ATOMIC);
353 usb_unanchor_urb(int_urb);
357 usb_anchor_urb(data_urb, &priv->submitted);
358 err = usb_submit_urb(data_urb, GFP_ATOMIC);
360 usb_unanchor_urb(data_urb);
364 usb_free_urb(int_urb);
365 usb_free_urb(data_urb);
368 skb_pull(skb, sizeof(*hdr));
369 p54_free_skb(dev, skb);
373 static int p54u_write(struct p54u_priv *priv,
374 struct net2280_reg_write *buf,
375 enum net2280_op_type type,
376 __le32 addr, __le32 val)
382 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
384 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
386 buf->port = cpu_to_le16(type);
390 return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
393 static int p54u_read(struct p54u_priv *priv, void *buf,
394 enum net2280_op_type type,
395 __le32 addr, __le32 *val)
397 struct net2280_reg_read *read = buf;
407 read->port = cpu_to_le16(type);
410 err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
411 read, sizeof(*read), &alen, 1000);
415 err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
416 reg, sizeof(*reg), &alen, 1000);
424 static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
425 void *data, size_t len)
428 return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
429 data, len, &alen, 2000);
432 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
434 static char start_string[] = "~~~~<\r";
435 struct p54u_priv *priv = dev->priv;
436 const struct firmware *fw_entry = NULL;
441 unsigned int left, remains, block_size;
442 struct x2_header *hdr;
443 unsigned long timeout;
445 tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
447 dev_err(&priv->udev->dev, "(p54usb) cannot allocate firmware"
453 memcpy(buf, start_string, 4);
454 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 4);
456 dev_err(&priv->udev->dev, "(p54usb) reset failed! (%d)\n", err);
460 err = request_firmware(&fw_entry, "isl3887usb", &priv->udev->dev);
462 dev_err(&priv->udev->dev, "p54usb: cannot find firmware "
464 err = request_firmware(&fw_entry, "isl3887usb_bare",
467 goto err_req_fw_failed;
470 err = p54_parse_firmware(dev, fw_entry);
472 goto err_upload_failed;
474 left = block_size = min((size_t)P54U_FW_BLOCK, fw_entry->size);
475 strcpy(buf, start_string);
476 left -= strlen(start_string);
477 tmp += strlen(start_string);
479 data = fw_entry->data;
480 remains = fw_entry->size;
482 hdr = (struct x2_header *)(buf + strlen(start_string));
483 memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
484 hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
485 hdr->fw_length = cpu_to_le32(fw_entry->size);
486 hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
488 left -= sizeof(*hdr);
516 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
518 dev_err(&priv->udev->dev, "(p54usb) firmware "
520 goto err_upload_failed;
524 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
527 *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, fw_entry->data, fw_entry->size));
528 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
530 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
531 goto err_upload_failed;
533 timeout = jiffies + msecs_to_jiffies(1000);
534 while (!(err = usb_bulk_msg(priv->udev,
535 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
536 if (alen > 2 && !memcmp(buf, "OK", 2))
539 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
544 if (time_after(jiffies, timeout)) {
545 dev_err(&priv->udev->dev, "(p54usb) firmware boot "
552 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
553 goto err_upload_failed;
558 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
560 dev_err(&priv->udev->dev, "(p54usb) firmware boot failed!\n");
561 goto err_upload_failed;
564 timeout = jiffies + msecs_to_jiffies(1000);
565 while (!(err = usb_bulk_msg(priv->udev,
566 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
567 if (alen > 0 && buf[0] == 'g')
570 if (time_after(jiffies, timeout)) {
576 goto err_upload_failed;
579 release_firmware(fw_entry);
587 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
589 struct p54u_priv *priv = dev->priv;
590 const struct firmware *fw_entry = NULL;
591 const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
595 unsigned int remains, offset;
598 buf = kmalloc(512, GFP_KERNEL);
600 dev_err(&priv->udev->dev, "(p54usb) firmware buffer "
605 err = request_firmware(&fw_entry, "isl3886usb", &priv->udev->dev);
607 dev_err(&priv->udev->dev, "(p54usb) cannot find firmware "
609 err = request_firmware(&fw_entry, "isl3890usb",
617 err = p54_parse_firmware(dev, fw_entry);
620 release_firmware(fw_entry);
624 #define P54U_WRITE(type, addr, data) \
626 err = p54u_write(priv, buf, type,\
627 cpu_to_le32((u32)(unsigned long)addr), data);\
632 #define P54U_READ(type, addr) \
634 err = p54u_read(priv, buf, type,\
635 cpu_to_le32((u32)(unsigned long)addr), ®);\
640 /* power down net2280 bridge */
641 P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
642 reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
643 reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
644 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
648 /* power up bridge */
649 reg |= cpu_to_le32(P54U_BRG_POWER_UP);
650 reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
651 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
655 P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
656 cpu_to_le32(NET2280_CLK_30Mhz |
658 NET2280_PCI_SOFT_RESET));
662 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
663 cpu_to_le32(PCI_COMMAND_MEMORY |
664 PCI_COMMAND_MASTER));
666 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
667 cpu_to_le32(NET2280_BASE));
669 P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
670 reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
671 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
673 // TODO: we really need this?
674 P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
676 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
677 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
678 P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
679 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
681 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
682 cpu_to_le32(NET2280_BASE2));
684 /* finally done setting up the bridge */
686 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
687 cpu_to_le32(PCI_COMMAND_MEMORY |
688 PCI_COMMAND_MASTER));
690 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
691 P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
692 cpu_to_le32(P54U_DEV_BASE));
694 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
695 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
696 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
699 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
701 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
702 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
703 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
704 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
705 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
709 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
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 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
720 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
722 /* finally, we can upload firmware now! */
723 remains = fw_entry->size;
724 data = fw_entry->data;
725 offset = ISL38XX_DEV_FIRMWARE_ADDR;
728 unsigned int block_len = min(remains, (unsigned int)512);
729 memcpy(buf, data, block_len);
731 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
733 dev_err(&priv->udev->dev, "(p54usb) firmware block "
738 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
739 cpu_to_le32(0xc0000f00));
741 P54U_WRITE(NET2280_DEV_U32,
742 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
743 P54U_WRITE(NET2280_DEV_U32,
744 0x0020 | (unsigned long)&devreg->direct_mem_win,
747 P54U_WRITE(NET2280_DEV_U32,
748 0x0024 | (unsigned long)&devreg->direct_mem_win,
749 cpu_to_le32(block_len));
750 P54U_WRITE(NET2280_DEV_U32,
751 0x0028 | (unsigned long)&devreg->direct_mem_win,
752 cpu_to_le32(offset));
754 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
755 cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
756 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
757 cpu_to_le32(block_len >> 2));
758 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
759 cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
763 P54U_READ(NET2280_DEV_U32,
764 0x002C | (unsigned long)&devreg->direct_mem_win);
765 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
766 !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
767 dev_err(&priv->udev->dev, "(p54usb) firmware DMA "
768 "transfer failed\n");
772 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
773 cpu_to_le32(NET2280_FIFO_FLUSH));
775 remains -= block_len;
781 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
782 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
783 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
784 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
785 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
789 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
790 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
792 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
793 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
797 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
798 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
800 /* start up the firmware */
801 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
802 cpu_to_le32(ISL38XX_INT_IDENT_INIT));
804 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
805 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
807 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
808 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
809 NET2280_USB_INTERRUPT_ENABLE));
811 P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
812 cpu_to_le32(ISL38XX_DEV_INT_RESET));
814 err = usb_interrupt_msg(priv->udev,
815 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
816 buf, sizeof(__le32), &alen, 1000);
817 if (err || alen != sizeof(__le32))
820 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
821 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
823 if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
826 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
827 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
828 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
834 release_firmware(fw_entry);
839 static int p54u_open(struct ieee80211_hw *dev)
841 struct p54u_priv *priv = dev->priv;
844 err = p54u_init_urbs(dev);
849 priv->common.open = p54u_init_urbs;
854 static void p54u_stop(struct ieee80211_hw *dev)
856 /* TODO: figure out how to reliably stop the 3887 and net2280 so
857 the hardware is still usable next time we want to start it.
858 until then, we just stop listening to the hardware.. */
863 static int __devinit p54u_probe(struct usb_interface *intf,
864 const struct usb_device_id *id)
866 struct usb_device *udev = interface_to_usbdev(intf);
867 struct ieee80211_hw *dev;
868 struct p54u_priv *priv;
870 unsigned int i, recognized_pipes;
872 dev = p54_init_common(sizeof(*priv));
875 dev_err(&udev->dev, "(p54usb) ieee80211 alloc failed\n");
881 SET_IEEE80211_DEV(dev, &intf->dev);
882 usb_set_intfdata(intf, dev);
887 /* really lazy and simple way of figuring out if we're a 3887 */
888 /* TODO: should just stick the identification in the device table */
889 i = intf->altsetting->desc.bNumEndpoints;
890 recognized_pipes = 0;
892 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
897 case P54U_PIPE_DATA | USB_DIR_IN:
898 case P54U_PIPE_MGMT | USB_DIR_IN:
899 case P54U_PIPE_BRG | USB_DIR_IN:
900 case P54U_PIPE_DEV | USB_DIR_IN:
901 case P54U_PIPE_INT | USB_DIR_IN:
905 priv->common.open = p54u_open;
906 priv->common.stop = p54u_stop;
907 if (recognized_pipes < P54U_PIPE_NUMBER) {
908 priv->hw_type = P54U_3887;
909 err = p54u_upload_firmware_3887(dev);
910 if (priv->common.fw_interface == FW_LM87) {
911 dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
912 priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
913 priv->common.tx = p54u_tx_lm87;
915 priv->common.tx = p54u_tx_3887;
917 priv->hw_type = P54U_NET2280;
918 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
919 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
920 priv->common.tx = p54u_tx_net2280;
921 err = p54u_upload_firmware_net2280(dev);
926 skb_queue_head_init(&priv->rx_queue);
927 init_usb_anchor(&priv->submitted);
930 err = p54_read_eeprom(dev);
935 err = ieee80211_register_hw(dev);
937 dev_err(&udev->dev, "(p54usb) Cannot register netdevice\n");
944 ieee80211_free_hw(dev);
945 usb_set_intfdata(intf, NULL);
950 static void __devexit p54u_disconnect(struct usb_interface *intf)
952 struct ieee80211_hw *dev = usb_get_intfdata(intf);
953 struct p54u_priv *priv;
958 ieee80211_unregister_hw(dev);
961 usb_put_dev(interface_to_usbdev(intf));
962 p54_free_common(dev);
963 ieee80211_free_hw(dev);
966 static struct usb_driver p54u_driver = {
968 .id_table = p54u_table,
970 .disconnect = p54u_disconnect,
973 static int __init p54u_init(void)
975 return usb_register(&p54u_driver);
978 static void __exit p54u_exit(void)
980 usb_deregister(&p54u_driver);
983 module_init(p54u_init);
984 module_exit(p54u_exit);