blob: 3ac7a443f6680b174460a2d8bcb0707c3b295033 [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
656
657static inline int pcmcia_devmatch(struct pcmcia_device *dev,
658 struct pcmcia_device_id *did)
659{
660 if (did->match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID) {
661 if ((!dev->has_manf_id) || (dev->manf_id != did->manf_id))
662 return 0;
663 }
664
665 if (did->match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID) {
666 if ((!dev->has_card_id) || (dev->card_id != did->card_id))
667 return 0;
668 }
669
670 if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION) {
671 if (dev->func != did->function)
672 return 0;
673 }
674
675 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1) {
676 if (!dev->prod_id[0])
677 return 0;
678 if (strcmp(did->prod_id[0], dev->prod_id[0]))
679 return 0;
680 }
681
682 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2) {
683 if (!dev->prod_id[1])
684 return 0;
685 if (strcmp(did->prod_id[1], dev->prod_id[1]))
686 return 0;
687 }
688
689 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3) {
690 if (!dev->prod_id[2])
691 return 0;
692 if (strcmp(did->prod_id[2], dev->prod_id[2]))
693 return 0;
694 }
695
696 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4) {
697 if (!dev->prod_id[3])
698 return 0;
699 if (strcmp(did->prod_id[3], dev->prod_id[3]))
700 return 0;
701 }
702
703 if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
704 /* handle pseudo multifunction devices:
705 * there are at most two pseudo multifunction devices.
706 * if we're matching against the first, schedule a
707 * call which will then check whether there are two
708 * pseudo devices, and if not, add the second one.
709 */
710 if (dev->device_no == 0)
711 pcmcia_add_pseudo_device(dev->socket->pcmcia);
712
713 if (dev->device_no != did->device_no)
714 return 0;
715 }
716
717 if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID) {
718 if ((!dev->has_func_id) || (dev->func_id != did->func_id))
719 return 0;
720
721 /* if this is a pseudo-multi-function device,
722 * we need explicit matches */
723 if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO)
724 return 0;
725 if (dev->device_no)
726 return 0;
727
728 /* also, FUNC_ID matching needs to be activated by userspace
729 * after it has re-checked that there is no possible module
730 * with a prod_id/manf_id/card_id match.
731 */
732 if (!dev->allow_func_id_match)
733 return 0;
734 }
735
736 dev->dev.driver_data = (void *) did;
737
738 return 1;
739}
740
741
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
743 struct pcmcia_device * p_dev = to_pcmcia_dev(dev);
744 struct pcmcia_driver * p_drv = to_pcmcia_drv(drv);
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700745 struct pcmcia_device_id *did = p_drv->id_table;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746
747 /* matching by cardmgr */
748 if (p_dev->cardmgr == p_drv)
749 return 1;
750
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700751 while (did && did->match_flags) {
752 if (pcmcia_devmatch(p_dev, did))
753 return 1;
754 did++;
755 }
756
Linus Torvalds1da177e2005-04-16 15:20:36 -0700757 return 0;
758}
759
Dominik Brodowski840c2ac2005-06-27 16:28:04 -0700760#ifdef CONFIG_HOTPLUG
761
762static int pcmcia_bus_hotplug(struct device *dev, char **envp, int num_envp,
763 char *buffer, int buffer_size)
764{
765 struct pcmcia_device *p_dev;
766 int i, length = 0;
767 u32 hash[4] = { 0, 0, 0, 0};
768
769 if (!dev)
770 return -ENODEV;
771
772 p_dev = to_pcmcia_dev(dev);
773
774 /* calculate hashes */
775 for (i=0; i<4; i++) {
776 if (!p_dev->prod_id[i])
777 continue;
778 hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i]));
779 }
780
781 i = 0;
782
783 if (add_hotplug_env_var(envp, num_envp, &i,
784 buffer, buffer_size, &length,
785 "SOCKET_NO=%u",
786 p_dev->socket->sock))
787 return -ENOMEM;
788
789 if (add_hotplug_env_var(envp, num_envp, &i,
790 buffer, buffer_size, &length,
791 "DEVICE_NO=%02X",
792 p_dev->device_no))
793 return -ENOMEM;
794
795 if (add_hotplug_env_var(envp, num_envp, &i,
796 buffer, buffer_size, &length,
797 "MODALIAS=pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
798 "pa%08Xpb%08Xpc%08Xpd%08X",
799 p_dev->has_manf_id ? p_dev->manf_id : 0,
800 p_dev->has_card_id ? p_dev->card_id : 0,
801 p_dev->has_func_id ? p_dev->func_id : 0,
802 p_dev->func,
803 p_dev->device_no,
804 hash[0],
805 hash[1],
806 hash[2],
807 hash[3]))
808 return -ENOMEM;
809
810 envp[i] = NULL;
811
812 return 0;
813}
814
815#else
816
817static int pcmcia_bus_hotplug(struct device *dev, char **envp, int num_envp,
818 char *buffer, int buffer_size)
819{
820 return -ENODEV;
821}
822
823#endif
824
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825/************************ per-device sysfs output ***************************/
826
827#define pcmcia_device_attr(field, test, format) \
Yani Ioannoue404e272005-05-17 06:42:58 -0400828static ssize_t field##_show (struct device *dev, struct device_attribute *attr, char *buf) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700829{ \
830 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); \
831 return p_dev->test ? sprintf (buf, format, p_dev->field) : -ENODEV; \
832}
833
834#define pcmcia_device_stringattr(name, field) \
Yani Ioannoue404e272005-05-17 06:42:58 -0400835static ssize_t name##_show (struct device *dev, struct device_attribute *attr, char *buf) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700836{ \
837 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); \
838 return p_dev->field ? sprintf (buf, "%s\n", p_dev->field) : -ENODEV; \
839}
840
841pcmcia_device_attr(func, socket, "0x%02x\n");
842pcmcia_device_attr(func_id, has_func_id, "0x%02x\n");
843pcmcia_device_attr(manf_id, has_manf_id, "0x%04x\n");
844pcmcia_device_attr(card_id, has_card_id, "0x%04x\n");
845pcmcia_device_stringattr(prod_id1, prod_id[0]);
846pcmcia_device_stringattr(prod_id2, prod_id[1]);
847pcmcia_device_stringattr(prod_id3, prod_id[2]);
848pcmcia_device_stringattr(prod_id4, prod_id[3]);
849
850static struct device_attribute pcmcia_dev_attrs[] = {
851 __ATTR(function, 0444, func_show, NULL),
852 __ATTR_RO(func_id),
853 __ATTR_RO(manf_id),
854 __ATTR_RO(card_id),
855 __ATTR_RO(prod_id1),
856 __ATTR_RO(prod_id2),
857 __ATTR_RO(prod_id3),
858 __ATTR_RO(prod_id4),
859 __ATTR_NULL,
860};
861
862
863/*======================================================================
864
865 These manage a ring buffer of events pending for one user process
866
867======================================================================*/
868
869static int queue_empty(user_info_t *user)
870{
871 return (user->event_head == user->event_tail);
872}
873
874static event_t get_queued_event(user_info_t *user)
875{
876 user->event_tail = (user->event_tail+1) % MAX_EVENTS;
877 return user->event[user->event_tail];
878}
879
880static void queue_event(user_info_t *user, event_t event)
881{
882 user->event_head = (user->event_head+1) % MAX_EVENTS;
883 if (user->event_head == user->event_tail)
884 user->event_tail = (user->event_tail+1) % MAX_EVENTS;
885 user->event[user->event_head] = event;
886}
887
888static void handle_event(struct pcmcia_bus_socket *s, event_t event)
889{
890 user_info_t *user;
891 for (user = s->user; user; user = user->next)
892 queue_event(user, event);
893 wake_up_interruptible(&s->queue);
894}
895
896
897/*======================================================================
898
899 The card status event handler.
900
901======================================================================*/
902
903struct send_event_data {
904 struct pcmcia_socket *skt;
905 event_t event;
906 int priority;
907};
908
909static int send_event_callback(struct device *dev, void * _data)
910{
911 struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
912 struct send_event_data *data = _data;
913
914 /* we get called for all sockets, but may only pass the event
915 * for drivers _on the affected socket_ */
916 if (p_dev->socket != data->skt)
917 return 0;
918
919 if (p_dev->client.state & (CLIENT_UNBOUND|CLIENT_STALE))
920 return 0;
921
922 if (p_dev->client.EventMask & data->event)
923 return EVENT(&p_dev->client, data->event, data->priority);
924
925 return 0;
926}
927
928static int send_event(struct pcmcia_socket *s, event_t event, int priority)
929{
930 int ret = 0;
931 struct send_event_data private;
932 struct pcmcia_bus_socket *skt = pcmcia_get_bus_socket(s->pcmcia);
933
934 if (!skt)
935 return 0;
936
937 private.skt = s;
938 private.event = event;
939 private.priority = priority;
940
941 ret = bus_for_each_dev(&pcmcia_bus_type, NULL, &private, send_event_callback);
942
943 pcmcia_put_bus_socket(skt);
944 return ret;
945} /* send_event */
946
947
948/* Normally, the event is passed to individual drivers after
949 * informing userspace. Only for CS_EVENT_CARD_REMOVAL this
950 * is inversed to maintain historic compatibility.
951 */
952
953static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
954{
955 struct pcmcia_bus_socket *s = skt->pcmcia;
956 int ret = 0;
957
958 ds_dbg(1, "ds_event(0x%06x, %d, 0x%p)\n",
959 event, priority, s);
960
961 switch (event) {
962
963 case CS_EVENT_CARD_REMOVAL:
964 s->state &= ~DS_SOCKET_PRESENT;
965 send_event(skt, event, priority);
966 unbind_request(s);
967 handle_event(s, event);
968 break;
969
970 case CS_EVENT_CARD_INSERTION:
971 s->state |= DS_SOCKET_PRESENT;
972 pcmcia_card_add(skt);
973 handle_event(s, event);
974 break;
975
976 case CS_EVENT_EJECTION_REQUEST:
977 ret = send_event(skt, event, priority);
978 break;
979
980 default:
981 handle_event(s, event);
982 send_event(skt, event, priority);
983 break;
984 }
985
986 return 0;
987} /* ds_event */
988
989
990/*======================================================================
991
992 bind_request() and bind_device() are merged by now. Register_client()
993 is called right at the end of bind_request(), during the driver's
994 ->attach() call. Individual descriptions:
995
996 bind_request() connects a socket to a particular client driver.
997 It looks up the specified device ID in the list of registered
998 drivers, binds it to the socket, and tries to create an instance
999 of the device. unbind_request() deletes a driver instance.
1000
1001 Bind_device() associates a device driver with a particular socket.
1002 It is normally called by Driver Services after it has identified
1003 a newly inserted card. An instance of that driver will then be
1004 eligible to register as a client of this socket.
1005
1006 Register_client() uses the dev_info_t handle to match the
1007 caller with a socket. The driver must have already been bound
1008 to a socket with bind_device() -- in fact, bind_device()
1009 allocates the client structure that will be used.
1010
1011======================================================================*/
1012
1013static int bind_request(struct pcmcia_bus_socket *s, bind_info_t *bind_info)
1014{
1015 struct pcmcia_driver *p_drv;
1016 struct pcmcia_device *p_dev;
1017 int ret = 0;
1018 unsigned long flags;
1019
1020 s = pcmcia_get_bus_socket(s);
1021 if (!s)
1022 return -EINVAL;
1023
1024 ds_dbg(2, "bind_request(%d, '%s')\n", s->parent->sock,
1025 (char *)bind_info->dev_info);
1026
1027 p_drv = get_pcmcia_driver(&bind_info->dev_info);
1028 if (!p_drv) {
1029 ret = -EINVAL;
1030 goto err_put;
1031 }
1032
1033 if (!try_module_get(p_drv->owner)) {
1034 ret = -EINVAL;
1035 goto err_put_driver;
1036 }
1037
1038 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
1039 list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
1040 if (p_dev->func == bind_info->function) {
1041 if ((p_dev->dev.driver == &p_drv->drv)) {
1042 if (p_dev->cardmgr) {
1043 /* if there's already a device
1044 * registered, and it was registered
1045 * by userspace before, we need to
1046 * return the "instance". */
1047 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1048 bind_info->instance = p_dev->instance;
1049 ret = -EBUSY;
1050 goto err_put_module;
1051 } else {
1052 /* the correct driver managed to bind
1053 * itself magically to the correct
1054 * device. */
1055 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1056 p_dev->cardmgr = p_drv;
1057 ret = 0;
1058 goto err_put_module;
1059 }
1060 } else if (!p_dev->dev.driver) {
1061 /* there's already a device available where
1062 * no device has been bound to yet. So we don't
1063 * need to register a device! */
1064 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1065 goto rescan;
1066 }
1067 }
1068 }
1069 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1070
1071 p_dev = pcmcia_device_add(s, bind_info->function);
1072 if (!p_dev) {
1073 ret = -EIO;
1074 goto err_put_module;
1075 }
1076
1077rescan:
1078 p_dev->cardmgr = p_drv;
1079
Dominik Brodowski1ad275e2005-06-27 16:28:06 -07001080 /* if a driver is already running, we can abort */
1081 if (p_dev->dev.driver)
1082 goto err_put_module;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083
1084 /*
1085 * Prevent this racing with a card insertion.
1086 */
1087 down(&s->parent->skt_sem);
1088 bus_rescan_devices(&pcmcia_bus_type);
1089 up(&s->parent->skt_sem);
1090
1091 /* check whether the driver indeed matched. I don't care if this
1092 * is racy or not, because it can only happen on cardmgr access
1093 * paths...
1094 */
1095 if (!(p_dev->dev.driver == &p_drv->drv))
1096 p_dev->cardmgr = NULL;
1097
1098 err_put_module:
1099 module_put(p_drv->owner);
1100 err_put_driver:
1101 put_driver(&p_drv->drv);
1102 err_put:
1103 pcmcia_put_bus_socket(s);
1104
1105 return (ret);
1106} /* bind_request */
1107
1108
1109int pcmcia_register_client(client_handle_t *handle, client_reg_t *req)
1110{
1111 client_t *client = NULL;
1112 struct pcmcia_socket *s;
1113 struct pcmcia_bus_socket *skt = NULL;
1114 struct pcmcia_device *p_dev = NULL;
1115
1116 /* Look for unbound client with matching dev_info */
1117 down_read(&pcmcia_socket_list_rwsem);
1118 list_for_each_entry(s, &pcmcia_socket_list, socket_list) {
1119 unsigned long flags;
1120
1121 if (s->state & SOCKET_CARDBUS)
1122 continue;
1123
1124 skt = s->pcmcia;
1125 if (!skt)
1126 continue;
1127 skt = pcmcia_get_bus_socket(skt);
1128 if (!skt)
1129 continue;
1130 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
1131 list_for_each_entry(p_dev, &skt->devices_list, socket_device_list) {
1132 struct pcmcia_driver *p_drv;
1133 p_dev = pcmcia_get_dev(p_dev);
1134 if (!p_dev)
1135 continue;
1136 if (!(p_dev->client.state & CLIENT_UNBOUND) ||
1137 (!p_dev->dev.driver)) {
1138 pcmcia_put_dev(p_dev);
1139 continue;
1140 }
1141 p_drv = to_pcmcia_drv(p_dev->dev.driver);
1142 if (!strncmp(p_drv->drv.name, (char *)req->dev_info, DEV_NAME_LEN)) {
1143 client = &p_dev->client;
1144 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1145 goto found;
1146 }
1147 pcmcia_put_dev(p_dev);
1148 }
1149 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1150 pcmcia_put_bus_socket(skt);
1151 }
1152 found:
1153 up_read(&pcmcia_socket_list_rwsem);
1154 if (!p_dev || !client)
1155 return -ENODEV;
1156
1157 pcmcia_put_bus_socket(skt); /* safe, as we already hold a reference from bind_device */
1158
1159 *handle = client;
1160 client->state &= ~CLIENT_UNBOUND;
1161 client->Socket = s;
1162 client->EventMask = req->EventMask;
1163 client->event_handler = req->event_handler;
1164 client->event_callback_args = req->event_callback_args;
1165 client->event_callback_args.client_handle = client;
1166
1167 if (s->state & SOCKET_CARDBUS)
1168 client->state |= CLIENT_CARDBUS;
1169
1170 if ((!(s->state & SOCKET_CARDBUS)) && (s->functions == 0) &&
1171 (client->Function != BIND_FN_ALL)) {
1172 cistpl_longlink_mfc_t mfc;
1173 if (pccard_read_tuple(s, client->Function, CISTPL_LONGLINK_MFC, &mfc)
1174 == CS_SUCCESS)
1175 s->functions = mfc.nfn;
1176 else
1177 s->functions = 1;
1178 s->config = kmalloc(sizeof(config_t) * s->functions,
1179 GFP_KERNEL);
1180 if (!s->config)
1181 goto out_no_resource;
1182 memset(s->config, 0, sizeof(config_t) * s->functions);
1183 }
1184
1185 ds_dbg(1, "register_client(): client 0x%p, dev %s\n",
1186 client, p_dev->dev.bus_id);
1187 if (client->EventMask & CS_EVENT_REGISTRATION_COMPLETE)
1188 EVENT(client, CS_EVENT_REGISTRATION_COMPLETE, CS_EVENT_PRI_LOW);
1189
1190 if ((s->state & (SOCKET_PRESENT|SOCKET_CARDBUS)) == SOCKET_PRESENT) {
1191 if (client->EventMask & CS_EVENT_CARD_INSERTION)
1192 EVENT(client, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
1193 }
1194
1195 return CS_SUCCESS;
1196
1197 out_no_resource:
1198 pcmcia_put_dev(p_dev);
1199 return CS_OUT_OF_RESOURCE;
1200} /* register_client */
1201EXPORT_SYMBOL(pcmcia_register_client);
1202
1203
1204/*====================================================================*/
1205
1206extern struct pci_bus *pcmcia_lookup_bus(struct pcmcia_socket *s);
1207
1208static int get_device_info(struct pcmcia_bus_socket *s, bind_info_t *bind_info, int first)
1209{
1210 dev_node_t *node;
1211 struct pcmcia_device *p_dev;
1212 unsigned long flags;
1213 int ret = 0;
1214
1215#ifdef CONFIG_CARDBUS
1216 /*
1217 * Some unbelievably ugly code to associate the PCI cardbus
1218 * device and its driver with the PCMCIA "bind" information.
1219 */
1220 {
1221 struct pci_bus *bus;
1222
1223 bus = pcmcia_lookup_bus(s->parent);
1224 if (bus) {
1225 struct list_head *list;
1226 struct pci_dev *dev = NULL;
1227
1228 list = bus->devices.next;
1229 while (list != &bus->devices) {
1230 struct pci_dev *pdev = pci_dev_b(list);
1231 list = list->next;
1232
1233 if (first) {
1234 dev = pdev;
1235 break;
1236 }
1237
1238 /* Try to handle "next" here some way? */
1239 }
1240 if (dev && dev->driver) {
1241 strlcpy(bind_info->name, dev->driver->name, DEV_NAME_LEN);
1242 bind_info->major = 0;
1243 bind_info->minor = 0;
1244 bind_info->next = NULL;
1245 return 0;
1246 }
1247 }
1248 }
1249#endif
1250
1251 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
1252 list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
1253 if (p_dev->func == bind_info->function) {
1254 p_dev = pcmcia_get_dev(p_dev);
1255 if (!p_dev)
1256 continue;
1257 goto found;
1258 }
1259 }
1260 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1261 return -ENODEV;
1262
1263 found:
1264 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1265
1266 if ((!p_dev->instance) ||
1267 (p_dev->instance->state & DEV_CONFIG_PENDING)) {
1268 ret = -EAGAIN;
1269 goto err_put;
1270 }
1271
1272 if (first)
1273 node = p_dev->instance->dev;
1274 else
1275 for (node = p_dev->instance->dev; node; node = node->next)
1276 if (node == bind_info->next)
1277 break;
1278 if (!node) {
1279 ret = -ENODEV;
1280 goto err_put;
1281 }
1282
1283 strlcpy(bind_info->name, node->dev_name, DEV_NAME_LEN);
1284 bind_info->major = node->major;
1285 bind_info->minor = node->minor;
1286 bind_info->next = node->next;
1287
1288 err_put:
1289 pcmcia_put_dev(p_dev);
1290 return (ret);
1291} /* get_device_info */
1292
1293/*====================================================================*/
1294
1295/* unbind _all_ devices attached to a given pcmcia_bus_socket. The
1296 * drivers have been called with EVENT_CARD_REMOVAL before.
1297 */
1298static int unbind_request(struct pcmcia_bus_socket *s)
1299{
1300 struct pcmcia_device *p_dev;
1301 unsigned long flags;
1302
1303 ds_dbg(2, "unbind_request(%d)\n", s->parent->sock);
1304
1305 s->device_count = 0;
1306
1307 for (;;) {
1308 /* unregister all pcmcia_devices registered with this socket*/
1309 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
1310 if (list_empty(&s->devices_list)) {
1311 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1312 return 0;
1313 }
1314 p_dev = list_entry((&s->devices_list)->next, struct pcmcia_device, socket_device_list);
1315 list_del(&p_dev->socket_device_list);
1316 p_dev->client.state |= CLIENT_STALE;
1317 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
1318
1319 device_unregister(&p_dev->dev);
1320 }
1321
1322 return 0;
1323} /* unbind_request */
1324
1325int pcmcia_deregister_client(client_handle_t handle)
1326{
1327 struct pcmcia_socket *s;
1328 int i;
1329 struct pcmcia_device *p_dev = handle_to_pdev(handle);
1330
1331 if (CHECK_HANDLE(handle))
1332 return CS_BAD_HANDLE;
1333
1334 s = SOCKET(handle);
1335 ds_dbg(1, "deregister_client(%p)\n", handle);
1336
1337 if (handle->state & (CLIENT_IRQ_REQ|CLIENT_IO_REQ|CLIENT_CONFIG_LOCKED))
1338 goto warn_out;
1339 for (i = 0; i < MAX_WIN; i++)
1340 if (handle->state & CLIENT_WIN_REQ(i))
1341 goto warn_out;
1342
1343 if (handle->state & CLIENT_STALE) {
1344 handle->client_magic = 0;
1345 handle->state &= ~CLIENT_STALE;
1346 pcmcia_put_dev(p_dev);
1347 } else {
1348 handle->state = CLIENT_UNBOUND;
1349 handle->event_handler = NULL;
1350 }
1351
1352 return CS_SUCCESS;
1353 warn_out:
1354 printk(KERN_WARNING "ds: deregister_client was called too early.\n");
1355 return CS_IN_USE;
1356} /* deregister_client */
1357EXPORT_SYMBOL(pcmcia_deregister_client);
1358
1359
1360/*======================================================================
1361
1362 The user-mode PC Card device interface
1363
1364======================================================================*/
1365
1366static int ds_open(struct inode *inode, struct file *file)
1367{
1368 socket_t i = iminor(inode);
1369 struct pcmcia_bus_socket *s;
1370 user_info_t *user;
1371
1372 ds_dbg(0, "ds_open(socket %d)\n", i);
1373
1374 s = get_socket_info_by_nr(i);
1375 if (!s)
1376 return -ENODEV;
1377 s = pcmcia_get_bus_socket(s);
1378 if (!s)
1379 return -ENODEV;
1380
1381 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
1382 if (s->state & DS_SOCKET_BUSY) {
1383 pcmcia_put_bus_socket(s);
1384 return -EBUSY;
1385 }
1386 else
1387 s->state |= DS_SOCKET_BUSY;
1388 }
1389
1390 user = kmalloc(sizeof(user_info_t), GFP_KERNEL);
1391 if (!user) {
1392 pcmcia_put_bus_socket(s);
1393 return -ENOMEM;
1394 }
1395 user->event_tail = user->event_head = 0;
1396 user->next = s->user;
1397 user->user_magic = USER_MAGIC;
1398 user->socket = s;
1399 s->user = user;
1400 file->private_data = user;
1401
1402 if (s->state & DS_SOCKET_PRESENT)
1403 queue_event(user, CS_EVENT_CARD_INSERTION);
1404 return 0;
1405} /* ds_open */
1406
1407/*====================================================================*/
1408
1409static int ds_release(struct inode *inode, struct file *file)
1410{
1411 struct pcmcia_bus_socket *s;
1412 user_info_t *user, **link;
1413
1414 ds_dbg(0, "ds_release(socket %d)\n", iminor(inode));
1415
1416 user = file->private_data;
1417 if (CHECK_USER(user))
1418 goto out;
1419
1420 s = user->socket;
1421
1422 /* Unlink user data structure */
1423 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
1424 s->state &= ~DS_SOCKET_BUSY;
1425 }
1426 file->private_data = NULL;
1427 for (link = &s->user; *link; link = &(*link)->next)
1428 if (*link == user) break;
1429 if (link == NULL)
1430 goto out;
1431 *link = user->next;
1432 user->user_magic = 0;
1433 kfree(user);
1434 pcmcia_put_bus_socket(s);
1435out:
1436 return 0;
1437} /* ds_release */
1438
1439/*====================================================================*/
1440
1441static ssize_t ds_read(struct file *file, char __user *buf,
1442 size_t count, loff_t *ppos)
1443{
1444 struct pcmcia_bus_socket *s;
1445 user_info_t *user;
1446 int ret;
1447
1448 ds_dbg(2, "ds_read(socket %d)\n", iminor(file->f_dentry->d_inode));
1449
1450 if (count < 4)
1451 return -EINVAL;
1452
1453 user = file->private_data;
1454 if (CHECK_USER(user))
1455 return -EIO;
1456
1457 s = user->socket;
1458 if (s->state & DS_SOCKET_DEAD)
1459 return -EIO;
1460
1461 ret = wait_event_interruptible(s->queue, !queue_empty(user));
1462 if (ret == 0)
1463 ret = put_user(get_queued_event(user), (int __user *)buf) ? -EFAULT : 4;
1464
1465 return ret;
1466} /* ds_read */
1467
1468/*====================================================================*/
1469
1470static ssize_t ds_write(struct file *file, const char __user *buf,
1471 size_t count, loff_t *ppos)
1472{
1473 ds_dbg(2, "ds_write(socket %d)\n", iminor(file->f_dentry->d_inode));
1474
1475 if (count != 4)
1476 return -EINVAL;
1477 if ((file->f_flags & O_ACCMODE) == O_RDONLY)
1478 return -EBADF;
1479
1480 return -EIO;
1481} /* ds_write */
1482
1483/*====================================================================*/
1484
1485/* No kernel lock - fine */
1486static u_int ds_poll(struct file *file, poll_table *wait)
1487{
1488 struct pcmcia_bus_socket *s;
1489 user_info_t *user;
1490
1491 ds_dbg(2, "ds_poll(socket %d)\n", iminor(file->f_dentry->d_inode));
1492
1493 user = file->private_data;
1494 if (CHECK_USER(user))
1495 return POLLERR;
1496 s = user->socket;
1497 /*
1498 * We don't check for a dead socket here since that
1499 * will send cardmgr into an endless spin.
1500 */
1501 poll_wait(file, &s->queue, wait);
1502 if (!queue_empty(user))
1503 return POLLIN | POLLRDNORM;
1504 return 0;
1505} /* ds_poll */
1506
1507/*====================================================================*/
1508
1509extern int pcmcia_adjust_resource_info(adjust_t *adj);
1510
1511static int ds_ioctl(struct inode * inode, struct file * file,
1512 u_int cmd, u_long arg)
1513{
1514 struct pcmcia_bus_socket *s;
1515 void __user *uarg = (char __user *)arg;
1516 u_int size;
1517 int ret, err;
1518 ds_ioctl_arg_t *buf;
1519 user_info_t *user;
1520
1521 ds_dbg(2, "ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
1522
1523 user = file->private_data;
1524 if (CHECK_USER(user))
1525 return -EIO;
1526
1527 s = user->socket;
1528 if (s->state & DS_SOCKET_DEAD)
1529 return -EIO;
1530
1531 size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT;
1532 if (size > sizeof(ds_ioctl_arg_t)) return -EINVAL;
1533
1534 /* Permission check */
1535 if (!(cmd & IOC_OUT) && !capable(CAP_SYS_ADMIN))
1536 return -EPERM;
1537
1538 if (cmd & IOC_IN) {
1539 if (!access_ok(VERIFY_READ, uarg, size)) {
1540 ds_dbg(3, "ds_ioctl(): verify_read = %d\n", -EFAULT);
1541 return -EFAULT;
1542 }
1543 }
1544 if (cmd & IOC_OUT) {
1545 if (!access_ok(VERIFY_WRITE, uarg, size)) {
1546 ds_dbg(3, "ds_ioctl(): verify_write = %d\n", -EFAULT);
1547 return -EFAULT;
1548 }
1549 }
1550 buf = kmalloc(sizeof(ds_ioctl_arg_t), GFP_KERNEL);
1551 if (!buf)
1552 return -ENOMEM;
1553
1554 err = ret = 0;
1555
1556 if (cmd & IOC_IN) __copy_from_user((char *)buf, uarg, size);
1557
1558 switch (cmd) {
1559 case DS_ADJUST_RESOURCE_INFO:
1560 ret = pcmcia_adjust_resource_info(&buf->adjust);
1561 break;
1562 case DS_GET_CARD_SERVICES_INFO:
1563 ret = pcmcia_get_card_services_info(&buf->servinfo);
1564 break;
1565 case DS_GET_CONFIGURATION_INFO:
1566 if (buf->config.Function &&
1567 (buf->config.Function >= s->parent->functions))
1568 ret = CS_BAD_ARGS;
1569 else
1570 ret = pccard_get_configuration_info(s->parent,
1571 buf->config.Function, &buf->config);
1572 break;
1573 case DS_GET_FIRST_TUPLE:
1574 down(&s->parent->skt_sem);
1575 pcmcia_validate_mem(s->parent);
1576 up(&s->parent->skt_sem);
1577 ret = pccard_get_first_tuple(s->parent, BIND_FN_ALL, &buf->tuple);
1578 break;
1579 case DS_GET_NEXT_TUPLE:
1580 ret = pccard_get_next_tuple(s->parent, BIND_FN_ALL, &buf->tuple);
1581 break;
1582 case DS_GET_TUPLE_DATA:
1583 buf->tuple.TupleData = buf->tuple_parse.data;
1584 buf->tuple.TupleDataMax = sizeof(buf->tuple_parse.data);
1585 ret = pccard_get_tuple_data(s->parent, &buf->tuple);
1586 break;
1587 case DS_PARSE_TUPLE:
1588 buf->tuple.TupleData = buf->tuple_parse.data;
1589 ret = pccard_parse_tuple(&buf->tuple, &buf->tuple_parse.parse);
1590 break;
1591 case DS_RESET_CARD:
1592 ret = pccard_reset_card(s->parent);
1593 break;
1594 case DS_GET_STATUS:
1595 if (buf->status.Function &&
1596 (buf->status.Function >= s->parent->functions))
1597 ret = CS_BAD_ARGS;
1598 else
1599 ret = pccard_get_status(s->parent, buf->status.Function, &buf->status);
1600 break;
1601 case DS_VALIDATE_CIS:
1602 down(&s->parent->skt_sem);
1603 pcmcia_validate_mem(s->parent);
1604 up(&s->parent->skt_sem);
1605 ret = pccard_validate_cis(s->parent, BIND_FN_ALL, &buf->cisinfo);
1606 break;
1607 case DS_SUSPEND_CARD:
1608 ret = pcmcia_suspend_card(s->parent);
1609 break;
1610 case DS_RESUME_CARD:
1611 ret = pcmcia_resume_card(s->parent);
1612 break;
1613 case DS_EJECT_CARD:
1614 err = pcmcia_eject_card(s->parent);
1615 break;
1616 case DS_INSERT_CARD:
1617 err = pcmcia_insert_card(s->parent);
1618 break;
1619 case DS_ACCESS_CONFIGURATION_REGISTER:
1620 if ((buf->conf_reg.Action == CS_WRITE) && !capable(CAP_SYS_ADMIN)) {
1621 err = -EPERM;
1622 goto free_out;
1623 }
1624 if (buf->conf_reg.Function &&
1625 (buf->conf_reg.Function >= s->parent->functions))
1626 ret = CS_BAD_ARGS;
1627 else
1628 ret = pccard_access_configuration_register(s->parent,
1629 buf->conf_reg.Function, &buf->conf_reg);
1630 break;
1631 case DS_GET_FIRST_REGION:
1632 case DS_GET_NEXT_REGION:
1633 case DS_BIND_MTD:
1634 if (!capable(CAP_SYS_ADMIN)) {
1635 err = -EPERM;
1636 goto free_out;
1637 } else {
1638 static int printed = 0;
1639 if (!printed) {
1640 printk(KERN_WARNING "2.6. kernels use pcmciamtd instead of memory_cs.c and do not require special\n");
1641 printk(KERN_WARNING "MTD handling any more.\n");
1642 printed++;
1643 }
1644 }
1645 err = -EINVAL;
1646 goto free_out;
1647 break;
1648 case DS_GET_FIRST_WINDOW:
1649 ret = pcmcia_get_window(s->parent, &buf->win_info.handle, 0,
1650 &buf->win_info.window);
1651 break;
1652 case DS_GET_NEXT_WINDOW:
1653 ret = pcmcia_get_window(s->parent, &buf->win_info.handle,
1654 buf->win_info.handle->index + 1, &buf->win_info.window);
1655 break;
1656 case DS_GET_MEM_PAGE:
1657 ret = pcmcia_get_mem_page(buf->win_info.handle,
1658 &buf->win_info.map);
1659 break;
1660 case DS_REPLACE_CIS:
1661 ret = pcmcia_replace_cis(s->parent, &buf->cisdump);
1662 break;
1663 case DS_BIND_REQUEST:
1664 if (!capable(CAP_SYS_ADMIN)) {
1665 err = -EPERM;
1666 goto free_out;
1667 }
1668 err = bind_request(s, &buf->bind_info);
1669 break;
1670 case DS_GET_DEVICE_INFO:
1671 err = get_device_info(s, &buf->bind_info, 1);
1672 break;
1673 case DS_GET_NEXT_DEVICE:
1674 err = get_device_info(s, &buf->bind_info, 0);
1675 break;
1676 case DS_UNBIND_REQUEST:
1677 err = 0;
1678 break;
1679 default:
1680 err = -EINVAL;
1681 }
1682
1683 if ((err == 0) && (ret != CS_SUCCESS)) {
1684 ds_dbg(2, "ds_ioctl: ret = %d\n", ret);
1685 switch (ret) {
1686 case CS_BAD_SOCKET: case CS_NO_CARD:
1687 err = -ENODEV; break;
1688 case CS_BAD_ARGS: case CS_BAD_ATTRIBUTE: case CS_BAD_IRQ:
1689 case CS_BAD_TUPLE:
1690 err = -EINVAL; break;
1691 case CS_IN_USE:
1692 err = -EBUSY; break;
1693 case CS_OUT_OF_RESOURCE:
1694 err = -ENOSPC; break;
1695 case CS_NO_MORE_ITEMS:
1696 err = -ENODATA; break;
1697 case CS_UNSUPPORTED_FUNCTION:
1698 err = -ENOSYS; break;
1699 default:
1700 err = -EIO; break;
1701 }
1702 }
1703
1704 if (cmd & IOC_OUT) {
1705 if (__copy_to_user(uarg, (char *)buf, size))
1706 err = -EFAULT;
1707 }
1708
1709free_out:
1710 kfree(buf);
1711 return err;
1712} /* ds_ioctl */
1713
1714/*====================================================================*/
1715
1716static struct file_operations ds_fops = {
1717 .owner = THIS_MODULE,
1718 .open = ds_open,
1719 .release = ds_release,
1720 .ioctl = ds_ioctl,
1721 .read = ds_read,
1722 .write = ds_write,
1723 .poll = ds_poll,
1724};
1725
1726static int __devinit pcmcia_bus_add_socket(struct class_device *class_dev)
1727{
1728 struct pcmcia_socket *socket = class_get_devdata(class_dev);
1729 struct pcmcia_bus_socket *s;
1730 int ret;
1731
1732 s = kmalloc(sizeof(struct pcmcia_bus_socket), GFP_KERNEL);
1733 if(!s)
1734 return -ENOMEM;
1735 memset(s, 0, sizeof(struct pcmcia_bus_socket));
1736
1737 /* get reference to parent socket */
1738 s->parent = pcmcia_get_socket(socket);
1739 if (!s->parent) {
1740 printk(KERN_ERR "PCMCIA obtaining reference to socket %p failed\n", socket);
1741 kfree (s);
1742 return -ENODEV;
1743 }
1744
1745 kref_init(&s->refcount);
1746
1747 /*
1748 * Ugly. But we want to wait for the socket threads to have started up.
1749 * We really should let the drivers themselves drive some of this..
1750 */
1751 msleep(250);
1752
1753 init_waitqueue_head(&s->queue);
1754 INIT_LIST_HEAD(&s->devices_list);
Dominik Brodowski1ad275e2005-06-27 16:28:06 -07001755 INIT_WORK(&s->device_add, pcmcia_delayed_add_pseudo_device, s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001756
1757 /* Set up hotline to Card Services */
1758 s->callback.owner = THIS_MODULE;
1759 s->callback.event = &ds_event;
1760 s->callback.resources_done = &pcmcia_card_add;
1761 socket->pcmcia = s;
1762
1763 ret = pccard_register_pcmcia(socket, &s->callback);
1764 if (ret) {
1765 printk(KERN_ERR "PCMCIA registration PCCard core failed for socket %p\n", socket);
1766 pcmcia_put_bus_socket(s);
1767 socket->pcmcia = NULL;
1768 return (ret);
1769 }
1770
1771 return 0;
1772}
1773
1774
1775static void pcmcia_bus_remove_socket(struct class_device *class_dev)
1776{
1777 struct pcmcia_socket *socket = class_get_devdata(class_dev);
1778
1779 if (!socket || !socket->pcmcia)
1780 return;
1781
1782 pccard_register_pcmcia(socket, NULL);
1783
1784 socket->pcmcia->state |= DS_SOCKET_DEAD;
1785 pcmcia_put_bus_socket(socket->pcmcia);
1786 socket->pcmcia = NULL;
1787
1788 return;
1789}
1790
1791
1792/* the pcmcia_bus_interface is used to handle pcmcia socket devices */
1793static struct class_interface pcmcia_bus_interface = {
1794 .class = &pcmcia_socket_class,
1795 .add = &pcmcia_bus_add_socket,
1796 .remove = &pcmcia_bus_remove_socket,
1797};
1798
1799
1800struct bus_type pcmcia_bus_type = {
1801 .name = "pcmcia",
Dominik Brodowski840c2ac2005-06-27 16:28:04 -07001802 .hotplug = pcmcia_bus_hotplug,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001803 .match = pcmcia_bus_match,
1804 .dev_attrs = pcmcia_dev_attrs,
1805};
1806EXPORT_SYMBOL(pcmcia_bus_type);
1807
1808
1809static int __init init_pcmcia_bus(void)
1810{
1811 int i;
1812
1813 spin_lock_init(&pcmcia_dev_list_lock);
1814
1815 bus_register(&pcmcia_bus_type);
1816 class_interface_register(&pcmcia_bus_interface);
1817
1818 /* Set up character device for user mode clients */
1819 i = register_chrdev(0, "pcmcia", &ds_fops);
Randy Dunlapafbf5102005-05-16 21:53:56 -07001820 if (i < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001821 printk(KERN_NOTICE "unable to find a free device # for "
Randy Dunlapafbf5102005-05-16 21:53:56 -07001822 "Driver Services (error=%d)\n", i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001823 else
1824 major_dev = i;
1825
1826#ifdef CONFIG_PROC_FS
1827 proc_pccard = proc_mkdir("pccard", proc_bus);
1828 if (proc_pccard)
1829 create_proc_read_entry("drivers",0,proc_pccard,proc_read_drivers,NULL);
1830#endif
1831
1832 return 0;
1833}
1834fs_initcall(init_pcmcia_bus); /* one level after subsys_initcall so that
1835 * pcmcia_socket_class is already registered */
1836
1837
1838static void __exit exit_pcmcia_bus(void)
1839{
1840 class_interface_unregister(&pcmcia_bus_interface);
1841
1842#ifdef CONFIG_PROC_FS
1843 if (proc_pccard) {
1844 remove_proc_entry("drivers", proc_pccard);
1845 remove_proc_entry("pccard", proc_bus);
1846 }
1847#endif
1848 if (major_dev != -1)
1849 unregister_chrdev(major_dev, "pcmcia");
1850
1851 bus_unregister(&pcmcia_bus_type);
1852}
1853module_exit(exit_pcmcia_bus);
1854
1855
1856
1857/* helpers for backwards-compatible functions */
1858
1859static struct pcmcia_bus_socket * get_socket_info_by_nr(unsigned int nr)
1860{
1861 struct pcmcia_socket * s = pcmcia_get_socket_by_nr(nr);
1862 if (s && s->pcmcia)
1863 return s->pcmcia;
1864 else
1865 return NULL;
1866}
1867
1868/* backwards-compatible accessing of driver --- by name! */
1869
1870static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info)
1871{
1872 struct device_driver *drv;
1873 struct pcmcia_driver *p_drv;
1874
1875 drv = driver_find((char *) dev_info, &pcmcia_bus_type);
1876 if (!drv)
1877 return NULL;
1878
1879 p_drv = container_of(drv, struct pcmcia_driver, drv);
1880
1881 return (p_drv);
1882}
1883
1884MODULE_ALIAS("ds");