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/config.h>
22 #include <linux/kernel.h>
23 #include <linux/module.h>
24 #include <linux/init.h>
25 #include <linux/major.h>
26 #include <linux/errno.h>
27 #include <linux/ioctl.h>
28 #include <linux/proc_fs.h>
29 #include <linux/poll.h>
30 #include <linux/pci.h>
31 #include <linux/workqueue.h>
33 #define IN_CARD_SERVICES
34 #include <pcmcia/version.h>
35 #include <pcmcia/cs_types.h>
36 #include <pcmcia/cs.h>
37 #include <pcmcia/cistpl.h>
38 #include <pcmcia/ds.h>
39 #include <pcmcia/ss.h>
41 #include "cs_internal.h"
42 #include "ds_internal.h"
44 static int major_dev = -1;
47 /* Device user information */
49 #define USER_MAGIC 0x7ea4
50 #define CHECK_USER(u) \
51 (((u) == NULL) || ((u)->user_magic != USER_MAGIC))
53 typedef struct user_info_t {
55 int event_head, event_tail;
56 event_t event[MAX_EVENTS];
57 struct user_info_t *next;
58 struct pcmcia_socket *socket;
63 extern int ds_pc_debug;
64 #define cs_socket_name(skt) ((skt)->dev.class_id)
66 #define ds_dbg(lvl, fmt, arg...) do { \
67 if (ds_pc_debug >= lvl) \
68 printk(KERN_DEBUG "ds: " fmt , ## arg); \
71 #define ds_dbg(lvl, fmt, arg...) do { } while (0)
74 static const char *release = "Linux Kernel Card Services";
76 /** pcmcia_get_card_services_info
78 * Return information about this version of Card Services
80 static int pcmcia_get_card_services_info(servinfo_t *info)
82 unsigned int socket_count = 0;
83 struct list_head *tmp;
84 info->Signature[0] = 'C';
85 info->Signature[1] = 'S';
86 down_read(&pcmcia_socket_list_rwsem);
87 list_for_each(tmp, &pcmcia_socket_list)
89 up_read(&pcmcia_socket_list_rwsem);
90 info->Count = socket_count;
91 info->Revision = CS_RELEASE_CODE;
92 info->CSLevel = 0x0210;
93 info->VendorString = (char *)release;
95 } /* get_card_services_info */
98 /* backwards-compatible accessing of driver --- by name! */
100 static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info)
102 struct device_driver *drv;
103 struct pcmcia_driver *p_drv;
105 drv = driver_find((char *) dev_info, &pcmcia_bus_type);
109 p_drv = container_of(drv, struct pcmcia_driver, drv);
115 #ifdef CONFIG_PROC_FS
116 static struct proc_dir_entry *proc_pccard = NULL;
118 static int proc_read_drivers_callback(struct device_driver *driver, void *d)
121 struct pcmcia_driver *p_drv = container_of(driver,
122 struct pcmcia_driver, drv);
124 *p += sprintf(*p, "%-24.24s 1 %d\n", p_drv->drv.name,
125 #ifdef CONFIG_MODULE_UNLOAD
126 (p_drv->owner) ? module_refcount(p_drv->owner) : 1
136 static int proc_read_drivers(char *buf, char **start, off_t pos,
137 int count, int *eof, void *data)
141 bus_for_each_drv(&pcmcia_bus_type, NULL,
142 (void *) &p, proc_read_drivers_callback);
148 /*======================================================================
150 These manage a ring buffer of events pending for one user process
152 ======================================================================*/
155 static int queue_empty(user_info_t *user)
157 return (user->event_head == user->event_tail);
160 static event_t get_queued_event(user_info_t *user)
162 user->event_tail = (user->event_tail+1) % MAX_EVENTS;
163 return user->event[user->event_tail];
166 static void queue_event(user_info_t *user, event_t event)
168 user->event_head = (user->event_head+1) % MAX_EVENTS;
169 if (user->event_head == user->event_tail)
170 user->event_tail = (user->event_tail+1) % MAX_EVENTS;
171 user->event[user->event_head] = event;
174 void handle_event(struct pcmcia_socket *s, event_t event)
177 for (user = s->user; user; user = user->next)
178 queue_event(user, event);
179 wake_up_interruptible(&s->queue);
183 /*======================================================================
185 bind_request() and bind_device() are merged by now. Register_client()
186 is called right at the end of bind_request(), during the driver's
187 ->attach() call. Individual descriptions:
189 bind_request() connects a socket to a particular client driver.
190 It looks up the specified device ID in the list of registered
191 drivers, binds it to the socket, and tries to create an instance
192 of the device. unbind_request() deletes a driver instance.
194 Bind_device() associates a device driver with a particular socket.
195 It is normally called by Driver Services after it has identified
196 a newly inserted card. An instance of that driver will then be
197 eligible to register as a client of this socket.
199 Register_client() uses the dev_info_t handle to match the
200 caller with a socket. The driver must have already been bound
201 to a socket with bind_device() -- in fact, bind_device()
202 allocates the client structure that will be used.
204 ======================================================================*/
206 static int bind_request(struct pcmcia_socket *s, bind_info_t *bind_info)
208 struct pcmcia_driver *p_drv;
209 struct pcmcia_device *p_dev;
213 s = pcmcia_get_socket(s);
217 ds_dbg(2, "bind_request(%d, '%s')\n", s->sock,
218 (char *)bind_info->dev_info);
220 p_drv = get_pcmcia_driver(&bind_info->dev_info);
226 if (!try_module_get(p_drv->owner)) {
231 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
232 list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
233 if (p_dev->func == bind_info->function) {
234 if ((p_dev->dev.driver == &p_drv->drv)) {
235 if (p_dev->cardmgr) {
236 /* if there's already a device
237 * registered, and it was registered
238 * by userspace before, we need to
239 * return the "instance". */
240 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
241 bind_info->instance = p_dev->instance;
245 /* the correct driver managed to bind
246 * itself magically to the correct
248 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
249 p_dev->cardmgr = p_drv;
253 } else if (!p_dev->dev.driver) {
254 /* there's already a device available where
255 * no device has been bound to yet. So we don't
256 * need to register a device! */
257 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
262 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
264 p_dev = pcmcia_device_add(s, bind_info->function);
271 p_dev->cardmgr = p_drv;
273 /* if a driver is already running, we can abort */
274 if (p_dev->dev.driver)
278 * Prevent this racing with a card insertion.
281 bus_rescan_devices(&pcmcia_bus_type);
284 /* check whether the driver indeed matched. I don't care if this
285 * is racy or not, because it can only happen on cardmgr access
288 if (!(p_dev->dev.driver == &p_drv->drv))
289 p_dev->cardmgr = NULL;
292 module_put(p_drv->owner);
294 put_driver(&p_drv->drv);
296 pcmcia_put_socket(s);
301 #ifdef CONFIG_CARDBUS
303 static struct pci_bus *pcmcia_lookup_bus(struct pcmcia_socket *s)
305 if (!s || !(s->state & SOCKET_CARDBUS))
308 return s->cb_dev->subordinate;
312 static int get_device_info(struct pcmcia_socket *s, bind_info_t *bind_info, int first)
315 struct pcmcia_device *p_dev;
319 #ifdef CONFIG_CARDBUS
321 * Some unbelievably ugly code to associate the PCI cardbus
322 * device and its driver with the PCMCIA "bind" information.
327 bus = pcmcia_lookup_bus(s);
329 struct list_head *list;
330 struct pci_dev *dev = NULL;
332 list = bus->devices.next;
333 while (list != &bus->devices) {
334 struct pci_dev *pdev = pci_dev_b(list);
342 /* Try to handle "next" here some way? */
344 if (dev && dev->driver) {
345 strlcpy(bind_info->name, dev->driver->name, DEV_NAME_LEN);
346 bind_info->major = 0;
347 bind_info->minor = 0;
348 bind_info->next = NULL;
355 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
356 list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
357 if (p_dev->func == bind_info->function) {
358 p_dev = pcmcia_get_dev(p_dev);
364 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
368 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
370 if ((!p_dev->instance) ||
371 (p_dev->instance->state & DEV_CONFIG_PENDING)) {
377 node = p_dev->instance->dev;
379 for (node = p_dev->instance->dev; node; node = node->next)
380 if (node == bind_info->next)
387 strlcpy(bind_info->name, node->dev_name, DEV_NAME_LEN);
388 bind_info->major = node->major;
389 bind_info->minor = node->minor;
390 bind_info->next = node->next;
393 pcmcia_put_dev(p_dev);
395 } /* get_device_info */
398 static int ds_open(struct inode *inode, struct file *file)
400 socket_t i = iminor(inode);
401 struct pcmcia_socket *s;
404 ds_dbg(0, "ds_open(socket %d)\n", i);
406 s = pcmcia_get_socket_by_nr(i);
409 s = pcmcia_get_socket(s);
413 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
414 if (s->pcmcia_state.busy) {
415 pcmcia_put_socket(s);
419 s->pcmcia_state.busy = 1;
422 user = kmalloc(sizeof(user_info_t), GFP_KERNEL);
424 pcmcia_put_socket(s);
427 user->event_tail = user->event_head = 0;
428 user->next = s->user;
429 user->user_magic = USER_MAGIC;
432 file->private_data = user;
434 if (s->pcmcia_state.present)
435 queue_event(user, CS_EVENT_CARD_INSERTION);
439 /*====================================================================*/
441 static int ds_release(struct inode *inode, struct file *file)
443 struct pcmcia_socket *s;
444 user_info_t *user, **link;
446 ds_dbg(0, "ds_release(socket %d)\n", iminor(inode));
448 user = file->private_data;
449 if (CHECK_USER(user))
454 /* Unlink user data structure */
455 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
456 s->pcmcia_state.busy = 0;
458 file->private_data = NULL;
459 for (link = &s->user; *link; link = &(*link)->next)
460 if (*link == user) break;
464 user->user_magic = 0;
466 pcmcia_put_socket(s);
471 /*====================================================================*/
473 static ssize_t ds_read(struct file *file, char __user *buf,
474 size_t count, loff_t *ppos)
476 struct pcmcia_socket *s;
480 ds_dbg(2, "ds_read(socket %d)\n", iminor(file->f_dentry->d_inode));
485 user = file->private_data;
486 if (CHECK_USER(user))
490 if (s->pcmcia_state.dead)
493 ret = wait_event_interruptible(s->queue, !queue_empty(user));
495 ret = put_user(get_queued_event(user), (int __user *)buf) ? -EFAULT : 4;
500 /*====================================================================*/
502 static ssize_t ds_write(struct file *file, const char __user *buf,
503 size_t count, loff_t *ppos)
505 ds_dbg(2, "ds_write(socket %d)\n", iminor(file->f_dentry->d_inode));
509 if ((file->f_flags & O_ACCMODE) == O_RDONLY)
515 /*====================================================================*/
517 /* No kernel lock - fine */
518 static u_int ds_poll(struct file *file, poll_table *wait)
520 struct pcmcia_socket *s;
523 ds_dbg(2, "ds_poll(socket %d)\n", iminor(file->f_dentry->d_inode));
525 user = file->private_data;
526 if (CHECK_USER(user))
530 * We don't check for a dead socket here since that
531 * will send cardmgr into an endless spin.
533 poll_wait(file, &s->queue, wait);
534 if (!queue_empty(user))
535 return POLLIN | POLLRDNORM;
539 /*====================================================================*/
541 extern int pcmcia_adjust_resource_info(adjust_t *adj);
543 static int ds_ioctl(struct inode * inode, struct file * file,
544 u_int cmd, u_long arg)
546 struct pcmcia_socket *s;
547 void __user *uarg = (char __user *)arg;
553 ds_dbg(2, "ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
555 user = file->private_data;
556 if (CHECK_USER(user))
560 if (s->pcmcia_state.dead)
563 size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT;
564 if (size > sizeof(ds_ioctl_arg_t)) return -EINVAL;
566 /* Permission check */
567 if (!(cmd & IOC_OUT) && !capable(CAP_SYS_ADMIN))
571 if (!access_ok(VERIFY_READ, uarg, size)) {
572 ds_dbg(3, "ds_ioctl(): verify_read = %d\n", -EFAULT);
577 if (!access_ok(VERIFY_WRITE, uarg, size)) {
578 ds_dbg(3, "ds_ioctl(): verify_write = %d\n", -EFAULT);
582 buf = kmalloc(sizeof(ds_ioctl_arg_t), GFP_KERNEL);
588 if (cmd & IOC_IN) __copy_from_user((char *)buf, uarg, size);
591 case DS_ADJUST_RESOURCE_INFO:
592 ret = pcmcia_adjust_resource_info(&buf->adjust);
594 case DS_GET_CARD_SERVICES_INFO:
595 ret = pcmcia_get_card_services_info(&buf->servinfo);
597 case DS_GET_CONFIGURATION_INFO:
598 if (buf->config.Function &&
599 (buf->config.Function >= s->functions))
602 ret = pccard_get_configuration_info(s,
603 buf->config.Function, &buf->config);
605 case DS_GET_FIRST_TUPLE:
607 pcmcia_validate_mem(s);
609 ret = pccard_get_first_tuple(s, BIND_FN_ALL, &buf->tuple);
611 case DS_GET_NEXT_TUPLE:
612 ret = pccard_get_next_tuple(s, BIND_FN_ALL, &buf->tuple);
614 case DS_GET_TUPLE_DATA:
615 buf->tuple.TupleData = buf->tuple_parse.data;
616 buf->tuple.TupleDataMax = sizeof(buf->tuple_parse.data);
617 ret = pccard_get_tuple_data(s, &buf->tuple);
620 buf->tuple.TupleData = buf->tuple_parse.data;
621 ret = pccard_parse_tuple(&buf->tuple, &buf->tuple_parse.parse);
624 ret = pccard_reset_card(s);
627 if (buf->status.Function &&
628 (buf->status.Function >= s->functions))
631 ret = pccard_get_status(s, buf->status.Function, &buf->status);
633 case DS_VALIDATE_CIS:
635 pcmcia_validate_mem(s);
637 ret = pccard_validate_cis(s, BIND_FN_ALL, &buf->cisinfo);
639 case DS_SUSPEND_CARD:
640 ret = pcmcia_suspend_card(s);
643 ret = pcmcia_resume_card(s);
646 err = pcmcia_eject_card(s);
649 err = pcmcia_insert_card(s);
651 case DS_ACCESS_CONFIGURATION_REGISTER:
652 if ((buf->conf_reg.Action == CS_WRITE) && !capable(CAP_SYS_ADMIN)) {
656 if (buf->conf_reg.Function &&
657 (buf->conf_reg.Function >= s->functions))
660 ret = pccard_access_configuration_register(s,
661 buf->conf_reg.Function, &buf->conf_reg);
663 case DS_GET_FIRST_REGION:
664 case DS_GET_NEXT_REGION:
666 if (!capable(CAP_SYS_ADMIN)) {
670 static int printed = 0;
672 printk(KERN_WARNING "2.6. kernels use pcmciamtd instead of memory_cs.c and do not require special\n");
673 printk(KERN_WARNING "MTD handling any more.\n");
680 case DS_GET_FIRST_WINDOW:
681 ret = pcmcia_get_window(s, &buf->win_info.handle, 0,
682 &buf->win_info.window);
684 case DS_GET_NEXT_WINDOW:
685 ret = pcmcia_get_window(s, &buf->win_info.handle,
686 buf->win_info.handle->index + 1, &buf->win_info.window);
688 case DS_GET_MEM_PAGE:
689 ret = pcmcia_get_mem_page(buf->win_info.handle,
693 ret = pcmcia_replace_cis(s, &buf->cisdump);
695 case DS_BIND_REQUEST:
696 if (!capable(CAP_SYS_ADMIN)) {
700 err = bind_request(s, &buf->bind_info);
702 case DS_GET_DEVICE_INFO:
703 err = get_device_info(s, &buf->bind_info, 1);
705 case DS_GET_NEXT_DEVICE:
706 err = get_device_info(s, &buf->bind_info, 0);
708 case DS_UNBIND_REQUEST:
715 if ((err == 0) && (ret != CS_SUCCESS)) {
716 ds_dbg(2, "ds_ioctl: ret = %d\n", ret);
718 case CS_BAD_SOCKET: case CS_NO_CARD:
719 err = -ENODEV; break;
720 case CS_BAD_ARGS: case CS_BAD_ATTRIBUTE: case CS_BAD_IRQ:
722 err = -EINVAL; break;
725 case CS_OUT_OF_RESOURCE:
726 err = -ENOSPC; break;
727 case CS_NO_MORE_ITEMS:
728 err = -ENODATA; break;
729 case CS_UNSUPPORTED_FUNCTION:
730 err = -ENOSYS; break;
737 if (__copy_to_user(uarg, (char *)buf, size))
746 /*====================================================================*/
748 static struct file_operations ds_fops = {
749 .owner = THIS_MODULE,
751 .release = ds_release,
758 void __init pcmcia_setup_ioctl(void) {
761 /* Set up character device for user mode clients */
762 i = register_chrdev(0, "pcmcia", &ds_fops);
764 printk(KERN_NOTICE "unable to find a free device # for "
765 "Driver Services (error=%d)\n", i);
769 #ifdef CONFIG_PROC_FS
770 proc_pccard = proc_mkdir("pccard", proc_bus);
772 create_proc_read_entry("drivers",0,proc_pccard,proc_read_drivers,NULL);
777 void __exit pcmcia_cleanup_ioctl(void) {
778 #ifdef CONFIG_PROC_FS
780 remove_proc_entry("drivers", proc_pccard);
781 remove_proc_entry("pccard", proc_bus);
785 unregister_chrdev(major_dev, "pcmcia");