Annotation of Gnu-Mach/linux/pcmcia-cs/modules/cs.c, revision 1.1.1.1

1.1       root        1: /*======================================================================
                      2: 
                      3:     PCMCIA Card Services -- core services
                      4: 
                      5:     cs.c 1.287 2004/04/09 03:54:25
                      6:     
                      7:     The contents of this file are subject to the Mozilla Public
                      8:     License Version 1.1 (the "License"); you may not use this file
                      9:     except in compliance with the License. You may obtain a copy of
                     10:     the License at http://www.mozilla.org/MPL/
                     11: 
                     12:     Software distributed under the License is distributed on an "AS
                     13:     IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
                     14:     implied. See the License for the specific language governing
                     15:     rights and limitations under the License.
                     16: 
                     17:     The initial developer of the original code is David A. Hinds
                     18:     <[email protected]>.  Portions created by David A. Hinds
                     19:     are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
                     20: 
                     21:     Alternatively, the contents of this file may be used under the
                     22:     terms of the GNU General Public License version 2 (the "GPL"), in
                     23:     which case the provisions of the GPL are applicable instead of the
                     24:     above.  If you wish to allow the use of your version of this file
                     25:     only under the terms of the GPL and not to allow others to use
                     26:     your version of this file under the MPL, indicate your decision
                     27:     by deleting the provisions above and replace them with the notice
                     28:     and other provisions required by the GPL.  If you do not delete
                     29:     the provisions above, a recipient may use your version of this
                     30:     file under either the MPL or the GPL.
                     31:     
                     32: ======================================================================*/
                     33: 
                     34: #include <linux/module.h>
                     35: #include <linux/init.h>
                     36: #include <linux/kernel.h>
                     37: #include <linux/config.h>
                     38: #include <linux/string.h>
                     39: #include <linux/major.h>
                     40: #include <linux/errno.h>
                     41: #include <linux/slab.h>
                     42: #include <linux/mm.h>
                     43: #include <linux/sched.h>
                     44: #include <linux/timer.h>
                     45: #include <linux/ioport.h>
                     46: #include <linux/delay.h>
                     47: #include <linux/proc_fs.h>
                     48: #include <linux/pm.h>
                     49: #include <linux/pci.h>
                     50: #include <linux/spinlock.h>
                     51: #include <asm/system.h>
                     52: #include <asm/irq.h>
                     53: 
                     54: #define IN_CARD_SERVICES
                     55: #include <pcmcia/version.h>
                     56: #include <pcmcia/cs_types.h>
                     57: #include <pcmcia/ss.h>
                     58: #include <pcmcia/cs.h>
                     59: #include <pcmcia/bulkmem.h>
                     60: #include <pcmcia/cistpl.h>
                     61: #include <pcmcia/cisreg.h>
                     62: #include <pcmcia/bus_ops.h>
                     63: #include "cs_internal.h"
                     64: 
                     65: #ifdef CONFIG_PCI
                     66: #define PCI_OPT " [pci]"
                     67: #else
                     68: #define PCI_OPT ""
                     69: #endif
                     70: #ifdef CONFIG_CARDBUS
                     71: #define CB_OPT " [cardbus]"
                     72: #else
                     73: #define CB_OPT ""
                     74: #endif
                     75: #ifdef CONFIG_PM
                     76: #define PM_OPT " [apm]"
                     77: #else
                     78: #define PM_OPT ""
                     79: #endif
                     80: #ifdef CONFIG_PNP_BIOS
                     81: #define PNP_OPT " [pnp]"
                     82: #else
                     83: #define PNP_OPT ""
                     84: #endif
                     85: #if !defined(CONFIG_CARDBUS) && !defined(CONFIG_PCI) && \
                     86:     !defined(CONFIG_PM) && !defined(CONFIG_PNP_BIOS)
                     87: #define OPTIONS " none"
                     88: #else
                     89: #define OPTIONS PCI_OPT CB_OPT PM_OPT PNP_OPT
                     90: #endif
                     91: 
                     92: static const char *release = "Linux PCMCIA Card Services " CS_RELEASE;
                     93: #ifdef UTS_RELEASE
                     94: static const char *kernel = "kernel build: " UTS_RELEASE " " UTS_VERSION;
                     95: #endif
                     96: static const char *options = "options: " OPTIONS;
                     97: 
                     98: /*====================================================================*/
                     99: 
                    100: /* Module parameters */
                    101: 
                    102: MODULE_AUTHOR("David Hinds <[email protected]>");
                    103: MODULE_DESCRIPTION("Linux PCMCIA Card Services " CS_RELEASE
                    104:                   "\n  options:" OPTIONS);
                    105: MODULE_LICENSE("Dual MPL/GPL");
                    106: 
                    107: #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
                    108: 
                    109: INT_MODULE_PARM(setup_delay,   HZ/20);         /* ticks */
                    110: INT_MODULE_PARM(resume_delay,  HZ/5);          /* ticks */
                    111: INT_MODULE_PARM(shutdown_delay,        HZ/40);         /* ticks */
                    112: INT_MODULE_PARM(vcc_settle,    HZ*4/10);       /* ticks */
                    113: INT_MODULE_PARM(reset_time,    10);            /* usecs */
                    114: INT_MODULE_PARM(unreset_delay, HZ/10);         /* ticks */
                    115: INT_MODULE_PARM(unreset_check, HZ/10);         /* ticks */
                    116: INT_MODULE_PARM(unreset_limit, 50);            /* unreset_check's */
                    117: 
                    118: /* Access speed for attribute memory windows */
                    119: INT_MODULE_PARM(cis_speed,     300);           /* ns */
                    120: 
                    121: /* Access speed for IO windows */
                    122: INT_MODULE_PARM(io_speed,      0);             /* ns */
                    123: 
                    124: /* Optional features */
                    125: #ifdef CONFIG_PM
                    126: INT_MODULE_PARM(do_apm, 1);
                    127: #endif
                    128: #ifdef CONFIG_PNP_BIOS
                    129: INT_MODULE_PARM(do_pnp, 1);
                    130: #endif
                    131: 
                    132: #ifdef PCMCIA_DEBUG
                    133: int pc_debug=PCMCIA_DEBUG;
                    134: MODULE_PARM(pc_debug, "i");
                    135: static const char *version =
                    136: "cs.c 1.287 2004/04/09 03:54:25 (David Hinds)";
                    137: #endif
                    138: 
                    139: /*====================================================================*/
                    140: 
                    141: static socket_state_t dead_socket = {
                    142:     0, SS_DETECT, 0, 0, 0
                    143: };
                    144: 
                    145: /* Table of sockets */
                    146: socket_t sockets = 0;
                    147: socket_info_t *socket_table[MAX_SOCK];
                    148: 
                    149: #ifdef HAS_PROC_BUS
                    150: struct proc_dir_entry *proc_pccard = NULL;
                    151: #endif
                    152: 
                    153: /*====================================================================*/
                    154: 
                    155: /* String tables for error messages */
                    156: 
                    157: typedef struct lookup_t {
                    158:     int key;
                    159:     char *msg;
                    160: } lookup_t;
                    161: 
                    162: static const lookup_t error_table[] = {
                    163:     { CS_SUCCESS,              "Operation succeeded" },
                    164:     { CS_BAD_ADAPTER,          "Bad adapter" },
                    165:     { CS_BAD_ATTRIBUTE,        "Bad attribute", },
                    166:     { CS_BAD_BASE,             "Bad base address" },
                    167:     { CS_BAD_EDC,              "Bad EDC" },
                    168:     { CS_BAD_IRQ,              "Bad IRQ" },
                    169:     { CS_BAD_OFFSET,           "Bad offset" },
                    170:     { CS_BAD_PAGE,             "Bad page number" },
                    171:     { CS_READ_FAILURE,         "Read failure" },
                    172:     { CS_BAD_SIZE,             "Bad size" },
                    173:     { CS_BAD_SOCKET,           "Bad socket" },
                    174:     { CS_BAD_TYPE,             "Bad type" },
                    175:     { CS_BAD_VCC,              "Bad Vcc" },
                    176:     { CS_BAD_VPP,              "Bad Vpp" },
                    177:     { CS_BAD_WINDOW,           "Bad window" },
                    178:     { CS_WRITE_FAILURE,                "Write failure" },
                    179:     { CS_NO_CARD,              "No card present" },
                    180:     { CS_UNSUPPORTED_FUNCTION, "Usupported function" },
                    181:     { CS_UNSUPPORTED_MODE,     "Unsupported mode" },
                    182:     { CS_BAD_SPEED,            "Bad speed" },
                    183:     { CS_BUSY,                 "Resource busy" },
                    184:     { CS_GENERAL_FAILURE,      "General failure" },
                    185:     { CS_WRITE_PROTECTED,      "Write protected" },
                    186:     { CS_BAD_ARG_LENGTH,       "Bad argument length" },
                    187:     { CS_BAD_ARGS,             "Bad arguments" },
                    188:     { CS_CONFIGURATION_LOCKED, "Configuration locked" },
                    189:     { CS_IN_USE,               "Resource in use" },
                    190:     { CS_NO_MORE_ITEMS,                "No more items" },
                    191:     { CS_OUT_OF_RESOURCE,      "Out of resource" },
                    192:     { CS_BAD_HANDLE,           "Bad handle" },
                    193:     { CS_BAD_TUPLE,            "Bad CIS tuple" }
                    194: };
                    195: #define ERROR_COUNT (sizeof(error_table)/sizeof(lookup_t))
                    196: 
                    197: static const lookup_t service_table[] = {
                    198:     { AccessConfigurationRegister,     "AccessConfigurationRegister" },
                    199:     { AddSocketServices,               "AddSocketServices" },
                    200:     { AdjustResourceInfo,              "AdjustResourceInfo" },
                    201:     { CheckEraseQueue,                 "CheckEraseQueue" },
                    202:     { CloseMemory,                     "CloseMemory" },
                    203:     { DeregisterClient,                        "DeregisterClient" },
                    204:     { DeregisterEraseQueue,            "DeregisterEraseQueue" },
                    205:     { GetCardServicesInfo,             "GetCardServicesInfo" },
                    206:     { GetClientInfo,                   "GetClientInfo" },
                    207:     { GetConfigurationInfo,            "GetConfigurationInfo" },
                    208:     { GetEventMask,                    "GetEventMask" },
                    209:     { GetFirstClient,                  "GetFirstClient" },
                    210:     { GetFirstRegion,                  "GetFirstRegion" },
                    211:     { GetFirstTuple,                   "GetFirstTuple" },
                    212:     { GetNextClient,                   "GetNextClient" },
                    213:     { GetNextRegion,                   "GetNextRegion" },
                    214:     { GetNextTuple,                    "GetNextTuple" },
                    215:     { GetStatus,                       "GetStatus" },
                    216:     { GetTupleData,                    "GetTupleData" },
                    217:     { MapMemPage,                      "MapMemPage" },
                    218:     { ModifyConfiguration,             "ModifyConfiguration" },
                    219:     { ModifyWindow,                    "ModifyWindow" },
                    220:     { OpenMemory,                      "OpenMemory" },
                    221:     { ParseTuple,                      "ParseTuple" },
                    222:     { ReadMemory,                      "ReadMemory" },
                    223:     { RegisterClient,                  "RegisterClient" },
                    224:     { RegisterEraseQueue,              "RegisterEraseQueue" },
                    225:     { RegisterMTD,                     "RegisterMTD" },
                    226:     { ReleaseConfiguration,            "ReleaseConfiguration" },
                    227:     { ReleaseIO,                       "ReleaseIO" },
                    228:     { ReleaseIRQ,                      "ReleaseIRQ" },
                    229:     { ReleaseWindow,                   "ReleaseWindow" },
                    230:     { RequestConfiguration,            "RequestConfiguration" },
                    231:     { RequestIO,                       "RequestIO" },
                    232:     { RequestIRQ,                      "RequestIRQ" },
                    233:     { RequestSocketMask,               "RequestSocketMask" },
                    234:     { RequestWindow,                   "RequestWindow" },
                    235:     { ResetCard,                       "ResetCard" },
                    236:     { SetEventMask,                    "SetEventMask" },
                    237:     { ValidateCIS,                     "ValidateCIS" },
                    238:     { WriteMemory,                     "WriteMemory" },
                    239:     { BindDevice,                      "BindDevice" },
                    240:     { BindMTD,                         "BindMTD" },
                    241:     { ReportError,                     "ReportError" },
                    242:     { SuspendCard,                     "SuspendCard" },
                    243:     { ResumeCard,                      "ResumeCard" },
                    244:     { EjectCard,                       "EjectCard" },
                    245:     { InsertCard,                      "InsertCard" },
                    246:     { ReplaceCIS,                      "ReplaceCIS" }
                    247: };
                    248: #define SERVICE_COUNT (sizeof(service_table)/sizeof(lookup_t))
                    249: 
                    250: /*======================================================================
                    251: 
                    252:     Reset a socket to the default state
                    253:     
                    254: ======================================================================*/
                    255: 
                    256: static void init_socket(socket_info_t *s)
                    257: {
                    258:     int i;
                    259:     pccard_io_map io = { 0, 0, 0, 0, 1 };
                    260:     pccard_mem_map mem = { 0, 0, 0, 0, 0, 0 };
                    261: 
                    262:     mem.sys_stop = s->cap.map_size;
                    263:     s->socket = dead_socket;
                    264:     s->ss_entry(s->sock, SS_SetSocket, &s->socket);
                    265:     for (i = 0; i < 2; i++) {
                    266:        io.map = i;
                    267:        s->ss_entry(s->sock, SS_SetIOMap, &io);
                    268:     }
                    269:     for (i = 0; i < 5; i++) {
                    270:        mem.map = i;
                    271:        s->ss_entry(s->sock, SS_SetMemMap, &mem);
                    272:     }
                    273: }
                    274: 
                    275: /*====================================================================*/
                    276: 
                    277: #if defined(HAS_PROC_BUS) && defined(PCMCIA_DEBUG)
                    278: static int proc_read_clients(char *buf, char **start, off_t pos,
                    279:                             int count, int *eof, void *data)
                    280: {
                    281:     socket_info_t *s = data;
                    282:     client_handle_t c;
                    283:     char *p = buf;
                    284: 
                    285:     for (c = s->clients; c; c = c->next)
                    286:        p += sprintf(p, "fn %x: '%s' [attr 0x%04x] [state 0x%04x]\n",
                    287:                     c->Function, c->dev_info, c->Attributes, c->state);
                    288:     return (p - buf);
                    289: }
                    290: #endif
                    291: 
                    292: /*======================================================================
                    293: 
                    294:     Low-level PC Card interface drivers need to register with Card
                    295:     Services using these calls.
                    296:     
                    297: ======================================================================*/
                    298: 
                    299: static void setup_socket(u_long i);
                    300: static void shutdown_socket(u_long i);
                    301: static void reset_socket(u_long i);
                    302: static void unreset_socket(u_long i);
                    303: static void parse_events(void *info, u_int events);
                    304: 
                    305: int register_ss_entry(int nsock, ss_entry_t ss_entry)
                    306: {
                    307:     int i, ns;
                    308:     socket_info_t *s;
                    309: 
                    310:     DEBUG(0, "cs: register_ss_entry(%d, 0x%p)\n", nsock, ss_entry);
                    311: 
                    312:     for (ns = 0; ns < nsock; ns++) {
                    313:        s = kmalloc(sizeof(struct socket_info_t), GFP_KERNEL);
                    314:        if (!s) {
                    315:            printk(KERN_NOTICE "cs: memory allocation failure!\n");
                    316:            return (!ns);
                    317:        }
                    318:        memset(s, 0, sizeof(socket_info_t));
                    319:     
                    320:        s->ss_entry = ss_entry;
                    321:        s->sock = ns;
                    322:        s->setup.data = sockets;
                    323:        s->setup.function = &setup_socket;
                    324:        s->shutdown.data = sockets;
                    325:        s->shutdown.function = &shutdown_socket;
                    326:        /* base address = 0, map = 0 */
                    327:        s->cis_mem.flags = 0;
                    328:        s->cis_mem.speed = cis_speed;
                    329:        s->erase_busy.next = s->erase_busy.prev = &s->erase_busy;
                    330:        spin_lock_init(&s->lock);
                    331:        
                    332:        for (i = 0; i < sockets; i++)
                    333:            if (socket_table[i] == NULL) break;
                    334:        socket_table[i] = s;
                    335:        if (i == sockets) sockets++;
                    336: 
                    337:        init_socket(s);
                    338:        ss_entry(ns, SS_InquireSocket, &s->cap);
                    339: #ifdef HAS_PROC_BUS
                    340:        if (proc_pccard) {
                    341:            char name[3];
                    342:            sprintf(name, "%02d", i);
                    343:            s->proc = proc_mkdir(name, proc_pccard);
                    344:            if (s->proc)
                    345:                ss_entry(ns, SS_ProcSetup, s->proc);
                    346: #ifdef PCMCIA_DEBUG
                    347:            if (s->proc)
                    348:                create_proc_read_entry("clients", 0, s->proc,
                    349:                                       proc_read_clients, s);
                    350: #endif
                    351:        }
                    352: #endif
                    353:     }
                    354:     
                    355:     return 0;
                    356: } /* register_ss_entry */
                    357: 
                    358: /*====================================================================*/
                    359: 
                    360: void unregister_ss_entry(ss_entry_t ss_entry)
                    361: {
                    362:     int i, j;
                    363:     socket_info_t *s = NULL;
                    364:     client_t *client;
                    365: 
                    366: #ifdef HAS_PROC_BUS
                    367:     for (i = 0; i < sockets; i++) {
                    368:        s = socket_table[i];
                    369:        if (s->ss_entry != ss_entry) continue;
                    370:        if (proc_pccard) {
                    371:            char name[3];
                    372:            sprintf(name, "%02d", i);
                    373: #ifdef PCMCIA_DEBUG
                    374:            remove_proc_entry("clients", s->proc);
                    375: #endif
                    376:            remove_proc_entry(name, proc_pccard);
                    377:        }
                    378:     }
                    379: #endif
                    380: 
                    381:     for (;;) {
                    382:        for (i = 0; i < sockets; i++) {
                    383:            s = socket_table[i];
                    384:            if (s->ss_entry == ss_entry) break;
                    385:        }
                    386:        if (i == sockets)
                    387:            break;
                    388:        shutdown_socket(i);
                    389:        release_cis_mem(s);
                    390:        while (s->clients) {
                    391:            client = s->clients;
                    392:            s->clients = s->clients->next;
                    393:            kfree(client);
                    394:        }
                    395:        s->ss_entry = NULL;
                    396:        kfree(s);
                    397:        socket_table[i] = NULL;
                    398:        for (j = i; j < sockets-1; j++)
                    399:            socket_table[j] = socket_table[j+1];
                    400:        sockets--;
                    401:     }
                    402:     
                    403: } /* unregister_ss_entry */
                    404: 
                    405: /*======================================================================
                    406: 
                    407:     Shutdown_Socket() and setup_socket() are scheduled using add_timer
                    408:     calls by the main event handler when card insertion and removal
                    409:     events are received.  Shutdown_Socket() unconfigures a socket and
                    410:     turns off socket power.  Setup_socket() turns on socket power
                    411:     and resets the socket, in two stages.
                    412: 
                    413: ======================================================================*/
                    414: 
                    415: static void free_regions(memory_handle_t *list)
                    416: {
                    417:     memory_handle_t tmp;
                    418:     while (*list != NULL) {
                    419:        tmp = *list;
                    420:        *list = tmp->info.next;
                    421:        tmp->region_magic = 0;
                    422:        kfree(tmp);
                    423:     }
                    424: }
                    425: 
                    426: static int send_event(socket_info_t *s, event_t event, int priority);
                    427: 
                    428: static void shutdown_socket(u_long i)
                    429: {
                    430:     socket_info_t *s = socket_table[i];
                    431:     client_t **c;
                    432:     
                    433:     DEBUG(1, "cs: shutdown_socket(%ld)\n", i);
                    434: 
                    435:     /* Blank out the socket state */
                    436:     s->state &= SOCKET_PRESENT|SOCKET_SETUP_PENDING;
                    437:     init_socket(s);
                    438:     s->irq.AssignedIRQ = s->irq.Config = 0;
                    439:     s->lock_count = 0;
                    440:     s->cis_used = 0;
                    441:     if (s->fake_cis) {
                    442:        kfree(s->fake_cis);
                    443:        s->fake_cis = NULL;
                    444:     }
                    445: #ifdef CONFIG_CARDBUS
                    446:     cb_release_cis_mem(s);
                    447:     cb_free(s);
                    448: #endif
                    449:     s->functions = 0;
                    450:     if (s->config) {
                    451:        kfree(s->config);
                    452:        s->config = NULL;
                    453:     }
                    454:     for (c = &s->clients; *c; ) {
                    455:        if ((*c)->state & CLIENT_UNBOUND) {
                    456:            client_t *d = *c;
                    457:            *c = (*c)->next;
                    458:            kfree(d);
                    459:        } else {
                    460:            c = &((*c)->next);
                    461:        }
                    462:     }
                    463:     free_regions(&s->a_region);
                    464:     free_regions(&s->c_region);
                    465: } /* shutdown_socket */
                    466: 
                    467: static void setup_socket(u_long i)
                    468: {
                    469:     int val;
                    470:     socket_info_t *s = socket_table[i];
                    471: 
                    472:     s->ss_entry(s->sock, SS_GetStatus, &val);
                    473:     if (val & SS_PENDING) {
                    474:        /* Does the socket need more time? */
                    475:        DEBUG(2, "cs: setup_socket(%ld): status pending\n", i);
                    476:        if (++s->setup_timeout > 100) {
                    477:            printk(KERN_NOTICE "cs: socket %ld voltage interrogation"
                    478:                   " timed out\n", i);
                    479:        } else {
                    480:            mod_timer(&s->setup, jiffies + HZ/10);
                    481:        }
                    482:     } else if (val & SS_DETECT) {
                    483:        DEBUG(1, "cs: setup_socket(%ld): applying power\n", i);
                    484:        s->state |= SOCKET_PRESENT;
                    485:        s->socket.flags = 0;
                    486:        if (val & SS_3VCARD)
                    487:            s->socket.Vcc = s->socket.Vpp = 33;
                    488:        else if (!(val & SS_XVCARD))
                    489:            s->socket.Vcc = s->socket.Vpp = 50;
                    490:        else {
                    491:            printk(KERN_NOTICE "cs: socket %ld: unsupported "
                    492:                   "voltage key\n", i);
                    493:            s->socket.Vcc = 0;
                    494:        }
                    495:        if (val & SS_CARDBUS) {
                    496:            s->state |= SOCKET_CARDBUS;
                    497: #ifndef CONFIG_CARDBUS
                    498:            printk(KERN_NOTICE "cs: unsupported card type detected!\n");
                    499: #endif
                    500:        }
                    501:        s->ss_entry(s->sock, SS_SetSocket, &s->socket);
                    502:        s->setup.function = &reset_socket;
                    503:        mod_timer(&s->setup, jiffies + vcc_settle);
                    504:     } else
                    505:        DEBUG(0, "cs: setup_socket(%ld): no card!\n", i);
                    506: } /* setup_socket */
                    507: 
                    508: /*======================================================================
                    509: 
                    510:     Reset_socket() and unreset_socket() handle hard resets.  Resets
                    511:     have several causes: card insertion, a call to reset_socket, or
                    512:     recovery from a suspend/resume cycle.  Unreset_socket() sends
                    513:     a CS event that matches the cause of the reset.
                    514:     
                    515: ======================================================================*/
                    516: 
                    517: static void reset_socket(u_long i)
                    518: {
                    519:     socket_info_t *s = socket_table[i];
                    520: 
                    521:     DEBUG(1, "cs: resetting socket %ld\n", i);
                    522:     s->socket.flags |= SS_OUTPUT_ENA | SS_RESET;
                    523:     s->ss_entry(s->sock, SS_SetSocket, &s->socket);
                    524:     udelay((long)reset_time);
                    525:     s->socket.flags &= ~SS_RESET;
                    526:     s->ss_entry(s->sock, SS_SetSocket, &s->socket);
                    527:     s->setup_timeout = 0;
                    528:     s->setup.function = &unreset_socket;
                    529:     mod_timer(&s->setup, jiffies + unreset_delay);
                    530: } /* reset_socket */
                    531: 
                    532: #define EVENT_MASK \
                    533: (SOCKET_SETUP_PENDING|SOCKET_SUSPEND|SOCKET_RESET_PENDING)
                    534: 
                    535: static void unreset_socket(u_long i)
                    536: {
                    537:     socket_info_t *s = socket_table[i];
                    538:     int val;
                    539: 
                    540:     s->ss_entry(s->sock, SS_GetStatus, &val);
                    541:     if (val & SS_READY) {
                    542:        DEBUG(1, "cs: reset done on socket %ld\n", i);
                    543:        if (s->state & SOCKET_SUSPEND) {
                    544:            s->state &= ~EVENT_MASK;
                    545:            if (verify_cis_cache(s) != 0)
                    546:                parse_events(s, SS_DETECT);
                    547:            else
                    548:                send_event(s, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW);
                    549:        } else if (s->state & SOCKET_SETUP_PENDING) {
                    550: #ifdef CONFIG_CARDBUS
                    551:            if (s->state & SOCKET_CARDBUS)
                    552:                cb_alloc(s);
                    553: #endif
                    554:            send_event(s, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
                    555:            s->state &= ~SOCKET_SETUP_PENDING;
                    556:        } else {
                    557:            send_event(s, CS_EVENT_CARD_RESET, CS_EVENT_PRI_LOW);
                    558:            if (s->reset_handle) {
                    559:                s->reset_handle->event_callback_args.info = NULL;
                    560:                EVENT(s->reset_handle, CS_EVENT_RESET_COMPLETE,
                    561:                      CS_EVENT_PRI_LOW);
                    562:                s->state &= ~EVENT_MASK;
                    563:            }
                    564:        }
                    565:     } else {
                    566:        DEBUG(2, "cs: socket %ld not ready yet\n", i);
                    567:        if (++s->setup_timeout > unreset_limit) {
                    568:            printk(KERN_NOTICE "cs: socket %ld timed out during"
                    569:                   " reset\n", i);
                    570:            s->state &= ~EVENT_MASK;
                    571:        } else {
                    572:            mod_timer(&s->setup, jiffies + unreset_check);
                    573:        }
                    574:     }
                    575: } /* unreset_socket */
                    576: 
                    577: /*======================================================================
                    578: 
                    579:     The central event handler.  Send_event() sends an event to all
                    580:     valid clients.  Parse_events() interprets the event bits from
                    581:     a card status change report.  Do_shotdown() handles the high
                    582:     priority stuff associated with a card removal.
                    583:     
                    584: ======================================================================*/
                    585: 
                    586: static int send_event(socket_info_t *s, event_t event, int priority)
                    587: {
                    588:     client_t *client = s->clients;
                    589:     int ret;
                    590:     DEBUG(1, "cs: send_event(sock %d, event %d, pri %d)\n",
                    591:          s->sock, event, priority);
                    592:     ret = 0;
                    593:     for (; client; client = client->next) { 
                    594:        if (client->state & (CLIENT_UNBOUND|CLIENT_STALE))
                    595:            continue;
                    596:        if (client->EventMask & event) {
                    597:            ret = EVENT(client, event, priority);
                    598:            if (ret != 0)
                    599:                return ret;
                    600:        }
                    601:     }
                    602:     return ret;
                    603: } /* send_event */
                    604: 
                    605: static void do_shutdown(socket_info_t *s)
                    606: {
                    607:     client_t *client;
                    608:     if (s->state & SOCKET_SHUTDOWN_PENDING)
                    609:        return;
                    610:     s->state |= SOCKET_SHUTDOWN_PENDING;
                    611:     send_event(s, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
                    612:     for (client = s->clients; client; client = client->next)
                    613:        if (!(client->Attributes & INFO_MASTER_CLIENT))
                    614:            client->state |= CLIENT_STALE;
                    615:     if (s->state & (SOCKET_SETUP_PENDING|SOCKET_RESET_PENDING)) {
                    616:        DEBUG(0, "cs: flushing pending setup\n");
                    617:        del_timer(&s->setup);
                    618:        s->state &= ~EVENT_MASK;
                    619:     }
                    620:     mod_timer(&s->shutdown, jiffies + shutdown_delay);
                    621:     s->state &= ~SOCKET_PRESENT;
                    622: }
                    623: 
                    624: static void parse_events(void *info, u_int events)
                    625: {
                    626:     socket_info_t *s = info;
                    627:     if (events & SS_DETECT) {
                    628:        int status;
                    629:        u_long flags;
                    630:        spin_lock_irqsave(&s->lock, flags);
                    631:        s->ss_entry(s->sock, SS_GetStatus, &status);
                    632:        if ((s->state & SOCKET_PRESENT) &&
                    633:            (!(s->state & SOCKET_SUSPEND) ||
                    634:             !(status & SS_DETECT)))
                    635:            do_shutdown(s);
                    636:        if (status & SS_DETECT) {
                    637:            if (s->state & SOCKET_SETUP_PENDING) {
                    638:                del_timer(&s->setup);
                    639:                DEBUG(1, "cs: delaying pending setup\n");
                    640:            }
                    641:            s->state |= SOCKET_SETUP_PENDING;
                    642:            s->setup.function = &setup_socket;
                    643:            s->setup_timeout = 0;
                    644:            if (s->state & SOCKET_SUSPEND)
                    645:                s->setup.expires = jiffies + resume_delay;
                    646:            else
                    647:                s->setup.expires = jiffies + setup_delay;
                    648:            add_timer(&s->setup);
                    649:        }
                    650:        spin_unlock_irqrestore(&s->lock, flags);
                    651:     }
                    652:     if (events & SS_BATDEAD)
                    653:        send_event(s, CS_EVENT_BATTERY_DEAD, CS_EVENT_PRI_LOW);
                    654:     if (events & SS_BATWARN)
                    655:        send_event(s, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW);
                    656:     if (events & SS_READY) {
                    657:        if (!(s->state & SOCKET_RESET_PENDING))
                    658:            send_event(s, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW);
                    659:        else DEBUG(1, "cs: ready change during reset\n");
                    660:     }
                    661: } /* parse_events */
                    662: 
                    663: /*======================================================================
                    664: 
                    665:     Another event handler, for power management events.
                    666: 
                    667:     This does not comply with the latest PC Card spec for handling
                    668:     power management events.
                    669:     
                    670: ======================================================================*/
                    671: 
                    672: #ifdef CONFIG_PM
                    673: #if (LINUX_VERSION_CODE < VERSION(2,3,43))
                    674: static int handle_pm_event(apm_event_t rqst)
                    675: #else
                    676: static int handle_pm_event(struct pm_dev *dev, pm_request_t rqst,
                    677:                           void *data)
                    678: #endif
                    679: {
                    680:     int i, stat;
                    681:     socket_info_t *s;
                    682:     static int down = 0;
                    683: 
                    684:     /* <linux/pm.h> hides a hack so this works with old APM support */
                    685:     switch (rqst) {
                    686:     case PM_SUSPEND:
                    687:        DEBUG(1, "cs: received suspend notification\n");
                    688:        if (down) {
                    689:            printk(KERN_DEBUG "cs: received extra suspend event\n");
                    690:            break;
                    691:        }
                    692:        down = 1;
                    693:        for (i = 0; i < sockets; i++) {
                    694:            s = socket_table[i];
                    695:            if ((s->state & SOCKET_PRESENT) &&
                    696:                !(s->state & SOCKET_SUSPEND)){
                    697:                send_event(s, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
                    698:                s->ss_entry(s->sock, SS_SetSocket, &dead_socket);
                    699:                s->state |= SOCKET_SUSPEND;
                    700:            }
                    701:        }
                    702:        break;
                    703:     case PM_RESUME:
                    704:        DEBUG(1, "cs: received resume notification\n");
                    705:        if (!down) {
                    706:            printk(KERN_DEBUG "cs: received bogus resume event\n");
                    707:            break;
                    708:        }
                    709:        down = 0;
                    710:        for (i = 0; i < sockets; i++) {
                    711:            s = socket_table[i];
                    712:            /* Do this just to reinitialize the socket */
                    713:            init_socket(s);
                    714:            s->ss_entry(s->sock, SS_GetStatus, &stat);
                    715:            /* If there was or is a card here, we need to do something
                    716:               about it... but parse_events will sort it all out. */
                    717:                    if ((s->state & SOCKET_PRESENT) || (stat & SS_DETECT))
                    718:                parse_events(s, SS_DETECT);
                    719:        }
                    720:        break;
                    721:     }
                    722:     return 0;
                    723: } /* handle_pm_event */
                    724: #endif
                    725: 
                    726: /*======================================================================
                    727: 
                    728:     Special stuff for managing IO windows, because they are scarce.
                    729:     
                    730: ======================================================================*/
                    731: 
                    732: static int alloc_io_space(socket_info_t *s, u_int attr, ioaddr_t *base,
                    733:                          ioaddr_t num, u_int lines, char *name)
                    734: {
                    735:     int i;
                    736:     ioaddr_t try, align;
                    737: 
                    738:     align = (*base) ? (lines ? 1<<lines : 0) : 1;
                    739:     if (align && (align < num)) {
                    740:        if (*base) {
                    741:            DEBUG(0, "odd IO request: num %04x align %04x\n",
                    742:                  num, align);
                    743:            align = 0;
                    744:        } else
                    745:            while (align && (align < num)) align <<= 1;
                    746:     }
                    747:     if (*base & ~(align-1)) {
                    748:        DEBUG(0, "odd IO request: base %04x align %04x\n",
                    749:              *base, align);
                    750:        while (*base & ~(align-1)) align <<= 1;
                    751:     }
                    752:     /* Check for an already-allocated window that must conflict with
                    753:        what was asked for.  It is a hack because it does not catch all
                    754:        potential conflicts, just the most obvious ones. */
                    755:     for (i = 0; i < MAX_IO_WIN; i++)
                    756:        if ((s->io[i].NumPorts != 0) &&
                    757:            ((s->io[i].BasePort & (align-1)) == *base))
                    758:            return 1;
                    759:     for (i = 0; i < MAX_IO_WIN; i++) {
                    760:        if (s->io[i].NumPorts == 0) {
                    761:            if (find_io_region(base, num, align, name) == 0) {
                    762:                s->io[i].Attributes = attr;
                    763:                s->io[i].BasePort = *base;
                    764:                s->io[i].NumPorts = s->io[i].InUse = num;
                    765:                break;
                    766:            } else
                    767:                return 1;
                    768:        } else if (s->io[i].Attributes != attr)
                    769:            continue;
                    770:        /* Try to extend top of window */
                    771:        try = s->io[i].BasePort + s->io[i].NumPorts;
                    772:        if ((*base == 0) || (*base == try))
                    773:            if (find_io_region(&try, num, 0, name) == 0) {
                    774:                *base = try;
                    775:                s->io[i].NumPorts += num;
                    776:                s->io[i].InUse += num;
                    777:                break;
                    778:            }
                    779:        /* Try to extend bottom of window */
                    780:        try = s->io[i].BasePort - num;
                    781:        if ((*base == 0) || (*base == try))
                    782:            if (find_io_region(&try, num, 0, name) == 0) {
                    783:                s->io[i].BasePort = *base = try;
                    784:                s->io[i].NumPorts += num;
                    785:                s->io[i].InUse += num;
                    786:                break;
                    787:            }
                    788:     }
                    789:     return (i == MAX_IO_WIN);
                    790: } /* alloc_io_space */
                    791: 
                    792: static void release_io_space(socket_info_t *s, ioaddr_t base,
                    793:                             ioaddr_t num)
                    794: {
                    795:     int i;
                    796:     release_region(base, num);
                    797:     for (i = 0; i < MAX_IO_WIN; i++) {
                    798:        if ((s->io[i].BasePort <= base) &&
                    799:            (s->io[i].BasePort+s->io[i].NumPorts >= base+num)) {
                    800:            s->io[i].InUse -= num;
                    801:            /* Free the window if no one else is using it */
                    802:            if (s->io[i].InUse == 0)
                    803:                s->io[i].NumPorts = 0;
                    804:        }
                    805:     }
                    806: }
                    807: 
                    808: /*======================================================================
                    809: 
                    810:     Access_configuration_register() reads and writes configuration
                    811:     registers in attribute memory.  Memory window 0 is reserved for
                    812:     this and the tuple reading services.
                    813:     
                    814: ======================================================================*/
                    815: 
                    816: static int access_configuration_register(client_handle_t handle,
                    817:                                         conf_reg_t *reg)
                    818: {
                    819:     socket_info_t *s;
                    820:     config_t *c;
                    821:     int addr;
                    822:     u_char val;
                    823:     
                    824:     if (CHECK_HANDLE(handle))
                    825:        return CS_BAD_HANDLE;
                    826:     s = SOCKET(handle);
                    827:     if (!(s->state & SOCKET_PRESENT))
                    828:        return CS_NO_CARD;
                    829:     if (handle->Function == BIND_FN_ALL) {
                    830:        if (reg->Function >= s->functions)
                    831:            return CS_BAD_ARGS;
                    832:        c = &s->config[reg->Function];
                    833:     } else
                    834:        c = CONFIG(handle);
                    835:     if (!(c->state & CONFIG_LOCKED))
                    836:        return CS_CONFIGURATION_LOCKED;
                    837: 
                    838:     addr = (c->ConfigBase + reg->Offset) >> 1;
                    839:     
                    840:     switch (reg->Action) {
                    841:     case CS_READ:
                    842:        read_cis_mem(s, 1, addr, 1, &val);
                    843:        reg->Value = val;
                    844:        break;
                    845:     case CS_WRITE:
                    846:        val = reg->Value;
                    847:        write_cis_mem(s, 1, addr, 1, &val);
                    848:        break;
                    849:     default:
                    850:        return CS_BAD_ARGS;
                    851:        break;
                    852:     }
                    853:     return CS_SUCCESS;
                    854: } /* access_configuration_register */
                    855: 
                    856: /*======================================================================
                    857: 
                    858:     Bind_device() associates a device driver with a particular socket.
                    859:     It is normally called by Driver Services after it has identified
                    860:     a newly inserted card.  An instance of that driver will then be
                    861:     eligible to register as a client of this socket.
                    862:     
                    863: ======================================================================*/
                    864: 
                    865: static int bind_device(bind_req_t *req)
                    866: {
                    867:     client_t *client;
                    868:     socket_info_t *s;
                    869: 
                    870:     if (CHECK_SOCKET(req->Socket))
                    871:        return CS_BAD_SOCKET;
                    872:     s = SOCKET(req);
                    873: 
                    874:     client = (client_t *)kmalloc(sizeof(client_t), GFP_KERNEL);
                    875:     if (!client) return CS_OUT_OF_RESOURCE;
                    876:     memset(client, '\0', sizeof(client_t));
                    877:     client->client_magic = CLIENT_MAGIC;
                    878:     strncpy(client->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
                    879:     client->Socket = req->Socket;
                    880:     client->Function = req->Function;
                    881:     client->state = CLIENT_UNBOUND;
                    882:     client->erase_busy.next = &client->erase_busy;
                    883:     client->erase_busy.prev = &client->erase_busy;
                    884:     init_waitqueue_head(&client->mtd_req);
                    885:     client->next = s->clients;
                    886:     s->clients = client;
                    887:     DEBUG(1, "cs: bind_device(): client 0x%p, sock %d, dev %s\n",
                    888:          client, client->Socket, client->dev_info);
                    889:     return CS_SUCCESS;
                    890: } /* bind_device */
                    891: 
                    892: /*======================================================================
                    893: 
                    894:     Bind_mtd() associates a device driver with a particular memory
                    895:     region.  It is normally called by Driver Services after it has
                    896:     identified a memory device type.  An instance of the corresponding
                    897:     driver will then be able to register to control this region.
                    898:     
                    899: ======================================================================*/
                    900: 
                    901: static int bind_mtd(mtd_bind_t *req)
                    902: {
                    903:     socket_info_t *s;
                    904:     memory_handle_t region;
                    905:     
                    906:     if (CHECK_SOCKET(req->Socket))
                    907:        return CS_BAD_SOCKET;
                    908:     s = SOCKET(req);
                    909:     
                    910:     if (req->Attributes & REGION_TYPE_AM)
                    911:        region = s->a_region;
                    912:     else
                    913:        region = s->c_region;
                    914:     
                    915:     while (region) {
                    916:        if (region->info.CardOffset == req->CardOffset) break;
                    917:        region = region->info.next;
                    918:     }
                    919:     if (!region || (region->mtd != NULL))
                    920:        return CS_BAD_OFFSET;
                    921:     strncpy(region->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
                    922:     
                    923:     DEBUG(1, "cs: bind_mtd(): attr 0x%x, offset 0x%x, dev %s\n",
                    924:          req->Attributes, req->CardOffset, (char *)req->dev_info);
                    925:     return CS_SUCCESS;
                    926: } /* bind_mtd */
                    927: 
                    928: /*====================================================================*/
                    929: 
                    930: static int deregister_client(client_handle_t handle)
                    931: {
                    932:     client_t **client;
                    933:     socket_info_t *s;
                    934:     memory_handle_t region;
                    935:     u_long flags;
                    936:     int i, sn;
                    937:     
                    938:     DEBUG(1, "cs: deregister_client(%p)\n", handle);
                    939:     if (CHECK_HANDLE(handle))
                    940:        return CS_BAD_HANDLE;
                    941:     if (handle->state &
                    942:        (CLIENT_IRQ_REQ|CLIENT_IO_REQ|CLIENT_CONFIG_LOCKED))
                    943:        return CS_IN_USE;
                    944:     for (i = 0; i < MAX_WIN; i++)
                    945:        if (handle->state & CLIENT_WIN_REQ(i))
                    946:            return CS_IN_USE;
                    947: 
                    948:     /* Disconnect all MTD links */
                    949:     s = SOCKET(handle);
                    950:     if (handle->mtd_count) {
                    951:        for (region = s->a_region; region; region = region->info.next)
                    952:            if (region->mtd == handle) region->mtd = NULL;
                    953:        for (region = s->c_region; region; region = region->info.next)
                    954:            if (region->mtd == handle) region->mtd = NULL;
                    955:     }
                    956:     
                    957:     sn = handle->Socket; s = socket_table[sn];
                    958: 
                    959:     if ((handle->state & CLIENT_STALE) ||
                    960:        (handle->Attributes & INFO_MASTER_CLIENT)) {
                    961:        spin_lock_irqsave(&s->lock, flags);
                    962:        client = &s->clients;
                    963:        while ((*client) && ((*client) != handle))
                    964:            client = &(*client)->next;
                    965:        if (*client == NULL) {
                    966:            spin_unlock_irqrestore(&s->lock, flags);
                    967:            return CS_BAD_HANDLE;
                    968:        }
                    969:        *client = handle->next;
                    970:        handle->client_magic = 0;
                    971:        kfree(handle);
                    972:        spin_unlock_irqrestore(&s->lock, flags);
                    973:     } else {
                    974:        handle->state = CLIENT_UNBOUND;
                    975:        handle->mtd_count = 0;
                    976:        handle->event_handler = NULL;
                    977:     }
                    978: 
                    979:     if (--s->real_clients == 0)
                    980:        s->ss_entry(sn, SS_RegisterCallback, NULL);
                    981:     
                    982:     return CS_SUCCESS;
                    983: } /* deregister_client */
                    984: 
                    985: /*====================================================================*/
                    986: 
                    987: static int get_configuration_info(client_handle_t handle,
                    988:                                  config_info_t *config)
                    989: {
                    990:     socket_info_t *s;
                    991:     config_t *c;
                    992:     
                    993:     if (CHECK_HANDLE(handle))
                    994:        return CS_BAD_HANDLE;
                    995:     s = SOCKET(handle);
                    996:     if (!(s->state & SOCKET_PRESENT))
                    997:        return CS_NO_CARD;
                    998: 
                    999:     if (handle->Function == BIND_FN_ALL) {
                   1000:        if (config->Function && (config->Function >= s->functions))
                   1001:            return CS_BAD_ARGS;
                   1002:     } else
                   1003:        config->Function = handle->Function;
                   1004:     
                   1005: #ifdef CONFIG_CARDBUS
                   1006:     if (s->state & SOCKET_CARDBUS) {
                   1007:        u_char fn = config->Function;
                   1008:        memset(config, 0, sizeof(config_info_t));
                   1009:        config->Function = fn;
                   1010:        config->Vcc = s->socket.Vcc;
                   1011:        config->Vpp1 = config->Vpp2 = s->socket.Vpp;
                   1012:        config->Option = s->cap.cardbus;
                   1013:        config->IntType = INT_CARDBUS;
                   1014:        /* This is a nasty hack */
                   1015:        pcibios_read_config_dword(s->cap.cardbus, 0, 0, &config->ConfigBase);
                   1016:        if (s->cb_config) {
                   1017:            config->Attributes = CONF_VALID_CLIENT;
                   1018:            config->AssignedIRQ = s->irq.AssignedIRQ;
                   1019:            if (config->AssignedIRQ)
                   1020:                config->Attributes |= CONF_ENABLE_IRQ;
                   1021:            config->BasePort1 = s->io[0].BasePort;
                   1022:            config->NumPorts1 = s->io[0].NumPorts;
                   1023:        }
                   1024:        return CS_SUCCESS;
                   1025:     }
                   1026: #endif
                   1027:     
                   1028:     c = (s->config != NULL) ? &s->config[config->Function] : NULL;
                   1029:     
                   1030:     if ((c == NULL) || !(c->state & CONFIG_LOCKED)) {
                   1031:        config->Attributes = 0;
                   1032:        config->Vcc = s->socket.Vcc;
                   1033:        config->Vpp1 = config->Vpp2 = s->socket.Vpp;
                   1034:        return CS_SUCCESS;
                   1035:     }
                   1036:     
                   1037:     /* !!! This is a hack !!! */
                   1038:     memcpy(&config->Attributes, &c->Attributes, sizeof(config_t));
                   1039:     config->Attributes |= CONF_VALID_CLIENT;
                   1040:     config->CardValues = c->CardValues;
                   1041:     config->IRQAttributes = c->irq.Attributes;
                   1042:     config->AssignedIRQ = s->irq.AssignedIRQ;
                   1043:     config->BasePort1 = c->io.BasePort1;
                   1044:     config->NumPorts1 = c->io.NumPorts1;
                   1045:     config->Attributes1 = c->io.Attributes1;
                   1046:     config->BasePort2 = c->io.BasePort2;
                   1047:     config->NumPorts2 = c->io.NumPorts2;
                   1048:     config->Attributes2 = c->io.Attributes2;
                   1049:     config->IOAddrLines = c->io.IOAddrLines;
                   1050:     
                   1051:     return CS_SUCCESS;
                   1052: } /* get_configuration_info */
                   1053: 
                   1054: /*======================================================================
                   1055: 
                   1056:     Return information about this version of Card Services.
                   1057:     
                   1058: ======================================================================*/
                   1059: 
                   1060: static int get_card_services_info(servinfo_t *info)
                   1061: {
                   1062:     info->Signature[0] = 'C';
                   1063:     info->Signature[1] = 'S';
                   1064:     info->Count = sockets;
                   1065:     info->Revision = CS_RELEASE_CODE;
                   1066:     info->CSLevel = 0x0210;
                   1067:     info->VendorString = (char *)release;
                   1068:     return CS_SUCCESS;
                   1069: } /* get_card_services_info */
                   1070: 
                   1071: /*======================================================================
                   1072: 
                   1073:     Note that get_first_client() *does* recognize the Socket field
                   1074:     in the request structure.
                   1075:     
                   1076: ======================================================================*/
                   1077: 
                   1078: static int get_first_client(client_handle_t *handle, client_req_t *req)
                   1079: {
                   1080:     socket_t s;
                   1081:     if (req->Attributes & CLIENT_THIS_SOCKET)
                   1082:        s = req->Socket;
                   1083:     else
                   1084:        s = 0;
                   1085:     if (CHECK_SOCKET(req->Socket))
                   1086:        return CS_BAD_SOCKET;
                   1087:     if (socket_table[s]->clients == NULL)
                   1088:        return CS_NO_MORE_ITEMS;
                   1089:     *handle = socket_table[s]->clients;
                   1090:     return CS_SUCCESS;
                   1091: } /* get_first_client */
                   1092: 
                   1093: /*====================================================================*/
                   1094: 
                   1095: static int get_next_client(client_handle_t *handle, client_req_t *req)
                   1096: {
                   1097:     socket_info_t *s;
                   1098:     if ((handle == NULL) || CHECK_HANDLE(*handle))
                   1099:        return CS_BAD_HANDLE;
                   1100:     if ((*handle)->next == NULL) {
                   1101:        if (req->Attributes & CLIENT_THIS_SOCKET)
                   1102:            return CS_NO_MORE_ITEMS;
                   1103:        s = SOCKET(*handle);
                   1104:        if (s->clients == NULL)
                   1105:            return CS_NO_MORE_ITEMS;
                   1106:        *handle = s->clients;
                   1107:     } else
                   1108:        *handle = (*handle)->next;
                   1109:     return CS_SUCCESS;
                   1110: } /* get_next_client */
                   1111: 
                   1112: /*====================================================================*/
                   1113: 
                   1114: static int get_window(window_handle_t *handle, int idx, win_req_t *req)
                   1115: {
                   1116:     socket_info_t *s;
                   1117:     window_t *win;
                   1118:     int w;
                   1119: 
                   1120:     if (idx == 0)
                   1121:        s = SOCKET((client_handle_t)*handle);
                   1122:     else
                   1123:        s = (*handle)->sock;
                   1124:     if (!(s->state & SOCKET_PRESENT))
                   1125:        return CS_NO_CARD;
                   1126:     for (w = idx; w < MAX_WIN; w++)
                   1127:        if (s->state & SOCKET_WIN_REQ(w)) break;
                   1128:     if (w == MAX_WIN)
                   1129:        return CS_NO_MORE_ITEMS;
                   1130:     win = &s->win[w];
                   1131:     req->Base = win->ctl.sys_start;
                   1132:     req->Size = win->ctl.sys_stop - win->ctl.sys_start + 1;
                   1133:     req->AccessSpeed = win->ctl.speed;
                   1134:     req->Attributes = 0;
                   1135:     if (win->ctl.flags & MAP_ATTRIB)
                   1136:        req->Attributes |= WIN_MEMORY_TYPE_AM;
                   1137:     if (win->ctl.flags & MAP_ACTIVE)
                   1138:        req->Attributes |= WIN_ENABLE;
                   1139:     if (win->ctl.flags & MAP_16BIT)
                   1140:        req->Attributes |= WIN_DATA_WIDTH_16;
                   1141:     if (win->ctl.flags & MAP_USE_WAIT)
                   1142:        req->Attributes |= WIN_USE_WAIT;
                   1143:     *handle = win;
                   1144:     return CS_SUCCESS;
                   1145: } /* get_window */
                   1146: 
                   1147: static int get_first_window(client_handle_t *handle, win_req_t *req)
                   1148: {
                   1149:     if ((handle == NULL) || CHECK_HANDLE(*handle))
                   1150:        return CS_BAD_HANDLE;
                   1151:     return get_window((window_handle_t *)handle, 0, req);
                   1152: }
                   1153: 
                   1154: static int get_next_window(window_handle_t *win, win_req_t *req)
                   1155: {
                   1156:     if ((win == NULL) || ((*win)->magic != WINDOW_MAGIC))
                   1157:        return CS_BAD_HANDLE;
                   1158:     return get_window(win, (*win)->index+1, req);
                   1159: }
                   1160: 
                   1161: /*======================================================================
                   1162: 
                   1163:     Get the current socket state bits.  We don't support the latched
                   1164:     SocketState yet: I haven't seen any point for it.
                   1165:     
                   1166: ======================================================================*/
                   1167: 
                   1168: static int cs_get_status(client_handle_t handle, cs_status_t *status)
                   1169: {
                   1170:     socket_info_t *s;
                   1171:     config_t *c;
                   1172:     int val;
                   1173:     
                   1174:     if (CHECK_HANDLE(handle))
                   1175:        return CS_BAD_HANDLE;
                   1176:     s = SOCKET(handle);
                   1177:     s->ss_entry(s->sock, SS_GetStatus, &val);
                   1178:     status->CardState = status->SocketState = 0;
                   1179:     status->CardState |= (val & SS_DETECT) ? CS_EVENT_CARD_DETECT : 0;
                   1180:     status->CardState |= (val & SS_CARDBUS) ? CS_EVENT_CB_DETECT : 0;
                   1181:     status->CardState |= (val & SS_3VCARD) ? CS_EVENT_3VCARD : 0;
                   1182:     status->CardState |= (val & SS_XVCARD) ? CS_EVENT_XVCARD : 0;
                   1183:     if (s->state & SOCKET_SUSPEND)
                   1184:        status->CardState |= CS_EVENT_PM_SUSPEND;
                   1185:     if (!(s->state & SOCKET_PRESENT))
                   1186:        return CS_NO_CARD;
                   1187:     if (s->state & SOCKET_SETUP_PENDING)
                   1188:        status->CardState |= CS_EVENT_CARD_INSERTION;
                   1189:     
                   1190:     /* Get info from the PRR, if necessary */
                   1191:     if (handle->Function == BIND_FN_ALL) {
                   1192:        if (status->Function && (status->Function >= s->functions))
                   1193:            return CS_BAD_ARGS;
                   1194:        c = (s->config != NULL) ? &s->config[status->Function] : NULL;
                   1195:     } else
                   1196:        c = CONFIG(handle);
                   1197:     if ((c != NULL) && (c->state & CONFIG_LOCKED) &&
                   1198:        (c->IntType & (INT_MEMORY_AND_IO | INT_ZOOMED_VIDEO))) {
                   1199:        u_char reg;
                   1200:        if (c->Present & PRESENT_PIN_REPLACE) {
                   1201:            read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, &reg);
                   1202:            status->CardState |=
                   1203:                (reg & PRR_WP_STATUS) ? CS_EVENT_WRITE_PROTECT : 0;
                   1204:            status->CardState |=
                   1205:                (reg & PRR_READY_STATUS) ? CS_EVENT_READY_CHANGE : 0;
                   1206:            status->CardState |=
                   1207:                (reg & PRR_BVD2_STATUS) ? CS_EVENT_BATTERY_LOW : 0;
                   1208:            status->CardState |=
                   1209:                (reg & PRR_BVD1_STATUS) ? CS_EVENT_BATTERY_DEAD : 0;
                   1210:        } else {
                   1211:            /* No PRR?  Then assume we're always ready */
                   1212:            status->CardState |= CS_EVENT_READY_CHANGE;
                   1213:        }
                   1214:        if (c->Present & PRESENT_EXT_STATUS) {
                   1215:            read_cis_mem(s, 1, (c->ConfigBase+CISREG_ESR)>>1, 1, &reg);
                   1216:            status->CardState |=
                   1217:                (reg & ESR_REQ_ATTN) ? CS_EVENT_REQUEST_ATTENTION : 0;
                   1218:        }
                   1219:        return CS_SUCCESS;
                   1220:     }
                   1221:     status->CardState |=
                   1222:        (val & SS_WRPROT) ? CS_EVENT_WRITE_PROTECT : 0;
                   1223:     status->CardState |=
                   1224:        (val & SS_BATDEAD) ? CS_EVENT_BATTERY_DEAD : 0;
                   1225:     status->CardState |=
                   1226:        (val & SS_BATWARN) ? CS_EVENT_BATTERY_LOW : 0;
                   1227:     status->CardState |=
                   1228:        (val & SS_READY) ? CS_EVENT_READY_CHANGE : 0;
                   1229:     return CS_SUCCESS;
                   1230: } /* cs_get_status */
                   1231: 
                   1232: /*======================================================================
                   1233: 
                   1234:     Change the card address of an already open memory window.
                   1235:     
                   1236: ======================================================================*/
                   1237: 
                   1238: static int get_mem_page(window_handle_t win, memreq_t *req)
                   1239: {
                   1240:     if ((win == NULL) || (win->magic != WINDOW_MAGIC))
                   1241:        return CS_BAD_HANDLE;
                   1242:     req->Page = 0;
                   1243:     req->CardOffset = win->ctl.card_start;
                   1244:     return CS_SUCCESS;
                   1245: } /* get_mem_page */
                   1246: 
                   1247: static int map_mem_page(window_handle_t win, memreq_t *req)
                   1248: {
                   1249:     socket_info_t *s;
                   1250:     if ((win == NULL) || (win->magic != WINDOW_MAGIC))
                   1251:        return CS_BAD_HANDLE;
                   1252:     if (req->Page != 0)
                   1253:        return CS_BAD_PAGE;
                   1254:     s = win->sock;
                   1255:     win->ctl.card_start = req->CardOffset;
                   1256:     if (s->ss_entry(s->sock, SS_SetMemMap, &win->ctl) != 0)
                   1257:        return CS_BAD_OFFSET;
                   1258:     return CS_SUCCESS;
                   1259: } /* map_mem_page */
                   1260: 
                   1261: /*======================================================================
                   1262: 
                   1263:     Modify a locked socket configuration
                   1264:     
                   1265: ======================================================================*/
                   1266: 
                   1267: static int modify_configuration(client_handle_t handle,
                   1268:                                modconf_t *mod)
                   1269: {
                   1270:     socket_info_t *s;
                   1271:     config_t *c;
                   1272:     
                   1273:     if (CHECK_HANDLE(handle))
                   1274:        return CS_BAD_HANDLE;
                   1275:     s = SOCKET(handle); c = CONFIG(handle);
                   1276:     if (!(s->state & SOCKET_PRESENT))
                   1277:        return CS_NO_CARD;
                   1278:     if (!(c->state & CONFIG_LOCKED))
                   1279:        return CS_CONFIGURATION_LOCKED;
                   1280:     
                   1281:     if (mod->Attributes & CONF_IRQ_CHANGE_VALID) {
                   1282:        if (mod->Attributes & CONF_ENABLE_IRQ) {
                   1283:            c->Attributes |= CONF_ENABLE_IRQ;
                   1284:            s->socket.io_irq = s->irq.AssignedIRQ;
                   1285:        } else {
                   1286:            c->Attributes &= ~CONF_ENABLE_IRQ;
                   1287:            s->socket.io_irq = 0;
                   1288:        }
                   1289:        s->ss_entry(s->sock, SS_SetSocket, &s->socket);
                   1290:     }
                   1291: 
                   1292:     if (mod->Attributes & CONF_VCC_CHANGE_VALID)
                   1293:        return CS_BAD_VCC;
                   1294: 
                   1295:     /* We only allow changing Vpp1 and Vpp2 to the same value */
                   1296:     if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) &&
                   1297:        (mod->Attributes & CONF_VPP2_CHANGE_VALID)) {
                   1298:        if (mod->Vpp1 != mod->Vpp2)
                   1299:            return CS_BAD_VPP;
                   1300:        c->Vpp1 = c->Vpp2 = s->socket.Vpp = mod->Vpp1;
                   1301:        if (s->ss_entry(s->sock, SS_SetSocket, &s->socket))
                   1302:            return CS_BAD_VPP;
                   1303:     } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) ||
                   1304:               (mod->Attributes & CONF_VPP2_CHANGE_VALID))
                   1305:        return CS_BAD_VPP;
                   1306: 
                   1307:     return CS_SUCCESS;
                   1308: } /* modify_configuration */
                   1309: 
                   1310: /*======================================================================
                   1311: 
                   1312:     Modify the attributes of a window returned by RequestWindow.
                   1313: 
                   1314: ======================================================================*/
                   1315: 
                   1316: static int modify_window(window_handle_t win, modwin_t *req)
                   1317: {
                   1318:     if ((win == NULL) || (win->magic != WINDOW_MAGIC))
                   1319:        return CS_BAD_HANDLE;
                   1320: 
                   1321:     win->ctl.flags &= ~(MAP_ATTRIB|MAP_ACTIVE);
                   1322:     if (req->Attributes & WIN_MEMORY_TYPE)
                   1323:        win->ctl.flags |= MAP_ATTRIB;
                   1324:     if (req->Attributes & WIN_ENABLE)
                   1325:        win->ctl.flags |= MAP_ACTIVE;
                   1326:     if (req->Attributes & WIN_DATA_WIDTH_16)
                   1327:        win->ctl.flags |= MAP_16BIT;
                   1328:     if (req->Attributes & WIN_USE_WAIT)
                   1329:        win->ctl.flags |= MAP_USE_WAIT;
                   1330:     win->ctl.speed = req->AccessSpeed;
                   1331:     win->sock->ss_entry(win->sock->sock, SS_SetMemMap, &win->ctl);
                   1332:     
                   1333:     return CS_SUCCESS;
                   1334: } /* modify_window */
                   1335: 
                   1336: /*======================================================================
                   1337: 
                   1338:     Register_client() uses the dev_info_t handle to match the
                   1339:     caller with a socket.  The driver must have already been bound
                   1340:     to a socket with bind_device() -- in fact, bind_device()
                   1341:     allocates the client structure that will be used.
                   1342:     
                   1343: ======================================================================*/
                   1344: 
                   1345: static int register_client(client_handle_t *handle, client_reg_t *req)
                   1346: {
                   1347:     client_t *client;
                   1348:     socket_info_t *s;
                   1349:     socket_t ns;
                   1350:     
                   1351:     /* Look for unbound client with matching dev_info */
                   1352:     client = NULL;
                   1353:     for (ns = 0; ns < sockets; ns++) {
                   1354:        client = socket_table[ns]->clients;
                   1355:        while (client != NULL) {
                   1356:            if ((strcmp(client->dev_info, (char *)req->dev_info) == 0)
                   1357:                && (client->state & CLIENT_UNBOUND)) break;
                   1358:            client = client->next;
                   1359:        }
                   1360:        if (client != NULL) break;
                   1361:     }
                   1362:     if (client == NULL)
                   1363:        return CS_OUT_OF_RESOURCE;
                   1364: 
                   1365:     s = socket_table[ns];
                   1366:     if (++s->real_clients == 1) {
                   1367:        ss_callback_t call;
                   1368:        int status;
                   1369:        call.handler = &parse_events;
                   1370:        call.info = s;
                   1371:        s->ss_entry(ns, SS_RegisterCallback, &call);
                   1372:        s->ss_entry(ns, SS_GetStatus, &status);
                   1373:        if ((status & SS_DETECT) &&
                   1374:            !(s->state & SOCKET_SETUP_PENDING)) {
                   1375:            s->state |= SOCKET_SETUP_PENDING;
                   1376:            setup_socket(ns);
                   1377:        }
                   1378:     }
                   1379: 
                   1380:     *handle = client;
                   1381:     client->state &= ~CLIENT_UNBOUND;
                   1382:     client->Socket = ns;
                   1383:     client->Attributes = req->Attributes;
                   1384:     client->EventMask = req->EventMask;
                   1385:     client->event_handler = req->event_handler;
                   1386:     client->event_callback_args = req->event_callback_args;
                   1387:     client->event_callback_args.client_handle = client;
                   1388:     client->event_callback_args.bus = s->cap.bus;
                   1389: 
                   1390:     if (s->state & SOCKET_CARDBUS)
                   1391:        client->state |= CLIENT_CARDBUS;
                   1392:     
                   1393:     if ((!(s->state & SOCKET_CARDBUS)) && (s->functions == 0) &&
                   1394:        (client->Function != BIND_FN_ALL)) {
                   1395:        cistpl_longlink_mfc_t mfc;
                   1396:        if (read_tuple(client, CISTPL_LONGLINK_MFC, &mfc)
                   1397:            == CS_SUCCESS)
                   1398:            s->functions = mfc.nfn;
                   1399:        else
                   1400:            s->functions = 1;
                   1401:        s->config = kmalloc(sizeof(config_t) * s->functions,
                   1402:                            GFP_KERNEL);
                   1403:        memset(s->config, 0, sizeof(config_t) * s->functions);
                   1404:     }
                   1405:     
                   1406:     DEBUG(1, "cs: register_client(): client 0x%p, sock %d, dev %s\n",
                   1407:          client, client->Socket, client->dev_info);
                   1408:     if (client->EventMask & CS_EVENT_REGISTRATION_COMPLETE)
                   1409:        EVENT(client, CS_EVENT_REGISTRATION_COMPLETE, CS_EVENT_PRI_LOW);
                   1410:     if ((socket_table[ns]->state & SOCKET_PRESENT) &&
                   1411:        !(socket_table[ns]->state & SOCKET_SETUP_PENDING)) {
                   1412:        if (client->EventMask & CS_EVENT_CARD_INSERTION)
                   1413:            EVENT(client, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
                   1414:        else
                   1415:            client->PendingEvents |= CS_EVENT_CARD_INSERTION;
                   1416:     }
                   1417:     return CS_SUCCESS;
                   1418: } /* register_client */
                   1419: 
                   1420: /*====================================================================*/
                   1421: 
                   1422: static int release_configuration(client_handle_t handle,
                   1423:                                 config_req_t *req)
                   1424: {
                   1425:     socket_info_t *s;
                   1426:     pccard_io_map io = { 0, 0, 0, 0, 1 };
                   1427:     int i;
                   1428:     
                   1429:     if (CHECK_HANDLE(handle) ||
                   1430:        !(handle->state & CLIENT_CONFIG_LOCKED))
                   1431:        return CS_BAD_HANDLE;
                   1432:     handle->state &= ~CLIENT_CONFIG_LOCKED;
                   1433:     s = SOCKET(handle);
                   1434:     
                   1435: #ifdef CONFIG_CARDBUS
                   1436:     if (handle->state & CLIENT_CARDBUS) {
                   1437:        cb_disable(s);
                   1438:        s->lock_count = 0;
                   1439:        return CS_SUCCESS;
                   1440:     }
                   1441: #endif
                   1442:     
                   1443:     if (!(handle->state & CLIENT_STALE)) {
                   1444:        config_t *c = CONFIG(handle);
                   1445:        if (--(s->lock_count) == 0) {
                   1446:            s->socket.flags = SS_OUTPUT_ENA;
                   1447:            s->socket.Vpp = 0;
                   1448:            s->socket.io_irq = 0;
                   1449:            s->ss_entry(s->sock, SS_SetSocket, &s->socket);
                   1450:        }
                   1451:        if (c->state & CONFIG_IO_REQ)
                   1452:            for (i = 0; i < MAX_IO_WIN; i++) {
                   1453:                if (s->io[i].NumPorts == 0)
                   1454:                    continue;
                   1455:                s->io[i].Config--;
                   1456:                if (s->io[i].Config != 0)
                   1457:                    continue;
                   1458:                io.map = i;
                   1459:                s->ss_entry(s->sock, SS_SetIOMap, &io);
                   1460:            }
                   1461:        c->state &= ~CONFIG_LOCKED;
                   1462:     }
                   1463:     
                   1464:     return CS_SUCCESS;
                   1465: } /* release_configuration */
                   1466: 
                   1467: /*======================================================================
                   1468: 
                   1469:     Release_io() releases the I/O ranges allocated by a client.  This
                   1470:     may be invoked some time after a card ejection has already dumped
                   1471:     the actual socket configuration, so if the client is "stale", we
                   1472:     don't bother checking the port ranges against the current socket
                   1473:     values.
                   1474:     
                   1475: ======================================================================*/
                   1476: 
                   1477: static int release_io(client_handle_t handle, io_req_t *req)
                   1478: {
                   1479:     socket_info_t *s;
                   1480:     
                   1481:     if (CHECK_HANDLE(handle) || !(handle->state & CLIENT_IO_REQ))
                   1482:        return CS_BAD_HANDLE;
                   1483:     handle->state &= ~CLIENT_IO_REQ;
                   1484:     s = SOCKET(handle);
                   1485:     
                   1486: #ifdef CONFIG_CARDBUS
                   1487:     if (handle->state & CLIENT_CARDBUS) {
                   1488:        cb_release(s);
                   1489:        return CS_SUCCESS;
                   1490:     }
                   1491: #endif
                   1492:     
                   1493:     if (!(handle->state & CLIENT_STALE)) {
                   1494:        config_t *c = CONFIG(handle);
                   1495:        if (c->state & CONFIG_LOCKED)
                   1496:            return CS_CONFIGURATION_LOCKED;
                   1497:        if ((c->io.BasePort1 != req->BasePort1) ||
                   1498:            (c->io.NumPorts1 != req->NumPorts1) ||
                   1499:            (c->io.BasePort2 != req->BasePort2) ||
                   1500:            (c->io.NumPorts2 != req->NumPorts2))
                   1501:            return CS_BAD_ARGS;
                   1502:        c->state &= ~CONFIG_IO_REQ;
                   1503:     }
                   1504: 
                   1505:     release_io_space(s, req->BasePort1, req->NumPorts1);
                   1506:     if (req->NumPorts2)
                   1507:        release_io_space(s, req->BasePort2, req->NumPorts2);
                   1508:     
                   1509:     return CS_SUCCESS;
                   1510: } /* release_io */
                   1511: 
                   1512: /*====================================================================*/
                   1513: 
                   1514: static int cs_release_irq(client_handle_t handle, irq_req_t *req)
                   1515: {
                   1516:     socket_info_t *s;
                   1517:     if (CHECK_HANDLE(handle) || !(handle->state & CLIENT_IRQ_REQ))
                   1518:        return CS_BAD_HANDLE;
                   1519:     handle->state &= ~CLIENT_IRQ_REQ;
                   1520:     s = SOCKET(handle);
                   1521:     
                   1522:     if (!(handle->state & CLIENT_STALE)) {
                   1523:        config_t *c = CONFIG(handle);
                   1524:        if (c->state & CONFIG_LOCKED)
                   1525:            return CS_CONFIGURATION_LOCKED;
                   1526:        if (c->irq.Attributes != req->Attributes)
                   1527:            return CS_BAD_ATTRIBUTE;
                   1528:        if (s->irq.AssignedIRQ != req->AssignedIRQ)
                   1529:            return CS_BAD_IRQ;
                   1530:        if (--s->irq.Config == 0) {
                   1531:            c->state &= ~CONFIG_IRQ_REQ;
                   1532:            s->irq.AssignedIRQ = 0;
                   1533:        }
                   1534:     }
                   1535:     
                   1536:     if (req->Attributes & IRQ_HANDLE_PRESENT) {
                   1537:        bus_free_irq(s->cap.bus, req->AssignedIRQ, req->Instance);
                   1538:     }
                   1539: 
                   1540: #ifdef CONFIG_ISA
                   1541:     if (req->AssignedIRQ != s->cap.pci_irq)
                   1542:        undo_irq(req->Attributes, req->AssignedIRQ);
                   1543: #endif
                   1544:     
                   1545:     return CS_SUCCESS;
                   1546: } /* cs_release_irq */
                   1547: 
                   1548: /*====================================================================*/
                   1549: 
                   1550: static int release_window(window_handle_t win)
                   1551: {
                   1552:     socket_info_t *s;
                   1553:     
                   1554:     if ((win == NULL) || (win->magic != WINDOW_MAGIC))
                   1555:        return CS_BAD_HANDLE;
                   1556:     s = win->sock;
                   1557:     if (!(win->handle->state & CLIENT_WIN_REQ(win->index)))
                   1558:        return CS_BAD_HANDLE;
                   1559: 
                   1560:     /* Shut down memory window */
                   1561:     win->ctl.flags &= ~MAP_ACTIVE;
                   1562:     s->ss_entry(s->sock, SS_SetMemMap, &win->ctl);
                   1563:     s->state &= ~SOCKET_WIN_REQ(win->index);
                   1564: 
                   1565:     /* Release system memory */
                   1566:     release_mem_region(win->base, win->size);
                   1567:     win->handle->state &= ~CLIENT_WIN_REQ(win->index);
                   1568: 
                   1569:     win->magic = 0;
                   1570:     
                   1571:     return CS_SUCCESS;
                   1572: } /* release_window */
                   1573: 
                   1574: /*====================================================================*/
                   1575: 
                   1576: static int request_configuration(client_handle_t handle,
                   1577:                                 config_req_t *req)
                   1578: {
                   1579:     int i;
                   1580:     u_int base;
                   1581:     socket_info_t *s;
                   1582:     config_t *c;
                   1583:     pccard_io_map iomap;
                   1584:     
                   1585:     if (CHECK_HANDLE(handle))
                   1586:        return CS_BAD_HANDLE;
                   1587:     i = handle->Socket; s = socket_table[i];
                   1588:     if (!(s->state & SOCKET_PRESENT))
                   1589:        return CS_NO_CARD;
                   1590:     
                   1591: #ifdef CONFIG_CARDBUS
                   1592:     if (handle->state & CLIENT_CARDBUS) {
                   1593:        if (!(req->IntType & INT_CARDBUS))
                   1594:            return CS_UNSUPPORTED_MODE;
                   1595:        if (s->lock_count != 0)
                   1596:            return CS_CONFIGURATION_LOCKED;
                   1597:        cb_enable(s);
                   1598:        handle->state |= CLIENT_CONFIG_LOCKED;
                   1599:        s->lock_count++;
                   1600:        return CS_SUCCESS;
                   1601:     }
                   1602: #endif
                   1603:     
                   1604:     if (req->IntType & INT_CARDBUS)
                   1605:        return CS_UNSUPPORTED_MODE;
                   1606:     c = CONFIG(handle);
                   1607:     if (c->state & CONFIG_LOCKED)
                   1608:        return CS_CONFIGURATION_LOCKED;
                   1609: 
                   1610:     /* Do power control.  We don't allow changes in Vcc. */
                   1611:     if (s->socket.Vcc != req->Vcc)
                   1612:        printk(KERN_DEBUG "cs: ignoring requested Vcc\n");
                   1613:     if (req->Vpp1 != req->Vpp2)
                   1614:        return CS_BAD_VPP;
                   1615:     s->socket.Vpp = req->Vpp1;
                   1616:     if (s->ss_entry(s->sock, SS_SetSocket, &s->socket))
                   1617:        return CS_BAD_VPP;
                   1618:     
                   1619:     c->Vcc = req->Vcc; c->Vpp1 = c->Vpp2 = req->Vpp1;
                   1620:     
                   1621:     /* Pick memory or I/O card, DMA mode, interrupt */
                   1622:     c->IntType = req->IntType;
                   1623:     c->Attributes = req->Attributes;
                   1624:     if (req->IntType & INT_MEMORY_AND_IO)
                   1625:        s->socket.flags |= SS_IOCARD;
                   1626:     if (req->IntType & INT_ZOOMED_VIDEO)
                   1627:        s->socket.flags |= SS_ZVCARD;
                   1628:     if (req->Attributes & CONF_ENABLE_DMA)
                   1629:        s->socket.flags |= SS_DMA_MODE;
                   1630:     if (req->Attributes & CONF_ENABLE_SPKR)
                   1631:        s->socket.flags |= SS_SPKR_ENA;
                   1632:     if (req->Attributes & CONF_ENABLE_IRQ)
                   1633:        s->socket.io_irq = s->irq.AssignedIRQ;
                   1634:     else
                   1635:        s->socket.io_irq = 0;
                   1636:     s->ss_entry(s->sock, SS_SetSocket, &s->socket);
                   1637:     s->lock_count++;
                   1638:     
                   1639:     /* Set up CIS configuration registers */
                   1640:     base = c->ConfigBase = req->ConfigBase;
                   1641:     c->Present = c->CardValues = req->Present;
                   1642:     if (req->Present & PRESENT_COPY) {
                   1643:        c->Copy = req->Copy;
                   1644:        write_cis_mem(s, 1, (base + CISREG_SCR)>>1, 1, &c->Copy);
                   1645:     }
                   1646:     if (req->Present & PRESENT_OPTION) {
                   1647:        if (s->functions == 1) {
                   1648:            c->Option = req->ConfigIndex & COR_CONFIG_MASK;
                   1649:        } else {
                   1650:            c->Option = req->ConfigIndex & COR_MFC_CONFIG_MASK;
                   1651:            c->Option |= COR_FUNC_ENA|COR_IREQ_ENA;
                   1652:            if (req->Present & PRESENT_IOBASE_0)
                   1653:                c->Option |= COR_ADDR_DECODE;
                   1654:        }
                   1655:        if (c->state & CONFIG_IRQ_REQ)
                   1656:            if (!(c->irq.Attributes & IRQ_FORCED_PULSE))
                   1657:                c->Option |= COR_LEVEL_REQ;
                   1658:        write_cis_mem(s, 1, (base + CISREG_COR)>>1, 1, &c->Option);
                   1659:        mdelay(40);
                   1660:     }
                   1661:     if (req->Present & PRESENT_STATUS) {
                   1662:        c->Status = req->Status;
                   1663:        write_cis_mem(s, 1, (base + CISREG_CCSR)>>1, 1, &c->Status);
                   1664:     }
                   1665:     if (req->Present & PRESENT_PIN_REPLACE) {
                   1666:        c->Pin = req->Pin;
                   1667:        write_cis_mem(s, 1, (base + CISREG_PRR)>>1, 1, &c->Pin);
                   1668:     }
                   1669:     if (req->Present & PRESENT_EXT_STATUS) {
                   1670:        c->ExtStatus = req->ExtStatus;
                   1671:        write_cis_mem(s, 1, (base + CISREG_ESR)>>1, 1, &c->ExtStatus);
                   1672:     }
                   1673:     if (req->Present & PRESENT_IOBASE_0) {
                   1674:        u_char b = c->io.BasePort1 & 0xff;
                   1675:        write_cis_mem(s, 1, (base + CISREG_IOBASE_0)>>1, 1, &b);
                   1676:        b = (c->io.BasePort1 >> 8) & 0xff;
                   1677:        write_cis_mem(s, 1, (base + CISREG_IOBASE_1)>>1, 1, &b);
                   1678:     }
                   1679:     if (req->Present & PRESENT_IOSIZE) {
                   1680:        u_char b = c->io.NumPorts1 + c->io.NumPorts2 - 1;
                   1681:        write_cis_mem(s, 1, (base + CISREG_IOSIZE)>>1, 1, &b);
                   1682:     }
                   1683:     
                   1684:     /* Configure I/O windows */
                   1685:     if (c->state & CONFIG_IO_REQ) {
                   1686:        iomap.speed = io_speed;
                   1687:        for (i = 0; i < MAX_IO_WIN; i++)
                   1688:            if (s->io[i].NumPorts != 0) {
                   1689:                iomap.map = i;
                   1690:                iomap.flags = MAP_ACTIVE;
                   1691:                switch (s->io[i].Attributes & IO_DATA_PATH_WIDTH) {
                   1692:                case IO_DATA_PATH_WIDTH_16:
                   1693:                    iomap.flags |= MAP_16BIT; break;
                   1694:                case IO_DATA_PATH_WIDTH_AUTO:
                   1695:                    iomap.flags |= MAP_AUTOSZ; break;
                   1696:                default:
                   1697:                    break;
                   1698:                }
                   1699:                iomap.start = s->io[i].BasePort;
                   1700:                iomap.stop = iomap.start + s->io[i].NumPorts - 1;
                   1701:                s->ss_entry(s->sock, SS_SetIOMap, &iomap);
                   1702:                s->io[i].Config++;
                   1703:            }
                   1704:     }
                   1705:     
                   1706:     c->state |= CONFIG_LOCKED;
                   1707:     handle->state |= CLIENT_CONFIG_LOCKED;
                   1708:     return CS_SUCCESS;
                   1709: } /* request_configuration */
                   1710: 
                   1711: /*======================================================================
                   1712:   
                   1713:     Request_io() reserves ranges of port addresses for a socket.
                   1714:     I have not implemented range sharing or alias addressing.
                   1715:     
                   1716: ======================================================================*/
                   1717: 
                   1718: static int request_io(client_handle_t handle, io_req_t *req)
                   1719: {
                   1720:     socket_info_t *s;
                   1721:     config_t *c;
                   1722:     
                   1723:     if (CHECK_HANDLE(handle))
                   1724:        return CS_BAD_HANDLE;
                   1725:     s = SOCKET(handle);
                   1726:     if (!(s->state & SOCKET_PRESENT))
                   1727:        return CS_NO_CARD;
                   1728: 
                   1729:     if (handle->state & CLIENT_CARDBUS) {
                   1730: #ifdef CONFIG_CARDBUS
                   1731:        int ret = cb_config(s);
                   1732:        if (ret == CS_SUCCESS)
                   1733:            handle->state |= CLIENT_IO_REQ;
                   1734:        return ret;
                   1735: #else
                   1736:        return CS_UNSUPPORTED_FUNCTION;
                   1737: #endif
                   1738:     }
                   1739: 
                   1740:     if (!req)
                   1741:        return CS_UNSUPPORTED_MODE;
                   1742:     c = CONFIG(handle);
                   1743:     if (c->state & CONFIG_LOCKED)
                   1744:        return CS_CONFIGURATION_LOCKED;
                   1745:     if (c->state & CONFIG_IO_REQ)
                   1746:        return CS_IN_USE;
                   1747:     if (req->Attributes1 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS))
                   1748:        return CS_BAD_ATTRIBUTE;
                   1749:     if ((req->NumPorts2 > 0) &&
                   1750:        (req->Attributes2 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS)))
                   1751:        return CS_BAD_ATTRIBUTE;
                   1752: 
                   1753:     if (alloc_io_space(s, req->Attributes1, &req->BasePort1,
                   1754:                       req->NumPorts1, req->IOAddrLines,
                   1755:                       handle->dev_info))
                   1756:        return CS_IN_USE;
                   1757: 
                   1758:     if (req->NumPorts2) {
                   1759:        if (alloc_io_space(s, req->Attributes2, &req->BasePort2,
                   1760:                           req->NumPorts2, req->IOAddrLines,
                   1761:                           handle->dev_info)) {
                   1762:            release_io_space(s, req->BasePort1, req->NumPorts1);
                   1763:            return CS_IN_USE;
                   1764:        }
                   1765:     }
                   1766: 
                   1767:     c->io = *req;
                   1768:     c->state |= CONFIG_IO_REQ;
                   1769:     handle->state |= CLIENT_IO_REQ;
                   1770:     return CS_SUCCESS;
                   1771: } /* request_io */
                   1772: 
                   1773: /*======================================================================
                   1774: 
                   1775:     Request_irq() reserves an irq for this client.
                   1776: 
                   1777:     Also, since Linux only reserves irq's when they are actually
                   1778:     hooked, we don't guarantee that an irq will still be available
                   1779:     when the configuration is locked.  Now that I think about it,
                   1780:     there might be a way to fix this using a dummy handler.
                   1781:     
                   1782: ======================================================================*/
                   1783: 
                   1784: static int cs_request_irq(client_handle_t handle, irq_req_t *req)
                   1785: {
                   1786:     socket_info_t *s;
                   1787:     config_t *c;
                   1788:     int ret = CS_IN_USE, irq = 0;
                   1789:     
                   1790:     if (CHECK_HANDLE(handle))
                   1791:        return CS_BAD_HANDLE;
                   1792:     s = SOCKET(handle);
                   1793:     if (!(s->state & SOCKET_PRESENT))
                   1794:        return CS_NO_CARD;
                   1795:     c = CONFIG(handle);
                   1796:     if (c->state & CONFIG_LOCKED)
                   1797:        return CS_CONFIGURATION_LOCKED;
                   1798:     if (c->state & CONFIG_IRQ_REQ)
                   1799:        return CS_IN_USE;
                   1800:     
                   1801: #ifdef CONFIG_ISA
                   1802:     if (s->irq.AssignedIRQ != 0) {
                   1803:        /* If the interrupt is already assigned, it must match */
                   1804:        irq = s->irq.AssignedIRQ;
                   1805:        if (req->IRQInfo1 & IRQ_INFO2_VALID) {
                   1806:            u_int mask = req->IRQInfo2 & s->cap.irq_mask;
                   1807:            ret = ((mask >> irq) & 1) ? 0 : CS_BAD_ARGS;
                   1808:        } else
                   1809:            ret = ((req->IRQInfo1&IRQ_MASK) == irq) ? 0 : CS_BAD_ARGS;
                   1810:     } else {
                   1811:        if (req->IRQInfo1 & IRQ_INFO2_VALID) {
                   1812:            u_int try, mask = req->IRQInfo2 & s->cap.irq_mask;
                   1813:            for (try = 0; try < 2; try++) {
                   1814:                for (irq = 0; irq < 16; irq++)
                   1815:                    if ((mask >> irq) & 1) {
                   1816:                        ret = try_irq(req->Attributes, irq, try);
                   1817:                        if (ret == 0) break;
                   1818:                    }
                   1819:                if (ret == 0) break;
                   1820:            }
                   1821:        } else {
                   1822:            irq = req->IRQInfo1 & IRQ_MASK;
                   1823:            ret = try_irq(req->Attributes, irq, 1);
                   1824:        }
                   1825:     }
                   1826: #endif
                   1827:     if (ret != 0) {
                   1828:        if (!s->cap.pci_irq)
                   1829:            return ret;
                   1830:        irq = s->cap.pci_irq;
                   1831:     }
                   1832: 
                   1833:     if (req->Attributes & IRQ_HANDLE_PRESENT) {
                   1834:        if (bus_request_irq(s->cap.bus, irq, req->Handler,
                   1835:                            ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) || 
                   1836:                             (s->functions > 1) ||
                   1837:                             (irq == s->cap.pci_irq)) ? SA_SHIRQ : 0,
                   1838:                            handle->dev_info, req->Instance))
                   1839:            return CS_IN_USE;
                   1840:     }
                   1841: 
                   1842:     c->irq.Attributes = req->Attributes;
                   1843:     s->irq.AssignedIRQ = req->AssignedIRQ = irq;
                   1844:     s->irq.Config++;
                   1845:     
                   1846:     c->state |= CONFIG_IRQ_REQ;
                   1847:     handle->state |= CLIENT_IRQ_REQ;
                   1848:     return CS_SUCCESS;
                   1849: } /* cs_request_irq */
                   1850: 
                   1851: /*======================================================================
                   1852: 
                   1853:     Request_window() establishes a mapping between card memory space
                   1854:     and system memory space.
                   1855: 
                   1856: ======================================================================*/
                   1857: 
                   1858: static int request_window(client_handle_t *handle, win_req_t *req)
                   1859: {
                   1860:     socket_info_t *s;
                   1861:     window_t *win;
                   1862:     u_long align;
                   1863:     int w;
                   1864:     
                   1865:     if (CHECK_HANDLE(*handle))
                   1866:        return CS_BAD_HANDLE;
                   1867:     s = SOCKET(*handle);
                   1868:     if (!(s->state & SOCKET_PRESENT))
                   1869:        return CS_NO_CARD;
                   1870:     if (req->Attributes & (WIN_PAGED | WIN_SHARED))
                   1871:        return CS_BAD_ATTRIBUTE;
                   1872: 
                   1873:     /* Window size defaults to smallest available */
                   1874:     if (req->Size == 0)
                   1875:        req->Size = s->cap.map_size;
                   1876:     align = (((s->cap.features & SS_CAP_MEM_ALIGN) ||
                   1877:              (req->Attributes & WIN_STRICT_ALIGN)) ?
                   1878:             req->Size : s->cap.map_size);
                   1879:     if (req->Size & (s->cap.map_size-1))
                   1880:        return CS_BAD_SIZE;
                   1881:     if ((req->Base && (s->cap.features & SS_CAP_STATIC_MAP)) ||
                   1882:        (req->Base & (align-1)))
                   1883:        return CS_BAD_BASE;
                   1884:     if (req->Base)
                   1885:        align = 0;
                   1886: 
                   1887:     /* Allocate system memory window */
                   1888:     for (w = 0; w < MAX_WIN; w++)
                   1889:        if (!(s->state & SOCKET_WIN_REQ(w))) break;
                   1890:     if (w == MAX_WIN)
                   1891:        return CS_OUT_OF_RESOURCE;
                   1892: 
                   1893:     win = &s->win[w];
                   1894:     win->magic = WINDOW_MAGIC;
                   1895:     win->index = w;
                   1896:     win->handle = *handle;
                   1897:     win->sock = s;
                   1898:     win->base = req->Base;
                   1899:     win->size = req->Size;
                   1900: 
                   1901:     if (!(s->cap.features & SS_CAP_STATIC_MAP) &&
                   1902:        find_mem_region(&win->base, win->size, align,
                   1903:                        (req->Attributes & WIN_MAP_BELOW_1MB) ||
                   1904:                        !(s->cap.features & SS_CAP_PAGE_REGS),
                   1905:                        (*handle)->dev_info))
                   1906:        return CS_IN_USE;
                   1907:     (*handle)->state |= CLIENT_WIN_REQ(w);
                   1908: 
                   1909:     /* Configure the socket controller */
                   1910:     win->ctl.map = w+1;
                   1911:     win->ctl.flags = 0;
                   1912:     win->ctl.speed = req->AccessSpeed;
                   1913:     if (req->Attributes & WIN_MEMORY_TYPE)
                   1914:        win->ctl.flags |= MAP_ATTRIB;
                   1915:     if (req->Attributes & WIN_ENABLE)
                   1916:        win->ctl.flags |= MAP_ACTIVE;
                   1917:     if (req->Attributes & WIN_DATA_WIDTH_16)
                   1918:        win->ctl.flags |= MAP_16BIT;
                   1919:     if (req->Attributes & WIN_USE_WAIT)
                   1920:        win->ctl.flags |= MAP_USE_WAIT;
                   1921:     win->ctl.sys_start = win->base;
                   1922:     win->ctl.sys_stop = win->base + win->size-1;
                   1923:     win->ctl.card_start = 0;
                   1924:     if (s->ss_entry(s->sock, SS_SetMemMap, &win->ctl) != 0)
                   1925:        return CS_BAD_ARGS;
                   1926:     s->state |= SOCKET_WIN_REQ(w);
                   1927: 
                   1928:     /* Return window handle */
                   1929:     req->Base = win->ctl.sys_start;
                   1930:     *handle = (client_handle_t)win;
                   1931:     
                   1932:     return CS_SUCCESS;
                   1933: } /* request_window */
                   1934: 
                   1935: /*======================================================================
                   1936: 
                   1937:     I'm not sure which "reset" function this is supposed to use,
                   1938:     but for now, it uses the low-level interface's reset, not the
                   1939:     CIS register.
                   1940:     
                   1941: ======================================================================*/
                   1942: 
                   1943: static int reset_card(client_handle_t handle, client_req_t *req)
                   1944: {
                   1945:     int i, ret;
                   1946:     socket_info_t *s;
                   1947:     
                   1948:     if (CHECK_HANDLE(handle))
                   1949:        return CS_BAD_HANDLE;
                   1950:     i = handle->Socket; s = socket_table[i];
                   1951:     if (!(s->state & SOCKET_PRESENT))
                   1952:        return CS_NO_CARD;
                   1953:     if (s->state & SOCKET_RESET_PENDING)
                   1954:        return CS_IN_USE;
                   1955:     s->state |= SOCKET_RESET_PENDING;
                   1956: 
                   1957:     ret = send_event(s, CS_EVENT_RESET_REQUEST, CS_EVENT_PRI_LOW);
                   1958:     if (ret != 0) {
                   1959:        s->state &= ~SOCKET_RESET_PENDING;
                   1960:        handle->event_callback_args.info = (void *)(u_long)ret;
                   1961:        EVENT(handle, CS_EVENT_RESET_COMPLETE, CS_EVENT_PRI_LOW);
                   1962:     } else {
                   1963:        DEBUG(1, "cs: resetting socket %d\n", i);
                   1964:        send_event(s, CS_EVENT_RESET_PHYSICAL, CS_EVENT_PRI_LOW);
                   1965:        s->reset_handle = handle;
                   1966:        reset_socket(i);
                   1967:     }
                   1968:     return CS_SUCCESS;
                   1969: } /* reset_card */
                   1970: 
                   1971: /*======================================================================
                   1972: 
                   1973:     These shut down or wake up a socket.  They are sort of user
                   1974:     initiated versions of the APM suspend and resume actions.
                   1975:     
                   1976: ======================================================================*/
                   1977: 
                   1978: static int suspend_card(client_handle_t handle, client_req_t *req)
                   1979: {
                   1980:     int i;
                   1981:     socket_info_t *s;
                   1982:     
                   1983:     if (CHECK_HANDLE(handle))
                   1984:        return CS_BAD_HANDLE;
                   1985:     i = handle->Socket; s = socket_table[i];
                   1986:     if (!(s->state & SOCKET_PRESENT))
                   1987:        return CS_NO_CARD;
                   1988:     if (s->state & SOCKET_SUSPEND)
                   1989:        return CS_IN_USE;
                   1990: 
                   1991:     DEBUG(1, "cs: suspending socket %d\n", i);
                   1992:     send_event(s, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
                   1993:     s->ss_entry(s->sock, SS_SetSocket, &dead_socket);
                   1994:     s->state |= SOCKET_SUSPEND;
                   1995: 
                   1996:     return CS_SUCCESS;
                   1997: } /* suspend_card */
                   1998: 
                   1999: static int resume_card(client_handle_t handle, client_req_t *req)
                   2000: {
                   2001:     int i;
                   2002:     socket_info_t *s;
                   2003:     
                   2004:     if (CHECK_HANDLE(handle))
                   2005:        return CS_BAD_HANDLE;
                   2006:     i = handle->Socket; s = socket_table[i];
                   2007:     if (!(s->state & SOCKET_PRESENT))
                   2008:        return CS_NO_CARD;
                   2009:     if (!(s->state & SOCKET_SUSPEND))
                   2010:        return CS_IN_USE;
                   2011: 
                   2012:     DEBUG(1, "cs: waking up socket %d\n", i);
                   2013:     setup_socket(i);
                   2014: 
                   2015:     return CS_SUCCESS;
                   2016: } /* resume_card */
                   2017: 
                   2018: /*======================================================================
                   2019: 
                   2020:     These handle user requests to eject or insert a card.
                   2021:     
                   2022: ======================================================================*/
                   2023: 
                   2024: static int eject_card(client_handle_t handle, client_req_t *req)
                   2025: {
                   2026:     int i, ret;
                   2027:     socket_info_t *s;
                   2028:     u_long flags;
                   2029:     
                   2030:     if (CHECK_HANDLE(handle))
                   2031:        return CS_BAD_HANDLE;
                   2032:     i = handle->Socket; s = socket_table[i];
                   2033:     if (!(s->state & SOCKET_PRESENT))
                   2034:        return CS_NO_CARD;
                   2035: 
                   2036:     DEBUG(1, "cs: user eject request on socket %d\n", i);
                   2037: 
                   2038:     ret = send_event(s, CS_EVENT_EJECTION_REQUEST, CS_EVENT_PRI_LOW);
                   2039:     if (ret != 0)
                   2040:        return ret;
                   2041: 
                   2042:     spin_lock_irqsave(&s->lock, flags);
                   2043:     do_shutdown(s);
                   2044:     spin_unlock_irqrestore(&s->lock, flags);
                   2045:     
                   2046:     return CS_SUCCESS;
                   2047:     
                   2048: } /* eject_card */
                   2049: 
                   2050: static int insert_card(client_handle_t handle, client_req_t *req)
                   2051: {
                   2052:     int i, status;
                   2053:     socket_info_t *s;
                   2054:     u_long flags;
                   2055:     
                   2056:     if (CHECK_HANDLE(handle))
                   2057:        return CS_BAD_HANDLE;
                   2058:     i = handle->Socket; s = socket_table[i];
                   2059:     if (s->state & SOCKET_PRESENT)
                   2060:        return CS_IN_USE;
                   2061: 
                   2062:     DEBUG(1, "cs: user insert request on socket %d\n", i);
                   2063: 
                   2064:     spin_lock_irqsave(&s->lock, flags);
                   2065:     if (!(s->state & SOCKET_SETUP_PENDING)) {
                   2066:        s->state |= SOCKET_SETUP_PENDING;
                   2067:        spin_unlock_irqrestore(&s->lock, flags);
                   2068:        s->ss_entry(i, SS_GetStatus, &status);
                   2069:        if (status & SS_DETECT)
                   2070:            setup_socket(i);
                   2071:        else {
                   2072:            s->state &= ~SOCKET_SETUP_PENDING;
                   2073:            return CS_NO_CARD;
                   2074:        }
                   2075:     } else
                   2076:        spin_unlock_irqrestore(&s->lock, flags);
                   2077: 
                   2078:     return CS_SUCCESS;
                   2079: } /* insert_card */
                   2080: 
                   2081: /*======================================================================
                   2082: 
                   2083:     Maybe this should send a CS_EVENT_CARD_INSERTION event if we
                   2084:     haven't sent one to this client yet?
                   2085:     
                   2086: ======================================================================*/
                   2087: 
                   2088: static int set_event_mask(client_handle_t handle, eventmask_t *mask)
                   2089: {
                   2090:     u_int events, bit;
                   2091:     if (CHECK_HANDLE(handle))
                   2092:        return CS_BAD_HANDLE;
                   2093:     if (handle->Attributes & CONF_EVENT_MASK_VALID)
                   2094:        return CS_BAD_SOCKET;
                   2095:     handle->EventMask = mask->EventMask;
                   2096:     events = handle->PendingEvents & handle->EventMask;
                   2097:     handle->PendingEvents -= events;
                   2098:     while (events != 0) {
                   2099:        bit = ((events ^ (events-1)) + 1) >> 1;
                   2100:        EVENT(handle, bit, CS_EVENT_PRI_LOW);
                   2101:        events -= bit;
                   2102:     }
                   2103:     return CS_SUCCESS;
                   2104: } /* set_event_mask */
                   2105: 
                   2106: /*====================================================================*/
                   2107: 
                   2108: static int report_error(client_handle_t handle, error_info_t *err)
                   2109: {
                   2110:     int i;
                   2111:     char *serv;
                   2112: 
                   2113:     if (CHECK_HANDLE(handle))
                   2114:        printk(KERN_NOTICE);
                   2115:     else
                   2116:        printk(KERN_NOTICE "%s: ", handle->dev_info);
                   2117:     
                   2118:     for (i = 0; i < SERVICE_COUNT; i++)
                   2119:        if (service_table[i].key == err->func) break;
                   2120:     if (i < SERVICE_COUNT)
                   2121:        serv = service_table[i].msg;
                   2122:     else
                   2123:        serv = "Unknown service number";
                   2124: 
                   2125:     for (i = 0; i < ERROR_COUNT; i++)
                   2126:        if (error_table[i].key == err->retcode) break;
                   2127:     if (i < ERROR_COUNT)
                   2128:        printk("%s: %s\n", serv, error_table[i].msg);
                   2129:     else
                   2130:        printk("%s: Unknown error code %#x\n", serv, err->retcode);
                   2131: 
                   2132:     return CS_SUCCESS;
                   2133: } /* report_error */
                   2134: 
                   2135: /*====================================================================*/
                   2136: 
                   2137: int CardServices(int func, void *a1, void *a2, void *a3)
                   2138: {
                   2139: 
                   2140: #ifdef PCMCIA_DEBUG
                   2141:     if (pc_debug > 2) {
                   2142:        int i;
                   2143:        for (i = 0; i < SERVICE_COUNT; i++)
                   2144:            if (service_table[i].key == func) break;
                   2145:        if (i < SERVICE_COUNT)
                   2146:            printk(KERN_DEBUG "cs: CardServices(%s, 0x%p, 0x%p)\n",
                   2147:                   service_table[i].msg, a1, a2);
                   2148:        else
                   2149:            printk(KERN_DEBUG "cs: CardServices(Unknown func %d, "
                   2150:                   "0x%p, 0x%p)\n", func, a1, a2);
                   2151:     }
                   2152: #endif
                   2153:     switch (func) {
                   2154:     case AccessConfigurationRegister:
                   2155:        return access_configuration_register(a1, a2); break;
                   2156:     case AdjustResourceInfo:
                   2157:        return adjust_resource_info(a1, a2); break;
                   2158:     case CheckEraseQueue:
                   2159:        return check_erase_queue(a1); break;
                   2160:     case CloseMemory:
                   2161:        return close_memory(a1); break;
                   2162:     case CopyMemory:
                   2163:        return copy_memory(a1, a2); break;
                   2164:     case DeregisterClient:
                   2165:        return deregister_client(a1); break;
                   2166:     case DeregisterEraseQueue:
                   2167:        return deregister_erase_queue(a1); break;
                   2168:     case GetFirstClient:
                   2169:        return get_first_client(a1, a2); break;
                   2170:     case GetCardServicesInfo:
                   2171:        return get_card_services_info(a1); break;
                   2172:     case GetConfigurationInfo:
                   2173:        return get_configuration_info(a1, a2); break;
                   2174:     case GetNextClient:
                   2175:        return get_next_client(a1, a2); break;
                   2176:     case GetFirstRegion:
                   2177:        return get_first_region(a1, a2); break;
                   2178:     case GetFirstTuple:
                   2179:        return get_first_tuple(a1, a2); break;
                   2180:     case GetNextRegion:
                   2181:        return get_next_region(a1, a2); break;
                   2182:     case GetNextTuple:
                   2183:        return get_next_tuple(a1, a2); break;
                   2184:     case GetStatus:
                   2185:        return cs_get_status(a1, a2); break;
                   2186:     case GetTupleData:
                   2187:        return get_tuple_data(a1, a2); break;
                   2188:     case MapMemPage:
                   2189:        return map_mem_page(a1, a2); break;
                   2190:     case ModifyConfiguration:
                   2191:        return modify_configuration(a1, a2); break;
                   2192:     case ModifyWindow:
                   2193:        return modify_window(a1, a2); break;
                   2194:     case OpenMemory:
                   2195:        return open_memory(a1, a2);
                   2196:     case ParseTuple:
                   2197:        return parse_tuple(a1, a2, a3); break;
                   2198:     case ReadMemory:
                   2199:        return read_memory(a1, a2, a3); break;
                   2200:     case RegisterClient:
                   2201:        return register_client(a1, a2); break;
                   2202:     case RegisterEraseQueue:
                   2203:        return register_erase_queue(a1, a2); break;
                   2204:     case RegisterMTD:
                   2205:        return register_mtd(a1, a2); break;
                   2206:     case ReleaseConfiguration:
                   2207:        return release_configuration(a1, a2); break;
                   2208:     case ReleaseIO:
                   2209:        return release_io(a1, a2); break;
                   2210:     case ReleaseIRQ:
                   2211:        return cs_release_irq(a1, a2); break;
                   2212:     case ReleaseWindow:
                   2213:        return release_window(a1); break;
                   2214:     case RequestConfiguration:
                   2215:        return request_configuration(a1, a2); break;
                   2216:     case RequestIO:
                   2217:        return request_io(a1, a2); break;
                   2218:     case RequestIRQ:
                   2219:        return cs_request_irq(a1, a2); break;
                   2220:     case RequestWindow:
                   2221:        return request_window(a1, a2); break;
                   2222:     case ResetCard:
                   2223:        return reset_card(a1, a2); break;
                   2224:     case SetEventMask:
                   2225:        return set_event_mask(a1, a2); break;
                   2226:     case ValidateCIS:
                   2227:        return validate_cis(a1, a2); break;
                   2228:     case WriteMemory:
                   2229:        return write_memory(a1, a2, a3); break;
                   2230:     case BindDevice:
                   2231:        return bind_device(a1); break;
                   2232:     case BindMTD:
                   2233:        return bind_mtd(a1); break;
                   2234:     case ReportError:
                   2235:        return report_error(a1, a2); break;
                   2236:     case SuspendCard:
                   2237:        return suspend_card(a1, a2); break;
                   2238:     case ResumeCard:
                   2239:        return resume_card(a1, a2); break;
                   2240:     case EjectCard:
                   2241:        return eject_card(a1, a2); break;
                   2242:     case InsertCard:
                   2243:        return insert_card(a1, a2); break;
                   2244:     case ReplaceCIS:
                   2245:        return replace_cis(a1, a2); break;
                   2246:     case GetFirstWindow:
                   2247:        return get_first_window(a1, a2); break;
                   2248:     case GetNextWindow:
                   2249:        return get_next_window(a1, a2); break;
                   2250:     case GetMemPage:
                   2251:        return get_mem_page(a1, a2); break;
                   2252:     default:
                   2253:        return CS_UNSUPPORTED_FUNCTION; break;
                   2254:     }
                   2255:     
                   2256: } /* CardServices */
                   2257: 
                   2258: /*======================================================================
                   2259: 
                   2260:     OS-specific module glue goes here
                   2261:     
                   2262: ======================================================================*/
                   2263: 
                   2264: #include <linux/pci.h>
                   2265: 
                   2266: #if (LINUX_VERSION_CODE <= VERSION(2,1,17))
                   2267: 
                   2268: #undef CONFIG_MODVERSIONS
                   2269: static struct symbol_table cs_symtab = {
                   2270: #include <linux/symtab_begin.h>
                   2271: #undef X
                   2272: #define X(sym) { (void *)&sym, SYMBOL_NAME_STR(sym) }
                   2273:     X(register_ss_entry),
                   2274:     X(unregister_ss_entry),
                   2275:     X(CardServices),
                   2276:     X(MTDHelperEntry),
                   2277: #ifdef HAS_PROC_BUS
                   2278:     X(proc_pccard),
                   2279: #endif
                   2280: #ifndef HAVE_MEMRESERVE
                   2281:     X(request_mem_region),
                   2282:     X(release_mem_region),
                   2283: #endif
                   2284: #ifdef CONFIG_PNP_BIOS
                   2285:     X(check_pnp_irq),
                   2286: #endif
                   2287: #ifdef CONFIG_PCI
                   2288:     X(pci_irq_mask),
                   2289:     X(pci_devices),
                   2290:     X(pci_root),
                   2291:     X(pci_find_slot),
                   2292:     X(pci_find_class),
                   2293:     X(pci_enable_device),
                   2294:     X(pci_set_power_state),
                   2295: #endif
                   2296: #include <linux/symtab_end.h>
                   2297: };
                   2298: 
                   2299: #else
                   2300: 
                   2301: EXPORT_SYMBOL(register_ss_entry);
                   2302: EXPORT_SYMBOL(unregister_ss_entry);
                   2303: EXPORT_SYMBOL(CardServices);
                   2304: EXPORT_SYMBOL(MTDHelperEntry);
                   2305: #ifdef HAS_PROC_BUS
                   2306: EXPORT_SYMBOL(proc_pccard);
                   2307: #endif
                   2308: #ifndef HAVE_MEMRESERVE
                   2309: EXPORT_SYMBOL(request_mem_region);
                   2310: EXPORT_SYMBOL(release_mem_region);
                   2311: #endif
                   2312: #ifdef CONFIG_PNP_BIOS
                   2313: EXPORT_SYMBOL(check_pnp_irq);
                   2314: #endif
                   2315: #ifdef CONFIG_PCI
                   2316: EXPORT_SYMBOL(pci_irq_mask);
                   2317: #if (LINUX_VERSION_CODE < VERSION(2,3,24))
                   2318: EXPORT_SYMBOL(pci_enable_device);
                   2319: EXPORT_SYMBOL(pci_set_power_state);
                   2320: #endif
                   2321: #endif
                   2322: 
                   2323: #endif
                   2324: 
                   2325: int __init init_pcmcia_cs(void)
                   2326: {
                   2327:     printk(KERN_INFO "%s\n", release);
                   2328: #ifdef UTS_RELEASE
                   2329:     printk(KERN_INFO "  %s\n", kernel);
                   2330: #endif
                   2331:     printk(KERN_INFO "  %s\n", options);
                   2332:     DEBUG(0, "%s\n", version);
                   2333: #ifdef CONFIG_PM
                   2334:     if (do_apm)
                   2335:        pm_register(PM_SYS_DEV, PM_SYS_PCMCIA, handle_pm_event);
                   2336: #endif
                   2337: #ifdef CONFIG_PCI
                   2338:     pci_fixup_init();
                   2339: #endif
                   2340: #ifdef CONFIG_PNP_BIOS
                   2341:     if (do_pnp) {
                   2342:        pnp_bios_init();
                   2343:        pnp_proc_init();
                   2344:        pnp_rsrc_init();
                   2345:     }
                   2346: #endif
                   2347:     register_symtab(&cs_symtab);
                   2348: #ifdef HAS_PROC_BUS
                   2349:     proc_pccard = proc_mkdir("pccard", proc_bus);
                   2350: #ifdef CONFIG_PNP_BIOS
                   2351:     if (proc_pccard) {
                   2352:        create_proc_read_entry("ioport", 0, proc_pccard,
                   2353:                               proc_read_io, NULL);
                   2354:        create_proc_read_entry("irq", 0, proc_pccard,
                   2355:                               proc_read_irq, NULL);
                   2356:     }
                   2357: #endif
                   2358: #ifndef HAVE_MEMRESERVE
                   2359:     if (proc_pccard)
                   2360:        create_proc_read_entry("memory", 0, proc_pccard,
                   2361:                               proc_read_mem, NULL);
                   2362: #endif
                   2363: #endif
                   2364:     return 0;
                   2365: }
                   2366: 
                   2367: static void __exit exit_pcmcia_cs(void)
                   2368: {
                   2369:     printk(KERN_INFO "unloading PCMCIA Card Services\n");
                   2370: #ifdef HAS_PROC_BUS
                   2371:     if (proc_pccard) {
                   2372: #ifdef CONFIG_PNP_BIOS
                   2373:        remove_proc_entry("ioport", proc_pccard);
                   2374:        remove_proc_entry("irq", proc_pccard);
                   2375: #endif
                   2376: #ifndef HAVE_MEMRESERVE
                   2377:        remove_proc_entry("memory", proc_pccard);
                   2378: #endif
                   2379:        remove_proc_entry("pccard", proc_bus);
                   2380:     }
                   2381: #endif
                   2382: #ifdef CONFIG_PM
                   2383:     if (do_apm)
                   2384:        pm_unregister_all(handle_pm_event);
                   2385: #endif
                   2386: #ifdef CONFIG_PCI
                   2387:     pci_fixup_done();
                   2388: #endif
                   2389: #ifdef CONFIG_PNP_BIOS
                   2390:     if (do_pnp) {
                   2391:        pnp_proc_done();
                   2392:        pnp_rsrc_done();
                   2393:     }
                   2394: #endif
                   2395:     release_resource_db();
                   2396: }
                   2397: 
                   2398: module_init(init_pcmcia_cs);
                   2399: module_exit(exit_pcmcia_cs);

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.