linux/drivers/char/pcmcia/cm4040_cs.c
<<
>>
Prefs
   1/*
   2 * A driver for the Omnikey PCMCIA smartcard reader CardMan 4040
   3 *
   4 * (c) 2000-2004 Omnikey AG (http://www.omnikey.com/)
   5 *
   6 * (C) 2005-2006 Harald Welte <laforge@gnumonks.org>
   7 *      - add support for poll()
   8 *      - driver cleanup
   9 *      - add waitqueues
  10 *      - adhere to linux kernel coding style and policies
  11 *      - support 2.6.13 "new style" pcmcia interface
  12 *      - add class interface for udev device creation
  13 *
  14 * The device basically is a USB CCID compliant device that has been
  15 * attached to an I/O-Mapped FIFO.
  16 *
  17 * All rights reserved, Dual BSD/GPL Licensed.
  18 */
  19
  20#include <linux/kernel.h>
  21#include <linux/module.h>
  22#include <linux/slab.h>
  23#include <linux/init.h>
  24#include <linux/fs.h>
  25#include <linux/delay.h>
  26#include <linux/poll.h>
  27#include <linux/mutex.h>
  28#include <linux/wait.h>
  29#include <asm/uaccess.h>
  30#include <asm/io.h>
  31
  32#include <pcmcia/cistpl.h>
  33#include <pcmcia/cisreg.h>
  34#include <pcmcia/ciscode.h>
  35#include <pcmcia/ds.h>
  36
  37#include "cm4040_cs.h"
  38
  39
  40#define reader_to_dev(x)        (&x->p_dev->dev)
  41
  42/* n (debug level) is ignored */
  43/* additional debug output may be enabled by re-compiling with
  44 * CM4040_DEBUG set */
  45/* #define CM4040_DEBUG */
  46#define DEBUGP(n, rdr, x, args...) do {                 \
  47                dev_dbg(reader_to_dev(rdr), "%s:" x,    \
  48                           __func__ , ## args);         \
  49        } while (0)
  50
  51static DEFINE_MUTEX(cm4040_mutex);
  52
  53#define CCID_DRIVER_BULK_DEFAULT_TIMEOUT        (150*HZ)
  54#define CCID_DRIVER_ASYNC_POWERUP_TIMEOUT       (35*HZ)
  55#define CCID_DRIVER_MINIMUM_TIMEOUT             (3*HZ)
  56#define READ_WRITE_BUFFER_SIZE 512
  57#define POLL_LOOP_COUNT                         1000
  58
  59/* how often to poll for fifo status change */
  60#define POLL_PERIOD                             msecs_to_jiffies(10)
  61
  62static void reader_release(struct pcmcia_device *link);
  63
  64static int major;
  65static struct class *cmx_class;
  66
  67#define         BS_READABLE     0x01
  68#define         BS_WRITABLE     0x02
  69
  70struct reader_dev {
  71        struct pcmcia_device    *p_dev;
  72        wait_queue_head_t       devq;
  73        wait_queue_head_t       poll_wait;
  74        wait_queue_head_t       read_wait;
  75        wait_queue_head_t       write_wait;
  76        unsigned long           buffer_status;
  77        unsigned long           timeout;
  78        unsigned char           s_buf[READ_WRITE_BUFFER_SIZE];
  79        unsigned char           r_buf[READ_WRITE_BUFFER_SIZE];
  80        struct timer_list       poll_timer;
  81};
  82
  83static struct pcmcia_device *dev_table[CM_MAX_DEV];
  84
  85#ifndef CM4040_DEBUG
  86#define xoutb   outb
  87#define xinb    inb
  88#else
  89static inline void xoutb(unsigned char val, unsigned short port)
  90{
  91        pr_debug("outb(val=%.2x,port=%.4x)\n", val, port);
  92        outb(val, port);
  93}
  94
  95static inline unsigned char xinb(unsigned short port)
  96{
  97        unsigned char val;
  98
  99        val = inb(port);
 100        pr_debug("%.2x=inb(%.4x)\n", val, port);
 101        return val;
 102}
 103#endif
 104
 105/* poll the device fifo status register.  not to be confused with
 106 * the poll syscall. */
 107static void cm4040_do_poll(unsigned long dummy)
 108{
 109        struct reader_dev *dev = (struct reader_dev *) dummy;
 110        unsigned int obs = xinb(dev->p_dev->resource[0]->start
 111                                + REG_OFFSET_BUFFER_STATUS);
 112
 113        if ((obs & BSR_BULK_IN_FULL)) {
 114                set_bit(BS_READABLE, &dev->buffer_status);
 115                DEBUGP(4, dev, "waking up read_wait\n");
 116                wake_up_interruptible(&dev->read_wait);
 117        } else
 118                clear_bit(BS_READABLE, &dev->buffer_status);
 119
 120        if (!(obs & BSR_BULK_OUT_FULL)) {
 121                set_bit(BS_WRITABLE, &dev->buffer_status);
 122                DEBUGP(4, dev, "waking up write_wait\n");
 123                wake_up_interruptible(&dev->write_wait);
 124        } else
 125                clear_bit(BS_WRITABLE, &dev->buffer_status);
 126
 127        if (dev->buffer_status)
 128                wake_up_interruptible(&dev->poll_wait);
 129
 130        mod_timer(&dev->poll_timer, jiffies + POLL_PERIOD);
 131}
 132
 133static void cm4040_stop_poll(struct reader_dev *dev)
 134{
 135        del_timer_sync(&dev->poll_timer);
 136}
 137
 138static int wait_for_bulk_out_ready(struct reader_dev *dev)
 139{
 140        int i, rc;
 141        int iobase = dev->p_dev->resource[0]->start;
 142
 143        for (i = 0; i < POLL_LOOP_COUNT; i++) {
 144                if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)
 145                    & BSR_BULK_OUT_FULL) == 0) {
 146                        DEBUGP(4, dev, "BulkOut empty (i=%d)\n", i);
 147                        return 1;
 148                }
 149        }
 150
 151        DEBUGP(4, dev, "wait_event_interruptible_timeout(timeout=%ld\n",
 152                dev->timeout);
 153        rc = wait_event_interruptible_timeout(dev->write_wait,
 154                                              test_and_clear_bit(BS_WRITABLE,
 155                                                       &dev->buffer_status),
 156                                              dev->timeout);
 157
 158        if (rc > 0)
 159                DEBUGP(4, dev, "woke up: BulkOut empty\n");
 160        else if (rc == 0)
 161                DEBUGP(4, dev, "woke up: BulkOut full, returning 0 :(\n");
 162        else if (rc < 0)
 163                DEBUGP(4, dev, "woke up: signal arrived\n");
 164
 165        return rc;
 166}
 167
 168/* Write to Sync Control Register */
 169static int write_sync_reg(unsigned char val, struct reader_dev *dev)
 170{
 171        int iobase = dev->p_dev->resource[0]->start;
 172        int rc;
 173
 174        rc = wait_for_bulk_out_ready(dev);
 175        if (rc <= 0)
 176                return rc;
 177
 178        xoutb(val, iobase + REG_OFFSET_SYNC_CONTROL);
 179        rc = wait_for_bulk_out_ready(dev);
 180        if (rc <= 0)
 181                return rc;
 182
 183        return 1;
 184}
 185
 186static int wait_for_bulk_in_ready(struct reader_dev *dev)
 187{
 188        int i, rc;
 189        int iobase = dev->p_dev->resource[0]->start;
 190
 191        for (i = 0; i < POLL_LOOP_COUNT; i++) {
 192                if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)
 193                    & BSR_BULK_IN_FULL) == BSR_BULK_IN_FULL) {
 194                        DEBUGP(3, dev, "BulkIn full (i=%d)\n", i);
 195                        return 1;
 196                }
 197        }
 198
 199        DEBUGP(4, dev, "wait_event_interruptible_timeout(timeout=%ld\n",
 200                dev->timeout);
 201        rc = wait_event_interruptible_timeout(dev->read_wait,
 202                                              test_and_clear_bit(BS_READABLE,
 203                                                        &dev->buffer_status),
 204                                              dev->timeout);
 205        if (rc > 0)
 206                DEBUGP(4, dev, "woke up: BulkIn full\n");
 207        else if (rc == 0)
 208                DEBUGP(4, dev, "woke up: BulkIn not full, returning 0 :(\n");
 209        else if (rc < 0)
 210                DEBUGP(4, dev, "woke up: signal arrived\n");
 211
 212        return rc;
 213}
 214
 215static ssize_t cm4040_read(struct file *filp, char __user *buf,
 216                        size_t count, loff_t *ppos)
 217{
 218        struct reader_dev *dev = filp->private_data;
 219        int iobase = dev->p_dev->resource[0]->start;
 220        size_t bytes_to_read;
 221        unsigned long i;
 222        size_t min_bytes_to_read;
 223        int rc;
 224        unsigned char uc;
 225
 226        DEBUGP(2, dev, "-> cm4040_read(%s,%d)\n", current->comm, current->pid);
 227
 228        if (count == 0)
 229                return 0;
 230
 231        if (count < 10)
 232                return -EFAULT;
 233
 234        if (filp->f_flags & O_NONBLOCK) {
 235                DEBUGP(4, dev, "filep->f_flags O_NONBLOCK set\n");
 236                DEBUGP(2, dev, "<- cm4040_read (failure)\n");
 237                return -EAGAIN;
 238        }
 239
 240        if (!pcmcia_dev_present(dev->p_dev))
 241                return -ENODEV;
 242
 243        for (i = 0; i < 5; i++) {
 244                rc = wait_for_bulk_in_ready(dev);
 245                if (rc <= 0) {
 246                        DEBUGP(5, dev, "wait_for_bulk_in_ready rc=%.2x\n", rc);
 247                        DEBUGP(2, dev, "<- cm4040_read (failed)\n");
 248                        if (rc == -ERESTARTSYS)
 249                                return rc;
 250                        return -EIO;
 251                }
 252                dev->r_buf[i] = xinb(iobase + REG_OFFSET_BULK_IN);
 253#ifdef CM4040_DEBUG
 254                pr_debug("%lu:%2x ", i, dev->r_buf[i]);
 255        }
 256        pr_debug("\n");
 257#else
 258        }
 259#endif
 260
 261        bytes_to_read = 5 + le32_to_cpu(*(__le32 *)&dev->r_buf[1]);
 262
 263        DEBUGP(6, dev, "BytesToRead=%zu\n", bytes_to_read);
 264
 265        min_bytes_to_read = min(count, bytes_to_read + 5);
 266        min_bytes_to_read = min_t(size_t, min_bytes_to_read, READ_WRITE_BUFFER_SIZE);
 267
 268        DEBUGP(6, dev, "Min=%zu\n", min_bytes_to_read);
 269
 270        for (i = 0; i < (min_bytes_to_read-5); i++) {
 271                rc = wait_for_bulk_in_ready(dev);
 272                if (rc <= 0) {
 273                        DEBUGP(5, dev, "wait_for_bulk_in_ready rc=%.2x\n", rc);
 274                        DEBUGP(2, dev, "<- cm4040_read (failed)\n");
 275                        if (rc == -ERESTARTSYS)
 276                                return rc;
 277                        return -EIO;
 278                }
 279                dev->r_buf[i+5] = xinb(iobase + REG_OFFSET_BULK_IN);
 280#ifdef CM4040_DEBUG
 281                pr_debug("%lu:%2x ", i, dev->r_buf[i]);
 282        }
 283        pr_debug("\n");
 284#else
 285        }
 286#endif
 287
 288        *ppos = min_bytes_to_read;
 289        if (copy_to_user(buf, dev->r_buf, min_bytes_to_read))
 290                return -EFAULT;
 291
 292        rc = wait_for_bulk_in_ready(dev);
 293        if (rc <= 0) {
 294                DEBUGP(5, dev, "wait_for_bulk_in_ready rc=%.2x\n", rc);
 295                DEBUGP(2, dev, "<- cm4040_read (failed)\n");
 296                if (rc == -ERESTARTSYS)
 297                        return rc;
 298                return -EIO;
 299        }
 300
 301        rc = write_sync_reg(SCR_READER_TO_HOST_DONE, dev);
 302        if (rc <= 0) {
 303                DEBUGP(5, dev, "write_sync_reg c=%.2x\n", rc);
 304                DEBUGP(2, dev, "<- cm4040_read (failed)\n");
 305                if (rc == -ERESTARTSYS)
 306                        return rc;
 307                else
 308                        return -EIO;
 309        }
 310
 311        uc = xinb(iobase + REG_OFFSET_BULK_IN);
 312
 313        DEBUGP(2, dev, "<- cm4040_read (successfully)\n");
 314        return min_bytes_to_read;
 315}
 316
 317static ssize_t cm4040_write(struct file *filp, const char __user *buf,
 318                         size_t count, loff_t *ppos)
 319{
 320        struct reader_dev *dev = filp->private_data;
 321        int iobase = dev->p_dev->resource[0]->start;
 322        ssize_t rc;
 323        int i;
 324        unsigned int bytes_to_write;
 325
 326        DEBUGP(2, dev, "-> cm4040_write(%s,%d)\n", current->comm, current->pid);
 327
 328        if (count == 0) {
 329                DEBUGP(2, dev, "<- cm4040_write empty read (successfully)\n");
 330                return 0;
 331        }
 332
 333        if ((count < 5) || (count > READ_WRITE_BUFFER_SIZE)) {
 334                DEBUGP(2, dev, "<- cm4040_write buffersize=%Zd < 5\n", count);
 335                return -EIO;
 336        }
 337
 338        if (filp->f_flags & O_NONBLOCK) {
 339                DEBUGP(4, dev, "filep->f_flags O_NONBLOCK set\n");
 340                DEBUGP(4, dev, "<- cm4040_write (failure)\n");
 341                return -EAGAIN;
 342        }
 343
 344        if (!pcmcia_dev_present(dev->p_dev))
 345                return -ENODEV;
 346
 347        bytes_to_write = count;
 348        if (copy_from_user(dev->s_buf, buf, bytes_to_write))
 349                return -EFAULT;
 350
 351        switch (dev->s_buf[0]) {
 352                case CMD_PC_TO_RDR_XFRBLOCK:
 353                case CMD_PC_TO_RDR_SECURE:
 354                case CMD_PC_TO_RDR_TEST_SECURE:
 355                case CMD_PC_TO_RDR_OK_SECURE:
 356                        dev->timeout = CCID_DRIVER_BULK_DEFAULT_TIMEOUT;
 357                        break;
 358
 359                case CMD_PC_TO_RDR_ICCPOWERON:
 360                        dev->timeout = CCID_DRIVER_ASYNC_POWERUP_TIMEOUT;
 361                        break;
 362
 363                case CMD_PC_TO_RDR_GETSLOTSTATUS:
 364                case CMD_PC_TO_RDR_ICCPOWEROFF:
 365                case CMD_PC_TO_RDR_GETPARAMETERS:
 366                case CMD_PC_TO_RDR_RESETPARAMETERS:
 367                case CMD_PC_TO_RDR_SETPARAMETERS:
 368                case CMD_PC_TO_RDR_ESCAPE:
 369                case CMD_PC_TO_RDR_ICCCLOCK:
 370                default:
 371                        dev->timeout = CCID_DRIVER_MINIMUM_TIMEOUT;
 372                        break;
 373        }
 374
 375        rc = write_sync_reg(SCR_HOST_TO_READER_START, dev);
 376        if (rc <= 0) {
 377                DEBUGP(5, dev, "write_sync_reg c=%.2Zx\n", rc);
 378                DEBUGP(2, dev, "<- cm4040_write (failed)\n");
 379                if (rc == -ERESTARTSYS)
 380                        return rc;
 381                else
 382                        return -EIO;
 383        }
 384
 385        DEBUGP(4, dev, "start \n");
 386
 387        for (i = 0; i < bytes_to_write; i++) {
 388                rc = wait_for_bulk_out_ready(dev);
 389                if (rc <= 0) {
 390                        DEBUGP(5, dev, "wait_for_bulk_out_ready rc=%.2Zx\n",
 391                               rc);
 392                        DEBUGP(2, dev, "<- cm4040_write (failed)\n");
 393                        if (rc == -ERESTARTSYS)
 394                                return rc;
 395                        else
 396                                return -EIO;
 397                }
 398
 399                xoutb(dev->s_buf[i],iobase + REG_OFFSET_BULK_OUT);
 400        }
 401        DEBUGP(4, dev, "end\n");
 402
 403        rc = write_sync_reg(SCR_HOST_TO_READER_DONE, dev);
 404
 405        if (rc <= 0) {
 406                DEBUGP(5, dev, "write_sync_reg c=%.2Zx\n", rc);
 407                DEBUGP(2, dev, "<- cm4040_write (failed)\n");
 408                if (rc == -ERESTARTSYS)
 409                        return rc;
 410                else
 411                        return -EIO;
 412        }
 413
 414        DEBUGP(2, dev, "<- cm4040_write (successfully)\n");
 415        return count;
 416}
 417
 418static unsigned int cm4040_poll(struct file *filp, poll_table *wait)
 419{
 420        struct reader_dev *dev = filp->private_data;
 421        unsigned int mask = 0;
 422
 423        poll_wait(filp, &dev->poll_wait, wait);
 424
 425        if (test_and_clear_bit(BS_READABLE, &dev->buffer_status))
 426                mask |= POLLIN | POLLRDNORM;
 427        if (test_and_clear_bit(BS_WRITABLE, &dev->buffer_status))
 428                mask |= POLLOUT | POLLWRNORM;
 429
 430        DEBUGP(2, dev, "<- cm4040_poll(%u)\n", mask);
 431
 432        return mask;
 433}
 434
 435static int cm4040_open(struct inode *inode, struct file *filp)
 436{
 437        struct reader_dev *dev;
 438        struct pcmcia_device *link;
 439        int minor = iminor(inode);
 440        int ret;
 441
 442        if (minor >= CM_MAX_DEV)
 443                return -ENODEV;
 444
 445        mutex_lock(&cm4040_mutex);
 446        link = dev_table[minor];
 447        if (link == NULL || !pcmcia_dev_present(link)) {
 448                ret = -ENODEV;
 449                goto out;
 450        }
 451
 452        if (link->open) {
 453                ret = -EBUSY;
 454                goto out;
 455        }
 456
 457        dev = link->priv;
 458        filp->private_data = dev;
 459
 460        if (filp->f_flags & O_NONBLOCK) {
 461                DEBUGP(4, dev, "filep->f_flags O_NONBLOCK set\n");
 462                ret = -EAGAIN;
 463                goto out;
 464        }
 465
 466        link->open = 1;
 467
 468        dev->poll_timer.data = (unsigned long) dev;
 469        mod_timer(&dev->poll_timer, jiffies + POLL_PERIOD);
 470
 471        DEBUGP(2, dev, "<- cm4040_open (successfully)\n");
 472        ret = nonseekable_open(inode, filp);
 473out:
 474        mutex_unlock(&cm4040_mutex);
 475        return ret;
 476}
 477
 478static int cm4040_close(struct inode *inode, struct file *filp)
 479{
 480        struct reader_dev *dev = filp->private_data;
 481        struct pcmcia_device *link;
 482        int minor = iminor(inode);
 483
 484        DEBUGP(2, dev, "-> cm4040_close(maj/min=%d.%d)\n", imajor(inode),
 485              iminor(inode));
 486
 487        if (minor >= CM_MAX_DEV)
 488                return -ENODEV;
 489
 490        link = dev_table[minor];
 491        if (link == NULL)
 492                return -ENODEV;
 493
 494        cm4040_stop_poll(dev);
 495
 496        link->open = 0;
 497        wake_up(&dev->devq);
 498
 499        DEBUGP(2, dev, "<- cm4040_close\n");
 500        return 0;
 501}
 502
 503static void cm4040_reader_release(struct pcmcia_device *link)
 504{
 505        struct reader_dev *dev = link->priv;
 506
 507        DEBUGP(3, dev, "-> cm4040_reader_release\n");
 508        while (link->open) {
 509                DEBUGP(3, dev, KERN_INFO MODULE_NAME ": delaying release "
 510                       "until process has terminated\n");
 511                wait_event(dev->devq, (link->open == 0));
 512        }
 513        DEBUGP(3, dev, "<- cm4040_reader_release\n");
 514        return;
 515}
 516
 517static int cm4040_config_check(struct pcmcia_device *p_dev, void *priv_data)
 518{
 519        return pcmcia_request_io(p_dev);
 520}
 521
 522
 523static int reader_config(struct pcmcia_device *link, int devno)
 524{
 525        struct reader_dev *dev;
 526        int fail_rc;
 527
 528        link->config_flags |= CONF_AUTO_SET_IO;
 529
 530        if (pcmcia_loop_config(link, cm4040_config_check, NULL))
 531                goto cs_release;
 532
 533        fail_rc = pcmcia_enable_device(link);
 534        if (fail_rc != 0) {
 535                dev_info(&link->dev, "pcmcia_enable_device failed 0x%x\n",
 536                         fail_rc);
 537                goto cs_release;
 538        }
 539
 540        dev = link->priv;
 541
 542        DEBUGP(2, dev, "device " DEVICE_NAME "%d at %pR\n", devno,
 543              link->resource[0]);
 544        DEBUGP(2, dev, "<- reader_config (succ)\n");
 545
 546        return 0;
 547
 548cs_release:
 549        reader_release(link);
 550        return -ENODEV;
 551}
 552
 553static void reader_release(struct pcmcia_device *link)
 554{
 555        cm4040_reader_release(link);
 556        pcmcia_disable_device(link);
 557}
 558
 559static int reader_probe(struct pcmcia_device *link)
 560{
 561        struct reader_dev *dev;
 562        int i, ret;
 563
 564        for (i = 0; i < CM_MAX_DEV; i++) {
 565                if (dev_table[i] == NULL)
 566                        break;
 567        }
 568
 569        if (i == CM_MAX_DEV)
 570                return -ENODEV;
 571
 572        dev = kzalloc(sizeof(struct reader_dev), GFP_KERNEL);
 573        if (dev == NULL)
 574                return -ENOMEM;
 575
 576        dev->timeout = CCID_DRIVER_MINIMUM_TIMEOUT;
 577        dev->buffer_status = 0;
 578
 579        link->priv = dev;
 580        dev->p_dev = link;
 581
 582        dev_table[i] = link;
 583
 584        init_waitqueue_head(&dev->devq);
 585        init_waitqueue_head(&dev->poll_wait);
 586        init_waitqueue_head(&dev->read_wait);
 587        init_waitqueue_head(&dev->write_wait);
 588        setup_timer(&dev->poll_timer, cm4040_do_poll, 0);
 589
 590        ret = reader_config(link, i);
 591        if (ret) {
 592                dev_table[i] = NULL;
 593                kfree(dev);
 594                return ret;
 595        }
 596
 597        device_create(cmx_class, NULL, MKDEV(major, i), NULL, "cmx%d", i);
 598
 599        return 0;
 600}
 601
 602static void reader_detach(struct pcmcia_device *link)
 603{
 604        struct reader_dev *dev = link->priv;
 605        int devno;
 606
 607        /* find device */
 608        for (devno = 0; devno < CM_MAX_DEV; devno++) {
 609                if (dev_table[devno] == link)
 610                        break;
 611        }
 612        if (devno == CM_MAX_DEV)
 613                return;
 614
 615        reader_release(link);
 616
 617        dev_table[devno] = NULL;
 618        kfree(dev);
 619
 620        device_destroy(cmx_class, MKDEV(major, devno));
 621
 622        return;
 623}
 624
 625static const struct file_operations reader_fops = {
 626        .owner          = THIS_MODULE,
 627        .read           = cm4040_read,
 628        .write          = cm4040_write,
 629        .open           = cm4040_open,
 630        .release        = cm4040_close,
 631        .poll           = cm4040_poll,
 632        .llseek         = no_llseek,
 633};
 634
 635static const struct pcmcia_device_id cm4040_ids[] = {
 636        PCMCIA_DEVICE_MANF_CARD(0x0223, 0x0200),
 637        PCMCIA_DEVICE_PROD_ID12("OMNIKEY", "CardMan 4040",
 638                                0xE32CDD8C, 0x8F23318B),
 639        PCMCIA_DEVICE_NULL,
 640};
 641MODULE_DEVICE_TABLE(pcmcia, cm4040_ids);
 642
 643static struct pcmcia_driver reader_driver = {
 644        .owner          = THIS_MODULE,
 645        .name           = "cm4040_cs",
 646        .probe          = reader_probe,
 647        .remove         = reader_detach,
 648        .id_table       = cm4040_ids,
 649};
 650
 651static int __init cm4040_init(void)
 652{
 653        int rc;
 654
 655        cmx_class = class_create(THIS_MODULE, "cardman_4040");
 656        if (IS_ERR(cmx_class))
 657                return PTR_ERR(cmx_class);
 658
 659        major = register_chrdev(0, DEVICE_NAME, &reader_fops);
 660        if (major < 0) {
 661                printk(KERN_WARNING MODULE_NAME
 662                        ": could not get major number\n");
 663                class_destroy(cmx_class);
 664                return major;
 665        }
 666
 667        rc = pcmcia_register_driver(&reader_driver);
 668        if (rc < 0) {
 669                unregister_chrdev(major, DEVICE_NAME);
 670                class_destroy(cmx_class);
 671                return rc;
 672        }
 673
 674        return 0;
 675}
 676
 677static void __exit cm4040_exit(void)
 678{
 679        pcmcia_unregister_driver(&reader_driver);
 680        unregister_chrdev(major, DEVICE_NAME);
 681        class_destroy(cmx_class);
 682}
 683
 684module_init(cm4040_init);
 685module_exit(cm4040_exit);
 686MODULE_LICENSE("Dual BSD/GPL");
 687