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");
32 static struct usb_device_id p54u_table[] __devinitdata = {
33 /* Version 1 devices (pci chip + net2280) */
34 {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
35 {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */
36 {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */
37 {USB_DEVICE(0x083a, 0x4502)}, /* Siemens Gigaset USB Adapter */
38 {USB_DEVICE(0x083a, 0x5501)}, /* Phillips CPWUA054 */
39 {USB_DEVICE(0x0846, 0x4200)}, /* Netgear WG121 */
40 {USB_DEVICE(0x0846, 0x4210)}, /* Netgear WG121 the second ? */
41 {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
42 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
43 {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
44 {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
45 {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
46 {USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
47 {USB_DEVICE(0x2001, 0x3703)}, /* DLink DWL-G122 */
48 {USB_DEVICE(0x5041, 0x2234)}, /* Linksys WUSB54G */
49 {USB_DEVICE(0x5041, 0x2235)}, /* Linksys WUSB54G Portable */
51 /* Version 2 devices (3887) */
52 {USB_DEVICE(0x0471, 0x1230)}, /* Philips CPWUA054/00 */
53 {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */
54 {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */
55 {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */
56 {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
57 {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
58 {USB_DEVICE(0x0846, 0x4240)}, /* Netgear WG111 (v2) */
59 {USB_DEVICE(0x0915, 0x2000)}, /* Cohiba Proto board */
60 {USB_DEVICE(0x0915, 0x2002)}, /* Cohiba Proto board */
61 {USB_DEVICE(0x0baf, 0x0118)}, /* U.S. Robotics U5 802.11g Adapter*/
62 {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/
63 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */
64 {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */
65 {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */
66 {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
67 {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */
68 {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */
69 {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */
70 {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
71 {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
72 {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
73 {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
77 MODULE_DEVICE_TABLE(usb, p54u_table);
79 static void p54u_rx_cb(struct urb *urb)
81 struct sk_buff *skb = (struct sk_buff *) urb->context;
82 struct p54u_rx_info *info = (struct p54u_rx_info *)skb->cb;
83 struct ieee80211_hw *dev = info->dev;
84 struct p54u_priv *priv = dev->priv;
86 if (unlikely(urb->status)) {
92 skb_unlink(skb, &priv->rx_queue);
93 skb_put(skb, urb->actual_length);
95 skb_pull(skb, sizeof(struct net2280_tx_hdr));
97 if (p54_rx(dev, skb)) {
98 skb = dev_alloc_skb(priv->common.rx_mtu + 32);
101 /* TODO check rx queue length and refill *somewhere* */
105 info = (struct p54u_rx_info *) skb->cb;
108 urb->transfer_buffer = skb_tail_pointer(skb);
110 skb_queue_tail(&priv->rx_queue, skb);
113 skb_push(skb, sizeof(struct net2280_tx_hdr));
115 skb_reset_tail_pointer(skb);
117 if (urb->transfer_buffer != skb_tail_pointer(skb)) {
118 /* this should not happen */
120 urb->transfer_buffer = skb_tail_pointer(skb);
123 skb_queue_tail(&priv->rx_queue, skb);
126 usb_submit_urb(urb, GFP_ATOMIC);
129 static void p54u_tx_cb(struct urb *urb)
134 static void p54u_tx_free_cb(struct urb *urb)
136 kfree(urb->transfer_buffer);
140 static int p54u_init_urbs(struct ieee80211_hw *dev)
142 struct p54u_priv *priv = dev->priv;
145 struct p54u_rx_info *info;
147 while (skb_queue_len(&priv->rx_queue) < 32) {
148 skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
151 entry = usb_alloc_urb(0, GFP_KERNEL);
156 usb_fill_bulk_urb(entry, priv->udev,
157 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
158 skb_tail_pointer(skb),
159 priv->common.rx_mtu + 32, p54u_rx_cb, skb);
160 info = (struct p54u_rx_info *) skb->cb;
163 skb_queue_tail(&priv->rx_queue, skb);
164 usb_submit_urb(entry, GFP_KERNEL);
170 static void p54u_free_urbs(struct ieee80211_hw *dev)
172 struct p54u_priv *priv = dev->priv;
173 struct p54u_rx_info *info;
176 while ((skb = skb_dequeue(&priv->rx_queue))) {
177 info = (struct p54u_rx_info *) skb->cb;
181 usb_kill_urb(info->urb);
186 static void p54u_tx_3887(struct ieee80211_hw *dev, struct p54_control_hdr *data,
187 size_t len, int free_on_tx)
189 struct p54u_priv *priv = dev->priv;
190 struct urb *addr_urb, *data_urb;
192 addr_urb = usb_alloc_urb(0, GFP_ATOMIC);
196 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
198 usb_free_urb(addr_urb);
202 usb_fill_bulk_urb(addr_urb, priv->udev,
203 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), &data->req_id,
204 sizeof(data->req_id), p54u_tx_cb, dev);
205 usb_fill_bulk_urb(data_urb, priv->udev,
206 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), data, len,
207 free_on_tx ? p54u_tx_free_cb : p54u_tx_cb, dev);
209 usb_submit_urb(addr_urb, GFP_ATOMIC);
210 usb_submit_urb(data_urb, GFP_ATOMIC);
213 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct p54_control_hdr *data,
214 size_t len, int free_on_tx)
216 struct p54u_priv *priv = dev->priv;
217 struct urb *int_urb, *data_urb;
218 struct net2280_tx_hdr *hdr;
219 struct net2280_reg_write *reg;
221 reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
225 int_urb = usb_alloc_urb(0, GFP_ATOMIC);
231 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
234 usb_free_urb(int_urb);
238 reg->port = cpu_to_le16(NET2280_DEV_U32);
239 reg->addr = cpu_to_le32(P54U_DEV_BASE);
240 reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
242 len += sizeof(*data);
243 hdr = (void *)data - sizeof(*hdr);
244 memset(hdr, 0, sizeof(*hdr));
245 hdr->device_addr = data->req_id;
246 hdr->len = cpu_to_le16(len);
248 usb_fill_bulk_urb(int_urb, priv->udev,
249 usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
250 p54u_tx_free_cb, dev);
251 usb_submit_urb(int_urb, GFP_ATOMIC);
253 usb_fill_bulk_urb(data_urb, priv->udev,
254 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), hdr, len + sizeof(*hdr),
255 free_on_tx ? p54u_tx_free_cb : p54u_tx_cb, dev);
256 usb_submit_urb(data_urb, GFP_ATOMIC);
259 static int p54u_write(struct p54u_priv *priv,
260 struct net2280_reg_write *buf,
261 enum net2280_op_type type,
262 __le32 addr, __le32 val)
268 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
270 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
272 buf->port = cpu_to_le16(type);
276 return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
279 static int p54u_read(struct p54u_priv *priv, void *buf,
280 enum net2280_op_type type,
281 __le32 addr, __le32 *val)
283 struct net2280_reg_read *read = buf;
293 read->port = cpu_to_le16(type);
296 err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
297 read, sizeof(*read), &alen, 1000);
301 err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
302 reg, sizeof(*reg), &alen, 1000);
310 static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
311 void *data, size_t len)
314 return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
315 data, len, &alen, 2000);
318 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
320 static char start_string[] = "~~~~<\r";
321 struct p54u_priv *priv = dev->priv;
322 const struct firmware *fw_entry = NULL;
327 unsigned int left, remains, block_size;
328 struct x2_header *hdr;
329 unsigned long timeout;
331 tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
333 printk(KERN_ERR "p54usb: cannot allocate firmware upload buffer!\n");
338 memcpy(buf, start_string, 4);
339 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 4);
341 printk(KERN_ERR "p54usb: reset failed! (%d)\n", err);
345 err = request_firmware(&fw_entry, "isl3887usb_bare", &priv->udev->dev);
347 printk(KERN_ERR "p54usb: cannot find firmware (isl3887usb_bare)!\n");
348 goto err_req_fw_failed;
351 err = p54_parse_firmware(dev, fw_entry);
353 goto err_upload_failed;
355 left = block_size = min((size_t)P54U_FW_BLOCK, fw_entry->size);
356 strcpy(buf, start_string);
357 left -= strlen(start_string);
358 tmp += strlen(start_string);
360 data = fw_entry->data;
361 remains = fw_entry->size;
363 hdr = (struct x2_header *)(buf + strlen(start_string));
364 memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
365 hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
366 hdr->fw_length = cpu_to_le32(fw_entry->size);
367 hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
369 left -= sizeof(*hdr);
397 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
399 printk(KERN_ERR "p54usb: firmware upload failed!\n");
400 goto err_upload_failed;
404 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
407 *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, fw_entry->data, fw_entry->size));
408 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
410 printk(KERN_ERR "p54usb: firmware upload failed!\n");
411 goto err_upload_failed;
414 timeout = jiffies + msecs_to_jiffies(1000);
415 while (!(err = usb_bulk_msg(priv->udev,
416 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
417 if (alen > 2 && !memcmp(buf, "OK", 2))
420 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
421 printk(KERN_INFO "p54usb: firmware upload failed!\n");
426 if (time_after(jiffies, timeout)) {
427 printk(KERN_ERR "p54usb: firmware boot timed out!\n");
433 goto err_upload_failed;
437 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
439 printk(KERN_ERR "p54usb: firmware boot failed!\n");
440 goto err_upload_failed;
443 timeout = jiffies + msecs_to_jiffies(1000);
444 while (!(err = usb_bulk_msg(priv->udev,
445 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
446 if (alen > 0 && buf[0] == 'g')
449 if (time_after(jiffies, timeout)) {
455 goto err_upload_failed;
458 release_firmware(fw_entry);
466 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
468 struct p54u_priv *priv = dev->priv;
469 const struct firmware *fw_entry = NULL;
470 const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
474 unsigned int remains, offset;
477 buf = kmalloc(512, GFP_KERNEL);
479 printk(KERN_ERR "p54usb: firmware buffer alloc failed!\n");
483 err = request_firmware(&fw_entry, "isl3890usb", &priv->udev->dev);
485 printk(KERN_ERR "p54usb: cannot find firmware (isl3890usb)!\n");
490 err = p54_parse_firmware(dev, fw_entry);
493 release_firmware(fw_entry);
497 #define P54U_WRITE(type, addr, data) \
499 err = p54u_write(priv, buf, type,\
500 cpu_to_le32((u32)(unsigned long)addr), data);\
505 #define P54U_READ(type, addr) \
507 err = p54u_read(priv, buf, type,\
508 cpu_to_le32((u32)(unsigned long)addr), ®);\
513 /* power down net2280 bridge */
514 P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
515 reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
516 reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
517 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
521 /* power up bridge */
522 reg |= cpu_to_le32(P54U_BRG_POWER_UP);
523 reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
524 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
528 P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
529 cpu_to_le32(NET2280_CLK_30Mhz |
531 NET2280_PCI_SOFT_RESET));
535 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
536 cpu_to_le32(PCI_COMMAND_MEMORY |
537 PCI_COMMAND_MASTER));
539 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
540 cpu_to_le32(NET2280_BASE));
542 P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
543 reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
544 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
546 // TODO: we really need this?
547 P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
549 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
550 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
551 P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
552 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
554 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
555 cpu_to_le32(NET2280_BASE2));
557 /* finally done setting up the bridge */
559 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
560 cpu_to_le32(PCI_COMMAND_MEMORY |
561 PCI_COMMAND_MASTER));
563 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
564 P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
565 cpu_to_le32(P54U_DEV_BASE));
567 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
568 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
569 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
572 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
574 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
575 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
576 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
577 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
578 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
582 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
583 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
587 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
588 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
592 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
593 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
595 /* finally, we can upload firmware now! */
596 remains = fw_entry->size;
597 data = fw_entry->data;
598 offset = ISL38XX_DEV_FIRMWARE_ADDR;
601 unsigned int block_len = min(remains, (unsigned int)512);
602 memcpy(buf, data, block_len);
604 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
606 printk(KERN_ERR "p54usb: firmware block upload "
611 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
612 cpu_to_le32(0xc0000f00));
614 P54U_WRITE(NET2280_DEV_U32,
615 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
616 P54U_WRITE(NET2280_DEV_U32,
617 0x0020 | (unsigned long)&devreg->direct_mem_win,
620 P54U_WRITE(NET2280_DEV_U32,
621 0x0024 | (unsigned long)&devreg->direct_mem_win,
622 cpu_to_le32(block_len));
623 P54U_WRITE(NET2280_DEV_U32,
624 0x0028 | (unsigned long)&devreg->direct_mem_win,
625 cpu_to_le32(offset));
627 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
628 cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
629 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
630 cpu_to_le32(block_len >> 2));
631 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
632 cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
636 P54U_READ(NET2280_DEV_U32,
637 0x002C | (unsigned long)&devreg->direct_mem_win);
638 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
639 !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
640 printk(KERN_ERR "p54usb: firmware DMA transfer "
645 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
646 cpu_to_le32(NET2280_FIFO_FLUSH));
648 remains -= block_len;
654 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
655 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
656 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
657 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
658 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
662 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
663 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
665 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
666 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
670 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
671 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
673 /* start up the firmware */
674 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
675 cpu_to_le32(ISL38XX_INT_IDENT_INIT));
677 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
678 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
680 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
681 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
682 NET2280_USB_INTERRUPT_ENABLE));
684 P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
685 cpu_to_le32(ISL38XX_DEV_INT_RESET));
687 err = usb_interrupt_msg(priv->udev,
688 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
689 buf, sizeof(__le32), &alen, 1000);
690 if (err || alen != sizeof(__le32))
693 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
694 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
696 if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
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));
707 release_firmware(fw_entry);
712 static int p54u_open(struct ieee80211_hw *dev)
714 struct p54u_priv *priv = dev->priv;
717 err = p54u_init_urbs(dev);
722 priv->common.open = p54u_init_urbs;
727 static void p54u_stop(struct ieee80211_hw *dev)
729 /* TODO: figure out how to reliably stop the 3887 and net2280 so
730 the hardware is still usable next time we want to start it.
731 until then, we just stop listening to the hardware.. */
736 static int __devinit p54u_probe(struct usb_interface *intf,
737 const struct usb_device_id *id)
739 struct usb_device *udev = interface_to_usbdev(intf);
740 struct ieee80211_hw *dev;
741 struct p54u_priv *priv;
743 unsigned int i, recognized_pipes;
744 DECLARE_MAC_BUF(mac);
746 dev = p54_init_common(sizeof(*priv));
748 printk(KERN_ERR "p54usb: ieee80211 alloc failed\n");
754 SET_IEEE80211_DEV(dev, &intf->dev);
755 usb_set_intfdata(intf, dev);
760 /* really lazy and simple way of figuring out if we're a 3887 */
761 /* TODO: should just stick the identification in the device table */
762 i = intf->altsetting->desc.bNumEndpoints;
763 recognized_pipes = 0;
765 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
770 case P54U_PIPE_DATA | USB_DIR_IN:
771 case P54U_PIPE_MGMT | USB_DIR_IN:
772 case P54U_PIPE_BRG | USB_DIR_IN:
773 case P54U_PIPE_DEV | USB_DIR_IN:
774 case P54U_PIPE_INT | USB_DIR_IN:
778 priv->common.open = p54u_open;
780 if (recognized_pipes < P54U_PIPE_NUMBER) {
781 priv->hw_type = P54U_3887;
782 priv->common.tx = p54u_tx_3887;
784 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
785 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
786 priv->common.tx = p54u_tx_net2280;
788 priv->common.stop = p54u_stop;
791 err = p54u_upload_firmware_3887(dev);
793 err = p54u_upload_firmware_net2280(dev);
797 skb_queue_head_init(&priv->rx_queue);
800 err = p54_read_eeprom(dev);
805 err = ieee80211_register_hw(dev);
807 printk(KERN_ERR "p54usb: Cannot register netdevice\n");
814 ieee80211_free_hw(dev);
815 usb_set_intfdata(intf, NULL);
820 static void __devexit p54u_disconnect(struct usb_interface *intf)
822 struct ieee80211_hw *dev = usb_get_intfdata(intf);
823 struct p54u_priv *priv;
828 ieee80211_unregister_hw(dev);
831 usb_put_dev(interface_to_usbdev(intf));
832 p54_free_common(dev);
833 ieee80211_free_hw(dev);
836 static struct usb_driver p54u_driver = {
838 .id_table = p54u_table,
840 .disconnect = p54u_disconnect,
843 static int __init p54u_init(void)
845 return usb_register(&p54u_driver);
848 static void __exit p54u_exit(void)
850 usb_deregister(&p54u_driver);
853 module_init(p54u_init);
854 module_exit(p54u_exit);