Re: [PATCH] Omnikey Cardman 4040 driver

From: Jesper Juhl
Date: Mon Sep 05 2005 - 15:24:53 EST


On Monday 05 September 2005 22:05, Jesper Juhl wrote:
> On Monday 05 September 2005 21:54, Harald Welte wrote:
> > Hi!
> >
> > I've now incorporated all the suggested changes (thanks once again on
> > the many comments received). The resulting driver has been tested and
> > works fine.
> >
> > Please consider applying the driver to the mainline tree, thanks.
> >
> What did you diff this against? When I applied it to the 2.6.13 source I got :
>
> patching file MAINTAINERS
> Hunk #1 succeeded at 1730 (offset -7 lines).
> patching file drivers/char/pcmcia/Kconfig
> patching file drivers/char/pcmcia/Makefile
> patching file drivers/char/pcmcia/cm4040_cs.c
> patching file drivers/char/pcmcia/cm4040_cs.h
>
> Anyway, I did a small cleanup.
> Removed all instances of trailing whitespace ( sed -r s/"[ \t]+$"/""/ ).
> Removed some excessive (IMHO) use of blank lines.
> A few CodingStyle related whitespace fixes (spaces after "," etc).
> Removed some pointless casts.
>
> Hope this is useful to you (applies on top of the version you just posted).
>

Actually, forget the previous patch, I forgot a few things. Improved patch can
be found below (a few extra cleanups of spacing and make the header look a
little more pretty).

/Jesper Juhl


--- drivers/char/pcmcia/cm4040_cs.c.orig 2005-09-05 21:39:05.000000000 +0200
+++ drivers/char/pcmcia/cm4040_cs.c 2005-09-05 22:20:38.000000000 +0200
@@ -1,4 +1,4 @@
- /*
+/*
* A driver for the Omnikey PCMCIA smartcard reader CardMan 4040
*
* (c) 2000-2004 Omnikey AG (http://www.omnikey.com/)
@@ -68,28 +68,25 @@ static char *version =
static void reader_release(dev_link_t *link);
static void reader_detach(dev_link_t *link);

-static int major;
+static int major;

#define BS_READABLE 0x01
#define BS_WRITABLE 0x02

struct reader_dev {
- dev_link_t link;
- dev_node_t node;
- wait_queue_head_t devq;
-
+ dev_link_t link;
+ dev_node_t node;
+ wait_queue_head_t devq;
wait_queue_head_t poll_wait;
wait_queue_head_t read_wait;
wait_queue_head_t write_wait;
-
unsigned int buffer_status;
-
unsigned int timer_expired;
struct timer_list timer;
unsigned long timeout;
unsigned char s_buf[READ_WRITE_BUFFER_SIZE];
unsigned char r_buf[READ_WRITE_BUFFER_SIZE];
- struct task_struct *owner;
+ struct task_struct *owner;
};

static dev_info_t dev_info = MODULE_NAME;
@@ -104,7 +101,7 @@ static struct timer_list cm4040_poll_tim
static inline void xoutb(unsigned char val, unsigned short port)
{
DEBUG(7, "outb(val=%.2x,port=%.4x)\n", val, port);
- outb(val,port);
+ outb(val, port);
}

static inline unsigned char xinb(unsigned short port)
@@ -122,7 +119,7 @@ static inline unsigned char xinb(unsigne
static void cm4040_do_poll(unsigned long dummy)
{
unsigned int i;
- /* walk through all devices */
+ /* walk through all devices */
for (i = 0; dev_table[i]; i++) {
dev_link_t *dl = dev_table[i];
struct reader_dev *dev = dl->priv;
@@ -156,7 +153,7 @@ static int wait_for_bulk_out_ready(struc
int i, rc;
int iobase = dev->link.io.BasePort1;

- for (i=0; i < POLL_LOOP_COUNT; i++) {
+ for (i = 0; i < POLL_LOOP_COUNT; i++) {
if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)
& BSR_BULK_OUT_FULL) == 0) {
DEBUG(4, "BulkOut empty (i=%d)\n", i);
@@ -191,7 +188,7 @@ static int write_sync_reg(unsigned char
if (rc <= 0)
return rc;

- xoutb(val,iobase + REG_OFFSET_SYNC_CONTROL);
+ xoutb(val, iobase + REG_OFFSET_SYNC_CONTROL);
rc = wait_for_bulk_out_ready(dev);
if (rc <= 0)
return rc;
@@ -204,7 +201,7 @@ static int wait_for_bulk_in_ready(struct
int i, rc;
int iobase = dev->link.io.BasePort1;

- for (i=0; i < POLL_LOOP_COUNT; i++) {
+ for (i = 0; i < POLL_LOOP_COUNT; i++) {
if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)
& BSR_BULK_IN_FULL) == BSR_BULK_IN_FULL) {
DEBUG(3, "BulkIn full (i=%d)\n", i);
@@ -215,7 +212,7 @@ static int wait_for_bulk_in_ready(struct
DEBUG(4, "wait_event_interruptible_timeout(timeout=%ld\n",
dev->timeout);
rc = wait_event_interruptible_timeout(dev->read_wait,
- test_and_clear_bit(BS_READABLE,
+ test_and_clear_bit(BS_READABLE,
&dev->buffer_status),
dev->timeout);
if (rc > 0)
@@ -231,7 +228,7 @@ static int wait_for_bulk_in_ready(struct
static ssize_t cm4040_read(struct file *filp, char __user *buf,
size_t count, loff_t *ppos)
{
- struct reader_dev *dev = (struct reader_dev *) filp->private_data;
+ struct reader_dev *dev = filp->private_data;
int iobase = dev->link.io.BasePort1;
unsigned long bytes_to_read;
unsigned long i;
@@ -239,7 +236,7 @@ static ssize_t cm4040_read(struct file *
int rc;
unsigned char uc;

- DEBUG(2, "-> cm4040_read(%s,%d)\n", current->comm,current->pid);
+ DEBUG(2, "-> cm4040_read(%s,%d)\n", current->comm, current->pid);

if (count == 0)
return 0;
@@ -247,17 +244,17 @@ static ssize_t cm4040_read(struct file *
if (count < 10)
return -EFAULT;

- if (filp->f_flags & O_NONBLOCK) {
+ if (filp->f_flags & O_NONBLOCK) {
DEBUG(4, "filep->f_flags O_NONBLOCK set\n");
DEBUG(2, "<- cm4040_read (failure)\n");
return -EAGAIN;
}

- if ((dev->link.state & DEV_PRESENT)==0)
+ if ((dev->link.state & DEV_PRESENT) == 0)
return -ENODEV;

schedule_timeout(1*HZ);
- for (i=0; i<5; i++) {
+ for (i = 0; i < 5; i++) {
rc = wait_for_bulk_in_ready(dev);
if (rc <= 0) {
DEBUG(5,"wait_for_bulk_in_ready rc=%.2x\n",rc);
@@ -284,7 +281,7 @@ static ssize_t cm4040_read(struct file *

DEBUG(6, "Min=%lu\n", min_bytes_to_read);

- for (i=0; i < (min_bytes_to_read-5); i++) {
+ for (i = 0; i < (min_bytes_to_read-5); i++) {
rc = wait_for_bulk_in_ready(dev);
if (rc <= 0) {
DEBUG(5,"wait_for_bulk_in_ready rc=%.2x\n",rc);
@@ -302,7 +299,6 @@ static ssize_t cm4040_read(struct file *
if (copy_to_user(buf, dev->r_buf, min_bytes_to_read))
return -EFAULT;

-
rc = wait_for_bulk_in_ready(dev);
if (rc <= 0) {
DEBUG(5,"wait_for_bulk_in_ready rc=%.2x\n",rc);
@@ -331,11 +327,11 @@ static ssize_t cm4040_read(struct file *
static ssize_t cm4040_write(struct file *filp, const char __user *buf,
size_t count, loff_t *ppos)
{
- struct reader_dev *dev = (struct reader_dev *) filp->private_data;
+ struct reader_dev *dev = filp->private_data;
int iobase = dev->link.io.BasePort1;
ssize_t rc;
int i;
- unsigned int bytes_to_write;
+ unsigned int bytes_to_write;

DEBUG(2, "-> cm4040_write(%s,%d)\n", current->comm, current->pid);

@@ -349,13 +345,13 @@ static ssize_t cm4040_write(struct file
return -EIO;
}

- if (filp->f_flags & O_NONBLOCK) {
+ if (filp->f_flags & O_NONBLOCK) {
DEBUG(4, "filep->f_flags O_NONBLOCK set\n");
DEBUG(4, "<- cm4040_write (failure)\n");
return -EAGAIN;
}

- if ((dev->link.state & DEV_PRESENT) == 0)
+ if ((dev->link.state & DEV_PRESENT) == 0)
return -ENODEV;

bytes_to_write = count;
@@ -377,7 +373,7 @@ static ssize_t cm4040_write(struct file
case CMD_PC_TO_RDR_GETSLOTSTATUS:
case CMD_PC_TO_RDR_ICCPOWEROFF:
case CMD_PC_TO_RDR_GETPARAMETERS:
- case CMD_PC_TO_RDR_RESETPARAMETERS:
+ case CMD_PC_TO_RDR_RESETPARAMETERS:
case CMD_PC_TO_RDR_SETPARAMETERS:
case CMD_PC_TO_RDR_ESCAPE:
case CMD_PC_TO_RDR_ICCCLOCK:
@@ -396,10 +392,9 @@ static ssize_t cm4040_write(struct file
return -EIO;
}

-
DEBUG(4, "start \n");

- for (i=0; i < bytes_to_write; i++) {
+ for (i = 0; i < bytes_to_write; i++) {
rc = wait_for_bulk_out_ready(dev);
if (rc <= 0) {
DEBUG(5, "wait_for_bulk_out_ready rc=%.2Zx\n", rc);
@@ -409,7 +404,7 @@ static ssize_t cm4040_write(struct file
else
return -EIO;
}
-
+
xoutb(dev->s_buf[i],iobase + REG_OFFSET_BULK_OUT);
DEBUG(4, "%.2x ", dev->s_buf[i]);
}
@@ -432,7 +427,7 @@ static ssize_t cm4040_write(struct file

static unsigned int cm4040_poll(struct file *filp, poll_table *wait)
{
- struct reader_dev *dev = (struct reader_dev *) filp->private_data;
+ struct reader_dev *dev = filp->private_data;
unsigned int mask = 0;

poll_wait(filp, &dev->poll_wait, wait);
@@ -465,7 +460,7 @@ static int cm4040_open(struct inode *ino
}
link = dev_table[MINOR(inode->i_rdev)];
if (link == NULL || !(DEV_OK(link))) {
- DEBUG(4, "link== NULL || DEV_OK false\n");
+ DEBUG(4, "link == NULL || DEV_OK false\n");
DEBUG(4, "<- cm4040_open (failure)\n");
return -ENODEV;
}
@@ -478,14 +473,14 @@ static int cm4040_open(struct inode *ino
dev = (struct reader_dev *)link->priv;
filp->private_data = dev;

- if (filp->f_flags & O_NONBLOCK) {
+ if (filp->f_flags & O_NONBLOCK) {
DEBUG(4, "filep->f_flags O_NONBLOCK set\n");
DEBUG(4, "<- cm4040_open (failure)\n");
return -EAGAIN;
}

dev->owner = current;
- link->open = 1;
+ link->open = 1;

atomic_inc(&cm4040_num_devices_open);
mod_timer(&cm4040_poll_timer, jiffies + POLL_PERIOD);
@@ -494,7 +489,7 @@ static int cm4040_open(struct inode *ino
return nonseekable_open(inode, filp);
}

-static int cm4040_close(struct inode *inode,struct file *filp)
+static int cm4040_close(struct inode *inode, struct file *filp)
{
struct reader_dev *dev;
dev_link_t *link;
@@ -511,10 +506,10 @@ static int cm4040_close(struct inode *in
if (link == NULL)
return -ENODEV;

- dev = (struct reader_dev *) link->priv;
+ dev = link->priv;

link->open = 0;
- wake_up(&dev->devq);
+ wake_up(&dev->devq);

atomic_dec(&cm4040_num_devices_open);

@@ -524,16 +519,16 @@ static int cm4040_close(struct inode *in

static void cm4040_reader_release(dev_link_t *link)
{
- struct reader_dev *dev = (struct reader_dev *) link->priv;
+ struct reader_dev *dev = link->priv;

- DEBUG(3, "-> cm4040_reader_release\n");
+ DEBUG(3, "-> cm4040_reader_release\n");
while (link->open) {
DEBUG(3, KERN_INFO MODULE_NAME ": delaying release until "
"process '%s', pid %d has terminated\n",
- dev->owner->comm,dev->owner->pid);
+ dev->owner->comm, dev->owner->pid);
wait_event(dev->devq, (link->open == 0));
}
- DEBUG(3, "<- cm4040_reader_release\n");
+ DEBUG(3, "<- cm4040_reader_release\n");
return;
}

@@ -600,7 +595,7 @@ static void reader_config(dev_link_t *li

DEBUG(2, "tupleIndex=%d\n", parse.cftable_entry.index);
link->conf.ConfigIndex = parse.cftable_entry.index;
-
+
if (!parse.cftable_entry.io.nwin)
continue;

@@ -621,8 +616,8 @@ static void reader_config(dev_link_t *li
rc = pcmcia_request_io(handle, &link->io);
if (rc == CS_SUCCESS) {
DEBUG(2, "RequestIO OK\n");
- break;
- } else
+ break;
+ } else
DEBUG(2, "RequestIO failed\n");
}
if (rc != CS_SUCCESS) {
@@ -684,7 +679,7 @@ static int reader_event(event_t event, i
case CS_EVENT_CARD_INSERTION:
DEBUG(5, "CS_EVENT_CARD_INSERTION\n");
link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
- reader_config(link,devno);
+ reader_config(link, devno);
break;
case CS_EVENT_CARD_REMOVAL:
DEBUG(5, "CS_EVENT_CARD_REMOVAL\n");
@@ -694,7 +689,7 @@ static int reader_event(event_t event, i
DEBUG(5, "CS_EVENT_PM_SUSPEND "
"(fall-through to CS_EVENT_RESET_PHYSICAL)\n");
link->state |= DEV_SUSPEND;
-
+
case CS_EVENT_RESET_PHYSICAL:
DEBUG(5, "CS_EVENT_RESET_PHYSICAL\n");
if (link->state & DEV_CONFIG) {
@@ -706,7 +701,7 @@ static int reader_event(event_t event, i
DEBUG(5, "CS_EVENT_PM_RESUME "
"(fall-through to CS_EVENT_CARD_RESET)\n");
link->state &= ~DEV_SUSPEND;
-
+
case CS_EVENT_CARD_RESET:
DEBUG(5, "CS_EVENT_CARD_RESET\n");
if ((link->state & DEV_CONFIG)) {
@@ -728,7 +723,7 @@ static void reader_release(dev_link_t *l
int rc;

DEBUG(3, "-> reader_release\n");
- cm4040_reader_release(link->priv);
+ cm4040_reader_release(link->priv);
rc = pcmcia_release_configuration(link->handle);
if (rc != CS_SUCCESS)
DEBUG(5, "couldn't ReleaseConfiguration "
@@ -748,7 +743,7 @@ static dev_link_t *reader_attach(void)
int i;

DEBUG(3, "reader_attach\n");
- for (i=0; i < CM_MAX_DEV; i++) {
+ for (i = 0; i < CM_MAX_DEV; i++) {
if (dev_table[i] == NULL)
break;
}
@@ -757,7 +752,7 @@ static dev_link_t *reader_attach(void)
printk(KERN_NOTICE "all devices in use\n");
return NULL;
}
-
+
DEBUG(5, "create reader device instance\n");
dev = kmalloc(sizeof(struct reader_dev), GFP_KERNEL);
if (dev == NULL)
@@ -774,7 +769,6 @@ static dev_link_t *reader_attach(void)
link->conf.IntType = INT_MEMORY_AND_IO;
dev_table[i] = link;

-
DEBUG(5, "Register with Card Services\n");
client_reg.dev_info = &dev_info;
client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
@@ -829,7 +823,7 @@ static void reader_detach(dev_link_t *li
break;
}
if (i == CM_MAX_DEV) {
- printk(KERN_WARNING MODULE_NAME
+ printk(KERN_WARNING MODULE_NAME
": detach for unkown device aborted\n");
return;
}
@@ -849,7 +843,7 @@ static struct file_operations reader_fop

static struct pcmcia_device_id cm4040_ids[] = {
PCMCIA_DEVICE_MANF_CARD(0x0223, 0x0200),
- PCMCIA_DEVICE_PROD_ID12("OMNIKEY", "CardMan 4040",
+ PCMCIA_DEVICE_PROD_ID12("OMNIKEY", "CardMan 4040",
0xE32CDD8C, 0x8F23318B),
PCMCIA_DEVICE_NULL,
};
@@ -884,7 +878,7 @@ static void __exit cm4040_exit(void)
int i;

printk(KERN_INFO MODULE_NAME ": unloading\n");
- pcmcia_unregister_driver(&reader_driver);
+ pcmcia_unregister_driver(&reader_driver);
for (i = 0; i < CM_MAX_DEV; i++) {
if (dev_table[i])
reader_detach_by_devno(i, dev_table[i]);
--- drivers/char/pcmcia/cm4040_cs.h.orig 2005-09-05 22:17:14.000000000 +0200
+++ drivers/char/pcmcia/cm4040_cs.h 2005-09-05 22:24:35.000000000 +0200
@@ -1,47 +1,45 @@
-#ifndef _CM4040_H_
-#define _CM4040_H_
+#ifndef _CM4040_H_
+#define _CM4040_H_

-#define CM_MAX_DEV 4
+#define CM_MAX_DEV 4

-#define DEVICE_NAME "cmx"
-#define MODULE_NAME "cm4040_cs"
+#define DEVICE_NAME "cmx"
+#define MODULE_NAME "cm4040_cs"

-#define REG_OFFSET_BULK_OUT 0
-#define REG_OFFSET_BULK_IN 0
-#define REG_OFFSET_BUFFER_STATUS 1
-#define REG_OFFSET_SYNC_CONTROL 2
-
-#define BSR_BULK_IN_FULL 0x02
-#define BSR_BULK_OUT_FULL 0x01
-
-#define SCR_HOST_TO_READER_START 0x80
-#define SCR_ABORT 0x40
-#define SCR_EN_NOTIFY 0x20
-#define SCR_ACK_NOTIFY 0x10
-#define SCR_READER_TO_HOST_DONE 0x08
-#define SCR_HOST_TO_READER_DONE 0x04
-#define SCR_PULSE_INTERRUPT 0x02
-#define SCR_POWER_DOWN 0x01
-
-
-#define CMD_PC_TO_RDR_ICCPOWERON 0x62
-#define CMD_PC_TO_RDR_GETSLOTSTATUS 0x65
-#define CMD_PC_TO_RDR_ICCPOWEROFF 0x63
-#define CMD_PC_TO_RDR_SECURE 0x69
-#define CMD_PC_TO_RDR_GETPARAMETERS 0x6C
-#define CMD_PC_TO_RDR_RESETPARAMETERS 0x6D
-#define CMD_PC_TO_RDR_SETPARAMETERS 0x61
-#define CMD_PC_TO_RDR_XFRBLOCK 0x6F
-#define CMD_PC_TO_RDR_ESCAPE 0x6B
-#define CMD_PC_TO_RDR_ICCCLOCK 0x6E
-#define CMD_PC_TO_RDR_TEST_SECURE 0x74
-#define CMD_PC_TO_RDR_OK_SECURE 0x89
-
-
-#define CMD_RDR_TO_PC_SLOTSTATUS 0x81
-#define CMD_RDR_TO_PC_DATABLOCK 0x80
-#define CMD_RDR_TO_PC_PARAMETERS 0x82
-#define CMD_RDR_TO_PC_ESCAPE 0x83
-#define CMD_RDR_TO_PC_OK_SECURE 0x89
+#define REG_OFFSET_BULK_OUT 0
+#define REG_OFFSET_BULK_IN 0
+#define REG_OFFSET_BUFFER_STATUS 1
+#define REG_OFFSET_SYNC_CONTROL 2
+
+#define BSR_BULK_IN_FULL 0x02
+#define BSR_BULK_OUT_FULL 0x01
+
+#define SCR_HOST_TO_READER_START 0x80
+#define SCR_ABORT 0x40
+#define SCR_EN_NOTIFY 0x20
+#define SCR_ACK_NOTIFY 0x10
+#define SCR_READER_TO_HOST_DONE 0x08
+#define SCR_HOST_TO_READER_DONE 0x04
+#define SCR_PULSE_INTERRUPT 0x02
+#define SCR_POWER_DOWN 0x01
+
+#define CMD_PC_TO_RDR_ICCPOWERON 0x62
+#define CMD_PC_TO_RDR_GETSLOTSTATUS 0x65
+#define CMD_PC_TO_RDR_ICCPOWEROFF 0x63
+#define CMD_PC_TO_RDR_SECURE 0x69
+#define CMD_PC_TO_RDR_GETPARAMETERS 0x6C
+#define CMD_PC_TO_RDR_RESETPARAMETERS 0x6D
+#define CMD_PC_TO_RDR_SETPARAMETERS 0x61
+#define CMD_PC_TO_RDR_XFRBLOCK 0x6F
+#define CMD_PC_TO_RDR_ESCAPE 0x6B
+#define CMD_PC_TO_RDR_ICCCLOCK 0x6E
+#define CMD_PC_TO_RDR_TEST_SECURE 0x74
+#define CMD_PC_TO_RDR_OK_SECURE 0x89
+
+#define CMD_RDR_TO_PC_SLOTSTATUS 0x81
+#define CMD_RDR_TO_PC_DATABLOCK 0x80
+#define CMD_RDR_TO_PC_PARAMETERS 0x82
+#define CMD_RDR_TO_PC_ESCAPE 0x83
+#define CMD_RDR_TO_PC_OK_SECURE 0x89

#endif /* _CM4040_H_ */




-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/