linux/drivers/usb/misc/iowarrior.c
<<
>>
Prefs
   1/*
   2 *  Native support for the I/O-Warrior USB devices
   3 *
   4 *  Copyright (c) 2003-2005  Code Mercenaries GmbH
   5 *  written by Christian Lucht <lucht@codemercs.com>
   6 *
   7 *  based on
   8
   9 *  usb-skeleton.c by Greg Kroah-Hartman  <greg@kroah.com>
  10 *  brlvger.c by Stephane Dalton  <sdalton@videotron.ca>
  11 *           and St�hane Doyon   <s.doyon@videotron.ca>
  12 *
  13 *  Released under the GPLv2.
  14 */
  15
  16#include <linux/module.h>
  17#include <linux/usb.h>
  18#include <linux/init.h>
  19#include <linux/slab.h>
  20#include <linux/sched.h>
  21#include <linux/poll.h>
  22#include <linux/usb/iowarrior.h>
  23
  24/* Version Information */
  25#define DRIVER_VERSION "v0.4.0"
  26#define DRIVER_AUTHOR "Christian Lucht <lucht@codemercs.com>"
  27#define DRIVER_DESC "USB IO-Warrior driver (Linux 2.6.x)"
  28
  29#define USB_VENDOR_ID_CODEMERCS         1984
  30/* low speed iowarrior */
  31#define USB_DEVICE_ID_CODEMERCS_IOW40   0x1500
  32#define USB_DEVICE_ID_CODEMERCS_IOW24   0x1501
  33#define USB_DEVICE_ID_CODEMERCS_IOWPV1  0x1511
  34#define USB_DEVICE_ID_CODEMERCS_IOWPV2  0x1512
  35/* full speed iowarrior */
  36#define USB_DEVICE_ID_CODEMERCS_IOW56   0x1503
  37
  38/* Get a minor range for your devices from the usb maintainer */
  39#ifdef CONFIG_USB_DYNAMIC_MINORS
  40#define IOWARRIOR_MINOR_BASE    0
  41#else
  42#define IOWARRIOR_MINOR_BASE    208     // SKELETON_MINOR_BASE 192 + 16, not offical yet
  43#endif
  44
  45/* interrupt input queue size */
  46#define MAX_INTERRUPT_BUFFER 16
  47/*
  48   maximum number of urbs that are submitted for writes at the same time,
  49   this applies to the IOWarrior56 only!
  50   IOWarrior24 and IOWarrior40 use synchronous usb_control_msg calls.
  51*/
  52#define MAX_WRITES_IN_FLIGHT 4
  53
  54/* Use our own dbg macro */
  55#undef dbg
  56#define dbg( format, arg... ) do { if( debug ) printk( KERN_DEBUG __FILE__ ": " format "\n" , ## arg ); } while ( 0 )
  57
  58MODULE_AUTHOR(DRIVER_AUTHOR);
  59MODULE_DESCRIPTION(DRIVER_DESC);
  60MODULE_LICENSE("GPL");
  61
  62/* Module parameters */
  63static int debug = 0;
  64module_param(debug, bool, 0644);
  65MODULE_PARM_DESC(debug, "debug=1 enables debugging messages");
  66
  67static struct usb_driver iowarrior_driver;
  68static DEFINE_MUTEX(iowarrior_open_disc_lock);
  69
  70/*--------------*/
  71/*     data     */
  72/*--------------*/
  73
  74/* Structure to hold all of our device specific stuff */
  75struct iowarrior {
  76        struct mutex mutex;                     /* locks this structure */
  77        struct usb_device *udev;                /* save off the usb device pointer */
  78        struct usb_interface *interface;        /* the interface for this device */
  79        unsigned char minor;                    /* the starting minor number for this device */
  80        struct usb_endpoint_descriptor *int_out_endpoint;       /* endpoint for reading (needed for IOW56 only) */
  81        struct usb_endpoint_descriptor *int_in_endpoint;        /* endpoint for reading */
  82        struct urb *int_in_urb;         /* the urb for reading data */
  83        unsigned char *int_in_buffer;   /* buffer for data to be read */
  84        unsigned char serial_number;    /* to detect lost packages */
  85        unsigned char *read_queue;      /* size is MAX_INTERRUPT_BUFFER * packet size */
  86        wait_queue_head_t read_wait;
  87        wait_queue_head_t write_wait;   /* wait-queue for writing to the device */
  88        atomic_t write_busy;            /* number of write-urbs submitted */
  89        atomic_t read_idx;
  90        atomic_t intr_idx;
  91        spinlock_t intr_idx_lock;       /* protects intr_idx */
  92        atomic_t overflow_flag;         /* signals an index 'rollover' */
  93        int present;                    /* this is 1 as long as the device is connected */
  94        int opened;                     /* this is 1 if the device is currently open */
  95        char chip_serial[9];            /* the serial number string of the chip connected */
  96        int report_size;                /* number of bytes in a report */
  97        u16 product_id;
  98};
  99
 100/*--------------*/
 101/*    globals   */
 102/*--------------*/
 103
 104/*
 105 *  USB spec identifies 5 second timeouts.
 106 */
 107#define GET_TIMEOUT 5
 108#define USB_REQ_GET_REPORT  0x01
 109//#if 0
 110static int usb_get_report(struct usb_device *dev,
 111                          struct usb_host_interface *inter, unsigned char type,
 112                          unsigned char id, void *buf, int size)
 113{
 114        return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
 115                               USB_REQ_GET_REPORT,
 116                               USB_DIR_IN | USB_TYPE_CLASS |
 117                               USB_RECIP_INTERFACE, (type << 8) + id,
 118                               inter->desc.bInterfaceNumber, buf, size,
 119                               GET_TIMEOUT*HZ);
 120}
 121//#endif
 122
 123#define USB_REQ_SET_REPORT 0x09
 124
 125static int usb_set_report(struct usb_interface *intf, unsigned char type,
 126                          unsigned char id, void *buf, int size)
 127{
 128        return usb_control_msg(interface_to_usbdev(intf),
 129                               usb_sndctrlpipe(interface_to_usbdev(intf), 0),
 130                               USB_REQ_SET_REPORT,
 131                               USB_TYPE_CLASS | USB_RECIP_INTERFACE,
 132                               (type << 8) + id,
 133                               intf->cur_altsetting->desc.bInterfaceNumber, buf,
 134                               size, HZ);
 135}
 136
 137/*---------------------*/
 138/* driver registration */
 139/*---------------------*/
 140/* table of devices that work with this driver */
 141static struct usb_device_id iowarrior_ids[] = {
 142        {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW40)},
 143        {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24)},
 144        {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV1)},
 145        {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV2)},
 146        {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56)},
 147        {}                      /* Terminating entry */
 148};
 149MODULE_DEVICE_TABLE(usb, iowarrior_ids);
 150
 151/*
 152 * USB callback handler for reading data
 153 */
 154static void iowarrior_callback(struct urb *urb)
 155{
 156        struct iowarrior *dev = urb->context;
 157        int intr_idx;
 158        int read_idx;
 159        int aux_idx;
 160        int offset;
 161        int status = urb->status;
 162        int retval;
 163
 164        switch (status) {
 165        case 0:
 166                /* success */
 167                break;
 168        case -ECONNRESET:
 169        case -ENOENT:
 170        case -ESHUTDOWN:
 171                return;
 172        default:
 173                goto exit;
 174        }
 175
 176        spin_lock(&dev->intr_idx_lock);
 177        intr_idx = atomic_read(&dev->intr_idx);
 178        /* aux_idx become previous intr_idx */
 179        aux_idx = (intr_idx == 0) ? (MAX_INTERRUPT_BUFFER - 1) : (intr_idx - 1);
 180        read_idx = atomic_read(&dev->read_idx);
 181
 182        /* queue is not empty and it's interface 0 */
 183        if ((intr_idx != read_idx)
 184            && (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0)) {
 185                /* + 1 for serial number */
 186                offset = aux_idx * (dev->report_size + 1);
 187                if (!memcmp
 188                    (dev->read_queue + offset, urb->transfer_buffer,
 189                     dev->report_size)) {
 190                        /* equal values on interface 0 will be ignored */
 191                        spin_unlock(&dev->intr_idx_lock);
 192                        goto exit;
 193                }
 194        }
 195
 196        /* aux_idx become next intr_idx */
 197        aux_idx = (intr_idx == (MAX_INTERRUPT_BUFFER - 1)) ? 0 : (intr_idx + 1);
 198        if (read_idx == aux_idx) {
 199                /* queue full, dropping oldest input */
 200                read_idx = (++read_idx == MAX_INTERRUPT_BUFFER) ? 0 : read_idx;
 201                atomic_set(&dev->read_idx, read_idx);
 202                atomic_set(&dev->overflow_flag, 1);
 203        }
 204
 205        /* +1 for serial number */
 206        offset = intr_idx * (dev->report_size + 1);
 207        memcpy(dev->read_queue + offset, urb->transfer_buffer,
 208               dev->report_size);
 209        *(dev->read_queue + offset + (dev->report_size)) = dev->serial_number++;
 210
 211        atomic_set(&dev->intr_idx, aux_idx);
 212        spin_unlock(&dev->intr_idx_lock);
 213        /* tell the blocking read about the new data */
 214        wake_up_interruptible(&dev->read_wait);
 215
 216exit:
 217        retval = usb_submit_urb(urb, GFP_ATOMIC);
 218        if (retval)
 219                dev_err(&dev->interface->dev, "%s - usb_submit_urb failed with result %d\n",
 220                        __func__, retval);
 221
 222}
 223
 224/*
 225 * USB Callback handler for write-ops
 226 */
 227static void iowarrior_write_callback(struct urb *urb)
 228{
 229        struct iowarrior *dev;
 230        int status = urb->status;
 231
 232        dev = urb->context;
 233        /* sync/async unlink faults aren't errors */
 234        if (status &&
 235            !(status == -ENOENT ||
 236              status == -ECONNRESET || status == -ESHUTDOWN)) {
 237                dbg("%s - nonzero write bulk status received: %d",
 238                    __func__, status);
 239        }
 240        /* free up our allocated buffer */
 241        usb_buffer_free(urb->dev, urb->transfer_buffer_length,
 242                        urb->transfer_buffer, urb->transfer_dma);
 243        /* tell a waiting writer the interrupt-out-pipe is available again */
 244        atomic_dec(&dev->write_busy);
 245        wake_up_interruptible(&dev->write_wait);
 246}
 247
 248/**
 249 *      iowarrior_delete
 250 */
 251static inline void iowarrior_delete(struct iowarrior *dev)
 252{
 253        dbg("%s - minor %d", __func__, dev->minor);
 254        kfree(dev->int_in_buffer);
 255        usb_free_urb(dev->int_in_urb);
 256        kfree(dev->read_queue);
 257        kfree(dev);
 258}
 259
 260/*---------------------*/
 261/* fops implementation */
 262/*---------------------*/
 263
 264static int read_index(struct iowarrior *dev)
 265{
 266        int intr_idx, read_idx;
 267
 268        read_idx = atomic_read(&dev->read_idx);
 269        intr_idx = atomic_read(&dev->intr_idx);
 270
 271        return (read_idx == intr_idx ? -1 : read_idx);
 272}
 273
 274/**
 275 *  iowarrior_read
 276 */
 277static ssize_t iowarrior_read(struct file *file, char __user *buffer,
 278                              size_t count, loff_t *ppos)
 279{
 280        struct iowarrior *dev;
 281        int read_idx;
 282        int offset;
 283
 284        dev = (struct iowarrior *)file->private_data;
 285
 286        /* verify that the device wasn't unplugged */
 287        if (dev == NULL || !dev->present)
 288                return -ENODEV;
 289
 290        dbg("%s - minor %d, count = %zd", __func__, dev->minor, count);
 291
 292        /* read count must be packet size (+ time stamp) */
 293        if ((count != dev->report_size)
 294            && (count != (dev->report_size + 1)))
 295                return -EINVAL;
 296
 297        /* repeat until no buffer overrun in callback handler occur */
 298        do {
 299                atomic_set(&dev->overflow_flag, 0);
 300                if ((read_idx = read_index(dev)) == -1) {
 301                        /* queue emty */
 302                        if (file->f_flags & O_NONBLOCK)
 303                                return -EAGAIN;
 304                        else {
 305                                //next line will return when there is either new data, or the device is unplugged
 306                                int r = wait_event_interruptible(dev->read_wait,
 307                                                                 (!dev->present
 308                                                                  || (read_idx =
 309                                                                      read_index
 310                                                                      (dev)) !=
 311                                                                  -1));
 312                                if (r) {
 313                                        //we were interrupted by a signal
 314                                        return -ERESTART;
 315                                }
 316                                if (!dev->present) {
 317                                        //The device was unplugged
 318                                        return -ENODEV;
 319                                }
 320                                if (read_idx == -1) {
 321                                        // Can this happen ???
 322                                        return 0;
 323                                }
 324                        }
 325                }
 326
 327                offset = read_idx * (dev->report_size + 1);
 328                if (copy_to_user(buffer, dev->read_queue + offset, count)) {
 329                        return -EFAULT;
 330                }
 331        } while (atomic_read(&dev->overflow_flag));
 332
 333        read_idx = ++read_idx == MAX_INTERRUPT_BUFFER ? 0 : read_idx;
 334        atomic_set(&dev->read_idx, read_idx);
 335        return count;
 336}
 337
 338/*
 339 * iowarrior_write
 340 */
 341static ssize_t iowarrior_write(struct file *file,
 342                               const char __user *user_buffer,
 343                               size_t count, loff_t *ppos)
 344{
 345        struct iowarrior *dev;
 346        int retval = 0;
 347        char *buf = NULL;       /* for IOW24 and IOW56 we need a buffer */
 348        struct urb *int_out_urb = NULL;
 349
 350        dev = (struct iowarrior *)file->private_data;
 351
 352        mutex_lock(&dev->mutex);
 353        /* verify that the device wasn't unplugged */
 354        if (!dev->present) {
 355                retval = -ENODEV;
 356                goto exit;
 357        }
 358        dbg("%s - minor %d, count = %zd", __func__, dev->minor, count);
 359        /* if count is 0 we're already done */
 360        if (count == 0) {
 361                retval = 0;
 362                goto exit;
 363        }
 364        /* We only accept full reports */
 365        if (count != dev->report_size) {
 366                retval = -EINVAL;
 367                goto exit;
 368        }
 369        switch (dev->product_id) {
 370        case USB_DEVICE_ID_CODEMERCS_IOW24:
 371        case USB_DEVICE_ID_CODEMERCS_IOWPV1:
 372        case USB_DEVICE_ID_CODEMERCS_IOWPV2:
 373        case USB_DEVICE_ID_CODEMERCS_IOW40:
 374                /* IOW24 and IOW40 use a synchronous call */
 375                buf = kmalloc(8, GFP_KERNEL);   /* 8 bytes are enough for both products */
 376                if (!buf) {
 377                        retval = -ENOMEM;
 378                        goto exit;
 379                }
 380                if (copy_from_user(buf, user_buffer, count)) {
 381                        retval = -EFAULT;
 382                        kfree(buf);
 383                        goto exit;
 384                }
 385                retval = usb_set_report(dev->interface, 2, 0, buf, count);
 386                kfree(buf);
 387                goto exit;
 388                break;
 389        case USB_DEVICE_ID_CODEMERCS_IOW56:
 390                /* The IOW56 uses asynchronous IO and more urbs */
 391                if (atomic_read(&dev->write_busy) == MAX_WRITES_IN_FLIGHT) {
 392                        /* Wait until we are below the limit for submitted urbs */
 393                        if (file->f_flags & O_NONBLOCK) {
 394                                retval = -EAGAIN;
 395                                goto exit;
 396                        } else {
 397                                retval = wait_event_interruptible(dev->write_wait,
 398                                                                  (!dev->present || (atomic_read (&dev-> write_busy) < MAX_WRITES_IN_FLIGHT)));
 399                                if (retval) {
 400                                        /* we were interrupted by a signal */
 401                                        retval = -ERESTART;
 402                                        goto exit;
 403                                }
 404                                if (!dev->present) {
 405                                        /* The device was unplugged */
 406                                        retval = -ENODEV;
 407                                        goto exit;
 408                                }
 409                                if (!dev->opened) {
 410                                        /* We were closed while waiting for an URB */
 411                                        retval = -ENODEV;
 412                                        goto exit;
 413                                }
 414                        }
 415                }
 416                atomic_inc(&dev->write_busy);
 417                int_out_urb = usb_alloc_urb(0, GFP_KERNEL);
 418                if (!int_out_urb) {
 419                        retval = -ENOMEM;
 420                        dbg("%s Unable to allocate urb ", __func__);
 421                        goto error_no_urb;
 422                }
 423                buf = usb_buffer_alloc(dev->udev, dev->report_size,
 424                                       GFP_KERNEL, &int_out_urb->transfer_dma);
 425                if (!buf) {
 426                        retval = -ENOMEM;
 427                        dbg("%s Unable to allocate buffer ", __func__);
 428                        goto error_no_buffer;
 429                }
 430                usb_fill_int_urb(int_out_urb, dev->udev,
 431                                 usb_sndintpipe(dev->udev,
 432                                                dev->int_out_endpoint->bEndpointAddress),
 433                                 buf, dev->report_size,
 434                                 iowarrior_write_callback, dev,
 435                                 dev->int_out_endpoint->bInterval);
 436                int_out_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 437                if (copy_from_user(buf, user_buffer, count)) {
 438                        retval = -EFAULT;
 439                        goto error;
 440                }
 441                retval = usb_submit_urb(int_out_urb, GFP_KERNEL);
 442                if (retval) {
 443                        dbg("%s submit error %d for urb nr.%d", __func__,
 444                            retval, atomic_read(&dev->write_busy));
 445                        goto error;
 446                }
 447                /* submit was ok */
 448                retval = count;
 449                usb_free_urb(int_out_urb);
 450                goto exit;
 451                break;
 452        default:
 453                /* what do we have here ? An unsupported Product-ID ? */
 454                dev_err(&dev->interface->dev, "%s - not supported for product=0x%x\n",
 455                        __func__, dev->product_id);
 456                retval = -EFAULT;
 457                goto exit;
 458                break;
 459        }
 460error:
 461        usb_buffer_free(dev->udev, dev->report_size, buf,
 462                        int_out_urb->transfer_dma);
 463error_no_buffer:
 464        usb_free_urb(int_out_urb);
 465error_no_urb:
 466        atomic_dec(&dev->write_busy);
 467        wake_up_interruptible(&dev->write_wait);
 468exit:
 469        mutex_unlock(&dev->mutex);
 470        return retval;
 471}
 472
 473/**
 474 *      iowarrior_ioctl
 475 */
 476static long iowarrior_ioctl(struct file *file, unsigned int cmd,
 477                                                        unsigned long arg)
 478{
 479        struct iowarrior *dev = NULL;
 480        __u8 *buffer;
 481        __u8 __user *user_buffer;
 482        int retval;
 483        int io_res;             /* checks for bytes read/written and copy_to/from_user results */
 484
 485        dev = (struct iowarrior *)file->private_data;
 486        if (dev == NULL) {
 487                return -ENODEV;
 488        }
 489
 490        buffer = kzalloc(dev->report_size, GFP_KERNEL);
 491        if (!buffer)
 492                return -ENOMEM;
 493
 494        /* lock this object */
 495        lock_kernel();
 496        mutex_lock(&dev->mutex);
 497
 498        /* verify that the device wasn't unplugged */
 499        if (!dev->present) {
 500                retval = -ENODEV;
 501                goto error_out;
 502        }
 503
 504        dbg("%s - minor %d, cmd 0x%.4x, arg %ld", __func__, dev->minor, cmd,
 505            arg);
 506
 507        retval = 0;
 508        io_res = 0;
 509        switch (cmd) {
 510        case IOW_WRITE:
 511                if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24 ||
 512                    dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV1 ||
 513                    dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV2 ||
 514                    dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW40) {
 515                        user_buffer = (__u8 __user *)arg;
 516                        io_res = copy_from_user(buffer, user_buffer,
 517                                                dev->report_size);
 518                        if (io_res) {
 519                                retval = -EFAULT;
 520                        } else {
 521                                io_res = usb_set_report(dev->interface, 2, 0,
 522                                                        buffer,
 523                                                        dev->report_size);
 524                                if (io_res < 0)
 525                                        retval = io_res;
 526                        }
 527                } else {
 528                        retval = -EINVAL;
 529                        dev_err(&dev->interface->dev,
 530                                "ioctl 'IOW_WRITE' is not supported for product=0x%x.\n",
 531                                dev->product_id);
 532                }
 533                break;
 534        case IOW_READ:
 535                user_buffer = (__u8 __user *)arg;
 536                io_res = usb_get_report(dev->udev,
 537                                        dev->interface->cur_altsetting, 1, 0,
 538                                        buffer, dev->report_size);
 539                if (io_res < 0)
 540                        retval = io_res;
 541                else {
 542                        io_res = copy_to_user(user_buffer, buffer, dev->report_size);
 543                        if (io_res < 0)
 544                                retval = -EFAULT;
 545                }
 546                break;
 547        case IOW_GETINFO:
 548                {
 549                        /* Report available information for the device */
 550                        struct iowarrior_info info;
 551                        /* needed for power consumption */
 552                        struct usb_config_descriptor *cfg_descriptor = &dev->udev->actconfig->desc;
 553
 554                        /* directly from the descriptor */
 555                        info.vendor = le16_to_cpu(dev->udev->descriptor.idVendor);
 556                        info.product = dev->product_id;
 557                        info.revision = le16_to_cpu(dev->udev->descriptor.bcdDevice);
 558
 559                        /* 0==UNKNOWN, 1==LOW(usb1.1) ,2=FULL(usb1.1), 3=HIGH(usb2.0) */
 560                        info.speed = le16_to_cpu(dev->udev->speed);
 561                        info.if_num = dev->interface->cur_altsetting->desc.bInterfaceNumber;
 562                        info.report_size = dev->report_size;
 563
 564                        /* serial number string has been read earlier 8 chars or empty string */
 565                        memcpy(info.serial, dev->chip_serial,
 566                               sizeof(dev->chip_serial));
 567                        if (cfg_descriptor == NULL) {
 568                                info.power = -1;        /* no information available */
 569                        } else {
 570                                /* the MaxPower is stored in units of 2mA to make it fit into a byte-value */
 571                                info.power = cfg_descriptor->bMaxPower * 2;
 572                        }
 573                        io_res = copy_to_user((struct iowarrior_info __user *)arg, &info,
 574                                         sizeof(struct iowarrior_info));
 575                        if (io_res < 0)
 576                                retval = -EFAULT;
 577                        break;
 578                }
 579        default:
 580                /* return that we did not understand this ioctl call */
 581                retval = -ENOTTY;
 582                break;
 583        }
 584error_out:
 585        /* unlock the device */
 586        mutex_unlock(&dev->mutex);
 587        unlock_kernel();
 588        kfree(buffer);
 589        return retval;
 590}
 591
 592/**
 593 *      iowarrior_open
 594 */
 595static int iowarrior_open(struct inode *inode, struct file *file)
 596{
 597        struct iowarrior *dev = NULL;
 598        struct usb_interface *interface;
 599        int subminor;
 600        int retval = 0;
 601
 602        dbg("%s", __func__);
 603
 604        subminor = iminor(inode);
 605
 606        interface = usb_find_interface(&iowarrior_driver, subminor);
 607        if (!interface) {
 608                err("%s - error, can't find device for minor %d", __func__,
 609                    subminor);
 610                return -ENODEV;
 611        }
 612
 613        mutex_lock(&iowarrior_open_disc_lock);
 614        dev = usb_get_intfdata(interface);
 615        if (!dev) {
 616                mutex_unlock(&iowarrior_open_disc_lock);
 617                return -ENODEV;
 618        }
 619
 620        mutex_lock(&dev->mutex);
 621        mutex_unlock(&iowarrior_open_disc_lock);
 622
 623        /* Only one process can open each device, no sharing. */
 624        if (dev->opened) {
 625                retval = -EBUSY;
 626                goto out;
 627        }
 628
 629        /* setup interrupt handler for receiving values */
 630        if ((retval = usb_submit_urb(dev->int_in_urb, GFP_KERNEL)) < 0) {
 631                dev_err(&interface->dev, "Error %d while submitting URB\n", retval);
 632                retval = -EFAULT;
 633                goto out;
 634        }
 635        /* increment our usage count for the driver */
 636        ++dev->opened;
 637        /* save our object in the file's private structure */
 638        file->private_data = dev;
 639        retval = 0;
 640
 641out:
 642        mutex_unlock(&dev->mutex);
 643        return retval;
 644}
 645
 646/**
 647 *      iowarrior_release
 648 */
 649static int iowarrior_release(struct inode *inode, struct file *file)
 650{
 651        struct iowarrior *dev;
 652        int retval = 0;
 653
 654        dev = (struct iowarrior *)file->private_data;
 655        if (dev == NULL) {
 656                return -ENODEV;
 657        }
 658
 659        dbg("%s - minor %d", __func__, dev->minor);
 660
 661        /* lock our device */
 662        mutex_lock(&dev->mutex);
 663
 664        if (dev->opened <= 0) {
 665                retval = -ENODEV;       /* close called more than once */
 666                mutex_unlock(&dev->mutex);
 667        } else {
 668                dev->opened = 0;        /* we're closeing now */
 669                retval = 0;
 670                if (dev->present) {
 671                        /*
 672                           The device is still connected so we only shutdown
 673                           pending read-/write-ops.
 674                         */
 675                        usb_kill_urb(dev->int_in_urb);
 676                        wake_up_interruptible(&dev->read_wait);
 677                        wake_up_interruptible(&dev->write_wait);
 678                        mutex_unlock(&dev->mutex);
 679                } else {
 680                        /* The device was unplugged, cleanup resources */
 681                        mutex_unlock(&dev->mutex);
 682                        iowarrior_delete(dev);
 683                }
 684        }
 685        return retval;
 686}
 687
 688static unsigned iowarrior_poll(struct file *file, poll_table * wait)
 689{
 690        struct iowarrior *dev = file->private_data;
 691        unsigned int mask = 0;
 692
 693        if (!dev->present)
 694                return POLLERR | POLLHUP;
 695
 696        poll_wait(file, &dev->read_wait, wait);
 697        poll_wait(file, &dev->write_wait, wait);
 698
 699        if (!dev->present)
 700                return POLLERR | POLLHUP;
 701
 702        if (read_index(dev) != -1)
 703                mask |= POLLIN | POLLRDNORM;
 704
 705        if (atomic_read(&dev->write_busy) < MAX_WRITES_IN_FLIGHT)
 706                mask |= POLLOUT | POLLWRNORM;
 707        return mask;
 708}
 709
 710/*
 711 * File operations needed when we register this driver.
 712 * This assumes that this driver NEEDS file operations,
 713 * of course, which means that the driver is expected
 714 * to have a node in the /dev directory. If the USB
 715 * device were for a network interface then the driver
 716 * would use "struct net_driver" instead, and a serial
 717 * device would use "struct tty_driver".
 718 */
 719static const struct file_operations iowarrior_fops = {
 720        .owner = THIS_MODULE,
 721        .write = iowarrior_write,
 722        .read = iowarrior_read,
 723        .unlocked_ioctl = iowarrior_ioctl,
 724        .open = iowarrior_open,
 725        .release = iowarrior_release,
 726        .poll = iowarrior_poll,
 727};
 728
 729/*
 730 * usb class driver info in order to get a minor number from the usb core,
 731 * and to have the device registered with devfs and the driver core
 732 */
 733static struct usb_class_driver iowarrior_class = {
 734        .name = "iowarrior%d",
 735        .fops = &iowarrior_fops,
 736        .minor_base = IOWARRIOR_MINOR_BASE,
 737};
 738
 739/*---------------------------------*/
 740/*  probe and disconnect functions */
 741/*---------------------------------*/
 742/**
 743 *      iowarrior_probe
 744 *
 745 *      Called by the usb core when a new device is connected that it thinks
 746 *      this driver might be interested in.
 747 */
 748static int iowarrior_probe(struct usb_interface *interface,
 749                           const struct usb_device_id *id)
 750{
 751        struct usb_device *udev = interface_to_usbdev(interface);
 752        struct iowarrior *dev = NULL;
 753        struct usb_host_interface *iface_desc;
 754        struct usb_endpoint_descriptor *endpoint;
 755        int i;
 756        int retval = -ENOMEM;
 757
 758        /* allocate memory for our device state and intialize it */
 759        dev = kzalloc(sizeof(struct iowarrior), GFP_KERNEL);
 760        if (dev == NULL) {
 761                dev_err(&interface->dev, "Out of memory\n");
 762                return retval;
 763        }
 764
 765        mutex_init(&dev->mutex);
 766
 767        atomic_set(&dev->intr_idx, 0);
 768        atomic_set(&dev->read_idx, 0);
 769        spin_lock_init(&dev->intr_idx_lock);
 770        atomic_set(&dev->overflow_flag, 0);
 771        init_waitqueue_head(&dev->read_wait);
 772        atomic_set(&dev->write_busy, 0);
 773        init_waitqueue_head(&dev->write_wait);
 774
 775        dev->udev = udev;
 776        dev->interface = interface;
 777
 778        iface_desc = interface->cur_altsetting;
 779        dev->product_id = le16_to_cpu(udev->descriptor.idProduct);
 780
 781        /* set up the endpoint information */
 782        for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
 783                endpoint = &iface_desc->endpoint[i].desc;
 784
 785                if (usb_endpoint_is_int_in(endpoint))
 786                        dev->int_in_endpoint = endpoint;
 787                if (usb_endpoint_is_int_out(endpoint))
 788                        /* this one will match for the IOWarrior56 only */
 789                        dev->int_out_endpoint = endpoint;
 790        }
 791        /* we have to check the report_size often, so remember it in the endianess suitable for our machine */
 792        dev->report_size = le16_to_cpu(dev->int_in_endpoint->wMaxPacketSize);
 793        if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) &&
 794            (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56))
 795                /* IOWarrior56 has wMaxPacketSize different from report size */
 796                dev->report_size = 7;
 797
 798        /* create the urb and buffer for reading */
 799        dev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);
 800        if (!dev->int_in_urb) {
 801                dev_err(&interface->dev, "Couldn't allocate interrupt_in_urb\n");
 802                goto error;
 803        }
 804        dev->int_in_buffer = kmalloc(dev->report_size, GFP_KERNEL);
 805        if (!dev->int_in_buffer) {
 806                dev_err(&interface->dev, "Couldn't allocate int_in_buffer\n");
 807                goto error;
 808        }
 809        usb_fill_int_urb(dev->int_in_urb, dev->udev,
 810                         usb_rcvintpipe(dev->udev,
 811                                        dev->int_in_endpoint->bEndpointAddress),
 812                         dev->int_in_buffer, dev->report_size,
 813                         iowarrior_callback, dev,
 814                         dev->int_in_endpoint->bInterval);
 815        /* create an internal buffer for interrupt data from the device */
 816        dev->read_queue =
 817            kmalloc(((dev->report_size + 1) * MAX_INTERRUPT_BUFFER),
 818                    GFP_KERNEL);
 819        if (!dev->read_queue) {
 820                dev_err(&interface->dev, "Couldn't allocate read_queue\n");
 821                goto error;
 822        }
 823        /* Get the serial-number of the chip */
 824        memset(dev->chip_serial, 0x00, sizeof(dev->chip_serial));
 825        usb_string(udev, udev->descriptor.iSerialNumber, dev->chip_serial,
 826                   sizeof(dev->chip_serial));
 827        if (strlen(dev->chip_serial) != 8)
 828                memset(dev->chip_serial, 0x00, sizeof(dev->chip_serial));
 829
 830        /* Set the idle timeout to 0, if this is interface 0 */
 831        if (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) {
 832            usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 833                            0x0A,
 834                            USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0,
 835                            0, NULL, 0, USB_CTRL_SET_TIMEOUT);
 836        }
 837        /* allow device read and ioctl */
 838        dev->present = 1;
 839
 840        /* we can register the device now, as it is ready */
 841        usb_set_intfdata(interface, dev);
 842
 843        retval = usb_register_dev(interface, &iowarrior_class);
 844        if (retval) {
 845                /* something prevented us from registering this driver */
 846                dev_err(&interface->dev, "Not able to get a minor for this device.\n");
 847                usb_set_intfdata(interface, NULL);
 848                goto error;
 849        }
 850
 851        dev->minor = interface->minor;
 852
 853        /* let the user know what node this device is now attached to */
 854        dev_info(&interface->dev, "IOWarrior product=0x%x, serial=%s interface=%d "
 855                 "now attached to iowarrior%d\n", dev->product_id, dev->chip_serial,
 856                 iface_desc->desc.bInterfaceNumber, dev->minor - IOWARRIOR_MINOR_BASE);
 857        return retval;
 858
 859error:
 860        iowarrior_delete(dev);
 861        return retval;
 862}
 863
 864/**
 865 *      iowarrior_disconnect
 866 *
 867 *      Called by the usb core when the device is removed from the system.
 868 */
 869static void iowarrior_disconnect(struct usb_interface *interface)
 870{
 871        struct iowarrior *dev;
 872        int minor;
 873
 874        dev = usb_get_intfdata(interface);
 875        mutex_lock(&iowarrior_open_disc_lock);
 876        usb_set_intfdata(interface, NULL);
 877
 878        minor = dev->minor;
 879
 880        /* give back our minor */
 881        usb_deregister_dev(interface, &iowarrior_class);
 882
 883        mutex_lock(&dev->mutex);
 884
 885        /* prevent device read, write and ioctl */
 886        dev->present = 0;
 887
 888        mutex_unlock(&dev->mutex);
 889        mutex_unlock(&iowarrior_open_disc_lock);
 890
 891        if (dev->opened) {
 892                /* There is a process that holds a filedescriptor to the device ,
 893                   so we only shutdown read-/write-ops going on.
 894                   Deleting the device is postponed until close() was called.
 895                 */
 896                usb_kill_urb(dev->int_in_urb);
 897                wake_up_interruptible(&dev->read_wait);
 898                wake_up_interruptible(&dev->write_wait);
 899        } else {
 900                /* no process is using the device, cleanup now */
 901                iowarrior_delete(dev);
 902        }
 903
 904        dev_info(&interface->dev, "I/O-Warror #%d now disconnected\n",
 905                 minor - IOWARRIOR_MINOR_BASE);
 906}
 907
 908/* usb specific object needed to register this driver with the usb subsystem */
 909static struct usb_driver iowarrior_driver = {
 910        .name = "iowarrior",
 911        .probe = iowarrior_probe,
 912        .disconnect = iowarrior_disconnect,
 913        .id_table = iowarrior_ids,
 914};
 915
 916static int __init iowarrior_init(void)
 917{
 918        return usb_register(&iowarrior_driver);
 919}
 920
 921static void __exit iowarrior_exit(void)
 922{
 923        usb_deregister(&iowarrior_driver);
 924}
 925
 926module_init(iowarrior_init);
 927module_exit(iowarrior_exit);
 928
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.