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