2 * pcmcia_ioctl.c -- ioctl interface for cardmgr and cardctl
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
8 * The initial developer of the original code is David A. Hinds
9 * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
10 * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
12 * (C) 1999 David A. Hinds
13 * (C) 2003 - 2004 Dominik Brodowski
17 * This file will go away soon.
21 #include <linux/kernel.h>
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/major.h>
25 #include <linux/errno.h>
26 #include <linux/ioctl.h>
27 #include <linux/proc_fs.h>
28 #include <linux/poll.h>
29 #include <linux/pci.h>
30 #include <linux/smp_lock.h>
31 #include <linux/workqueue.h>
33 #include <pcmcia/cs_types.h>
34 #include <pcmcia/cs.h>
35 #include <pcmcia/cistpl.h>
36 #include <pcmcia/cisreg.h>
37 #include <pcmcia/ds.h>
38 #include <pcmcia/ss.h>
40 #include "cs_internal.h"
41 #include "ds_internal.h"
43 static int major_dev = -1;
46 /* Device user information */
48 #define USER_MAGIC 0x7ea4
49 #define CHECK_USER(u) \
50 (((u) == NULL) || ((u)->user_magic != USER_MAGIC))
52 typedef struct user_info_t {
54 int event_head, event_tail;
55 event_t event[MAX_EVENTS];
56 struct user_info_t *next;
57 struct pcmcia_socket *socket;
62 extern int ds_pc_debug;
64 #define ds_dbg(lvl, fmt, arg...) do { \
65 if (ds_pc_debug >= lvl) \
66 printk(KERN_DEBUG "ds: " fmt , ## arg); \
69 #define ds_dbg(lvl, fmt, arg...) do { } while (0)
72 static struct pcmcia_device *get_pcmcia_device(struct pcmcia_socket *s,
73 unsigned int function)
75 struct pcmcia_device *p_dev = NULL;
78 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
79 list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
80 if (p_dev->func == function) {
81 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
82 return pcmcia_get_dev(p_dev);
85 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
89 /* backwards-compatible accessing of driver --- by name! */
91 static struct pcmcia_driver *get_pcmcia_driver(dev_info_t *dev_info)
93 struct device_driver *drv;
94 struct pcmcia_driver *p_drv;
96 drv = driver_find((char *) dev_info, &pcmcia_bus_type);
100 p_drv = container_of(drv, struct pcmcia_driver, drv);
106 #ifdef CONFIG_PROC_FS
107 static struct proc_dir_entry *proc_pccard = NULL;
109 static int proc_read_drivers_callback(struct device_driver *driver, void *d)
112 struct pcmcia_driver *p_drv = container_of(driver,
113 struct pcmcia_driver, drv);
115 *p += sprintf(*p, "%-24.24s 1 %d\n", p_drv->drv.name,
116 #ifdef CONFIG_MODULE_UNLOAD
117 (p_drv->owner) ? module_refcount(p_drv->owner) : 1
127 static int proc_read_drivers(char *buf, char **start, off_t pos,
128 int count, int *eof, void *data)
133 rc = bus_for_each_drv(&pcmcia_bus_type, NULL,
134 (void *) &p, proc_read_drivers_callback);
143 #ifdef CONFIG_PCMCIA_PROBE
145 static int adjust_irq(struct pcmcia_socket *s, adjust_t *adj)
150 irq = adj->resource.irq.IRQ;
151 if ((irq < 0) || (irq > 15))
154 if (adj->Action != REMOVE_MANAGED_RESOURCE)
159 if (!(s->irq_mask & mask))
162 s->irq_mask &= ~mask;
169 static inline int adjust_irq(struct pcmcia_socket *s, adjust_t *adj) {
175 static int pcmcia_adjust_resource_info(adjust_t *adj)
177 struct pcmcia_socket *s;
178 int ret = CS_UNSUPPORTED_FUNCTION;
181 down_read(&pcmcia_socket_list_rwsem);
182 list_for_each_entry(s, &pcmcia_socket_list, socket_list) {
184 if (adj->Resource == RES_IRQ)
185 ret = adjust_irq(s, adj);
187 else if (s->resource_ops->add_io) {
188 unsigned long begin, end;
190 /* you can't use the old interface if the new
191 * one was used before */
192 spin_lock_irqsave(&s->lock, flags);
193 if ((s->resource_setup_new) &&
194 !(s->resource_setup_old)) {
195 spin_unlock_irqrestore(&s->lock, flags);
197 } else if (!(s->resource_setup_old))
198 s->resource_setup_old = 1;
199 spin_unlock_irqrestore(&s->lock, flags);
201 switch (adj->Resource) {
202 case RES_MEMORY_RANGE:
203 begin = adj->resource.memory.Base;
204 end = adj->resource.memory.Base + adj->resource.memory.Size - 1;
205 if (s->resource_ops->add_mem)
206 ret =s->resource_ops->add_mem(s, adj->Action, begin, end);
208 begin = adj->resource.io.BasePort;
209 end = adj->resource.io.BasePort + adj->resource.io.NumPorts - 1;
210 if (s->resource_ops->add_io)
211 ret = s->resource_ops->add_io(s, adj->Action, begin, end);
214 /* as there's no way we know this is the
215 * last call to adjust_resource_info, we
216 * always need to assume this is the latest
218 spin_lock_irqsave(&s->lock, flags);
219 s->resource_setup_done = 1;
220 spin_unlock_irqrestore(&s->lock, flags);
224 up_read(&pcmcia_socket_list_rwsem);
229 /** pccard_get_status
231 * Get the current socket state bits. We don't support the latched
232 * SocketState yet: I haven't seen any point for it.
235 static int pccard_get_status(struct pcmcia_socket *s,
236 struct pcmcia_device *p_dev,
242 s->ops->get_status(s, &val);
243 status->CardState = status->SocketState = 0;
244 status->CardState |= (val & SS_DETECT) ? CS_EVENT_CARD_DETECT : 0;
245 status->CardState |= (val & SS_CARDBUS) ? CS_EVENT_CB_DETECT : 0;
246 status->CardState |= (val & SS_3VCARD) ? CS_EVENT_3VCARD : 0;
247 status->CardState |= (val & SS_XVCARD) ? CS_EVENT_XVCARD : 0;
248 if (s->state & SOCKET_SUSPEND)
249 status->CardState |= CS_EVENT_PM_SUSPEND;
250 if (!(s->state & SOCKET_PRESENT))
253 c = (p_dev) ? p_dev->function_config : NULL;
255 if ((c != NULL) && (c->state & CONFIG_LOCKED) &&
256 (c->IntType & (INT_MEMORY_AND_IO | INT_ZOOMED_VIDEO))) {
258 if (c->CardValues & PRESENT_PIN_REPLACE) {
259 pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, ®);
261 (reg & PRR_WP_STATUS) ? CS_EVENT_WRITE_PROTECT : 0;
263 (reg & PRR_READY_STATUS) ? CS_EVENT_READY_CHANGE : 0;
265 (reg & PRR_BVD2_STATUS) ? CS_EVENT_BATTERY_LOW : 0;
267 (reg & PRR_BVD1_STATUS) ? CS_EVENT_BATTERY_DEAD : 0;
269 /* No PRR? Then assume we're always ready */
270 status->CardState |= CS_EVENT_READY_CHANGE;
272 if (c->CardValues & PRESENT_EXT_STATUS) {
273 pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_ESR)>>1, 1, ®);
275 (reg & ESR_REQ_ATTN) ? CS_EVENT_REQUEST_ATTENTION : 0;
280 (val & SS_WRPROT) ? CS_EVENT_WRITE_PROTECT : 0;
282 (val & SS_BATDEAD) ? CS_EVENT_BATTERY_DEAD : 0;
284 (val & SS_BATWARN) ? CS_EVENT_BATTERY_LOW : 0;
286 (val & SS_READY) ? CS_EVENT_READY_CHANGE : 0;
288 } /* pccard_get_status */
290 /*======================================================================
292 These manage a ring buffer of events pending for one user process
294 ======================================================================*/
297 static int queue_empty(user_info_t *user)
299 return (user->event_head == user->event_tail);
302 static event_t get_queued_event(user_info_t *user)
304 user->event_tail = (user->event_tail+1) % MAX_EVENTS;
305 return user->event[user->event_tail];
308 static void queue_event(user_info_t *user, event_t event)
310 user->event_head = (user->event_head+1) % MAX_EVENTS;
311 if (user->event_head == user->event_tail)
312 user->event_tail = (user->event_tail+1) % MAX_EVENTS;
313 user->event[user->event_head] = event;
316 void handle_event(struct pcmcia_socket *s, event_t event)
319 for (user = s->user; user; user = user->next)
320 queue_event(user, event);
321 wake_up_interruptible(&s->queue);
325 /*======================================================================
327 bind_request() and bind_device() are merged by now. Register_client()
328 is called right at the end of bind_request(), during the driver's
329 ->attach() call. Individual descriptions:
331 bind_request() connects a socket to a particular client driver.
332 It looks up the specified device ID in the list of registered
333 drivers, binds it to the socket, and tries to create an instance
334 of the device. unbind_request() deletes a driver instance.
336 Bind_device() associates a device driver with a particular socket.
337 It is normally called by Driver Services after it has identified
338 a newly inserted card. An instance of that driver will then be
339 eligible to register as a client of this socket.
341 Register_client() uses the dev_info_t handle to match the
342 caller with a socket. The driver must have already been bound
343 to a socket with bind_device() -- in fact, bind_device()
344 allocates the client structure that will be used.
346 ======================================================================*/
348 static int bind_request(struct pcmcia_socket *s, bind_info_t *bind_info)
350 struct pcmcia_driver *p_drv;
351 struct pcmcia_device *p_dev;
355 s = pcmcia_get_socket(s);
359 ds_dbg(2, "bind_request(%d, '%s')\n", s->sock,
360 (char *)bind_info->dev_info);
362 p_drv = get_pcmcia_driver(&bind_info->dev_info);
368 if (!try_module_get(p_drv->owner)) {
373 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
374 list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
375 if (p_dev->func == bind_info->function) {
376 if ((p_dev->dev.driver == &p_drv->drv)) {
377 if (p_dev->cardmgr) {
378 /* if there's already a device
379 * registered, and it was registered
380 * by userspace before, we need to
381 * return the "instance". */
382 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
383 bind_info->instance = p_dev;
387 /* the correct driver managed to bind
388 * itself magically to the correct
390 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
391 p_dev->cardmgr = p_drv;
395 } else if (!p_dev->dev.driver) {
396 /* there's already a device available where
397 * no device has been bound to yet. So we don't
398 * need to register a device! */
399 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
404 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
406 p_dev = pcmcia_device_add(s, bind_info->function);
413 p_dev->cardmgr = p_drv;
415 /* if a driver is already running, we can abort */
416 if (p_dev->dev.driver)
420 * Prevent this racing with a card insertion.
422 mutex_lock(&s->skt_mutex);
423 ret = bus_rescan_devices(&pcmcia_bus_type);
424 mutex_unlock(&s->skt_mutex);
428 /* check whether the driver indeed matched. I don't care if this
429 * is racy or not, because it can only happen on cardmgr access
432 if (!(p_dev->dev.driver == &p_drv->drv))
433 p_dev->cardmgr = NULL;
436 module_put(p_drv->owner);
438 put_driver(&p_drv->drv);
440 pcmcia_put_socket(s);
445 #ifdef CONFIG_CARDBUS
447 static struct pci_bus *pcmcia_lookup_bus(struct pcmcia_socket *s)
449 if (!s || !(s->state & SOCKET_CARDBUS))
452 return s->cb_dev->subordinate;
456 static int get_device_info(struct pcmcia_socket *s, bind_info_t *bind_info, int first)
459 struct pcmcia_device *p_dev;
460 struct pcmcia_driver *p_drv;
464 #ifdef CONFIG_CARDBUS
466 * Some unbelievably ugly code to associate the PCI cardbus
467 * device and its driver with the PCMCIA "bind" information.
472 bus = pcmcia_lookup_bus(s);
474 struct list_head *list;
475 struct pci_dev *dev = NULL;
477 list = bus->devices.next;
478 while (list != &bus->devices) {
479 struct pci_dev *pdev = pci_dev_b(list);
487 /* Try to handle "next" here some way? */
489 if (dev && dev->driver) {
490 strlcpy(bind_info->name, dev->driver->name, DEV_NAME_LEN);
491 bind_info->major = 0;
492 bind_info->minor = 0;
493 bind_info->next = NULL;
500 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
501 list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
502 if (p_dev->func == bind_info->function) {
503 p_dev = pcmcia_get_dev(p_dev);
509 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
513 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
515 p_drv = to_pcmcia_drv(p_dev->dev.driver);
516 if (p_drv && !p_dev->_locked) {
522 node = p_dev->dev_node;
524 for (node = p_dev->dev_node; node; node = node->next)
525 if (node == bind_info->next)
532 strlcpy(bind_info->name, node->dev_name, DEV_NAME_LEN);
533 bind_info->major = node->major;
534 bind_info->minor = node->minor;
535 bind_info->next = node->next;
538 pcmcia_put_dev(p_dev);
540 } /* get_device_info */
543 static int ds_open(struct inode *inode, struct file *file)
545 socket_t i = iminor(inode);
546 struct pcmcia_socket *s;
548 static int warning_printed = 0;
551 ds_dbg(0, "ds_open(socket %d)\n", i);
554 s = pcmcia_get_socket_by_nr(i);
559 s = pcmcia_get_socket(s);
565 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
566 if (s->pcmcia_state.busy) {
567 pcmcia_put_socket(s);
572 s->pcmcia_state.busy = 1;
575 user = kmalloc(sizeof(user_info_t), GFP_KERNEL);
577 pcmcia_put_socket(s);
581 user->event_tail = user->event_head = 0;
582 user->next = s->user;
583 user->user_magic = USER_MAGIC;
586 file->private_data = user;
588 if (!warning_printed) {
589 printk(KERN_INFO "pcmcia: Detected deprecated PCMCIA ioctl "
590 "usage from process: %s.\n", current->comm);
591 printk(KERN_INFO "pcmcia: This interface will soon be removed from "
592 "the kernel; please expect breakage unless you upgrade "
594 printk(KERN_INFO "pcmcia: see http://www.kernel.org/pub/linux/"
595 "utils/kernel/pcmcia/pcmcia.html for details.\n");
599 if (s->pcmcia_state.present)
600 queue_event(user, CS_EVENT_CARD_INSERTION);
606 /*====================================================================*/
608 static int ds_release(struct inode *inode, struct file *file)
610 struct pcmcia_socket *s;
611 user_info_t *user, **link;
613 ds_dbg(0, "ds_release(socket %d)\n", iminor(inode));
615 user = file->private_data;
616 if (CHECK_USER(user))
621 /* Unlink user data structure */
622 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
623 s->pcmcia_state.busy = 0;
625 file->private_data = NULL;
626 for (link = &s->user; *link; link = &(*link)->next)
627 if (*link == user) break;
631 user->user_magic = 0;
633 pcmcia_put_socket(s);
638 /*====================================================================*/
640 static ssize_t ds_read(struct file *file, char __user *buf,
641 size_t count, loff_t *ppos)
643 struct pcmcia_socket *s;
647 ds_dbg(2, "ds_read(socket %d)\n", iminor(file->f_path.dentry->d_inode));
652 user = file->private_data;
653 if (CHECK_USER(user))
657 if (s->pcmcia_state.dead)
660 ret = wait_event_interruptible(s->queue, !queue_empty(user));
662 ret = put_user(get_queued_event(user), (int __user *)buf) ? -EFAULT : 4;
667 /*====================================================================*/
669 static ssize_t ds_write(struct file *file, const char __user *buf,
670 size_t count, loff_t *ppos)
672 ds_dbg(2, "ds_write(socket %d)\n", iminor(file->f_path.dentry->d_inode));
676 if ((file->f_flags & O_ACCMODE) == O_RDONLY)
682 /*====================================================================*/
684 /* No kernel lock - fine */
685 static u_int ds_poll(struct file *file, poll_table *wait)
687 struct pcmcia_socket *s;
690 ds_dbg(2, "ds_poll(socket %d)\n", iminor(file->f_path.dentry->d_inode));
692 user = file->private_data;
693 if (CHECK_USER(user))
697 * We don't check for a dead socket here since that
698 * will send cardmgr into an endless spin.
700 poll_wait(file, &s->queue, wait);
701 if (!queue_empty(user))
702 return POLLIN | POLLRDNORM;
706 /*====================================================================*/
708 static int ds_ioctl(struct inode * inode, struct file * file,
709 u_int cmd, u_long arg)
711 struct pcmcia_socket *s;
712 void __user *uarg = (char __user *)arg;
718 ds_dbg(2, "ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
720 user = file->private_data;
721 if (CHECK_USER(user))
725 if (s->pcmcia_state.dead)
728 size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT;
729 if (size > sizeof(ds_ioctl_arg_t)) return -EINVAL;
731 /* Permission check */
732 if (!(cmd & IOC_OUT) && !capable(CAP_SYS_ADMIN))
736 if (!access_ok(VERIFY_READ, uarg, size)) {
737 ds_dbg(3, "ds_ioctl(): verify_read = %d\n", -EFAULT);
742 if (!access_ok(VERIFY_WRITE, uarg, size)) {
743 ds_dbg(3, "ds_ioctl(): verify_write = %d\n", -EFAULT);
747 buf = kmalloc(sizeof(ds_ioctl_arg_t), GFP_KERNEL);
754 if (__copy_from_user((char *)buf, uarg, size)) {
761 case DS_ADJUST_RESOURCE_INFO:
762 ret = pcmcia_adjust_resource_info(&buf->adjust);
764 case DS_GET_CONFIGURATION_INFO:
765 if (buf->config.Function &&
766 (buf->config.Function >= s->functions))
769 struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->config.Function);
770 ret = pccard_get_configuration_info(s, p_dev, &buf->config);
771 pcmcia_put_dev(p_dev);
774 case DS_GET_FIRST_TUPLE:
775 mutex_lock(&s->skt_mutex);
776 pcmcia_validate_mem(s);
777 mutex_unlock(&s->skt_mutex);
778 ret = pccard_get_first_tuple(s, BIND_FN_ALL, &buf->tuple);
780 case DS_GET_NEXT_TUPLE:
781 ret = pccard_get_next_tuple(s, BIND_FN_ALL, &buf->tuple);
783 case DS_GET_TUPLE_DATA:
784 buf->tuple.TupleData = buf->tuple_parse.data;
785 buf->tuple.TupleDataMax = sizeof(buf->tuple_parse.data);
786 ret = pccard_get_tuple_data(s, &buf->tuple);
789 buf->tuple.TupleData = buf->tuple_parse.data;
790 ret = pccard_parse_tuple(&buf->tuple, &buf->tuple_parse.parse);
793 ret = pccard_reset_card(s);
796 if (buf->status.Function &&
797 (buf->status.Function >= s->functions))
800 struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->status.Function);
801 ret = pccard_get_status(s, p_dev, &buf->status);
802 pcmcia_put_dev(p_dev);
805 case DS_VALIDATE_CIS:
806 mutex_lock(&s->skt_mutex);
807 pcmcia_validate_mem(s);
808 mutex_unlock(&s->skt_mutex);
809 ret = pccard_validate_cis(s, BIND_FN_ALL, &buf->cisinfo.Chains);
811 case DS_SUSPEND_CARD:
812 ret = pcmcia_suspend_card(s);
815 ret = pcmcia_resume_card(s);
818 err = pcmcia_eject_card(s);
821 err = pcmcia_insert_card(s);
823 case DS_ACCESS_CONFIGURATION_REGISTER:
824 if ((buf->conf_reg.Action == CS_WRITE) && !capable(CAP_SYS_ADMIN)) {
831 if (!(buf->conf_reg.Function &&
832 (buf->conf_reg.Function >= s->functions))) {
833 struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->conf_reg.Function);
835 ret = pcmcia_access_configuration_register(p_dev, &buf->conf_reg);
836 pcmcia_put_dev(p_dev);
840 case DS_GET_FIRST_REGION:
841 case DS_GET_NEXT_REGION:
843 if (!capable(CAP_SYS_ADMIN)) {
847 static int printed = 0;
849 printk(KERN_WARNING "2.6. kernels use pcmciamtd instead of memory_cs.c and do not require special\n");
850 printk(KERN_WARNING "MTD handling any more.\n");
857 case DS_GET_FIRST_WINDOW:
858 ret = pcmcia_get_window(s, &buf->win_info.handle, 0,
859 &buf->win_info.window);
861 case DS_GET_NEXT_WINDOW:
862 ret = pcmcia_get_window(s, &buf->win_info.handle,
863 buf->win_info.handle->index + 1, &buf->win_info.window);
865 case DS_GET_MEM_PAGE:
866 ret = pcmcia_get_mem_page(buf->win_info.handle,
870 ret = pcmcia_replace_cis(s, &buf->cisdump);
872 case DS_BIND_REQUEST:
873 if (!capable(CAP_SYS_ADMIN)) {
877 err = bind_request(s, &buf->bind_info);
879 case DS_GET_DEVICE_INFO:
880 err = get_device_info(s, &buf->bind_info, 1);
882 case DS_GET_NEXT_DEVICE:
883 err = get_device_info(s, &buf->bind_info, 0);
885 case DS_UNBIND_REQUEST:
892 if ((err == 0) && (ret != CS_SUCCESS)) {
893 ds_dbg(2, "ds_ioctl: ret = %d\n", ret);
895 case CS_BAD_SOCKET: case CS_NO_CARD:
896 err = -ENODEV; break;
897 case CS_BAD_ARGS: case CS_BAD_ATTRIBUTE: case CS_BAD_IRQ:
899 err = -EINVAL; break;
902 case CS_OUT_OF_RESOURCE:
903 err = -ENOSPC; break;
904 case CS_NO_MORE_ITEMS:
905 err = -ENODATA; break;
906 case CS_UNSUPPORTED_FUNCTION:
907 err = -ENOSYS; break;
914 if (__copy_to_user(uarg, (char *)buf, size))
923 /*====================================================================*/
925 static const struct file_operations ds_fops = {
926 .owner = THIS_MODULE,
928 .release = ds_release,
935 void __init pcmcia_setup_ioctl(void) {
938 /* Set up character device for user mode clients */
939 i = register_chrdev(0, "pcmcia", &ds_fops);
941 printk(KERN_NOTICE "unable to find a free device # for "
942 "Driver Services (error=%d)\n", i);
946 #ifdef CONFIG_PROC_FS
947 proc_pccard = proc_mkdir("bus/pccard", NULL);
949 create_proc_read_entry("drivers",0,proc_pccard,proc_read_drivers,NULL);
954 void __exit pcmcia_cleanup_ioctl(void) {
955 #ifdef CONFIG_PROC_FS
957 remove_proc_entry("drivers", proc_pccard);
958 remove_proc_entry("bus/pccard", NULL);
962 unregister_chrdev(major_dev, "pcmcia");