linux-old/drivers/usb/speedtch.c
<<
>>
Prefs
   1/******************************************************************************
   2 *  speedtouch.c  -  Alcatel SpeedTouch USB xDSL modem driver
   3 *
   4 *  Copyright (C) 2001, Alcatel
   5 *  Copyright (C) 2003, Duncan Sands
   6 *
   7 *  This program is free software; you can redistribute it and/or modify it
   8 *  under the terms of the GNU General Public License as published by the Free
   9 *  Software Foundation; either version 2 of the License, or (at your option)
  10 *  any later version.
  11 *
  12 *  This program is distributed in the hope that it will be useful, but WITHOUT
  13 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  15 *  more details.
  16 *
  17 *  You should have received a copy of the GNU General Public License along with
  18 *  this program; if not, write to the Free Software Foundation, Inc., 59
  19 *  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  20 *
  21 ******************************************************************************/
  22
  23/*
  24 *  Written by Johan Verrept, maintained by Duncan Sands (duncan.sands@free.fr)
  25 *
  26 *  1.7+:       - See the check-in logs
  27 *
  28 *  1.6:        - No longer opens a connection if the firmware is not loaded
  29 *              - Added support for the speedtouch 330
  30 *              - Removed the limit on the number of devices
  31 *              - Module now autoloads on device plugin
  32 *              - Merged relevant parts of sarlib
  33 *              - Replaced the kernel thread with a tasklet
  34 *              - New packet transmission code
  35 *              - Changed proc file contents
  36 *              - Fixed all known SMP races
  37 *              - Many fixes and cleanups
  38 *              - Various fixes by Oliver Neukum (oliver@neukum.name)
  39 *
  40 *  1.5A:       - Backport of version for inclusion in 2.5 series kernel
  41 *              - Modifications by Richard Purdie (rpurdie@rpsys.net)
  42 *              - made compatible with kernel 2.5.6 onwards by changing
  43 *              udsl_usb_send_data_context->urb to a pointer and adding code
  44 *              to alloc and free it
  45 *              - remove_wait_queue() added to udsl_atm_processqueue_thread()
  46 *
  47 *  1.5:        - fixed memory leak when atmsar_decode_aal5 returned NULL.
  48 *              (reported by stephen.robinson@zen.co.uk)
  49 *
  50 *  1.4:        - changed the spin_lock() under interrupt to spin_lock_irqsave()
  51 *              - unlink all active send urbs of a vcc that is being closed.
  52 *
  53 *  1.3.1:      - added the version number
  54 *
  55 *  1.3:        - Added multiple send urb support
  56 *              - fixed memory leak and vcc->tx_inuse starvation bug
  57 *                when not enough memory left in vcc.
  58 *
  59 *  1.2:        - Fixed race condition in udsl_usb_send_data()
  60 *  1.1:        - Turned off packet debugging
  61 *
  62 */
  63
  64#include <asm/semaphore.h>
  65#include <linux/module.h>
  66#include <linux/kernel.h>
  67#include <linux/sched.h>
  68#include <linux/timer.h>
  69#include <linux/errno.h>
  70#include <linux/proc_fs.h>
  71#include <linux/slab.h>
  72#include <linux/list.h>
  73#include <asm/uaccess.h>
  74#include <linux/smp_lock.h>
  75#include <linux/interrupt.h>
  76#include <linux/atm.h>
  77#include <linux/atmdev.h>
  78#include <linux/crc32.h>
  79#include <linux/init.h>
  80
  81/*
  82#define DEBUG
  83#define VERBOSE_DEBUG
  84*/
  85
  86#if !defined (DEBUG) && defined (CONFIG_USB_DEBUG)
  87#       define DEBUG
  88#endif
  89
  90#include <linux/usb.h>
  91
  92#ifdef DEBUG
  93#define DEBUG_ON(x)     BUG_ON(x)
  94#else
  95#define DEBUG_ON(x)     do { if (x); } while (0)
  96#endif
  97
  98#ifdef VERBOSE_DEBUG
  99static int udsl_print_packet (const unsigned char *data, int len);
 100#define PACKETDEBUG(arg...)     udsl_print_packet (arg)
 101#define vdbg(arg...)            dbg (arg)
 102#else
 103#define PACKETDEBUG(arg...)
 104#define vdbg(arg...)
 105#endif
 106
 107#define DRIVER_AUTHOR   "Johan Verrept, Duncan Sands <duncan.sands@free.fr>"
 108#define DRIVER_VERSION  "1.8"
 109#define DRIVER_DESC     "Alcatel SpeedTouch USB driver version " DRIVER_VERSION
 110
 111static const char udsl_driver_name [] = "speedtch";
 112
 113#define SPEEDTOUCH_VENDORID             0x06b9
 114#define SPEEDTOUCH_PRODUCTID            0x4061
 115
 116#define UDSL_MAX_RCV_URBS               4
 117#define UDSL_MAX_SND_URBS               4
 118#define UDSL_MAX_RCV_BUFS               8
 119#define UDSL_MAX_SND_BUFS               8
 120#define UDSL_MAX_RCV_BUF_SIZE           1024 /* ATM cells */
 121#define UDSL_MAX_SND_BUF_SIZE           1024 /* ATM cells */
 122#define UDSL_DEFAULT_RCV_URBS           1
 123#define UDSL_DEFAULT_SND_URBS           1
 124#define UDSL_DEFAULT_RCV_BUFS           2
 125#define UDSL_DEFAULT_SND_BUFS           2
 126#define UDSL_DEFAULT_RCV_BUF_SIZE       64 /* ATM cells */
 127#define UDSL_DEFAULT_SND_BUF_SIZE       64 /* ATM cells */
 128
 129static unsigned int num_rcv_urbs = UDSL_DEFAULT_RCV_URBS;
 130static unsigned int num_snd_urbs = UDSL_DEFAULT_SND_URBS;
 131static unsigned int num_rcv_bufs = UDSL_DEFAULT_RCV_BUFS;
 132static unsigned int num_snd_bufs = UDSL_DEFAULT_SND_BUFS;
 133static unsigned int rcv_buf_size = UDSL_DEFAULT_RCV_BUF_SIZE;
 134static unsigned int snd_buf_size = UDSL_DEFAULT_SND_BUF_SIZE;
 135
 136MODULE_PARM (num_rcv_urbs, "i");
 137MODULE_PARM_DESC (num_rcv_urbs, "Number of urbs used for reception (range: 0-" __MODULE_STRING (UDSL_MAX_RCV_URBS) ", default: " __MODULE_STRING (UDSL_DEFAULT_RCV_URBS) ")");
 138
 139MODULE_PARM (num_snd_urbs, "i");
 140MODULE_PARM_DESC (num_snd_urbs, "Number of urbs used for transmission (range: 0-" __MODULE_STRING (UDSL_MAX_SND_URBS) ", default: " __MODULE_STRING (UDSL_DEFAULT_SND_URBS) ")");
 141
 142MODULE_PARM (num_rcv_bufs, "i");
 143MODULE_PARM_DESC (num_rcv_bufs, "Number of buffers used for reception (range: 0-" __MODULE_STRING (UDSL_MAX_RCV_BUFS) ", default: " __MODULE_STRING (UDSL_DEFAULT_RCV_BUFS) ")");
 144
 145MODULE_PARM (num_snd_bufs, "i");
 146MODULE_PARM_DESC (num_snd_bufs, "Number of buffers used for transmission (range: 0-" __MODULE_STRING (UDSL_MAX_SND_BUFS) ", default: " __MODULE_STRING (UDSL_DEFAULT_SND_BUFS) ")");
 147
 148MODULE_PARM (rcv_buf_size, "i");
 149MODULE_PARM_DESC (rcv_buf_size, "Size of the buffers used for reception (range: 0-" __MODULE_STRING (UDSL_MAX_RCV_BUF_SIZE) ", default: " __MODULE_STRING (UDSL_DEFAULT_RCV_BUF_SIZE) ")");
 150
 151MODULE_PARM (snd_buf_size, "i");
 152MODULE_PARM_DESC (snd_buf_size, "Size of the buffers used for transmission (range: 0-" __MODULE_STRING (UDSL_MAX_SND_BUF_SIZE) ", default: " __MODULE_STRING (UDSL_DEFAULT_SND_BUF_SIZE) ")");
 153
 154#define UDSL_IOCTL_LINE_UP              1
 155#define UDSL_IOCTL_LINE_DOWN            2
 156
 157#define UDSL_ENDPOINT_DATA_OUT          0x07
 158#define UDSL_ENDPOINT_DATA_IN           0x87
 159
 160#define ATM_CELL_HEADER                 (ATM_CELL_SIZE - ATM_CELL_PAYLOAD)
 161#define UDSL_NUM_CELLS(x)               (((x) + ATM_AAL5_TRAILER + ATM_CELL_PAYLOAD - 1) / ATM_CELL_PAYLOAD)
 162
 163#define hex2int(c) ( (c >= '0') && (c <= '9') ? (c - '0') : ((c & 0xf) + 9) )
 164
 165static struct usb_device_id udsl_usb_ids [] = {
 166        { USB_DEVICE (SPEEDTOUCH_VENDORID, SPEEDTOUCH_PRODUCTID) },
 167        { }
 168};
 169
 170MODULE_DEVICE_TABLE (usb, udsl_usb_ids);
 171
 172/* receive */
 173
 174struct udsl_receive_buffer {
 175        struct list_head list;
 176        unsigned char *base;
 177        unsigned int filled_cells;
 178};
 179
 180struct udsl_receiver {
 181        struct list_head list;
 182        struct udsl_receive_buffer *buffer;
 183        struct urb *urb;
 184        struct udsl_instance_data *instance;
 185};
 186
 187struct udsl_vcc_data {
 188        /* vpi/vci lookup */
 189        struct list_head list;
 190        short vpi;
 191        int vci;
 192        struct atm_vcc *vcc;
 193
 194        /* raw cell reassembly */
 195        struct sk_buff *sarb;
 196};
 197
 198/* send */
 199
 200struct udsl_send_buffer {
 201        struct list_head list;
 202        unsigned char *base;
 203        unsigned char *free_start;
 204        unsigned int free_cells;
 205};
 206
 207struct udsl_sender {
 208        struct list_head list;
 209        struct udsl_send_buffer *buffer;
 210        struct urb *urb;
 211        struct udsl_instance_data *instance;
 212};
 213
 214struct udsl_control {
 215        struct atm_skb_data atm_data;
 216        unsigned int num_cells;
 217        unsigned int num_entire;
 218        unsigned int pdu_padding;
 219        unsigned char cell_header [ATM_CELL_HEADER];
 220        unsigned char aal5_trailer [ATM_AAL5_TRAILER];
 221};
 222
 223#define UDSL_SKB(x)             ((struct udsl_control *)(x)->cb)
 224
 225/* main driver data */
 226
 227struct udsl_instance_data {
 228        struct semaphore serialize;
 229
 230        /* USB device part */
 231        struct usb_device *usb_dev;
 232        char description [64];
 233        int firmware_loaded;
 234
 235        /* ATM device part */
 236        struct atm_dev *atm_dev;
 237        struct list_head vcc_list;
 238
 239        /* receive */
 240        struct udsl_receiver receivers [UDSL_MAX_RCV_URBS];
 241        struct udsl_receive_buffer receive_buffers [UDSL_MAX_RCV_BUFS];
 242
 243        spinlock_t receive_lock;
 244        struct list_head spare_receivers;
 245        struct list_head filled_receive_buffers;
 246
 247        struct tasklet_struct receive_tasklet;
 248        struct list_head spare_receive_buffers;
 249
 250        /* send */
 251        struct udsl_sender senders [UDSL_MAX_SND_URBS];
 252        struct udsl_send_buffer send_buffers [UDSL_MAX_SND_BUFS];
 253
 254        struct sk_buff_head sndqueue;
 255
 256        spinlock_t send_lock;
 257        struct list_head spare_senders;
 258        struct list_head spare_send_buffers;
 259
 260        struct tasklet_struct send_tasklet;
 261        struct sk_buff *current_skb;                    /* being emptied */
 262        struct udsl_send_buffer *current_buffer;        /* being filled */
 263        struct list_head filled_send_buffers;
 264};
 265
 266/* ATM */
 267
 268static void udsl_atm_dev_close (struct atm_dev *dev);
 269static int udsl_atm_open (struct atm_vcc *vcc, short vpi, int vci);
 270static void udsl_atm_close (struct atm_vcc *vcc);
 271static int udsl_atm_ioctl (struct atm_dev *dev, unsigned int cmd, void *arg);
 272static int udsl_atm_send (struct atm_vcc *vcc, struct sk_buff *skb);
 273static int udsl_atm_proc_read (struct atm_dev *atm_dev, loff_t *pos, char *page);
 274
 275static struct atmdev_ops udsl_atm_devops = {
 276        dev_close:      udsl_atm_dev_close,
 277        open:           udsl_atm_open,
 278        close:          udsl_atm_close,
 279        ioctl:          udsl_atm_ioctl,
 280        send:           udsl_atm_send,
 281        proc_read:      udsl_atm_proc_read,
 282        owner:          THIS_MODULE,
 283};
 284
 285/* USB */
 286
 287static void *udsl_usb_probe (struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id);
 288static void udsl_usb_disconnect (struct usb_device *dev, void *ptr);
 289static int udsl_usb_ioctl (struct usb_device *hub, unsigned int code, void *user_data);
 290
 291static struct usb_driver udsl_usb_driver = {
 292        owner:          THIS_MODULE,
 293        name:           udsl_driver_name,
 294        probe:          udsl_usb_probe,
 295        disconnect:     udsl_usb_disconnect,
 296        ioctl:          udsl_usb_ioctl,
 297        id_table:       udsl_usb_ids,
 298};
 299
 300
 301/***********
 302**  misc  **
 303***********/
 304
 305static inline void udsl_pop (struct atm_vcc *vcc, struct sk_buff *skb)
 306{
 307        if (vcc->pop)
 308                vcc->pop (vcc, skb);
 309        else
 310                dev_kfree_skb (skb);
 311}
 312
 313
 314/*************
 315**  decode  **
 316*************/
 317
 318static inline struct udsl_vcc_data *udsl_find_vcc (struct udsl_instance_data *instance, short vpi, int vci)
 319{
 320        struct udsl_vcc_data *vcc;
 321
 322        list_for_each_entry (vcc, &instance->vcc_list, list)
 323                if ((vcc->vci == vci) && (vcc->vpi == vpi))
 324                        return vcc;
 325        return NULL;
 326}
 327
 328static void udsl_extract_cells (struct udsl_instance_data *instance, unsigned char *source, unsigned int howmany)
 329{
 330        struct udsl_vcc_data *cached_vcc = NULL;
 331        struct atm_vcc *vcc;
 332        struct sk_buff *sarb;
 333        struct udsl_vcc_data *vcc_data;
 334        int cached_vci = 0;
 335        unsigned int i;
 336        int pti;
 337        int vci;
 338        short cached_vpi = 0;
 339        short vpi;
 340
 341        for (i = 0; i < howmany; i++, source += ATM_CELL_SIZE) {
 342                vpi = ((source [0] & 0x0f) << 4) | (source [1] >> 4);
 343                vci = ((source [1] & 0x0f) << 12) | (source [2] << 4) | (source [3] >> 4);
 344                pti = (source [3] & 0x2) != 0;
 345
 346                vdbg ("udsl_extract_cells: vpi %hd, vci %d, pti %d", vpi, vci, pti);
 347
 348                if (cached_vcc && (vci == cached_vci) && (vpi == cached_vpi))
 349                        vcc_data = cached_vcc;
 350                else if ((vcc_data = udsl_find_vcc (instance, vpi, vci))) {
 351                        cached_vcc = vcc_data;
 352                        cached_vpi = vpi;
 353                        cached_vci = vci;
 354                } else {
 355                        dbg ("udsl_extract_cells: unknown vpi/vci (%hd/%d)!", vpi, vci);
 356                        continue;
 357                }
 358
 359                vcc = vcc_data->vcc;
 360                sarb = vcc_data->sarb;
 361
 362                if (sarb->tail + ATM_CELL_PAYLOAD > sarb->end) {
 363                        dbg ("udsl_extract_cells: buffer overrun (sarb->len %u, vcc: 0x%p)!", sarb->len, vcc);
 364                        /* discard cells already received */
 365                        skb_trim (sarb, 0);
 366                }
 367
 368                memcpy (sarb->tail, source + ATM_CELL_HEADER, ATM_CELL_PAYLOAD);
 369                __skb_put (sarb, ATM_CELL_PAYLOAD);
 370
 371                if (pti) {
 372                        struct sk_buff *skb;
 373                        unsigned int length;
 374                        unsigned int pdu_length;
 375
 376                        length = (source [ATM_CELL_SIZE - 6] << 8) + source [ATM_CELL_SIZE - 5];
 377
 378                        /* guard against overflow */
 379                        if (length > ATM_MAX_AAL5_PDU) {
 380                                dbg ("udsl_extract_cells: bogus length %u (vcc: 0x%p)!", length, vcc);
 381                                atomic_inc (&vcc->stats->rx_err);
 382                                goto out;
 383                        }
 384
 385                        pdu_length = UDSL_NUM_CELLS (length) * ATM_CELL_PAYLOAD;
 386
 387                        if (sarb->len < pdu_length) {
 388                                dbg ("udsl_extract_cells: bogus pdu_length %u (sarb->len: %u, vcc: 0x%p)!", pdu_length, sarb->len, vcc);
 389                                atomic_inc (&vcc->stats->rx_err);
 390                                goto out;
 391                        }
 392
 393                        if (crc32_be (~0, sarb->tail - pdu_length, pdu_length) != 0xc704dd7b) {
 394                                dbg ("udsl_extract_cells: packet failed crc check (vcc: 0x%p)!", vcc);
 395                                atomic_inc (&vcc->stats->rx_err);
 396                                goto out;
 397                        }
 398
 399                        vdbg ("udsl_extract_cells: got packet (length: %u, pdu_length: %u, vcc: 0x%p)", length, pdu_length, vcc);
 400
 401                        if (!(skb = dev_alloc_skb (length))) {
 402                                dbg ("udsl_extract_cells: no memory for skb (length: %u)!", length);
 403                                atomic_inc (&vcc->stats->rx_drop);
 404                                goto out;
 405                        }
 406
 407                        vdbg ("udsl_extract_cells: allocated new sk_buff (skb: 0x%p, skb->truesize: %u)", skb, skb->truesize);
 408
 409                        if (!atm_charge (vcc, skb->truesize)) {
 410                                dbg ("udsl_extract_cells: failed atm_charge (skb->truesize: %u)!", skb->truesize);
 411                                dev_kfree_skb (skb);
 412                                goto out; /* atm_charge increments rx_drop */
 413                        }
 414
 415                        memcpy (skb->data, sarb->tail - pdu_length, length);
 416                        __skb_put (skb, length);
 417
 418                        vdbg ("udsl_extract_cells: sending skb 0x%p, skb->len %u, skb->truesize %u", skb, skb->len, skb->truesize);
 419
 420                        PACKETDEBUG (skb->data, skb->len);
 421
 422                        vcc->push (vcc, skb);
 423
 424                        atomic_inc (&vcc->stats->rx);
 425out:
 426                        skb_trim (sarb, 0);
 427                }
 428        }
 429}
 430
 431
 432/*************
 433**  encode  **
 434*************/
 435
 436static const unsigned char zeros [ATM_CELL_PAYLOAD];
 437
 438static void udsl_groom_skb (struct atm_vcc *vcc, struct sk_buff *skb)
 439{
 440        struct udsl_control *ctrl = UDSL_SKB (skb);
 441        unsigned int zero_padding;
 442        u32 crc;
 443
 444        ctrl->atm_data.vcc = vcc;
 445        ctrl->cell_header [0] = vcc->vpi >> 4;
 446        ctrl->cell_header [1] = (vcc->vpi << 4) | (vcc->vci >> 12);
 447        ctrl->cell_header [2] = vcc->vci >> 4;
 448        ctrl->cell_header [3] = vcc->vci << 4;
 449        ctrl->cell_header [4] = 0xec;
 450
 451        ctrl->num_cells = UDSL_NUM_CELLS (skb->len);
 452        ctrl->num_entire = skb->len / ATM_CELL_PAYLOAD;
 453
 454        zero_padding = ctrl->num_cells * ATM_CELL_PAYLOAD - skb->len - ATM_AAL5_TRAILER;
 455
 456        if (ctrl->num_entire + 1 < ctrl->num_cells)
 457                ctrl->pdu_padding = zero_padding - (ATM_CELL_PAYLOAD - ATM_AAL5_TRAILER);
 458        else
 459                ctrl->pdu_padding = zero_padding;
 460
 461        ctrl->aal5_trailer [0] = 0; /* UU = 0 */
 462        ctrl->aal5_trailer [1] = 0; /* CPI = 0 */
 463        ctrl->aal5_trailer [2] = skb->len >> 8;
 464        ctrl->aal5_trailer [3] = skb->len;
 465
 466        crc = crc32_be (~0, skb->data, skb->len);
 467        crc = crc32_be (crc, zeros, zero_padding);
 468        crc = crc32_be (crc, ctrl->aal5_trailer, 4);
 469        crc = ~crc;
 470
 471        ctrl->aal5_trailer [4] = crc >> 24;
 472        ctrl->aal5_trailer [5] = crc >> 16;
 473        ctrl->aal5_trailer [6] = crc >> 8;
 474        ctrl->aal5_trailer [7] = crc;
 475}
 476
 477static unsigned int udsl_write_cells (unsigned int howmany, struct sk_buff *skb, unsigned char **target_p)
 478{
 479        struct udsl_control *ctrl = UDSL_SKB (skb);
 480        unsigned char *target = *target_p;
 481        unsigned int nc, ne, i;
 482
 483        vdbg ("udsl_write_cells: howmany=%u, skb->len=%d, num_cells=%u, num_entire=%u, pdu_padding=%u", howmany, skb->len, ctrl->num_cells, ctrl->num_entire, ctrl->pdu_padding);
 484
 485        nc = ctrl->num_cells;
 486        ne = min (howmany, ctrl->num_entire);
 487
 488        for (i = 0; i < ne; i++) {
 489                memcpy (target, ctrl->cell_header, ATM_CELL_HEADER);
 490                target += ATM_CELL_HEADER;
 491                memcpy (target, skb->data, ATM_CELL_PAYLOAD);
 492                target += ATM_CELL_PAYLOAD;
 493                __skb_pull (skb, ATM_CELL_PAYLOAD);
 494        }
 495
 496        ctrl->num_entire -= ne;
 497
 498        if (!(ctrl->num_cells -= ne) || !(howmany -= ne))
 499                goto out;
 500
 501        memcpy (target, ctrl->cell_header, ATM_CELL_HEADER);
 502        target += ATM_CELL_HEADER;
 503        memcpy (target, skb->data, skb->len);
 504        target += skb->len;
 505        __skb_pull (skb, skb->len);
 506        memset (target, 0, ctrl->pdu_padding);
 507        target += ctrl->pdu_padding;
 508
 509        if (--ctrl->num_cells) {
 510                if (!--howmany) {
 511                        ctrl->pdu_padding = ATM_CELL_PAYLOAD - ATM_AAL5_TRAILER;
 512                        goto out;
 513                }
 514
 515                memcpy (target, ctrl->cell_header, ATM_CELL_HEADER);
 516                target += ATM_CELL_HEADER;
 517                memset (target, 0, ATM_CELL_PAYLOAD - ATM_AAL5_TRAILER);
 518                target += ATM_CELL_PAYLOAD - ATM_AAL5_TRAILER;
 519
 520                DEBUG_ON (--ctrl->num_cells);
 521        }
 522
 523        memcpy (target, ctrl->aal5_trailer, ATM_AAL5_TRAILER);
 524        target += ATM_AAL5_TRAILER;
 525        /* set pti bit in last cell */
 526        *(target + 3 - ATM_CELL_SIZE) |= 0x2;
 527
 528out:
 529        *target_p = target;
 530        return nc - ctrl->num_cells;
 531}
 532
 533
 534/**************
 535**  receive  **
 536**************/
 537
 538static void udsl_complete_receive (struct urb *urb)
 539{
 540        struct udsl_receive_buffer *buf;
 541        struct udsl_instance_data *instance;
 542        struct udsl_receiver *rcv;
 543        unsigned long flags;
 544
 545        if (!urb || !(rcv = urb->context)) {
 546                dbg ("udsl_complete_receive: bad urb!");
 547                return;
 548        }
 549
 550        instance = rcv->instance;
 551        buf = rcv->buffer;
 552
 553        buf->filled_cells = urb->actual_length / ATM_CELL_SIZE;
 554
 555        vdbg ("udsl_complete_receive: urb 0x%p, status %d, actual_length %d, filled_cells %u, rcv 0x%p, buf 0x%p", urb, urb->status, urb->actual_length, buf->filled_cells, rcv, buf);
 556
 557        DEBUG_ON (buf->filled_cells > rcv_buf_size);
 558
 559        /* may not be in_interrupt() */
 560        spin_lock_irqsave (&instance->receive_lock, flags);
 561        list_add (&rcv->list, &instance->spare_receivers);
 562        list_add_tail (&buf->list, &instance->filled_receive_buffers);
 563        if (likely (!urb->status))
 564                tasklet_schedule (&instance->receive_tasklet);
 565        spin_unlock_irqrestore (&instance->receive_lock, flags);
 566}
 567
 568static void udsl_process_receive (unsigned long data)
 569{
 570        struct udsl_receive_buffer *buf;
 571        struct udsl_instance_data *instance = (struct udsl_instance_data *) data;
 572        struct udsl_receiver *rcv;
 573        int err;
 574
 575made_progress:
 576        while (!list_empty (&instance->spare_receive_buffers)) {
 577                spin_lock_irq (&instance->receive_lock);
 578                if (list_empty (&instance->spare_receivers)) {
 579                        spin_unlock_irq (&instance->receive_lock);
 580                        break;
 581                }
 582                rcv = list_entry (instance->spare_receivers.next, struct udsl_receiver, list);
 583                list_del (&rcv->list);
 584                spin_unlock_irq (&instance->receive_lock);
 585
 586                buf = list_entry (instance->spare_receive_buffers.next, struct udsl_receive_buffer, list);
 587                list_del (&buf->list);
 588
 589                rcv->buffer = buf;
 590
 591                FILL_BULK_URB (rcv->urb,
 592                               instance->usb_dev,
 593                               usb_rcvbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_IN),
 594                               buf->base,
 595                               rcv_buf_size * ATM_CELL_SIZE,
 596                               udsl_complete_receive,
 597                               rcv);
 598                rcv->urb->transfer_flags |= USB_QUEUE_BULK;
 599
 600                vdbg ("udsl_process_receive: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf);
 601
 602                if ((err = usb_submit_urb(rcv->urb)) < 0) {
 603                        dbg ("udsl_process_receive: urb submission failed (%d)!", err);
 604                        list_add (&buf->list, &instance->spare_receive_buffers);
 605                        spin_lock_irq (&instance->receive_lock);
 606                        list_add (&rcv->list, &instance->spare_receivers);
 607                        spin_unlock_irq (&instance->receive_lock);
 608                        break;
 609                }
 610        }
 611
 612        spin_lock_irq (&instance->receive_lock);
 613        if (list_empty (&instance->filled_receive_buffers)) {
 614                spin_unlock_irq (&instance->receive_lock);
 615                return; /* done - no more buffers */
 616        }
 617        buf = list_entry (instance->filled_receive_buffers.next, struct udsl_receive_buffer, list);
 618        list_del (&buf->list);
 619        spin_unlock_irq (&instance->receive_lock);
 620        vdbg ("udsl_process_receive: processing buf 0x%p", buf);
 621        udsl_extract_cells (instance, buf->base, buf->filled_cells);
 622        list_add (&buf->list, &instance->spare_receive_buffers);
 623        goto made_progress;
 624}
 625
 626
 627/***********
 628**  send  **
 629***********/
 630
 631static void udsl_complete_send (struct urb *urb)
 632{
 633        struct udsl_instance_data *instance;
 634        struct udsl_sender *snd;
 635        unsigned long flags;
 636
 637        if (!urb || !(snd = urb->context) || !(instance = snd->instance)) {
 638                dbg ("udsl_complete_send: bad urb!");
 639                return;
 640        }
 641
 642        vdbg ("udsl_complete_send: urb 0x%p, status %d, snd 0x%p, buf 0x%p", urb, urb->status, snd, snd->buffer);
 643
 644        /* may not be in_interrupt() */
 645        spin_lock_irqsave (&instance->send_lock, flags);
 646        list_add (&snd->list, &instance->spare_senders);
 647        list_add (&snd->buffer->list, &instance->spare_send_buffers);
 648        tasklet_schedule (&instance->send_tasklet);
 649        spin_unlock_irqrestore (&instance->send_lock, flags);
 650}
 651
 652static void udsl_process_send (unsigned long data)
 653{
 654        struct udsl_send_buffer *buf;
 655        struct udsl_instance_data *instance = (struct udsl_instance_data *) data;
 656        struct sk_buff *skb;
 657        struct udsl_sender *snd;
 658        int err;
 659        unsigned int num_written;
 660
 661made_progress:
 662        spin_lock_irq (&instance->send_lock);
 663        while (!list_empty (&instance->spare_senders)) {
 664                if (!list_empty (&instance->filled_send_buffers)) {
 665                        buf = list_entry (instance->filled_send_buffers.next, struct udsl_send_buffer, list);
 666                        list_del (&buf->list);
 667                } else if ((buf = instance->current_buffer)) {
 668                        instance->current_buffer = NULL;
 669                } else /* all buffers empty */
 670                        break;
 671
 672                snd = list_entry (instance->spare_senders.next, struct udsl_sender, list);
 673                list_del (&snd->list);
 674                spin_unlock_irq (&instance->send_lock);
 675
 676                snd->buffer = buf;
 677                FILL_BULK_URB (snd->urb,
 678                               instance->usb_dev,
 679                               usb_sndbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_OUT),
 680                               buf->base,
 681                               (snd_buf_size - buf->free_cells) * ATM_CELL_SIZE,
 682                               udsl_complete_send,
 683                               snd);
 684                snd->urb->transfer_flags |= USB_QUEUE_BULK;
 685
 686                vdbg ("udsl_process_send: submitting urb 0x%p (%d cells), snd 0x%p, buf 0x%p", snd->urb, snd_buf_size - buf->free_cells, snd, buf);
 687
 688                if ((err = usb_submit_urb(snd->urb)) < 0) {
 689                        dbg ("udsl_process_send: urb submission failed (%d)!", err);
 690                        spin_lock_irq (&instance->send_lock);
 691                        list_add (&snd->list, &instance->spare_senders);
 692                        spin_unlock_irq (&instance->send_lock);
 693                        list_add (&buf->list, &instance->filled_send_buffers);
 694                        return; /* bail out */
 695                }
 696
 697                spin_lock_irq (&instance->send_lock);
 698        } /* while */
 699        spin_unlock_irq (&instance->send_lock);
 700
 701        if (!instance->current_skb && !(instance->current_skb = skb_dequeue (&instance->sndqueue)))
 702                return; /* done - no more skbs */
 703
 704        skb = instance->current_skb;
 705
 706        if (!(buf = instance->current_buffer)) {
 707                spin_lock_irq (&instance->send_lock);
 708                if (list_empty (&instance->spare_send_buffers)) {
 709                        instance->current_buffer = NULL;
 710                        spin_unlock_irq (&instance->send_lock);
 711                        return; /* done - no more buffers */
 712                }
 713                buf = list_entry (instance->spare_send_buffers.next, struct udsl_send_buffer, list);
 714                list_del (&buf->list);
 715                spin_unlock_irq (&instance->send_lock);
 716
 717                buf->free_start = buf->base;
 718                buf->free_cells = snd_buf_size;
 719
 720                instance->current_buffer = buf;
 721        }
 722
 723        num_written = udsl_write_cells (buf->free_cells, skb, &buf->free_start);
 724
 725        vdbg ("udsl_process_send: wrote %u cells from skb 0x%p to buffer 0x%p", num_written, skb, buf);
 726
 727        if (!(buf->free_cells -= num_written)) {
 728                list_add_tail (&buf->list, &instance->filled_send_buffers);
 729                instance->current_buffer = NULL;
 730        }
 731
 732        vdbg ("udsl_process_send: buffer contains %d cells, %d left", snd_buf_size - buf->free_cells, buf->free_cells);
 733
 734        if (!UDSL_SKB (skb)->num_cells) {
 735                struct atm_vcc *vcc = UDSL_SKB (skb)->atm_data.vcc;
 736
 737                udsl_pop (vcc, skb);
 738                instance->current_skb = NULL;
 739
 740                atomic_inc (&vcc->stats->tx);
 741        }
 742
 743        goto made_progress;
 744}
 745
 746static void udsl_cancel_send (struct udsl_instance_data *instance, struct atm_vcc *vcc)
 747{
 748        struct sk_buff *skb, *n;
 749
 750        dbg ("udsl_cancel_send entered");
 751        spin_lock_irq (&instance->sndqueue.lock);
 752        for (skb = instance->sndqueue.next, n = skb->next; skb != (struct sk_buff *)&instance->sndqueue; skb = n, n = skb->next)
 753                if (UDSL_SKB (skb)->atm_data.vcc == vcc) {
 754                        dbg ("udsl_cancel_send: popping skb 0x%p", skb);
 755                        __skb_unlink (skb, &instance->sndqueue);
 756                        udsl_pop (vcc, skb);
 757                }
 758        spin_unlock_irq (&instance->sndqueue.lock);
 759
 760        tasklet_disable (&instance->send_tasklet);
 761        if ((skb = instance->current_skb) && (UDSL_SKB (skb)->atm_data.vcc == vcc)) {
 762                dbg ("udsl_cancel_send: popping current skb (0x%p)", skb);
 763                instance->current_skb = NULL;
 764                udsl_pop (vcc, skb);
 765        }
 766        tasklet_enable (&instance->send_tasklet);
 767        dbg ("udsl_cancel_send done");
 768}
 769
 770static int udsl_atm_send (struct atm_vcc *vcc, struct sk_buff *skb)
 771{
 772        struct udsl_instance_data *instance = vcc->dev->dev_data;
 773        int err;
 774
 775        vdbg ("udsl_atm_send called (skb 0x%p, len %u)", skb, skb->len);
 776
 777        if (!instance || !instance->usb_dev) {
 778                dbg ("udsl_atm_send: NULL data!");
 779                err = -ENODEV;
 780                goto fail;
 781        }
 782
 783        if (vcc->qos.aal != ATM_AAL5) {
 784                dbg ("udsl_atm_send: unsupported ATM type %d!", vcc->qos.aal);
 785                err = -EINVAL;
 786                goto fail;
 787        }
 788
 789        if (skb->len > ATM_MAX_AAL5_PDU) {
 790                dbg ("udsl_atm_send: packet too long (%d vs %d)!", skb->len, ATM_MAX_AAL5_PDU);
 791                err = -EINVAL;
 792                goto fail;
 793        }
 794
 795        PACKETDEBUG (skb->data, skb->len);
 796
 797        udsl_groom_skb (vcc, skb);
 798        skb_queue_tail (&instance->sndqueue, skb);
 799        tasklet_schedule (&instance->send_tasklet);
 800
 801        return 0;
 802
 803fail:
 804        udsl_pop (vcc, skb);
 805        return err;
 806}
 807
 808
 809/**********
 810**  ATM  **
 811**********/
 812
 813static void udsl_atm_dev_close (struct atm_dev *dev)
 814{
 815        struct udsl_instance_data *instance = dev->dev_data;
 816
 817        if (!instance) {
 818                dbg ("udsl_atm_dev_close: NULL instance!");
 819                return;
 820        }
 821
 822        dbg ("udsl_atm_dev_close: queue has %u elements", instance->sndqueue.qlen);
 823
 824        tasklet_kill (&instance->receive_tasklet);
 825        tasklet_kill (&instance->send_tasklet);
 826        kfree (instance);
 827        dev->dev_data = NULL;
 828}
 829
 830static int udsl_atm_proc_read (struct atm_dev *atm_dev, loff_t *pos, char *page)
 831{
 832        struct udsl_instance_data *instance = atm_dev->dev_data;
 833        int left = *pos;
 834
 835        if (!instance) {
 836                dbg ("udsl_atm_proc_read: NULL instance!");
 837                return -ENODEV;
 838        }
 839
 840        if (!left--)
 841                return sprintf (page, "%s\n", instance->description);
 842
 843        if (!left--)
 844                return sprintf (page, "MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
 845                                atm_dev->esi [0], atm_dev->esi [1], atm_dev->esi [2],
 846                                atm_dev->esi [3], atm_dev->esi [4], atm_dev->esi [5]);
 847
 848        if (!left--)
 849                return sprintf (page, "AAL5: tx %d ( %d err ), rx %d ( %d err, %d drop )\n",
 850                                atomic_read (&atm_dev->stats.aal5.tx),
 851                                atomic_read (&atm_dev->stats.aal5.tx_err),
 852                                atomic_read (&atm_dev->stats.aal5.rx),
 853                                atomic_read (&atm_dev->stats.aal5.rx_err),
 854                                atomic_read (&atm_dev->stats.aal5.rx_drop));
 855
 856        if (!left--) {
 857                switch (atm_dev->signal) {
 858                case ATM_PHY_SIG_FOUND:
 859                        sprintf (page, "Line up");
 860                        break;
 861                case ATM_PHY_SIG_LOST:
 862                        sprintf (page, "Line down");
 863                        break;
 864                default:
 865                        sprintf (page, "Line state unknown");
 866                        break;
 867                }
 868
 869                if (instance->usb_dev) {
 870                        if (!instance->firmware_loaded)
 871                                strcat (page, ", no firmware\n");
 872                        else
 873                                strcat (page, ", firmware loaded\n");
 874                } else
 875                        strcat (page, ", disconnected\n");
 876
 877                return strlen (page);
 878        }
 879
 880        return 0;
 881}
 882
 883static int udsl_atm_open (struct atm_vcc *vcc, short vpi, int vci)
 884{
 885        struct udsl_instance_data *instance = vcc->dev->dev_data;
 886        struct udsl_vcc_data *new;
 887        unsigned int max_pdu;
 888
 889        dbg ("udsl_atm_open: vpi %hd, vci %d", vpi, vci);
 890
 891        if (!instance || !instance->usb_dev) {
 892                dbg ("udsl_atm_open: NULL data!");
 893                return -ENODEV;
 894        }
 895
 896        if ((vpi == ATM_VPI_ANY) || (vci == ATM_VCI_ANY))
 897                return -EINVAL;
 898
 899        /* only support AAL5 */
 900        if ((vcc->qos.aal != ATM_AAL5) || (vcc->qos.rxtp.max_sdu < 0) || (vcc->qos.rxtp.max_sdu > ATM_MAX_AAL5_PDU)) {
 901                dbg ("udsl_atm_open: unsupported ATM type %d!", vcc->qos.aal);
 902                return -EINVAL;
 903        }
 904
 905        if (!instance->firmware_loaded) {
 906                dbg ("udsl_atm_open: firmware not loaded!");
 907                return -EAGAIN;
 908        }
 909
 910        down (&instance->serialize); /* vs self, udsl_atm_close */
 911
 912        if (udsl_find_vcc (instance, vpi, vci)) {
 913                dbg ("udsl_atm_open: %hd/%d already in use!", vpi, vci);
 914                up (&instance->serialize);
 915                return -EADDRINUSE;
 916        }
 917
 918        if (!(new = kmalloc (sizeof (struct udsl_vcc_data), GFP_KERNEL))) {
 919                dbg ("udsl_atm_open: no memory for vcc_data!");
 920                up (&instance->serialize);
 921                return -ENOMEM;
 922        }
 923
 924        memset (new, 0, sizeof (struct udsl_vcc_data));
 925        new->vcc = vcc;
 926        new->vpi = vpi;
 927        new->vci = vci;
 928
 929        /* udsl_extract_cells requires at least one cell */
 930        max_pdu = max (1, UDSL_NUM_CELLS (vcc->qos.rxtp.max_sdu)) * ATM_CELL_PAYLOAD;
 931        if (!(new->sarb = alloc_skb (max_pdu, GFP_KERNEL))) {
 932                dbg ("udsl_atm_open: no memory for SAR buffer!");
 933                kfree (new);
 934                up (&instance->serialize);
 935                return -ENOMEM;
 936        }
 937
 938        vcc->dev_data = new;
 939        vcc->vpi = vpi;
 940        vcc->vci = vci;
 941
 942        tasklet_disable (&instance->receive_tasklet);
 943        list_add (&new->list, &instance->vcc_list);
 944        tasklet_enable (&instance->receive_tasklet);
 945
 946        set_bit (ATM_VF_ADDR, &vcc->flags);
 947        set_bit (ATM_VF_PARTIAL, &vcc->flags);
 948        set_bit (ATM_VF_READY, &vcc->flags);
 949
 950        up (&instance->serialize);
 951
 952        tasklet_schedule (&instance->receive_tasklet);
 953
 954        dbg ("udsl_atm_open: allocated vcc data 0x%p (max_pdu: %u)", new, max_pdu);
 955
 956        return 0;
 957}
 958
 959static void udsl_atm_close (struct atm_vcc *vcc)
 960{
 961        struct udsl_instance_data *instance = vcc->dev->dev_data;
 962        struct udsl_vcc_data *vcc_data = vcc->dev_data;
 963
 964        dbg ("udsl_atm_close called");
 965
 966        if (!instance || !vcc_data) {
 967                dbg ("udsl_atm_close: NULL data!");
 968                return;
 969        }
 970
 971        dbg ("udsl_atm_close: deallocating vcc 0x%p with vpi %d vci %d", vcc_data, vcc_data->vpi, vcc_data->vci);
 972
 973        udsl_cancel_send (instance, vcc);
 974
 975        down (&instance->serialize); /* vs self, udsl_atm_open */
 976
 977        tasklet_disable (&instance->receive_tasklet);
 978        list_del (&vcc_data->list);
 979        tasklet_enable (&instance->receive_tasklet);
 980
 981        kfree_skb (vcc_data->sarb);
 982        vcc_data->sarb = NULL;
 983
 984        kfree (vcc_data);
 985        vcc->dev_data = NULL;
 986
 987        vcc->vpi = ATM_VPI_UNSPEC;
 988        vcc->vci = ATM_VCI_UNSPEC;
 989        clear_bit (ATM_VF_READY, &vcc->flags);
 990        clear_bit (ATM_VF_PARTIAL, &vcc->flags);
 991        clear_bit (ATM_VF_ADDR, &vcc->flags);
 992
 993        up (&instance->serialize);
 994
 995        dbg ("udsl_atm_close successful");
 996}
 997
 998static int udsl_atm_ioctl (struct atm_dev *dev, unsigned int cmd, void *arg)
 999{
1000        switch (cmd) {
1001        case ATM_QUERYLOOP:
1002                return put_user (ATM_LM_NONE, (int *) arg) ? -EFAULT : 0;
1003        default:
1004                return -ENOIOCTLCMD;
1005        }
1006}
1007
1008
1009/**********
1010**  USB  **
1011**********/
1012
1013static int udsl_set_alternate (struct udsl_instance_data *instance)
1014{
1015        down (&instance->serialize); /* vs self */
1016        if (!instance->firmware_loaded) {
1017                int ret;
1018
1019                if ((ret = usb_set_interface (instance->usb_dev, 1, 1)) < 0) {
1020                        dbg ("udsl_set_alternate: usb_set_interface returned %d!", ret);
1021                        up (&instance->serialize);
1022                        return ret;
1023                }
1024                instance->firmware_loaded = 1;
1025        }
1026        up (&instance->serialize);
1027
1028        tasklet_schedule (&instance->receive_tasklet);
1029
1030        return 0;
1031}
1032
1033static int udsl_usb_ioctl (struct usb_device *dev, unsigned int code, void *user_data)
1034{
1035        struct usb_interface *intf = usb_ifnum_to_if (dev, 1);
1036        struct udsl_instance_data *instance = intf->private_data;
1037
1038        dbg ("udsl_usb_ioctl entered");
1039
1040        if (!instance) {
1041                dbg ("udsl_usb_ioctl: NULL instance!");
1042                return -ENODEV;
1043        }
1044
1045        switch (code) {
1046        case UDSL_IOCTL_LINE_UP:
1047                instance->atm_dev->signal = ATM_PHY_SIG_FOUND;
1048                return udsl_set_alternate (instance);
1049        case UDSL_IOCTL_LINE_DOWN:
1050                instance->atm_dev->signal = ATM_PHY_SIG_LOST;
1051                return 0;
1052        default:
1053                return -ENOTTY;
1054        }
1055}
1056
1057static void *udsl_usb_probe (struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id)
1058{
1059        struct udsl_instance_data *instance;
1060        unsigned char mac_str [13];
1061        int i, length;
1062        char *buf;
1063
1064        dbg ("udsl_usb_probe: trying device with vendor=0x%x, product=0x%x, ifnum %d",
1065             dev->descriptor.idVendor, dev->descriptor.idProduct, ifnum);
1066
1067        if ((dev->descriptor.bDeviceClass != USB_CLASS_VENDOR_SPEC) ||
1068            (dev->descriptor.idVendor != SPEEDTOUCH_VENDORID) ||
1069            (dev->descriptor.idProduct != SPEEDTOUCH_PRODUCTID) || (ifnum != 1))
1070                return NULL;
1071
1072        dbg ("udsl_usb_probe: device accepted");
1073
1074        /* instance init */
1075        if (!(instance = kmalloc (sizeof (struct udsl_instance_data), GFP_KERNEL))) {
1076                dbg ("udsl_usb_probe: no memory for instance data!");
1077                return NULL;
1078        }
1079
1080        memset (instance, 0, sizeof (struct udsl_instance_data));
1081
1082        init_MUTEX (&instance->serialize);
1083
1084        instance->usb_dev = dev;
1085
1086        INIT_LIST_HEAD (&instance->vcc_list);
1087
1088        spin_lock_init (&instance->receive_lock);
1089        INIT_LIST_HEAD (&instance->spare_receivers);
1090        INIT_LIST_HEAD (&instance->filled_receive_buffers);
1091
1092        tasklet_init (&instance->receive_tasklet, udsl_process_receive, (unsigned long) instance);
1093        INIT_LIST_HEAD (&instance->spare_receive_buffers);
1094
1095        skb_queue_head_init (&instance->sndqueue);
1096
1097        spin_lock_init (&instance->send_lock);
1098        INIT_LIST_HEAD (&instance->spare_senders);
1099        INIT_LIST_HEAD (&instance->spare_send_buffers);
1100
1101        tasklet_init (&instance->send_tasklet, udsl_process_send, (unsigned long) instance);
1102        INIT_LIST_HEAD (&instance->filled_send_buffers);
1103
1104        /* receive init */
1105        for (i = 0; i < num_rcv_urbs; i++) {
1106                struct udsl_receiver *rcv = &(instance->receivers [i]);
1107
1108                if (!(rcv->urb = usb_alloc_urb (0))) {
1109                        dbg ("udsl_usb_probe: no memory for receive urb %d!", i);
1110                        goto fail;
1111                }
1112
1113                rcv->instance = instance;
1114
1115                list_add (&rcv->list, &instance->spare_receivers);
1116        }
1117
1118        for (i = 0; i < num_rcv_bufs; i++) {
1119                struct udsl_receive_buffer *buf = &(instance->receive_buffers [i]);
1120
1121                if (!(buf->base = kmalloc (rcv_buf_size * ATM_CELL_SIZE, GFP_KERNEL))) {
1122                        dbg ("udsl_usb_probe: no memory for receive buffer %d!", i);
1123                        goto fail;
1124                }
1125
1126                list_add (&buf->list, &instance->spare_receive_buffers);
1127        }
1128
1129        /* send init */
1130        for (i = 0; i < num_snd_urbs; i++) {
1131                struct udsl_sender *snd = &(instance->senders [i]);
1132
1133                if (!(snd->urb = usb_alloc_urb (0))) {
1134                        dbg ("udsl_usb_probe: no memory for send urb %d!", i);
1135                        goto fail;
1136                }
1137
1138                snd->instance = instance;
1139
1140                list_add (&snd->list, &instance->spare_senders);
1141        }
1142
1143        for (i = 0; i < num_snd_bufs; i++) {
1144                struct udsl_send_buffer *buf = &(instance->send_buffers [i]);
1145
1146                if (!(buf->base = kmalloc (snd_buf_size * ATM_CELL_SIZE, GFP_KERNEL))) {
1147                        dbg ("udsl_usb_probe: no memory for send buffer %d!", i);
1148                        goto fail;
1149                }
1150
1151                list_add (&buf->list, &instance->spare_send_buffers);
1152        }
1153
1154        /* ATM init */
1155        if (!(instance->atm_dev = atm_dev_register (udsl_driver_name, &udsl_atm_devops, -1, 0))) {
1156                dbg ("udsl_usb_probe: failed to register ATM device!");
1157                goto fail;
1158        }
1159
1160        instance->atm_dev->ci_range.vpi_bits = ATM_CI_MAX;
1161        instance->atm_dev->ci_range.vci_bits = ATM_CI_MAX;
1162        instance->atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
1163
1164        /* temp init ATM device, set to 128kbit */
1165        instance->atm_dev->link_rate = 128 * 1000 / 424;
1166
1167        /* set MAC address, it is stored in the serial number */
1168        memset (instance->atm_dev->esi, 0, sizeof (instance->atm_dev->esi));
1169        if (usb_string (dev, dev->descriptor.iSerialNumber, mac_str, sizeof (mac_str)) == 12)
1170                for (i = 0; i < 6; i++)
1171                        instance->atm_dev->esi [i] = (hex2int (mac_str [i * 2]) * 16) + (hex2int (mac_str [i * 2 + 1]));
1172
1173        /* device description */
1174        buf = instance->description;
1175        length = sizeof (instance->description);
1176
1177        if ((i = usb_string (dev, dev->descriptor.iProduct, buf, length)) < 0)
1178                goto finish;
1179
1180        buf += i;
1181        length -= i;
1182
1183        i = snprintf (buf, length, " (");
1184        buf += i;
1185        length -= i;
1186
1187        if (length <= 0 || (i = usb_make_path (dev, buf, length)) < 0)
1188                goto finish;
1189
1190        buf += i;
1191        length -= i;
1192
1193        snprintf (buf, length, ")");
1194
1195finish:
1196        /* ready for ATM callbacks */
1197        wmb ();
1198        instance->atm_dev->dev_data = instance;
1199
1200        return instance;
1201
1202fail:
1203        for (i = 0; i < num_snd_bufs; i++)
1204                kfree (instance->send_buffers [i].base);
1205
1206        for (i = 0; i < num_snd_urbs; i++)
1207                usb_free_urb (instance->senders [i].urb);
1208
1209        for (i = 0; i < num_rcv_bufs; i++)
1210                kfree (instance->receive_buffers [i].base);
1211
1212        for (i = 0; i < num_rcv_urbs; i++)
1213                usb_free_urb (instance->receivers [i].urb);
1214
1215        kfree (instance);
1216
1217        return NULL;
1218}
1219
1220static void udsl_usb_disconnect (struct usb_device *dev, void *ptr)
1221{
1222        struct udsl_instance_data *instance = ptr;
1223        struct list_head *pos;
1224        unsigned int count;
1225        int result, i;
1226
1227        dbg ("udsl_usb_disconnect entered");
1228
1229        if (!instance) {
1230                dbg ("udsl_usb_disconnect: NULL instance!");
1231                return;
1232        }
1233
1234        /* receive finalize */
1235        tasklet_disable (&instance->receive_tasklet);
1236
1237        for (i = 0; i < num_rcv_urbs; i++)
1238                if ((result = usb_unlink_urb (instance->receivers [i].urb)) < 0)
1239                        dbg ("udsl_usb_disconnect: usb_unlink_urb on receive urb %d returned %d!", i, result);
1240
1241        /* wait for completion handlers to finish */
1242        do {
1243                count = 0;
1244                spin_lock_irq (&instance->receive_lock);
1245                list_for_each (pos, &instance->spare_receivers)
1246                        DEBUG_ON (++count > num_rcv_urbs);
1247                spin_unlock_irq (&instance->receive_lock);
1248
1249                dbg ("udsl_usb_disconnect: found %u spare receivers", count);
1250
1251                if (count == num_rcv_urbs)
1252                        break;
1253
1254                set_current_state (TASK_RUNNING);
1255                schedule ();
1256        } while (1);
1257
1258        /* no need to take the spinlock */
1259        INIT_LIST_HEAD (&instance->filled_receive_buffers);
1260        INIT_LIST_HEAD (&instance->spare_receive_buffers);
1261
1262        tasklet_enable (&instance->receive_tasklet);
1263
1264        for (i = 0; i < num_rcv_urbs; i++)
1265                usb_free_urb (instance->receivers [i].urb);
1266
1267        for (i = 0; i < num_rcv_bufs; i++)
1268                kfree (instance->receive_buffers [i].base);
1269
1270        /* send finalize */
1271        tasklet_disable (&instance->send_tasklet);
1272
1273        for (i = 0; i < num_snd_urbs; i++)
1274                if ((result = usb_unlink_urb (instance->senders [i].urb)) < 0)
1275                        dbg ("udsl_usb_disconnect: usb_unlink_urb on send urb %d returned %d!", i, result);
1276
1277        /* wait for completion handlers to finish */
1278        do {
1279                count = 0;
1280                spin_lock_irq (&instance->send_lock);
1281                list_for_each (pos, &instance->spare_senders)
1282                        DEBUG_ON (++count > num_snd_urbs);
1283                spin_unlock_irq (&instance->send_lock);
1284
1285                dbg ("udsl_usb_disconnect: found %u spare senders", count);
1286
1287                if (count == num_snd_urbs)
1288                        break;
1289
1290                set_current_state (TASK_RUNNING);
1291                schedule ();
1292        } while (1);
1293
1294        /* no need to take the spinlock */
1295        INIT_LIST_HEAD (&instance->spare_senders);
1296        INIT_LIST_HEAD (&instance->spare_send_buffers);
1297        instance->current_buffer = NULL;
1298
1299        tasklet_enable (&instance->send_tasklet);
1300
1301        for (i = 0; i < num_snd_urbs; i++)
1302                usb_free_urb (instance->senders [i].urb);
1303
1304        for (i = 0; i < num_snd_bufs; i++)
1305                kfree (instance->send_buffers [i].base);
1306
1307        wmb ();
1308        instance->usb_dev = NULL;
1309
1310        /* ATM finalize */
1311        shutdown_atm_dev (instance->atm_dev); /* frees instance, kills tasklets */
1312}
1313
1314
1315/***********
1316**  init  **
1317***********/
1318
1319static int __init udsl_usb_init (void)
1320{
1321        dbg ("udsl_usb_init: driver version " DRIVER_VERSION);
1322
1323        if (sizeof (struct udsl_control) > sizeof (((struct sk_buff *)0)->cb)) {
1324                printk (KERN_ERR __FILE__ ": unusable with this kernel!\n");
1325                return -EIO;
1326        }
1327
1328        if ((num_rcv_urbs > UDSL_MAX_RCV_URBS) || (num_snd_urbs > UDSL_MAX_SND_URBS) ||
1329            (num_rcv_bufs > UDSL_MAX_RCV_BUFS) || (num_snd_bufs > UDSL_MAX_SND_BUFS) ||
1330            (rcv_buf_size > UDSL_MAX_RCV_BUF_SIZE) || (snd_buf_size > UDSL_MAX_SND_BUF_SIZE))
1331                return -EINVAL;
1332
1333        return usb_register (&udsl_usb_driver);
1334}
1335
1336static void __exit udsl_usb_cleanup (void)
1337{
1338        dbg ("udsl_usb_cleanup entered");
1339
1340        usb_deregister (&udsl_usb_driver);
1341}
1342
1343module_init (udsl_usb_init);
1344module_exit (udsl_usb_cleanup);
1345
1346MODULE_AUTHOR (DRIVER_AUTHOR);
1347MODULE_DESCRIPTION (DRIVER_DESC);
1348MODULE_LICENSE ("GPL");
1349
1350
1351/************
1352**  debug  **
1353************/
1354
1355#ifdef VERBOSE_DEBUG
1356static int udsl_print_packet (const unsigned char *data, int len)
1357{
1358        unsigned char buffer [256];
1359        int i = 0, j = 0;
1360
1361        for (i = 0; i < len;) {
1362                buffer [0] = '\0';
1363                sprintf (buffer, "%.3d :", i);
1364                for (j = 0; (j < 16) && (i < len); j++, i++) {
1365                        sprintf (buffer, "%s %2.2x", buffer, data [i]);
1366                }
1367                dbg ("%s", buffer);
1368        }
1369        return i;
1370}
1371#endif
1372
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.