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_read_eeprom(struct ieee80211_hw *dev)
320 struct p54u_priv *priv = dev->priv;
322 struct p54_control_hdr *hdr;
324 size_t offset = priv->hw_type ? 0x10 : 0x20;
326 buf = kmalloc(0x2020, GFP_KERNEL);
328 printk(KERN_ERR "p54usb: cannot allocate memory for "
329 "eeprom readback!\n");
334 *((u32 *) buf) = priv->common.rx_start;
335 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
337 printk(KERN_ERR "p54usb: addr send failed\n");
341 struct net2280_reg_write *reg = buf;
342 reg->port = cpu_to_le16(NET2280_DEV_U32);
343 reg->addr = cpu_to_le32(P54U_DEV_BASE);
344 reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
345 err = p54u_bulk_msg(priv, P54U_PIPE_DEV, buf, sizeof(*reg));
347 printk(KERN_ERR "p54usb: dev_int send failed\n");
352 hdr = buf + priv->common.tx_hdr_len;
353 p54_fill_eeprom_readback(hdr);
354 hdr->req_id = cpu_to_le32(priv->common.rx_start);
355 if (priv->common.tx_hdr_len) {
356 struct net2280_tx_hdr *tx_hdr = buf;
357 tx_hdr->device_addr = hdr->req_id;
358 tx_hdr->len = cpu_to_le16(EEPROM_READBACK_LEN);
361 /* we can just pretend to send 0x2000 bytes of nothing in the headers */
362 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf,
363 EEPROM_READBACK_LEN + priv->common.tx_hdr_len);
365 printk(KERN_ERR "p54usb: eeprom req send failed\n");
369 err = usb_bulk_msg(priv->udev,
370 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
371 buf, 0x2020, &alen, 1000);
372 if (!err && alen > offset) {
373 p54_parse_eeprom(dev, (u8 *)buf + offset, alen - offset);
375 printk(KERN_ERR "p54usb: eeprom read failed!\n");
385 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
387 static char start_string[] = "~~~~<\r";
388 struct p54u_priv *priv = dev->priv;
389 const struct firmware *fw_entry = NULL;
394 unsigned int left, remains, block_size;
395 struct x2_header *hdr;
396 unsigned long timeout;
398 tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
400 printk(KERN_ERR "p54usb: cannot allocate firmware upload buffer!\n");
405 memcpy(buf, start_string, 4);
406 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 4);
408 printk(KERN_ERR "p54usb: reset failed! (%d)\n", err);
412 err = request_firmware(&fw_entry, "isl3887usb_bare", &priv->udev->dev);
414 printk(KERN_ERR "p54usb: cannot find firmware (isl3887usb_bare)!\n");
415 goto err_req_fw_failed;
418 err = p54_parse_firmware(dev, fw_entry);
420 goto err_upload_failed;
422 left = block_size = min((size_t)P54U_FW_BLOCK, fw_entry->size);
423 strcpy(buf, start_string);
424 left -= strlen(start_string);
425 tmp += strlen(start_string);
427 data = fw_entry->data;
428 remains = fw_entry->size;
430 hdr = (struct x2_header *)(buf + strlen(start_string));
431 memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
432 hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
433 hdr->fw_length = cpu_to_le32(fw_entry->size);
434 hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
436 left -= sizeof(*hdr);
464 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
466 printk(KERN_ERR "p54usb: firmware upload failed!\n");
467 goto err_upload_failed;
471 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
474 *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, fw_entry->data, fw_entry->size));
475 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
477 printk(KERN_ERR "p54usb: firmware upload failed!\n");
478 goto err_upload_failed;
481 timeout = jiffies + msecs_to_jiffies(1000);
482 while (!(err = usb_bulk_msg(priv->udev,
483 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
484 if (alen > 2 && !memcmp(buf, "OK", 2))
487 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
488 printk(KERN_INFO "p54usb: firmware upload failed!\n");
493 if (time_after(jiffies, timeout)) {
494 printk(KERN_ERR "p54usb: firmware boot timed out!\n");
500 goto err_upload_failed;
504 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
506 printk(KERN_ERR "p54usb: firmware boot failed!\n");
507 goto err_upload_failed;
510 timeout = jiffies + msecs_to_jiffies(1000);
511 while (!(err = usb_bulk_msg(priv->udev,
512 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
513 if (alen > 0 && buf[0] == 'g')
516 if (time_after(jiffies, timeout)) {
522 goto err_upload_failed;
525 release_firmware(fw_entry);
533 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
535 struct p54u_priv *priv = dev->priv;
536 const struct firmware *fw_entry = NULL;
537 const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
541 unsigned int remains, offset;
544 buf = kmalloc(512, GFP_KERNEL);
546 printk(KERN_ERR "p54usb: firmware buffer alloc failed!\n");
550 err = request_firmware(&fw_entry, "isl3890usb", &priv->udev->dev);
552 printk(KERN_ERR "p54usb: cannot find firmware (isl3890usb)!\n");
557 err = p54_parse_firmware(dev, fw_entry);
560 release_firmware(fw_entry);
564 #define P54U_WRITE(type, addr, data) \
566 err = p54u_write(priv, buf, type,\
567 cpu_to_le32((u32)(unsigned long)addr), data);\
572 #define P54U_READ(type, addr) \
574 err = p54u_read(priv, buf, type,\
575 cpu_to_le32((u32)(unsigned long)addr), ®);\
580 /* power down net2280 bridge */
581 P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
582 reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
583 reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
584 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
588 /* power up bridge */
589 reg |= cpu_to_le32(P54U_BRG_POWER_UP);
590 reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
591 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
595 P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
596 cpu_to_le32(NET2280_CLK_30Mhz |
598 NET2280_PCI_SOFT_RESET));
602 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
603 cpu_to_le32(PCI_COMMAND_MEMORY |
604 PCI_COMMAND_MASTER));
606 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
607 cpu_to_le32(NET2280_BASE));
609 P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
610 reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
611 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
613 // TODO: we really need this?
614 P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
616 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
617 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
618 P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
619 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
621 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
622 cpu_to_le32(NET2280_BASE2));
624 /* finally done setting up the bridge */
626 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
627 cpu_to_le32(PCI_COMMAND_MEMORY |
628 PCI_COMMAND_MASTER));
630 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
631 P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
632 cpu_to_le32(P54U_DEV_BASE));
634 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
635 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
636 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
639 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
641 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
642 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
643 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
644 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
645 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
649 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
650 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
654 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
655 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
659 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
660 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
662 /* finally, we can upload firmware now! */
663 remains = fw_entry->size;
664 data = fw_entry->data;
665 offset = ISL38XX_DEV_FIRMWARE_ADDR;
668 unsigned int block_len = min(remains, (unsigned int)512);
669 memcpy(buf, data, block_len);
671 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
673 printk(KERN_ERR "p54usb: firmware block upload "
678 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
679 cpu_to_le32(0xc0000f00));
681 P54U_WRITE(NET2280_DEV_U32,
682 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
683 P54U_WRITE(NET2280_DEV_U32,
684 0x0020 | (unsigned long)&devreg->direct_mem_win,
687 P54U_WRITE(NET2280_DEV_U32,
688 0x0024 | (unsigned long)&devreg->direct_mem_win,
689 cpu_to_le32(block_len));
690 P54U_WRITE(NET2280_DEV_U32,
691 0x0028 | (unsigned long)&devreg->direct_mem_win,
692 cpu_to_le32(offset));
694 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
695 cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
696 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
697 cpu_to_le32(block_len >> 2));
698 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
699 cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
703 P54U_READ(NET2280_DEV_U32,
704 0x002C | (unsigned long)&devreg->direct_mem_win);
705 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
706 !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
707 printk(KERN_ERR "p54usb: firmware DMA transfer "
712 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
713 cpu_to_le32(NET2280_FIFO_FLUSH));
715 remains -= block_len;
721 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
722 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
723 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
724 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
725 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
729 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
730 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
732 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
733 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
737 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
738 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
740 /* start up the firmware */
741 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
742 cpu_to_le32(ISL38XX_INT_IDENT_INIT));
744 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
745 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
747 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
748 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
749 NET2280_USB_INTERRUPT_ENABLE));
751 P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
752 cpu_to_le32(ISL38XX_DEV_INT_RESET));
754 err = usb_interrupt_msg(priv->udev,
755 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
756 buf, sizeof(__le32), &alen, 1000);
757 if (err || alen != sizeof(__le32))
760 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
761 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
763 if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
766 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
767 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
768 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
774 release_firmware(fw_entry);
779 static int p54u_open(struct ieee80211_hw *dev)
781 struct p54u_priv *priv = dev->priv;
784 err = p54u_init_urbs(dev);
789 priv->common.open = p54u_init_urbs;
794 static void p54u_stop(struct ieee80211_hw *dev)
796 /* TODO: figure out how to reliably stop the 3887 and net2280 so
797 the hardware is still usable next time we want to start it.
798 until then, we just stop listening to the hardware.. */
803 static int __devinit p54u_probe(struct usb_interface *intf,
804 const struct usb_device_id *id)
806 struct usb_device *udev = interface_to_usbdev(intf);
807 struct ieee80211_hw *dev;
808 struct p54u_priv *priv;
810 unsigned int i, recognized_pipes;
811 DECLARE_MAC_BUF(mac);
813 dev = p54_init_common(sizeof(*priv));
815 printk(KERN_ERR "p54usb: ieee80211 alloc failed\n");
821 SET_IEEE80211_DEV(dev, &intf->dev);
822 usb_set_intfdata(intf, dev);
827 /* really lazy and simple way of figuring out if we're a 3887 */
828 /* TODO: should just stick the identification in the device table */
829 i = intf->altsetting->desc.bNumEndpoints;
830 recognized_pipes = 0;
832 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
837 case P54U_PIPE_DATA | USB_DIR_IN:
838 case P54U_PIPE_MGMT | USB_DIR_IN:
839 case P54U_PIPE_BRG | USB_DIR_IN:
840 case P54U_PIPE_DEV | USB_DIR_IN:
841 case P54U_PIPE_INT | USB_DIR_IN:
845 priv->common.open = p54u_open;
847 if (recognized_pipes < P54U_PIPE_NUMBER) {
848 priv->hw_type = P54U_3887;
849 priv->common.tx = p54u_tx_3887;
851 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
852 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
853 priv->common.tx = p54u_tx_net2280;
855 priv->common.stop = p54u_stop;
858 err = p54u_upload_firmware_3887(dev);
860 err = p54u_upload_firmware_net2280(dev);
864 err = p54u_read_eeprom(dev);
868 if (!is_valid_ether_addr(dev->wiphy->perm_addr)) {
869 u8 perm_addr[ETH_ALEN];
871 printk(KERN_WARNING "p54usb: Invalid hwaddr! Using randomly generated MAC addr\n");
872 random_ether_addr(perm_addr);
873 SET_IEEE80211_PERM_ADDR(dev, perm_addr);
876 skb_queue_head_init(&priv->rx_queue);
878 err = ieee80211_register_hw(dev);
880 printk(KERN_ERR "p54usb: Cannot register netdevice\n");
884 printk(KERN_INFO "%s: hwaddr %s, isl38%02x\n",
885 wiphy_name(dev->wiphy),
886 print_mac(mac, dev->wiphy->perm_addr),
887 priv->common.version);
892 ieee80211_free_hw(dev);
893 usb_set_intfdata(intf, NULL);
898 static void __devexit p54u_disconnect(struct usb_interface *intf)
900 struct ieee80211_hw *dev = usb_get_intfdata(intf);
901 struct p54u_priv *priv;
906 ieee80211_unregister_hw(dev);
909 usb_put_dev(interface_to_usbdev(intf));
910 p54_free_common(dev);
911 ieee80211_free_hw(dev);
914 static struct usb_driver p54u_driver = {
916 .id_table = p54u_table,
918 .disconnect = p54u_disconnect,
921 static int __init p54u_init(void)
923 return usb_register(&p54u_driver);
926 static void __exit p54u_exit(void)
928 usb_deregister(&p54u_driver);
931 module_init(p54u_init);
932 module_exit(p54u_exit);