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));
 
 148         p54_free_skb(dev, skb);
 
 151 static void p54u_tx_dummy_cb(struct urb *urb) { }
 
 153 static void p54u_free_urbs(struct ieee80211_hw *dev)
 
 155         struct p54u_priv *priv = dev->priv;
 
 156         usb_kill_anchored_urbs(&priv->submitted);
 
 159 static int p54u_init_urbs(struct ieee80211_hw *dev)
 
 161         struct p54u_priv *priv = dev->priv;
 
 162         struct urb *entry = NULL;
 
 164         struct p54u_rx_info *info;
 
 167         while (skb_queue_len(&priv->rx_queue) < 32) {
 
 168                 skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
 
 173                 entry = usb_alloc_urb(0, GFP_KERNEL);
 
 179                 usb_fill_bulk_urb(entry, priv->udev,
 
 180                                   usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
 
 181                                   skb_tail_pointer(skb),
 
 182                                   priv->common.rx_mtu + 32, p54u_rx_cb, skb);
 
 183                 info = (struct p54u_rx_info *) skb->cb;
 
 186                 skb_queue_tail(&priv->rx_queue, skb);
 
 188                 usb_anchor_urb(entry, &priv->submitted);
 
 189                 ret = usb_submit_urb(entry, GFP_KERNEL);
 
 191                         skb_unlink(skb, &priv->rx_queue);
 
 192                         usb_unanchor_urb(entry);
 
 208 static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb)
 
 210         struct p54u_priv *priv = dev->priv;
 
 211         struct urb *addr_urb, *data_urb;
 
 214         addr_urb = usb_alloc_urb(0, GFP_ATOMIC);
 
 218         data_urb = usb_alloc_urb(0, GFP_ATOMIC);
 
 220                 usb_free_urb(addr_urb);
 
 224         usb_fill_bulk_urb(addr_urb, priv->udev,
 
 225                           usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
 
 226                           &((struct p54_hdr *)skb->data)->req_id, 4,
 
 227                           p54u_tx_dummy_cb, dev);
 
 228         usb_fill_bulk_urb(data_urb, priv->udev,
 
 229                           usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
 
 230                           skb->data, skb->len, FREE_AFTER_TX(skb) ?
 
 231                           p54u_tx_cb : p54u_tx_dummy_cb, skb);
 
 232         addr_urb->transfer_flags |= URB_ZERO_PACKET;
 
 233         data_urb->transfer_flags |= URB_ZERO_PACKET;
 
 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(data_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 = (void *)skb->data - sizeof(*hdr);
 
 274         data_urb = usb_alloc_urb(0, GFP_ATOMIC);
 
 278         hdr->chksum = p54u_lm87_chksum((__le32 *)skb->data, skb->len);
 
 279         hdr->device_addr = ((struct p54_hdr *)skb->data)->req_id;
 
 281         usb_fill_bulk_urb(data_urb, priv->udev,
 
 282                           usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
 
 283                           hdr, skb->len + sizeof(*hdr),  FREE_AFTER_TX(skb) ?
 
 284                           p54u_tx_cb : p54u_tx_dummy_cb, skb);
 
 285         data_urb->transfer_flags |= URB_ZERO_PACKET;
 
 287         usb_anchor_urb(data_urb, &priv->submitted);
 
 288         if (usb_submit_urb(data_urb, GFP_ATOMIC)) {
 
 289                 usb_unanchor_urb(data_urb);
 
 290                 p54_free_skb(dev, skb);
 
 292         usb_free_urb(data_urb);
 
 295 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
 
 297         struct p54u_priv *priv = dev->priv;
 
 298         struct urb *int_urb, *data_urb;
 
 299         struct net2280_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
 
 300         struct net2280_reg_write *reg;
 
 303         reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
 
 307         int_urb = usb_alloc_urb(0, GFP_ATOMIC);
 
 313         data_urb = usb_alloc_urb(0, GFP_ATOMIC);
 
 316                 usb_free_urb(int_urb);
 
 320         reg->port = cpu_to_le16(NET2280_DEV_U32);
 
 321         reg->addr = cpu_to_le32(P54U_DEV_BASE);
 
 322         reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
 
 324         memset(hdr, 0, sizeof(*hdr));
 
 325         hdr->len = cpu_to_le16(skb->len);
 
 326         hdr->device_addr = ((struct p54_hdr *) skb->data)->req_id;
 
 328         usb_fill_bulk_urb(int_urb, priv->udev,
 
 329                 usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
 
 330                 p54u_tx_dummy_cb, dev);
 
 333          * This flag triggers a code path in the USB subsystem that will
 
 334          * free what's inside the transfer_buffer after the callback routine
 
 337         int_urb->transfer_flags |= URB_FREE_BUFFER | URB_ZERO_PACKET;
 
 339         usb_fill_bulk_urb(data_urb, priv->udev,
 
 340                           usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
 
 341                           hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
 
 342                           p54u_tx_cb : p54u_tx_dummy_cb, skb);
 
 343         data_urb->transfer_flags |= URB_ZERO_PACKET;
 
 345         usb_anchor_urb(int_urb, &priv->submitted);
 
 346         err = usb_submit_urb(int_urb, GFP_ATOMIC);
 
 348                 usb_unanchor_urb(int_urb);
 
 352         usb_anchor_urb(data_urb, &priv->submitted);
 
 353         err = usb_submit_urb(data_urb, GFP_ATOMIC);
 
 355                 usb_unanchor_urb(data_urb);
 
 359         usb_free_urb(int_urb);
 
 360         usb_free_urb(data_urb);
 
 363                 skb_pull(skb, sizeof(*hdr));
 
 364                 p54_free_skb(dev, skb);
 
 368 static int p54u_write(struct p54u_priv *priv,
 
 369                       struct net2280_reg_write *buf,
 
 370                       enum net2280_op_type type,
 
 371                       __le32 addr, __le32 val)
 
 377                 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
 
 379                 ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
 
 381         buf->port = cpu_to_le16(type);
 
 385         return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
 
 388 static int p54u_read(struct p54u_priv *priv, void *buf,
 
 389                      enum net2280_op_type type,
 
 390                      __le32 addr, __le32 *val)
 
 392         struct net2280_reg_read *read = buf;
 
 402         read->port = cpu_to_le16(type);
 
 405         err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
 
 406                            read, sizeof(*read), &alen, 1000);
 
 410         err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
 
 411                            reg, sizeof(*reg), &alen, 1000);
 
 419 static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
 
 420                          void *data, size_t len)
 
 423         return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
 
 424                             data, len, &alen, 2000);
 
 427 static const char p54u_romboot_3887[] = "~~~~";
 
 428 static const char p54u_firmware_upload_3887[] = "<\r";
 
 430 static int p54u_device_reset_3887(struct ieee80211_hw *dev)
 
 432         struct p54u_priv *priv = dev->priv;
 
 433         int ret, lock = (priv->intf->condition != USB_INTERFACE_BINDING);
 
 437                 ret = usb_lock_device_for_reset(priv->udev, priv->intf);
 
 439                         dev_err(&priv->udev->dev, "(p54usb) unable to lock "
 
 440                                 " device for reset: %d\n", ret);
 
 445         ret = usb_reset_device(priv->udev);
 
 447                 usb_unlock_device(priv->udev);
 
 450                 dev_err(&priv->udev->dev, "(p54usb) unable to reset "
 
 451                         "device: %d\n", ret);
 
 455         memcpy(&buf, p54u_romboot_3887, sizeof(buf));
 
 456         ret = p54u_bulk_msg(priv, P54U_PIPE_DATA,
 
 459                 dev_err(&priv->udev->dev, "(p54usb) unable to jump to "
 
 460                         "boot ROM: %d\n", ret);
 
 465 static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
 
 467         struct p54u_priv *priv = dev->priv;
 
 468         const struct firmware *fw_entry = NULL;
 
 473         unsigned int left, remains, block_size;
 
 474         struct x2_header *hdr;
 
 475         unsigned long timeout;
 
 477         tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
 
 479                 dev_err(&priv->udev->dev, "(p54usb) cannot allocate firmware"
 
 485         err = p54u_device_reset_3887(dev);
 
 489         err = request_firmware(&fw_entry, "isl3887usb", &priv->udev->dev);
 
 491                 dev_err(&priv->udev->dev, "p54usb: cannot find firmware "
 
 493                 err = request_firmware(&fw_entry, "isl3887usb_bare",
 
 496                         goto err_req_fw_failed;
 
 499         err = p54_parse_firmware(dev, fw_entry);
 
 501                 goto err_upload_failed;
 
 503         if (priv->common.fw_interface != FW_LM87) {
 
 504                 dev_err(&priv->udev->dev, "wrong firmware, "
 
 505                         "please get a LM87 firmware and try again.\n");
 
 507                 goto err_upload_failed;
 
 510         left = block_size = min((size_t)P54U_FW_BLOCK, fw_entry->size);
 
 511         strcpy(buf, p54u_firmware_upload_3887);
 
 512         left -= strlen(p54u_firmware_upload_3887);
 
 513         tmp += strlen(p54u_firmware_upload_3887);
 
 515         data = fw_entry->data;
 
 516         remains = fw_entry->size;
 
 518         hdr = (struct x2_header *)(buf + strlen(p54u_firmware_upload_3887));
 
 519         memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
 
 520         hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
 
 521         hdr->fw_length = cpu_to_le32(fw_entry->size);
 
 522         hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
 
 524         left -= sizeof(*hdr);
 
 552                 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
 
 554                         dev_err(&priv->udev->dev, "(p54usb) firmware "
 
 556                         goto err_upload_failed;
 
 560                 left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
 
 563         *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, fw_entry->data, fw_entry->size));
 
 564         err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
 
 566                 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
 
 567                 goto err_upload_failed;
 
 569         timeout = jiffies + msecs_to_jiffies(1000);
 
 570         while (!(err = usb_bulk_msg(priv->udev,
 
 571                 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
 
 572                 if (alen > 2 && !memcmp(buf, "OK", 2))
 
 575                 if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
 
 580                 if (time_after(jiffies, timeout)) {
 
 581                         dev_err(&priv->udev->dev, "(p54usb) firmware boot "
 
 588                 dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
 
 589                 goto err_upload_failed;
 
 594         err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
 
 596                 dev_err(&priv->udev->dev, "(p54usb) firmware boot failed!\n");
 
 597                 goto err_upload_failed;
 
 600         timeout = jiffies + msecs_to_jiffies(1000);
 
 601         while (!(err = usb_bulk_msg(priv->udev,
 
 602                 usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
 
 603                 if (alen > 0 && buf[0] == 'g')
 
 606                 if (time_after(jiffies, timeout)) {
 
 612                 goto err_upload_failed;
 
 615         release_firmware(fw_entry);
 
 623 static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
 
 625         struct p54u_priv *priv = dev->priv;
 
 626         const struct firmware *fw_entry = NULL;
 
 627         const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
 
 631         unsigned int remains, offset;
 
 634         buf = kmalloc(512, GFP_KERNEL);
 
 636                 dev_err(&priv->udev->dev, "(p54usb) firmware buffer "
 
 641         err = request_firmware(&fw_entry, "isl3886usb", &priv->udev->dev);
 
 643                 dev_err(&priv->udev->dev, "(p54usb) cannot find firmware "
 
 645                 err = request_firmware(&fw_entry, "isl3890usb",
 
 653         err = p54_parse_firmware(dev, fw_entry);
 
 656                 release_firmware(fw_entry);
 
 660         if (priv->common.fw_interface != FW_LM86) {
 
 661                 dev_err(&priv->udev->dev, "wrong firmware, "
 
 662                         "please get a LM86(USB) firmware and try again.\n");
 
 664                 release_firmware(fw_entry);
 
 668 #define P54U_WRITE(type, addr, data) \
 
 670                 err = p54u_write(priv, buf, type,\
 
 671                                  cpu_to_le32((u32)(unsigned long)addr), data);\
 
 676 #define P54U_READ(type, addr) \
 
 678                 err = p54u_read(priv, buf, type,\
 
 679                                 cpu_to_le32((u32)(unsigned long)addr), ®);\
 
 684         /* power down net2280 bridge */
 
 685         P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
 
 686         reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
 
 687         reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
 
 688         P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
 
 692         /* power up bridge */
 
 693         reg |= cpu_to_le32(P54U_BRG_POWER_UP);
 
 694         reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
 
 695         P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
 
 699         P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
 
 700                    cpu_to_le32(NET2280_CLK_30Mhz |
 
 702                                NET2280_PCI_SOFT_RESET));
 
 706         P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
 
 707                    cpu_to_le32(PCI_COMMAND_MEMORY |
 
 708                                PCI_COMMAND_MASTER));
 
 710         P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
 
 711                    cpu_to_le32(NET2280_BASE));
 
 713         P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
 
 714         reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
 
 715         P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
 
 717         // TODO: we really need this?
 
 718         P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
 
 720         P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
 
 721                    cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
 
 722         P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
 
 723                    cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
 
 725         P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
 
 726                    cpu_to_le32(NET2280_BASE2));
 
 728         /* finally done setting up the bridge */
 
 730         P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
 
 731                    cpu_to_le32(PCI_COMMAND_MEMORY |
 
 732                                PCI_COMMAND_MASTER));
 
 734         P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
 
 735         P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
 
 736                    cpu_to_le32(P54U_DEV_BASE));
 
 738         P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
 
 739         P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
 
 740                    cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
 
 743         P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
 
 745         P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
 
 746         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
 
 747         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
 
 748         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
 
 749         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 
 753         reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
 
 754         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 
 758         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
 
 759         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 
 763         P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
 
 764         P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
 
 766         /* finally, we can upload firmware now! */
 
 767         remains = fw_entry->size;
 
 768         data = fw_entry->data;
 
 769         offset = ISL38XX_DEV_FIRMWARE_ADDR;
 
 772                 unsigned int block_len = min(remains, (unsigned int)512);
 
 773                 memcpy(buf, data, block_len);
 
 775                 err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
 
 777                         dev_err(&priv->udev->dev, "(p54usb) firmware block "
 
 782                 P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
 
 783                            cpu_to_le32(0xc0000f00));
 
 785                 P54U_WRITE(NET2280_DEV_U32,
 
 786                            0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
 
 787                 P54U_WRITE(NET2280_DEV_U32,
 
 788                            0x0020 | (unsigned long)&devreg->direct_mem_win,
 
 791                 P54U_WRITE(NET2280_DEV_U32,
 
 792                            0x0024 | (unsigned long)&devreg->direct_mem_win,
 
 793                            cpu_to_le32(block_len));
 
 794                 P54U_WRITE(NET2280_DEV_U32,
 
 795                            0x0028 | (unsigned long)&devreg->direct_mem_win,
 
 796                            cpu_to_le32(offset));
 
 798                 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
 
 799                            cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
 
 800                 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
 
 801                            cpu_to_le32(block_len >> 2));
 
 802                 P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
 
 803                            cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
 
 807                 P54U_READ(NET2280_DEV_U32,
 
 808                           0x002C | (unsigned long)&devreg->direct_mem_win);
 
 809                 if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
 
 810                     !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
 
 811                         dev_err(&priv->udev->dev, "(p54usb) firmware DMA "
 
 812                                                   "transfer failed\n");
 
 816                 P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
 
 817                            cpu_to_le32(NET2280_FIFO_FLUSH));
 
 819                 remains -= block_len;
 
 825         P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
 
 826         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
 
 827         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
 
 828         reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
 
 829         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 
 833         reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
 
 834         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 
 836         reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
 
 837         P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 
 841         P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
 
 842         P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
 
 844         /* start up the firmware */
 
 845         P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
 
 846                    cpu_to_le32(ISL38XX_INT_IDENT_INIT));
 
 848         P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
 
 849                    cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
 
 851         P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
 
 852                    cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
 
 853                                NET2280_USB_INTERRUPT_ENABLE));
 
 855         P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
 
 856                    cpu_to_le32(ISL38XX_DEV_INT_RESET));
 
 858         err = usb_interrupt_msg(priv->udev,
 
 859                                 usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
 
 860                                 buf, sizeof(__le32), &alen, 1000);
 
 861         if (err || alen != sizeof(__le32))
 
 864         P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
 
 865         P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
 
 867         if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
 
 870         P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
 
 871         P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
 
 872                    cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
 
 878         release_firmware(fw_entry);
 
 883 static int p54u_open(struct ieee80211_hw *dev)
 
 885         struct p54u_priv *priv = dev->priv;
 
 888         err = p54u_init_urbs(dev);
 
 893         priv->common.open = p54u_init_urbs;
 
 898 static void p54u_stop(struct ieee80211_hw *dev)
 
 900         /* TODO: figure out how to reliably stop the 3887 and net2280 so
 
 901            the hardware is still usable next time we want to start it.
 
 902            until then, we just stop listening to the hardware.. */
 
 907 static int __devinit p54u_probe(struct usb_interface *intf,
 
 908                                 const struct usb_device_id *id)
 
 910         struct usb_device *udev = interface_to_usbdev(intf);
 
 911         struct ieee80211_hw *dev;
 
 912         struct p54u_priv *priv;
 
 914         unsigned int i, recognized_pipes;
 
 916         dev = p54_init_common(sizeof(*priv));
 
 919                 dev_err(&udev->dev, "(p54usb) ieee80211 alloc failed\n");
 
 925         SET_IEEE80211_DEV(dev, &intf->dev);
 
 926         usb_set_intfdata(intf, dev);
 
 929         skb_queue_head_init(&priv->rx_queue);
 
 930         init_usb_anchor(&priv->submitted);
 
 934         /* really lazy and simple way of figuring out if we're a 3887 */
 
 935         /* TODO: should just stick the identification in the device table */
 
 936         i = intf->altsetting->desc.bNumEndpoints;
 
 937         recognized_pipes = 0;
 
 939                 switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
 
 944                 case P54U_PIPE_DATA | USB_DIR_IN:
 
 945                 case P54U_PIPE_MGMT | USB_DIR_IN:
 
 946                 case P54U_PIPE_BRG | USB_DIR_IN:
 
 947                 case P54U_PIPE_DEV | USB_DIR_IN:
 
 948                 case P54U_PIPE_INT | USB_DIR_IN:
 
 952         priv->common.open = p54u_open;
 
 953         priv->common.stop = p54u_stop;
 
 954         if (recognized_pipes < P54U_PIPE_NUMBER) {
 
 955                 priv->hw_type = P54U_3887;
 
 956                 err = p54u_upload_firmware_3887(dev);
 
 957                 if (priv->common.fw_interface == FW_LM87) {
 
 958                         dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
 
 959                         priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
 
 960                         priv->common.tx = p54u_tx_lm87;
 
 962                         priv->common.tx = p54u_tx_3887;
 
 964                 priv->hw_type = P54U_NET2280;
 
 965                 dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
 
 966                 priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
 
 967                 priv->common.tx = p54u_tx_net2280;
 
 968                 err = p54u_upload_firmware_net2280(dev);
 
 974         err = p54_read_eeprom(dev);
 
 979         err = p54_register_common(dev, &udev->dev);
 
 986         ieee80211_free_hw(dev);
 
 987         usb_set_intfdata(intf, NULL);
 
 992 static void __devexit p54u_disconnect(struct usb_interface *intf)
 
 994         struct ieee80211_hw *dev = usb_get_intfdata(intf);
 
 995         struct p54u_priv *priv;
 
1000         ieee80211_unregister_hw(dev);
 
1003         usb_put_dev(interface_to_usbdev(intf));
 
1004         p54_free_common(dev);
 
1005         ieee80211_free_hw(dev);
 
1008 static int p54u_pre_reset(struct usb_interface *intf)
 
1013 static int p54u_post_reset(struct usb_interface *intf)
 
1018 static struct usb_driver p54u_driver = {
 
1020         .id_table = p54u_table,
 
1021         .probe = p54u_probe,
 
1022         .disconnect = p54u_disconnect,
 
1023         .pre_reset = p54u_pre_reset,
 
1024         .post_reset = p54u_post_reset,
 
1028 static int __init p54u_init(void)
 
1030         return usb_register(&p54u_driver);
 
1033 static void __exit p54u_exit(void)
 
1035         usb_deregister(&p54u_driver);
 
1038 module_init(p54u_init);
 
1039 module_exit(p54u_exit);