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