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/seq_file.h>
31 #include <linux/smp_lock.h>
32 #include <linux/workqueue.h>
34 #include <pcmcia/cs_types.h>
35 #include <pcmcia/cs.h>
36 #include <pcmcia/cistpl.h>
37 #include <pcmcia/cisreg.h>
38 #include <pcmcia/ds.h>
39 #include <pcmcia/ss.h>
41 #include "cs_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
;
61 #ifdef CONFIG_PCMCIA_DEBUG
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 *_m
)
111 struct seq_file
*m
= _m
;
112 struct pcmcia_driver
*p_drv
= container_of(driver
,
113 struct pcmcia_driver
, drv
);
115 seq_printf(m
, "%-24.24s 1 %d\n", p_drv
->drv
.name
,
116 #ifdef CONFIG_MODULE_UNLOAD
117 (p_drv
->owner
) ? module_refcount(p_drv
->owner
) : 1
125 static int pccard_drivers_proc_show(struct seq_file
*m
, void *v
)
127 return bus_for_each_drv(&pcmcia_bus_type
, NULL
,
128 m
, proc_read_drivers_callback
);
131 static int pccard_drivers_proc_open(struct inode
*inode
, struct file
*file
)
133 return single_open(file
, pccard_drivers_proc_show
, NULL
);
136 static const struct file_operations pccard_drivers_proc_fops
= {
137 .owner
= THIS_MODULE
,
138 .open
= pccard_drivers_proc_open
,
141 .release
= single_release
,
146 #ifdef CONFIG_PCMCIA_PROBE
148 static int adjust_irq(struct pcmcia_socket
*s
, adjust_t
*adj
)
153 irq
= adj
->resource
.irq
.IRQ
;
154 if ((irq
< 0) || (irq
> 15))
157 if (adj
->Action
!= REMOVE_MANAGED_RESOURCE
)
162 if (!(s
->irq_mask
& mask
))
165 s
->irq_mask
&= ~mask
;
172 static inline int adjust_irq(struct pcmcia_socket
*s
, adjust_t
*adj
) {
178 static int pcmcia_adjust_resource_info(adjust_t
*adj
)
180 struct pcmcia_socket
*s
;
184 down_read(&pcmcia_socket_list_rwsem
);
185 list_for_each_entry(s
, &pcmcia_socket_list
, socket_list
) {
187 if (adj
->Resource
== RES_IRQ
)
188 ret
= adjust_irq(s
, adj
);
190 else if (s
->resource_ops
->add_io
) {
191 unsigned long begin
, end
;
193 /* you can't use the old interface if the new
194 * one was used before */
195 spin_lock_irqsave(&s
->lock
, flags
);
196 if ((s
->resource_setup_new
) &&
197 !(s
->resource_setup_old
)) {
198 spin_unlock_irqrestore(&s
->lock
, flags
);
200 } else if (!(s
->resource_setup_old
))
201 s
->resource_setup_old
= 1;
202 spin_unlock_irqrestore(&s
->lock
, flags
);
204 switch (adj
->Resource
) {
205 case RES_MEMORY_RANGE
:
206 begin
= adj
->resource
.memory
.Base
;
207 end
= adj
->resource
.memory
.Base
+ adj
->resource
.memory
.Size
- 1;
208 if (s
->resource_ops
->add_mem
)
209 ret
=s
->resource_ops
->add_mem(s
, adj
->Action
, begin
, end
);
211 begin
= adj
->resource
.io
.BasePort
;
212 end
= adj
->resource
.io
.BasePort
+ adj
->resource
.io
.NumPorts
- 1;
213 if (s
->resource_ops
->add_io
)
214 ret
= s
->resource_ops
->add_io(s
, adj
->Action
, begin
, end
);
217 /* as there's no way we know this is the
218 * last call to adjust_resource_info, we
219 * always need to assume this is the latest
221 spin_lock_irqsave(&s
->lock
, flags
);
222 s
->resource_setup_done
= 1;
223 spin_unlock_irqrestore(&s
->lock
, flags
);
227 up_read(&pcmcia_socket_list_rwsem
);
232 /** pccard_get_status
234 * Get the current socket state bits. We don't support the latched
235 * SocketState yet: I haven't seen any point for it.
238 static int pccard_get_status(struct pcmcia_socket
*s
,
239 struct pcmcia_device
*p_dev
,
245 s
->ops
->get_status(s
, &val
);
246 status
->CardState
= status
->SocketState
= 0;
247 status
->CardState
|= (val
& SS_DETECT
) ? CS_EVENT_CARD_DETECT
: 0;
248 status
->CardState
|= (val
& SS_CARDBUS
) ? CS_EVENT_CB_DETECT
: 0;
249 status
->CardState
|= (val
& SS_3VCARD
) ? CS_EVENT_3VCARD
: 0;
250 status
->CardState
|= (val
& SS_XVCARD
) ? CS_EVENT_XVCARD
: 0;
251 if (s
->state
& SOCKET_SUSPEND
)
252 status
->CardState
|= CS_EVENT_PM_SUSPEND
;
253 if (!(s
->state
& SOCKET_PRESENT
))
256 c
= (p_dev
) ? p_dev
->function_config
: NULL
;
258 if ((c
!= NULL
) && (c
->state
& CONFIG_LOCKED
) &&
259 (c
->IntType
& (INT_MEMORY_AND_IO
| INT_ZOOMED_VIDEO
))) {
261 if (c
->CardValues
& PRESENT_PIN_REPLACE
) {
262 pcmcia_read_cis_mem(s
, 1, (c
->ConfigBase
+CISREG_PRR
)>>1, 1, ®
);
264 (reg
& PRR_WP_STATUS
) ? CS_EVENT_WRITE_PROTECT
: 0;
266 (reg
& PRR_READY_STATUS
) ? CS_EVENT_READY_CHANGE
: 0;
268 (reg
& PRR_BVD2_STATUS
) ? CS_EVENT_BATTERY_LOW
: 0;
270 (reg
& PRR_BVD1_STATUS
) ? CS_EVENT_BATTERY_DEAD
: 0;
272 /* No PRR? Then assume we're always ready */
273 status
->CardState
|= CS_EVENT_READY_CHANGE
;
275 if (c
->CardValues
& PRESENT_EXT_STATUS
) {
276 pcmcia_read_cis_mem(s
, 1, (c
->ConfigBase
+CISREG_ESR
)>>1, 1, ®
);
278 (reg
& ESR_REQ_ATTN
) ? CS_EVENT_REQUEST_ATTENTION
: 0;
283 (val
& SS_WRPROT
) ? CS_EVENT_WRITE_PROTECT
: 0;
285 (val
& SS_BATDEAD
) ? CS_EVENT_BATTERY_DEAD
: 0;
287 (val
& SS_BATWARN
) ? CS_EVENT_BATTERY_LOW
: 0;
289 (val
& SS_READY
) ? CS_EVENT_READY_CHANGE
: 0;
291 } /* pccard_get_status */
293 static int pccard_get_configuration_info(struct pcmcia_socket
*s
,
294 struct pcmcia_device
*p_dev
,
295 config_info_t
*config
)
299 if (!(s
->state
& SOCKET_PRESENT
))
303 #ifdef CONFIG_CARDBUS
304 if (s
->state
& SOCKET_CARDBUS
) {
305 memset(config
, 0, sizeof(config_info_t
));
306 config
->Vcc
= s
->socket
.Vcc
;
307 config
->Vpp1
= config
->Vpp2
= s
->socket
.Vpp
;
308 config
->Option
= s
->cb_dev
->subordinate
->number
;
309 if (s
->state
& SOCKET_CARDBUS_CONFIG
) {
310 config
->Attributes
= CONF_VALID_CLIENT
;
311 config
->IntType
= INT_CARDBUS
;
312 config
->AssignedIRQ
= s
->irq
.AssignedIRQ
;
313 if (config
->AssignedIRQ
)
314 config
->Attributes
|= CONF_ENABLE_IRQ
;
316 config
->BasePort1
= s
->io
[0].res
->start
;
317 config
->NumPorts1
= s
->io
[0].res
->end
-
318 config
->BasePort1
+ 1;
326 c
= p_dev
->function_config
;
327 config
->Function
= p_dev
->func
;
330 config
->Function
= 0;
333 if ((c
== NULL
) || !(c
->state
& CONFIG_LOCKED
)) {
334 config
->Attributes
= 0;
335 config
->Vcc
= s
->socket
.Vcc
;
336 config
->Vpp1
= config
->Vpp2
= s
->socket
.Vpp
;
340 config
->Attributes
= c
->Attributes
| CONF_VALID_CLIENT
;
341 config
->Vcc
= s
->socket
.Vcc
;
342 config
->Vpp1
= config
->Vpp2
= s
->socket
.Vpp
;
343 config
->IntType
= c
->IntType
;
344 config
->ConfigBase
= c
->ConfigBase
;
345 config
->Status
= c
->Status
;
346 config
->Pin
= c
->Pin
;
347 config
->Copy
= c
->Copy
;
348 config
->Option
= c
->Option
;
349 config
->ExtStatus
= c
->ExtStatus
;
350 config
->Present
= config
->CardValues
= c
->CardValues
;
351 config
->IRQAttributes
= c
->irq
.Attributes
;
352 config
->AssignedIRQ
= s
->irq
.AssignedIRQ
;
353 config
->BasePort1
= c
->io
.BasePort1
;
354 config
->NumPorts1
= c
->io
.NumPorts1
;
355 config
->Attributes1
= c
->io
.Attributes1
;
356 config
->BasePort2
= c
->io
.BasePort2
;
357 config
->NumPorts2
= c
->io
.NumPorts2
;
358 config
->Attributes2
= c
->io
.Attributes2
;
359 config
->IOAddrLines
= c
->io
.IOAddrLines
;
362 } /* pccard_get_configuration_info */
365 /*======================================================================
367 These manage a ring buffer of events pending for one user process
369 ======================================================================*/
372 static int queue_empty(user_info_t
*user
)
374 return (user
->event_head
== user
->event_tail
);
377 static event_t
get_queued_event(user_info_t
*user
)
379 user
->event_tail
= (user
->event_tail
+1) % MAX_EVENTS
;
380 return user
->event
[user
->event_tail
];
383 static void queue_event(user_info_t
*user
, event_t event
)
385 user
->event_head
= (user
->event_head
+1) % MAX_EVENTS
;
386 if (user
->event_head
== user
->event_tail
)
387 user
->event_tail
= (user
->event_tail
+1) % MAX_EVENTS
;
388 user
->event
[user
->event_head
] = event
;
391 void handle_event(struct pcmcia_socket
*s
, event_t event
)
394 for (user
= s
->user
; user
; user
= user
->next
)
395 queue_event(user
, event
);
396 wake_up_interruptible(&s
->queue
);
400 /*======================================================================
402 bind_request() and bind_device() are merged by now. Register_client()
403 is called right at the end of bind_request(), during the driver's
404 ->attach() call. Individual descriptions:
406 bind_request() connects a socket to a particular client driver.
407 It looks up the specified device ID in the list of registered
408 drivers, binds it to the socket, and tries to create an instance
409 of the device. unbind_request() deletes a driver instance.
411 Bind_device() associates a device driver with a particular socket.
412 It is normally called by Driver Services after it has identified
413 a newly inserted card. An instance of that driver will then be
414 eligible to register as a client of this socket.
416 Register_client() uses the dev_info_t handle to match the
417 caller with a socket. The driver must have already been bound
418 to a socket with bind_device() -- in fact, bind_device()
419 allocates the client structure that will be used.
421 ======================================================================*/
423 static int bind_request(struct pcmcia_socket
*s
, bind_info_t
*bind_info
)
425 struct pcmcia_driver
*p_drv
;
426 struct pcmcia_device
*p_dev
;
430 s
= pcmcia_get_socket(s
);
434 ds_dbg(2, "bind_request(%d, '%s')\n", s
->sock
,
435 (char *)bind_info
->dev_info
);
437 p_drv
= get_pcmcia_driver(&bind_info
->dev_info
);
443 if (!try_module_get(p_drv
->owner
)) {
448 spin_lock_irqsave(&pcmcia_dev_list_lock
, flags
);
449 list_for_each_entry(p_dev
, &s
->devices_list
, socket_device_list
) {
450 if (p_dev
->func
== bind_info
->function
) {
451 if ((p_dev
->dev
.driver
== &p_drv
->drv
)) {
452 if (p_dev
->cardmgr
) {
453 /* if there's already a device
454 * registered, and it was registered
455 * by userspace before, we need to
456 * return the "instance". */
457 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
458 bind_info
->instance
= p_dev
;
462 /* the correct driver managed to bind
463 * itself magically to the correct
465 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
466 p_dev
->cardmgr
= p_drv
;
470 } else if (!p_dev
->dev
.driver
) {
471 /* there's already a device available where
472 * no device has been bound to yet. So we don't
473 * need to register a device! */
474 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
479 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
481 p_dev
= pcmcia_device_add(s
, bind_info
->function
);
488 p_dev
->cardmgr
= p_drv
;
490 /* if a driver is already running, we can abort */
491 if (p_dev
->dev
.driver
)
495 * Prevent this racing with a card insertion.
497 mutex_lock(&s
->skt_mutex
);
498 ret
= bus_rescan_devices(&pcmcia_bus_type
);
499 mutex_unlock(&s
->skt_mutex
);
503 /* check whether the driver indeed matched. I don't care if this
504 * is racy or not, because it can only happen on cardmgr access
507 if (!(p_dev
->dev
.driver
== &p_drv
->drv
))
508 p_dev
->cardmgr
= NULL
;
511 module_put(p_drv
->owner
);
513 put_driver(&p_drv
->drv
);
515 pcmcia_put_socket(s
);
520 #ifdef CONFIG_CARDBUS
522 static struct pci_bus
*pcmcia_lookup_bus(struct pcmcia_socket
*s
)
524 if (!s
|| !(s
->state
& SOCKET_CARDBUS
))
527 return s
->cb_dev
->subordinate
;
531 static int get_device_info(struct pcmcia_socket
*s
, bind_info_t
*bind_info
, int first
)
534 struct pcmcia_device
*p_dev
;
535 struct pcmcia_driver
*p_drv
;
539 #ifdef CONFIG_CARDBUS
541 * Some unbelievably ugly code to associate the PCI cardbus
542 * device and its driver with the PCMCIA "bind" information.
547 bus
= pcmcia_lookup_bus(s
);
549 struct list_head
*list
;
550 struct pci_dev
*dev
= NULL
;
552 list
= bus
->devices
.next
;
553 while (list
!= &bus
->devices
) {
554 struct pci_dev
*pdev
= pci_dev_b(list
);
562 /* Try to handle "next" here some way? */
564 if (dev
&& dev
->driver
) {
565 strlcpy(bind_info
->name
, dev
->driver
->name
, DEV_NAME_LEN
);
566 bind_info
->major
= 0;
567 bind_info
->minor
= 0;
568 bind_info
->next
= NULL
;
575 spin_lock_irqsave(&pcmcia_dev_list_lock
, flags
);
576 list_for_each_entry(p_dev
, &s
->devices_list
, socket_device_list
) {
577 if (p_dev
->func
== bind_info
->function
) {
578 p_dev
= pcmcia_get_dev(p_dev
);
584 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
588 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
590 p_drv
= to_pcmcia_drv(p_dev
->dev
.driver
);
591 if (p_drv
&& !p_dev
->_locked
) {
597 node
= p_dev
->dev_node
;
599 for (node
= p_dev
->dev_node
; node
; node
= node
->next
)
600 if (node
== bind_info
->next
)
607 strlcpy(bind_info
->name
, node
->dev_name
, DEV_NAME_LEN
);
608 bind_info
->major
= node
->major
;
609 bind_info
->minor
= node
->minor
;
610 bind_info
->next
= node
->next
;
613 pcmcia_put_dev(p_dev
);
615 } /* get_device_info */
618 static int ds_open(struct inode
*inode
, struct file
*file
)
620 socket_t i
= iminor(inode
);
621 struct pcmcia_socket
*s
;
623 static int warning_printed
= 0;
626 ds_dbg(0, "ds_open(socket %d)\n", i
);
629 s
= pcmcia_get_socket_by_nr(i
);
634 s
= pcmcia_get_socket(s
);
640 if ((file
->f_flags
& O_ACCMODE
) != O_RDONLY
) {
641 if (s
->pcmcia_state
.busy
) {
642 pcmcia_put_socket(s
);
647 s
->pcmcia_state
.busy
= 1;
650 user
= kmalloc(sizeof(user_info_t
), GFP_KERNEL
);
652 pcmcia_put_socket(s
);
656 user
->event_tail
= user
->event_head
= 0;
657 user
->next
= s
->user
;
658 user
->user_magic
= USER_MAGIC
;
661 file
->private_data
= user
;
663 if (!warning_printed
) {
664 printk(KERN_INFO
"pcmcia: Detected deprecated PCMCIA ioctl "
665 "usage from process: %s.\n", current
->comm
);
666 printk(KERN_INFO
"pcmcia: This interface will soon be removed from "
667 "the kernel; please expect breakage unless you upgrade "
669 printk(KERN_INFO
"pcmcia: see http://www.kernel.org/pub/linux/"
670 "utils/kernel/pcmcia/pcmcia.html for details.\n");
674 if (s
->pcmcia_state
.present
)
675 queue_event(user
, CS_EVENT_CARD_INSERTION
);
681 /*====================================================================*/
683 static int ds_release(struct inode
*inode
, struct file
*file
)
685 struct pcmcia_socket
*s
;
686 user_info_t
*user
, **link
;
688 ds_dbg(0, "ds_release(socket %d)\n", iminor(inode
));
690 user
= file
->private_data
;
691 if (CHECK_USER(user
))
696 /* Unlink user data structure */
697 if ((file
->f_flags
& O_ACCMODE
) != O_RDONLY
) {
698 s
->pcmcia_state
.busy
= 0;
700 file
->private_data
= NULL
;
701 for (link
= &s
->user
; *link
; link
= &(*link
)->next
)
702 if (*link
== user
) break;
706 user
->user_magic
= 0;
708 pcmcia_put_socket(s
);
713 /*====================================================================*/
715 static ssize_t
ds_read(struct file
*file
, char __user
*buf
,
716 size_t count
, loff_t
*ppos
)
718 struct pcmcia_socket
*s
;
722 ds_dbg(2, "ds_read(socket %d)\n", iminor(file
->f_path
.dentry
->d_inode
));
727 user
= file
->private_data
;
728 if (CHECK_USER(user
))
732 if (s
->pcmcia_state
.dead
)
735 ret
= wait_event_interruptible(s
->queue
, !queue_empty(user
));
737 ret
= put_user(get_queued_event(user
), (int __user
*)buf
) ? -EFAULT
: 4;
742 /*====================================================================*/
744 static ssize_t
ds_write(struct file
*file
, const char __user
*buf
,
745 size_t count
, loff_t
*ppos
)
747 ds_dbg(2, "ds_write(socket %d)\n", iminor(file
->f_path
.dentry
->d_inode
));
751 if ((file
->f_flags
& O_ACCMODE
) == O_RDONLY
)
757 /*====================================================================*/
759 /* No kernel lock - fine */
760 static u_int
ds_poll(struct file
*file
, poll_table
*wait
)
762 struct pcmcia_socket
*s
;
765 ds_dbg(2, "ds_poll(socket %d)\n", iminor(file
->f_path
.dentry
->d_inode
));
767 user
= file
->private_data
;
768 if (CHECK_USER(user
))
772 * We don't check for a dead socket here since that
773 * will send cardmgr into an endless spin.
775 poll_wait(file
, &s
->queue
, wait
);
776 if (!queue_empty(user
))
777 return POLLIN
| POLLRDNORM
;
781 /*====================================================================*/
783 static int ds_ioctl(struct inode
* inode
, struct file
* file
,
784 u_int cmd
, u_long arg
)
786 struct pcmcia_socket
*s
;
787 void __user
*uarg
= (char __user
*)arg
;
793 ds_dbg(2, "ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode
), cmd
, arg
);
795 user
= file
->private_data
;
796 if (CHECK_USER(user
))
800 if (s
->pcmcia_state
.dead
)
803 size
= (cmd
& IOCSIZE_MASK
) >> IOCSIZE_SHIFT
;
804 if (size
> sizeof(ds_ioctl_arg_t
)) return -EINVAL
;
806 /* Permission check */
807 if (!(cmd
& IOC_OUT
) && !capable(CAP_SYS_ADMIN
))
811 if (!access_ok(VERIFY_READ
, uarg
, size
)) {
812 ds_dbg(3, "ds_ioctl(): verify_read = %d\n", -EFAULT
);
817 if (!access_ok(VERIFY_WRITE
, uarg
, size
)) {
818 ds_dbg(3, "ds_ioctl(): verify_write = %d\n", -EFAULT
);
822 buf
= kmalloc(sizeof(ds_ioctl_arg_t
), GFP_KERNEL
);
829 if (__copy_from_user((char *)buf
, uarg
, size
)) {
836 case DS_ADJUST_RESOURCE_INFO
:
837 ret
= pcmcia_adjust_resource_info(&buf
->adjust
);
839 case DS_GET_CONFIGURATION_INFO
:
840 if (buf
->config
.Function
&&
841 (buf
->config
.Function
>= s
->functions
))
844 struct pcmcia_device
*p_dev
= get_pcmcia_device(s
, buf
->config
.Function
);
845 ret
= pccard_get_configuration_info(s
, p_dev
, &buf
->config
);
846 pcmcia_put_dev(p_dev
);
849 case DS_GET_FIRST_TUPLE
:
850 mutex_lock(&s
->skt_mutex
);
851 pcmcia_validate_mem(s
);
852 mutex_unlock(&s
->skt_mutex
);
853 ret
= pccard_get_first_tuple(s
, BIND_FN_ALL
, &buf
->tuple
);
855 case DS_GET_NEXT_TUPLE
:
856 ret
= pccard_get_next_tuple(s
, BIND_FN_ALL
, &buf
->tuple
);
858 case DS_GET_TUPLE_DATA
:
859 buf
->tuple
.TupleData
= buf
->tuple_parse
.data
;
860 buf
->tuple
.TupleDataMax
= sizeof(buf
->tuple_parse
.data
);
861 ret
= pccard_get_tuple_data(s
, &buf
->tuple
);
864 buf
->tuple
.TupleData
= buf
->tuple_parse
.data
;
865 ret
= pcmcia_parse_tuple(&buf
->tuple
, &buf
->tuple_parse
.parse
);
868 ret
= pcmcia_reset_card(s
);
871 if (buf
->status
.Function
&&
872 (buf
->status
.Function
>= s
->functions
))
875 struct pcmcia_device
*p_dev
= get_pcmcia_device(s
, buf
->status
.Function
);
876 ret
= pccard_get_status(s
, p_dev
, &buf
->status
);
877 pcmcia_put_dev(p_dev
);
880 case DS_VALIDATE_CIS
:
881 mutex_lock(&s
->skt_mutex
);
882 pcmcia_validate_mem(s
);
883 mutex_unlock(&s
->skt_mutex
);
884 ret
= pccard_validate_cis(s
, &buf
->cisinfo
.Chains
);
886 case DS_SUSPEND_CARD
:
887 ret
= pcmcia_suspend_card(s
);
890 ret
= pcmcia_resume_card(s
);
893 err
= pcmcia_eject_card(s
);
896 err
= pcmcia_insert_card(s
);
898 case DS_ACCESS_CONFIGURATION_REGISTER
:
899 if ((buf
->conf_reg
.Action
== CS_WRITE
) && !capable(CAP_SYS_ADMIN
)) {
906 if (!(buf
->conf_reg
.Function
&&
907 (buf
->conf_reg
.Function
>= s
->functions
))) {
908 struct pcmcia_device
*p_dev
= get_pcmcia_device(s
, buf
->conf_reg
.Function
);
910 ret
= pcmcia_access_configuration_register(p_dev
, &buf
->conf_reg
);
911 pcmcia_put_dev(p_dev
);
915 case DS_GET_FIRST_REGION
:
916 case DS_GET_NEXT_REGION
:
918 if (!capable(CAP_SYS_ADMIN
)) {
922 printk_once(KERN_WARNING
923 "2.6. kernels use pcmciamtd instead of memory_cs.c and do not require special\n");
924 printk_once(KERN_WARNING
"MTD handling any more.\n");
929 case DS_GET_FIRST_WINDOW
:
930 ret
= pcmcia_get_window(s
, &buf
->win_info
.handle
, 0,
931 &buf
->win_info
.window
);
933 case DS_GET_NEXT_WINDOW
:
934 ret
= pcmcia_get_window(s
, &buf
->win_info
.handle
,
935 buf
->win_info
.handle
->index
+ 1, &buf
->win_info
.window
);
937 case DS_GET_MEM_PAGE
:
938 ret
= pcmcia_get_mem_page(buf
->win_info
.handle
,
942 ret
= pcmcia_replace_cis(s
, buf
->cisdump
.Data
, buf
->cisdump
.Length
);
944 case DS_BIND_REQUEST
:
945 if (!capable(CAP_SYS_ADMIN
)) {
949 err
= bind_request(s
, &buf
->bind_info
);
951 case DS_GET_DEVICE_INFO
:
952 err
= get_device_info(s
, &buf
->bind_info
, 1);
954 case DS_GET_NEXT_DEVICE
:
955 err
= get_device_info(s
, &buf
->bind_info
, 0);
957 case DS_UNBIND_REQUEST
:
964 if ((err
== 0) && (ret
!= 0)) {
965 ds_dbg(2, "ds_ioctl: ret = %d\n", ret
);
974 err
= -ENOSPC
; break;
976 err
= -ENODATA
; break;
983 if (__copy_to_user(uarg
, (char *)buf
, size
))
992 /*====================================================================*/
994 static const struct file_operations ds_fops
= {
995 .owner
= THIS_MODULE
,
997 .release
= ds_release
,
1004 void __init
pcmcia_setup_ioctl(void) {
1007 /* Set up character device for user mode clients */
1008 i
= register_chrdev(0, "pcmcia", &ds_fops
);
1010 printk(KERN_NOTICE
"unable to find a free device # for "
1011 "Driver Services (error=%d)\n", i
);
1015 #ifdef CONFIG_PROC_FS
1016 proc_pccard
= proc_mkdir("bus/pccard", NULL
);
1018 proc_create("drivers", 0, proc_pccard
, &pccard_drivers_proc_fops
);
1023 void __exit
pcmcia_cleanup_ioctl(void) {
1024 #ifdef CONFIG_PROC_FS
1026 remove_proc_entry("drivers", proc_pccard
);
1027 remove_proc_entry("bus/pccard", NULL
);
1030 if (major_dev
!= -1)
1031 unregister_chrdev(major_dev
, "pcmcia");