Skip to content

Commit

Permalink
[PATCH] pcmcia: CM4000, CM4040 Driver fixes
Browse files Browse the repository at this point in the history
Using this patch, Omnikey CardMan 4000 and 4040 devices automatically
get their device nodes created by udev.

Also, we now check for (and handle) failure of pcmcia_register_driver()

Signed-off-by: Harald Welte <laforge@netfilter.org>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
  • Loading branch information
Harald Welte authored and Dominik Brodowski committed Mar 1, 2006
1 parent 2fe22a8 commit 67bc620
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
24 changes: 21 additions & 3 deletions drivers/char/pcmcia/cm4000_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@
*
* (C) 2000,2001,2002,2003,2004 Omnikey AG
*
* (C) 2005 Harald Welte <laforge@gnumonks.org>
* (C) 2005-2006 Harald Welte <laforge@gnumonks.org>
* - Adhere to Kernel CodingStyle
* - Port to 2.6.13 "new" style PCMCIA
* - Check for copy_{from,to}_user return values
* - Use nonseekable_open()
* - add class interface for udev device creation
*
* All rights reserved. Licensed under dual BSD/GPL license.
*/
Expand Down Expand Up @@ -56,7 +57,7 @@ module_param(pc_debug, int, 0600);
#else
#define DEBUGP(n, rdr, x, args...)
#endif
static char *version = "cm4000_cs.c v2.4.0gm5 - All bugs added by Harald Welte";
static char *version = "cm4000_cs.c v2.4.0gm6 - All bugs added by Harald Welte";

#define T_1SEC (HZ)
#define T_10MSEC msecs_to_jiffies(10)
Expand Down Expand Up @@ -156,6 +157,7 @@ struct cm4000_dev {
/*queue*/ 4*sizeof(wait_queue_head_t))

static dev_link_t *dev_table[CM4000_MAX_DEV];
static struct class *cmm_class;

/* This table doesn't use spaces after the comma between fields and thus
* violates CodingStyle. However, I don't really think wrapping it around will
Expand Down Expand Up @@ -1937,6 +1939,9 @@ static int cm4000_attach(struct pcmcia_device *p_dev)
link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
cm4000_config(link, i);

class_device_create(cmm_class, NULL, MKDEV(major, i), NULL,
"cmm%d", i);

return 0;
}

Expand All @@ -1962,6 +1967,8 @@ static void cm4000_detach(struct pcmcia_device *p_dev)
dev_table[devno] = NULL;
kfree(dev);

class_device_destroy(cmm_class, MKDEV(major, devno));

return;
}

Expand Down Expand Up @@ -1995,8 +2002,18 @@ static struct pcmcia_driver cm4000_driver = {

static int __init cmm_init(void)
{
int rc;

printk(KERN_INFO "%s\n", version);
pcmcia_register_driver(&cm4000_driver);

cmm_class = class_create(THIS_MODULE, "cardman_4000");
if (!cmm_class)
return -1;

rc = pcmcia_register_driver(&cm4000_driver);
if (rc < 0)
return rc;

major = register_chrdev(0, DEVICE_NAME, &cm4000_fops);
if (major < 0) {
printk(KERN_WARNING MODULE_NAME
Expand All @@ -2012,6 +2029,7 @@ static void __exit cmm_exit(void)
printk(KERN_INFO MODULE_NAME ": unloading\n");
pcmcia_unregister_driver(&cm4000_driver);
unregister_chrdev(major, DEVICE_NAME);
class_destroy(cmm_class);
};

module_init(cmm_init);
Expand Down
23 changes: 20 additions & 3 deletions drivers/char/pcmcia/cm4040_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
*
* (c) 2000-2004 Omnikey AG (http://www.omnikey.com/)
*
* (C) 2005 Harald Welte <laforge@gnumonks.org>
* (C) 2005-2006 Harald Welte <laforge@gnumonks.org>
* - add support for poll()
* - driver cleanup
* - add waitqueues
* - adhere to linux kernel coding style and policies
* - support 2.6.13 "new style" pcmcia interface
* - add class interface for udev device creation
*
* The device basically is a USB CCID compliant device that has been
* attached to an I/O-Mapped FIFO.
Expand Down Expand Up @@ -53,7 +54,7 @@ module_param(pc_debug, int, 0600);
#endif

static char *version =
"OMNIKEY CardMan 4040 v1.1.0gm4 - All bugs added by Harald Welte";
"OMNIKEY CardMan 4040 v1.1.0gm5 - All bugs added by Harald Welte";

#define CCID_DRIVER_BULK_DEFAULT_TIMEOUT (150*HZ)
#define CCID_DRIVER_ASYNC_POWERUP_TIMEOUT (35*HZ)
Expand All @@ -67,6 +68,7 @@ static char *version =
static void reader_release(dev_link_t *link);

static int major;
static struct class *cmx_class;

#define BS_READABLE 0x01
#define BS_WRITABLE 0x02
Expand Down Expand Up @@ -696,6 +698,9 @@ static int reader_attach(struct pcmcia_device *p_dev)
link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
reader_config(link, i);

class_device_create(cmx_class, NULL, MKDEV(major, i), NULL,
"cmx%d", i);

return 0;
}

Expand All @@ -721,6 +726,8 @@ static void reader_detach(struct pcmcia_device *p_dev)
dev_table[devno] = NULL;
kfree(dev);

class_device_destroy(cmx_class, MKDEV(major, devno));

return;
}

Expand Down Expand Up @@ -755,8 +762,17 @@ static struct pcmcia_driver reader_driver = {

static int __init cm4040_init(void)
{
int rc;

printk(KERN_INFO "%s\n", version);
pcmcia_register_driver(&reader_driver);
cmx_class = class_create(THIS_MODULE, "cardman_4040");
if (!cmx_class)
return -1;

rc = pcmcia_register_driver(&reader_driver);
if (rc < 0)
return rc;

major = register_chrdev(0, DEVICE_NAME, &reader_fops);
if (major < 0) {
printk(KERN_WARNING MODULE_NAME
Expand All @@ -771,6 +787,7 @@ static void __exit cm4040_exit(void)
printk(KERN_INFO MODULE_NAME ": unloading\n");
pcmcia_unregister_driver(&reader_driver);
unregister_chrdev(major, DEVICE_NAME);
class_destroy(cmx_class);
}

module_init(cm4040_init);
Expand Down

0 comments on commit 67bc620

Please sign in to comment.