linux/drivers/net/wireless/zd1211rw/zd_usb.c History
<<
>>
Prefs
   1/* ZD1211 USB-WLAN driver for Linux
   2 *
   3 * Copyright (C) 2005-2007 Ulrich Kunitz <kune@deine-taler.de>
   4 * Copyright (C) 2006-2007 Daniel Drake <dsd@gentoo.org>
   5 * Copyright (C) 2006-2007 Michael Wu <flamingice@sourmilk.net>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 2 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20 */
  21
  22#include <linux/kernel.h>
  23#include <linux/init.h>
  24#include <linux/firmware.h>
  25#include <linux/device.h>
  26#include <linux/errno.h>
  27#include <linux/slab.h>
  28#include <linux/skbuff.h>
  29#include <linux/usb.h>
  30#include <linux/workqueue.h>
  31#include <net/mac80211.h>
  32#include <asm/unaligned.h>
  33
  34#include "zd_def.h"
  35#include "zd_mac.h"
  36#include "zd_usb.h"
  37
  38static struct usb_device_id usb_ids[] = {
  39        /* ZD1211 */
  40        { USB_DEVICE(0x0105, 0x145f), .driver_info = DEVICE_ZD1211 },
  41        { USB_DEVICE(0x0586, 0x3401), .driver_info = DEVICE_ZD1211 },
  42        { USB_DEVICE(0x0586, 0x3402), .driver_info = DEVICE_ZD1211 },
  43        { USB_DEVICE(0x0586, 0x3407), .driver_info = DEVICE_ZD1211 },
  44        { USB_DEVICE(0x0586, 0x3409), .driver_info = DEVICE_ZD1211 },
  45        { USB_DEVICE(0x079b, 0x004a), .driver_info = DEVICE_ZD1211 },
  46        { USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211 },
  47        { USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 },
  48        { USB_DEVICE(0x0ace, 0xa211), .driver_info = DEVICE_ZD1211 },
  49        { USB_DEVICE(0x0b05, 0x170c), .driver_info = DEVICE_ZD1211 },
  50        { USB_DEVICE(0x0b3b, 0x1630), .driver_info = DEVICE_ZD1211 },
  51        { USB_DEVICE(0x0b3b, 0x5630), .driver_info = DEVICE_ZD1211 },
  52        { USB_DEVICE(0x0df6, 0x9071), .driver_info = DEVICE_ZD1211 },
  53        { USB_DEVICE(0x0df6, 0x9075), .driver_info = DEVICE_ZD1211 },
  54        { USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 },
  55        { USB_DEVICE(0x129b, 0x1666), .driver_info = DEVICE_ZD1211 },
  56        { USB_DEVICE(0x13b1, 0x001e), .driver_info = DEVICE_ZD1211 },
  57        { USB_DEVICE(0x1435, 0x0711), .driver_info = DEVICE_ZD1211 },
  58        { USB_DEVICE(0x14ea, 0xab13), .driver_info = DEVICE_ZD1211 },
  59        { USB_DEVICE(0x157e, 0x300a), .driver_info = DEVICE_ZD1211 },
  60        { USB_DEVICE(0x157e, 0x300b), .driver_info = DEVICE_ZD1211 },
  61        { USB_DEVICE(0x157e, 0x3204), .driver_info = DEVICE_ZD1211 },
  62        { USB_DEVICE(0x1740, 0x2000), .driver_info = DEVICE_ZD1211 },
  63        { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 },
  64        /* ZD1211B */
  65        { USB_DEVICE(0x0053, 0x5301), .driver_info = DEVICE_ZD1211B },
  66        { USB_DEVICE(0x0409, 0x0248), .driver_info = DEVICE_ZD1211B },
  67        { USB_DEVICE(0x0411, 0x00da), .driver_info = DEVICE_ZD1211B },
  68        { USB_DEVICE(0x0471, 0x1236), .driver_info = DEVICE_ZD1211B },
  69        { USB_DEVICE(0x0471, 0x1237), .driver_info = DEVICE_ZD1211B },
  70        { USB_DEVICE(0x050d, 0x705c), .driver_info = DEVICE_ZD1211B },
  71        { USB_DEVICE(0x054c, 0x0257), .driver_info = DEVICE_ZD1211B },
  72        { USB_DEVICE(0x0586, 0x340a), .driver_info = DEVICE_ZD1211B },
  73        { USB_DEVICE(0x0586, 0x340f), .driver_info = DEVICE_ZD1211B },
  74        { USB_DEVICE(0x0586, 0x3410), .driver_info = DEVICE_ZD1211B },
  75        { USB_DEVICE(0x0586, 0x3412), .driver_info = DEVICE_ZD1211B },
  76        { USB_DEVICE(0x0586, 0x3413), .driver_info = DEVICE_ZD1211B },
  77        { USB_DEVICE(0x079b, 0x0062), .driver_info = DEVICE_ZD1211B },
  78        { USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211B },
  79        { USB_DEVICE(0x07fa, 0x1196), .driver_info = DEVICE_ZD1211B },
  80        { USB_DEVICE(0x083a, 0x4505), .driver_info = DEVICE_ZD1211B },
  81        { USB_DEVICE(0x083a, 0xe501), .driver_info = DEVICE_ZD1211B },
  82        { USB_DEVICE(0x083a, 0xe503), .driver_info = DEVICE_ZD1211B },
  83        { USB_DEVICE(0x083a, 0xe506), .driver_info = DEVICE_ZD1211B },
  84        { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B },
  85        { USB_DEVICE(0x0ace, 0xb215), .driver_info = DEVICE_ZD1211B },
  86        { USB_DEVICE(0x0b05, 0x171b), .driver_info = DEVICE_ZD1211B },
  87        { USB_DEVICE(0x0baf, 0x0121), .driver_info = DEVICE_ZD1211B },
  88        { USB_DEVICE(0x0cde, 0x001a), .driver_info = DEVICE_ZD1211B },
  89        { USB_DEVICE(0x0df6, 0x0036), .driver_info = DEVICE_ZD1211B },
  90        { USB_DEVICE(0x129b, 0x1667), .driver_info = DEVICE_ZD1211B },
  91        { USB_DEVICE(0x13b1, 0x0024), .driver_info = DEVICE_ZD1211B },
  92        { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B },
  93        { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B },
  94        { USB_DEVICE(0x2019, 0x5303), .driver_info = DEVICE_ZD1211B },
  95        /* "Driverless" devices that need ejecting */
  96        { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER },
  97        { USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER },
  98        {}
  99};
 100
 101MODULE_LICENSE("GPL");
 102MODULE_DESCRIPTION("USB driver for devices with the ZD1211 chip.");
 103MODULE_AUTHOR("Ulrich Kunitz");
 104MODULE_AUTHOR("Daniel Drake");
 105MODULE_VERSION("1.0");
 106MODULE_DEVICE_TABLE(usb, usb_ids);
 107
 108#define FW_ZD1211_PREFIX        "zd1211/zd1211_"
 109#define FW_ZD1211B_PREFIX       "zd1211/zd1211b_"
 110
 111/* USB device initialization */
 112static void int_urb_complete(struct urb *urb);
 113
 114static int request_fw_file(
 115        const struct firmware **fw, const char *name, struct device *device)
 116{
 117        int r;
 118
 119        dev_dbg_f(device, "fw name %s\n", name);
 120
 121        r = request_firmware(fw, name, device);
 122        if (r)
 123                dev_err(device,
 124                       "Could not load firmware file %s. Error number %d\n",
 125                       name, r);
 126        return r;
 127}
 128
 129static inline u16 get_bcdDevice(const struct usb_device *udev)
 130{
 131        return le16_to_cpu(udev->descriptor.bcdDevice);
 132}
 133
 134enum upload_code_flags {
 135        REBOOT = 1,
 136};
 137
 138/* Ensures that MAX_TRANSFER_SIZE is even. */
 139#define MAX_TRANSFER_SIZE (USB_MAX_TRANSFER_SIZE & ~1)
 140
 141static int upload_code(struct usb_device *udev,
 142        const u8 *data, size_t size, u16 code_offset, int flags)
 143{
 144        u8 *p;
 145        int r;
 146
 147        /* USB request blocks need "kmalloced" buffers.
 148         */
 149        p = kmalloc(MAX_TRANSFER_SIZE, GFP_KERNEL);
 150        if (!p) {
 151                dev_err(&udev->dev, "out of memory\n");
 152                r = -ENOMEM;
 153                goto error;
 154        }
 155
 156        size &= ~1;
 157        while (size > 0) {
 158                size_t transfer_size = size <= MAX_TRANSFER_SIZE ?
 159                        size : MAX_TRANSFER_SIZE;
 160
 161                dev_dbg_f(&udev->dev, "transfer size %zu\n", transfer_size);
 162
 163                memcpy(p, data, transfer_size);
 164                r = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 165                        USB_REQ_FIRMWARE_DOWNLOAD,
 166                        USB_DIR_OUT | USB_TYPE_VENDOR,
 167                        code_offset, 0, p, transfer_size, 1000 /* ms */);
 168                if (r < 0) {
 169                        dev_err(&udev->dev,
 170                               "USB control request for firmware upload"
 171                               " failed. Error number %d\n", r);
 172                        goto error;
 173                }
 174                transfer_size = r & ~1;
 175
 176                size -= transfer_size;
 177                data += transfer_size;
 178                code_offset += transfer_size/sizeof(u16);
 179        }
 180
 181        if (flags & REBOOT) {
 182                u8 ret;
 183
 184                /* Use "DMA-aware" buffer. */
 185                r = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
 186                        USB_REQ_FIRMWARE_CONFIRM,
 187                        USB_DIR_IN | USB_TYPE_VENDOR,
 188                        0, 0, p, sizeof(ret), 5000 /* ms */);
 189                if (r != sizeof(ret)) {
 190                        dev_err(&udev->dev,
 191                                "control request firmeware confirmation failed."
 192                                " Return value %d\n", r);
 193                        if (r >= 0)
 194                                r = -ENODEV;
 195                        goto error;
 196                }
 197                ret = p[0];
 198                if (ret & 0x80) {
 199                        dev_err(&udev->dev,
 200                                "Internal error while downloading."
 201                                " Firmware confirm return value %#04x\n",
 202                                (unsigned int)ret);
 203                        r = -ENODEV;
 204                        goto error;
 205                }
 206                dev_dbg_f(&udev->dev, "firmware confirm return value %#04x\n",
 207                        (unsigned int)ret);
 208        }
 209
 210        r = 0;
 211error:
 212        kfree(p);
 213        return r;
 214}
 215
 216static u16 get_word(const void *data, u16 offset)
 217{
 218        const __le16 *p = data;
 219        return le16_to_cpu(p[offset]);
 220}
 221
 222static char *get_fw_name(struct zd_usb *usb, char *buffer, size_t size,
 223                       const char* postfix)
 224{
 225        scnprintf(buffer, size, "%s%s",
 226                usb->is_zd1211b ?
 227                        FW_ZD1211B_PREFIX : FW_ZD1211_PREFIX,
 228                postfix);
 229        return buffer;
 230}
 231
 232static int handle_version_mismatch(struct zd_usb *usb,
 233        const struct firmware *ub_fw)
 234{
 235        struct usb_device *udev = zd_usb_to_usbdev(usb);
 236        const struct firmware *ur_fw = NULL;
 237        int offset;
 238        int r = 0;
 239        char fw_name[128];
 240
 241        r = request_fw_file(&ur_fw,
 242                get_fw_name(usb, fw_name, sizeof(fw_name), "ur"),
 243                &udev->dev);
 244        if (r)
 245                goto error;
 246
 247        r = upload_code(udev, ur_fw->data, ur_fw->size, FW_START, REBOOT);
 248        if (r)
 249                goto error;
 250
 251        offset = (E2P_BOOT_CODE_OFFSET * sizeof(u16));
 252        r = upload_code(udev, ub_fw->data + offset, ub_fw->size - offset,
 253                E2P_START + E2P_BOOT_CODE_OFFSET, REBOOT);
 254
 255        /* At this point, the vendor driver downloads the whole firmware
 256         * image, hacks around with version IDs, and uploads it again,
 257         * completely overwriting the boot code. We do not do this here as
 258         * it is not required on any tested devices, and it is suspected to
 259         * cause problems. */
 260error:
 261        release_firmware(ur_fw);
 262        return r;
 263}
 264
 265static int upload_firmware(struct zd_usb *usb)
 266{
 267        int r;
 268        u16 fw_bcdDevice;
 269        u16 bcdDevice;
 270        struct usb_device *udev = zd_usb_to_usbdev(usb);
 271        const struct firmware *ub_fw = NULL;
 272        const struct firmware *uph_fw = NULL;
 273        char fw_name[128];
 274
 275        bcdDevice = get_bcdDevice(udev);
 276
 277        r = request_fw_file(&ub_fw,
 278                get_fw_name(usb, fw_name, sizeof(fw_name), "ub"),
 279                &udev->dev);
 280        if (r)
 281                goto error;
 282
 283        fw_bcdDevice = get_word(ub_fw->data, E2P_DATA_OFFSET);
 284
 285        if (fw_bcdDevice != bcdDevice) {
 286                dev_info(&udev->dev,
 287                        "firmware version %#06x and device bootcode version "
 288                        "%#06x differ\n", fw_bcdDevice, bcdDevice);
 289                if (bcdDevice <= 0x4313)
 290                        dev_warn(&udev->dev, "device has old bootcode, please "
 291                                "report success or failure\n");
 292
 293                r = handle_version_mismatch(usb, ub_fw);
 294                if (r)
 295                        goto error;
 296        } else {
 297                dev_dbg_f(&udev->dev,
 298                        "firmware device id %#06x is equal to the "
 299                        "actual device id\n", fw_bcdDevice);
 300        }
 301
 302
 303        r = request_fw_file(&uph_fw,
 304                get_fw_name(usb, fw_name, sizeof(fw_name), "uphr"),
 305                &udev->dev);
 306        if (r)
 307                goto error;
 308
 309        r = upload_code(udev, uph_fw->data, uph_fw->size, FW_START, REBOOT);
 310        if (r) {
 311                dev_err(&udev->dev,
 312                        "Could not upload firmware code uph. Error number %d\n",
 313                        r);
 314        }
 315
 316        /* FALL-THROUGH */
 317error:
 318        release_firmware(ub_fw);
 319        release_firmware(uph_fw);
 320        return r;
 321}
 322
 323MODULE_FIRMWARE(FW_ZD1211B_PREFIX "ur");
 324MODULE_FIRMWARE(FW_ZD1211_PREFIX "ur");
 325MODULE_FIRMWARE(FW_ZD1211B_PREFIX "ub");
 326MODULE_FIRMWARE(FW_ZD1211_PREFIX "ub");
 327MODULE_FIRMWARE(FW_ZD1211B_PREFIX "uphr");
 328MODULE_FIRMWARE(FW_ZD1211_PREFIX "uphr");
 329
 330/* Read data from device address space using "firmware interface" which does
 331 * not require firmware to be loaded. */
 332int zd_usb_read_fw(struct zd_usb *usb, zd_addr_t addr, u8 *data, u16 len)
 333{
 334        int r;
 335        struct usb_device *udev = zd_usb_to_usbdev(usb);
 336        u8 *buf;
 337
 338        /* Use "DMA-aware" buffer. */
 339        buf = kmalloc(len, GFP_KERNEL);
 340        if (!buf)
 341                return -ENOMEM;
 342        r = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
 343                USB_REQ_FIRMWARE_READ_DATA, USB_DIR_IN | 0x40, addr, 0,
 344                buf, len, 5000);
 345        if (r < 0) {
 346                dev_err(&udev->dev,
 347                        "read over firmware interface failed: %d\n", r);
 348                goto exit;
 349        } else if (r != len) {
 350                dev_err(&udev->dev,
 351                        "incomplete read over firmware interface: %d/%d\n",
 352                        r, len);
 353                r = -EIO;
 354                goto exit;
 355        }
 356        r = 0;
 357        memcpy(data, buf, len);
 358exit:
 359        kfree(buf);
 360        return r;
 361}
 362
 363#define urb_dev(urb) (&(urb)->dev->dev)
 364
 365static inline void handle_regs_int(struct urb *urb)
 366{
 367        struct zd_usb *usb = urb->context;
 368        struct zd_usb_interrupt *intr = &usb->intr;
 369        int len;
 370        u16 int_num;
 371
 372        ZD_ASSERT(in_interrupt());
 373        spin_lock(&intr->lock);
 374
 375        int_num = le16_to_cpu(*(__le16 *)(urb->transfer_buffer+2));
 376        if (int_num == CR_INTERRUPT) {
 377                struct zd_mac *mac = zd_hw_mac(zd_usb_to_hw(urb->context));
 378                memcpy(&mac->intr_buffer, urb->transfer_buffer,
 379                                USB_MAX_EP_INT_BUFFER);
 380                schedule_work(&mac->process_intr);
 381        } else if (intr->read_regs_enabled) {
 382                intr->read_regs.length = len = urb->actual_length;
 383
 384                if (len > sizeof(intr->read_regs.buffer))
 385                        len = sizeof(intr->read_regs.buffer);
 386                memcpy(intr->read_regs.buffer, urb->transfer_buffer, len);
 387                intr->read_regs_enabled = 0;
 388                complete(&intr->read_regs.completion);
 389                goto out;
 390        }
 391
 392out:
 393        spin_unlock(&intr->lock);
 394}
 395
 396static void int_urb_complete(struct urb *urb)
 397{
 398        int r;
 399        struct usb_int_header *hdr;
 400
 401        switch (urb->status) {
 402        case 0:
 403                break;
 404        case -ESHUTDOWN:
 405        case -EINVAL:
 406        case -ENODEV:
 407        case -ENOENT:
 408        case -ECONNRESET:
 409        case -EPIPE:
 410                goto kfree;
 411        default:
 412                goto resubmit;
 413        }
 414
 415        if (urb->actual_length < sizeof(hdr)) {
 416                dev_dbg_f(urb_dev(urb), "error: urb %p to small\n", urb);
 417                goto resubmit;
 418        }
 419
 420        hdr = urb->transfer_buffer;
 421        if (hdr->type != USB_INT_TYPE) {
 422                dev_dbg_f(urb_dev(urb), "error: urb %p wrong type\n", urb);
 423                goto resubmit;
 424        }
 425
 426        switch (hdr->id) {
 427        case USB_INT_ID_REGS:
 428                handle_regs_int(urb);
 429                break;
 430        case USB_INT_ID_RETRY_FAILED:
 431                zd_mac_tx_failed(urb);
 432                break;
 433        default:
 434                dev_dbg_f(urb_dev(urb), "error: urb %p unknown id %x\n", urb,
 435                        (unsigned int)hdr->id);
 436                goto resubmit;
 437        }
 438
 439resubmit:
 440        r = usb_submit_urb(urb, GFP_ATOMIC);
 441        if (r) {
 442                dev_dbg_f(urb_dev(urb), "resubmit urb %p\n", urb);
 443                goto kfree;
 444        }
 445        return;
 446kfree:
 447        kfree(urb->transfer_buffer);
 448}
 449
 450static inline int int_urb_interval(struct usb_device *udev)
 451{
 452        switch (udev->speed) {
 453        case USB_SPEED_HIGH:
 454                return 4;
 455        case USB_SPEED_LOW:
 456                return 10;
 457        case USB_SPEED_FULL:
 458        default:
 459                return 1;
 460        }
 461}
 462
 463static inline int usb_int_enabled(struct zd_usb *usb)
 464{
 465        unsigned long flags;
 466        struct zd_usb_interrupt *intr = &usb->intr;
 467        struct urb *urb;
 468
 469        spin_lock_irqsave(&intr->lock, flags);
 470        urb = intr->urb;
 471        spin_unlock_irqrestore(&intr->lock, flags);
 472        return urb != NULL;
 473}
 474
 475int zd_usb_enable_int(struct zd_usb *usb)
 476{
 477        int r;
 478        struct usb_device *udev;
 479        struct zd_usb_interrupt *intr = &usb->intr;
 480        void *transfer_buffer = NULL;
 481        struct urb *urb;
 482
 483        dev_dbg_f(zd_usb_dev(usb), "\n");
 484
 485        urb = usb_alloc_urb(0, GFP_KERNEL);
 486        if (!urb) {
 487                r = -ENOMEM;
 488                goto out;
 489        }
 490
 491        ZD_ASSERT(!irqs_disabled());
 492        spin_lock_irq(&intr->lock);
 493        if (intr->urb) {
 494                spin_unlock_irq(&intr->lock);
 495                r = 0;
 496                goto error_free_urb;
 497        }
 498        intr->urb = urb;
 499        spin_unlock_irq(&intr->lock);
 500
 501        /* TODO: make it a DMA buffer */
 502        r = -ENOMEM;
 503        transfer_buffer = kmalloc(USB_MAX_EP_INT_BUFFER, GFP_KERNEL);
 504        if (!transfer_buffer) {
 505                dev_dbg_f(zd_usb_dev(usb),
 506                        "couldn't allocate transfer_buffer\n");
 507                goto error_set_urb_null;
 508        }
 509
 510        udev = zd_usb_to_usbdev(usb);
 511        usb_fill_int_urb(urb, udev, usb_rcvintpipe(udev, EP_INT_IN),
 512                         transfer_buffer, USB_MAX_EP_INT_BUFFER,
 513                         int_urb_complete, usb,
 514                         intr->interval);
 515
 516        dev_dbg_f(zd_usb_dev(usb), "submit urb %p\n", intr->urb);
 517        r = usb_submit_urb(urb, GFP_KERNEL);
 518        if (r) {
 519                dev_dbg_f(zd_usb_dev(usb),
 520                         "Couldn't submit urb. Error number %d\n", r);
 521                goto error;
 522        }
 523
 524        return 0;
 525error:
 526        kfree(transfer_buffer);
 527error_set_urb_null:
 528        spin_lock_irq(&intr->lock);
 529        intr->urb = NULL;
 530        spin_unlock_irq(&intr->lock);
 531error_free_urb:
 532        usb_free_urb(urb);
 533out:
 534        return r;
 535}
 536
 537void zd_usb_disable_int(struct zd_usb *usb)
 538{
 539        unsigned long flags;
 540        struct zd_usb_interrupt *intr = &usb->intr;
 541        struct urb *urb;
 542
 543        spin_lock_irqsave(&intr->lock, flags);
 544        urb = intr->urb;
 545        if (!urb) {
 546                spin_unlock_irqrestore(&intr->lock, flags);
 547                return;
 548        }
 549        intr->urb = NULL;
 550        spin_unlock_irqrestore(&intr->lock, flags);
 551
 552        usb_kill_urb(urb);
 553        dev_dbg_f(zd_usb_dev(usb), "urb %p killed\n", urb);
 554        usb_free_urb(urb);
 555}
 556
 557static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer,
 558                             unsigned int length)
 559{
 560        int i;
 561        const struct rx_length_info *length_info;
 562
 563        if (length < sizeof(struct rx_length_info)) {
 564                /* It's not a complete packet anyhow. */
 565                printk("%s: invalid, small RX packet : %d\n",
 566                       __func__, length);
 567                return;
 568        }
 569        length_info = (struct rx_length_info *)
 570                (buffer + length - sizeof(struct rx_length_info));
 571
 572        /* It might be that three frames are merged into a single URB
 573         * transaction. We have to check for the length info tag.
 574         *
 575         * While testing we discovered that length_info might be unaligned,
 576         * because if USB transactions are merged, the last packet will not
 577         * be padded. Unaligned access might also happen if the length_info
 578         * structure is not present.
 579         */
 580        if (get_unaligned_le16(&length_info->tag) == RX_LENGTH_INFO_TAG)
 581        {
 582                unsigned int l, k, n;
 583                for (i = 0, l = 0;; i++) {
 584                        k = get_unaligned_le16(&length_info->length[i]);
 585                        if (k == 0)
 586                                return;
 587                        n = l+k;
 588                        if (n > length)
 589                                return;
 590                        zd_mac_rx(zd_usb_to_hw(usb), buffer+l, k);
 591                        if (i >= 2)
 592                                return;
 593                        l = (n+3) & ~3;
 594                }
 595        } else {
 596                zd_mac_rx(zd_usb_to_hw(usb), buffer, length);
 597        }
 598}
 599
 600static void rx_urb_complete(struct urb *urb)
 601{
 602        struct zd_usb *usb;
 603        struct zd_usb_rx *rx;
 604        const u8 *buffer;
 605        unsigned int length;
 606
 607        switch (urb->status) {
 608        case 0:
 609                break;
 610        case -ESHUTDOWN:
 611        case -EINVAL:
 612        case -ENODEV:
 613        case -ENOENT:
 614        case -ECONNRESET:
 615        case -EPIPE:
 616                return;
 617        default:
 618                dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status);
 619                goto resubmit;
 620        }
 621
 622        buffer = urb->transfer_buffer;
 623        length = urb->actual_length;
 624        usb = urb->context;
 625        rx = &usb->rx;
 626
 627        if (length%rx->usb_packet_size > rx->usb_packet_size-4) {
 628                /* If there is an old first fragment, we don't care. */
 629                dev_dbg_f(urb_dev(urb), "*** first fragment ***\n");
 630                ZD_ASSERT(length <= ARRAY_SIZE(rx->fragment));
 631                spin_lock(&rx->lock);
 632                memcpy(rx->fragment, buffer, length);
 633                rx->fragment_length = length;
 634                spin_unlock(&rx->lock);
 635                goto resubmit;
 636        }
 637
 638        spin_lock(&rx->lock);
 639        if (rx->fragment_length > 0) {
 640                /* We are on a second fragment, we believe */
 641                ZD_ASSERT(length + rx->fragment_length <=
 642                          ARRAY_SIZE(rx->fragment));
 643                dev_dbg_f(urb_dev(urb), "*** second fragment ***\n");
 644                memcpy(rx->fragment+rx->fragment_length, buffer, length);
 645                handle_rx_packet(usb, rx->fragment,
 646                                 rx->fragment_length + length);
 647                rx->fragment_length = 0;
 648                spin_unlock(&rx->lock);
 649        } else {
 650                spin_unlock(&rx->lock);
 651                handle_rx_packet(usb, buffer, length);
 652        }
 653
 654resubmit:
 655        usb_submit_urb(urb, GFP_ATOMIC);
 656}
 657
 658static struct urb *alloc_rx_urb(struct zd_usb *usb)
 659{
 660        struct usb_device *udev = zd_usb_to_usbdev(usb);
 661        struct urb *urb;
 662        void *buffer;
 663
 664        urb = usb_alloc_urb(0, GFP_KERNEL);
 665        if (!urb)
 666                return NULL;
 667        buffer = usb_buffer_alloc(udev, USB_MAX_RX_SIZE, GFP_KERNEL,
 668                                  &urb->transfer_dma);
 669        if (!buffer) {
 670                usb_free_urb(urb);
 671                return NULL;
 672        }
 673
 674        usb_fill_bulk_urb(urb, udev, usb_rcvbulkpipe(udev, EP_DATA_IN),
 675                          buffer, USB_MAX_RX_SIZE,
 676                          rx_urb_complete, usb);
 677        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 678
 679        return urb;
 680}
 681
 682static void free_rx_urb(struct urb *urb)
 683{
 684        if (!urb)
 685                return;
 686        usb_buffer_free(urb->dev, urb->transfer_buffer_length,
 687                        urb->transfer_buffer, urb->transfer_dma);
 688        usb_free_urb(urb);
 689}
 690
 691int zd_usb_enable_rx(struct zd_usb *usb)
 692{
 693        int i, r;
 694        struct zd_usb_rx *rx = &usb->rx;
 695        struct urb **urbs;
 696
 697        dev_dbg_f(zd_usb_dev(usb), "\n");
 698
 699        r = -ENOMEM;
 700        urbs = kcalloc(RX_URBS_COUNT, sizeof(struct urb *), GFP_KERNEL);
 701        if (!urbs)
 702                goto error;
 703        for (i = 0; i < RX_URBS_COUNT; i++) {
 704                urbs[i] = alloc_rx_urb(usb);
 705                if (!urbs[i])
 706                        goto error;
 707        }
 708
 709        ZD_ASSERT(!irqs_disabled());
 710        spin_lock_irq(&rx->lock);
 711        if (rx->urbs) {
 712                spin_unlock_irq(&rx->lock);
 713                r = 0;
 714                goto error;
 715        }
 716        rx->urbs = urbs;
 717        rx->urbs_count = RX_URBS_COUNT;
 718        spin_unlock_irq(&rx->lock);
 719
 720        for (i = 0; i < RX_URBS_COUNT; i++) {
 721                r = usb_submit_urb(urbs[i], GFP_KERNEL);
 722                if (r)
 723                        goto error_submit;
 724        }
 725
 726        return 0;
 727error_submit:
 728        for (i = 0; i < RX_URBS_COUNT; i++) {
 729                usb_kill_urb(urbs[i]);
 730        }
 731        spin_lock_irq(&rx->lock);
 732        rx->urbs = NULL;
 733        rx->urbs_count = 0;
 734        spin_unlock_irq(&rx->lock);
 735error:
 736        if (urbs) {
 737                for (i = 0; i < RX_URBS_COUNT; i++)
 738                        free_rx_urb(urbs[i]);
 739        }
 740        return r;
 741}
 742
 743void zd_usb_disable_rx(struct zd_usb *usb)
 744{
 745        int i;
 746        unsigned long flags;
 747        struct urb **urbs;
 748        unsigned int count;
 749        struct zd_usb_rx *rx = &usb->rx;
 750
 751        spin_lock_irqsave(&rx->lock, flags);
 752        urbs = rx->urbs;
 753        count = rx->urbs_count;
 754        spin_unlock_irqrestore(&rx->lock, flags);
 755        if (!urbs)
 756                return;
 757
 758        for (i = 0; i < count; i++) {
 759                usb_kill_urb(urbs[i]);
 760                free_rx_urb(urbs[i]);
 761        }
 762        kfree(urbs);
 763
 764        spin_lock_irqsave(&rx->lock, flags);
 765        rx->urbs = NULL;
 766        rx->urbs_count = 0;
 767        spin_unlock_irqrestore(&rx->lock, flags);
 768}
 769
 770/**
 771 * zd_usb_disable_tx - disable transmission
 772 * @usb: the zd1211rw-private USB structure
 773 *
 774 * Frees all URBs in the free list and marks the transmission as disabled.
 775 */
 776void zd_usb_disable_tx(struct zd_usb *usb)
 777{
 778        struct zd_usb_tx *tx = &usb->tx;
 779        unsigned long flags;
 780        struct list_head *pos, *n;
 781
 782        spin_lock_irqsave(&tx->lock, flags);
 783        list_for_each_safe(pos, n, &tx->free_urb_list) {
 784                list_del(pos);
 785                usb_free_urb(list_entry(pos, struct urb, urb_list));
 786        }
 787        tx->enabled = 0;
 788        tx->submitted_urbs = 0;
 789        /* The stopped state is ignored, relying on ieee80211_wake_queues()
 790         * in a potentionally following zd_usb_enable_tx().
 791         */
 792        spin_unlock_irqrestore(&tx->lock, flags);
 793}
 794
 795/**
 796 * zd_usb_enable_tx - enables transmission
 797 * @usb: a &struct zd_usb pointer
 798 *
 799 * This function enables transmission and prepares the &zd_usb_tx data
 800 * structure.
 801 */
 802void zd_usb_enable_tx(struct zd_usb *usb)
 803{
 804        unsigned long flags;
 805        struct zd_usb_tx *tx = &usb->tx;
 806
 807        spin_lock_irqsave(&tx->lock, flags);
 808        tx->enabled = 1;
 809        tx->submitted_urbs = 0;
 810        ieee80211_wake_queues(zd_usb_to_hw(usb));
 811        tx->stopped = 0;
 812        spin_unlock_irqrestore(&tx->lock, flags);
 813}
 814
 815/**
 816 * alloc_tx_urb - provides an tx URB
 817 * @usb: a &struct zd_usb pointer
 818 *
 819 * Allocates a new URB. If possible takes the urb from the free list in
 820 * usb->tx.
 821 */
 822static struct urb *alloc_tx_urb(struct zd_usb *usb)
 823{
 824        struct zd_usb_tx *tx = &usb->tx;
 825        unsigned long flags;
 826        struct list_head *entry;
 827        struct urb *urb;
 828
 829        spin_lock_irqsave(&tx->lock, flags);
 830        if (list_empty(&tx->free_urb_list)) {
 831                urb = usb_alloc_urb(0, GFP_ATOMIC);
 832                goto out;
 833        }
 834        entry = tx->free_urb_list.next;
 835        list_del(entry);
 836        urb = list_entry(entry, struct urb, urb_list);
 837out:
 838        spin_unlock_irqrestore(&tx->lock, flags);
 839        return urb;
 840}
 841
 842/**
 843 * free_tx_urb - frees a used tx URB
 844 * @usb: a &struct zd_usb pointer
 845 * @urb: URB to be freed
 846 *
 847 * Frees the the transmission URB, which means to put it on the free URB
 848 * list.
 849 */
 850static void free_tx_urb(struct zd_usb *usb, struct urb *urb)
 851{
 852        struct zd_usb_tx *tx = &usb->tx;
 853        unsigned long flags;
 854
 855        spin_lock_irqsave(&tx->lock, flags);
 856        if (!tx->enabled) {
 857                usb_free_urb(urb);
 858                goto out;
 859        }
 860        list_add(&urb->urb_list, &tx->free_urb_list);
 861out:
 862        spin_unlock_irqrestore(&tx->lock, flags);
 863}
 864
 865static void tx_dec_submitted_urbs(struct zd_usb *usb)
 866{
 867        struct zd_usb_tx *tx = &usb->tx;
 868        unsigned long flags;
 869
 870        spin_lock_irqsave(&tx->lock, flags);
 871        --tx->submitted_urbs;
 872        if (tx->stopped && tx->submitted_urbs <= ZD_USB_TX_LOW) {
 873                ieee80211_wake_queues(zd_usb_to_hw(usb));
 874                tx->stopped = 0;
 875        }
 876        spin_unlock_irqrestore(&tx->lock, flags);
 877}
 878
 879static void tx_inc_submitted_urbs(struct zd_usb *usb)
 880{
 881        struct zd_usb_tx *tx = &usb->tx;
 882        unsigned long flags;
 883
 884        spin_lock_irqsave(&tx->lock, flags);
 885        ++tx->submitted_urbs;
 886        if (!tx->stopped && tx->submitted_urbs > ZD_USB_TX_HIGH) {
 887                ieee80211_stop_queues(zd_usb_to_hw(usb));
 888                tx->stopped = 1;
 889        }
 890        spin_unlock_irqrestore(&tx->lock, flags);
 891}
 892
 893/**
 894 * tx_urb_complete - completes the execution of an URB
 895 * @urb: a URB
 896 *
 897 * This function is called if the URB has been transferred to a device or an
 898 * error has happened.
 899 */
 900static void tx_urb_complete(struct urb *urb)
 901{
 902        int r;
 903        struct sk_buff *skb;
 904        struct ieee80211_tx_info *info;
 905        struct zd_usb *usb;
 906
 907        switch (urb->status) {
 908        case 0:
 909                break;
 910        case -ESHUTDOWN:
 911        case -EINVAL:
 912        case -ENODEV:
 913        case -ENOENT:
 914        case -ECONNRESET:
 915        case -EPIPE:
 916                dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status);
 917                break;
 918        default:
 919                dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status);
 920                goto resubmit;
 921        }
 922free_urb:
 923        skb = (struct sk_buff *)urb->context;
 924        /*
 925         * grab 'usb' pointer before handing off the skb (since
 926         * it might be freed by zd_mac_tx_to_dev or mac80211)
 927         */
 928        info = IEEE80211_SKB_CB(skb);
 929        usb = &zd_hw_mac(info->rate_driver_data[0])->chip.usb;
 930        zd_mac_tx_to_dev(skb, urb->status);
 931        free_tx_urb(usb, urb);
 932        tx_dec_submitted_urbs(usb);
 933        return;
 934resubmit:
 935        r = usb_submit_urb(urb, GFP_ATOMIC);
 936        if (r) {
 937                dev_dbg_f(urb_dev(urb), "error resubmit urb %p %d\n", urb, r);
 938                goto free_urb;
 939        }
 940}
 941
 942/**
 943 * zd_usb_tx: initiates transfer of a frame of the device
 944 *
 945 * @usb: the zd1211rw-private USB structure
 946 * @skb: a &struct sk_buff pointer
 947 *
 948 * This function tranmits a frame to the device. It doesn't wait for
 949 * completion. The frame must contain the control set and have all the
 950 * control set information available.
 951 *
 952 * The function returns 0 if the transfer has been successfully initiated.
 953 */
 954int zd_usb_tx(struct zd_usb *usb, struct sk_buff *skb)
 955{
 956        int r;
 957        struct usb_device *udev = zd_usb_to_usbdev(usb);
 958        struct urb *urb;
 959
 960        urb = alloc_tx_urb(usb);
 961        if (!urb) {
 962                r = -ENOMEM;
 963                goto out;
 964        }
 965
 966        usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT),
 967                          skb->data, skb->len, tx_urb_complete, skb);
 968
 969        r = usb_submit_urb(urb, GFP_ATOMIC);
 970        if (r)
 971                goto error;
 972        tx_inc_submitted_urbs(usb);
 973        return 0;
 974error:
 975        free_tx_urb(usb, urb);
 976out:
 977        return r;
 978}
 979
 980static inline void init_usb_interrupt(struct zd_usb *usb)
 981{
 982        struct zd_usb_interrupt *intr = &usb->intr;
 983
 984        spin_lock_init(&intr->lock);
 985        intr->interval = int_urb_interval(zd_usb_to_usbdev(usb));
 986        init_completion(&intr->read_regs.completion);
 987        intr->read_regs.cr_int_addr = cpu_to_le16((u16)CR_INTERRUPT);
 988}
 989
 990static inline void init_usb_rx(struct zd_usb *usb)
 991{
 992        struct zd_usb_rx *rx = &usb->rx;
 993        spin_lock_init(&rx->lock);
 994        if (interface_to_usbdev(usb->intf)->speed == USB_SPEED_HIGH) {
 995                rx->usb_packet_size = 512;
 996        } else {
 997                rx->usb_packet_size = 64;
 998        }
 999        ZD_ASSERT(rx->fragment_length == 0);
1000}
1001
1002static inline void init_usb_tx(struct zd_usb *usb)
1003{
1004        struct zd_usb_tx *tx = &usb->tx;
1005        spin_lock_init(&tx->lock);
1006        tx->enabled = 0;
1007        tx->stopped = 0;
1008        INIT_LIST_HEAD(&tx->free_urb_list);
1009        tx->submitted_urbs = 0;
1010}
1011
1012void zd_usb_init(struct zd_usb *usb, struct ieee80211_hw *hw,
1013                 struct usb_interface *intf)
1014{
1015        memset(usb, 0, sizeof(*usb));
1016        usb->intf = usb_get_intf(intf);
1017        usb_set_intfdata(usb->intf, hw);
1018        init_usb_interrupt(usb);
1019        init_usb_tx(usb);
1020        init_usb_rx(usb);
1021}
1022
1023void zd_usb_clear(struct zd_usb *usb)
1024{
1025        usb_set_intfdata(usb->intf, NULL);
1026        usb_put_intf(usb->intf);
1027        ZD_MEMCLEAR(usb, sizeof(*usb));
1028        /* FIXME: usb_interrupt, usb_tx, usb_rx? */
1029}
1030
1031static const char *speed(enum usb_device_speed speed)
1032{
1033        switch (speed) {
1034        case USB_SPEED_LOW:
1035                return "low";
1036        case USB_SPEED_FULL:
1037                return "full";
1038        case USB_SPEED_HIGH:
1039                return "high";
1040        default:
1041                return "unknown speed";
1042        }
1043}
1044
1045static int scnprint_id(struct usb_device *udev, char *buffer, size_t size)
1046{
1047        return scnprintf(buffer, size, "%04hx:%04hx v%04hx %s",
1048                le16_to_cpu(udev->descriptor.idVendor),
1049                le16_to_cpu(udev->descriptor.idProduct),
1050                get_bcdDevice(udev),
1051                speed(udev->speed));
1052}
1053
1054int zd_usb_scnprint_id(struct zd_usb *usb, char *buffer, size_t size)
1055{
1056        struct usb_device *udev = interface_to_usbdev(usb->intf);
1057        return scnprint_id(udev, buffer, size);
1058}
1059
1060#ifdef DEBUG
1061static void print_id(struct usb_device *udev)
1062{
1063        char buffer[40];
1064
1065        scnprint_id(udev, buffer, sizeof(buffer));
1066        buffer[sizeof(buffer)-1] = 0;
1067        dev_dbg_f(&udev->dev, "%s\n", buffer);
1068}
1069#else
1070#define print_id(udev) do { } while (0)
1071#endif
1072
1073static int eject_installer(struct usb_interface *intf)
1074{
1075        struct usb_device *udev = interface_to_usbdev(intf);
1076        struct usb_host_interface *iface_desc = &intf->altsetting[0];
1077        struct usb_endpoint_descriptor *endpoint;
1078        unsigned char *cmd;
1079        u8 bulk_out_ep;
1080        int r;
1081
1082        /* Find bulk out endpoint */
1083        for (r = 1; r >= 0; r--) {
1084                endpoint = &iface_desc->endpoint[r].desc;
1085                if (usb_endpoint_dir_out(endpoint) &&
1086                    usb_endpoint_xfer_bulk(endpoint)) {
1087                        bulk_out_ep = endpoint->bEndpointAddress;
1088                        break;
1089                }
1090        }
1091        if (r == -1) {
1092                dev_err(&udev->dev,
1093                        "zd1211rw: Could not find bulk out endpoint\n");
1094                return -ENODEV;
1095        }
1096
1097        cmd = kzalloc(31, GFP_KERNEL);
1098        if (cmd == NULL)
1099                return -ENODEV;
1100
1101        /* USB bulk command block */
1102        cmd[0] = 0x55;  /* bulk command signature */
1103        cmd[1] = 0x53;  /* bulk command signature */
1104        cmd[2] = 0x42;  /* bulk command signature */
1105        cmd[3] = 0x43;  /* bulk command signature */
1106        cmd[14] = 6;    /* command length */
1107
1108        cmd[15] = 0x1b; /* SCSI command: START STOP UNIT */
1109        cmd[19] = 0x2;  /* eject disc */
1110
1111        dev_info(&udev->dev, "Ejecting virtual installer media...\n");
1112        r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, bulk_out_ep),
1113                cmd, 31, NULL, 2000);
1114        kfree(cmd);
1115        if (r)
1116                return r;
1117
1118        /* At this point, the device disconnects and reconnects with the real
1119         * ID numbers. */
1120
1121        usb_set_intfdata(intf, NULL);
1122        return 0;
1123}
1124
1125int zd_usb_init_hw(struct zd_usb *usb)
1126{
1127        int r;
1128        struct zd_mac *mac = zd_usb_to_mac(usb);
1129
1130        dev_dbg_f(zd_usb_dev(usb), "\n");
1131
1132        r = upload_firmware(usb);
1133        if (r) {
1134                dev_err(zd_usb_dev(usb),
1135                       "couldn't load firmware. Error number %d\n", r);
1136                return r;
1137        }
1138
1139        r = usb_reset_configuration(zd_usb_to_usbdev(usb));
1140        if (r) {
1141                dev_dbg_f(zd_usb_dev(usb),
1142                        "couldn't reset configuration. Error number %d\n", r);
1143                return r;
1144        }
1145
1146        r = zd_mac_init_hw(mac->hw);
1147        if (r) {
1148                dev_dbg_f(zd_usb_dev(usb),
1149                         "couldn't initialize mac. Error number %d\n", r);
1150                return r;
1151        }
1152
1153        usb->initialized = 1;
1154        return 0;
1155}
1156
1157static int probe(struct usb_interface *intf, const struct usb_device_id *id)
1158{
1159        int r;
1160        struct usb_device *udev = interface_to_usbdev(intf);
1161        struct zd_usb *usb;
1162        struct ieee80211_hw *hw = NULL;
1163
1164        print_id(udev);
1165
1166        if (id->driver_info & DEVICE_INSTALLER)
1167                return eject_installer(intf);
1168
1169        switch (udev->speed) {
1170        case USB_SPEED_LOW:
1171        case USB_SPEED_FULL:
1172        case USB_SPEED_HIGH:
1173                break;
1174        default:
1175                dev_dbg_f(&intf->dev, "Unknown USB speed\n");
1176                r = -ENODEV;
1177                goto error;
1178        }
1179
1180        r = usb_reset_device(udev);
1181        if (r) {
1182                dev_err(&intf->dev,
1183                        "couldn't reset usb device. Error number %d\n", r);
1184                goto error;
1185        }
1186
1187        hw = zd_mac_alloc_hw(intf);
1188        if (hw == NULL) {
1189                r = -ENOMEM;
1190                goto error;
1191        }
1192
1193        usb = &zd_hw_mac(hw)->chip.usb;
1194        usb->is_zd1211b = (id->driver_info == DEVICE_ZD1211B) != 0;
1195
1196        r = zd_mac_preinit_hw(hw);
1197        if (r) {
1198                dev_dbg_f(&intf->dev,
1199                         "couldn't initialize mac. Error number %d\n", r);
1200                goto error;
1201        }
1202
1203        r = ieee80211_register_hw(hw);
1204        if (r) {
1205                dev_dbg_f(&intf->dev,
1206                         "couldn't register device. Error number %d\n", r);
1207                goto error;
1208        }
1209
1210        dev_dbg_f(&intf->dev, "successful\n");
1211        dev_info(&intf->dev, "%s\n", wiphy_name(hw->wiphy));
1212        return 0;
1213error:
1214        usb_reset_device(interface_to_usbdev(intf));
1215        if (hw) {
1216                zd_mac_clear(zd_hw_mac(hw));
1217                ieee80211_free_hw(hw);
1218        }
1219        return r;
1220}
1221
1222static void disconnect(struct usb_interface *intf)
1223{
1224        struct ieee80211_hw *hw = zd_intf_to_hw(intf);
1225        struct zd_mac *mac;
1226        struct zd_usb *usb;
1227
1228        /* Either something really bad happened, or we're just dealing with
1229         * a DEVICE_INSTALLER. */
1230        if (hw == NULL)
1231                return;
1232
1233        mac = zd_hw_mac(hw);
1234        usb = &mac->chip.usb;
1235
1236        dev_dbg_f(zd_usb_dev(usb), "\n");
1237
1238        ieee80211_unregister_hw(hw);
1239
1240        /* Just in case something has gone wrong! */
1241        zd_usb_disable_rx(usb);
1242        zd_usb_disable_int(usb);
1243
1244        /* If the disconnect has been caused by a removal of the
1245         * driver module, the reset allows reloading of the driver. If the
1246         * reset will not be executed here, the upload of the firmware in the
1247         * probe function caused by the reloading of the driver will fail.
1248         */
1249        usb_reset_device(interface_to_usbdev(intf));
1250
1251        zd_mac_clear(mac);
1252        ieee80211_free_hw(hw);
1253        dev_dbg(&intf->dev, "disconnected\n");
1254}
1255
1256static struct usb_driver driver = {
1257        .name           = KBUILD_MODNAME,
1258        .id_table       = usb_ids,
1259        .probe          = probe,
1260        .disconnect     = disconnect,
1261};
1262
1263struct workqueue_struct *zd_workqueue;
1264
1265static int __init usb_init(void)
1266{
1267        int r;
1268
1269        pr_debug("%s usb_init()\n", driver.name);
1270
1271        zd_workqueue = create_singlethread_workqueue(driver.name);
1272        if (zd_workqueue == NULL) {
1273                printk(KERN_ERR "%s couldn't create workqueue\n", driver.name);
1274                return -ENOMEM;
1275        }
1276
1277        r = usb_register(&driver);
1278        if (r) {
1279                destroy_workqueue(zd_workqueue);
1280                printk(KERN_ERR "%s usb_register() failed. Error number %d\n",
1281                       driver.name, r);
1282                return r;
1283        }
1284
1285        pr_debug("%s initialized\n", driver.name);
1286        return 0;
1287}
1288
1289static void __exit usb_exit(void)
1290{
1291        pr_debug("%s usb_exit()\n", driver.name);
1292        usb_deregister(&driver);
1293        destroy_workqueue(zd_workqueue);
1294}
1295
1296module_init(usb_init);
1297module_exit(usb_exit);
1298
1299static int usb_int_regs_length(unsigned int count)
1300{
1301        return sizeof(struct usb_int_regs) + count * sizeof(struct reg_data);
1302}
1303
1304static void prepare_read_regs_int(struct zd_usb *usb)
1305{
1306        struct zd_usb_interrupt *intr = &usb->intr;
1307
1308        spin_lock_irq(&intr->lock);
1309        intr->read_regs_enabled = 1;
1310        INIT_COMPLETION(intr->read_regs.completion);
1311        spin_unlock_irq(&intr->lock);
1312}
1313
1314static void disable_read_regs_int(struct zd_usb *usb)
1315{
1316        struct zd_usb_interrupt *intr = &usb->intr;
1317
1318        spin_lock_irq(&intr->lock);
1319        intr->read_regs_enabled = 0;
1320        spin_unlock_irq(&intr->lock);
1321}
1322
1323static int get_results(struct zd_usb *usb, u16 *values,
1324                       struct usb_req_read_regs *req, unsigned int count)
1325{
1326        int r;
1327        int i;
1328        struct zd_usb_interrupt *intr = &usb->intr;
1329        struct read_regs_int *rr = &intr->read_regs;
1330        struct usb_int_regs *regs = (struct usb_int_regs *)rr->buffer;
1331
1332        spin_lock_irq(&intr->lock);
1333
1334        r = -EIO;
1335        /* The created block size seems to be larger than expected.
1336         * However results appear to be correct.
1337         */
1338        if (rr->length < usb_int_regs_length(count)) {
1339                dev_dbg_f(zd_usb_dev(usb),
1340                         "error: actual length %d less than expected %d\n",
1341                         rr->length, usb_int_regs_length(count));
1342                goto error_unlock;
1343        }
1344        if (rr->length > sizeof(rr->buffer)) {
1345                dev_dbg_f(zd_usb_dev(usb),
1346                         "error: actual length %d exceeds buffer size %zu\n",
1347                         rr->length, sizeof(rr->buffer));
1348                goto error_unlock;
1349        }
1350
1351        for (i = 0; i < count; i++) {
1352                struct reg_data *rd = &regs->regs[i];
1353                if (rd->addr != req->addr[i]) {
1354                        dev_dbg_f(zd_usb_dev(usb),
1355                                 "rd[%d] addr %#06hx expected %#06hx\n", i,
1356                                 le16_to_cpu(rd->addr),
1357                                 le16_to_cpu(req->addr[i]));
1358                        goto error_unlock;
1359                }
1360                values[i] = le16_to_cpu(rd->value);
1361        }
1362
1363        r = 0;
1364error_unlock:
1365        spin_unlock_irq(&intr->lock);
1366        return r;
1367}
1368
1369int zd_usb_ioread16v(struct zd_usb *usb, u16 *values,
1370                     const zd_addr_t *addresses, unsigned int count)
1371{
1372        int r;
1373        int i, req_len, actual_req_len;
1374        struct usb_device *udev;
1375        struct usb_req_read_regs *req = NULL;
1376        unsigned long timeout;
1377
1378        if (count < 1) {
1379                dev_dbg_f(zd_usb_dev(usb), "error: count is zero\n");
1380                return -EINVAL;
1381        }
1382        if (count > USB_MAX_IOREAD16_COUNT) {
1383                dev_dbg_f(zd_usb_dev(usb),
1384                         "error: count %u exceeds possible max %u\n",
1385                         count, USB_MAX_IOREAD16_COUNT);
1386                return -EINVAL;
1387        }
1388        if (in_atomic()) {
1389                dev_dbg_f(zd_usb_dev(usb),
1390                         "error: io in atomic context not supported\n");
1391                return -EWOULDBLOCK;
1392        }
1393        if (!usb_int_enabled(usb)) {
1394                 dev_dbg_f(zd_usb_dev(usb),
1395                          "error: usb interrupt not enabled\n");
1396                return -EWOULDBLOCK;
1397        }
1398
1399        req_len = sizeof(struct usb_req_read_regs) + count * sizeof(__le16);
1400        req = kmalloc(req_len, GFP_KERNEL);
1401        if (!req)
1402                return -ENOMEM;
1403        req->id = cpu_to_le16(USB_REQ_READ_REGS);
1404        for (i = 0; i < count; i++)
1405                req->addr[i] = cpu_to_le16((u16)addresses[i]);
1406
1407        udev = zd_usb_to_usbdev(usb);
1408        prepare_read_regs_int(usb);
1409        r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, EP_REGS_OUT),
1410                         req, req_len, &actual_req_len, 1000 /* ms */);
1411        if (r) {
1412                dev_dbg_f(zd_usb_dev(usb),
1413                        "error in usb_bulk_msg(). Error number %d\n", r);
1414                goto error;
1415        }
1416        if (req_len != actual_req_len) {
1417                dev_dbg_f(zd_usb_dev(usb), "error in usb_bulk_msg()\n"
1418                        " req_len %d != actual_req_len %d\n",
1419                        req_len, actual_req_len);
1420                r = -EIO;
1421                goto error;
1422        }
1423
1424        timeout = wait_for_completion_timeout(&usb->intr.read_regs.completion,
1425                                              msecs_to_jiffies(1000));
1426        if (!timeout) {
1427                disable_read_regs_int(usb);
1428                dev_dbg_f(zd_usb_dev(usb), "read timed out\n");
1429                r = -ETIMEDOUT;
1430                goto error;
1431        }
1432
1433        r = get_results(usb, values, req, count);
1434error:
1435        kfree(req);
1436        return r;
1437}
1438
1439int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs,
1440                      unsigned int count)
1441{
1442        int r;
1443        struct usb_device *udev;
1444        struct usb_req_write_regs *req = NULL;
1445        int i, req_len, actual_req_len;
1446
1447        if (count == 0)
1448                return 0;
1449        if (count > USB_MAX_IOWRITE16_COUNT) {
1450                dev_dbg_f(zd_usb_dev(usb),
1451                        "error: count %u exceeds possible max %u\n",
1452                        count, USB_MAX_IOWRITE16_COUNT);
1453                return -EINVAL;
1454        }
1455        if (in_atomic()) {
1456                dev_dbg_f(zd_usb_dev(usb),
1457                        "error: io in atomic context not supported\n");
1458                return -EWOULDBLOCK;
1459        }
1460
1461        req_len = sizeof(struct usb_req_write_regs) +
1462                  count * sizeof(struct reg_data);
1463        req = kmalloc(req_len, GFP_KERNEL);
1464        if (!req)
1465                return -ENOMEM;
1466
1467        req->id = cpu_to_le16(USB_REQ_WRITE_REGS);
1468        for (i = 0; i < count; i++) {
1469                struct reg_data *rw  = &req->reg_writes[i];
1470                rw->addr = cpu_to_le16((u16)ioreqs[i].addr);
1471                rw->value = cpu_to_le16(ioreqs[i].value);
1472        }
1473
1474        udev = zd_usb_to_usbdev(usb);
1475        r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, EP_REGS_OUT),
1476                         req, req_len, &actual_req_len, 1000 /* ms */);
1477        if (r) {
1478                dev_dbg_f(zd_usb_dev(usb),
1479                        "error in usb_bulk_msg(). Error number %d\n", r);
1480                goto error;
1481        }
1482        if (req_len != actual_req_len) {
1483                dev_dbg_f(zd_usb_dev(usb),
1484                        "error in usb_bulk_msg()"
1485                        " req_len %d != actual_req_len %d\n",
1486                        req_len, actual_req_len);
1487                r = -EIO;
1488                goto error;
1489        }
1490
1491        /* FALL-THROUGH with r == 0 */
1492error:
1493        kfree(req);
1494        return r;
1495}
1496
1497int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits)
1498{
1499        int r;
1500        struct usb_device *udev;
1501        struct usb_req_rfwrite *req = NULL;
1502        int i, req_len, actual_req_len;
1503        u16 bit_value_template;
1504
1505        if (in_atomic()) {
1506                dev_dbg_f(zd_usb_dev(usb),
1507                        "error: io in atomic context not supported\n");
1508                return -EWOULDBLOCK;
1509        }
1510        if (bits < USB_MIN_RFWRITE_BIT_COUNT) {
1511                dev_dbg_f(zd_usb_dev(usb),
1512                        "error: bits %d are smaller than"
1513                        " USB_MIN_RFWRITE_BIT_COUNT %d\n",
1514                        bits, USB_MIN_RFWRITE_BIT_COUNT);
1515                return -EINVAL;
1516        }
1517        if (bits > USB_MAX_RFWRITE_BIT_COUNT) {
1518                dev_dbg_f(zd_usb_dev(usb),
1519                        "error: bits %d exceed USB_MAX_RFWRITE_BIT_COUNT %d\n",
1520                        bits, USB_MAX_RFWRITE_BIT_COUNT);
1521                return -EINVAL;
1522        }
1523#ifdef DEBUG
1524        if (value & (~0UL << bits)) {
1525                dev_dbg_f(zd_usb_dev(usb),
1526                        "error: value %#09x has bits >= %d set\n",
1527                        value, bits);
1528                return -EINVAL;
1529        }
1530#endif /* DEBUG */
1531
1532        dev_dbg_f(zd_usb_dev(usb), "value %#09x bits %d\n", value, bits);
1533
1534        r = zd_usb_ioread16(usb, &bit_value_template, CR203);
1535        if (r) {
1536                dev_dbg_f(zd_usb_dev(usb),
1537                        "error %d: Couldn't read CR203\n", r);
1538                goto out;
1539        }
1540        bit_value_template &= ~(RF_IF_LE|RF_CLK|RF_DATA);
1541
1542        req_len = sizeof(struct usb_req_rfwrite) + bits * sizeof(__le16);
1543        req = kmalloc(req_len, GFP_KERNEL);
1544        if (!req)
1545                return -ENOMEM;
1546
1547        req->id = cpu_to_le16(USB_REQ_WRITE_RF);
1548        /* 1: 3683a, but not used in ZYDAS driver */
1549        req->value = cpu_to_le16(2);
1550        req->bits = cpu_to_le16(bits);
1551
1552        for (i = 0; i < bits; i++) {
1553                u16 bv = bit_value_template;
1554                if (value & (1 << (bits-1-i)))
1555                        bv |= RF_DATA;
1556                req->bit_values[i] = cpu_to_le16(bv);
1557        }
1558
1559        udev = zd_usb_to_usbdev(usb);
1560        r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, EP_REGS_OUT),
1561                         req, req_len, &actual_req_len, 1000 /* ms */);
1562        if (r) {
1563                dev_dbg_f(zd_usb_dev(usb),
1564                        "error in usb_bulk_msg(). Error number %d\n", r);
1565                goto out;
1566        }
1567        if (req_len != actual_req_len) {
1568                dev_dbg_f(zd_usb_dev(usb), "error in usb_bulk_msg()"
1569                        " req_len %d != actual_req_len %d\n",
1570                        req_len, actual_req_len);
1571                r = -EIO;
1572                goto out;
1573        }
1574
1575        /* FALL-THROUGH with r == 0 */
1576out:
1577        kfree(req);
1578        return r;
1579}
1580
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.