OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [pcmcia/] [ds.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
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 - 2006      Dominik Brodowski
14
 */
15
 
16
#include <linux/kernel.h>
17
#include <linux/module.h>
18
#include <linux/init.h>
19
#include <linux/errno.h>
20
#include <linux/list.h>
21
#include <linux/delay.h>
22
#include <linux/workqueue.h>
23
#include <linux/crc32.h>
24
#include <linux/firmware.h>
25
#include <linux/kref.h>
26
#include <linux/dma-mapping.h>
27
 
28
#define IN_CARD_SERVICES
29
#include <pcmcia/cs_types.h>
30
#include <pcmcia/cs.h>
31
#include <pcmcia/cistpl.h>
32
#include <pcmcia/ds.h>
33
#include <pcmcia/ss.h>
34
 
35
#include "cs_internal.h"
36
#include "ds_internal.h"
37
 
38
/*====================================================================*/
39
 
40
/* Module parameters */
41
 
42
MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
43
MODULE_DESCRIPTION("PCMCIA Driver Services");
44
MODULE_LICENSE("GPL");
45
 
46
#ifdef DEBUG
47
int ds_pc_debug;
48
 
49
module_param_named(pc_debug, ds_pc_debug, int, 0644);
50
 
51
#define ds_dbg(lvl, fmt, arg...) do {                           \
52
        if (ds_pc_debug > (lvl))                                        \
53
                printk(KERN_DEBUG "ds: " fmt , ## arg);         \
54
} while (0)
55
#else
56
#define ds_dbg(lvl, fmt, arg...) do { } while (0)
57
#endif
58
 
59
spinlock_t pcmcia_dev_list_lock;
60
 
61
/*====================================================================*/
62
 
63
/* code which was in cs.c before */
64
 
65
/* String tables for error messages */
66
 
67
typedef struct lookup_t {
68
    int key;
69
    char *msg;
70
} lookup_t;
71
 
72
static const lookup_t error_table[] = {
73
    { CS_SUCCESS,               "Operation succeeded" },
74
    { CS_BAD_ADAPTER,           "Bad adapter" },
75
    { CS_BAD_ATTRIBUTE,         "Bad attribute", },
76
    { CS_BAD_BASE,              "Bad base address" },
77
    { CS_BAD_EDC,               "Bad EDC" },
78
    { CS_BAD_IRQ,               "Bad IRQ" },
79
    { CS_BAD_OFFSET,            "Bad offset" },
80
    { CS_BAD_PAGE,              "Bad page number" },
81
    { CS_READ_FAILURE,          "Read failure" },
82
    { CS_BAD_SIZE,              "Bad size" },
83
    { CS_BAD_SOCKET,            "Bad socket" },
84
    { CS_BAD_TYPE,              "Bad type" },
85
    { CS_BAD_VCC,               "Bad Vcc" },
86
    { CS_BAD_VPP,               "Bad Vpp" },
87
    { CS_BAD_WINDOW,            "Bad window" },
88
    { CS_WRITE_FAILURE,         "Write failure" },
89
    { CS_NO_CARD,               "No card present" },
90
    { CS_UNSUPPORTED_FUNCTION,  "Usupported function" },
91
    { CS_UNSUPPORTED_MODE,      "Unsupported mode" },
92
    { CS_BAD_SPEED,             "Bad speed" },
93
    { CS_BUSY,                  "Resource busy" },
94
    { CS_GENERAL_FAILURE,       "General failure" },
95
    { CS_WRITE_PROTECTED,       "Write protected" },
96
    { CS_BAD_ARG_LENGTH,        "Bad argument length" },
97
    { CS_BAD_ARGS,              "Bad arguments" },
98
    { CS_CONFIGURATION_LOCKED,  "Configuration locked" },
99
    { CS_IN_USE,                "Resource in use" },
100
    { CS_NO_MORE_ITEMS,         "No more items" },
101
    { CS_OUT_OF_RESOURCE,       "Out of resource" },
102
    { CS_BAD_HANDLE,            "Bad handle" },
103
    { CS_BAD_TUPLE,             "Bad CIS tuple" }
104
};
105
 
106
 
107
static const lookup_t service_table[] = {
108
    { AccessConfigurationRegister,      "AccessConfigurationRegister" },
109
    { AddSocketServices,                "AddSocketServices" },
110
    { AdjustResourceInfo,               "AdjustResourceInfo" },
111
    { CheckEraseQueue,                  "CheckEraseQueue" },
112
    { CloseMemory,                      "CloseMemory" },
113
    { DeregisterClient,                 "DeregisterClient" },
114
    { DeregisterEraseQueue,             "DeregisterEraseQueue" },
115
    { GetCardServicesInfo,              "GetCardServicesInfo" },
116
    { GetClientInfo,                    "GetClientInfo" },
117
    { GetConfigurationInfo,             "GetConfigurationInfo" },
118
    { GetEventMask,                     "GetEventMask" },
119
    { GetFirstClient,                   "GetFirstClient" },
120
    { GetFirstRegion,                   "GetFirstRegion" },
121
    { GetFirstTuple,                    "GetFirstTuple" },
122
    { GetNextClient,                    "GetNextClient" },
123
    { GetNextRegion,                    "GetNextRegion" },
124
    { GetNextTuple,                     "GetNextTuple" },
125
    { GetStatus,                        "GetStatus" },
126
    { GetTupleData,                     "GetTupleData" },
127
    { MapMemPage,                       "MapMemPage" },
128
    { ModifyConfiguration,              "ModifyConfiguration" },
129
    { ModifyWindow,                     "ModifyWindow" },
130
    { OpenMemory,                       "OpenMemory" },
131
    { ParseTuple,                       "ParseTuple" },
132
    { ReadMemory,                       "ReadMemory" },
133
    { RegisterClient,                   "RegisterClient" },
134
    { RegisterEraseQueue,               "RegisterEraseQueue" },
135
    { RegisterMTD,                      "RegisterMTD" },
136
    { ReleaseConfiguration,             "ReleaseConfiguration" },
137
    { ReleaseIO,                        "ReleaseIO" },
138
    { ReleaseIRQ,                       "ReleaseIRQ" },
139
    { ReleaseWindow,                    "ReleaseWindow" },
140
    { RequestConfiguration,             "RequestConfiguration" },
141
    { RequestIO,                        "RequestIO" },
142
    { RequestIRQ,                       "RequestIRQ" },
143
    { RequestSocketMask,                "RequestSocketMask" },
144
    { RequestWindow,                    "RequestWindow" },
145
    { ResetCard,                        "ResetCard" },
146
    { SetEventMask,                     "SetEventMask" },
147
    { ValidateCIS,                      "ValidateCIS" },
148
    { WriteMemory,                      "WriteMemory" },
149
    { BindDevice,                       "BindDevice" },
150
    { BindMTD,                          "BindMTD" },
151
    { ReportError,                      "ReportError" },
152
    { SuspendCard,                      "SuspendCard" },
153
    { ResumeCard,                       "ResumeCard" },
154
    { EjectCard,                        "EjectCard" },
155
    { InsertCard,                       "InsertCard" },
156
    { ReplaceCIS,                       "ReplaceCIS" }
157
};
158
 
159
 
160
static int pcmcia_report_error(struct pcmcia_device *p_dev, error_info_t *err)
161
{
162
        int i;
163
        char *serv;
164
 
165
        if (!p_dev)
166
                printk(KERN_NOTICE);
167
        else
168
                printk(KERN_NOTICE "%s: ", p_dev->dev.bus_id);
169
 
170
        for (i = 0; i < ARRAY_SIZE(service_table); i++)
171
                if (service_table[i].key == err->func)
172
                        break;
173
        if (i < ARRAY_SIZE(service_table))
174
                serv = service_table[i].msg;
175
        else
176
                serv = "Unknown service number";
177
 
178
        for (i = 0; i < ARRAY_SIZE(error_table); i++)
179
                if (error_table[i].key == err->retcode)
180
                        break;
181
        if (i < ARRAY_SIZE(error_table))
182
                printk("%s: %s\n", serv, error_table[i].msg);
183
        else
184
                printk("%s: Unknown error code %#x\n", serv, err->retcode);
185
 
186
        return CS_SUCCESS;
187
} /* report_error */
188
 
189
/* end of code which was in cs.c before */
190
 
191
/*======================================================================*/
192
 
193
void cs_error(struct pcmcia_device *p_dev, int func, int ret)
194
{
195
        error_info_t err = { func, ret };
196
        pcmcia_report_error(p_dev, &err);
197
}
198
EXPORT_SYMBOL(cs_error);
199
 
200
 
201
static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
202
{
203
        struct pcmcia_device_id *did = p_drv->id_table;
204
        unsigned int i;
205
        u32 hash;
206
 
207
        if (!p_drv->probe || !p_drv->remove)
208
                printk(KERN_DEBUG "pcmcia: %s lacks a requisite callback "
209
                       "function\n", p_drv->drv.name);
210
 
211
        while (did && did->match_flags) {
212
                for (i=0; i<4; i++) {
213
                        if (!did->prod_id[i])
214
                                continue;
215
 
216
                        hash = crc32(0, did->prod_id[i], strlen(did->prod_id[i]));
217
                        if (hash == did->prod_id_hash[i])
218
                                continue;
219
 
220
                        printk(KERN_DEBUG "pcmcia: %s: invalid hash for "
221
                               "product string \"%s\": is 0x%x, should "
222
                               "be 0x%x\n", p_drv->drv.name, did->prod_id[i],
223
                               did->prod_id_hash[i], hash);
224
                        printk(KERN_DEBUG "pcmcia: see "
225
                                "Documentation/pcmcia/devicetable.txt for "
226
                                "details\n");
227
                }
228
                did++;
229
        }
230
 
231
        return;
232
}
233
 
234
 
235
/*======================================================================*/
236
 
237
 
238
struct pcmcia_dynid {
239
        struct list_head                node;
240
        struct pcmcia_device_id         id;
241
};
242
 
243
/**
244
 * pcmcia_store_new_id - add a new PCMCIA device ID to this driver and re-probe devices
245
 * @driver: target device driver
246
 * @buf: buffer for scanning device ID data
247
 * @count: input size
248
 *
249
 * Adds a new dynamic PCMCIA device ID to this driver,
250
 * and causes the driver to probe for all devices again.
251
 */
252
static ssize_t
253
pcmcia_store_new_id(struct device_driver *driver, const char *buf, size_t count)
254
{
255
        struct pcmcia_dynid *dynid;
256
        struct pcmcia_driver *pdrv = to_pcmcia_drv(driver);
257
        __u16 match_flags, manf_id, card_id;
258
        __u8 func_id, function, device_no;
259
        __u32 prod_id_hash[4] = {0, 0, 0, 0};
260
        int fields=0;
261
        int retval = 0;
262
 
263
        fields = sscanf(buf, "%hx %hx %hx %hhx %hhx %hhx %x %x %x %x",
264
                        &match_flags, &manf_id, &card_id, &func_id, &function, &device_no,
265
                        &prod_id_hash[0], &prod_id_hash[1], &prod_id_hash[2], &prod_id_hash[3]);
266
        if (fields < 6)
267
                return -EINVAL;
268
 
269
        dynid = kzalloc(sizeof(struct pcmcia_dynid), GFP_KERNEL);
270
        if (!dynid)
271
                return -ENOMEM;
272
 
273
        INIT_LIST_HEAD(&dynid->node);
274
        dynid->id.match_flags = match_flags;
275
        dynid->id.manf_id = manf_id;
276
        dynid->id.card_id = card_id;
277
        dynid->id.func_id = func_id;
278
        dynid->id.function = function;
279
        dynid->id.device_no = device_no;
280
        memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4);
281
 
282
        spin_lock(&pdrv->dynids.lock);
283
        list_add_tail(&pdrv->dynids.list, &dynid->node);
284
        spin_unlock(&pdrv->dynids.lock);
285
 
286
        if (get_driver(&pdrv->drv)) {
287
                retval = driver_attach(&pdrv->drv);
288
                put_driver(&pdrv->drv);
289
        }
290
 
291
        if (retval)
292
                return retval;
293
        return count;
294
}
295
static DRIVER_ATTR(new_id, S_IWUSR, NULL, pcmcia_store_new_id);
296
 
297
static void
298
pcmcia_free_dynids(struct pcmcia_driver *drv)
299
{
300
        struct pcmcia_dynid *dynid, *n;
301
 
302
        spin_lock(&drv->dynids.lock);
303
        list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
304
                list_del(&dynid->node);
305
                kfree(dynid);
306
        }
307
        spin_unlock(&drv->dynids.lock);
308
}
309
 
310
static int
311
pcmcia_create_newid_file(struct pcmcia_driver *drv)
312
{
313
        int error = 0;
314
        if (drv->probe != NULL)
315
                error = sysfs_create_file(&drv->drv.kobj,
316
                                          &driver_attr_new_id.attr);
317
        return error;
318
}
319
 
320
 
321
/**
322
 * pcmcia_register_driver - register a PCMCIA driver with the bus core
323
 * @driver: the &driver being registered
324
 *
325
 * Registers a PCMCIA driver with the PCMCIA bus core.
326
 */
327
int pcmcia_register_driver(struct pcmcia_driver *driver)
328
{
329
        int error;
330
 
331
        if (!driver)
332
                return -EINVAL;
333
 
334
        pcmcia_check_driver(driver);
335
 
336
        /* initialize common fields */
337
        driver->drv.bus = &pcmcia_bus_type;
338
        driver->drv.owner = driver->owner;
339
        spin_lock_init(&driver->dynids.lock);
340
        INIT_LIST_HEAD(&driver->dynids.list);
341
 
342
        ds_dbg(3, "registering driver %s\n", driver->drv.name);
343
 
344
        error = driver_register(&driver->drv);
345
        if (error < 0)
346
                return error;
347
 
348
        error = pcmcia_create_newid_file(driver);
349
        if (error)
350
                driver_unregister(&driver->drv);
351
 
352
        return error;
353
}
354
EXPORT_SYMBOL(pcmcia_register_driver);
355
 
356
/**
357
 * pcmcia_unregister_driver - unregister a PCMCIA driver with the bus core
358
 * @driver: the &driver being unregistered
359
 */
360
void pcmcia_unregister_driver(struct pcmcia_driver *driver)
361
{
362
        ds_dbg(3, "unregistering driver %s\n", driver->drv.name);
363
        driver_unregister(&driver->drv);
364
        pcmcia_free_dynids(driver);
365
}
366
EXPORT_SYMBOL(pcmcia_unregister_driver);
367
 
368
 
369
/* pcmcia_device handling */
370
 
371
struct pcmcia_device * pcmcia_get_dev(struct pcmcia_device *p_dev)
372
{
373
        struct device *tmp_dev;
374
        tmp_dev = get_device(&p_dev->dev);
375
        if (!tmp_dev)
376
                return NULL;
377
        return to_pcmcia_dev(tmp_dev);
378
}
379
 
380
void pcmcia_put_dev(struct pcmcia_device *p_dev)
381
{
382
        if (p_dev)
383
                put_device(&p_dev->dev);
384
}
385
 
386
static void pcmcia_release_function(struct kref *ref)
387
{
388
        struct config_t *c = container_of(ref, struct config_t, ref);
389
        ds_dbg(1, "releasing config_t\n");
390
        kfree(c);
391
}
392
 
393
static void pcmcia_release_dev(struct device *dev)
394
{
395
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
396
        ds_dbg(1, "releasing device %s\n", p_dev->dev.bus_id);
397
        pcmcia_put_socket(p_dev->socket);
398
        kfree(p_dev->devname);
399
        kref_put(&p_dev->function_config->ref, pcmcia_release_function);
400
        kfree(p_dev);
401
}
402
 
403
static void pcmcia_add_device_later(struct pcmcia_socket *s, int mfc)
404
{
405
        if (!s->pcmcia_state.device_add_pending) {
406
                ds_dbg(1, "scheduling to add %s secondary"
407
                       " device to %d\n", mfc ? "mfc" : "pfc", s->sock);
408
                s->pcmcia_state.device_add_pending = 1;
409
                s->pcmcia_state.mfc_pfc = mfc;
410
                schedule_work(&s->device_add);
411
        }
412
        return;
413
}
414
 
415
static int pcmcia_device_probe(struct device * dev)
416
{
417
        struct pcmcia_device *p_dev;
418
        struct pcmcia_driver *p_drv;
419
        struct pcmcia_device_id *did;
420
        struct pcmcia_socket *s;
421
        cistpl_config_t cis_config;
422
        int ret = 0;
423
 
424
        dev = get_device(dev);
425
        if (!dev)
426
                return -ENODEV;
427
 
428
        p_dev = to_pcmcia_dev(dev);
429
        p_drv = to_pcmcia_drv(dev->driver);
430
        s = p_dev->socket;
431
 
432
        ds_dbg(1, "trying to bind %s to %s\n", p_dev->dev.bus_id,
433
               p_drv->drv.name);
434
 
435
        if ((!p_drv->probe) || (!p_dev->function_config) ||
436
            (!try_module_get(p_drv->owner))) {
437
                ret = -EINVAL;
438
                goto put_dev;
439
        }
440
 
441
        /* set up some more device information */
442
        ret = pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_CONFIG,
443
                                &cis_config);
444
        if (!ret) {
445
                p_dev->conf.ConfigBase = cis_config.base;
446
                p_dev->conf.Present = cis_config.rmask[0];
447
        } else {
448
                printk(KERN_INFO "pcmcia: could not parse base and rmask0 of CIS\n");
449
                p_dev->conf.ConfigBase = 0;
450
                p_dev->conf.Present = 0;
451
        }
452
 
453
        ret = p_drv->probe(p_dev);
454
        if (ret) {
455
                ds_dbg(1, "binding %s to %s failed with %d\n",
456
                       p_dev->dev.bus_id, p_drv->drv.name, ret);
457
                goto put_module;
458
        }
459
 
460
        /* handle pseudo multifunction devices:
461
         * there are at most two pseudo multifunction devices.
462
         * if we're matching against the first, schedule a
463
         * call which will then check whether there are two
464
         * pseudo devices, and if not, add the second one.
465
         */
466
        did = p_dev->dev.driver_data;
467
        if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
468
            (p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
469
                pcmcia_add_device_later(p_dev->socket, 0);
470
 
471
 put_module:
472
        if (ret)
473
                module_put(p_drv->owner);
474
 put_dev:
475
        if (ret)
476
                put_device(dev);
477
        return (ret);
478
}
479
 
480
 
481
/*
482
 * Removes a PCMCIA card from the device tree and socket list.
483
 */
484
static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *leftover)
485
{
486
        struct pcmcia_device    *p_dev;
487
        struct pcmcia_device    *tmp;
488
        unsigned long           flags;
489
 
490
        ds_dbg(2, "pcmcia_card_remove(%d) %s\n", s->sock,
491
               leftover ? leftover->devname : "");
492
 
493
        if (!leftover)
494
                s->device_count = 0;
495
        else
496
                s->device_count = 1;
497
 
498
        /* unregister all pcmcia_devices registered with this socket, except leftover */
499
        list_for_each_entry_safe(p_dev, tmp, &s->devices_list, socket_device_list) {
500
                if (p_dev == leftover)
501
                        continue;
502
 
503
                spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
504
                list_del(&p_dev->socket_device_list);
505
                p_dev->_removed=1;
506
                spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
507
 
508
                ds_dbg(2, "unregistering device %s\n", p_dev->dev.bus_id);
509
                device_unregister(&p_dev->dev);
510
        }
511
 
512
        return;
513
}
514
 
515
static int pcmcia_device_remove(struct device * dev)
516
{
517
        struct pcmcia_device *p_dev;
518
        struct pcmcia_driver *p_drv;
519
        struct pcmcia_device_id *did;
520
        int i;
521
 
522
        p_dev = to_pcmcia_dev(dev);
523
        p_drv = to_pcmcia_drv(dev->driver);
524
 
525
        ds_dbg(1, "removing device %s\n", p_dev->dev.bus_id);
526
 
527
        /* If we're removing the primary module driving a
528
         * pseudo multi-function card, we need to unbind
529
         * all devices
530
         */
531
        did = p_dev->dev.driver_data;
532
        if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
533
            (p_dev->socket->device_count != 0) &&
534
            (p_dev->device_no == 0))
535
                pcmcia_card_remove(p_dev->socket, p_dev);
536
 
537
        /* detach the "instance" */
538
        if (!p_drv)
539
                return 0;
540
 
541
        if (p_drv->remove)
542
                p_drv->remove(p_dev);
543
 
544
        p_dev->dev_node = NULL;
545
 
546
        /* check for proper unloading */
547
        if (p_dev->_irq || p_dev->_io || p_dev->_locked)
548
                printk(KERN_INFO "pcmcia: driver %s did not release config properly\n",
549
                       p_drv->drv.name);
550
 
551
        for (i = 0; i < MAX_WIN; i++)
552
                if (p_dev->_win & CLIENT_WIN_REQ(i))
553
                        printk(KERN_INFO "pcmcia: driver %s did not release windows properly\n",
554
                               p_drv->drv.name);
555
 
556
        /* references from pcmcia_probe_device */
557
        pcmcia_put_dev(p_dev);
558
        module_put(p_drv->owner);
559
 
560
        return 0;
561
}
562
 
563
 
564
/*
565
 * pcmcia_device_query -- determine information about a pcmcia device
566
 */
567
static int pcmcia_device_query(struct pcmcia_device *p_dev)
568
{
569
        cistpl_manfid_t manf_id;
570
        cistpl_funcid_t func_id;
571
        cistpl_vers_1_t *vers1;
572
        unsigned int i;
573
 
574
        vers1 = kmalloc(sizeof(*vers1), GFP_KERNEL);
575
        if (!vers1)
576
                return -ENOMEM;
577
 
578
        if (!pccard_read_tuple(p_dev->socket, p_dev->func,
579
                               CISTPL_MANFID, &manf_id)) {
580
                p_dev->manf_id = manf_id.manf;
581
                p_dev->card_id = manf_id.card;
582
                p_dev->has_manf_id = 1;
583
                p_dev->has_card_id = 1;
584
        }
585
 
586
        if (!pccard_read_tuple(p_dev->socket, p_dev->func,
587
                               CISTPL_FUNCID, &func_id)) {
588
                p_dev->func_id = func_id.func;
589
                p_dev->has_func_id = 1;
590
        } else {
591
                /* rule of thumb: cards with no FUNCID, but with
592
                 * common memory device geometry information, are
593
                 * probably memory cards (from pcmcia-cs) */
594
                cistpl_device_geo_t *devgeo;
595
 
596
                devgeo = kmalloc(sizeof(*devgeo), GFP_KERNEL);
597
                if (!devgeo) {
598
                        kfree(vers1);
599
                        return -ENOMEM;
600
                }
601
                if (!pccard_read_tuple(p_dev->socket, p_dev->func,
602
                                      CISTPL_DEVICE_GEO, devgeo)) {
603
                        ds_dbg(0, "mem device geometry probably means "
604
                               "FUNCID_MEMORY\n");
605
                        p_dev->func_id = CISTPL_FUNCID_MEMORY;
606
                        p_dev->has_func_id = 1;
607
                }
608
                kfree(devgeo);
609
        }
610
 
611
        if (!pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_VERS_1,
612
                               vers1)) {
613
                for (i=0; i < vers1->ns; i++) {
614
                        char *tmp;
615
                        unsigned int length;
616
 
617
                        tmp = vers1->str + vers1->ofs[i];
618
 
619
                        length = strlen(tmp) + 1;
620
                        if ((length < 2) || (length > 255))
621
                                continue;
622
 
623
                        p_dev->prod_id[i] = kmalloc(sizeof(char) * length,
624
                                                    GFP_KERNEL);
625
                        if (!p_dev->prod_id[i])
626
                                continue;
627
 
628
                        p_dev->prod_id[i] = strncpy(p_dev->prod_id[i],
629
                                                    tmp, length);
630
                }
631
        }
632
 
633
        kfree(vers1);
634
        return 0;
635
}
636
 
637
 
638
/* device_add_lock is needed to avoid double registration by cardmgr and kernel.
639
 * Serializes pcmcia_device_add; will most likely be removed in future.
640
 *
641
 * While it has the caveat that adding new PCMCIA devices inside(!) device_register()
642
 * won't work, this doesn't matter much at the moment: the driver core doesn't
643
 * support it either.
644
 */
645
static DEFINE_MUTEX(device_add_lock);
646
 
647
struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int function)
648
{
649
        struct pcmcia_device *p_dev, *tmp_dev;
650
        unsigned long flags;
651
        int bus_id_len;
652
 
653
        s = pcmcia_get_socket(s);
654
        if (!s)
655
                return NULL;
656
 
657
        mutex_lock(&device_add_lock);
658
 
659
        ds_dbg(3, "adding device to %d, function %d\n", s->sock, function);
660
 
661
        /* max of 4 devices per card */
662
        if (s->device_count == 4)
663
                goto err_put;
664
 
665
        p_dev = kzalloc(sizeof(struct pcmcia_device), GFP_KERNEL);
666
        if (!p_dev)
667
                goto err_put;
668
 
669
        p_dev->socket = s;
670
        p_dev->device_no = (s->device_count++);
671
        p_dev->func   = function;
672
 
673
        p_dev->dev.bus = &pcmcia_bus_type;
674
        p_dev->dev.parent = s->dev.parent;
675
        p_dev->dev.release = pcmcia_release_dev;
676
        /* by default don't allow DMA */
677
        p_dev->dma_mask = DMA_MASK_NONE;
678
        p_dev->dev.dma_mask = &p_dev->dma_mask;
679
        bus_id_len = sprintf (p_dev->dev.bus_id, "%d.%d", p_dev->socket->sock, p_dev->device_no);
680
 
681
        p_dev->devname = kmalloc(6 + bus_id_len + 1, GFP_KERNEL);
682
        if (!p_dev->devname)
683
                goto err_free;
684
        sprintf (p_dev->devname, "pcmcia%s", p_dev->dev.bus_id);
685
        ds_dbg(3, "devname is %s\n", p_dev->devname);
686
 
687
        spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
688
 
689
        /*
690
         * p_dev->function_config must be the same for all card functions.
691
         * Note that this is serialized by the device_add_lock, so that
692
         * only one such struct will be created.
693
         */
694
        list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list)
695
                if (p_dev->func == tmp_dev->func) {
696
                        p_dev->function_config = tmp_dev->function_config;
697
                        kref_get(&p_dev->function_config->ref);
698
                }
699
 
700
        /* Add to the list in pcmcia_bus_socket */
701
        list_add(&p_dev->socket_device_list, &s->devices_list);
702
 
703
        spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
704
 
705
        if (!p_dev->function_config) {
706
                ds_dbg(3, "creating config_t for %s\n", p_dev->dev.bus_id);
707
                p_dev->function_config = kzalloc(sizeof(struct config_t),
708
                                                 GFP_KERNEL);
709
                if (!p_dev->function_config)
710
                        goto err_unreg;
711
                kref_init(&p_dev->function_config->ref);
712
        }
713
 
714
        printk(KERN_NOTICE "pcmcia: registering new device %s\n",
715
               p_dev->devname);
716
 
717
        pcmcia_device_query(p_dev);
718
 
719
        if (device_register(&p_dev->dev))
720
                goto err_unreg;
721
 
722
        mutex_unlock(&device_add_lock);
723
 
724
        return p_dev;
725
 
726
 err_unreg:
727
        spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
728
        list_del(&p_dev->socket_device_list);
729
        spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
730
 
731
 err_free:
732
        kfree(p_dev->devname);
733
        kfree(p_dev);
734
        s->device_count--;
735
 err_put:
736
        mutex_unlock(&device_add_lock);
737
        pcmcia_put_socket(s);
738
 
739
        return NULL;
740
}
741
 
742
 
743
static int pcmcia_card_add(struct pcmcia_socket *s)
744
{
745
        cisinfo_t cisinfo;
746
        cistpl_longlink_mfc_t mfc;
747
        unsigned int no_funcs, i;
748
        int ret = 0;
749
 
750
        if (!(s->resource_setup_done)) {
751
                ds_dbg(3, "no resources available, delaying card_add\n");
752
                return -EAGAIN; /* try again, but later... */
753
        }
754
 
755
        if (pcmcia_validate_mem(s)) {
756
                ds_dbg(3, "validating mem resources failed, "
757
                       "delaying card_add\n");
758
                return -EAGAIN; /* try again, but later... */
759
        }
760
 
761
        ret = pccard_validate_cis(s, BIND_FN_ALL, &cisinfo);
762
        if (ret || !cisinfo.Chains) {
763
                ds_dbg(0, "invalid CIS or invalid resources\n");
764
                return -ENODEV;
765
        }
766
 
767
        if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, &mfc))
768
                no_funcs = mfc.nfn;
769
        else
770
                no_funcs = 1;
771
        s->functions = no_funcs;
772
 
773
        for (i=0; i < no_funcs; i++)
774
                pcmcia_device_add(s, i);
775
 
776
        return (ret);
777
}
778
 
779
 
780
static void pcmcia_delayed_add_device(struct work_struct *work)
781
{
782
        struct pcmcia_socket *s =
783
                container_of(work, struct pcmcia_socket, device_add);
784
        ds_dbg(1, "adding additional device to %d\n", s->sock);
785
        pcmcia_device_add(s, s->pcmcia_state.mfc_pfc);
786
        s->pcmcia_state.device_add_pending = 0;
787
        s->pcmcia_state.mfc_pfc = 0;
788
}
789
 
790
static int pcmcia_requery(struct device *dev, void * _data)
791
{
792
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
793
        if (!p_dev->dev.driver) {
794
                ds_dbg(1, "update device information for %s\n",
795
                       p_dev->dev.bus_id);
796
                pcmcia_device_query(p_dev);
797
        }
798
 
799
        return 0;
800
}
801
 
802
static void pcmcia_bus_rescan(struct pcmcia_socket *skt, int new_cis)
803
{
804
        int no_devices = 0;
805
        int ret = 0;
806
        unsigned long flags;
807
 
808
        /* must be called with skt_mutex held */
809
        ds_dbg(0, "re-scanning socket %d\n", skt->sock);
810
 
811
        spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
812
        if (list_empty(&skt->devices_list))
813
                no_devices = 1;
814
        spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
815
 
816
        /* If this is because of a CIS override, start over */
817
        if (new_cis && !no_devices)
818
                pcmcia_card_remove(skt, NULL);
819
 
820
        /* if no devices were added for this socket yet because of
821
         * missing resource information or other trouble, we need to
822
         * do this now. */
823
        if (no_devices || new_cis) {
824
                ret = pcmcia_card_add(skt);
825
                if (ret)
826
                        return;
827
        }
828
 
829
        /* some device information might have changed because of a CIS
830
         * update or because we can finally read it correctly... so
831
         * determine it again, overwriting old values if necessary. */
832
        bus_for_each_dev(&pcmcia_bus_type, NULL, NULL, pcmcia_requery);
833
 
834
        /* we re-scan all devices, not just the ones connected to this
835
         * socket. This does not matter, though. */
836
        ret = bus_rescan_devices(&pcmcia_bus_type);
837
        if (ret)
838
                printk(KERN_INFO "pcmcia: bus_rescan_devices failed\n");
839
}
840
 
841
#ifdef CONFIG_PCMCIA_LOAD_CIS
842
 
843
/**
844
 * pcmcia_load_firmware - load CIS from userspace if device-provided is broken
845
 * @dev: the pcmcia device which needs a CIS override
846
 * @filename: requested filename in /lib/firmware/
847
 *
848
 * This uses the in-kernel firmware loading mechanism to use a "fake CIS" if
849
 * the one provided by the card is broken. The firmware files reside in
850
 * /lib/firmware/ in userspace.
851
 */
852
static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
853
{
854
        struct pcmcia_socket *s = dev->socket;
855
        const struct firmware *fw;
856
        char path[20];
857
        int ret = -ENOMEM;
858
        int no_funcs;
859
        int old_funcs;
860
        cisdump_t *cis;
861
        cistpl_longlink_mfc_t mfc;
862
 
863
        if (!filename)
864
                return -EINVAL;
865
 
866
        ds_dbg(1, "trying to load CIS file %s\n", filename);
867
 
868
        if (strlen(filename) > 14) {
869
                printk(KERN_WARNING "pcmcia: CIS filename is too long\n");
870
                return -EINVAL;
871
        }
872
 
873
        snprintf(path, 20, "%s", filename);
874
 
875
        if (request_firmware(&fw, path, &dev->dev) == 0) {
876
                if (fw->size >= CISTPL_MAX_CIS_SIZE) {
877
                        ret = -EINVAL;
878
                        printk(KERN_ERR "pcmcia: CIS override is too big\n");
879
                        goto release;
880
                }
881
 
882
                cis = kzalloc(sizeof(cisdump_t), GFP_KERNEL);
883
                if (!cis) {
884
                        ret = -ENOMEM;
885
                        goto release;
886
                }
887
 
888
                cis->Length = fw->size + 1;
889
                memcpy(cis->Data, fw->data, fw->size);
890
 
891
                if (!pcmcia_replace_cis(s, cis))
892
                        ret = 0;
893
                else {
894
                        printk(KERN_ERR "pcmcia: CIS override failed\n");
895
                        goto release;
896
                }
897
 
898
 
899
                /* update information */
900
                pcmcia_device_query(dev);
901
 
902
                /* does this cis override add or remove functions? */
903
                old_funcs = s->functions;
904
 
905
                if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, &mfc))
906
                        no_funcs = mfc.nfn;
907
                else
908
                        no_funcs = 1;
909
                s->functions = no_funcs;
910
 
911
                if (old_funcs > no_funcs)
912
                        pcmcia_card_remove(s, dev);
913
                else if (no_funcs > old_funcs)
914
                        pcmcia_add_device_later(s, 1);
915
        }
916
 release:
917
        release_firmware(fw);
918
 
919
        return (ret);
920
}
921
 
922
#else /* !CONFIG_PCMCIA_LOAD_CIS */
923
 
924
static inline int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
925
{
926
        return -ENODEV;
927
}
928
 
929
#endif
930
 
931
 
932
static inline int pcmcia_devmatch(struct pcmcia_device *dev,
933
                                  struct pcmcia_device_id *did)
934
{
935
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID) {
936
                if ((!dev->has_manf_id) || (dev->manf_id != did->manf_id))
937
                        return 0;
938
        }
939
 
940
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID) {
941
                if ((!dev->has_card_id) || (dev->card_id != did->card_id))
942
                        return 0;
943
        }
944
 
945
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION) {
946
                if (dev->func != did->function)
947
                        return 0;
948
        }
949
 
950
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1) {
951
                if (!dev->prod_id[0])
952
                        return 0;
953
                if (strcmp(did->prod_id[0], dev->prod_id[0]))
954
                        return 0;
955
        }
956
 
957
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2) {
958
                if (!dev->prod_id[1])
959
                        return 0;
960
                if (strcmp(did->prod_id[1], dev->prod_id[1]))
961
                        return 0;
962
        }
963
 
964
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3) {
965
                if (!dev->prod_id[2])
966
                        return 0;
967
                if (strcmp(did->prod_id[2], dev->prod_id[2]))
968
                        return 0;
969
        }
970
 
971
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4) {
972
                if (!dev->prod_id[3])
973
                        return 0;
974
                if (strcmp(did->prod_id[3], dev->prod_id[3]))
975
                        return 0;
976
        }
977
 
978
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
979
                if (dev->device_no != did->device_no)
980
                        return 0;
981
        }
982
 
983
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID) {
984
                if ((!dev->has_func_id) || (dev->func_id != did->func_id))
985
                        return 0;
986
 
987
                /* if this is a pseudo-multi-function device,
988
                 * we need explicit matches */
989
                if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO)
990
                        return 0;
991
                if (dev->device_no)
992
                        return 0;
993
 
994
                /* also, FUNC_ID matching needs to be activated by userspace
995
                 * after it has re-checked that there is no possible module
996
                 * with a prod_id/manf_id/card_id match.
997
                 */
998
                ds_dbg(0, "skipping FUNC_ID match for %s until userspace "
999
                       "interaction\n", dev->dev.bus_id);
1000
                if (!dev->allow_func_id_match)
1001
                        return 0;
1002
        }
1003
 
1004
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) {
1005
                ds_dbg(0, "device %s needs a fake CIS\n", dev->dev.bus_id);
1006
                if (!dev->socket->fake_cis)
1007
                        pcmcia_load_firmware(dev, did->cisfile);
1008
 
1009
                if (!dev->socket->fake_cis)
1010
                        return 0;
1011
        }
1012
 
1013
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) {
1014
                int i;
1015
                for (i=0; i<4; i++)
1016
                        if (dev->prod_id[i])
1017
                                return 0;
1018
                if (dev->has_manf_id || dev->has_card_id || dev->has_func_id)
1019
                        return 0;
1020
        }
1021
 
1022
        dev->dev.driver_data = (void *) did;
1023
 
1024
        return 1;
1025
}
1026
 
1027
 
1028
static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
1029
        struct pcmcia_device * p_dev = to_pcmcia_dev(dev);
1030
        struct pcmcia_driver * p_drv = to_pcmcia_drv(drv);
1031
        struct pcmcia_device_id *did = p_drv->id_table;
1032
        struct pcmcia_dynid *dynid;
1033
 
1034
        /* match dynamic devices first */
1035
        spin_lock(&p_drv->dynids.lock);
1036
        list_for_each_entry(dynid, &p_drv->dynids.list, node) {
1037
                ds_dbg(3, "trying to match %s to %s\n", dev->bus_id,
1038
                       drv->name);
1039
                if (pcmcia_devmatch(p_dev, &dynid->id)) {
1040
                        ds_dbg(0, "matched %s to %s\n", dev->bus_id,
1041
                               drv->name);
1042
                        spin_unlock(&p_drv->dynids.lock);
1043
                        return 1;
1044
                }
1045
        }
1046
        spin_unlock(&p_drv->dynids.lock);
1047
 
1048
#ifdef CONFIG_PCMCIA_IOCTL
1049
        /* matching by cardmgr */
1050
        if (p_dev->cardmgr == p_drv) {
1051
                ds_dbg(0, "cardmgr matched %s to %s\n", dev->bus_id,
1052
                       drv->name);
1053
                return 1;
1054
        }
1055
#endif
1056
 
1057
        while (did && did->match_flags) {
1058
                ds_dbg(3, "trying to match %s to %s\n", dev->bus_id,
1059
                       drv->name);
1060
                if (pcmcia_devmatch(p_dev, did)) {
1061
                        ds_dbg(0, "matched %s to %s\n", dev->bus_id,
1062
                               drv->name);
1063
                        return 1;
1064
                }
1065
                did++;
1066
        }
1067
 
1068
        return 0;
1069
}
1070
 
1071
#ifdef CONFIG_HOTPLUG
1072
 
1073
static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
1074
{
1075
        struct pcmcia_device *p_dev;
1076
        int i;
1077
        u32 hash[4] = { 0, 0, 0, 0};
1078
 
1079
        if (!dev)
1080
                return -ENODEV;
1081
 
1082
        p_dev = to_pcmcia_dev(dev);
1083
 
1084
        /* calculate hashes */
1085
        for (i=0; i<4; i++) {
1086
                if (!p_dev->prod_id[i])
1087
                        continue;
1088
                hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i]));
1089
        }
1090
 
1091
        if (add_uevent_var(env, "SOCKET_NO=%u", p_dev->socket->sock))
1092
                return -ENOMEM;
1093
 
1094
        if (add_uevent_var(env, "DEVICE_NO=%02X", p_dev->device_no))
1095
                return -ENOMEM;
1096
 
1097
        if (add_uevent_var(env, "MODALIAS=pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
1098
                           "pa%08Xpb%08Xpc%08Xpd%08X",
1099
                           p_dev->has_manf_id ? p_dev->manf_id : 0,
1100
                           p_dev->has_card_id ? p_dev->card_id : 0,
1101
                           p_dev->has_func_id ? p_dev->func_id : 0,
1102
                           p_dev->func,
1103
                           p_dev->device_no,
1104
                           hash[0],
1105
                           hash[1],
1106
                           hash[2],
1107
                           hash[3]))
1108
                return -ENOMEM;
1109
 
1110
        return 0;
1111
}
1112
 
1113
#else
1114
 
1115
static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
1116
{
1117
        return -ENODEV;
1118
}
1119
 
1120
#endif
1121
 
1122
/************************ runtime PM support ***************************/
1123
 
1124
static int pcmcia_dev_suspend(struct device *dev, pm_message_t state);
1125
static int pcmcia_dev_resume(struct device *dev);
1126
 
1127
static int runtime_suspend(struct device *dev)
1128
{
1129
        int rc;
1130
 
1131
        down(&dev->sem);
1132
        rc = pcmcia_dev_suspend(dev, PMSG_SUSPEND);
1133
        up(&dev->sem);
1134
        if (!rc)
1135
                dev->power.power_state.event = PM_EVENT_SUSPEND;
1136
        return rc;
1137
}
1138
 
1139
static void runtime_resume(struct device *dev)
1140
{
1141
        int rc;
1142
 
1143
        down(&dev->sem);
1144
        rc = pcmcia_dev_resume(dev);
1145
        up(&dev->sem);
1146
        if (!rc)
1147
                dev->power.power_state.event = PM_EVENT_ON;
1148
}
1149
 
1150
/************************ per-device sysfs output ***************************/
1151
 
1152
#define pcmcia_device_attr(field, test, format)                         \
1153
static ssize_t field##_show (struct device *dev, struct device_attribute *attr, char *buf)              \
1154
{                                                                       \
1155
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);               \
1156
        return p_dev->test ? sprintf (buf, format, p_dev->field) : -ENODEV; \
1157
}
1158
 
1159
#define pcmcia_device_stringattr(name, field)                                   \
1160
static ssize_t name##_show (struct device *dev, struct device_attribute *attr, char *buf)               \
1161
{                                                                       \
1162
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);               \
1163
        return p_dev->field ? sprintf (buf, "%s\n", p_dev->field) : -ENODEV; \
1164
}
1165
 
1166
pcmcia_device_attr(func, socket, "0x%02x\n");
1167
pcmcia_device_attr(func_id, has_func_id, "0x%02x\n");
1168
pcmcia_device_attr(manf_id, has_manf_id, "0x%04x\n");
1169
pcmcia_device_attr(card_id, has_card_id, "0x%04x\n");
1170
pcmcia_device_stringattr(prod_id1, prod_id[0]);
1171
pcmcia_device_stringattr(prod_id2, prod_id[1]);
1172
pcmcia_device_stringattr(prod_id3, prod_id[2]);
1173
pcmcia_device_stringattr(prod_id4, prod_id[3]);
1174
 
1175
 
1176
static ssize_t pcmcia_show_pm_state(struct device *dev, struct device_attribute *attr, char *buf)
1177
{
1178
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
1179
 
1180
        if (p_dev->suspended)
1181
                return sprintf(buf, "off\n");
1182
        else
1183
                return sprintf(buf, "on\n");
1184
}
1185
 
1186
static ssize_t pcmcia_store_pm_state(struct device *dev, struct device_attribute *attr,
1187
                                     const char *buf, size_t count)
1188
{
1189
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
1190
        int ret = 0;
1191
 
1192
        if (!count)
1193
                return -EINVAL;
1194
 
1195
        if ((!p_dev->suspended) && !strncmp(buf, "off", 3))
1196
                ret = runtime_suspend(dev);
1197
        else if (p_dev->suspended && !strncmp(buf, "on", 2))
1198
                runtime_resume(dev);
1199
 
1200
        return ret ? ret : count;
1201
}
1202
 
1203
 
1204
static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
1205
{
1206
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
1207
        int i;
1208
        u32 hash[4] = { 0, 0, 0, 0};
1209
 
1210
        /* calculate hashes */
1211
        for (i=0; i<4; i++) {
1212
                if (!p_dev->prod_id[i])
1213
                        continue;
1214
                hash[i] = crc32(0,p_dev->prod_id[i],strlen(p_dev->prod_id[i]));
1215
        }
1216
        return sprintf(buf, "pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
1217
                                "pa%08Xpb%08Xpc%08Xpd%08X\n",
1218
                                p_dev->has_manf_id ? p_dev->manf_id : 0,
1219
                                p_dev->has_card_id ? p_dev->card_id : 0,
1220
                                p_dev->has_func_id ? p_dev->func_id : 0,
1221
                                p_dev->func, p_dev->device_no,
1222
                                hash[0], hash[1], hash[2], hash[3]);
1223
}
1224
 
1225
static ssize_t pcmcia_store_allow_func_id_match(struct device *dev,
1226
                struct device_attribute *attr, const char *buf, size_t count)
1227
{
1228
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
1229
        int ret;
1230
 
1231
        if (!count)
1232
                return -EINVAL;
1233
 
1234
        mutex_lock(&p_dev->socket->skt_mutex);
1235
        p_dev->allow_func_id_match = 1;
1236
        mutex_unlock(&p_dev->socket->skt_mutex);
1237
 
1238
        ret = bus_rescan_devices(&pcmcia_bus_type);
1239
        if (ret)
1240
                printk(KERN_INFO "pcmcia: bus_rescan_devices failed after "
1241
                       "allowing func_id matches\n");
1242
 
1243
        return count;
1244
}
1245
 
1246
static struct device_attribute pcmcia_dev_attrs[] = {
1247
        __ATTR(function, 0444, func_show, NULL),
1248
        __ATTR(pm_state, 0644, pcmcia_show_pm_state, pcmcia_store_pm_state),
1249
        __ATTR_RO(func_id),
1250
        __ATTR_RO(manf_id),
1251
        __ATTR_RO(card_id),
1252
        __ATTR_RO(prod_id1),
1253
        __ATTR_RO(prod_id2),
1254
        __ATTR_RO(prod_id3),
1255
        __ATTR_RO(prod_id4),
1256
        __ATTR_RO(modalias),
1257
        __ATTR(allow_func_id_match, 0200, NULL, pcmcia_store_allow_func_id_match),
1258
        __ATTR_NULL,
1259
};
1260
 
1261
/* PM support, also needed for reset */
1262
 
1263
static int pcmcia_dev_suspend(struct device * dev, pm_message_t state)
1264
{
1265
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
1266
        struct pcmcia_driver *p_drv = NULL;
1267
        int ret = 0;
1268
 
1269
        ds_dbg(2, "suspending %s\n", dev->bus_id);
1270
 
1271
        if (dev->driver)
1272
                p_drv = to_pcmcia_drv(dev->driver);
1273
 
1274
        if (!p_drv)
1275
                goto out;
1276
 
1277
        if (p_drv->suspend) {
1278
                ret = p_drv->suspend(p_dev);
1279
                if (ret) {
1280
                        printk(KERN_ERR "pcmcia: device %s (driver %s) did "
1281
                               "not want to go to sleep (%d)\n",
1282
                               p_dev->devname, p_drv->drv.name, ret);
1283
                        goto out;
1284
                }
1285
        }
1286
 
1287
        if (p_dev->device_no == p_dev->func) {
1288
                ds_dbg(2, "releasing configuration for %s\n", dev->bus_id);
1289
                pcmcia_release_configuration(p_dev);
1290
        }
1291
 
1292
 out:
1293
        if (!ret)
1294
                p_dev->suspended = 1;
1295
        return ret;
1296
}
1297
 
1298
 
1299
static int pcmcia_dev_resume(struct device * dev)
1300
{
1301
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
1302
        struct pcmcia_driver *p_drv = NULL;
1303
        int ret = 0;
1304
 
1305
        ds_dbg(2, "resuming %s\n", dev->bus_id);
1306
 
1307
        if (dev->driver)
1308
                p_drv = to_pcmcia_drv(dev->driver);
1309
 
1310
        if (!p_drv)
1311
                goto out;
1312
 
1313
        if (p_dev->device_no == p_dev->func) {
1314
                ds_dbg(2, "requesting configuration for %s\n", dev->bus_id);
1315
                ret = pcmcia_request_configuration(p_dev, &p_dev->conf);
1316
                if (ret)
1317
                        goto out;
1318
        }
1319
 
1320
        if (p_drv->resume)
1321
                ret = p_drv->resume(p_dev);
1322
 
1323
 out:
1324
        if (!ret)
1325
                p_dev->suspended = 0;
1326
        return ret;
1327
}
1328
 
1329
 
1330
static int pcmcia_bus_suspend_callback(struct device *dev, void * _data)
1331
{
1332
        struct pcmcia_socket *skt = _data;
1333
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
1334
 
1335
        if (p_dev->socket != skt || p_dev->suspended)
1336
                return 0;
1337
 
1338
        return runtime_suspend(dev);
1339
}
1340
 
1341
static int pcmcia_bus_resume_callback(struct device *dev, void * _data)
1342
{
1343
        struct pcmcia_socket *skt = _data;
1344
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
1345
 
1346
        if (p_dev->socket != skt || !p_dev->suspended)
1347
                return 0;
1348
 
1349
        runtime_resume(dev);
1350
 
1351
        return 0;
1352
}
1353
 
1354
static int pcmcia_bus_resume(struct pcmcia_socket *skt)
1355
{
1356
        ds_dbg(2, "resuming socket %d\n", skt->sock);
1357
        bus_for_each_dev(&pcmcia_bus_type, NULL, skt, pcmcia_bus_resume_callback);
1358
        return 0;
1359
}
1360
 
1361
static int pcmcia_bus_suspend(struct pcmcia_socket *skt)
1362
{
1363
        ds_dbg(2, "suspending socket %d\n", skt->sock);
1364
        if (bus_for_each_dev(&pcmcia_bus_type, NULL, skt,
1365
                             pcmcia_bus_suspend_callback)) {
1366
                pcmcia_bus_resume(skt);
1367
                return -EIO;
1368
        }
1369
        return 0;
1370
}
1371
 
1372
 
1373
/*======================================================================
1374
 
1375
    The card status event handler.
1376
 
1377
======================================================================*/
1378
 
1379
/* Normally, the event is passed to individual drivers after
1380
 * informing userspace. Only for CS_EVENT_CARD_REMOVAL this
1381
 * is inversed to maintain historic compatibility.
1382
 */
1383
 
1384
static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
1385
{
1386
        struct pcmcia_socket *s = pcmcia_get_socket(skt);
1387
 
1388
        if (!s) {
1389
                printk(KERN_ERR "PCMCIA obtaining reference to socket %p " \
1390
                        "failed, event 0x%x lost!\n", skt, event);
1391
                return -ENODEV;
1392
        }
1393
 
1394
        ds_dbg(1, "ds_event(0x%06x, %d, 0x%p)\n",
1395
               event, priority, skt);
1396
 
1397
        switch (event) {
1398
        case CS_EVENT_CARD_REMOVAL:
1399
                s->pcmcia_state.present = 0;
1400
                pcmcia_card_remove(skt, NULL);
1401
                handle_event(skt, event);
1402
                break;
1403
 
1404
        case CS_EVENT_CARD_INSERTION:
1405
                s->pcmcia_state.present = 1;
1406
                pcmcia_card_add(skt);
1407
                handle_event(skt, event);
1408
                break;
1409
 
1410
        case CS_EVENT_EJECTION_REQUEST:
1411
                break;
1412
 
1413
        case CS_EVENT_PM_SUSPEND:
1414
        case CS_EVENT_PM_RESUME:
1415
        case CS_EVENT_RESET_PHYSICAL:
1416
        case CS_EVENT_CARD_RESET:
1417
        default:
1418
                handle_event(skt, event);
1419
                break;
1420
    }
1421
 
1422
    pcmcia_put_socket(s);
1423
 
1424
    return 0;
1425
} /* ds_event */
1426
 
1427
 
1428
struct pcmcia_device * pcmcia_dev_present(struct pcmcia_device *_p_dev)
1429
{
1430
        struct pcmcia_device *p_dev;
1431
        struct pcmcia_device *ret = NULL;
1432
 
1433
        p_dev = pcmcia_get_dev(_p_dev);
1434
        if (!p_dev)
1435
                return NULL;
1436
 
1437
        if (!p_dev->socket->pcmcia_state.present)
1438
                goto out;
1439
 
1440
        if (p_dev->_removed)
1441
                goto out;
1442
 
1443
        if (p_dev->suspended)
1444
                goto out;
1445
 
1446
        ret = p_dev;
1447
 out:
1448
        pcmcia_put_dev(p_dev);
1449
        return ret;
1450
}
1451
EXPORT_SYMBOL(pcmcia_dev_present);
1452
 
1453
 
1454
static struct pcmcia_callback pcmcia_bus_callback = {
1455
        .owner = THIS_MODULE,
1456
        .event = ds_event,
1457
        .requery = pcmcia_bus_rescan,
1458
        .suspend = pcmcia_bus_suspend,
1459
        .resume = pcmcia_bus_resume,
1460
};
1461
 
1462
static int __devinit pcmcia_bus_add_socket(struct device *dev,
1463
                                           struct class_interface *class_intf)
1464
{
1465
        struct pcmcia_socket *socket = dev_get_drvdata(dev);
1466
        int ret;
1467
 
1468
        socket = pcmcia_get_socket(socket);
1469
        if (!socket) {
1470
                printk(KERN_ERR "PCMCIA obtaining reference to socket %p failed\n", socket);
1471
                return -ENODEV;
1472
        }
1473
 
1474
        /*
1475
         * Ugly. But we want to wait for the socket threads to have started up.
1476
         * We really should let the drivers themselves drive some of this..
1477
         */
1478
        msleep(250);
1479
 
1480
#ifdef CONFIG_PCMCIA_IOCTL
1481
        init_waitqueue_head(&socket->queue);
1482
#endif
1483
        INIT_LIST_HEAD(&socket->devices_list);
1484
        INIT_WORK(&socket->device_add, pcmcia_delayed_add_device);
1485
        memset(&socket->pcmcia_state, 0, sizeof(u8));
1486
        socket->device_count = 0;
1487
 
1488
        ret = pccard_register_pcmcia(socket, &pcmcia_bus_callback);
1489
        if (ret) {
1490
                printk(KERN_ERR "PCMCIA registration PCCard core failed for socket %p\n", socket);
1491
                pcmcia_put_socket(socket);
1492
                return (ret);
1493
        }
1494
 
1495
        return 0;
1496
}
1497
 
1498
static void pcmcia_bus_remove_socket(struct device *dev,
1499
                                     struct class_interface *class_intf)
1500
{
1501
        struct pcmcia_socket *socket = dev_get_drvdata(dev);
1502
 
1503
        if (!socket)
1504
                return;
1505
 
1506
        socket->pcmcia_state.dead = 1;
1507
        pccard_register_pcmcia(socket, NULL);
1508
 
1509
        /* unregister any unbound devices */
1510
        mutex_lock(&socket->skt_mutex);
1511
        pcmcia_card_remove(socket, NULL);
1512
        mutex_unlock(&socket->skt_mutex);
1513
 
1514
        pcmcia_put_socket(socket);
1515
 
1516
        return;
1517
}
1518
 
1519
 
1520
/* the pcmcia_bus_interface is used to handle pcmcia socket devices */
1521
static struct class_interface pcmcia_bus_interface = {
1522
        .class = &pcmcia_socket_class,
1523
        .add_dev = &pcmcia_bus_add_socket,
1524
        .remove_dev = &pcmcia_bus_remove_socket,
1525
};
1526
 
1527
 
1528
struct bus_type pcmcia_bus_type = {
1529
        .name = "pcmcia",
1530
        .uevent = pcmcia_bus_uevent,
1531
        .match = pcmcia_bus_match,
1532
        .dev_attrs = pcmcia_dev_attrs,
1533
        .probe = pcmcia_device_probe,
1534
        .remove = pcmcia_device_remove,
1535
        .suspend = pcmcia_dev_suspend,
1536
        .resume = pcmcia_dev_resume,
1537
};
1538
 
1539
 
1540
static int __init init_pcmcia_bus(void)
1541
{
1542
        int ret;
1543
 
1544
        spin_lock_init(&pcmcia_dev_list_lock);
1545
 
1546
        ret = bus_register(&pcmcia_bus_type);
1547
        if (ret < 0) {
1548
                printk(KERN_WARNING "pcmcia: bus_register error: %d\n", ret);
1549
                return ret;
1550
        }
1551
        ret = class_interface_register(&pcmcia_bus_interface);
1552
        if (ret < 0) {
1553
                printk(KERN_WARNING
1554
                        "pcmcia: class_interface_register error: %d\n", ret);
1555
                bus_unregister(&pcmcia_bus_type);
1556
                return ret;
1557
        }
1558
 
1559
        pcmcia_setup_ioctl();
1560
 
1561
        return 0;
1562
}
1563
fs_initcall(init_pcmcia_bus); /* one level after subsys_initcall so that
1564
                               * pcmcia_socket_class is already registered */
1565
 
1566
 
1567
static void __exit exit_pcmcia_bus(void)
1568
{
1569
        pcmcia_cleanup_ioctl();
1570
 
1571
        class_interface_unregister(&pcmcia_bus_interface);
1572
 
1573
        bus_unregister(&pcmcia_bus_type);
1574
}
1575
module_exit(exit_pcmcia_bus);
1576
 
1577
 
1578
MODULE_ALIAS("ds");

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.