cs.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:70k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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