]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/pcmcia/pcmcia_ioctl.c
drm/radeon/kms: Forbid creation of framebuffer with no valid GEM object
[mirror_ubuntu-bionic-kernel.git] / drivers / pcmcia / pcmcia_ioctl.c
CommitLineData
e7a480d2
DB
1/*
2 * pcmcia_ioctl.c -- ioctl interface for cardmgr and cardctl
3 *
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.
7 *
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.
11 *
12 * (C) 1999 David A. Hinds
13 * (C) 2003 - 2004 Dominik Brodowski
14 */
15
16/*
17 * This file will go away soon.
18 */
19
20
3b659fb8 21#include <linux/kernel.h>
e7a480d2 22#include <linux/module.h>
e7a480d2 23#include <linux/init.h>
e7a480d2 24#include <linux/major.h>
e7a480d2 25#include <linux/errno.h>
e7a480d2
DB
26#include <linux/ioctl.h>
27#include <linux/proc_fs.h>
28#include <linux/poll.h>
29#include <linux/pci.h>
e6be4a8c 30#include <linux/seq_file.h>
0bec0bba 31#include <linux/smp_lock.h>
e7a480d2 32#include <linux/workqueue.h>
e7a480d2 33
e7a480d2
DB
34#include <pcmcia/cs_types.h>
35#include <pcmcia/cs.h>
e7a480d2 36#include <pcmcia/cistpl.h>
4aeba013 37#include <pcmcia/cisreg.h>
e7a480d2
DB
38#include <pcmcia/ds.h>
39#include <pcmcia/ss.h>
40
41#include "cs_internal.h"
e7a480d2
DB
42
43static int major_dev = -1;
44
45
46/* Device user information */
47#define MAX_EVENTS 32
48#define USER_MAGIC 0x7ea4
49#define CHECK_USER(u) \
50 (((u) == NULL) || ((u)->user_magic != USER_MAGIC))
51
52typedef struct user_info_t {
53 u_int user_magic;
54 int event_head, event_tail;
55 event_t event[MAX_EVENTS];
56 struct user_info_t *next;
dc109497 57 struct pcmcia_socket *socket;
e7a480d2
DB
58} user_info_t;
59
60
7d16b658 61#ifdef CONFIG_PCMCIA_DEBUG
e7a480d2 62extern int ds_pc_debug;
e7a480d2
DB
63
64#define ds_dbg(lvl, fmt, arg...) do { \
65 if (ds_pc_debug >= lvl) \
66 printk(KERN_DEBUG "ds: " fmt , ## arg); \
67} while (0)
68#else
69#define ds_dbg(lvl, fmt, arg...) do { } while (0)
70#endif
71
855cdf13
DB
72static struct pcmcia_device *get_pcmcia_device(struct pcmcia_socket *s,
73 unsigned int function)
74{
75 struct pcmcia_device *p_dev = NULL;
76 unsigned long flags;
77
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);
83 }
84 }
85 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
86 return NULL;
87}
e7a480d2 88
e7a480d2
DB
89/* backwards-compatible accessing of driver --- by name! */
90
855cdf13 91static struct pcmcia_driver *get_pcmcia_driver(dev_info_t *dev_info)
e7a480d2
DB
92{
93 struct device_driver *drv;
94 struct pcmcia_driver *p_drv;
95
96 drv = driver_find((char *) dev_info, &pcmcia_bus_type);
97 if (!drv)
98 return NULL;
99
100 p_drv = container_of(drv, struct pcmcia_driver, drv);
101
102 return (p_drv);
103}
104
105
106#ifdef CONFIG_PROC_FS
107static struct proc_dir_entry *proc_pccard = NULL;
108
e6be4a8c 109static int proc_read_drivers_callback(struct device_driver *driver, void *_m)
e7a480d2 110{
e6be4a8c 111 struct seq_file *m = _m;
e7a480d2
DB
112 struct pcmcia_driver *p_drv = container_of(driver,
113 struct pcmcia_driver, drv);
114
e6be4a8c 115 seq_printf(m, "%-24.24s 1 %d\n", p_drv->drv.name,
e7a480d2
DB
116#ifdef CONFIG_MODULE_UNLOAD
117 (p_drv->owner) ? module_refcount(p_drv->owner) : 1
118#else
119 1
120#endif
121 );
e7a480d2
DB
122 return 0;
123}
124
e6be4a8c 125static int pccard_drivers_proc_show(struct seq_file *m, void *v)
e7a480d2 126{
e6be4a8c
AD
127 return bus_for_each_drv(&pcmcia_bus_type, NULL,
128 m, proc_read_drivers_callback);
129}
e7a480d2 130
e6be4a8c
AD
131static int pccard_drivers_proc_open(struct inode *inode, struct file *file)
132{
133 return single_open(file, pccard_drivers_proc_show, NULL);
e7a480d2 134}
e6be4a8c
AD
135
136static const struct file_operations pccard_drivers_proc_fops = {
137 .owner = THIS_MODULE,
138 .open = pccard_drivers_proc_open,
139 .read = seq_read,
140 .llseek = seq_lseek,
141 .release = single_release,
142};
e7a480d2
DB
143#endif
144
c5023801
DB
145
146#ifdef CONFIG_PCMCIA_PROBE
147
148static int adjust_irq(struct pcmcia_socket *s, adjust_t *adj)
149{
150 int irq;
151 u32 mask;
152
153 irq = adj->resource.irq.IRQ;
154 if ((irq < 0) || (irq > 15))
69ba4433 155 return -EINVAL;
c5023801
DB
156
157 if (adj->Action != REMOVE_MANAGED_RESOURCE)
158 return 0;
159
160 mask = 1 << irq;
161
162 if (!(s->irq_mask & mask))
163 return 0;
164
165 s->irq_mask &= ~mask;
166
167 return 0;
168}
169
170#else
171
172static inline int adjust_irq(struct pcmcia_socket *s, adjust_t *adj) {
4c89e88b 173 return 0;
c5023801
DB
174}
175
176#endif
177
178static int pcmcia_adjust_resource_info(adjust_t *adj)
179{
180 struct pcmcia_socket *s;
de6405e9 181 int ret = -ENOSYS;
c5023801
DB
182 unsigned long flags;
183
184 down_read(&pcmcia_socket_list_rwsem);
185 list_for_each_entry(s, &pcmcia_socket_list, socket_list) {
186
187 if (adj->Resource == RES_IRQ)
188 ret = adjust_irq(s, adj);
189
190 else if (s->resource_ops->add_io) {
191 unsigned long begin, end;
192
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);
199 continue;
200 } else if (!(s->resource_setup_old))
201 s->resource_setup_old = 1;
202 spin_unlock_irqrestore(&s->lock, flags);
203
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);
210 case RES_IO_RANGE:
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);
215 }
216 if (!ret) {
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
220 * one... */
221 spin_lock_irqsave(&s->lock, flags);
222 s->resource_setup_done = 1;
223 spin_unlock_irqrestore(&s->lock, flags);
224 }
225 }
226 }
227 up_read(&pcmcia_socket_list_rwsem);
228
229 return (ret);
230}
231
4aeba013
DB
232/** pccard_get_status
233 *
234 * Get the current socket state bits. We don't support the latched
235 * SocketState yet: I haven't seen any point for it.
236 */
237
238static int pccard_get_status(struct pcmcia_socket *s,
239 struct pcmcia_device *p_dev,
240 cs_status_t *status)
241{
242 config_t *c;
243 int val;
244
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))
3939c1ef 254 return -ENODEV;
4aeba013
DB
255
256 c = (p_dev) ? p_dev->function_config : NULL;
257
258 if ((c != NULL) && (c->state & CONFIG_LOCKED) &&
259 (c->IntType & (INT_MEMORY_AND_IO | INT_ZOOMED_VIDEO))) {
260 u_char reg;
261 if (c->CardValues & PRESENT_PIN_REPLACE) {
262 pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, &reg);
263 status->CardState |=
264 (reg & PRR_WP_STATUS) ? CS_EVENT_WRITE_PROTECT : 0;
265 status->CardState |=
266 (reg & PRR_READY_STATUS) ? CS_EVENT_READY_CHANGE : 0;
267 status->CardState |=
268 (reg & PRR_BVD2_STATUS) ? CS_EVENT_BATTERY_LOW : 0;
269 status->CardState |=
270 (reg & PRR_BVD1_STATUS) ? CS_EVENT_BATTERY_DEAD : 0;
271 } else {
272 /* No PRR? Then assume we're always ready */
273 status->CardState |= CS_EVENT_READY_CHANGE;
274 }
275 if (c->CardValues & PRESENT_EXT_STATUS) {
276 pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_ESR)>>1, 1, &reg);
277 status->CardState |=
278 (reg & ESR_REQ_ATTN) ? CS_EVENT_REQUEST_ATTENTION : 0;
279 }
4c89e88b 280 return 0;
4aeba013
DB
281 }
282 status->CardState |=
283 (val & SS_WRPROT) ? CS_EVENT_WRITE_PROTECT : 0;
284 status->CardState |=
285 (val & SS_BATDEAD) ? CS_EVENT_BATTERY_DEAD : 0;
286 status->CardState |=
287 (val & SS_BATWARN) ? CS_EVENT_BATTERY_LOW : 0;
288 status->CardState |=
289 (val & SS_READY) ? CS_EVENT_READY_CHANGE : 0;
4c89e88b 290 return 0;
4aeba013 291} /* pccard_get_status */
c5023801 292
a0779327 293static int pccard_get_configuration_info(struct pcmcia_socket *s,
64f34642
DB
294 struct pcmcia_device *p_dev,
295 config_info_t *config)
296{
297 config_t *c;
298
299 if (!(s->state & SOCKET_PRESENT))
3939c1ef 300 return -ENODEV;
64f34642
DB
301
302
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;
315 if (s->io[0].res) {
316 config->BasePort1 = s->io[0].res->start;
317 config->NumPorts1 = s->io[0].res->end -
318 config->BasePort1 + 1;
319 }
320 }
4c89e88b 321 return 0;
64f34642
DB
322 }
323#endif
324
325 if (p_dev) {
326 c = p_dev->function_config;
327 config->Function = p_dev->func;
328 } else {
329 c = NULL;
330 config->Function = 0;
331 }
332
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;
4c89e88b 337 return 0;
64f34642
DB
338 }
339
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;
360
4c89e88b 361 return 0;
64f34642
DB
362} /* pccard_get_configuration_info */
363
364
e7a480d2
DB
365/*======================================================================
366
367 These manage a ring buffer of events pending for one user process
368
369======================================================================*/
370
371
372static int queue_empty(user_info_t *user)
373{
374 return (user->event_head == user->event_tail);
375}
376
377static event_t get_queued_event(user_info_t *user)
378{
379 user->event_tail = (user->event_tail+1) % MAX_EVENTS;
380 return user->event[user->event_tail];
381}
382
383static void queue_event(user_info_t *user, event_t event)
384{
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;
389}
390
dc109497 391void handle_event(struct pcmcia_socket *s, event_t event)
e7a480d2
DB
392{
393 user_info_t *user;
394 for (user = s->user; user; user = user->next)
395 queue_event(user, event);
396 wake_up_interruptible(&s->queue);
397}
398
399
400/*======================================================================
401
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:
405
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.
410
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.
415
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.
420
421======================================================================*/
422
dc109497 423static int bind_request(struct pcmcia_socket *s, bind_info_t *bind_info)
e7a480d2
DB
424{
425 struct pcmcia_driver *p_drv;
426 struct pcmcia_device *p_dev;
427 int ret = 0;
428 unsigned long flags;
429
dc109497 430 s = pcmcia_get_socket(s);
e7a480d2
DB
431 if (!s)
432 return -EINVAL;
433
dc109497 434 ds_dbg(2, "bind_request(%d, '%s')\n", s->sock,
e7a480d2
DB
435 (char *)bind_info->dev_info);
436
437 p_drv = get_pcmcia_driver(&bind_info->dev_info);
438 if (!p_drv) {
439 ret = -EINVAL;
440 goto err_put;
441 }
442
443 if (!try_module_get(p_drv->owner)) {
444 ret = -EINVAL;
445 goto err_put_driver;
446 }
447
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);
fd238232 458 bind_info->instance = p_dev;
e7a480d2
DB
459 ret = -EBUSY;
460 goto err_put_module;
461 } else {
462 /* the correct driver managed to bind
463 * itself magically to the correct
464 * device. */
465 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
466 p_dev->cardmgr = p_drv;
467 ret = 0;
468 goto err_put_module;
469 }
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);
475 goto rescan;
476 }
477 }
478 }
479 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
480
481 p_dev = pcmcia_device_add(s, bind_info->function);
482 if (!p_dev) {
483 ret = -EIO;
484 goto err_put_module;
485 }
486
487rescan:
488 p_dev->cardmgr = p_drv;
489
490 /* if a driver is already running, we can abort */
491 if (p_dev->dev.driver)
492 goto err_put_module;
493
494 /*
495 * Prevent this racing with a card insertion.
496 */
7fe908dd 497 mutex_lock(&s->skt_mutex);
4deb7c1e 498 ret = bus_rescan_devices(&pcmcia_bus_type);
7fe908dd 499 mutex_unlock(&s->skt_mutex);
4deb7c1e
JG
500 if (ret)
501 goto err_put_module;
e7a480d2
DB
502
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
505 * paths...
506 */
507 if (!(p_dev->dev.driver == &p_drv->drv))
508 p_dev->cardmgr = NULL;
509
510 err_put_module:
511 module_put(p_drv->owner);
512 err_put_driver:
513 put_driver(&p_drv->drv);
514 err_put:
dc109497 515 pcmcia_put_socket(s);
e7a480d2
DB
516
517 return (ret);
518} /* bind_request */
519
33519ddd
DB
520#ifdef CONFIG_CARDBUS
521
522static struct pci_bus *pcmcia_lookup_bus(struct pcmcia_socket *s)
523{
524 if (!s || !(s->state & SOCKET_CARDBUS))
525 return NULL;
e7a480d2 526
33519ddd
DB
527 return s->cb_dev->subordinate;
528}
529#endif
e7a480d2 530
dc109497 531static int get_device_info(struct pcmcia_socket *s, bind_info_t *bind_info, int first)
e7a480d2
DB
532{
533 dev_node_t *node;
534 struct pcmcia_device *p_dev;
e2d40963 535 struct pcmcia_driver *p_drv;
e7a480d2
DB
536 unsigned long flags;
537 int ret = 0;
538
539#ifdef CONFIG_CARDBUS
540 /*
541 * Some unbelievably ugly code to associate the PCI cardbus
542 * device and its driver with the PCMCIA "bind" information.
543 */
544 {
545 struct pci_bus *bus;
546
dc109497 547 bus = pcmcia_lookup_bus(s);
e7a480d2
DB
548 if (bus) {
549 struct list_head *list;
550 struct pci_dev *dev = NULL;
551
552 list = bus->devices.next;
553 while (list != &bus->devices) {
554 struct pci_dev *pdev = pci_dev_b(list);
555 list = list->next;
556
557 if (first) {
558 dev = pdev;
559 break;
560 }
561
562 /* Try to handle "next" here some way? */
563 }
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;
569 return 0;
570 }
571 }
572 }
573#endif
574
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);
579 if (!p_dev)
580 continue;
581 goto found;
582 }
583 }
584 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
585 return -ENODEV;
586
587 found:
588 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
589
e2d40963
DB
590 p_drv = to_pcmcia_drv(p_dev->dev.driver);
591 if (p_drv && !p_dev->_locked) {
e7a480d2
DB
592 ret = -EAGAIN;
593 goto err_put;
594 }
595
596 if (first)
fd238232 597 node = p_dev->dev_node;
e7a480d2 598 else
fd238232 599 for (node = p_dev->dev_node; node; node = node->next)
e7a480d2
DB
600 if (node == bind_info->next)
601 break;
602 if (!node) {
603 ret = -ENODEV;
604 goto err_put;
605 }
606
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;
611
612 err_put:
613 pcmcia_put_dev(p_dev);
614 return (ret);
615} /* get_device_info */
616
617
618static int ds_open(struct inode *inode, struct file *file)
619{
620 socket_t i = iminor(inode);
dc109497 621 struct pcmcia_socket *s;
e7a480d2 622 user_info_t *user;
c352ec8a 623 static int warning_printed = 0;
0bec0bba 624 int ret = 0;
e7a480d2
DB
625
626 ds_dbg(0, "ds_open(socket %d)\n", i);
627
0bec0bba 628 lock_kernel();
dc109497 629 s = pcmcia_get_socket_by_nr(i);
0bec0bba
JC
630 if (!s) {
631 ret = -ENODEV;
632 goto out;
633 }
dc109497 634 s = pcmcia_get_socket(s);
0bec0bba
JC
635 if (!s) {
636 ret = -ENODEV;
637 goto out;
638 }
e7a480d2
DB
639
640 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
b5e43913 641 if (s->pcmcia_state.busy) {
dc109497 642 pcmcia_put_socket(s);
0bec0bba
JC
643 ret = -EBUSY;
644 goto out;
e7a480d2
DB
645 }
646 else
b5e43913 647 s->pcmcia_state.busy = 1;
e7a480d2
DB
648 }
649
650 user = kmalloc(sizeof(user_info_t), GFP_KERNEL);
651 if (!user) {
dc109497 652 pcmcia_put_socket(s);
0bec0bba
JC
653 ret = -ENOMEM;
654 goto out;
e7a480d2
DB
655 }
656 user->event_tail = user->event_head = 0;
657 user->next = s->user;
658 user->user_magic = USER_MAGIC;
659 user->socket = s;
660 s->user = user;
661 file->private_data = user;
662
c352ec8a
DB
663 if (!warning_printed) {
664 printk(KERN_INFO "pcmcia: Detected deprecated PCMCIA ioctl "
73d58588 665 "usage from process: %s.\n", current->comm);
c352ec8a
DB
666 printk(KERN_INFO "pcmcia: This interface will soon be removed from "
667 "the kernel; please expect breakage unless you upgrade "
668 "to new tools.\n");
669 printk(KERN_INFO "pcmcia: see http://www.kernel.org/pub/linux/"
670 "utils/kernel/pcmcia/pcmcia.html for details.\n");
671 warning_printed = 1;
672 }
673
b5e43913 674 if (s->pcmcia_state.present)
e7a480d2 675 queue_event(user, CS_EVENT_CARD_INSERTION);
0bec0bba
JC
676out:
677 unlock_kernel();
678 return ret;
e7a480d2
DB
679} /* ds_open */
680
681/*====================================================================*/
682
683static int ds_release(struct inode *inode, struct file *file)
684{
dc109497 685 struct pcmcia_socket *s;
e7a480d2
DB
686 user_info_t *user, **link;
687
688 ds_dbg(0, "ds_release(socket %d)\n", iminor(inode));
689
690 user = file->private_data;
691 if (CHECK_USER(user))
692 goto out;
693
694 s = user->socket;
695
696 /* Unlink user data structure */
697 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
b5e43913 698 s->pcmcia_state.busy = 0;
e7a480d2
DB
699 }
700 file->private_data = NULL;
701 for (link = &s->user; *link; link = &(*link)->next)
702 if (*link == user) break;
703 if (link == NULL)
704 goto out;
705 *link = user->next;
706 user->user_magic = 0;
707 kfree(user);
dc109497 708 pcmcia_put_socket(s);
e7a480d2
DB
709out:
710 return 0;
711} /* ds_release */
712
713/*====================================================================*/
714
715static ssize_t ds_read(struct file *file, char __user *buf,
716 size_t count, loff_t *ppos)
717{
dc109497 718 struct pcmcia_socket *s;
e7a480d2
DB
719 user_info_t *user;
720 int ret;
721
40fad04b 722 ds_dbg(2, "ds_read(socket %d)\n", iminor(file->f_path.dentry->d_inode));
e7a480d2
DB
723
724 if (count < 4)
725 return -EINVAL;
726
727 user = file->private_data;
728 if (CHECK_USER(user))
729 return -EIO;
730
731 s = user->socket;
b5e43913 732 if (s->pcmcia_state.dead)
e7a480d2
DB
733 return -EIO;
734
735 ret = wait_event_interruptible(s->queue, !queue_empty(user));
736 if (ret == 0)
737 ret = put_user(get_queued_event(user), (int __user *)buf) ? -EFAULT : 4;
738
739 return ret;
740} /* ds_read */
741
742/*====================================================================*/
743
744static ssize_t ds_write(struct file *file, const char __user *buf,
745 size_t count, loff_t *ppos)
746{
40fad04b 747 ds_dbg(2, "ds_write(socket %d)\n", iminor(file->f_path.dentry->d_inode));
e7a480d2
DB
748
749 if (count != 4)
750 return -EINVAL;
751 if ((file->f_flags & O_ACCMODE) == O_RDONLY)
752 return -EBADF;
753
754 return -EIO;
755} /* ds_write */
756
757/*====================================================================*/
758
759/* No kernel lock - fine */
760static u_int ds_poll(struct file *file, poll_table *wait)
761{
dc109497 762 struct pcmcia_socket *s;
e7a480d2
DB
763 user_info_t *user;
764
40fad04b 765 ds_dbg(2, "ds_poll(socket %d)\n", iminor(file->f_path.dentry->d_inode));
e7a480d2
DB
766
767 user = file->private_data;
768 if (CHECK_USER(user))
769 return POLLERR;
770 s = user->socket;
771 /*
772 * We don't check for a dead socket here since that
773 * will send cardmgr into an endless spin.
774 */
775 poll_wait(file, &s->queue, wait);
776 if (!queue_empty(user))
777 return POLLIN | POLLRDNORM;
778 return 0;
779} /* ds_poll */
780
781/*====================================================================*/
782
e7a480d2
DB
783static int ds_ioctl(struct inode * inode, struct file * file,
784 u_int cmd, u_long arg)
785{
dc109497 786 struct pcmcia_socket *s;
e7a480d2
DB
787 void __user *uarg = (char __user *)arg;
788 u_int size;
789 int ret, err;
790 ds_ioctl_arg_t *buf;
791 user_info_t *user;
792
793 ds_dbg(2, "ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
794
795 user = file->private_data;
796 if (CHECK_USER(user))
797 return -EIO;
798
799 s = user->socket;
b5e43913 800 if (s->pcmcia_state.dead)
e7a480d2
DB
801 return -EIO;
802
803 size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT;
804 if (size > sizeof(ds_ioctl_arg_t)) return -EINVAL;
805
806 /* Permission check */
807 if (!(cmd & IOC_OUT) && !capable(CAP_SYS_ADMIN))
808 return -EPERM;
809
810 if (cmd & IOC_IN) {
811 if (!access_ok(VERIFY_READ, uarg, size)) {
812 ds_dbg(3, "ds_ioctl(): verify_read = %d\n", -EFAULT);
813 return -EFAULT;
814 }
815 }
816 if (cmd & IOC_OUT) {
817 if (!access_ok(VERIFY_WRITE, uarg, size)) {
818 ds_dbg(3, "ds_ioctl(): verify_write = %d\n", -EFAULT);
819 return -EFAULT;
820 }
821 }
822 buf = kmalloc(sizeof(ds_ioctl_arg_t), GFP_KERNEL);
823 if (!buf)
824 return -ENOMEM;
825
826 err = ret = 0;
827
9374074f
DB
828 if (cmd & IOC_IN) {
829 if (__copy_from_user((char *)buf, uarg, size)) {
830 err = -EFAULT;
831 goto free_out;
832 }
833 }
e7a480d2
DB
834
835 switch (cmd) {
836 case DS_ADJUST_RESOURCE_INFO:
837 ret = pcmcia_adjust_resource_info(&buf->adjust);
838 break;
e7a480d2
DB
839 case DS_GET_CONFIGURATION_INFO:
840 if (buf->config.Function &&
dc109497 841 (buf->config.Function >= s->functions))
926c5402 842 ret = -EINVAL;
855cdf13
DB
843 else {
844 struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->config.Function);
f47ad214
DR
845 ret = pccard_get_configuration_info(s, p_dev, &buf->config);
846 pcmcia_put_dev(p_dev);
855cdf13 847 }
e7a480d2
DB
848 break;
849 case DS_GET_FIRST_TUPLE:
7fe908dd 850 mutex_lock(&s->skt_mutex);
dc109497 851 pcmcia_validate_mem(s);
7fe908dd 852 mutex_unlock(&s->skt_mutex);
dc109497 853 ret = pccard_get_first_tuple(s, BIND_FN_ALL, &buf->tuple);
e7a480d2
DB
854 break;
855 case DS_GET_NEXT_TUPLE:
dc109497 856 ret = pccard_get_next_tuple(s, BIND_FN_ALL, &buf->tuple);
e7a480d2
DB
857 break;
858 case DS_GET_TUPLE_DATA:
859 buf->tuple.TupleData = buf->tuple_parse.data;
860 buf->tuple.TupleDataMax = sizeof(buf->tuple_parse.data);
dc109497 861 ret = pccard_get_tuple_data(s, &buf->tuple);
e7a480d2
DB
862 break;
863 case DS_PARSE_TUPLE:
864 buf->tuple.TupleData = buf->tuple_parse.data;
2f3061eb 865 ret = pcmcia_parse_tuple(&buf->tuple, &buf->tuple_parse.parse);
e7a480d2
DB
866 break;
867 case DS_RESET_CARD:
994917f8 868 ret = pcmcia_reset_card(s);
e7a480d2
DB
869 break;
870 case DS_GET_STATUS:
855cdf13
DB
871 if (buf->status.Function &&
872 (buf->status.Function >= s->functions))
926c5402 873 ret = -EINVAL;
855cdf13
DB
874 else {
875 struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->status.Function);
f47ad214
DR
876 ret = pccard_get_status(s, p_dev, &buf->status);
877 pcmcia_put_dev(p_dev);
855cdf13
DB
878 }
879 break;
e7a480d2 880 case DS_VALIDATE_CIS:
7fe908dd 881 mutex_lock(&s->skt_mutex);
dc109497 882 pcmcia_validate_mem(s);
7fe908dd 883 mutex_unlock(&s->skt_mutex);
84897fc0 884 ret = pccard_validate_cis(s, &buf->cisinfo.Chains);
e7a480d2
DB
885 break;
886 case DS_SUSPEND_CARD:
dc109497 887 ret = pcmcia_suspend_card(s);
e7a480d2
DB
888 break;
889 case DS_RESUME_CARD:
dc109497 890 ret = pcmcia_resume_card(s);
e7a480d2
DB
891 break;
892 case DS_EJECT_CARD:
dc109497 893 err = pcmcia_eject_card(s);
e7a480d2
DB
894 break;
895 case DS_INSERT_CARD:
dc109497 896 err = pcmcia_insert_card(s);
e7a480d2
DB
897 break;
898 case DS_ACCESS_CONFIGURATION_REGISTER:
899 if ((buf->conf_reg.Action == CS_WRITE) && !capable(CAP_SYS_ADMIN)) {
900 err = -EPERM;
901 goto free_out;
902 }
855cdf13 903
926c5402 904 ret = -EINVAL;
855cdf13
DB
905
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);
73d58588 909 if (p_dev) {
855cdf13 910 ret = pcmcia_access_configuration_register(p_dev, &buf->conf_reg);
73d58588
BH
911 pcmcia_put_dev(p_dev);
912 }
855cdf13 913 }
e7a480d2
DB
914 break;
915 case DS_GET_FIRST_REGION:
916 case DS_GET_NEXT_REGION:
917 case DS_BIND_MTD:
918 if (!capable(CAP_SYS_ADMIN)) {
919 err = -EPERM;
920 goto free_out;
921 } else {
a9c56953
MK
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");
e7a480d2
DB
925 }
926 err = -EINVAL;
927 goto free_out;
928 break;
929 case DS_GET_FIRST_WINDOW:
dc109497 930 ret = pcmcia_get_window(s, &buf->win_info.handle, 0,
e7a480d2
DB
931 &buf->win_info.window);
932 break;
933 case DS_GET_NEXT_WINDOW:
dc109497 934 ret = pcmcia_get_window(s, &buf->win_info.handle,
e7a480d2
DB
935 buf->win_info.handle->index + 1, &buf->win_info.window);
936 break;
937 case DS_GET_MEM_PAGE:
938 ret = pcmcia_get_mem_page(buf->win_info.handle,
939 &buf->win_info.map);
940 break;
941 case DS_REPLACE_CIS:
53efec95 942 ret = pcmcia_replace_cis(s, buf->cisdump.Data, buf->cisdump.Length);
e7a480d2
DB
943 break;
944 case DS_BIND_REQUEST:
945 if (!capable(CAP_SYS_ADMIN)) {
946 err = -EPERM;
947 goto free_out;
948 }
949 err = bind_request(s, &buf->bind_info);
950 break;
951 case DS_GET_DEVICE_INFO:
952 err = get_device_info(s, &buf->bind_info, 1);
953 break;
954 case DS_GET_NEXT_DEVICE:
955 err = get_device_info(s, &buf->bind_info, 0);
956 break;
957 case DS_UNBIND_REQUEST:
958 err = 0;
959 break;
960 default:
961 err = -EINVAL;
962 }
963
4c89e88b 964 if ((err == 0) && (ret != 0)) {
e7a480d2
DB
965 ds_dbg(2, "ds_ioctl: ret = %d\n", ret);
966 switch (ret) {
610e2374
DB
967 case -ENODEV:
968 case -EINVAL:
969 case -EBUSY:
970 case -ENOSYS:
971 err = ret;
972 break;
610e2374 973 case -ENOMEM:
e7a480d2 974 err = -ENOSPC; break;
635d19be 975 case -ENOSPC:
e7a480d2 976 err = -ENODATA; break;
e7a480d2
DB
977 default:
978 err = -EIO; break;
979 }
980 }
981
982 if (cmd & IOC_OUT) {
983 if (__copy_to_user(uarg, (char *)buf, size))
984 err = -EFAULT;
985 }
986
987free_out:
988 kfree(buf);
989 return err;
990} /* ds_ioctl */
991
992/*====================================================================*/
993
d54b1fdb 994static const struct file_operations ds_fops = {
e7a480d2
DB
995 .owner = THIS_MODULE,
996 .open = ds_open,
997 .release = ds_release,
998 .ioctl = ds_ioctl,
999 .read = ds_read,
1000 .write = ds_write,
1001 .poll = ds_poll,
1002};
1003
1004void __init pcmcia_setup_ioctl(void) {
1005 int i;
1006
1007 /* Set up character device for user mode clients */
1008 i = register_chrdev(0, "pcmcia", &ds_fops);
1a8ceafc 1009 if (i < 0)
e7a480d2 1010 printk(KERN_NOTICE "unable to find a free device # for "
1a8ceafc 1011 "Driver Services (error=%d)\n", i);
e7a480d2
DB
1012 else
1013 major_dev = i;
1014
1015#ifdef CONFIG_PROC_FS
97094dcf 1016 proc_pccard = proc_mkdir("bus/pccard", NULL);
e7a480d2 1017 if (proc_pccard)
e6be4a8c 1018 proc_create("drivers", 0, proc_pccard, &pccard_drivers_proc_fops);
e7a480d2
DB
1019#endif
1020}
1021
1022
1023void __exit pcmcia_cleanup_ioctl(void) {
1024#ifdef CONFIG_PROC_FS
1025 if (proc_pccard) {
1026 remove_proc_entry("drivers", proc_pccard);
97094dcf 1027 remove_proc_entry("bus/pccard", NULL);
e7a480d2
DB
1028 }
1029#endif
1030 if (major_dev != -1)
1031 unregister_chrdev(major_dev, "pcmcia");
1032}