2 * A driver for the Omnikey PCMCIA smartcard reader CardMan 4040
4 * (c) 2000-2004 Omnikey AG (http://www.omnikey.com/)
6 * (C) 2005 Harald Welte <laforge@gnumonks.org>
7 * - add support for poll()
10 * - adhere to linux kernel coding style and policies
11 * - support 2.6.13 "new style" pcmcia interface
13 * The device basically is a USB CCID compliant device that has been
14 * attached to an I/O-Mapped FIFO.
16 * All rights reserved, Dual BSD/GPL Licensed.
19 /* #define PCMCIA_DEBUG 6 */
21 #include <linux/kernel.h>
22 #include <linux/module.h>
23 #include <linux/slab.h>
24 #include <linux/init.h>
26 #include <linux/delay.h>
27 #include <linux/poll.h>
28 #include <linux/wait.h>
29 #include <asm/uaccess.h>
32 #include <pcmcia/cs_types.h>
33 #include <pcmcia/cs.h>
34 #include <pcmcia/cistpl.h>
35 #include <pcmcia/cisreg.h>
36 #include <pcmcia/ciscode.h>
37 #include <pcmcia/ds.h>
39 #include "cm4040_cs.h"
43 #define reader_to_dev(x) (&handle_to_dev(x->link.handle))
44 static int pc_debug
= PCMCIA_DEBUG
;
45 module_param(pc_debug
, int, 0600);
46 #define DEBUGP(n, rdr, x, args...) do { \
47 if (pc_debug >= (n)) \
48 dev_printk(KERN_DEBUG, reader_to_dev(rdr), "%s:" x, \
49 __FUNCTION__ , ##args); \
52 #define DEBUGP(n, rdr, x, args...)
55 static char *version
=
56 "OMNIKEY CardMan 4040 v1.1.0gm4 - All bugs added by Harald Welte";
58 #define CCID_DRIVER_BULK_DEFAULT_TIMEOUT (150*HZ)
59 #define CCID_DRIVER_ASYNC_POWERUP_TIMEOUT (35*HZ)
60 #define CCID_DRIVER_MINIMUM_TIMEOUT (3*HZ)
61 #define READ_WRITE_BUFFER_SIZE 512
62 #define POLL_LOOP_COUNT 1000
64 /* how often to poll for fifo status change */
65 #define POLL_PERIOD msecs_to_jiffies(10)
67 static void reader_release(dev_link_t
*link
);
68 static void reader_detach(dev_link_t
*link
);
72 #define BS_READABLE 0x01
73 #define BS_WRITABLE 0x02
78 wait_queue_head_t devq
;
79 wait_queue_head_t poll_wait
;
80 wait_queue_head_t read_wait
;
81 wait_queue_head_t write_wait
;
82 unsigned long buffer_status
;
83 unsigned long timeout
;
84 unsigned char s_buf
[READ_WRITE_BUFFER_SIZE
];
85 unsigned char r_buf
[READ_WRITE_BUFFER_SIZE
];
86 struct timer_list poll_timer
;
89 static dev_info_t dev_info
= MODULE_NAME
;
90 static dev_link_t
*dev_table
[CM_MAX_DEV
];
96 static inline void xoutb(unsigned char val
, unsigned short port
)
99 printk(KERN_DEBUG
"outb(val=%.2x,port=%.4x)\n", val
, port
);
103 static inline unsigned char xinb(unsigned short port
)
109 printk(KERN_DEBUG
"%.2x=inb(%.4x)\n", val
, port
);
114 /* poll the device fifo status register. not to be confused with
115 * the poll syscall. */
116 static void cm4040_do_poll(unsigned long dummy
)
118 struct reader_dev
*dev
= (struct reader_dev
*) dummy
;
119 unsigned int obs
= xinb(dev
->link
.io
.BasePort1
120 + REG_OFFSET_BUFFER_STATUS
);
122 if ((obs
& BSR_BULK_IN_FULL
)) {
123 set_bit(BS_READABLE
, &dev
->buffer_status
);
124 DEBUGP(4, dev
, "waking up read_wait\n");
125 wake_up_interruptible(&dev
->read_wait
);
127 clear_bit(BS_READABLE
, &dev
->buffer_status
);
129 if (!(obs
& BSR_BULK_OUT_FULL
)) {
130 set_bit(BS_WRITABLE
, &dev
->buffer_status
);
131 DEBUGP(4, dev
, "waking up write_wait\n");
132 wake_up_interruptible(&dev
->write_wait
);
134 clear_bit(BS_WRITABLE
, &dev
->buffer_status
);
136 if (dev
->buffer_status
)
137 wake_up_interruptible(&dev
->poll_wait
);
139 mod_timer(&dev
->poll_timer
, jiffies
+ POLL_PERIOD
);
142 static void cm4040_stop_poll(struct reader_dev
*dev
)
144 del_timer_sync(&dev
->poll_timer
);
147 static int wait_for_bulk_out_ready(struct reader_dev
*dev
)
150 int iobase
= dev
->link
.io
.BasePort1
;
152 for (i
= 0; i
< POLL_LOOP_COUNT
; i
++) {
153 if ((xinb(iobase
+ REG_OFFSET_BUFFER_STATUS
)
154 & BSR_BULK_OUT_FULL
) == 0) {
155 DEBUGP(4, dev
, "BulkOut empty (i=%d)\n", i
);
160 DEBUGP(4, dev
, "wait_event_interruptible_timeout(timeout=%ld\n",
162 rc
= wait_event_interruptible_timeout(dev
->write_wait
,
163 test_and_clear_bit(BS_WRITABLE
,
164 &dev
->buffer_status
),
168 DEBUGP(4, dev
, "woke up: BulkOut empty\n");
170 DEBUGP(4, dev
, "woke up: BulkOut full, returning 0 :(\n");
172 DEBUGP(4, dev
, "woke up: signal arrived\n");
177 /* Write to Sync Control Register */
178 static int write_sync_reg(unsigned char val
, struct reader_dev
*dev
)
180 int iobase
= dev
->link
.io
.BasePort1
;
183 rc
= wait_for_bulk_out_ready(dev
);
187 xoutb(val
, iobase
+ REG_OFFSET_SYNC_CONTROL
);
188 rc
= wait_for_bulk_out_ready(dev
);
195 static int wait_for_bulk_in_ready(struct reader_dev
*dev
)
198 int iobase
= dev
->link
.io
.BasePort1
;
200 for (i
= 0; i
< POLL_LOOP_COUNT
; i
++) {
201 if ((xinb(iobase
+ REG_OFFSET_BUFFER_STATUS
)
202 & BSR_BULK_IN_FULL
) == BSR_BULK_IN_FULL
) {
203 DEBUGP(3, dev
, "BulkIn full (i=%d)\n", i
);
208 DEBUGP(4, dev
, "wait_event_interruptible_timeout(timeout=%ld\n",
210 rc
= wait_event_interruptible_timeout(dev
->read_wait
,
211 test_and_clear_bit(BS_READABLE
,
212 &dev
->buffer_status
),
215 DEBUGP(4, dev
, "woke up: BulkIn full\n");
217 DEBUGP(4, dev
, "woke up: BulkIn not full, returning 0 :(\n");
219 DEBUGP(4, dev
, "woke up: signal arrived\n");
224 static ssize_t
cm4040_read(struct file
*filp
, char __user
*buf
,
225 size_t count
, loff_t
*ppos
)
227 struct reader_dev
*dev
= filp
->private_data
;
228 int iobase
= dev
->link
.io
.BasePort1
;
229 size_t bytes_to_read
;
231 size_t min_bytes_to_read
;
235 DEBUGP(2, dev
, "-> cm4040_read(%s,%d)\n", current
->comm
, current
->pid
);
243 if (filp
->f_flags
& O_NONBLOCK
) {
244 DEBUGP(4, dev
, "filep->f_flags O_NONBLOCK set\n");
245 DEBUGP(2, dev
, "<- cm4040_read (failure)\n");
249 if ((dev
->link
.state
& DEV_PRESENT
)==0)
252 for (i
= 0; i
< 5; i
++) {
253 rc
= wait_for_bulk_in_ready(dev
);
255 DEBUGP(5, dev
, "wait_for_bulk_in_ready rc=%.2x\n", rc
);
256 DEBUGP(2, dev
, "<- cm4040_read (failed)\n");
257 if (rc
== -ERESTARTSYS
)
261 dev
->r_buf
[i
] = xinb(iobase
+ REG_OFFSET_BULK_IN
);
264 printk(KERN_DEBUG
"%lu:%2x ", i
, dev
->r_buf
[i
]);
271 bytes_to_read
= 5 + le32_to_cpu(*(__le32
*)&dev
->r_buf
[1]);
273 DEBUGP(6, dev
, "BytesToRead=%lu\n", bytes_to_read
);
275 min_bytes_to_read
= min(count
, bytes_to_read
+ 5);
277 DEBUGP(6, dev
, "Min=%lu\n", min_bytes_to_read
);
279 for (i
= 0; i
< (min_bytes_to_read
-5); i
++) {
280 rc
= wait_for_bulk_in_ready(dev
);
282 DEBUGP(5, dev
, "wait_for_bulk_in_ready rc=%.2x\n", rc
);
283 DEBUGP(2, dev
, "<- cm4040_read (failed)\n");
284 if (rc
== -ERESTARTSYS
)
288 dev
->r_buf
[i
+5] = xinb(iobase
+ REG_OFFSET_BULK_IN
);
291 printk(KERN_DEBUG
"%lu:%2x ", i
, dev
->r_buf
[i
]);
298 *ppos
= min_bytes_to_read
;
299 if (copy_to_user(buf
, dev
->r_buf
, min_bytes_to_read
))
302 rc
= wait_for_bulk_in_ready(dev
);
304 DEBUGP(5, dev
, "wait_for_bulk_in_ready rc=%.2x\n", rc
);
305 DEBUGP(2, dev
, "<- cm4040_read (failed)\n");
306 if (rc
== -ERESTARTSYS
)
311 rc
= write_sync_reg(SCR_READER_TO_HOST_DONE
, dev
);
313 DEBUGP(5, dev
, "write_sync_reg c=%.2x\n", rc
);
314 DEBUGP(2, dev
, "<- cm4040_read (failed)\n");
315 if (rc
== -ERESTARTSYS
)
321 uc
= xinb(iobase
+ REG_OFFSET_BULK_IN
);
323 DEBUGP(2, dev
, "<- cm4040_read (successfully)\n");
324 return min_bytes_to_read
;
327 static ssize_t
cm4040_write(struct file
*filp
, const char __user
*buf
,
328 size_t count
, loff_t
*ppos
)
330 struct reader_dev
*dev
= filp
->private_data
;
331 int iobase
= dev
->link
.io
.BasePort1
;
334 unsigned int bytes_to_write
;
336 DEBUGP(2, dev
, "-> cm4040_write(%s,%d)\n", current
->comm
, current
->pid
);
339 DEBUGP(2, dev
, "<- cm4040_write empty read (successfully)\n");
344 DEBUGP(2, dev
, "<- cm4040_write buffersize=%Zd < 5\n", count
);
348 if (filp
->f_flags
& O_NONBLOCK
) {
349 DEBUGP(4, dev
, "filep->f_flags O_NONBLOCK set\n");
350 DEBUGP(4, dev
, "<- cm4040_write (failure)\n");
354 if ((dev
->link
.state
& DEV_PRESENT
) == 0)
357 bytes_to_write
= count
;
358 if (copy_from_user(dev
->s_buf
, buf
, bytes_to_write
))
361 switch (dev
->s_buf
[0]) {
362 case CMD_PC_TO_RDR_XFRBLOCK
:
363 case CMD_PC_TO_RDR_SECURE
:
364 case CMD_PC_TO_RDR_TEST_SECURE
:
365 case CMD_PC_TO_RDR_OK_SECURE
:
366 dev
->timeout
= CCID_DRIVER_BULK_DEFAULT_TIMEOUT
;
369 case CMD_PC_TO_RDR_ICCPOWERON
:
370 dev
->timeout
= CCID_DRIVER_ASYNC_POWERUP_TIMEOUT
;
373 case CMD_PC_TO_RDR_GETSLOTSTATUS
:
374 case CMD_PC_TO_RDR_ICCPOWEROFF
:
375 case CMD_PC_TO_RDR_GETPARAMETERS
:
376 case CMD_PC_TO_RDR_RESETPARAMETERS
:
377 case CMD_PC_TO_RDR_SETPARAMETERS
:
378 case CMD_PC_TO_RDR_ESCAPE
:
379 case CMD_PC_TO_RDR_ICCCLOCK
:
381 dev
->timeout
= CCID_DRIVER_MINIMUM_TIMEOUT
;
385 rc
= write_sync_reg(SCR_HOST_TO_READER_START
, dev
);
387 DEBUGP(5, dev
, "write_sync_reg c=%.2Zx\n", rc
);
388 DEBUGP(2, dev
, "<- cm4040_write (failed)\n");
389 if (rc
== -ERESTARTSYS
)
395 DEBUGP(4, dev
, "start \n");
397 for (i
= 0; i
< bytes_to_write
; i
++) {
398 rc
= wait_for_bulk_out_ready(dev
);
400 DEBUGP(5, dev
, "wait_for_bulk_out_ready rc=%.2Zx\n",
402 DEBUGP(2, dev
, "<- cm4040_write (failed)\n");
403 if (rc
== -ERESTARTSYS
)
409 xoutb(dev
->s_buf
[i
],iobase
+ REG_OFFSET_BULK_OUT
);
411 DEBUGP(4, dev
, "end\n");
413 rc
= write_sync_reg(SCR_HOST_TO_READER_DONE
, dev
);
416 DEBUGP(5, dev
, "write_sync_reg c=%.2Zx\n", rc
);
417 DEBUGP(2, dev
, "<- cm4040_write (failed)\n");
418 if (rc
== -ERESTARTSYS
)
424 DEBUGP(2, dev
, "<- cm4040_write (successfully)\n");
428 static unsigned int cm4040_poll(struct file
*filp
, poll_table
*wait
)
430 struct reader_dev
*dev
= filp
->private_data
;
431 unsigned int mask
= 0;
433 poll_wait(filp
, &dev
->poll_wait
, wait
);
435 if (test_and_clear_bit(BS_READABLE
, &dev
->buffer_status
))
436 mask
|= POLLIN
| POLLRDNORM
;
437 if (test_and_clear_bit(BS_WRITABLE
, &dev
->buffer_status
))
438 mask
|= POLLOUT
| POLLWRNORM
;
440 DEBUGP(2, dev
, "<- cm4040_poll(%u)\n", mask
);
445 static int cm4040_open(struct inode
*inode
, struct file
*filp
)
447 struct reader_dev
*dev
;
449 int minor
= iminor(inode
);
451 if (minor
>= CM_MAX_DEV
)
454 link
= dev_table
[minor
];
455 if (link
== NULL
|| !(DEV_OK(link
)))
462 filp
->private_data
= dev
;
464 if (filp
->f_flags
& O_NONBLOCK
) {
465 DEBUGP(4, dev
, "filep->f_flags O_NONBLOCK set\n");
471 dev
->poll_timer
.data
= (unsigned long) dev
;
472 mod_timer(&dev
->poll_timer
, jiffies
+ POLL_PERIOD
);
474 DEBUGP(2, dev
, "<- cm4040_open (successfully)\n");
475 return nonseekable_open(inode
, filp
);
478 static int cm4040_close(struct inode
*inode
, struct file
*filp
)
480 struct reader_dev
*dev
= filp
->private_data
;
482 int minor
= iminor(inode
);
484 DEBUGP(2, dev
, "-> cm4040_close(maj/min=%d.%d)\n", imajor(inode
),
487 if (minor
>= CM_MAX_DEV
)
490 link
= dev_table
[minor
];
494 cm4040_stop_poll(dev
);
499 DEBUGP(2, dev
, "<- cm4040_close\n");
503 static void cm4040_reader_release(dev_link_t
*link
)
505 struct reader_dev
*dev
= link
->priv
;
507 DEBUGP(3, dev
, "-> cm4040_reader_release\n");
509 DEBUGP(3, dev
, KERN_INFO MODULE_NAME
": delaying release "
510 "until process has terminated\n");
511 wait_event(dev
->devq
, (link
->open
== 0));
513 DEBUGP(3, dev
, "<- cm4040_reader_release\n");
517 static void reader_config(dev_link_t
*link
, int devno
)
519 client_handle_t handle
;
520 struct reader_dev
*dev
;
525 int fail_fn
, fail_rc
;
528 handle
= link
->handle
;
530 tuple
.DesiredTuple
= CISTPL_CONFIG
;
531 tuple
.Attributes
= 0;
532 tuple
.TupleData
= buf
;
533 tuple
.TupleDataMax
= sizeof(buf
);
534 tuple
.TupleOffset
= 0;
536 if ((fail_rc
= pcmcia_get_first_tuple(handle
, &tuple
)) != CS_SUCCESS
) {
537 fail_fn
= GetFirstTuple
;
540 if ((fail_rc
= pcmcia_get_tuple_data(handle
, &tuple
)) != CS_SUCCESS
) {
541 fail_fn
= GetTupleData
;
544 if ((fail_rc
= pcmcia_parse_tuple(handle
, &tuple
, &parse
))
546 fail_fn
= ParseTuple
;
549 if ((fail_rc
= pcmcia_get_configuration_info(handle
, &conf
))
551 fail_fn
= GetConfigurationInfo
;
555 link
->state
|= DEV_CONFIG
;
556 link
->conf
.ConfigBase
= parse
.config
.base
;
557 link
->conf
.Present
= parse
.config
.rmask
[0];
558 link
->conf
.Vcc
= conf
.Vcc
;
560 link
->io
.BasePort2
= 0;
561 link
->io
.NumPorts2
= 0;
562 link
->io
.Attributes2
= 0;
563 tuple
.DesiredTuple
= CISTPL_CFTABLE_ENTRY
;
564 for (rc
= pcmcia_get_first_tuple(handle
, &tuple
);
566 rc
= pcmcia_get_next_tuple(handle
, &tuple
)) {
567 rc
= pcmcia_get_tuple_data(handle
, &tuple
);
568 if (rc
!= CS_SUCCESS
)
570 rc
= pcmcia_parse_tuple(handle
, &tuple
, &parse
);
571 if (rc
!= CS_SUCCESS
)
574 link
->conf
.ConfigIndex
= parse
.cftable_entry
.index
;
576 if (!parse
.cftable_entry
.io
.nwin
)
579 link
->io
.BasePort1
= parse
.cftable_entry
.io
.win
[0].base
;
580 link
->io
.NumPorts1
= parse
.cftable_entry
.io
.win
[0].len
;
581 link
->io
.Attributes1
= IO_DATA_PATH_WIDTH_AUTO
;
582 if (!(parse
.cftable_entry
.io
.flags
& CISTPL_IO_8BIT
))
583 link
->io
.Attributes1
= IO_DATA_PATH_WIDTH_16
;
584 if (!(parse
.cftable_entry
.io
.flags
& CISTPL_IO_16BIT
))
585 link
->io
.Attributes1
= IO_DATA_PATH_WIDTH_8
;
586 link
->io
.IOAddrLines
= parse
.cftable_entry
.io
.flags
587 & CISTPL_IO_LINES_MASK
;
588 rc
= pcmcia_request_io(handle
, &link
->io
);
590 dev_printk(KERN_INFO
, &handle_to_dev(handle
), "foo");
591 if (rc
== CS_SUCCESS
)
594 dev_printk(KERN_INFO
, &handle_to_dev(handle
),
595 "pcmcia_request_io failed 0x%x\n", rc
);
597 if (rc
!= CS_SUCCESS
)
600 link
->conf
.IntType
= 00000002;
602 if ((fail_rc
= pcmcia_request_configuration(handle
,&link
->conf
))
604 fail_fn
= RequestConfiguration
;
605 dev_printk(KERN_INFO
, &handle_to_dev(handle
),
606 "pcmcia_request_configuration failed 0x%x\n",
612 sprintf(dev
->node
.dev_name
, DEVICE_NAME
"%d", devno
);
613 dev
->node
.major
= major
;
614 dev
->node
.minor
= devno
;
615 dev
->node
.next
= NULL
;
616 link
->dev
= &dev
->node
;
617 link
->state
&= ~DEV_CONFIG_PENDING
;
619 DEBUGP(2, dev
, "device " DEVICE_NAME
"%d at 0x%.4x-0x%.4x\n", devno
,
620 link
->io
.BasePort1
, link
->io
.BasePort1
+link
->io
.NumPorts1
);
621 DEBUGP(2, dev
, "<- reader_config (succ)\n");
626 cs_error(handle
, fail_fn
, fail_rc
);
628 reader_release(link
);
629 link
->state
&= ~DEV_CONFIG_PENDING
;
632 static int reader_event(event_t event
, int priority
,
633 event_callback_args_t
*args
)
636 struct reader_dev
*dev
;
639 link
= args
->client_data
;
641 DEBUGP(3, dev
, "-> reader_event\n");
642 for (devno
= 0; devno
< CM_MAX_DEV
; devno
++) {
643 if (dev_table
[devno
] == link
)
646 if (devno
== CM_MAX_DEV
)
647 return CS_BAD_ADAPTER
;
650 case CS_EVENT_CARD_INSERTION
:
651 DEBUGP(5, dev
, "CS_EVENT_CARD_INSERTION\n");
652 link
->state
|= DEV_PRESENT
| DEV_CONFIG_PENDING
;
653 reader_config(link
, devno
);
655 case CS_EVENT_CARD_REMOVAL
:
656 DEBUGP(5, dev
, "CS_EVENT_CARD_REMOVAL\n");
657 link
->state
&= ~DEV_PRESENT
;
659 case CS_EVENT_PM_SUSPEND
:
660 DEBUGP(5, dev
, "CS_EVENT_PM_SUSPEND "
661 "(fall-through to CS_EVENT_RESET_PHYSICAL)\n");
662 link
->state
|= DEV_SUSPEND
;
664 case CS_EVENT_RESET_PHYSICAL
:
665 DEBUGP(5, dev
, "CS_EVENT_RESET_PHYSICAL\n");
666 if (link
->state
& DEV_CONFIG
) {
667 DEBUGP(5, dev
, "ReleaseConfiguration\n");
668 pcmcia_release_configuration(link
->handle
);
671 case CS_EVENT_PM_RESUME
:
672 DEBUGP(5, dev
, "CS_EVENT_PM_RESUME "
673 "(fall-through to CS_EVENT_CARD_RESET)\n");
674 link
->state
&= ~DEV_SUSPEND
;
676 case CS_EVENT_CARD_RESET
:
677 DEBUGP(5, dev
, "CS_EVENT_CARD_RESET\n");
678 if ((link
->state
& DEV_CONFIG
)) {
679 DEBUGP(5, dev
, "RequestConfiguration\n");
680 pcmcia_request_configuration(link
->handle
,
685 DEBUGP(5, dev
, "reader_event: unknown event %.2x\n",
689 DEBUGP(3, dev
, "<- reader_event\n");
693 static void reader_release(dev_link_t
*link
)
695 cm4040_reader_release(link
->priv
);
696 pcmcia_release_configuration(link
->handle
);
697 pcmcia_release_io(link
->handle
, &link
->io
);
700 static dev_link_t
*reader_attach(void)
702 struct reader_dev
*dev
;
704 client_reg_t client_reg
;
707 for (i
= 0; i
< CM_MAX_DEV
; i
++) {
708 if (dev_table
[i
] == NULL
)
715 dev
= kzalloc(sizeof(struct reader_dev
), GFP_KERNEL
);
719 dev
->timeout
= CCID_DRIVER_MINIMUM_TIMEOUT
;
720 dev
->buffer_status
= 0;
725 link
->conf
.IntType
= INT_MEMORY_AND_IO
;
728 client_reg
.dev_info
= &dev_info
;
729 client_reg
.Attributes
= INFO_IO_CLIENT
| INFO_CARD_SHARE
;
730 client_reg
.EventMask
=
731 CS_EVENT_CARD_INSERTION
| CS_EVENT_CARD_REMOVAL
|
732 CS_EVENT_RESET_PHYSICAL
| CS_EVENT_CARD_RESET
|
733 CS_EVENT_PM_SUSPEND
| CS_EVENT_PM_RESUME
;
734 client_reg
.Version
= 0x0210;
735 client_reg
.event_callback_args
.client_data
= link
;
736 i
= pcmcia_register_client(&link
->handle
, &client_reg
);
738 cs_error(link
->handle
, RegisterClient
, i
);
742 init_waitqueue_head(&dev
->devq
);
743 init_waitqueue_head(&dev
->poll_wait
);
744 init_waitqueue_head(&dev
->read_wait
);
745 init_waitqueue_head(&dev
->write_wait
);
746 init_timer(&dev
->poll_timer
);
747 dev
->poll_timer
.function
= &cm4040_do_poll
;
752 static void reader_detach_by_devno(int devno
, dev_link_t
*link
)
754 struct reader_dev
*dev
= link
->priv
;
756 if (link
->state
& DEV_CONFIG
) {
757 DEBUGP(5, dev
, "device still configured (try to release it)\n");
758 reader_release(link
);
761 pcmcia_deregister_client(link
->handle
);
762 dev_table
[devno
] = NULL
;
763 DEBUGP(5, dev
, "freeing dev=%p\n", dev
);
764 cm4040_stop_poll(dev
);
769 static void reader_detach(dev_link_t
*link
)
774 for (i
= 0; i
< CM_MAX_DEV
; i
++) {
775 if (dev_table
[i
] == link
)
781 reader_detach_by_devno(i
, link
);
785 static struct file_operations reader_fops
= {
786 .owner
= THIS_MODULE
,
788 .write
= cm4040_write
,
790 .release
= cm4040_close
,
794 static struct pcmcia_device_id cm4040_ids
[] = {
795 PCMCIA_DEVICE_MANF_CARD(0x0223, 0x0200),
796 PCMCIA_DEVICE_PROD_ID12("OMNIKEY", "CardMan 4040",
797 0xE32CDD8C, 0x8F23318B),
800 MODULE_DEVICE_TABLE(pcmcia
, cm4040_ids
);
802 static struct pcmcia_driver reader_driver
= {
803 .owner
= THIS_MODULE
,
807 .attach
= reader_attach
,
808 .detach
= reader_detach
,
809 .event
= reader_event
,
810 .id_table
= cm4040_ids
,
813 static int __init
cm4040_init(void)
815 printk(KERN_INFO
"%s\n", version
);
816 pcmcia_register_driver(&reader_driver
);
817 major
= register_chrdev(0, DEVICE_NAME
, &reader_fops
);
819 printk(KERN_WARNING MODULE_NAME
820 ": could not get major number\n");
826 static void __exit
cm4040_exit(void)
830 printk(KERN_INFO MODULE_NAME
": unloading\n");
831 pcmcia_unregister_driver(&reader_driver
);
832 for (i
= 0; i
< CM_MAX_DEV
; i
++) {
834 reader_detach_by_devno(i
, dev_table
[i
]);
836 unregister_chrdev(major
, DEVICE_NAME
);
839 module_init(cm4040_init
);
840 module_exit(cm4040_exit
);
841 MODULE_LICENSE("Dual BSD/GPL");