Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cm4040_cs.c
Go to the documentation of this file.
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 <[email protected]>
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 
51 static 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 
62 static void reader_release(struct pcmcia_device *link);
63 
64 static int major;
65 static struct class *cmx_class;
66 
67 #define BS_READABLE 0x01
68 #define BS_WRITABLE 0x02
69 
70 struct reader_dev {
71  struct pcmcia_device *p_dev;
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];
81 };
82 
83 static struct pcmcia_device *dev_table[CM_MAX_DEV];
84 
85 #ifndef CM4040_DEBUG
86 #define xoutb outb
87 #define xinb inb
88 #else
89 static 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 
95 static 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. */
107 static 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
112 
113  if ((obs & BSR_BULK_IN_FULL)) {
115  DEBUGP(4, dev, "waking up read_wait\n");
117  } else
119 
120  if (!(obs & BSR_BULK_OUT_FULL)) {
122  DEBUGP(4, dev, "waking up write_wait\n");
124  } else
126 
127  if (dev->buffer_status)
129 
130  mod_timer(&dev->poll_timer, jiffies + POLL_PERIOD);
131 }
132 
133 static void cm4040_stop_poll(struct reader_dev *dev)
134 {
135  del_timer_sync(&dev->poll_timer);
136 }
137 
138 static 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);
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 */
169 static 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 
186 static 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);
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 
215 static 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 
317 static 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]) {
357  break;
358 
361  break;
362 
370  default:
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 
418 static 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 
426  mask |= POLLIN | POLLRDNORM;
428  mask |= POLLOUT | POLLWRNORM;
429 
430  DEBUGP(2, dev, "<- cm4040_poll(%u)\n", mask);
431 
432  return mask;
433 }
434 
435 static 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);
473 out:
474  mutex_unlock(&cm4040_mutex);
475  return ret;
476 }
477 
478 static 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 
503 static 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 
517 static int cm4040_config_check(struct pcmcia_device *p_dev, void *priv_data)
518 {
519  return pcmcia_request_io(p_dev);
520 }
521 
522 
523 static 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_printk(KERN_INFO, &link->dev,
536  "pcmcia_enable_device failed 0x%x\n",
537  fail_rc);
538  goto cs_release;
539  }
540 
541  dev = link->priv;
542 
543  DEBUGP(2, dev, "device " DEVICE_NAME "%d at %pR\n", devno,
544  link->resource[0]);
545  DEBUGP(2, dev, "<- reader_config (succ)\n");
546 
547  return 0;
548 
549 cs_release:
550  reader_release(link);
551  return -ENODEV;
552 }
553 
554 static void reader_release(struct pcmcia_device *link)
555 {
556  cm4040_reader_release(link);
557  pcmcia_disable_device(link);
558 }
559 
560 static int reader_probe(struct pcmcia_device *link)
561 {
562  struct reader_dev *dev;
563  int i, ret;
564 
565  for (i = 0; i < CM_MAX_DEV; i++) {
566  if (dev_table[i] == NULL)
567  break;
568  }
569 
570  if (i == CM_MAX_DEV)
571  return -ENODEV;
572 
573  dev = kzalloc(sizeof(struct reader_dev), GFP_KERNEL);
574  if (dev == NULL)
575  return -ENOMEM;
576 
578  dev->buffer_status = 0;
579 
580  link->priv = dev;
581  dev->p_dev = link;
582 
583  dev_table[i] = link;
584 
585  init_waitqueue_head(&dev->devq);
589  setup_timer(&dev->poll_timer, cm4040_do_poll, 0);
590 
591  ret = reader_config(link, i);
592  if (ret) {
593  dev_table[i] = NULL;
594  kfree(dev);
595  return ret;
596  }
597 
598  device_create(cmx_class, NULL, MKDEV(major, i), NULL, "cmx%d", i);
599 
600  return 0;
601 }
602 
603 static void reader_detach(struct pcmcia_device *link)
604 {
605  struct reader_dev *dev = link->priv;
606  int devno;
607 
608  /* find device */
609  for (devno = 0; devno < CM_MAX_DEV; devno++) {
610  if (dev_table[devno] == link)
611  break;
612  }
613  if (devno == CM_MAX_DEV)
614  return;
615 
616  reader_release(link);
617 
618  dev_table[devno] = NULL;
619  kfree(dev);
620 
621  device_destroy(cmx_class, MKDEV(major, devno));
622 
623  return;
624 }
625 
626 static const struct file_operations reader_fops = {
627  .owner = THIS_MODULE,
628  .read = cm4040_read,
629  .write = cm4040_write,
630  .open = cm4040_open,
631  .release = cm4040_close,
632  .poll = cm4040_poll,
633  .llseek = no_llseek,
634 };
635 
636 static const struct pcmcia_device_id cm4040_ids[] = {
637  PCMCIA_DEVICE_MANF_CARD(0x0223, 0x0200),
638  PCMCIA_DEVICE_PROD_ID12("OMNIKEY", "CardMan 4040",
639  0xE32CDD8C, 0x8F23318B),
640  PCMCIA_DEVICE_NULL,
641 };
642 MODULE_DEVICE_TABLE(pcmcia, cm4040_ids);
643 
644 static struct pcmcia_driver reader_driver = {
645  .owner = THIS_MODULE,
646  .name = "cm4040_cs",
647  .probe = reader_probe,
648  .remove = reader_detach,
649  .id_table = cm4040_ids,
650 };
651 
652 static int __init cm4040_init(void)
653 {
654  int rc;
655 
656  cmx_class = class_create(THIS_MODULE, "cardman_4040");
657  if (IS_ERR(cmx_class))
658  return PTR_ERR(cmx_class);
659 
660  major = register_chrdev(0, DEVICE_NAME, &reader_fops);
661  if (major < 0) {
663  ": could not get major number\n");
664  class_destroy(cmx_class);
665  return major;
666  }
667 
668  rc = pcmcia_register_driver(&reader_driver);
669  if (rc < 0) {
670  unregister_chrdev(major, DEVICE_NAME);
671  class_destroy(cmx_class);
672  return rc;
673  }
674 
675  return 0;
676 }
677 
678 static void __exit cm4040_exit(void)
679 {
680  pcmcia_unregister_driver(&reader_driver);
681  unregister_chrdev(major, DEVICE_NAME);
682  class_destroy(cmx_class);
683 }
684 
685 module_init(cm4040_init);
686 module_exit(cm4040_exit);
687 MODULE_LICENSE("Dual BSD/GPL");