linux/drivers/net/wireless/p54/p54usb.c
<<
>>
Prefs
   1
   2/*
   3 * Linux device driver for USB based Prism54
   4 *
   5 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
   6 *
   7 * Based on the islsm (softmac prism54) driver, which is:
   8 * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
   9 *
  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.
  13 */
  14
  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>
  23
  24#include "p54.h"
  25#include "p54usb.h"
  26
  27MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
  28MODULE_DESCRIPTION("Prism54 USB wireless driver");
  29MODULE_LICENSE("GPL");
  30MODULE_ALIAS("prism54usb");
  31MODULE_FIRMWARE("isl3886usb");
  32MODULE_FIRMWARE("isl3887usb");
  33
  34static 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 */
  53
  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(0x1413, 0x5400)},   /* Telsey 802.11g USB2.0 Adapter */
  75        {USB_DEVICE(0x1435, 0x0427)},   /* Inventel UR054G */
  76        {USB_DEVICE(0x2001, 0x3704)},   /* DLink DWL-G122 rev A2 */
  77        {USB_DEVICE(0x413c, 0x8102)},   /* Spinnaker DUT */
  78        {USB_DEVICE(0x413c, 0x8104)},   /* Cohiba Proto board */
  79        {}
  80};
  81
  82MODULE_DEVICE_TABLE(usb, p54u_table);
  83
  84static void p54u_rx_cb(struct urb *urb)
  85{
  86        struct sk_buff *skb = (struct sk_buff *) urb->context;
  87        struct p54u_rx_info *info = (struct p54u_rx_info *)skb->cb;
  88        struct ieee80211_hw *dev = info->dev;
  89        struct p54u_priv *priv = dev->priv;
  90
  91        skb_unlink(skb, &priv->rx_queue);
  92
  93        if (unlikely(urb->status)) {
  94                dev_kfree_skb_irq(skb);
  95                return;
  96        }
  97
  98        skb_put(skb, urb->actual_length);
  99
 100        if (priv->hw_type == P54U_NET2280)
 101                skb_pull(skb, priv->common.tx_hdr_len);
 102        if (priv->common.fw_interface == FW_LM87) {
 103                skb_pull(skb, 4);
 104                skb_put(skb, 4);
 105        }
 106
 107        if (p54_rx(dev, skb)) {
 108                skb = dev_alloc_skb(priv->common.rx_mtu + 32);
 109                if (unlikely(!skb)) {
 110                        /* TODO check rx queue length and refill *somewhere* */
 111                        return;
 112                }
 113
 114                info = (struct p54u_rx_info *) skb->cb;
 115                info->urb = urb;
 116                info->dev = dev;
 117                urb->transfer_buffer = skb_tail_pointer(skb);
 118                urb->context = skb;
 119        } else {
 120                if (priv->hw_type == P54U_NET2280)
 121                        skb_push(skb, priv->common.tx_hdr_len);
 122                if (priv->common.fw_interface == FW_LM87) {
 123                        skb_push(skb, 4);
 124                        skb_put(skb, 4);
 125                }
 126                skb_reset_tail_pointer(skb);
 127                skb_trim(skb, 0);
 128                if (urb->transfer_buffer != skb_tail_pointer(skb)) {
 129                        /* this should not happen */
 130                        WARN_ON(1);
 131                        urb->transfer_buffer = skb_tail_pointer(skb);
 132                }
 133        }
 134        skb_queue_tail(&priv->rx_queue, skb);
 135        usb_anchor_urb(urb, &priv->submitted);
 136        if (usb_submit_urb(urb, GFP_ATOMIC)) {
 137                skb_unlink(skb, &priv->rx_queue);
 138                usb_unanchor_urb(urb);
 139                dev_kfree_skb_irq(skb);
 140        }
 141}
 142
 143static void p54u_tx_cb(struct urb *urb)
 144{
 145        struct sk_buff *skb = urb->context;
 146        struct ieee80211_hw *dev = (struct ieee80211_hw *)
 147                usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
 148
 149        p54_free_skb(dev, skb);
 150}
 151
 152static void p54u_tx_dummy_cb(struct urb *urb) { }
 153
 154static void p54u_free_urbs(struct ieee80211_hw *dev)
 155{
 156        struct p54u_priv *priv = dev->priv;
 157        usb_kill_anchored_urbs(&priv->submitted);
 158}
 159
 160static int p54u_init_urbs(struct ieee80211_hw *dev)
 161{
 162        struct p54u_priv *priv = dev->priv;
 163        struct urb *entry = NULL;
 164        struct sk_buff *skb;
 165        struct p54u_rx_info *info;
 166        int ret = 0;
 167
 168        while (skb_queue_len(&priv->rx_queue) < 32) {
 169                skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
 170                if (!skb) {
 171                        ret = -ENOMEM;
 172                        goto err;
 173                }
 174                entry = usb_alloc_urb(0, GFP_KERNEL);
 175                if (!entry) {
 176                        ret = -ENOMEM;
 177                        goto err;
 178                }
 179
 180                usb_fill_bulk_urb(entry, priv->udev,
 181                                  usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
 182                                  skb_tail_pointer(skb),
 183                                  priv->common.rx_mtu + 32, p54u_rx_cb, skb);
 184                info = (struct p54u_rx_info *) skb->cb;
 185                info->urb = entry;
 186                info->dev = dev;
 187                skb_queue_tail(&priv->rx_queue, skb);
 188
 189                usb_anchor_urb(entry, &priv->submitted);
 190                ret = usb_submit_urb(entry, GFP_KERNEL);
 191                if (ret) {
 192                        skb_unlink(skb, &priv->rx_queue);
 193                        usb_unanchor_urb(entry);
 194                        goto err;
 195                }
 196                usb_free_urb(entry);
 197                entry = NULL;
 198        }
 199
 200        return 0;
 201
 202 err:
 203        usb_free_urb(entry);
 204        kfree_skb(skb);
 205        p54u_free_urbs(dev);
 206        return ret;
 207}
 208
 209static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb)
 210{
 211        struct p54u_priv *priv = dev->priv;
 212        struct urb *addr_urb, *data_urb;
 213        int err = 0;
 214
 215        addr_urb = usb_alloc_urb(0, GFP_ATOMIC);
 216        if (!addr_urb)
 217                return;
 218
 219        data_urb = usb_alloc_urb(0, GFP_ATOMIC);
 220        if (!data_urb) {
 221                usb_free_urb(addr_urb);
 222                return;
 223        }
 224
 225        usb_fill_bulk_urb(addr_urb, priv->udev,
 226                          usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
 227                          &((struct p54_hdr *)skb->data)->req_id, 4,
 228                          p54u_tx_dummy_cb, dev);
 229        usb_fill_bulk_urb(data_urb, priv->udev,
 230                          usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
 231                          skb->data, skb->len, FREE_AFTER_TX(skb) ?
 232                          p54u_tx_cb : p54u_tx_dummy_cb, skb);
 233        addr_urb->transfer_flags |= URB_ZERO_PACKET;
 234        data_urb->transfer_flags |= URB_ZERO_PACKET;
 235
 236        usb_anchor_urb(addr_urb, &priv->submitted);
 237        err = usb_submit_urb(addr_urb, GFP_ATOMIC);
 238        if (err) {
 239                usb_unanchor_urb(addr_urb);
 240                goto out;
 241        }
 242
 243        usb_anchor_urb(data_urb, &priv->submitted);
 244        err = usb_submit_urb(data_urb, GFP_ATOMIC);
 245        if (err)
 246                usb_unanchor_urb(data_urb);
 247
 248 out:
 249        usb_free_urb(addr_urb);
 250        usb_free_urb(data_urb);
 251
 252        if (err)
 253                p54_free_skb(dev, skb);
 254}
 255
 256static __le32 p54u_lm87_chksum(const __le32 *data, size_t length)
 257{
 258        u32 chk = 0;
 259
 260        length >>= 2;
 261        while (length--) {
 262                chk ^= le32_to_cpu(*data++);
 263                chk = (chk >> 5) ^ (chk << 3);
 264        }
 265
 266        return cpu_to_le32(chk);
 267}
 268
 269static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
 270{
 271        struct p54u_priv *priv = dev->priv;
 272        struct urb *data_urb;
 273        struct lm87_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
 274
 275        data_urb = usb_alloc_urb(0, GFP_ATOMIC);
 276        if (!data_urb)
 277                return;
 278
 279        hdr->chksum = p54u_lm87_chksum((__le32 *)skb->data, skb->len);
 280        hdr->device_addr = ((struct p54_hdr *)skb->data)->req_id;
 281
 282        usb_fill_bulk_urb(data_urb, priv->udev,
 283                          usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
 284                          hdr, skb->len + sizeof(*hdr),  FREE_AFTER_TX(skb) ?
 285                          p54u_tx_cb : p54u_tx_dummy_cb, skb);
 286        data_urb->transfer_flags |= URB_ZERO_PACKET;
 287
 288        usb_anchor_urb(data_urb, &priv->submitted);
 289        if (usb_submit_urb(data_urb, GFP_ATOMIC)) {
 290                usb_unanchor_urb(data_urb);
 291                p54_free_skb(dev, skb);
 292        }
 293        usb_free_urb(data_urb);
 294}
 295
 296static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
 297{
 298        struct p54u_priv *priv = dev->priv;
 299        struct urb *int_urb, *data_urb;
 300        struct net2280_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
 301        struct net2280_reg_write *reg;
 302        int err = 0;
 303
 304        reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
 305        if (!reg)
 306                return;
 307
 308        int_urb = usb_alloc_urb(0, GFP_ATOMIC);
 309        if (!int_urb) {
 310                kfree(reg);
 311                return;
 312        }
 313
 314        data_urb = usb_alloc_urb(0, GFP_ATOMIC);
 315        if (!data_urb) {
 316                kfree(reg);
 317                usb_free_urb(int_urb);
 318                return;
 319        }
 320
 321        reg->port = cpu_to_le16(NET2280_DEV_U32);
 322        reg->addr = cpu_to_le32(P54U_DEV_BASE);
 323        reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
 324
 325        memset(hdr, 0, sizeof(*hdr));
 326        hdr->len = cpu_to_le16(skb->len);
 327        hdr->device_addr = ((struct p54_hdr *) skb->data)->req_id;
 328
 329        usb_fill_bulk_urb(int_urb, priv->udev,
 330                usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
 331                p54u_tx_dummy_cb, dev);
 332
 333        /*
 334         * This flag triggers a code path in the USB subsystem that will
 335         * free what's inside the transfer_buffer after the callback routine
 336         * has completed.
 337         */
 338        int_urb->transfer_flags |= URB_FREE_BUFFER | URB_ZERO_PACKET;
 339
 340        usb_fill_bulk_urb(data_urb, priv->udev,
 341                          usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
 342                          hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
 343                          p54u_tx_cb : p54u_tx_dummy_cb, skb);
 344        data_urb->transfer_flags |= URB_ZERO_PACKET;
 345
 346        usb_anchor_urb(int_urb, &priv->submitted);
 347        err = usb_submit_urb(int_urb, GFP_ATOMIC);
 348        if (err) {
 349                usb_unanchor_urb(int_urb);
 350                goto out;
 351        }
 352
 353        usb_anchor_urb(data_urb, &priv->submitted);
 354        err = usb_submit_urb(data_urb, GFP_ATOMIC);
 355        if (err) {
 356                usb_unanchor_urb(data_urb);
 357                goto out;
 358        }
 359 out:
 360        usb_free_urb(int_urb);
 361        usb_free_urb(data_urb);
 362
 363        if (err) {
 364                skb_pull(skb, sizeof(*hdr));
 365                p54_free_skb(dev, skb);
 366        }
 367}
 368
 369static int p54u_write(struct p54u_priv *priv,
 370                      struct net2280_reg_write *buf,
 371                      enum net2280_op_type type,
 372                      __le32 addr, __le32 val)
 373{
 374        unsigned int ep;
 375        int alen;
 376
 377        if (type & 0x0800)
 378                ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
 379        else
 380                ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
 381
 382        buf->port = cpu_to_le16(type);
 383        buf->addr = addr;
 384        buf->val = val;
 385
 386        return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
 387}
 388
 389static int p54u_read(struct p54u_priv *priv, void *buf,
 390                     enum net2280_op_type type,
 391                     __le32 addr, __le32 *val)
 392{
 393        struct net2280_reg_read *read = buf;
 394        __le32 *reg = buf;
 395        unsigned int ep;
 396        int alen, err;
 397
 398        if (type & 0x0800)
 399                ep = P54U_PIPE_DEV;
 400        else
 401                ep = P54U_PIPE_BRG;
 402
 403        read->port = cpu_to_le16(type);
 404        read->addr = addr;
 405
 406        err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
 407                           read, sizeof(*read), &alen, 1000);
 408        if (err)
 409                return err;
 410
 411        err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
 412                           reg, sizeof(*reg), &alen, 1000);
 413        if (err)
 414                return err;
 415
 416        *val = *reg;
 417        return 0;
 418}
 419
 420static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
 421                         void *data, size_t len)
 422{
 423        int alen;
 424        return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
 425                            data, len, &alen, 2000);
 426}
 427
 428static const char p54u_romboot_3887[] = "~~~~";
 429static const char p54u_firmware_upload_3887[] = "<\r";
 430
 431static int p54u_device_reset_3887(struct ieee80211_hw *dev)
 432{
 433        struct p54u_priv *priv = dev->priv;
 434        int ret, lock = (priv->intf->condition != USB_INTERFACE_BINDING);
 435        u8 buf[4];
 436
 437        if (lock) {
 438                ret = usb_lock_device_for_reset(priv->udev, priv->intf);
 439                if (ret < 0) {
 440                        dev_err(&priv->udev->dev, "(p54usb) unable to lock "
 441                                " device for reset: %d\n", ret);
 442                        return ret;
 443                }
 444        }
 445
 446        ret = usb_reset_device(priv->udev);
 447        if (lock)
 448                usb_unlock_device(priv->udev);
 449
 450        if (ret) {
 451                dev_err(&priv->udev->dev, "(p54usb) unable to reset "
 452                        "device: %d\n", ret);
 453                return ret;
 454        }
 455
 456        memcpy(&buf, p54u_romboot_3887, sizeof(buf));
 457        ret = p54u_bulk_msg(priv, P54U_PIPE_DATA,
 458                            buf, sizeof(buf));
 459        if (ret)
 460                dev_err(&priv->udev->dev, "(p54usb) unable to jump to "
 461                        "boot ROM: %d\n", ret);
 462
 463        return ret;
 464}
 465
 466static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
 467{
 468        struct p54u_priv *priv = dev->priv;
 469        const struct firmware *fw_entry = NULL;
 470        int err, alen;
 471        u8 carry = 0;
 472        u8 *buf, *tmp;
 473        const u8 *data;
 474        unsigned int left, remains, block_size;
 475        struct x2_header *hdr;
 476        unsigned long timeout;
 477
 478        tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
 479        if (!buf) {
 480                dev_err(&priv->udev->dev, "(p54usb) cannot allocate firmware"
 481                                          "upload buffer!\n");
 482                err = -ENOMEM;
 483                goto err_bufalloc;
 484        }
 485
 486        err = p54u_device_reset_3887(dev);
 487        if (err)
 488                goto err_reset;
 489
 490        err = request_firmware(&fw_entry, "isl3887usb", &priv->udev->dev);
 491        if (err) {
 492                dev_err(&priv->udev->dev, "p54usb: cannot find firmware "
 493                                          "(isl3887usb)\n");
 494                err = request_firmware(&fw_entry, "isl3887usb_bare",
 495                        &priv->udev->dev);
 496                if (err)
 497                        goto err_req_fw_failed;
 498        }
 499
 500        err = p54_parse_firmware(dev, fw_entry);
 501        if (err)
 502                goto err_upload_failed;
 503
 504        if (priv->common.fw_interface != FW_LM87) {
 505                dev_err(&priv->udev->dev, "wrong firmware, "
 506                        "please get a LM87 firmware and try again.\n");
 507                err = -EINVAL;
 508                goto err_upload_failed;
 509        }
 510
 511        left = block_size = min((size_t)P54U_FW_BLOCK, fw_entry->size);
 512        strcpy(buf, p54u_firmware_upload_3887);
 513        left -= strlen(p54u_firmware_upload_3887);
 514        tmp += strlen(p54u_firmware_upload_3887);
 515
 516        data = fw_entry->data;
 517        remains = fw_entry->size;
 518
 519        hdr = (struct x2_header *)(buf + strlen(p54u_firmware_upload_3887));
 520        memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
 521        hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
 522        hdr->fw_length = cpu_to_le32(fw_entry->size);
 523        hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
 524                                         sizeof(u32)*2));
 525        left -= sizeof(*hdr);
 526        tmp += sizeof(*hdr);
 527
 528        while (remains) {
 529                while (left--) {
 530                        if (carry) {
 531                                *tmp++ = carry;
 532                                carry = 0;
 533                                remains--;
 534                                continue;
 535                        }
 536                        switch (*data) {
 537                        case '~':
 538                                *tmp++ = '}';
 539                                carry = '^';
 540                                break;
 541                        case '}':
 542                                *tmp++ = '}';
 543                                carry = ']';
 544                                break;
 545                        default:
 546                                *tmp++ = *data;
 547                                remains--;
 548                                break;
 549                        }
 550                        data++;
 551                }
 552
 553                err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
 554                if (err) {
 555                        dev_err(&priv->udev->dev, "(p54usb) firmware "
 556                                                  "upload failed!\n");
 557                        goto err_upload_failed;
 558                }
 559
 560                tmp = buf;
 561                left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
 562        }
 563
 564        *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, fw_entry->data, fw_entry->size));
 565        err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
 566        if (err) {
 567                dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
 568                goto err_upload_failed;
 569        }
 570        timeout = jiffies + msecs_to_jiffies(1000);
 571        while (!(err = usb_bulk_msg(priv->udev,
 572                usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
 573                if (alen > 2 && !memcmp(buf, "OK", 2))
 574                        break;
 575
 576                if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
 577                        err = -EINVAL;
 578                        break;
 579                }
 580
 581                if (time_after(jiffies, timeout)) {
 582                        dev_err(&priv->udev->dev, "(p54usb) firmware boot "
 583                                                  "timed out!\n");
 584                        err = -ETIMEDOUT;
 585                        break;
 586                }
 587        }
 588        if (err) {
 589                dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
 590                goto err_upload_failed;
 591        }
 592
 593        buf[0] = 'g';
 594        buf[1] = '\r';
 595        err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
 596        if (err) {
 597                dev_err(&priv->udev->dev, "(p54usb) firmware boot failed!\n");
 598                goto err_upload_failed;
 599        }
 600
 601        timeout = jiffies + msecs_to_jiffies(1000);
 602        while (!(err = usb_bulk_msg(priv->udev,
 603                usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
 604                if (alen > 0 && buf[0] == 'g')
 605                        break;
 606
 607                if (time_after(jiffies, timeout)) {
 608                        err = -ETIMEDOUT;
 609                        break;
 610                }
 611        }
 612        if (err)
 613                goto err_upload_failed;
 614
 615  err_upload_failed:
 616        release_firmware(fw_entry);
 617  err_req_fw_failed:
 618  err_reset:
 619        kfree(buf);
 620  err_bufalloc:
 621        return err;
 622}
 623
 624static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
 625{
 626        struct p54u_priv *priv = dev->priv;
 627        const struct firmware *fw_entry = NULL;
 628        const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
 629        int err, alen;
 630        void *buf;
 631        __le32 reg;
 632        unsigned int remains, offset;
 633        const u8 *data;
 634
 635        buf = kmalloc(512, GFP_KERNEL);
 636        if (!buf) {
 637                dev_err(&priv->udev->dev, "(p54usb) firmware buffer "
 638                                          "alloc failed!\n");
 639                return -ENOMEM;
 640        }
 641
 642        err = request_firmware(&fw_entry, "isl3886usb", &priv->udev->dev);
 643        if (err) {
 644                dev_err(&priv->udev->dev, "(p54usb) cannot find firmware "
 645                                          "(isl3886usb)\n");
 646                err = request_firmware(&fw_entry, "isl3890usb",
 647                        &priv->udev->dev);
 648                if (err) {
 649                        kfree(buf);
 650                        return err;
 651                        }
 652        }
 653
 654        err = p54_parse_firmware(dev, fw_entry);
 655        if (err) {
 656                kfree(buf);
 657                release_firmware(fw_entry);
 658                return err;
 659        }
 660
 661        if (priv->common.fw_interface != FW_LM86) {
 662                dev_err(&priv->udev->dev, "wrong firmware, "
 663                        "please get a LM86(USB) firmware and try again.\n");
 664                kfree(buf);
 665                release_firmware(fw_entry);
 666                return -EINVAL;
 667        }
 668
 669#define P54U_WRITE(type, addr, data) \
 670        do {\
 671                err = p54u_write(priv, buf, type,\
 672                                 cpu_to_le32((u32)(unsigned long)addr), data);\
 673                if (err) \
 674                        goto fail;\
 675        } while (0)
 676
 677#define P54U_READ(type, addr) \
 678        do {\
 679                err = p54u_read(priv, buf, type,\
 680                                cpu_to_le32((u32)(unsigned long)addr), &reg);\
 681                if (err)\
 682                        goto fail;\
 683        } while (0)
 684
 685        /* power down net2280 bridge */
 686        P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
 687        reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
 688        reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
 689        P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
 690
 691        mdelay(100);
 692
 693        /* power up bridge */
 694        reg |= cpu_to_le32(P54U_BRG_POWER_UP);
 695        reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
 696        P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
 697
 698        mdelay(100);
 699
 700        P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
 701                   cpu_to_le32(NET2280_CLK_30Mhz |
 702                               NET2280_PCI_ENABLE |
 703                               NET2280_PCI_SOFT_RESET));
 704
 705        mdelay(20);
 706
 707        P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
 708                   cpu_to_le32(PCI_COMMAND_MEMORY |
 709                               PCI_COMMAND_MASTER));
 710
 711        P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
 712                   cpu_to_le32(NET2280_BASE));
 713
 714        P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
 715        reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
 716        P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
 717
 718        // TODO: we really need this?
 719        P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
 720
 721        P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
 722                   cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
 723        P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
 724                   cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
 725
 726        P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
 727                   cpu_to_le32(NET2280_BASE2));
 728
 729        /* finally done setting up the bridge */
 730
 731        P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
 732                   cpu_to_le32(PCI_COMMAND_MEMORY |
 733                               PCI_COMMAND_MASTER));
 734
 735        P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
 736        P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
 737                   cpu_to_le32(P54U_DEV_BASE));
 738
 739        P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
 740        P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
 741                   cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
 742
 743        /* do romboot */
 744        P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
 745
 746        P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
 747        reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
 748        reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
 749        reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
 750        P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 751
 752        mdelay(20);
 753
 754        reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
 755        P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 756
 757        mdelay(20);
 758
 759        reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
 760        P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 761
 762        mdelay(100);
 763
 764        P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
 765        P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
 766
 767        /* finally, we can upload firmware now! */
 768        remains = fw_entry->size;
 769        data = fw_entry->data;
 770        offset = ISL38XX_DEV_FIRMWARE_ADDR;
 771
 772        while (remains) {
 773                unsigned int block_len = min(remains, (unsigned int)512);
 774                memcpy(buf, data, block_len);
 775
 776                err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
 777                if (err) {
 778                        dev_err(&priv->udev->dev, "(p54usb) firmware block "
 779                                                  "upload failed\n");
 780                        goto fail;
 781                }
 782
 783                P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
 784                           cpu_to_le32(0xc0000f00));
 785
 786                P54U_WRITE(NET2280_DEV_U32,
 787                           0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
 788                P54U_WRITE(NET2280_DEV_U32,
 789                           0x0020 | (unsigned long)&devreg->direct_mem_win,
 790                           cpu_to_le32(1));
 791
 792                P54U_WRITE(NET2280_DEV_U32,
 793                           0x0024 | (unsigned long)&devreg->direct_mem_win,
 794                           cpu_to_le32(block_len));
 795                P54U_WRITE(NET2280_DEV_U32,
 796                           0x0028 | (unsigned long)&devreg->direct_mem_win,
 797                           cpu_to_le32(offset));
 798
 799                P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
 800                           cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
 801                P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
 802                           cpu_to_le32(block_len >> 2));
 803                P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
 804                           cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
 805
 806                mdelay(10);
 807
 808                P54U_READ(NET2280_DEV_U32,
 809                          0x002C | (unsigned long)&devreg->direct_mem_win);
 810                if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
 811                    !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
 812                        dev_err(&priv->udev->dev, "(p54usb) firmware DMA "
 813                                                  "transfer failed\n");
 814                        goto fail;
 815                }
 816
 817                P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
 818                           cpu_to_le32(NET2280_FIFO_FLUSH));
 819
 820                remains -= block_len;
 821                data += block_len;
 822                offset += block_len;
 823        }
 824
 825        /* do ramboot */
 826        P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
 827        reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
 828        reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
 829        reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
 830        P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 831
 832        mdelay(20);
 833
 834        reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
 835        P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 836
 837        reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
 838        P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
 839
 840        mdelay(100);
 841
 842        P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
 843        P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
 844
 845        /* start up the firmware */
 846        P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
 847                   cpu_to_le32(ISL38XX_INT_IDENT_INIT));
 848
 849        P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
 850                   cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
 851
 852        P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
 853                   cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
 854                               NET2280_USB_INTERRUPT_ENABLE));
 855
 856        P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
 857                   cpu_to_le32(ISL38XX_DEV_INT_RESET));
 858
 859        err = usb_interrupt_msg(priv->udev,
 860                                usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
 861                                buf, sizeof(__le32), &alen, 1000);
 862        if (err || alen != sizeof(__le32))
 863                goto fail;
 864
 865        P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
 866        P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
 867
 868        if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
 869                err = -EINVAL;
 870
 871        P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
 872        P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
 873                   cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
 874
 875#undef P54U_WRITE
 876#undef P54U_READ
 877
 878 fail:
 879        release_firmware(fw_entry);
 880        kfree(buf);
 881        return err;
 882}
 883
 884static int p54u_open(struct ieee80211_hw *dev)
 885{
 886        struct p54u_priv *priv = dev->priv;
 887        int err;
 888
 889        err = p54u_init_urbs(dev);
 890        if (err) {
 891                return err;
 892        }
 893
 894        priv->common.open = p54u_init_urbs;
 895
 896        return 0;
 897}
 898
 899static void p54u_stop(struct ieee80211_hw *dev)
 900{
 901        /* TODO: figure out how to reliably stop the 3887 and net2280 so
 902           the hardware is still usable next time we want to start it.
 903           until then, we just stop listening to the hardware.. */
 904        p54u_free_urbs(dev);
 905        return;
 906}
 907
 908static int __devinit p54u_probe(struct usb_interface *intf,
 909                                const struct usb_device_id *id)
 910{
 911        struct usb_device *udev = interface_to_usbdev(intf);
 912        struct ieee80211_hw *dev;
 913        struct p54u_priv *priv;
 914        int err;
 915        unsigned int i, recognized_pipes;
 916
 917        dev = p54_init_common(sizeof(*priv));
 918
 919        if (!dev) {
 920                dev_err(&udev->dev, "(p54usb) ieee80211 alloc failed\n");
 921                return -ENOMEM;
 922        }
 923
 924        priv = dev->priv;
 925
 926        SET_IEEE80211_DEV(dev, &intf->dev);
 927        usb_set_intfdata(intf, dev);
 928        priv->udev = udev;
 929        priv->intf = intf;
 930        skb_queue_head_init(&priv->rx_queue);
 931        init_usb_anchor(&priv->submitted);
 932
 933        usb_get_dev(udev);
 934
 935        /* really lazy and simple way of figuring out if we're a 3887 */
 936        /* TODO: should just stick the identification in the device table */
 937        i = intf->altsetting->desc.bNumEndpoints;
 938        recognized_pipes = 0;
 939        while (i--) {
 940                switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
 941                case P54U_PIPE_DATA:
 942                case P54U_PIPE_MGMT:
 943                case P54U_PIPE_BRG:
 944                case P54U_PIPE_DEV:
 945                case P54U_PIPE_DATA | USB_DIR_IN:
 946                case P54U_PIPE_MGMT | USB_DIR_IN:
 947                case P54U_PIPE_BRG | USB_DIR_IN:
 948                case P54U_PIPE_DEV | USB_DIR_IN:
 949                case P54U_PIPE_INT | USB_DIR_IN:
 950                        recognized_pipes++;
 951                }
 952        }
 953        priv->common.open = p54u_open;
 954        priv->common.stop = p54u_stop;
 955        if (recognized_pipes < P54U_PIPE_NUMBER) {
 956                priv->hw_type = P54U_3887;
 957                err = p54u_upload_firmware_3887(dev);
 958                if (priv->common.fw_interface == FW_LM87) {
 959                        dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
 960                        priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
 961                        priv->common.tx = p54u_tx_lm87;
 962                } else
 963                        priv->common.tx = p54u_tx_3887;
 964        } else {
 965                priv->hw_type = P54U_NET2280;
 966                dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
 967                priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
 968                priv->common.tx = p54u_tx_net2280;
 969                err = p54u_upload_firmware_net2280(dev);
 970        }
 971        if (err)
 972                goto err_free_dev;
 973
 974        p54u_open(dev);
 975        err = p54_read_eeprom(dev);
 976        p54u_stop(dev);
 977        if (err)
 978                goto err_free_dev;
 979
 980        err = p54_register_common(dev, &udev->dev);
 981        if (err)
 982                goto err_free_dev;
 983
 984        return 0;
 985
 986 err_free_dev:
 987        ieee80211_free_hw(dev);
 988        usb_set_intfdata(intf, NULL);
 989        usb_put_dev(udev);
 990        return err;
 991}
 992
 993static void __devexit p54u_disconnect(struct usb_interface *intf)
 994{
 995        struct ieee80211_hw *dev = usb_get_intfdata(intf);
 996        struct p54u_priv *priv;
 997
 998        if (!dev)
 999                return;
1000
1001        ieee80211_unregister_hw(dev);
1002
1003        priv = dev->priv;
1004        usb_put_dev(interface_to_usbdev(intf));
1005        p54_free_common(dev);
1006        ieee80211_free_hw(dev);
1007}
1008
1009static int p54u_pre_reset(struct usb_interface *intf)
1010{
1011        return 0;
1012}
1013
1014static int p54u_post_reset(struct usb_interface *intf)
1015{
1016        return 0;
1017}
1018
1019static struct usb_driver p54u_driver = {
1020        .name   = "p54usb",
1021        .id_table = p54u_table,
1022        .probe = p54u_probe,
1023        .disconnect = p54u_disconnect,
1024        .pre_reset = p54u_pre_reset,
1025        .post_reset = p54u_post_reset,
1026        .soft_unbind = 1,
1027};
1028
1029static int __init p54u_init(void)
1030{
1031        return usb_register(&p54u_driver);
1032}
1033
1034static void __exit p54u_exit(void)
1035{
1036        usb_deregister(&p54u_driver);
1037}
1038
1039module_init(p54u_init);
1040module_exit(p54u_exit);
1041
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.