blob: f657a2a77b2b521f01c026357c168636cde582d1 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * ds.c -- 16-bit PCMCIA core support
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#include <linux/config.h>
17#include <linux/module.h>
18#include <linux/moduleparam.h>
19#include <linux/init.h>
20#include <linux/kernel.h>
21#include <linux/major.h>
22#include <linux/string.h>
23#include <linux/errno.h>
24#include <linux/slab.h>
25#include <linux/mm.h>
26#include <linux/fcntl.h>
27#include <linux/sched.h>
28#include <linux/smp_lock.h>
29#include <linux/timer.h>
30#include <linux/ioctl.h>
31#include <linux/proc_fs.h>
32#include <linux/poll.h>
33#include <linux/pci.h>
34#include <linux/list.h>
35#include <linux/delay.h>
36#include <linux/kref.h>
37#include <linux/workqueue.h>
Dominik Brodowski840c2ac2005-06-27 16:28:04 -070038#include <linux/crc32.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070039
40#include <asm/atomic.h>
41
42#define IN_CARD_SERVICES
43#include <pcmcia/version.h>
44#include <pcmcia/cs_types.h>
45#include <pcmcia/cs.h>
46#include <pcmcia/bulkmem.h>
47#include <pcmcia/cistpl.h>
48#include <pcmcia/ds.h>
49#include <pcmcia/ss.h>
50
51#include "cs_internal.h"
52
53/*====================================================================*/
54
55/* Module parameters */
56
57MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
58MODULE_DESCRIPTION("PCMCIA Driver Services");
59MODULE_LICENSE("GPL");
60
61#ifdef DEBUG
62int ds_pc_debug;
63
64module_param_named(pc_debug, ds_pc_debug, int, 0644);
65
66#define ds_dbg(lvl, fmt, arg...) do { \
67 if (ds_pc_debug > (lvl)) \
68 printk(KERN_DEBUG "ds: " fmt , ## arg); \
69} while (0)
70#else
71#define ds_dbg(lvl, fmt, arg...) do { } while (0)
72#endif
73
74/*====================================================================*/
75
76/* Device user information */
77#define MAX_EVENTS 32
78#define USER_MAGIC 0x7ea4
79#define CHECK_USER(u) \
80 (((u) == NULL) || ((u)->user_magic != USER_MAGIC))
81typedef struct user_info_t {
82 u_int user_magic;
83 int event_head, event_tail;
84 event_t event[MAX_EVENTS];
85 struct user_info_t *next;
86 struct pcmcia_bus_socket *socket;
87} user_info_t;
88
89/* Socket state information */
90struct pcmcia_bus_socket {
91 struct kref refcount;
92 struct pcmcia_callback callback;
93 int state;
94 user_info_t *user;
95 wait_queue_head_t queue;
96 struct pcmcia_socket *parent;
97
98 /* the PCMCIA devices connected to this socket (normally one, more
99 * for multifunction devices: */
100 struct list_head devices_list;
101 u8 device_count; /* the number of devices, used
102 * only internally and subject
103 * to incorrectness and change */
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700104
105 u8 device_add_pending;
106 struct work_struct device_add;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107};
108static spinlock_t pcmcia_dev_list_lock;
109
110#define DS_SOCKET_PRESENT 0x01
111#define DS_SOCKET_BUSY 0x02
112#define DS_SOCKET_REMOVAL_PENDING 0x10
113#define DS_SOCKET_DEAD 0x80
114
115/*====================================================================*/
116
117static int major_dev = -1;
118
119static int unbind_request(struct pcmcia_bus_socket *s);
120
121/*====================================================================*/
122
123/* code which was in cs.c before */
124
125/* String tables for error messages */
126
127typedef struct lookup_t {
128 int key;
129 char *msg;
130} lookup_t;
131
132static const lookup_t error_table[] = {
133 { CS_SUCCESS, "Operation succeeded" },
134 { CS_BAD_ADAPTER, "Bad adapter" },
135 { CS_BAD_ATTRIBUTE, "Bad attribute", },
136 { CS_BAD_BASE, "Bad base address" },
137 { CS_BAD_EDC, "Bad EDC" },
138 { CS_BAD_IRQ, "Bad IRQ" },
139 { CS_BAD_OFFSET, "Bad offset" },
140 { CS_BAD_PAGE, "Bad page number" },
141 { CS_READ_FAILURE, "Read failure" },
142 { CS_BAD_SIZE, "Bad size" },
143 { CS_BAD_SOCKET, "Bad socket" },
144 { CS_BAD_TYPE, "Bad type" },
145 { CS_BAD_VCC, "Bad Vcc" },
146 { CS_BAD_VPP, "Bad Vpp" },
147 { CS_BAD_WINDOW, "Bad window" },
148 { CS_WRITE_FAILURE, "Write failure" },
149 { CS_NO_CARD, "No card present" },
150 { CS_UNSUPPORTED_FUNCTION, "Usupported function" },
151 { CS_UNSUPPORTED_MODE, "Unsupported mode" },
152 { CS_BAD_SPEED, "Bad speed" },
153 { CS_BUSY, "Resource busy" },
154 { CS_GENERAL_FAILURE, "General failure" },
155 { CS_WRITE_PROTECTED, "Write protected" },
156 { CS_BAD_ARG_LENGTH, "Bad argument length" },
157 { CS_BAD_ARGS, "Bad arguments" },
158 { CS_CONFIGURATION_LOCKED, "Configuration locked" },
159 { CS_IN_USE, "Resource in use" },
160 { CS_NO_MORE_ITEMS, "No more items" },
161 { CS_OUT_OF_RESOURCE, "Out of resource" },
162 { CS_BAD_HANDLE, "Bad handle" },
163 { CS_BAD_TUPLE, "Bad CIS tuple" }
164};
165
166
167static const lookup_t service_table[] = {
168 { AccessConfigurationRegister, "AccessConfigurationRegister" },
169 { AddSocketServices, "AddSocketServices" },
170 { AdjustResourceInfo, "AdjustResourceInfo" },
171 { CheckEraseQueue, "CheckEraseQueue" },
172 { CloseMemory, "CloseMemory" },
173 { DeregisterClient, "DeregisterClient" },
174 { DeregisterEraseQueue, "DeregisterEraseQueue" },
175 { GetCardServicesInfo, "GetCardServicesInfo" },
176 { GetClientInfo, "GetClientInfo" },
177 { GetConfigurationInfo, "GetConfigurationInfo" },
178 { GetEventMask, "GetEventMask" },
179 { GetFirstClient, "GetFirstClient" },
180 { GetFirstRegion, "GetFirstRegion" },
181 { GetFirstTuple, "GetFirstTuple" },
182 { GetNextClient, "GetNextClient" },
183 { GetNextRegion, "GetNextRegion" },
184 { GetNextTuple, "GetNextTuple" },
185 { GetStatus, "GetStatus" },
186 { GetTupleData, "GetTupleData" },
187 { MapMemPage, "MapMemPage" },
188 { ModifyConfiguration, "ModifyConfiguration" },
189 { ModifyWindow, "ModifyWindow" },
190 { OpenMemory, "OpenMemory" },
191 { ParseTuple, "ParseTuple" },
192 { ReadMemory, "ReadMemory" },
193 { RegisterClient, "RegisterClient" },
194 { RegisterEraseQueue, "RegisterEraseQueue" },
195 { RegisterMTD, "RegisterMTD" },
196 { ReleaseConfiguration, "ReleaseConfiguration" },
197 { ReleaseIO, "ReleaseIO" },
198 { ReleaseIRQ, "ReleaseIRQ" },
199 { ReleaseWindow, "ReleaseWindow" },
200 { RequestConfiguration, "RequestConfiguration" },
201 { RequestIO, "RequestIO" },
202 { RequestIRQ, "RequestIRQ" },
203 { RequestSocketMask, "RequestSocketMask" },
204 { RequestWindow, "RequestWindow" },
205 { ResetCard, "ResetCard" },
206 { SetEventMask, "SetEventMask" },
207 { ValidateCIS, "ValidateCIS" },
208 { WriteMemory, "WriteMemory" },
209 { BindDevice, "BindDevice" },
210 { BindMTD, "BindMTD" },
211 { ReportError, "ReportError" },
212 { SuspendCard, "SuspendCard" },
213 { ResumeCard, "ResumeCard" },
214 { EjectCard, "EjectCard" },
215 { InsertCard, "InsertCard" },
216 { ReplaceCIS, "ReplaceCIS" }
217};
218
219
220int pcmcia_report_error(client_handle_t handle, error_info_t *err)
221{
222 int i;
223 char *serv;
224
225 if (CHECK_HANDLE(handle))
226 printk(KERN_NOTICE);
227 else {
228 struct pcmcia_device *p_dev = handle_to_pdev(handle);
229 printk(KERN_NOTICE "%s: ", p_dev->dev.bus_id);
230 }
231
232 for (i = 0; i < ARRAY_SIZE(service_table); i++)
233 if (service_table[i].key == err->func)
234 break;
235 if (i < ARRAY_SIZE(service_table))
236 serv = service_table[i].msg;
237 else
238 serv = "Unknown service number";
239
240 for (i = 0; i < ARRAY_SIZE(error_table); i++)
241 if (error_table[i].key == err->retcode)
242 break;
243 if (i < ARRAY_SIZE(error_table))
244 printk("%s: %s\n", serv, error_table[i].msg);
245 else
246 printk("%s: Unknown error code %#x\n", serv, err->retcode);
247
248 return CS_SUCCESS;
249} /* report_error */
250EXPORT_SYMBOL(pcmcia_report_error);
251
252/* end of code which was in cs.c before */
253
254/*======================================================================*/
255
256void cs_error(client_handle_t handle, int func, int ret)
257{
258 error_info_t err = { func, ret };
259 pcmcia_report_error(handle, &err);
260}
261EXPORT_SYMBOL(cs_error);
262
Dominik Brodowski23a83bf2005-06-27 16:28:07 -0700263#ifdef CONFIG_PCMCIA_DEBUG
264
265
266static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
267{
268 struct pcmcia_device_id *did = p_drv->id_table;
269 unsigned int i;
270 u32 hash;
271
272 while (did && did->match_flags) {
273 for (i=0; i<4; i++) {
274 if (!did->prod_id[i])
275 continue;
276
277 hash = crc32(0, did->prod_id[i], strlen(did->prod_id[i]));
278 if (hash == did->prod_id_hash[i])
279 continue;
280
281 printk(KERN_DEBUG "pcmcia: %s: invalid hash for "
282 "product string \"%s\": is 0x%x, should "
283 "be 0x%x\n", p_drv->drv.name, did->prod_id[i],
284 did->prod_id_hash[i], hash);
285 }
286 did++;
287 }
288
289 return;
290}
291
292#else
293static inline void pcmcia_check_driver(struct pcmcia_driver *p_drv) {
294 return;
295}
296#endif
297
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298/*======================================================================*/
299
300static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info);
301static struct pcmcia_bus_socket * get_socket_info_by_nr(unsigned int nr);
302
303static void pcmcia_release_bus_socket(struct kref *refcount)
304{
305 struct pcmcia_bus_socket *s = container_of(refcount, struct pcmcia_bus_socket, refcount);
306 pcmcia_put_socket(s->parent);
307 kfree(s);
308}
309
310static void pcmcia_put_bus_socket(struct pcmcia_bus_socket *s)
311{
312 kref_put(&s->refcount, pcmcia_release_bus_socket);
313}
314
315static struct pcmcia_bus_socket *pcmcia_get_bus_socket(struct pcmcia_bus_socket *s)
316{
317 kref_get(&s->refcount);
318 return (s);
319}
320
321/**
322 * pcmcia_register_driver - register a PCMCIA driver with the bus core
323 *
324 * Registers a PCMCIA driver with the PCMCIA bus core.
325 */
326static int pcmcia_device_probe(struct device *dev);
327static int pcmcia_device_remove(struct device * dev);
328
329int pcmcia_register_driver(struct pcmcia_driver *driver)
330{
331 if (!driver)
332 return -EINVAL;
333
Dominik Brodowski23a83bf2005-06-27 16:28:07 -0700334 pcmcia_check_driver(driver);
335
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336 /* initialize common fields */
337 driver->drv.bus = &pcmcia_bus_type;
338 driver->drv.owner = driver->owner;
339 driver->drv.probe = pcmcia_device_probe;
340 driver->drv.remove = pcmcia_device_remove;
341
342 return driver_register(&driver->drv);
343}
344EXPORT_SYMBOL(pcmcia_register_driver);
345
346/**
347 * pcmcia_unregister_driver - unregister a PCMCIA driver with the bus core
348 */
349void pcmcia_unregister_driver(struct pcmcia_driver *driver)
350{
351 driver_unregister(&driver->drv);
352}
353EXPORT_SYMBOL(pcmcia_unregister_driver);
354
355#ifdef CONFIG_PROC_FS
356static struct proc_dir_entry *proc_pccard = NULL;
357
358static int proc_read_drivers_callback(struct device_driver *driver, void *d)
359{
360 char **p = d;
361 struct pcmcia_driver *p_drv = container_of(driver,
362 struct pcmcia_driver, drv);
363
364 *p += sprintf(*p, "%-24.24s 1 %d\n", p_drv->drv.name,
365#ifdef CONFIG_MODULE_UNLOAD
366 (p_drv->owner) ? module_refcount(p_drv->owner) : 1
367#else
368 1
369#endif
370 );
371 d = (void *) p;
372
373 return 0;
374}
375
376static int proc_read_drivers(char *buf, char **start, off_t pos,
377 int count, int *eof, void *data)
378{
379 char *p = buf;
380
381 bus_for_each_drv(&pcmcia_bus_type, NULL,
382 (void *) &p, proc_read_drivers_callback);
383
384 return (p - buf);
385}
386#endif
387
388/* pcmcia_device handling */
389
390static struct pcmcia_device * pcmcia_get_dev(struct pcmcia_device *p_dev)
391{
392 struct device *tmp_dev;
393 tmp_dev = get_device(&p_dev->dev);
394 if (!tmp_dev)
395 return NULL;
396 return to_pcmcia_dev(tmp_dev);
397}
398
399static void pcmcia_put_dev(struct pcmcia_device *p_dev)
400{
401 if (p_dev)
402 put_device(&p_dev->dev);
403}
404
405static void pcmcia_release_dev(struct device *dev)
406{
407 struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
408 ds_dbg(1, "releasing dev %p\n", p_dev);
409 pcmcia_put_bus_socket(p_dev->socket->pcmcia);
410 kfree(p_dev);
411}
412
413
414static int pcmcia_device_probe(struct device * dev)
415{
416 struct pcmcia_device *p_dev;
417 struct pcmcia_driver *p_drv;
418 int ret = 0;
419
420 dev = get_device(dev);
421 if (!dev)
422 return -ENODEV;
423
424 p_dev = to_pcmcia_dev(dev);
425 p_drv = to_pcmcia_drv(dev->driver);
426
427 if (!try_module_get(p_drv->owner)) {
428 ret = -EINVAL;
429 goto put_dev;
430 }
431
432 if (p_drv->attach) {
433 p_dev->instance = p_drv->attach();
434 if ((!p_dev->instance) || (p_dev->client.state & CLIENT_UNBOUND)) {
435 printk(KERN_NOTICE "ds: unable to create instance "
436 "of '%s'!\n", p_drv->drv.name);
437 ret = -EINVAL;
438 }
439 }
440
441 if (ret)
442 module_put(p_drv->owner);
443 put_dev:
444 if ((ret) || !(p_drv->attach))
445 put_device(dev);
446 return (ret);
447}
448
449
450static int pcmcia_device_remove(struct device * dev)
451{
452 struct pcmcia_device *p_dev;
453 struct pcmcia_driver *p_drv;
454
455 /* detach the "instance" */
456 p_dev = to_pcmcia_dev(dev);
457 p_drv = to_pcmcia_drv(dev->driver);
458
459 if (p_drv) {
460 if ((p_drv->detach) && (p_dev->instance)) {
461 p_drv->detach(p_dev->instance);
462 /* from pcmcia_probe_device */
463 put_device(&p_dev->dev);
464 }
465 module_put(p_drv->owner);
466 }
467
468 return 0;
469}
470
471
472
473/*
474 * pcmcia_device_query -- determine information about a pcmcia device
475 */
476static int pcmcia_device_query(struct pcmcia_device *p_dev)
477{
478 cistpl_manfid_t manf_id;
479 cistpl_funcid_t func_id;
480 cistpl_vers_1_t vers1;
481 unsigned int i;
482
483 if (!pccard_read_tuple(p_dev->socket, p_dev->func,
484 CISTPL_MANFID, &manf_id)) {
485 p_dev->manf_id = manf_id.manf;
486 p_dev->card_id = manf_id.card;
487 p_dev->has_manf_id = 1;
488 p_dev->has_card_id = 1;
489 }
490
491 if (!pccard_read_tuple(p_dev->socket, p_dev->func,
492 CISTPL_FUNCID, &func_id)) {
493 p_dev->func_id = func_id.func;
494 p_dev->has_func_id = 1;
495 } else {
496 /* rule of thumb: cards with no FUNCID, but with
497 * common memory device geometry information, are
498 * probably memory cards (from pcmcia-cs) */
499 cistpl_device_geo_t devgeo;
500 if (!pccard_read_tuple(p_dev->socket, p_dev->func,
501 CISTPL_DEVICE_GEO, &devgeo)) {
502 ds_dbg(0, "mem device geometry probably means "
503 "FUNCID_MEMORY\n");
504 p_dev->func_id = CISTPL_FUNCID_MEMORY;
505 p_dev->has_func_id = 1;
506 }
507 }
508
509 if (!pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_VERS_1,
510 &vers1)) {
511 for (i=0; i < vers1.ns; i++) {
512 char *tmp;
513 unsigned int length;
514
515 tmp = vers1.str + vers1.ofs[i];
516
517 length = strlen(tmp) + 1;
518 if ((length < 3) || (length > 255))
519 continue;
520
521 p_dev->prod_id[i] = kmalloc(sizeof(char) * length,
522 GFP_KERNEL);
523 if (!p_dev->prod_id[i])
524 continue;
525
526 p_dev->prod_id[i] = strncpy(p_dev->prod_id[i],
527 tmp, length);
528 }
529 }
530
531 return 0;
532}
533
534
535/* device_add_lock is needed to avoid double registration by cardmgr and kernel.
536 * Serializes pcmcia_device_add; will most likely be removed in future.
537 *
538 * While it has the caveat that adding new PCMCIA devices inside(!) device_register()
539 * won't work, this doesn't matter much at the moment: the driver core doesn't
540 * support it either.
541 */
542static DECLARE_MUTEX(device_add_lock);
543
544static struct pcmcia_device * pcmcia_device_add(struct pcmcia_bus_socket *s, unsigned int function)
545{
546 struct pcmcia_device *p_dev;
547 unsigned long flags;
548
549 s = pcmcia_get_bus_socket(s);
550 if (!s)
551 return NULL;
552
553 down(&device_add_lock);
554
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700555 /* max of 2 devices per card */
556 if (s->device_count == 2)
557 goto err_put;
558
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559 p_dev = kmalloc(sizeof(struct pcmcia_device), GFP_KERNEL);
560 if (!p_dev)
561 goto err_put;
562 memset(p_dev, 0, sizeof(struct pcmcia_device));
563
564 p_dev->socket = s->parent;
565 p_dev->device_no = (s->device_count++);
566 p_dev->func = function;
567
568 p_dev->dev.bus = &pcmcia_bus_type;
569 p_dev->dev.parent = s->parent->dev.dev;
570 p_dev->dev.release = pcmcia_release_dev;
571 sprintf (p_dev->dev.bus_id, "%d.%d", p_dev->socket->sock, p_dev->device_no);
572
573 /* compat */
574 p_dev->client.client_magic = CLIENT_MAGIC;
575 p_dev->client.Socket = s->parent;
576 p_dev->client.Function = function;
577 p_dev->client.state = CLIENT_UNBOUND;
578
579 /* Add to the list in pcmcia_bus_socket */
580 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
581 list_add_tail(&p_dev->socket_device_list, &s->devices_list);
582 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
583
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700584 pcmcia_device_query(p_dev);
585
Linus Torvalds1da177e2005-04-16 15:20:36 -0700586 if (device_register(&p_dev->dev)) {
587 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
588 list_del(&p_dev->socket_device_list);
589 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
590
591 goto err_free;
592 }
593
594 up(&device_add_lock);
595
596 return p_dev;
597
598 err_free:
599 kfree(p_dev);
600 s->device_count--;
601 err_put:
602 up(&device_add_lock);
603 pcmcia_put_bus_socket(s);
604
605 return NULL;
606}
607
608
609static int pcmcia_card_add(struct pcmcia_socket *s)
610{
611 cisinfo_t cisinfo;
612 cistpl_longlink_mfc_t mfc;
613 unsigned int no_funcs, i;
614 int ret = 0;
615
616 if (!(s->resource_setup_done))
617 return -EAGAIN; /* try again, but later... */
618
619 pcmcia_validate_mem(s);
620 ret = pccard_validate_cis(s, BIND_FN_ALL, &cisinfo);
621 if (ret || !cisinfo.Chains) {
622 ds_dbg(0, "invalid CIS or invalid resources\n");
623 return -ENODEV;
624 }
625
626 if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, &mfc))
627 no_funcs = mfc.nfn;
628 else
629 no_funcs = 1;
630
631 /* this doesn't handle multifunction devices on one pcmcia function
632 * yet. */
633 for (i=0; i < no_funcs; i++)
634 pcmcia_device_add(s->pcmcia, i);
635
636 return (ret);
637}
638
639
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700640static void pcmcia_delayed_add_pseudo_device(void *data)
641{
642 struct pcmcia_bus_socket *s = data;
643 pcmcia_device_add(s, 0);
644 s->device_add_pending = 0;
645}
646
647static inline void pcmcia_add_pseudo_device(struct pcmcia_bus_socket *s)
648{
649 if (!s->device_add_pending) {
650 schedule_work(&s->device_add);
651 s->device_add_pending = 1;
652 }
653 return;
654}
655
Dominik Brodowskiff1fa9e2005-06-27 16:28:09 -0700656static void pcmcia_bus_rescan(void)
657{
658 /* must be called with skt_sem held */
659 bus_rescan_devices(&pcmcia_bus_type);
660}
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700661
662static inline int pcmcia_devmatch(struct pcmcia_device *dev,
663 struct pcmcia_device_id *did)
664{
665 if (did->match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID) {
666 if ((!dev->has_manf_id) || (dev->manf_id != did->manf_id))
667 return 0;
668 }
669
670 if (did->match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID) {
671 if ((!dev->has_card_id) || (dev->card_id != did->card_id))
672 return 0;
673 }
674
675 if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION) {
676 if (dev->func != did->function)
677 return 0;
678 }
679
680 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1) {
681 if (!dev->prod_id[0])
682 return 0;
683 if (strcmp(did->prod_id[0], dev->prod_id[0]))
684 return 0;
685 }
686
687 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2) {
688 if (!dev->prod_id[1])
689 return 0;
690 if (strcmp(did->prod_id[1], dev->prod_id[1]))
691 return 0;
692 }
693
694 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3) {
695 if (!dev->prod_id[2])
696 return 0;
697 if (strcmp(did->prod_id[2], dev->prod_id[2]))
698 return 0;
699 }
700
701 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4) {
702 if (!dev->prod_id[3])
703 return 0;
704 if (strcmp(did->prod_id[3], dev->prod_id[3]))
705 return 0;
706 }
707
708 if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
709 /* handle pseudo multifunction devices:
710 * there are at most two pseudo multifunction devices.
711 * if we're matching against the first, schedule a
712 * call which will then check whether there are two
713 * pseudo devices, and if not, add the second one.
714 */
715 if (dev->device_no == 0)
716 pcmcia_add_pseudo_device(dev->socket->pcmcia);
717
718 if (dev->device_no != did->device_no)
719 return 0;
720 }
721
722 if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID) {
723 if ((!dev->has_func_id) || (dev->func_id != did->func_id))
724 return 0;
725
726 /* if this is a pseudo-multi-function device,
727 * we need explicit matches */
728 if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO)
729 return 0;
730 if (dev->device_no)
731 return 0;
732
733 /* also, FUNC_ID matching needs to be activated by userspace
734 * after it has re-checked that there is no possible module
735 * with a prod_id/manf_id/card_id match.
736 */
737 if (!dev->allow_func_id_match)
738 return 0;
739 }
740
Dominik Brodowskiea7b3882005-06-27 16:28:07 -0700741 if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) {
742 if (!dev->socket->fake_cis) {
743 /* FIXME: evaluate using firmware helpers to
744 * automagically load it from userspace */
745 return 0;
746 }
747 }
748
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700749 dev->dev.driver_data = (void *) did;
750
751 return 1;
752}
753
754
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
756 struct pcmcia_device * p_dev = to_pcmcia_dev(dev);
757 struct pcmcia_driver * p_drv = to_pcmcia_drv(drv);
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700758 struct pcmcia_device_id *did = p_drv->id_table;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700759
760 /* matching by cardmgr */
761 if (p_dev->cardmgr == p_drv)
762 return 1;
763
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700764 while (did && did->match_flags) {
765 if (pcmcia_devmatch(p_dev, did))
766 return 1;
767 did++;
768 }
769
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770 return 0;
771}
772
Dominik Brodowski840c2ac2005-06-27 16:28:04 -0700773#ifdef CONFIG_HOTPLUG
774
775static int pcmcia_bus_hotplug(struct device *dev, char **envp, int num_envp,
776 char *buffer, int buffer_size)
777{
778 struct pcmcia_device *p_dev;
779 int i, length = 0;
780 u32 hash[4] = { 0, 0, 0, 0};
781
782 if (!dev)
783 return -ENODEV;
784
785 p_dev = to_pcmcia_dev(dev);
786
787 /* calculate hashes */
788 for (i=0; i<4; i++) {
789 if (!p_dev->prod_id[i])
790 continue;
791 hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i]));
792 }
793
794 i = 0;
795
796 if (add_hotplug_env_var(envp, num_envp, &i,
797 buffer, buffer_size, &length,
798 "SOCKET_NO=%u",
799 p_dev->socket->sock))
800 return -ENOMEM;
801
802 if (add_hotplug_env_var(envp, num_envp, &i,
803 buffer, buffer_size, &length,
804 "DEVICE_NO=%02X",
805 p_dev->device_no))
806 return -ENOMEM;
807
808 if (add_hotplug_env_var(envp, num_envp, &i,
809 buffer, buffer_size, &length,
810 "MODALIAS=pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
811 "pa%08Xpb%08Xpc%08Xpd%08X",
812 p_dev->has_manf_id ? p_dev->manf_id : 0,
813 p_dev->has_card_id ? p_dev->card_id : 0,
814 p_dev->has_func_id ? p_dev->func_id : 0,
815 p_dev->func,
816 p_dev->device_no,
817 hash[0],
818 hash[1],
819 hash[2],
820 hash[3]))
821 return -ENOMEM;
822
823 envp[i] = NULL;
824
825 return 0;
826}
827
828#else
829
830static int pcmcia_bus_hotplug(struct device *dev, char **envp, int num_envp,
831 char *buffer, int buffer_size)
832{
833 return -ENODEV;
834}
835
836#endif
837
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838/************************ per-device sysfs output ***************************/
839
840#define pcmcia_device_attr(field, test, format) \
Yani Ioannoue404e272005-05-17 06:42:58 -0400841static ssize_t field##_show (struct device *dev, struct device_attribute *attr, char *buf) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842{ \
843 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); \
844 return p_dev->test ? sprintf (buf, format, p_dev->field) : -ENODEV; \
845}
846
847#define pcmcia_device_stringattr(name, field) \
Yani Ioannoue404e272005-05-17 06:42:58 -0400848static ssize_t name##_show (struct device *dev, struct device_attribute *attr, char *buf) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700849{ \
850 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); \
851 return p_dev->field ? sprintf (buf, "%s\n", p_dev->field) : -ENODEV; \
852}
853
854pcmcia_device_attr(func, socket, "0x%02x\n");
855pcmcia_device_attr(func_id, has_func_id, "0x%02x\n");
856pcmcia_device_attr(manf_id, has_manf_id, "0x%04x\n");
857pcmcia_device_attr(card_id, has_card_id, "0x%04x\n");
858pcmcia_device_stringattr(prod_id1, prod_id[0]);
859pcmcia_device_stringattr(prod_id2, prod_id[1]);
860pcmcia_device_stringattr(prod_id3, prod_id[2]);
861pcmcia_device_stringattr(prod_id4, prod_id[3]);
862
863static struct device_attribute pcmcia_dev_attrs[] = {
864 __ATTR(function, 0444, func_show, NULL),
865 __ATTR_RO(func_id),
866 __ATTR_RO(manf_id),
867 __ATTR_RO(card_id),
868 __ATTR_RO(prod_id1),
869 __ATTR_RO(prod_id2),
870 __ATTR_RO(prod_id3),
871 __ATTR_RO(prod_id4),
872 __ATTR_NULL,
873};
874
875
876/*======================================================================
877
878 These manage a ring buffer of events pending for one user process
879
880======================================================================*/
881
882static int queue_empty(user_info_t *user)
883{
884 return (user->event_head == user->event_tail);
885}
886
887static event_t get_queued_event(user_info_t *user)
888{
889 user->event_tail = (user->event_tail+1) % MAX_EVENTS;
890 return user->event[user->event_tail];
891}
892
893static void queue_event(user_info_t *user, event_t event)
894{
895 user->event_head = (user->event_head+1) % MAX_EVENTS;
896 if (user->event_head == user->event_tail)
897 user->event_tail = (user->event_tail+1) % MAX_EVENTS;
898 user->event[user->event_head] = event;
899}
900
901static void handle_event(struct pcmcia_bus_socket *s, event_t event)
902{
903 user_info_t *user;
904 for (user = s->user; user; user = user->next)
905 queue_event(user, event);
906 wake_up_interruptible(&s->queue);
907}
908
909
910/*======================================================================
911
912 The card status event handler.
913
914======================================================================*/
915
916struct send_event_data {
917 struct pcmcia_socket *skt;
918 event_t event;
919 int priority;
920};
921
922static int send_event_callback(struct device *dev, void * _data)
923{
924 struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
925 struct send_event_data *data = _data;
926
927 /* we get called for all sockets, but may only pass the event
928 * for drivers _on the affected socket_ */
929 if (p_dev->socket != data->skt)
930 return 0;
931
932 if (p_dev->client.state & (CLIENT_UNBOUND|CLIENT_STALE))
933 return 0;
934
935 if (p_dev->client.EventMask & data->event)
936 return EVENT(&p_dev->client, data->event, data->priority);
937
938 return 0;
939}
940
941static int send_event(struct pcmcia_socket *s, event_t event, int priority)
942{
943 int ret = 0;
944 struct send_event_data private;
945 struct pcmcia_bus_socket *skt = pcmcia_get_bus_socket(s->pcmcia);
946
947 if (!skt)
948 return 0;
949
950 private.skt = s;
951 private.event = event;
952 private.priority = priority;
953
954 ret = bus_for_each_dev(&pcmcia_bus_type, NULL, &private, send_event_callback);
955
956 pcmcia_put_bus_socket(skt);
957 return ret;
958} /* send_event */
959
960
961/* Normally, the event is passed to individual drivers after
962 * informing userspace. Only for CS_EVENT_CARD_REMOVAL this
963 * is inversed to maintain historic compatibility.
964 */
965
966static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
967{
968 struct pcmcia_bus_socket *s = skt->pcmcia;
969 int ret = 0;
970
971 ds_dbg(1, "ds_event(0x%06x, %d, 0x%p)\n",
972 event, priority, s);
973
974 switch (event) {
975
976 case CS_EVENT_CARD_REMOVAL:
977 s->state &= ~DS_SOCKET_PRESENT;
978 send_event(skt, event, priority);
979 unbind_request(s);
980 handle_event(s, event);
981 break;
982
983 case CS_EVENT_CARD_INSERTION:
984 s->state |= DS_SOCKET_PRESENT;
985 pcmcia_card_add(skt);
986 handle_event(s, event);
987 break;
988
989 case CS_EVENT_EJECTION_REQUEST:
990 ret = send_event(skt, event, priority);
991 break;
992
993 default:
994 handle_event(s, event);
995 send_event(skt, event, priority);
996 break;
997 }
998
999 return 0;
1000} /* ds_event */
1001
1002
1003/*======================================================================
1004
1005 bind_request() and bind_device() are merged by now. Register_client()
1006 is called right at the end of bind_request(), during the driver's
1007 ->attach() call. Individual descriptions:
1008
1009 bind_request() connects a socket to a particular client driver.
1010 It looks up the specified device ID in the list of registered
1011 drivers, binds it to the socket, and tries to create an instance
1012 of the device. unbind_request() deletes a driver instance.
1013
1014 Bind_device() associates a device driver with a particular socket.
1015 It is normally called by Driver Services after it has identified
1016 a newly inserted card. An instance of that driver will then be
1017 eligible to register as a client of this socket.
1018
1019 Register_client() uses the dev_info_t handle to match the
1020 caller with a socket. The driver must have already been bound
1021 to a socket with bind_device() -- in fact, bind_device()
1022 allocates the client structure that will be used.
1023
1024======================================================================*/
1025
1026static int bind_request(struct pcmcia_bus_socket *s, bind_info_t *bind_info)
1027{
1028 struct pcmcia_driver *p_drv;
1029 struct pcmcia_device *p_dev;
1030 int ret = 0;
1031 unsigned long flags;
1032
1033 s = pcmcia_get_bus_socket(s);
1034 if (!s)
1035 return -EINVAL;
1036
1037 ds_dbg(2, "bind_request(%d, '%s')\n", s->parent->sock,
1038 (char *)bind_info->dev_info);
1039
1040 p_drv = get_pcmcia_driver(&bind_info->dev_info);
1041 if (!p_drv) {
1042 ret = -EINVAL;
1043 goto err_put;
1044 }
1045
1046 if (!try_module_get(p_drv->owner)) {
1047 ret = -EINVAL;
1048 goto err_put_driver;
1049 }
1050
1051 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
1052 list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
1053 if (p_dev->func == bind_info->function) {
1054 if ((p_dev->dev.driver == &p_drv->drv)) {
1055 if (p_dev->cardmgr) {
1056 /* if there's already a device
1057 * registered, and it was registered
1058 * by userspace before, we need to
1059 * return the "instance". */
1060 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1061 bind_info->instance = p_dev->instance;
1062 ret = -EBUSY;
1063 goto err_put_module;
1064 } else {
1065 /* the correct driver managed to bind
1066 * itself magically to the correct
1067 * device. */
1068 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1069 p_dev->cardmgr = p_drv;
1070 ret = 0;
1071 goto err_put_module;
1072 }
1073 } else if (!p_dev->dev.driver) {
1074 /* there's already a device available where
1075 * no device has been bound to yet. So we don't
1076 * need to register a device! */
1077 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1078 goto rescan;
1079 }
1080 }
1081 }
1082 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1083
1084 p_dev = pcmcia_device_add(s, bind_info->function);
1085 if (!p_dev) {
1086 ret = -EIO;
1087 goto err_put_module;
1088 }
1089
1090rescan:
1091 p_dev->cardmgr = p_drv;
1092
Dominik Brodowski1ad275e2005-06-27 16:28:06 -07001093 /* if a driver is already running, we can abort */
1094 if (p_dev->dev.driver)
1095 goto err_put_module;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096
1097 /*
1098 * Prevent this racing with a card insertion.
1099 */
1100 down(&s->parent->skt_sem);
1101 bus_rescan_devices(&pcmcia_bus_type);
1102 up(&s->parent->skt_sem);
1103
1104 /* check whether the driver indeed matched. I don't care if this
1105 * is racy or not, because it can only happen on cardmgr access
1106 * paths...
1107 */
1108 if (!(p_dev->dev.driver == &p_drv->drv))
1109 p_dev->cardmgr = NULL;
1110
1111 err_put_module:
1112 module_put(p_drv->owner);
1113 err_put_driver:
1114 put_driver(&p_drv->drv);
1115 err_put:
1116 pcmcia_put_bus_socket(s);
1117
1118 return (ret);
1119} /* bind_request */
1120
1121
1122int pcmcia_register_client(client_handle_t *handle, client_reg_t *req)
1123{
1124 client_t *client = NULL;
1125 struct pcmcia_socket *s;
1126 struct pcmcia_bus_socket *skt = NULL;
1127 struct pcmcia_device *p_dev = NULL;
1128
1129 /* Look for unbound client with matching dev_info */
1130 down_read(&pcmcia_socket_list_rwsem);
1131 list_for_each_entry(s, &pcmcia_socket_list, socket_list) {
1132 unsigned long flags;
1133
1134 if (s->state & SOCKET_CARDBUS)
1135 continue;
1136
1137 skt = s->pcmcia;
1138 if (!skt)
1139 continue;
1140 skt = pcmcia_get_bus_socket(skt);
1141 if (!skt)
1142 continue;
1143 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
1144 list_for_each_entry(p_dev, &skt->devices_list, socket_device_list) {
1145 struct pcmcia_driver *p_drv;
1146 p_dev = pcmcia_get_dev(p_dev);
1147 if (!p_dev)
1148 continue;
1149 if (!(p_dev->client.state & CLIENT_UNBOUND) ||
1150 (!p_dev->dev.driver)) {
1151 pcmcia_put_dev(p_dev);
1152 continue;
1153 }
1154 p_drv = to_pcmcia_drv(p_dev->dev.driver);
1155 if (!strncmp(p_drv->drv.name, (char *)req->dev_info, DEV_NAME_LEN)) {
1156 client = &p_dev->client;
1157 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1158 goto found;
1159 }
1160 pcmcia_put_dev(p_dev);
1161 }
1162 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1163 pcmcia_put_bus_socket(skt);
1164 }
1165 found:
1166 up_read(&pcmcia_socket_list_rwsem);
1167 if (!p_dev || !client)
1168 return -ENODEV;
1169
1170 pcmcia_put_bus_socket(skt); /* safe, as we already hold a reference from bind_device */
1171
1172 *handle = client;
1173 client->state &= ~CLIENT_UNBOUND;
1174 client->Socket = s;
1175 client->EventMask = req->EventMask;
1176 client->event_handler = req->event_handler;
1177 client->event_callback_args = req->event_callback_args;
1178 client->event_callback_args.client_handle = client;
1179
1180 if (s->state & SOCKET_CARDBUS)
1181 client->state |= CLIENT_CARDBUS;
1182
1183 if ((!(s->state & SOCKET_CARDBUS)) && (s->functions == 0) &&
1184 (client->Function != BIND_FN_ALL)) {
1185 cistpl_longlink_mfc_t mfc;
1186 if (pccard_read_tuple(s, client->Function, CISTPL_LONGLINK_MFC, &mfc)
1187 == CS_SUCCESS)
1188 s->functions = mfc.nfn;
1189 else
1190 s->functions = 1;
1191 s->config = kmalloc(sizeof(config_t) * s->functions,
1192 GFP_KERNEL);
1193 if (!s->config)
1194 goto out_no_resource;
1195 memset(s->config, 0, sizeof(config_t) * s->functions);
1196 }
1197
1198 ds_dbg(1, "register_client(): client 0x%p, dev %s\n",
1199 client, p_dev->dev.bus_id);
1200 if (client->EventMask & CS_EVENT_REGISTRATION_COMPLETE)
1201 EVENT(client, CS_EVENT_REGISTRATION_COMPLETE, CS_EVENT_PRI_LOW);
1202
1203 if ((s->state & (SOCKET_PRESENT|SOCKET_CARDBUS)) == SOCKET_PRESENT) {
1204 if (client->EventMask & CS_EVENT_CARD_INSERTION)
1205 EVENT(client, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
1206 }
1207
1208 return CS_SUCCESS;
1209
1210 out_no_resource:
1211 pcmcia_put_dev(p_dev);
1212 return CS_OUT_OF_RESOURCE;
1213} /* register_client */
1214EXPORT_SYMBOL(pcmcia_register_client);
1215
1216
1217/*====================================================================*/
1218
1219extern struct pci_bus *pcmcia_lookup_bus(struct pcmcia_socket *s);
1220
1221static int get_device_info(struct pcmcia_bus_socket *s, bind_info_t *bind_info, int first)
1222{
1223 dev_node_t *node;
1224 struct pcmcia_device *p_dev;
1225 unsigned long flags;
1226 int ret = 0;
1227
1228#ifdef CONFIG_CARDBUS
1229 /*
1230 * Some unbelievably ugly code to associate the PCI cardbus
1231 * device and its driver with the PCMCIA "bind" information.
1232 */
1233 {
1234 struct pci_bus *bus;
1235
1236 bus = pcmcia_lookup_bus(s->parent);
1237 if (bus) {
1238 struct list_head *list;
1239 struct pci_dev *dev = NULL;
1240
1241 list = bus->devices.next;
1242 while (list != &bus->devices) {
1243 struct pci_dev *pdev = pci_dev_b(list);
1244 list = list->next;
1245
1246 if (first) {
1247 dev = pdev;
1248 break;
1249 }
1250
1251 /* Try to handle "next" here some way? */
1252 }
1253 if (dev && dev->driver) {
1254 strlcpy(bind_info->name, dev->driver->name, DEV_NAME_LEN);
1255 bind_info->major = 0;
1256 bind_info->minor = 0;
1257 bind_info->next = NULL;
1258 return 0;
1259 }
1260 }
1261 }
1262#endif
1263
1264 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
1265 list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
1266 if (p_dev->func == bind_info->function) {
1267 p_dev = pcmcia_get_dev(p_dev);
1268 if (!p_dev)
1269 continue;
1270 goto found;
1271 }
1272 }
1273 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1274 return -ENODEV;
1275
1276 found:
1277 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1278
1279 if ((!p_dev->instance) ||
1280 (p_dev->instance->state & DEV_CONFIG_PENDING)) {
1281 ret = -EAGAIN;
1282 goto err_put;
1283 }
1284
1285 if (first)
1286 node = p_dev->instance->dev;
1287 else
1288 for (node = p_dev->instance->dev; node; node = node->next)
1289 if (node == bind_info->next)
1290 break;
1291 if (!node) {
1292 ret = -ENODEV;
1293 goto err_put;
1294 }
1295
1296 strlcpy(bind_info->name, node->dev_name, DEV_NAME_LEN);
1297 bind_info->major = node->major;
1298 bind_info->minor = node->minor;
1299 bind_info->next = node->next;
1300
1301 err_put:
1302 pcmcia_put_dev(p_dev);
1303 return (ret);
1304} /* get_device_info */
1305
1306/*====================================================================*/
1307
1308/* unbind _all_ devices attached to a given pcmcia_bus_socket. The
1309 * drivers have been called with EVENT_CARD_REMOVAL before.
1310 */
1311static int unbind_request(struct pcmcia_bus_socket *s)
1312{
1313 struct pcmcia_device *p_dev;
1314 unsigned long flags;
1315
1316 ds_dbg(2, "unbind_request(%d)\n", s->parent->sock);
1317
1318 s->device_count = 0;
1319
1320 for (;;) {
1321 /* unregister all pcmcia_devices registered with this socket*/
1322 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
1323 if (list_empty(&s->devices_list)) {
1324 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1325 return 0;
1326 }
1327 p_dev = list_entry((&s->devices_list)->next, struct pcmcia_device, socket_device_list);
1328 list_del(&p_dev->socket_device_list);
1329 p_dev->client.state |= CLIENT_STALE;
1330 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1331
1332 device_unregister(&p_dev->dev);
1333 }
1334
1335 return 0;
1336} /* unbind_request */
1337
1338int pcmcia_deregister_client(client_handle_t handle)
1339{
1340 struct pcmcia_socket *s;
1341 int i;
1342 struct pcmcia_device *p_dev = handle_to_pdev(handle);
1343
1344 if (CHECK_HANDLE(handle))
1345 return CS_BAD_HANDLE;
1346
1347 s = SOCKET(handle);
1348 ds_dbg(1, "deregister_client(%p)\n", handle);
1349
1350 if (handle->state & (CLIENT_IRQ_REQ|CLIENT_IO_REQ|CLIENT_CONFIG_LOCKED))
1351 goto warn_out;
1352 for (i = 0; i < MAX_WIN; i++)
1353 if (handle->state & CLIENT_WIN_REQ(i))
1354 goto warn_out;
1355
1356 if (handle->state & CLIENT_STALE) {
1357 handle->client_magic = 0;
1358 handle->state &= ~CLIENT_STALE;
1359 pcmcia_put_dev(p_dev);
1360 } else {
1361 handle->state = CLIENT_UNBOUND;
1362 handle->event_handler = NULL;
1363 }
1364
1365 return CS_SUCCESS;
1366 warn_out:
1367 printk(KERN_WARNING "ds: deregister_client was called too early.\n");
1368 return CS_IN_USE;
1369} /* deregister_client */
1370EXPORT_SYMBOL(pcmcia_deregister_client);
1371
1372
1373/*======================================================================
1374
1375 The user-mode PC Card device interface
1376
1377======================================================================*/
1378
1379static int ds_open(struct inode *inode, struct file *file)
1380{
1381 socket_t i = iminor(inode);
1382 struct pcmcia_bus_socket *s;
1383 user_info_t *user;
1384
1385 ds_dbg(0, "ds_open(socket %d)\n", i);
1386
1387 s = get_socket_info_by_nr(i);
1388 if (!s)
1389 return -ENODEV;
1390 s = pcmcia_get_bus_socket(s);
1391 if (!s)
1392 return -ENODEV;
1393
1394 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
1395 if (s->state & DS_SOCKET_BUSY) {
1396 pcmcia_put_bus_socket(s);
1397 return -EBUSY;
1398 }
1399 else
1400 s->state |= DS_SOCKET_BUSY;
1401 }
1402
1403 user = kmalloc(sizeof(user_info_t), GFP_KERNEL);
1404 if (!user) {
1405 pcmcia_put_bus_socket(s);
1406 return -ENOMEM;
1407 }
1408 user->event_tail = user->event_head = 0;
1409 user->next = s->user;
1410 user->user_magic = USER_MAGIC;
1411 user->socket = s;
1412 s->user = user;
1413 file->private_data = user;
1414
1415 if (s->state & DS_SOCKET_PRESENT)
1416 queue_event(user, CS_EVENT_CARD_INSERTION);
1417 return 0;
1418} /* ds_open */
1419
1420/*====================================================================*/
1421
1422static int ds_release(struct inode *inode, struct file *file)
1423{
1424 struct pcmcia_bus_socket *s;
1425 user_info_t *user, **link;
1426
1427 ds_dbg(0, "ds_release(socket %d)\n", iminor(inode));
1428
1429 user = file->private_data;
1430 if (CHECK_USER(user))
1431 goto out;
1432
1433 s = user->socket;
1434
1435 /* Unlink user data structure */
1436 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
1437 s->state &= ~DS_SOCKET_BUSY;
1438 }
1439 file->private_data = NULL;
1440 for (link = &s->user; *link; link = &(*link)->next)
1441 if (*link == user) break;
1442 if (link == NULL)
1443 goto out;
1444 *link = user->next;
1445 user->user_magic = 0;
1446 kfree(user);
1447 pcmcia_put_bus_socket(s);
1448out:
1449 return 0;
1450} /* ds_release */
1451
1452/*====================================================================*/
1453
1454static ssize_t ds_read(struct file *file, char __user *buf,
1455 size_t count, loff_t *ppos)
1456{
1457 struct pcmcia_bus_socket *s;
1458 user_info_t *user;
1459 int ret;
1460
1461 ds_dbg(2, "ds_read(socket %d)\n", iminor(file->f_dentry->d_inode));
1462
1463 if (count < 4)
1464 return -EINVAL;
1465
1466 user = file->private_data;
1467 if (CHECK_USER(user))
1468 return -EIO;
1469
1470 s = user->socket;
1471 if (s->state & DS_SOCKET_DEAD)
1472 return -EIO;
1473
1474 ret = wait_event_interruptible(s->queue, !queue_empty(user));
1475 if (ret == 0)
1476 ret = put_user(get_queued_event(user), (int __user *)buf) ? -EFAULT : 4;
1477
1478 return ret;
1479} /* ds_read */
1480
1481/*====================================================================*/
1482
1483static ssize_t ds_write(struct file *file, const char __user *buf,
1484 size_t count, loff_t *ppos)
1485{
1486 ds_dbg(2, "ds_write(socket %d)\n", iminor(file->f_dentry->d_inode));
1487
1488 if (count != 4)
1489 return -EINVAL;
1490 if ((file->f_flags & O_ACCMODE) == O_RDONLY)
1491 return -EBADF;
1492
1493 return -EIO;
1494} /* ds_write */
1495
1496/*====================================================================*/
1497
1498/* No kernel lock - fine */
1499static u_int ds_poll(struct file *file, poll_table *wait)
1500{
1501 struct pcmcia_bus_socket *s;
1502 user_info_t *user;
1503
1504 ds_dbg(2, "ds_poll(socket %d)\n", iminor(file->f_dentry->d_inode));
1505
1506 user = file->private_data;
1507 if (CHECK_USER(user))
1508 return POLLERR;
1509 s = user->socket;
1510 /*
1511 * We don't check for a dead socket here since that
1512 * will send cardmgr into an endless spin.
1513 */
1514 poll_wait(file, &s->queue, wait);
1515 if (!queue_empty(user))
1516 return POLLIN | POLLRDNORM;
1517 return 0;
1518} /* ds_poll */
1519
1520/*====================================================================*/
1521
1522extern int pcmcia_adjust_resource_info(adjust_t *adj);
1523
1524static int ds_ioctl(struct inode * inode, struct file * file,
1525 u_int cmd, u_long arg)
1526{
1527 struct pcmcia_bus_socket *s;
1528 void __user *uarg = (char __user *)arg;
1529 u_int size;
1530 int ret, err;
1531 ds_ioctl_arg_t *buf;
1532 user_info_t *user;
1533
1534 ds_dbg(2, "ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
1535
1536 user = file->private_data;
1537 if (CHECK_USER(user))
1538 return -EIO;
1539
1540 s = user->socket;
1541 if (s->state & DS_SOCKET_DEAD)
1542 return -EIO;
1543
1544 size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT;
1545 if (size > sizeof(ds_ioctl_arg_t)) return -EINVAL;
1546
1547 /* Permission check */
1548 if (!(cmd & IOC_OUT) && !capable(CAP_SYS_ADMIN))
1549 return -EPERM;
1550
1551 if (cmd & IOC_IN) {
1552 if (!access_ok(VERIFY_READ, uarg, size)) {
1553 ds_dbg(3, "ds_ioctl(): verify_read = %d\n", -EFAULT);
1554 return -EFAULT;
1555 }
1556 }
1557 if (cmd & IOC_OUT) {
1558 if (!access_ok(VERIFY_WRITE, uarg, size)) {
1559 ds_dbg(3, "ds_ioctl(): verify_write = %d\n", -EFAULT);
1560 return -EFAULT;
1561 }
1562 }
1563 buf = kmalloc(sizeof(ds_ioctl_arg_t), GFP_KERNEL);
1564 if (!buf)
1565 return -ENOMEM;
1566
1567 err = ret = 0;
1568
1569 if (cmd & IOC_IN) __copy_from_user((char *)buf, uarg, size);
1570
1571 switch (cmd) {
1572 case DS_ADJUST_RESOURCE_INFO:
1573 ret = pcmcia_adjust_resource_info(&buf->adjust);
1574 break;
1575 case DS_GET_CARD_SERVICES_INFO:
1576 ret = pcmcia_get_card_services_info(&buf->servinfo);
1577 break;
1578 case DS_GET_CONFIGURATION_INFO:
1579 if (buf->config.Function &&
1580 (buf->config.Function >= s->parent->functions))
1581 ret = CS_BAD_ARGS;
1582 else
1583 ret = pccard_get_configuration_info(s->parent,
1584 buf->config.Function, &buf->config);
1585 break;
1586 case DS_GET_FIRST_TUPLE:
1587 down(&s->parent->skt_sem);
1588 pcmcia_validate_mem(s->parent);
1589 up(&s->parent->skt_sem);
1590 ret = pccard_get_first_tuple(s->parent, BIND_FN_ALL, &buf->tuple);
1591 break;
1592 case DS_GET_NEXT_TUPLE:
1593 ret = pccard_get_next_tuple(s->parent, BIND_FN_ALL, &buf->tuple);
1594 break;
1595 case DS_GET_TUPLE_DATA:
1596 buf->tuple.TupleData = buf->tuple_parse.data;
1597 buf->tuple.TupleDataMax = sizeof(buf->tuple_parse.data);
1598 ret = pccard_get_tuple_data(s->parent, &buf->tuple);
1599 break;
1600 case DS_PARSE_TUPLE:
1601 buf->tuple.TupleData = buf->tuple_parse.data;
1602 ret = pccard_parse_tuple(&buf->tuple, &buf->tuple_parse.parse);
1603 break;
1604 case DS_RESET_CARD:
1605 ret = pccard_reset_card(s->parent);
1606 break;
1607 case DS_GET_STATUS:
1608 if (buf->status.Function &&
1609 (buf->status.Function >= s->parent->functions))
1610 ret = CS_BAD_ARGS;
1611 else
1612 ret = pccard_get_status(s->parent, buf->status.Function, &buf->status);
1613 break;
1614 case DS_VALIDATE_CIS:
1615 down(&s->parent->skt_sem);
1616 pcmcia_validate_mem(s->parent);
1617 up(&s->parent->skt_sem);
1618 ret = pccard_validate_cis(s->parent, BIND_FN_ALL, &buf->cisinfo);
1619 break;
1620 case DS_SUSPEND_CARD:
1621 ret = pcmcia_suspend_card(s->parent);
1622 break;
1623 case DS_RESUME_CARD:
1624 ret = pcmcia_resume_card(s->parent);
1625 break;
1626 case DS_EJECT_CARD:
1627 err = pcmcia_eject_card(s->parent);
1628 break;
1629 case DS_INSERT_CARD:
1630 err = pcmcia_insert_card(s->parent);
1631 break;
1632 case DS_ACCESS_CONFIGURATION_REGISTER:
1633 if ((buf->conf_reg.Action == CS_WRITE) && !capable(CAP_SYS_ADMIN)) {
1634 err = -EPERM;
1635 goto free_out;
1636 }
1637 if (buf->conf_reg.Function &&
1638 (buf->conf_reg.Function >= s->parent->functions))
1639 ret = CS_BAD_ARGS;
1640 else
1641 ret = pccard_access_configuration_register(s->parent,
1642 buf->conf_reg.Function, &buf->conf_reg);
1643 break;
1644 case DS_GET_FIRST_REGION:
1645 case DS_GET_NEXT_REGION:
1646 case DS_BIND_MTD:
1647 if (!capable(CAP_SYS_ADMIN)) {
1648 err = -EPERM;
1649 goto free_out;
1650 } else {
1651 static int printed = 0;
1652 if (!printed) {
1653 printk(KERN_WARNING "2.6. kernels use pcmciamtd instead of memory_cs.c and do not require special\n");
1654 printk(KERN_WARNING "MTD handling any more.\n");
1655 printed++;
1656 }
1657 }
1658 err = -EINVAL;
1659 goto free_out;
1660 break;
1661 case DS_GET_FIRST_WINDOW:
1662 ret = pcmcia_get_window(s->parent, &buf->win_info.handle, 0,
1663 &buf->win_info.window);
1664 break;
1665 case DS_GET_NEXT_WINDOW:
1666 ret = pcmcia_get_window(s->parent, &buf->win_info.handle,
1667 buf->win_info.handle->index + 1, &buf->win_info.window);
1668 break;
1669 case DS_GET_MEM_PAGE:
1670 ret = pcmcia_get_mem_page(buf->win_info.handle,
1671 &buf->win_info.map);
1672 break;
1673 case DS_REPLACE_CIS:
1674 ret = pcmcia_replace_cis(s->parent, &buf->cisdump);
1675 break;
1676 case DS_BIND_REQUEST:
1677 if (!capable(CAP_SYS_ADMIN)) {
1678 err = -EPERM;
1679 goto free_out;
1680 }
1681 err = bind_request(s, &buf->bind_info);
1682 break;
1683 case DS_GET_DEVICE_INFO:
1684 err = get_device_info(s, &buf->bind_info, 1);
1685 break;
1686 case DS_GET_NEXT_DEVICE:
1687 err = get_device_info(s, &buf->bind_info, 0);
1688 break;
1689 case DS_UNBIND_REQUEST:
1690 err = 0;
1691 break;
1692 default:
1693 err = -EINVAL;
1694 }
1695
1696 if ((err == 0) && (ret != CS_SUCCESS)) {
1697 ds_dbg(2, "ds_ioctl: ret = %d\n", ret);
1698 switch (ret) {
1699 case CS_BAD_SOCKET: case CS_NO_CARD:
1700 err = -ENODEV; break;
1701 case CS_BAD_ARGS: case CS_BAD_ATTRIBUTE: case CS_BAD_IRQ:
1702 case CS_BAD_TUPLE:
1703 err = -EINVAL; break;
1704 case CS_IN_USE:
1705 err = -EBUSY; break;
1706 case CS_OUT_OF_RESOURCE:
1707 err = -ENOSPC; break;
1708 case CS_NO_MORE_ITEMS:
1709 err = -ENODATA; break;
1710 case CS_UNSUPPORTED_FUNCTION:
1711 err = -ENOSYS; break;
1712 default:
1713 err = -EIO; break;
1714 }
1715 }
1716
1717 if (cmd & IOC_OUT) {
1718 if (__copy_to_user(uarg, (char *)buf, size))
1719 err = -EFAULT;
1720 }
1721
1722free_out:
1723 kfree(buf);
1724 return err;
1725} /* ds_ioctl */
1726
1727/*====================================================================*/
1728
1729static struct file_operations ds_fops = {
1730 .owner = THIS_MODULE,
1731 .open = ds_open,
1732 .release = ds_release,
1733 .ioctl = ds_ioctl,
1734 .read = ds_read,
1735 .write = ds_write,
1736 .poll = ds_poll,
1737};
1738
1739static int __devinit pcmcia_bus_add_socket(struct class_device *class_dev)
1740{
1741 struct pcmcia_socket *socket = class_get_devdata(class_dev);
1742 struct pcmcia_bus_socket *s;
1743 int ret;
1744
1745 s = kmalloc(sizeof(struct pcmcia_bus_socket), GFP_KERNEL);
1746 if(!s)
1747 return -ENOMEM;
1748 memset(s, 0, sizeof(struct pcmcia_bus_socket));
1749
1750 /* get reference to parent socket */
1751 s->parent = pcmcia_get_socket(socket);
1752 if (!s->parent) {
1753 printk(KERN_ERR "PCMCIA obtaining reference to socket %p failed\n", socket);
1754 kfree (s);
1755 return -ENODEV;
1756 }
1757
1758 kref_init(&s->refcount);
1759
1760 /*
1761 * Ugly. But we want to wait for the socket threads to have started up.
1762 * We really should let the drivers themselves drive some of this..
1763 */
1764 msleep(250);
1765
1766 init_waitqueue_head(&s->queue);
1767 INIT_LIST_HEAD(&s->devices_list);
Dominik Brodowski1ad275e2005-06-27 16:28:06 -07001768 INIT_WORK(&s->device_add, pcmcia_delayed_add_pseudo_device, s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769
1770 /* Set up hotline to Card Services */
1771 s->callback.owner = THIS_MODULE;
1772 s->callback.event = &ds_event;
1773 s->callback.resources_done = &pcmcia_card_add;
Dominik Brodowskiff1fa9e2005-06-27 16:28:09 -07001774 s->callback.replace_cis = &pcmcia_bus_rescan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001775 socket->pcmcia = s;
1776
1777 ret = pccard_register_pcmcia(socket, &s->callback);
1778 if (ret) {
1779 printk(KERN_ERR "PCMCIA registration PCCard core failed for socket %p\n", socket);
1780 pcmcia_put_bus_socket(s);
1781 socket->pcmcia = NULL;
1782 return (ret);
1783 }
1784
1785 return 0;
1786}
1787
1788
1789static void pcmcia_bus_remove_socket(struct class_device *class_dev)
1790{
1791 struct pcmcia_socket *socket = class_get_devdata(class_dev);
1792
1793 if (!socket || !socket->pcmcia)
1794 return;
1795
1796 pccard_register_pcmcia(socket, NULL);
1797
1798 socket->pcmcia->state |= DS_SOCKET_DEAD;
1799 pcmcia_put_bus_socket(socket->pcmcia);
1800 socket->pcmcia = NULL;
1801
1802 return;
1803}
1804
1805
1806/* the pcmcia_bus_interface is used to handle pcmcia socket devices */
1807static struct class_interface pcmcia_bus_interface = {
1808 .class = &pcmcia_socket_class,
1809 .add = &pcmcia_bus_add_socket,
1810 .remove = &pcmcia_bus_remove_socket,
1811};
1812
1813
1814struct bus_type pcmcia_bus_type = {
1815 .name = "pcmcia",
Dominik Brodowski840c2ac2005-06-27 16:28:04 -07001816 .hotplug = pcmcia_bus_hotplug,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817 .match = pcmcia_bus_match,
1818 .dev_attrs = pcmcia_dev_attrs,
1819};
1820EXPORT_SYMBOL(pcmcia_bus_type);
1821
1822
1823static int __init init_pcmcia_bus(void)
1824{
1825 int i;
1826
1827 spin_lock_init(&pcmcia_dev_list_lock);
1828
1829 bus_register(&pcmcia_bus_type);
1830 class_interface_register(&pcmcia_bus_interface);
1831
1832 /* Set up character device for user mode clients */
1833 i = register_chrdev(0, "pcmcia", &ds_fops);
Randy Dunlapafbf5102005-05-16 21:53:56 -07001834 if (i < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001835 printk(KERN_NOTICE "unable to find a free device # for "
Randy Dunlapafbf5102005-05-16 21:53:56 -07001836 "Driver Services (error=%d)\n", i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001837 else
1838 major_dev = i;
1839
1840#ifdef CONFIG_PROC_FS
1841 proc_pccard = proc_mkdir("pccard", proc_bus);
1842 if (proc_pccard)
1843 create_proc_read_entry("drivers",0,proc_pccard,proc_read_drivers,NULL);
1844#endif
1845
1846 return 0;
1847}
1848fs_initcall(init_pcmcia_bus); /* one level after subsys_initcall so that
1849 * pcmcia_socket_class is already registered */
1850
1851
1852static void __exit exit_pcmcia_bus(void)
1853{
1854 class_interface_unregister(&pcmcia_bus_interface);
1855
1856#ifdef CONFIG_PROC_FS
1857 if (proc_pccard) {
1858 remove_proc_entry("drivers", proc_pccard);
1859 remove_proc_entry("pccard", proc_bus);
1860 }
1861#endif
1862 if (major_dev != -1)
1863 unregister_chrdev(major_dev, "pcmcia");
1864
1865 bus_unregister(&pcmcia_bus_type);
1866}
1867module_exit(exit_pcmcia_bus);
1868
1869
1870
1871/* helpers for backwards-compatible functions */
1872
1873static struct pcmcia_bus_socket * get_socket_info_by_nr(unsigned int nr)
1874{
1875 struct pcmcia_socket * s = pcmcia_get_socket_by_nr(nr);
1876 if (s && s->pcmcia)
1877 return s->pcmcia;
1878 else
1879 return NULL;
1880}
1881
1882/* backwards-compatible accessing of driver --- by name! */
1883
1884static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info)
1885{
1886 struct device_driver *drv;
1887 struct pcmcia_driver *p_drv;
1888
1889 drv = driver_find((char *) dev_info, &pcmcia_bus_type);
1890 if (!drv)
1891 return NULL;
1892
1893 p_drv = container_of(drv, struct pcmcia_driver, drv);
1894
1895 return (p_drv);
1896}
1897
1898MODULE_ALIAS("ds");