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(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
60 {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
61 {USB_DEVICE(0x0846, 0x4240)}, /* Netgear WG111 (v2) */
62 {USB_DEVICE(0x0915, 0x2000)}, /* Cohiba Proto board */
63 {USB_DEVICE(0x0915, 0x2002)}, /* Cohiba Proto board */
64 {USB_DEVICE(0x0baf, 0x0118)}, /* U.S. Robotics U5 802.11g Adapter*/
65 {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/
66 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */
67 {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */
68 {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */
69 {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */
70 {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */
71 {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */
72 {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */
73 {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
74 {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
75 {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
76 {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
80 MODULE_DEVICE_TABLE(usb, p54u_table);
82 static void p54u_rx_cb(struct urb *urb)
84 struct sk_buff *skb = (struct sk_buff *) urb->context;
85 struct p54u_rx_info *info = (struct p54u_rx_info *)skb->cb;
86 struct ieee80211_hw *dev = info->dev;
87 struct p54u_priv *priv = dev->priv;
89 if (unlikely(urb->status)) {
95 skb_unlink(skb, &priv->rx_queue);
96 skb_put(skb, urb->actual_length);
98 if (priv->hw_type == P54U_NET2280)
99 skb_pull(skb, priv->common.tx_hdr_len);
100 if (priv->common.fw_interface == FW_LM87) {
105 if (p54_rx(dev, skb)) {
106 skb = dev_alloc_skb(priv->common.rx_mtu + 32);
107 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);
118 skb_queue_tail(&priv->rx_queue, skb);
120 if (priv->hw_type == P54U_NET2280)
121 skb_push(skb, priv->common.tx_hdr_len);
122 if (priv->common.fw_interface == FW_LM87) {
126 skb_reset_tail_pointer(skb);
128 if (urb->transfer_buffer != skb_tail_pointer(skb)) {
129 /* this should not happen */
131 urb->transfer_buffer = skb_tail_pointer(skb);
134 skb_queue_tail(&priv->rx_queue, skb);
137 usb_submit_urb(urb, GFP_ATOMIC);
140 static void p54u_tx_reuse_skb_cb(struct urb *urb)
142 struct sk_buff *skb = urb->context;
143 struct p54u_priv *priv = (struct p54u_priv *)((struct ieee80211_hw *)
144 usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0)))->priv;
146 skb_pull(skb, priv->common.tx_hdr_len);
150 static void p54u_tx_cb(struct urb *urb)
155 static void p54u_tx_free_cb(struct urb *urb)
157 kfree(urb->transfer_buffer);
161 static void p54u_tx_free_skb_cb(struct urb *urb)
163 struct sk_buff *skb = urb->context;
164 struct ieee80211_hw *dev = (struct ieee80211_hw *)
165 usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
167 p54_free_skb(dev, skb);
171 static int p54u_init_urbs(struct ieee80211_hw *dev)
173 struct p54u_priv *priv = dev->priv;
176 struct p54u_rx_info *info;
178 while (skb_queue_len(&priv->rx_queue) < 32) {
179 skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
182 entry = usb_alloc_urb(0, GFP_KERNEL);
187 usb_fill_bulk_urb(entry, priv->udev,
188 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
189 skb_tail_pointer(skb),
190 priv->common.rx_mtu + 32, p54u_rx_cb, skb);
191 info = (struct p54u_rx_info *) skb->cb;
194 skb_queue_tail(&priv->rx_queue, skb);
195 usb_submit_urb(entry, GFP_KERNEL);
201 static void p54u_free_urbs(struct ieee80211_hw *dev)
203 struct p54u_priv *priv = dev->priv;
204 struct p54u_rx_info *info;
207 while ((skb = skb_dequeue(&priv->rx_queue))) {
208 info = (struct p54u_rx_info *) skb->cb;
212 usb_kill_urb(info->urb);
217 static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb,
220 struct p54u_priv *priv = dev->priv;
221 struct urb *addr_urb, *data_urb;
223 addr_urb = usb_alloc_urb(0, GFP_ATOMIC);
227 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
229 usb_free_urb(addr_urb);
233 usb_fill_bulk_urb(addr_urb, priv->udev,
234 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
235 &((struct p54_hdr *)skb->data)->req_id, 4,
237 usb_fill_bulk_urb(data_urb, priv->udev,
238 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
240 free_on_tx ? p54u_tx_free_skb_cb :
241 p54u_tx_reuse_skb_cb, skb);
243 usb_submit_urb(addr_urb, GFP_ATOMIC);
244 usb_submit_urb(data_urb, GFP_ATOMIC);
247 static __le32 p54u_lm87_chksum(const u32 *data, size_t length)
254 chk = (chk >> 5) ^ (chk << 3);
257 return cpu_to_le32(chk);
260 static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb,
263 struct p54u_priv *priv = dev->priv;
264 struct urb *data_urb;
265 struct lm87_tx_hdr *hdr;
267 __le32 addr = ((struct p54_hdr *)skb->data)->req_id;
269 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
273 checksum = p54u_lm87_chksum((u32 *)skb->data, skb->len);
274 hdr = (struct lm87_tx_hdr *)skb_push(skb, sizeof(*hdr));
275 hdr->chksum = checksum;
276 hdr->device_addr = addr;
278 usb_fill_bulk_urb(data_urb, priv->udev,
279 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
281 free_on_tx ? p54u_tx_free_skb_cb :
282 p54u_tx_reuse_skb_cb, skb);
284 usb_submit_urb(data_urb, GFP_ATOMIC);
287 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb,
290 struct p54u_priv *priv = dev->priv;
291 struct urb *int_urb, *data_urb;
292 struct net2280_tx_hdr *hdr;
293 struct net2280_reg_write *reg;
295 reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
299 int_urb = usb_alloc_urb(0, GFP_ATOMIC);
305 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
308 usb_free_urb(int_urb);
312 reg->port = cpu_to_le16(NET2280_DEV_U32);
313 reg->addr = cpu_to_le32(P54U_DEV_BASE);
314 reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
316 hdr = (void *)skb_push(skb, sizeof(*hdr));
317 memset(hdr, 0, sizeof(*hdr));
318 hdr->device_addr = ((struct p54_hdr *)skb->data)->req_id;
319 hdr->len = cpu_to_le16(skb->len + sizeof(struct p54_hdr));
321 usb_fill_bulk_urb(int_urb, priv->udev,
322 usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
323 p54u_tx_free_cb, dev);
324 usb_submit_urb(int_urb, GFP_ATOMIC);
326 usb_fill_bulk_urb(data_urb, priv->udev,
327 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
329 free_on_tx ? p54u_tx_free_skb_cb :
330 p54u_tx_reuse_skb_cb, skb);
331 usb_submit_urb(data_urb, GFP_ATOMIC);
334 static int p54u_write(struct p54u_priv *priv,
335 struct net2280_reg_write *buf,
336 enum net2280_op_type type,
337 __le32 addr, __le32 val)
343 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
345 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
347 buf->port = cpu_to_le16(type);
351 return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
354 static int p54u_read(struct p54u_priv *priv, void *buf,
355 enum net2280_op_type type,
356 __le32 addr, __le32 *val)
358 struct net2280_reg_read *read = buf;
368 read->port = cpu_to_le16(type);
371 err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
372 read, sizeof(*read), &alen, 1000);
376 err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
377 reg, sizeof(*reg), &alen, 1000);
385 static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
386 void *data, size_t len)
389 return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
390 data, len, &alen, 2000);
393 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
395 static char start_string[] = "~~~~<\r";
396 struct p54u_priv *priv = dev->priv;
397 const struct firmware *fw_entry = NULL;
402 unsigned int left, remains, block_size;
403 struct x2_header *hdr;
404 unsigned long timeout;
406 tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
408 printk(KERN_ERR "p54usb: cannot allocate firmware upload buffer!\n");
413 memcpy(buf, start_string, 4);
414 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 4);
416 printk(KERN_ERR "p54usb: reset failed! (%d)\n", err);
420 err = request_firmware(&fw_entry, "isl3887usb", &priv->udev->dev);
422 printk(KERN_ERR "p54usb: cannot find firmware (isl3887usb)\n");
423 err = request_firmware(&fw_entry, "isl3887usb_bare",
426 goto err_req_fw_failed;
429 err = p54_parse_firmware(dev, fw_entry);
431 goto err_upload_failed;
433 left = block_size = min((size_t)P54U_FW_BLOCK, fw_entry->size);
434 strcpy(buf, start_string);
435 left -= strlen(start_string);
436 tmp += strlen(start_string);
438 data = fw_entry->data;
439 remains = fw_entry->size;
441 hdr = (struct x2_header *)(buf + strlen(start_string));
442 memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
443 hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
444 hdr->fw_length = cpu_to_le32(fw_entry->size);
445 hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
447 left -= sizeof(*hdr);
475 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
477 printk(KERN_ERR "p54usb: firmware upload failed!\n");
478 goto err_upload_failed;
482 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
485 *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, fw_entry->data, fw_entry->size));
486 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
488 printk(KERN_ERR "p54usb: firmware upload failed!\n");
489 goto err_upload_failed;
492 timeout = jiffies + msecs_to_jiffies(1000);
493 while (!(err = usb_bulk_msg(priv->udev,
494 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
495 if (alen > 2 && !memcmp(buf, "OK", 2))
498 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
499 printk(KERN_INFO "p54usb: firmware upload failed!\n");
504 if (time_after(jiffies, timeout)) {
505 printk(KERN_ERR "p54usb: firmware boot timed out!\n");
511 goto err_upload_failed;
515 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
517 printk(KERN_ERR "p54usb: firmware boot failed!\n");
518 goto err_upload_failed;
521 timeout = jiffies + msecs_to_jiffies(1000);
522 while (!(err = usb_bulk_msg(priv->udev,
523 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
524 if (alen > 0 && buf[0] == 'g')
527 if (time_after(jiffies, timeout)) {
533 goto err_upload_failed;
536 release_firmware(fw_entry);
544 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
546 struct p54u_priv *priv = dev->priv;
547 const struct firmware *fw_entry = NULL;
548 const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
552 unsigned int remains, offset;
555 buf = kmalloc(512, GFP_KERNEL);
557 printk(KERN_ERR "p54usb: firmware buffer alloc failed!\n");
561 err = request_firmware(&fw_entry, "isl3886usb", &priv->udev->dev);
563 printk(KERN_ERR "p54usb: cannot find firmware (isl3886usb)\n");
564 err = request_firmware(&fw_entry, "isl3890usb",
572 err = p54_parse_firmware(dev, fw_entry);
575 release_firmware(fw_entry);
579 #define P54U_WRITE(type, addr, data) \
581 err = p54u_write(priv, buf, type,\
582 cpu_to_le32((u32)(unsigned long)addr), data);\
587 #define P54U_READ(type, addr) \
589 err = p54u_read(priv, buf, type,\
590 cpu_to_le32((u32)(unsigned long)addr), ®);\
595 /* power down net2280 bridge */
596 P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
597 reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
598 reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
599 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
603 /* power up bridge */
604 reg |= cpu_to_le32(P54U_BRG_POWER_UP);
605 reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
606 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
610 P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
611 cpu_to_le32(NET2280_CLK_30Mhz |
613 NET2280_PCI_SOFT_RESET));
617 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
618 cpu_to_le32(PCI_COMMAND_MEMORY |
619 PCI_COMMAND_MASTER));
621 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
622 cpu_to_le32(NET2280_BASE));
624 P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
625 reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
626 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
628 // TODO: we really need this?
629 P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
631 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
632 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
633 P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
634 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
636 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
637 cpu_to_le32(NET2280_BASE2));
639 /* finally done setting up the bridge */
641 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
642 cpu_to_le32(PCI_COMMAND_MEMORY |
643 PCI_COMMAND_MASTER));
645 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
646 P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
647 cpu_to_le32(P54U_DEV_BASE));
649 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
650 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
651 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
654 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
656 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
657 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
658 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
659 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
660 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
664 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
665 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
669 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
670 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
674 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
675 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
677 /* finally, we can upload firmware now! */
678 remains = fw_entry->size;
679 data = fw_entry->data;
680 offset = ISL38XX_DEV_FIRMWARE_ADDR;
683 unsigned int block_len = min(remains, (unsigned int)512);
684 memcpy(buf, data, block_len);
686 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
688 printk(KERN_ERR "p54usb: firmware block upload "
693 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
694 cpu_to_le32(0xc0000f00));
696 P54U_WRITE(NET2280_DEV_U32,
697 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
698 P54U_WRITE(NET2280_DEV_U32,
699 0x0020 | (unsigned long)&devreg->direct_mem_win,
702 P54U_WRITE(NET2280_DEV_U32,
703 0x0024 | (unsigned long)&devreg->direct_mem_win,
704 cpu_to_le32(block_len));
705 P54U_WRITE(NET2280_DEV_U32,
706 0x0028 | (unsigned long)&devreg->direct_mem_win,
707 cpu_to_le32(offset));
709 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
710 cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
711 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
712 cpu_to_le32(block_len >> 2));
713 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
714 cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
718 P54U_READ(NET2280_DEV_U32,
719 0x002C | (unsigned long)&devreg->direct_mem_win);
720 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
721 !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
722 printk(KERN_ERR "p54usb: firmware DMA transfer "
727 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
728 cpu_to_le32(NET2280_FIFO_FLUSH));
730 remains -= block_len;
736 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
737 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
738 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
739 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
740 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
744 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
745 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
747 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
748 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
752 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
753 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
755 /* start up the firmware */
756 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
757 cpu_to_le32(ISL38XX_INT_IDENT_INIT));
759 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
760 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
762 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
763 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
764 NET2280_USB_INTERRUPT_ENABLE));
766 P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
767 cpu_to_le32(ISL38XX_DEV_INT_RESET));
769 err = usb_interrupt_msg(priv->udev,
770 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
771 buf, sizeof(__le32), &alen, 1000);
772 if (err || alen != sizeof(__le32))
775 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
776 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
778 if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
781 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
782 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
783 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
789 release_firmware(fw_entry);
794 static int p54u_open(struct ieee80211_hw *dev)
796 struct p54u_priv *priv = dev->priv;
799 err = p54u_init_urbs(dev);
804 priv->common.open = p54u_init_urbs;
809 static void p54u_stop(struct ieee80211_hw *dev)
811 /* TODO: figure out how to reliably stop the 3887 and net2280 so
812 the hardware is still usable next time we want to start it.
813 until then, we just stop listening to the hardware.. */
818 static int __devinit p54u_probe(struct usb_interface *intf,
819 const struct usb_device_id *id)
821 struct usb_device *udev = interface_to_usbdev(intf);
822 struct ieee80211_hw *dev;
823 struct p54u_priv *priv;
825 unsigned int i, recognized_pipes;
827 dev = p54_init_common(sizeof(*priv));
829 printk(KERN_ERR "p54usb: ieee80211 alloc failed\n");
835 SET_IEEE80211_DEV(dev, &intf->dev);
836 usb_set_intfdata(intf, dev);
841 /* really lazy and simple way of figuring out if we're a 3887 */
842 /* TODO: should just stick the identification in the device table */
843 i = intf->altsetting->desc.bNumEndpoints;
844 recognized_pipes = 0;
846 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
851 case P54U_PIPE_DATA | USB_DIR_IN:
852 case P54U_PIPE_MGMT | USB_DIR_IN:
853 case P54U_PIPE_BRG | USB_DIR_IN:
854 case P54U_PIPE_DEV | USB_DIR_IN:
855 case P54U_PIPE_INT | USB_DIR_IN:
859 priv->common.open = p54u_open;
860 priv->common.stop = p54u_stop;
861 if (recognized_pipes < P54U_PIPE_NUMBER) {
862 priv->hw_type = P54U_3887;
863 err = p54u_upload_firmware_3887(dev);
864 if (priv->common.fw_interface == FW_LM87) {
865 dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
866 priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
867 priv->common.tx = p54u_tx_lm87;
869 priv->common.tx = p54u_tx_3887;
871 priv->hw_type = P54U_NET2280;
872 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
873 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
874 priv->common.tx = p54u_tx_net2280;
875 err = p54u_upload_firmware_net2280(dev);
880 skb_queue_head_init(&priv->rx_queue);
883 err = p54_read_eeprom(dev);
888 err = ieee80211_register_hw(dev);
890 printk(KERN_ERR "p54usb: Cannot register netdevice\n");
897 ieee80211_free_hw(dev);
898 usb_set_intfdata(intf, NULL);
903 static void __devexit p54u_disconnect(struct usb_interface *intf)
905 struct ieee80211_hw *dev = usb_get_intfdata(intf);
906 struct p54u_priv *priv;
911 ieee80211_unregister_hw(dev);
914 usb_put_dev(interface_to_usbdev(intf));
915 p54_free_common(dev);
916 ieee80211_free_hw(dev);
919 static struct usb_driver p54u_driver = {
921 .id_table = p54u_table,
923 .disconnect = p54u_disconnect,
926 static int __init p54u_init(void)
928 return usb_register(&p54u_driver);
931 static void __exit p54u_exit(void)
933 usb_deregister(&p54u_driver);
936 module_init(p54u_init);
937 module_exit(p54u_exit);