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 static struct pcmcia_device
*get_pcmcia_device(struct pcmcia_socket
*s
,
62 unsigned int function
)
64 struct pcmcia_device
*p_dev
= NULL
;
67 spin_lock_irqsave(&pcmcia_dev_list_lock
, flags
);
68 list_for_each_entry(p_dev
, &s
->devices_list
, socket_device_list
) {
69 if (p_dev
->func
== function
) {
70 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
71 return pcmcia_get_dev(p_dev
);
74 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
78 /* backwards-compatible accessing of driver --- by name! */
80 static struct pcmcia_driver
*get_pcmcia_driver(dev_info_t
*dev_info
)
82 struct device_driver
*drv
;
83 struct pcmcia_driver
*p_drv
;
85 drv
= driver_find((char *) dev_info
, &pcmcia_bus_type
);
89 p_drv
= container_of(drv
, struct pcmcia_driver
, drv
);
96 static struct proc_dir_entry
*proc_pccard
;
98 static int proc_read_drivers_callback(struct device_driver
*driver
, void *_m
)
100 struct seq_file
*m
= _m
;
101 struct pcmcia_driver
*p_drv
= container_of(driver
,
102 struct pcmcia_driver
, drv
);
104 seq_printf(m
, "%-24.24s 1 %d\n", p_drv
->drv
.name
,
105 #ifdef CONFIG_MODULE_UNLOAD
106 (p_drv
->owner
) ? module_refcount(p_drv
->owner
) : 1
114 static int pccard_drivers_proc_show(struct seq_file
*m
, void *v
)
116 return bus_for_each_drv(&pcmcia_bus_type
, NULL
,
117 m
, proc_read_drivers_callback
);
120 static int pccard_drivers_proc_open(struct inode
*inode
, struct file
*file
)
122 return single_open(file
, pccard_drivers_proc_show
, NULL
);
125 static const struct file_operations pccard_drivers_proc_fops
= {
126 .owner
= THIS_MODULE
,
127 .open
= pccard_drivers_proc_open
,
130 .release
= single_release
,
135 #ifdef CONFIG_PCMCIA_PROBE
137 static int adjust_irq(struct pcmcia_socket
*s
, adjust_t
*adj
)
142 irq
= adj
->resource
.irq
.IRQ
;
143 if ((irq
< 0) || (irq
> 15))
146 if (adj
->Action
!= REMOVE_MANAGED_RESOURCE
)
151 if (!(s
->irq_mask
& mask
))
154 s
->irq_mask
&= ~mask
;
161 static inline int adjust_irq(struct pcmcia_socket
*s
, adjust_t
*adj
)
168 static int pcmcia_adjust_resource_info(adjust_t
*adj
)
170 struct pcmcia_socket
*s
;
174 down_read(&pcmcia_socket_list_rwsem
);
175 list_for_each_entry(s
, &pcmcia_socket_list
, socket_list
) {
177 if (adj
->Resource
== RES_IRQ
)
178 ret
= adjust_irq(s
, adj
);
180 else if (s
->resource_ops
->add_io
) {
181 unsigned long begin
, end
;
183 /* you can't use the old interface if the new
184 * one was used before */
185 spin_lock_irqsave(&s
->lock
, flags
);
186 if ((s
->resource_setup_new
) &&
187 !(s
->resource_setup_old
)) {
188 spin_unlock_irqrestore(&s
->lock
, flags
);
190 } else if (!(s
->resource_setup_old
))
191 s
->resource_setup_old
= 1;
192 spin_unlock_irqrestore(&s
->lock
, flags
);
194 switch (adj
->Resource
) {
195 case RES_MEMORY_RANGE
:
196 begin
= adj
->resource
.memory
.Base
;
197 end
= adj
->resource
.memory
.Base
+ adj
->resource
.memory
.Size
- 1;
198 if (s
->resource_ops
->add_mem
)
199 ret
= s
->resource_ops
->add_mem(s
, adj
->Action
, begin
, end
);
201 begin
= adj
->resource
.io
.BasePort
;
202 end
= adj
->resource
.io
.BasePort
+ adj
->resource
.io
.NumPorts
- 1;
203 if (s
->resource_ops
->add_io
)
204 ret
= s
->resource_ops
->add_io(s
, adj
->Action
, begin
, end
);
207 /* as there's no way we know this is the
208 * last call to adjust_resource_info, we
209 * always need to assume this is the latest
211 spin_lock_irqsave(&s
->lock
, flags
);
212 s
->resource_setup_done
= 1;
213 spin_unlock_irqrestore(&s
->lock
, flags
);
217 up_read(&pcmcia_socket_list_rwsem
);
223 /** pcmcia_get_window
225 static int pcmcia_get_window(struct pcmcia_socket
*s
, window_handle_t
*wh_out
,
226 window_handle_t wh
, win_req_t
*req
)
232 if (!s
|| !(s
->state
& SOCKET_PRESENT
))
236 for (w
= wh
; w
< MAX_WIN
; w
++)
237 if (s
->state
& SOCKET_WIN_REQ(w
))
242 req
->Base
= win
->res
->start
;
243 req
->Size
= win
->res
->end
- win
->res
->start
+ 1;
244 req
->AccessSpeed
= win
->speed
;
246 if (win
->flags
& MAP_ATTRIB
)
247 req
->Attributes
|= WIN_MEMORY_TYPE_AM
;
248 if (win
->flags
& MAP_ACTIVE
)
249 req
->Attributes
|= WIN_ENABLE
;
250 if (win
->flags
& MAP_16BIT
)
251 req
->Attributes
|= WIN_DATA_WIDTH_16
;
252 if (win
->flags
& MAP_USE_WAIT
)
253 req
->Attributes
|= WIN_USE_WAIT
;
257 } /* pcmcia_get_window */
260 /** pcmcia_get_mem_page
262 * Change the card address of an already open memory window.
264 static int pcmcia_get_mem_page(struct pcmcia_socket
*skt
, window_handle_t wh
,
272 req
->CardOffset
= skt
->win
[wh
].card_start
;
274 } /* pcmcia_get_mem_page */
277 /** pccard_get_status
279 * Get the current socket state bits. We don't support the latched
280 * SocketState yet: I haven't seen any point for it.
283 static int pccard_get_status(struct pcmcia_socket
*s
,
284 struct pcmcia_device
*p_dev
,
290 s
->ops
->get_status(s
, &val
);
291 status
->CardState
= status
->SocketState
= 0;
292 status
->CardState
|= (val
& SS_DETECT
) ? CS_EVENT_CARD_DETECT
: 0;
293 status
->CardState
|= (val
& SS_CARDBUS
) ? CS_EVENT_CB_DETECT
: 0;
294 status
->CardState
|= (val
& SS_3VCARD
) ? CS_EVENT_3VCARD
: 0;
295 status
->CardState
|= (val
& SS_XVCARD
) ? CS_EVENT_XVCARD
: 0;
296 if (s
->state
& SOCKET_SUSPEND
)
297 status
->CardState
|= CS_EVENT_PM_SUSPEND
;
298 if (!(s
->state
& SOCKET_PRESENT
))
301 c
= (p_dev
) ? p_dev
->function_config
: NULL
;
303 if ((c
!= NULL
) && (c
->state
& CONFIG_LOCKED
) &&
304 (c
->IntType
& (INT_MEMORY_AND_IO
| INT_ZOOMED_VIDEO
))) {
306 if (c
->CardValues
& PRESENT_PIN_REPLACE
) {
307 pcmcia_read_cis_mem(s
, 1, (c
->ConfigBase
+CISREG_PRR
)>>1, 1, ®
);
309 (reg
& PRR_WP_STATUS
) ? CS_EVENT_WRITE_PROTECT
: 0;
311 (reg
& PRR_READY_STATUS
) ? CS_EVENT_READY_CHANGE
: 0;
313 (reg
& PRR_BVD2_STATUS
) ? CS_EVENT_BATTERY_LOW
: 0;
315 (reg
& PRR_BVD1_STATUS
) ? CS_EVENT_BATTERY_DEAD
: 0;
317 /* No PRR? Then assume we're always ready */
318 status
->CardState
|= CS_EVENT_READY_CHANGE
;
320 if (c
->CardValues
& PRESENT_EXT_STATUS
) {
321 pcmcia_read_cis_mem(s
, 1, (c
->ConfigBase
+CISREG_ESR
)>>1, 1, ®
);
323 (reg
& ESR_REQ_ATTN
) ? CS_EVENT_REQUEST_ATTENTION
: 0;
328 (val
& SS_WRPROT
) ? CS_EVENT_WRITE_PROTECT
: 0;
330 (val
& SS_BATDEAD
) ? CS_EVENT_BATTERY_DEAD
: 0;
332 (val
& SS_BATWARN
) ? CS_EVENT_BATTERY_LOW
: 0;
334 (val
& SS_READY
) ? CS_EVENT_READY_CHANGE
: 0;
336 } /* pccard_get_status */
338 static int pccard_get_configuration_info(struct pcmcia_socket
*s
,
339 struct pcmcia_device
*p_dev
,
340 config_info_t
*config
)
344 if (!(s
->state
& SOCKET_PRESENT
))
348 #ifdef CONFIG_CARDBUS
349 if (s
->state
& SOCKET_CARDBUS
) {
350 memset(config
, 0, sizeof(config_info_t
));
351 config
->Vcc
= s
->socket
.Vcc
;
352 config
->Vpp1
= config
->Vpp2
= s
->socket
.Vpp
;
353 config
->Option
= s
->cb_dev
->subordinate
->number
;
354 if (s
->state
& SOCKET_CARDBUS_CONFIG
) {
355 config
->Attributes
= CONF_VALID_CLIENT
;
356 config
->IntType
= INT_CARDBUS
;
357 config
->AssignedIRQ
= s
->irq
.AssignedIRQ
;
358 if (config
->AssignedIRQ
)
359 config
->Attributes
|= CONF_ENABLE_IRQ
;
361 config
->BasePort1
= s
->io
[0].res
->start
;
362 config
->NumPorts1
= s
->io
[0].res
->end
-
363 config
->BasePort1
+ 1;
371 c
= p_dev
->function_config
;
372 config
->Function
= p_dev
->func
;
375 config
->Function
= 0;
378 if ((c
== NULL
) || !(c
->state
& CONFIG_LOCKED
)) {
379 config
->Attributes
= 0;
380 config
->Vcc
= s
->socket
.Vcc
;
381 config
->Vpp1
= config
->Vpp2
= s
->socket
.Vpp
;
385 config
->Attributes
= c
->Attributes
| CONF_VALID_CLIENT
;
386 config
->Vcc
= s
->socket
.Vcc
;
387 config
->Vpp1
= config
->Vpp2
= s
->socket
.Vpp
;
388 config
->IntType
= c
->IntType
;
389 config
->ConfigBase
= c
->ConfigBase
;
390 config
->Status
= c
->Status
;
391 config
->Pin
= c
->Pin
;
392 config
->Copy
= c
->Copy
;
393 config
->Option
= c
->Option
;
394 config
->ExtStatus
= c
->ExtStatus
;
395 config
->Present
= config
->CardValues
= c
->CardValues
;
396 config
->IRQAttributes
= c
->irq
.Attributes
;
397 config
->AssignedIRQ
= s
->irq
.AssignedIRQ
;
398 config
->BasePort1
= c
->io
.BasePort1
;
399 config
->NumPorts1
= c
->io
.NumPorts1
;
400 config
->Attributes1
= c
->io
.Attributes1
;
401 config
->BasePort2
= c
->io
.BasePort2
;
402 config
->NumPorts2
= c
->io
.NumPorts2
;
403 config
->Attributes2
= c
->io
.Attributes2
;
404 config
->IOAddrLines
= c
->io
.IOAddrLines
;
407 } /* pccard_get_configuration_info */
410 /*======================================================================
412 These manage a ring buffer of events pending for one user process
414 ======================================================================*/
417 static int queue_empty(user_info_t
*user
)
419 return (user
->event_head
== user
->event_tail
);
422 static event_t
get_queued_event(user_info_t
*user
)
424 user
->event_tail
= (user
->event_tail
+1) % MAX_EVENTS
;
425 return user
->event
[user
->event_tail
];
428 static void queue_event(user_info_t
*user
, event_t event
)
430 user
->event_head
= (user
->event_head
+1) % MAX_EVENTS
;
431 if (user
->event_head
== user
->event_tail
)
432 user
->event_tail
= (user
->event_tail
+1) % MAX_EVENTS
;
433 user
->event
[user
->event_head
] = event
;
436 void handle_event(struct pcmcia_socket
*s
, event_t event
)
439 for (user
= s
->user
; user
; user
= user
->next
)
440 queue_event(user
, event
);
441 wake_up_interruptible(&s
->queue
);
445 /*======================================================================
447 bind_request() and bind_device() are merged by now. Register_client()
448 is called right at the end of bind_request(), during the driver's
449 ->attach() call. Individual descriptions:
451 bind_request() connects a socket to a particular client driver.
452 It looks up the specified device ID in the list of registered
453 drivers, binds it to the socket, and tries to create an instance
454 of the device. unbind_request() deletes a driver instance.
456 Bind_device() associates a device driver with a particular socket.
457 It is normally called by Driver Services after it has identified
458 a newly inserted card. An instance of that driver will then be
459 eligible to register as a client of this socket.
461 Register_client() uses the dev_info_t handle to match the
462 caller with a socket. The driver must have already been bound
463 to a socket with bind_device() -- in fact, bind_device()
464 allocates the client structure that will be used.
466 ======================================================================*/
468 static int bind_request(struct pcmcia_socket
*s
, bind_info_t
*bind_info
)
470 struct pcmcia_driver
*p_drv
;
471 struct pcmcia_device
*p_dev
;
475 s
= pcmcia_get_socket(s
);
479 pr_debug("bind_request(%d, '%s')\n", s
->sock
,
480 (char *)bind_info
->dev_info
);
482 p_drv
= get_pcmcia_driver(&bind_info
->dev_info
);
488 if (!try_module_get(p_drv
->owner
)) {
493 spin_lock_irqsave(&pcmcia_dev_list_lock
, flags
);
494 list_for_each_entry(p_dev
, &s
->devices_list
, socket_device_list
) {
495 if (p_dev
->func
== bind_info
->function
) {
496 if ((p_dev
->dev
.driver
== &p_drv
->drv
)) {
497 if (p_dev
->cardmgr
) {
498 /* if there's already a device
499 * registered, and it was registered
500 * by userspace before, we need to
501 * return the "instance". */
502 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
503 bind_info
->instance
= p_dev
;
507 /* the correct driver managed to bind
508 * itself magically to the correct
510 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
511 p_dev
->cardmgr
= p_drv
;
515 } else if (!p_dev
->dev
.driver
) {
516 /* there's already a device available where
517 * no device has been bound to yet. So we don't
518 * need to register a device! */
519 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
524 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
526 p_dev
= pcmcia_device_add(s
, bind_info
->function
);
533 p_dev
->cardmgr
= p_drv
;
535 /* if a driver is already running, we can abort */
536 if (p_dev
->dev
.driver
)
540 * Prevent this racing with a card insertion.
542 mutex_lock(&s
->skt_mutex
);
543 ret
= bus_rescan_devices(&pcmcia_bus_type
);
544 mutex_unlock(&s
->skt_mutex
);
548 /* check whether the driver indeed matched. I don't care if this
549 * is racy or not, because it can only happen on cardmgr access
552 if (!(p_dev
->dev
.driver
== &p_drv
->drv
))
553 p_dev
->cardmgr
= NULL
;
556 module_put(p_drv
->owner
);
558 put_driver(&p_drv
->drv
);
560 pcmcia_put_socket(s
);
565 #ifdef CONFIG_CARDBUS
567 static struct pci_bus
*pcmcia_lookup_bus(struct pcmcia_socket
*s
)
569 if (!s
|| !(s
->state
& SOCKET_CARDBUS
))
572 return s
->cb_dev
->subordinate
;
576 static int get_device_info(struct pcmcia_socket
*s
, bind_info_t
*bind_info
, int first
)
579 struct pcmcia_device
*p_dev
;
580 struct pcmcia_driver
*p_drv
;
584 #ifdef CONFIG_CARDBUS
586 * Some unbelievably ugly code to associate the PCI cardbus
587 * device and its driver with the PCMCIA "bind" information.
592 bus
= pcmcia_lookup_bus(s
);
594 struct list_head
*list
;
595 struct pci_dev
*dev
= NULL
;
597 list
= bus
->devices
.next
;
598 while (list
!= &bus
->devices
) {
599 struct pci_dev
*pdev
= pci_dev_b(list
);
607 /* Try to handle "next" here some way? */
609 if (dev
&& dev
->driver
) {
610 strlcpy(bind_info
->name
, dev
->driver
->name
, DEV_NAME_LEN
);
611 bind_info
->major
= 0;
612 bind_info
->minor
= 0;
613 bind_info
->next
= NULL
;
620 spin_lock_irqsave(&pcmcia_dev_list_lock
, flags
);
621 list_for_each_entry(p_dev
, &s
->devices_list
, socket_device_list
) {
622 if (p_dev
->func
== bind_info
->function
) {
623 p_dev
= pcmcia_get_dev(p_dev
);
629 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
633 spin_unlock_irqrestore(&pcmcia_dev_list_lock
, flags
);
635 p_drv
= to_pcmcia_drv(p_dev
->dev
.driver
);
636 if (p_drv
&& !p_dev
->_locked
) {
642 node
= p_dev
->dev_node
;
644 for (node
= p_dev
->dev_node
; node
; node
= node
->next
)
645 if (node
== bind_info
->next
)
652 strlcpy(bind_info
->name
, node
->dev_name
, DEV_NAME_LEN
);
653 bind_info
->major
= node
->major
;
654 bind_info
->minor
= node
->minor
;
655 bind_info
->next
= node
->next
;
658 pcmcia_put_dev(p_dev
);
660 } /* get_device_info */
663 static int ds_open(struct inode
*inode
, struct file
*file
)
665 socket_t i
= iminor(inode
);
666 struct pcmcia_socket
*s
;
668 static int warning_printed
;
671 pr_debug("ds_open(socket %d)\n", i
);
674 s
= pcmcia_get_socket_by_nr(i
);
679 s
= pcmcia_get_socket(s
);
685 if ((file
->f_flags
& O_ACCMODE
) != O_RDONLY
) {
686 if (s
->pcmcia_state
.busy
) {
687 pcmcia_put_socket(s
);
692 s
->pcmcia_state
.busy
= 1;
695 user
= kmalloc(sizeof(user_info_t
), GFP_KERNEL
);
697 pcmcia_put_socket(s
);
701 user
->event_tail
= user
->event_head
= 0;
702 user
->next
= s
->user
;
703 user
->user_magic
= USER_MAGIC
;
706 file
->private_data
= user
;
708 if (!warning_printed
) {
709 printk(KERN_INFO
"pcmcia: Detected deprecated PCMCIA ioctl "
710 "usage from process: %s.\n", current
->comm
);
711 printk(KERN_INFO
"pcmcia: This interface will soon be removed from "
712 "the kernel; please expect breakage unless you upgrade "
714 printk(KERN_INFO
"pcmcia: see http://www.kernel.org/pub/linux/"
715 "utils/kernel/pcmcia/pcmcia.html for details.\n");
719 if (s
->pcmcia_state
.present
)
720 queue_event(user
, CS_EVENT_CARD_INSERTION
);
726 /*====================================================================*/
728 static int ds_release(struct inode
*inode
, struct file
*file
)
730 struct pcmcia_socket
*s
;
731 user_info_t
*user
, **link
;
733 pr_debug("ds_release(socket %d)\n", iminor(inode
));
735 user
= file
->private_data
;
736 if (CHECK_USER(user
))
741 /* Unlink user data structure */
742 if ((file
->f_flags
& O_ACCMODE
) != O_RDONLY
)
743 s
->pcmcia_state
.busy
= 0;
745 file
->private_data
= NULL
;
746 for (link
= &s
->user
; *link
; link
= &(*link
)->next
)
752 user
->user_magic
= 0;
754 pcmcia_put_socket(s
);
759 /*====================================================================*/
761 static ssize_t
ds_read(struct file
*file
, char __user
*buf
,
762 size_t count
, loff_t
*ppos
)
764 struct pcmcia_socket
*s
;
768 pr_debug("ds_read(socket %d)\n", iminor(file
->f_path
.dentry
->d_inode
));
773 user
= file
->private_data
;
774 if (CHECK_USER(user
))
778 if (s
->pcmcia_state
.dead
)
781 ret
= wait_event_interruptible(s
->queue
, !queue_empty(user
));
783 ret
= put_user(get_queued_event(user
), (int __user
*)buf
) ? -EFAULT
: 4;
788 /*====================================================================*/
790 static ssize_t
ds_write(struct file
*file
, const char __user
*buf
,
791 size_t count
, loff_t
*ppos
)
793 pr_debug("ds_write(socket %d)\n", iminor(file
->f_path
.dentry
->d_inode
));
797 if ((file
->f_flags
& O_ACCMODE
) == O_RDONLY
)
803 /*====================================================================*/
805 /* No kernel lock - fine */
806 static u_int
ds_poll(struct file
*file
, poll_table
*wait
)
808 struct pcmcia_socket
*s
;
811 pr_debug("ds_poll(socket %d)\n", iminor(file
->f_path
.dentry
->d_inode
));
813 user
= file
->private_data
;
814 if (CHECK_USER(user
))
818 * We don't check for a dead socket here since that
819 * will send cardmgr into an endless spin.
821 poll_wait(file
, &s
->queue
, wait
);
822 if (!queue_empty(user
))
823 return POLLIN
| POLLRDNORM
;
827 /*====================================================================*/
829 static int ds_ioctl(struct inode
*inode
, struct file
*file
,
830 u_int cmd
, u_long arg
)
832 struct pcmcia_socket
*s
;
833 void __user
*uarg
= (char __user
*)arg
;
839 pr_debug("ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode
), cmd
, arg
);
841 user
= file
->private_data
;
842 if (CHECK_USER(user
))
846 if (s
->pcmcia_state
.dead
)
849 size
= (cmd
& IOCSIZE_MASK
) >> IOCSIZE_SHIFT
;
850 if (size
> sizeof(ds_ioctl_arg_t
))
853 /* Permission check */
854 if (!(cmd
& IOC_OUT
) && !capable(CAP_SYS_ADMIN
))
858 if (!access_ok(VERIFY_READ
, uarg
, size
)) {
859 pr_debug("ds_ioctl(): verify_read = %d\n", -EFAULT
);
864 if (!access_ok(VERIFY_WRITE
, uarg
, size
)) {
865 pr_debug("ds_ioctl(): verify_write = %d\n", -EFAULT
);
869 buf
= kmalloc(sizeof(ds_ioctl_arg_t
), GFP_KERNEL
);
876 if (__copy_from_user((char *)buf
, uarg
, size
)) {
883 case DS_ADJUST_RESOURCE_INFO
:
884 ret
= pcmcia_adjust_resource_info(&buf
->adjust
);
886 case DS_GET_CONFIGURATION_INFO
:
887 if (buf
->config
.Function
&&
888 (buf
->config
.Function
>= s
->functions
))
891 struct pcmcia_device
*p_dev
= get_pcmcia_device(s
, buf
->config
.Function
);
892 ret
= pccard_get_configuration_info(s
, p_dev
, &buf
->config
);
893 pcmcia_put_dev(p_dev
);
896 case DS_GET_FIRST_TUPLE
:
897 mutex_lock(&s
->skt_mutex
);
898 pcmcia_validate_mem(s
);
899 mutex_unlock(&s
->skt_mutex
);
900 ret
= pccard_get_first_tuple(s
, BIND_FN_ALL
, &buf
->tuple
);
902 case DS_GET_NEXT_TUPLE
:
903 ret
= pccard_get_next_tuple(s
, BIND_FN_ALL
, &buf
->tuple
);
905 case DS_GET_TUPLE_DATA
:
906 buf
->tuple
.TupleData
= buf
->tuple_parse
.data
;
907 buf
->tuple
.TupleDataMax
= sizeof(buf
->tuple_parse
.data
);
908 ret
= pccard_get_tuple_data(s
, &buf
->tuple
);
911 buf
->tuple
.TupleData
= buf
->tuple_parse
.data
;
912 ret
= pcmcia_parse_tuple(&buf
->tuple
, &buf
->tuple_parse
.parse
);
915 ret
= pcmcia_reset_card(s
);
918 if (buf
->status
.Function
&&
919 (buf
->status
.Function
>= s
->functions
))
922 struct pcmcia_device
*p_dev
= get_pcmcia_device(s
, buf
->status
.Function
);
923 ret
= pccard_get_status(s
, p_dev
, &buf
->status
);
924 pcmcia_put_dev(p_dev
);
927 case DS_VALIDATE_CIS
:
928 mutex_lock(&s
->skt_mutex
);
929 pcmcia_validate_mem(s
);
930 mutex_unlock(&s
->skt_mutex
);
931 ret
= pccard_validate_cis(s
, &buf
->cisinfo
.Chains
);
933 case DS_SUSPEND_CARD
:
934 ret
= pcmcia_suspend_card(s
);
937 ret
= pcmcia_resume_card(s
);
940 err
= pcmcia_eject_card(s
);
943 err
= pcmcia_insert_card(s
);
945 case DS_ACCESS_CONFIGURATION_REGISTER
:
946 if ((buf
->conf_reg
.Action
== CS_WRITE
) && !capable(CAP_SYS_ADMIN
)) {
953 if (!(buf
->conf_reg
.Function
&&
954 (buf
->conf_reg
.Function
>= s
->functions
))) {
955 struct pcmcia_device
*p_dev
= get_pcmcia_device(s
, buf
->conf_reg
.Function
);
957 ret
= pcmcia_access_configuration_register(p_dev
, &buf
->conf_reg
);
958 pcmcia_put_dev(p_dev
);
962 case DS_GET_FIRST_REGION
:
963 case DS_GET_NEXT_REGION
:
965 if (!capable(CAP_SYS_ADMIN
)) {
969 printk_once(KERN_WARNING
970 "2.6. kernels use pcmciamtd instead of memory_cs.c and do not require special\n");
971 printk_once(KERN_WARNING
"MTD handling any more.\n");
976 case DS_GET_FIRST_WINDOW
:
977 ret
= pcmcia_get_window(s
, &buf
->win_info
.handle
, 1,
978 &buf
->win_info
.window
);
980 case DS_GET_NEXT_WINDOW
:
981 ret
= pcmcia_get_window(s
, &buf
->win_info
.handle
,
982 buf
->win_info
.handle
+ 1, &buf
->win_info
.window
);
984 case DS_GET_MEM_PAGE
:
985 ret
= pcmcia_get_mem_page(s
, buf
->win_info
.handle
,
989 ret
= pcmcia_replace_cis(s
, buf
->cisdump
.Data
, buf
->cisdump
.Length
);
991 case DS_BIND_REQUEST
:
992 if (!capable(CAP_SYS_ADMIN
)) {
996 err
= bind_request(s
, &buf
->bind_info
);
998 case DS_GET_DEVICE_INFO
:
999 err
= get_device_info(s
, &buf
->bind_info
, 1);
1001 case DS_GET_NEXT_DEVICE
:
1002 err
= get_device_info(s
, &buf
->bind_info
, 0);
1004 case DS_UNBIND_REQUEST
:
1011 if ((err
== 0) && (ret
!= 0)) {
1012 pr_debug("ds_ioctl: ret = %d\n", ret
);
1021 err
= -ENOSPC
; break;
1023 err
= -ENODATA
; break;
1029 if (cmd
& IOC_OUT
) {
1030 if (__copy_to_user(uarg
, (char *)buf
, size
))
1039 /*====================================================================*/
1041 static const struct file_operations ds_fops
= {
1042 .owner
= THIS_MODULE
,
1044 .release
= ds_release
,
1051 void __init
pcmcia_setup_ioctl(void)
1055 /* Set up character device for user mode clients */
1056 i
= register_chrdev(0, "pcmcia", &ds_fops
);
1058 printk(KERN_NOTICE
"unable to find a free device # for "
1059 "Driver Services (error=%d)\n", i
);
1063 #ifdef CONFIG_PROC_FS
1064 proc_pccard
= proc_mkdir("bus/pccard", NULL
);
1066 proc_create("drivers", 0, proc_pccard
, &pccard_drivers_proc_fops
);
1071 void __exit
pcmcia_cleanup_ioctl(void)
1073 #ifdef CONFIG_PROC_FS
1075 remove_proc_entry("drivers", proc_pccard
);
1076 remove_proc_entry("bus/pccard", NULL
);
1079 if (major_dev
!= -1)
1080 unregister_chrdev(major_dev
, "pcmcia");