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(MAX_RX_SIZE);
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_queue_tail(&priv->rx_queue, skb);
116 usb_submit_urb(urb, GFP_ATOMIC);
119 static void p54u_tx_cb(struct urb *urb)
124 static void p54u_tx_free_cb(struct urb *urb)
126 kfree(urb->transfer_buffer);
130 static int p54u_init_urbs(struct ieee80211_hw *dev)
132 struct p54u_priv *priv = dev->priv;
135 struct p54u_rx_info *info;
137 while (skb_queue_len(&priv->rx_queue) < 32) {
138 skb = __dev_alloc_skb(MAX_RX_SIZE, GFP_KERNEL);
141 entry = usb_alloc_urb(0, GFP_KERNEL);
146 usb_fill_bulk_urb(entry, priv->udev, usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), skb_tail_pointer(skb), MAX_RX_SIZE, p54u_rx_cb, skb);
147 info = (struct p54u_rx_info *) skb->cb;
150 skb_queue_tail(&priv->rx_queue, skb);
151 usb_submit_urb(entry, GFP_KERNEL);
157 static void p54u_free_urbs(struct ieee80211_hw *dev)
159 struct p54u_priv *priv = dev->priv;
160 struct p54u_rx_info *info;
163 while ((skb = skb_dequeue(&priv->rx_queue))) {
164 info = (struct p54u_rx_info *) skb->cb;
168 usb_kill_urb(info->urb);
173 static void p54u_tx_3887(struct ieee80211_hw *dev, struct p54_control_hdr *data,
174 size_t len, int free_on_tx)
176 struct p54u_priv *priv = dev->priv;
177 struct urb *addr_urb, *data_urb;
179 addr_urb = usb_alloc_urb(0, GFP_ATOMIC);
183 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
185 usb_free_urb(addr_urb);
189 usb_fill_bulk_urb(addr_urb, priv->udev,
190 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), &data->req_id,
191 sizeof(data->req_id), p54u_tx_cb, dev);
192 usb_fill_bulk_urb(data_urb, priv->udev,
193 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), data, len,
194 free_on_tx ? p54u_tx_free_cb : p54u_tx_cb, dev);
196 usb_submit_urb(addr_urb, GFP_ATOMIC);
197 usb_submit_urb(data_urb, GFP_ATOMIC);
200 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct p54_control_hdr *data,
201 size_t len, int free_on_tx)
203 struct p54u_priv *priv = dev->priv;
204 struct urb *int_urb, *data_urb;
205 struct net2280_tx_hdr *hdr;
206 struct net2280_reg_write *reg;
208 reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
212 int_urb = usb_alloc_urb(0, GFP_ATOMIC);
218 data_urb = usb_alloc_urb(0, GFP_ATOMIC);
221 usb_free_urb(int_urb);
225 reg->port = cpu_to_le16(NET2280_DEV_U32);
226 reg->addr = cpu_to_le32(P54U_DEV_BASE);
227 reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
229 len += sizeof(*data);
230 hdr = (void *)data - sizeof(*hdr);
231 memset(hdr, 0, sizeof(*hdr));
232 hdr->device_addr = data->req_id;
233 hdr->len = cpu_to_le16(len);
235 usb_fill_bulk_urb(int_urb, priv->udev,
236 usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
237 p54u_tx_free_cb, dev);
238 usb_submit_urb(int_urb, GFP_ATOMIC);
240 usb_fill_bulk_urb(data_urb, priv->udev,
241 usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), hdr, len + sizeof(*hdr),
242 free_on_tx ? p54u_tx_free_cb : p54u_tx_cb, dev);
243 usb_submit_urb(data_urb, GFP_ATOMIC);
246 static int p54u_write(struct p54u_priv *priv,
247 struct net2280_reg_write *buf,
248 enum net2280_op_type type,
249 __le32 addr, __le32 val)
255 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
257 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
259 buf->port = cpu_to_le16(type);
263 return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
266 static int p54u_read(struct p54u_priv *priv, void *buf,
267 enum net2280_op_type type,
268 __le32 addr, __le32 *val)
270 struct net2280_reg_read *read = buf;
280 read->port = cpu_to_le16(type);
283 err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
284 read, sizeof(*read), &alen, 1000);
288 err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
289 reg, sizeof(*reg), &alen, 1000);
297 static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
298 void *data, size_t len)
301 return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
302 data, len, &alen, 2000);
305 static int p54u_read_eeprom(struct ieee80211_hw *dev)
307 struct p54u_priv *priv = dev->priv;
309 struct p54_control_hdr *hdr;
311 size_t offset = priv->hw_type ? 0x10 : 0x20;
313 buf = kmalloc(0x2020, GFP_KERNEL);
315 printk(KERN_ERR "prism54usb: cannot allocate memory for "
316 "eeprom readback!\n");
321 *((u32 *) buf) = priv->common.rx_start;
322 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
324 printk(KERN_ERR "prism54usb: addr send failed\n");
328 struct net2280_reg_write *reg = buf;
329 reg->port = cpu_to_le16(NET2280_DEV_U32);
330 reg->addr = cpu_to_le32(P54U_DEV_BASE);
331 reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
332 err = p54u_bulk_msg(priv, P54U_PIPE_DEV, buf, sizeof(*reg));
334 printk(KERN_ERR "prism54usb: dev_int send failed\n");
339 hdr = buf + priv->common.tx_hdr_len;
340 p54_fill_eeprom_readback(hdr);
341 hdr->req_id = cpu_to_le32(priv->common.rx_start);
342 if (priv->common.tx_hdr_len) {
343 struct net2280_tx_hdr *tx_hdr = buf;
344 tx_hdr->device_addr = hdr->req_id;
345 tx_hdr->len = cpu_to_le16(EEPROM_READBACK_LEN);
348 /* we can just pretend to send 0x2000 bytes of nothing in the headers */
349 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf,
350 EEPROM_READBACK_LEN + priv->common.tx_hdr_len);
352 printk(KERN_ERR "prism54usb: eeprom req send failed\n");
356 err = usb_bulk_msg(priv->udev,
357 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
358 buf, 0x2020, &alen, 1000);
359 if (!err && alen > offset) {
360 p54_parse_eeprom(dev, (u8 *)buf + offset, alen - offset);
362 printk(KERN_ERR "prism54usb: eeprom read failed!\n");
372 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
374 static char start_string[] = "~~~~<\r";
375 struct p54u_priv *priv = dev->priv;
376 const struct firmware *fw_entry = NULL;
379 u8 *buf, *tmp, *data;
380 unsigned int left, remains, block_size;
381 struct x2_header *hdr;
382 unsigned long timeout;
384 tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
386 printk(KERN_ERR "p54usb: cannot allocate firmware upload buffer!\n");
391 memcpy(buf, start_string, 4);
392 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 4);
394 printk(KERN_ERR "p54usb: reset failed! (%d)\n", err);
398 err = request_firmware(&fw_entry, "isl3887usb_bare", &priv->udev->dev);
400 printk(KERN_ERR "p54usb: cannot find firmware (isl3887usb_bare)!\n");
401 goto err_req_fw_failed;
404 p54_parse_firmware(dev, fw_entry);
406 left = block_size = min((size_t)P54U_FW_BLOCK, fw_entry->size);
407 strcpy(buf, start_string);
408 left -= strlen(start_string);
409 tmp += strlen(start_string);
411 data = fw_entry->data;
412 remains = fw_entry->size;
414 hdr = (struct x2_header *)(buf + strlen(start_string));
415 memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
416 hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
417 hdr->fw_length = cpu_to_le32(fw_entry->size);
418 hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
420 left -= sizeof(*hdr);
448 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
450 printk(KERN_ERR "prism54usb: firmware upload failed!\n");
451 goto err_upload_failed;
455 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
458 *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, fw_entry->data, fw_entry->size));
459 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
461 printk(KERN_ERR "prism54usb: firmware upload failed!\n");
462 goto err_upload_failed;
465 timeout = jiffies + msecs_to_jiffies(1000);
466 while (!(err = usb_bulk_msg(priv->udev,
467 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
468 if (alen > 2 && !memcmp(buf, "OK", 2))
471 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
472 printk(KERN_INFO "prism54usb: firmware upload failed!\n");
477 if (time_after(jiffies, timeout)) {
478 printk(KERN_ERR "prism54usb: firmware boot timed out!\n");
484 goto err_upload_failed;
488 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
490 printk(KERN_ERR "prism54usb: firmware boot failed!\n");
491 goto err_upload_failed;
494 timeout = jiffies + msecs_to_jiffies(1000);
495 while (!(err = usb_bulk_msg(priv->udev,
496 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
497 if (alen > 0 && buf[0] == 'g')
500 if (time_after(jiffies, timeout)) {
506 goto err_upload_failed;
509 release_firmware(fw_entry);
517 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
519 struct p54u_priv *priv = dev->priv;
520 const struct firmware *fw_entry = NULL;
521 const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
525 unsigned int remains, offset;
528 buf = kmalloc(512, GFP_KERNEL);
530 printk(KERN_ERR "p54usb: firmware buffer alloc failed!\n");
534 err = request_firmware(&fw_entry, "isl3890usb", &priv->udev->dev);
536 printk(KERN_ERR "p54usb: cannot find firmware (isl3890usb)!\n");
541 p54_parse_firmware(dev, fw_entry);
543 #define P54U_WRITE(type, addr, data) \
545 err = p54u_write(priv, buf, type,\
546 cpu_to_le32((u32)(unsigned long)addr), data);\
551 #define P54U_READ(type, addr) \
553 err = p54u_read(priv, buf, type,\
554 cpu_to_le32((u32)(unsigned long)addr), ®);\
559 /* power down net2280 bridge */
560 P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
561 reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
562 reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
563 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
567 /* power up bridge */
568 reg |= cpu_to_le32(P54U_BRG_POWER_UP);
569 reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
570 P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
574 P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
575 cpu_to_le32(NET2280_CLK_30Mhz |
577 NET2280_PCI_SOFT_RESET));
581 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
582 cpu_to_le32(PCI_COMMAND_MEMORY |
583 PCI_COMMAND_MASTER));
585 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
586 cpu_to_le32(NET2280_BASE));
588 P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
589 reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
590 P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
592 // TODO: we really need this?
593 P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
595 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
596 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
597 P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
598 cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
600 P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
601 cpu_to_le32(NET2280_BASE2));
603 /* finally done setting up the bridge */
605 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
606 cpu_to_le32(PCI_COMMAND_MEMORY |
607 PCI_COMMAND_MASTER));
609 P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
610 P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
611 cpu_to_le32(P54U_DEV_BASE));
613 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
614 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
615 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
618 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
620 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
621 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
622 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
623 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
624 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
628 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
629 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
633 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
634 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
638 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
639 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
641 /* finally, we can upload firmware now! */
642 remains = fw_entry->size;
643 data = fw_entry->data;
644 offset = ISL38XX_DEV_FIRMWARE_ADDR;
647 unsigned int block_len = min(remains, (unsigned int)512);
648 memcpy(buf, data, block_len);
650 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
652 printk(KERN_ERR "prism54usb: firmware block upload "
657 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
658 cpu_to_le32(0xc0000f00));
660 P54U_WRITE(NET2280_DEV_U32,
661 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
662 P54U_WRITE(NET2280_DEV_U32,
663 0x0020 | (unsigned long)&devreg->direct_mem_win,
666 P54U_WRITE(NET2280_DEV_U32,
667 0x0024 | (unsigned long)&devreg->direct_mem_win,
668 cpu_to_le32(block_len));
669 P54U_WRITE(NET2280_DEV_U32,
670 0x0028 | (unsigned long)&devreg->direct_mem_win,
671 cpu_to_le32(offset));
673 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
674 cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
675 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
676 cpu_to_le32(block_len >> 2));
677 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
678 cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
682 P54U_READ(NET2280_DEV_U32,
683 0x002C | (unsigned long)&devreg->direct_mem_win);
684 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
685 !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
686 printk(KERN_ERR "prism54usb: firmware DMA transfer "
691 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
692 cpu_to_le32(NET2280_FIFO_FLUSH));
694 remains -= block_len;
700 P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
701 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
702 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
703 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
704 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
708 reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
709 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
711 reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
712 P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
716 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
717 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
719 /* start up the firmware */
720 P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
721 cpu_to_le32(ISL38XX_INT_IDENT_INIT));
723 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
724 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
726 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
727 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
728 NET2280_USB_INTERRUPT_ENABLE));
730 P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
731 cpu_to_le32(ISL38XX_DEV_INT_RESET));
733 err = usb_interrupt_msg(priv->udev,
734 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
735 buf, sizeof(__le32), &alen, 1000);
736 if (err || alen != sizeof(__le32))
739 P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
740 P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
742 if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
745 P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
746 P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
747 cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
753 release_firmware(fw_entry);
758 static int p54u_open(struct ieee80211_hw *dev)
760 struct p54u_priv *priv = dev->priv;
763 err = p54u_init_urbs(dev);
768 priv->common.open = p54u_init_urbs;
773 static void p54u_stop(struct ieee80211_hw *dev)
775 /* TODO: figure out how to reliably stop the 3887 and net2280 so
776 the hardware is still usable next time we want to start it.
777 until then, we just stop listening to the hardware.. */
782 static int __devinit p54u_probe(struct usb_interface *intf,
783 const struct usb_device_id *id)
785 struct usb_device *udev = interface_to_usbdev(intf);
786 struct ieee80211_hw *dev;
787 struct p54u_priv *priv;
789 unsigned int i, recognized_pipes;
790 DECLARE_MAC_BUF(mac);
792 dev = p54_init_common(sizeof(*priv));
794 printk(KERN_ERR "prism54usb: ieee80211 alloc failed\n");
800 SET_IEEE80211_DEV(dev, &intf->dev);
801 usb_set_intfdata(intf, dev);
806 /* really lazy and simple way of figuring out if we're a 3887 */
807 /* TODO: should just stick the identification in the device table */
808 i = intf->altsetting->desc.bNumEndpoints;
809 recognized_pipes = 0;
811 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
816 case P54U_PIPE_DATA | USB_DIR_IN:
817 case P54U_PIPE_MGMT | USB_DIR_IN:
818 case P54U_PIPE_BRG | USB_DIR_IN:
819 case P54U_PIPE_DEV | USB_DIR_IN:
820 case P54U_PIPE_INT | USB_DIR_IN:
824 priv->common.open = p54u_open;
826 if (recognized_pipes < P54U_PIPE_NUMBER) {
827 priv->hw_type = P54U_3887;
828 priv->common.tx = p54u_tx_3887;
830 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
831 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
832 priv->common.tx = p54u_tx_net2280;
834 priv->common.stop = p54u_stop;
837 err = p54u_upload_firmware_3887(dev);
839 err = p54u_upload_firmware_net2280(dev);
843 err = p54u_read_eeprom(dev);
847 if (!is_valid_ether_addr(dev->wiphy->perm_addr)) {
848 u8 perm_addr[ETH_ALEN];
850 printk(KERN_WARNING "prism54usb: Invalid hwaddr! Using randomly generated MAC addr\n");
851 random_ether_addr(perm_addr);
852 SET_IEEE80211_PERM_ADDR(dev, perm_addr);
855 skb_queue_head_init(&priv->rx_queue);
857 err = ieee80211_register_hw(dev);
859 printk(KERN_ERR "prism54usb: Cannot register netdevice\n");
863 printk(KERN_INFO "%s: hwaddr %s, isl38%02x\n",
864 wiphy_name(dev->wiphy),
865 print_mac(mac, dev->wiphy->perm_addr),
866 priv->common.version);
871 ieee80211_free_hw(dev);
872 usb_set_intfdata(intf, NULL);
877 static void __devexit p54u_disconnect(struct usb_interface *intf)
879 struct ieee80211_hw *dev = usb_get_intfdata(intf);
880 struct p54u_priv *priv;
885 ieee80211_unregister_hw(dev);
888 usb_put_dev(interface_to_usbdev(intf));
889 p54_free_common(dev);
890 ieee80211_free_hw(dev);
893 static struct usb_driver p54u_driver = {
894 .name = "prism54usb",
895 .id_table = p54u_table,
897 .disconnect = p54u_disconnect,
900 static int __init p54u_init(void)
902 return usb_register(&p54u_driver);
905 static void __exit p54u_exit(void)
907 usb_deregister(&p54u_driver);
910 module_init(p54u_init);
911 module_exit(p54u_exit);