1 /*======================================================================
3 Kernel Card Services -- core services
5 cs.c 1.271 2000/10/02 20:27:49
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/
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.
17 The initial developer of the original code is David A. Hinds
18 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
19 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
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 which
23 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.
32 ======================================================================*/
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>
43 #include <linux/interrupt.h>
44 #include <linux/timer.h>
45 #include <linux/ioport.h>
46 #include <linux/delay.h>
48 #include <linux/pci.h>
49 #include <linux/device.h>
50 #include <linux/suspend.h>
51 #include <asm/system.h>
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 "cs_internal.h"
65 #define PCI_OPT " [pci]"
70 #define CB_OPT " [cardbus]"
75 #define PM_OPT " [pm]"
79 #if !defined(CONFIG_CARDBUS) && !defined(CONFIG_PCI) && !defined(CONFIG_PM)
80 #define OPTIONS " none"
82 #define OPTIONS PCI_OPT CB_OPT PM_OPT
85 static const char *release = "Linux Kernel Card Services " CS_RELEASE;
86 static const char *options = "options: " OPTIONS;
88 /*====================================================================*/
90 /* Module parameters */
92 MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
93 MODULE_DESCRIPTION("Linux Kernel Card Services " CS_RELEASE
94 "\n options:" OPTIONS);
95 MODULE_LICENSE("Dual MPL/GPL");
97 #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
99 INT_MODULE_PARM(setup_delay, 10); /* centiseconds */
100 INT_MODULE_PARM(resume_delay, 20); /* centiseconds */
101 INT_MODULE_PARM(shutdown_delay, 3); /* centiseconds */
102 INT_MODULE_PARM(vcc_settle, 40); /* centiseconds */
103 INT_MODULE_PARM(reset_time, 10); /* usecs */
104 INT_MODULE_PARM(unreset_delay, 10); /* centiseconds */
105 INT_MODULE_PARM(unreset_check, 10); /* centiseconds */
106 INT_MODULE_PARM(unreset_limit, 30); /* unreset_check's */
108 /* Access speed for attribute memory windows */
109 INT_MODULE_PARM(cis_speed, 300); /* ns */
111 /* Access speed for IO windows */
112 INT_MODULE_PARM(io_speed, 0); /* ns */
115 INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
116 static const char *version =
117 "cs.c 1.279 2001/10/13 00:08:28 (David Hinds)";
120 /*====================================================================*/
122 socket_state_t dead_socket = {
123 .csc_mask = SS_DETECT,
127 /* List of all sockets, protected by a rwsem */
128 LIST_HEAD(pcmcia_socket_list);
129 DECLARE_RWSEM(pcmcia_socket_list_rwsem);
131 /*====================================================================*/
133 /* String tables for error messages */
135 typedef struct lookup_t {
140 static const lookup_t error_table[] = {
141 { CS_SUCCESS, "Operation succeeded" },
142 { CS_BAD_ADAPTER, "Bad adapter" },
143 { CS_BAD_ATTRIBUTE, "Bad attribute", },
144 { CS_BAD_BASE, "Bad base address" },
145 { CS_BAD_EDC, "Bad EDC" },
146 { CS_BAD_IRQ, "Bad IRQ" },
147 { CS_BAD_OFFSET, "Bad offset" },
148 { CS_BAD_PAGE, "Bad page number" },
149 { CS_READ_FAILURE, "Read failure" },
150 { CS_BAD_SIZE, "Bad size" },
151 { CS_BAD_SOCKET, "Bad socket" },
152 { CS_BAD_TYPE, "Bad type" },
153 { CS_BAD_VCC, "Bad Vcc" },
154 { CS_BAD_VPP, "Bad Vpp" },
155 { CS_BAD_WINDOW, "Bad window" },
156 { CS_WRITE_FAILURE, "Write failure" },
157 { CS_NO_CARD, "No card present" },
158 { CS_UNSUPPORTED_FUNCTION, "Usupported function" },
159 { CS_UNSUPPORTED_MODE, "Unsupported mode" },
160 { CS_BAD_SPEED, "Bad speed" },
161 { CS_BUSY, "Resource busy" },
162 { CS_GENERAL_FAILURE, "General failure" },
163 { CS_WRITE_PROTECTED, "Write protected" },
164 { CS_BAD_ARG_LENGTH, "Bad argument length" },
165 { CS_BAD_ARGS, "Bad arguments" },
166 { CS_CONFIGURATION_LOCKED, "Configuration locked" },
167 { CS_IN_USE, "Resource in use" },
168 { CS_NO_MORE_ITEMS, "No more items" },
169 { CS_OUT_OF_RESOURCE, "Out of resource" },
170 { CS_BAD_HANDLE, "Bad handle" },
171 { CS_BAD_TUPLE, "Bad CIS tuple" }
173 #define ERROR_COUNT (sizeof(error_table)/sizeof(lookup_t))
175 static const lookup_t service_table[] = {
176 { AccessConfigurationRegister, "AccessConfigurationRegister" },
177 { AddSocketServices, "AddSocketServices" },
178 { AdjustResourceInfo, "AdjustResourceInfo" },
179 { CheckEraseQueue, "CheckEraseQueue" },
180 { CloseMemory, "CloseMemory" },
181 { DeregisterClient, "DeregisterClient" },
182 { DeregisterEraseQueue, "DeregisterEraseQueue" },
183 { GetCardServicesInfo, "GetCardServicesInfo" },
184 { GetClientInfo, "GetClientInfo" },
185 { GetConfigurationInfo, "GetConfigurationInfo" },
186 { GetEventMask, "GetEventMask" },
187 { GetFirstClient, "GetFirstClient" },
188 { GetFirstRegion, "GetFirstRegion" },
189 { GetFirstTuple, "GetFirstTuple" },
190 { GetNextClient, "GetNextClient" },
191 { GetNextRegion, "GetNextRegion" },
192 { GetNextTuple, "GetNextTuple" },
193 { GetStatus, "GetStatus" },
194 { GetTupleData, "GetTupleData" },
195 { MapMemPage, "MapMemPage" },
196 { ModifyConfiguration, "ModifyConfiguration" },
197 { ModifyWindow, "ModifyWindow" },
198 { OpenMemory, "OpenMemory" },
199 { ParseTuple, "ParseTuple" },
200 { ReadMemory, "ReadMemory" },
201 { RegisterClient, "RegisterClient" },
202 { RegisterEraseQueue, "RegisterEraseQueue" },
203 { RegisterMTD, "RegisterMTD" },
204 { ReleaseConfiguration, "ReleaseConfiguration" },
205 { ReleaseIO, "ReleaseIO" },
206 { ReleaseIRQ, "ReleaseIRQ" },
207 { ReleaseWindow, "ReleaseWindow" },
208 { RequestConfiguration, "RequestConfiguration" },
209 { RequestIO, "RequestIO" },
210 { RequestIRQ, "RequestIRQ" },
211 { RequestSocketMask, "RequestSocketMask" },
212 { RequestWindow, "RequestWindow" },
213 { ResetCard, "ResetCard" },
214 { SetEventMask, "SetEventMask" },
215 { ValidateCIS, "ValidateCIS" },
216 { WriteMemory, "WriteMemory" },
217 { BindDevice, "BindDevice" },
218 { BindMTD, "BindMTD" },
219 { ReportError, "ReportError" },
220 { SuspendCard, "SuspendCard" },
221 { ResumeCard, "ResumeCard" },
222 { EjectCard, "EjectCard" },
223 { InsertCard, "InsertCard" },
224 { ReplaceCIS, "ReplaceCIS" }
226 #define SERVICE_COUNT (sizeof(service_table)/sizeof(lookup_t))
229 /*====================================================================
231 Low-level PC Card interface drivers need to register with Card
232 Services using these calls.
234 ======================================================================*/
237 * socket drivers are expected to use the following callbacks in their
239 * - pcmcia_socket_dev_suspend
240 * - pcmcia_socket_dev_resume
241 * These functions check for the appropriate struct pcmcia_soket arrays,
242 * and pass them to the low-level functions pcmcia_{suspend,resume}_socket
244 static int socket_resume(struct pcmcia_socket *skt);
245 static int socket_suspend(struct pcmcia_socket *skt);
247 int pcmcia_socket_dev_suspend(struct device *dev, u32 state, u32 level)
249 struct pcmcia_socket *socket;
251 if (level != SUSPEND_SAVE_STATE)
254 down_read(&pcmcia_socket_list_rwsem);
255 list_for_each_entry(socket, &pcmcia_socket_list, socket_list) {
256 if (socket->dev.dev != dev)
258 down(&socket->skt_sem);
259 socket_suspend(socket);
260 up(&socket->skt_sem);
262 up_read(&pcmcia_socket_list_rwsem);
266 EXPORT_SYMBOL(pcmcia_socket_dev_suspend);
268 int pcmcia_socket_dev_resume(struct device *dev, u32 level)
270 struct pcmcia_socket *socket;
272 if (level != RESUME_RESTORE_STATE)
275 down_read(&pcmcia_socket_list_rwsem);
276 list_for_each_entry(socket, &pcmcia_socket_list, socket_list) {
277 if (socket->dev.dev != dev)
279 down(&socket->skt_sem);
280 socket_resume(socket);
281 up(&socket->skt_sem);
283 up_read(&pcmcia_socket_list_rwsem);
287 EXPORT_SYMBOL(pcmcia_socket_dev_resume);
290 static int pccardd(void *__skt);
291 #define to_class_data(dev) dev->class_data
293 static int pcmcia_add_socket(struct class_device *class_dev)
295 struct pcmcia_socket *socket = class_get_devdata(class_dev);
298 /* base address = 0, map = 0 */
299 socket->cis_mem.flags = 0;
300 socket->cis_mem.speed = cis_speed;
301 socket->erase_busy.next = socket->erase_busy.prev = &socket->erase_busy;
302 INIT_LIST_HEAD(&socket->cis_cache);
303 spin_lock_init(&socket->lock);
305 init_completion(&socket->thread_done);
306 init_waitqueue_head(&socket->thread_wait);
307 init_MUTEX(&socket->skt_sem);
308 spin_lock_init(&socket->thread_lock);
310 socket->socket = dead_socket;
311 socket->ops->init(socket);
313 ret = kernel_thread(pccardd, socket, CLONE_KERNEL);
317 wait_for_completion(&socket->thread_done);
318 BUG_ON(!socket->thread);
319 pcmcia_parse_events(socket, SS_DETECT);
324 static void pcmcia_remove_socket(struct class_device *class_dev)
326 struct pcmcia_socket *socket = class_get_devdata(class_dev);
329 if (socket->thread) {
330 init_completion(&socket->thread_done);
331 socket->thread = NULL;
332 wake_up(&socket->thread_wait);
333 wait_for_completion(&socket->thread_done);
335 release_cis_mem(socket);
336 while (socket->clients) {
337 client = socket->clients;
338 socket->clients = socket->clients->next;
344 static void pcmcia_release_socket(struct class_device *class_dev)
346 struct pcmcia_socket *socket = class_get_devdata(class_dev);
347 complete(&socket->socket_released);
352 * pcmcia_register_socket - add a new pcmcia socket device
354 int pcmcia_register_socket(struct pcmcia_socket *socket)
356 if (!socket || !socket->ops || !socket->dev.dev)
359 DEBUG(0, "cs: pcmcia_register_socket(0x%p)\n", socket->ops);
361 /* try to obtain a socket number [yes, it gets ugly if we
362 * register more than 2^sizeof(unsigned int) pcmcia
363 * sockets... but the socket number is deprecated
364 * anyways, so I don't care] */
365 down_write(&pcmcia_socket_list_rwsem);
366 if (list_empty(&pcmcia_socket_list))
369 unsigned int found, i = 1;
370 struct pcmcia_socket *tmp;
373 list_for_each_entry(tmp, &pcmcia_socket_list, socket_list) {
379 socket->sock = i - 1;
381 list_add_tail(&socket->socket_list, &pcmcia_socket_list);
382 up_write(&pcmcia_socket_list_rwsem);
385 /* set proper values in socket->dev */
386 socket->dev.class_data = socket;
387 socket->dev.class = &pcmcia_socket_class;
388 snprintf(socket->dev.class_id, BUS_ID_SIZE, "pcmcia_socket%u", socket->sock);
390 /* register with the device core */
391 if (class_device_register(&socket->dev)) {
392 down_write(&pcmcia_socket_list_rwsem);
393 list_del(&socket->socket_list);
394 up_write(&pcmcia_socket_list_rwsem);
399 } /* pcmcia_register_socket */
400 EXPORT_SYMBOL(pcmcia_register_socket);
404 * pcmcia_unregister_socket - remove a pcmcia socket device
406 void pcmcia_unregister_socket(struct pcmcia_socket *socket)
411 DEBUG(0, "cs: pcmcia_unregister_socket(0x%p)\n", socket->ops);
413 init_completion(&socket->socket_released);
415 /* remove from the device core */
416 class_device_unregister(&socket->dev);
418 /* remove from our own list */
419 down_write(&pcmcia_socket_list_rwsem);
420 list_del(&socket->socket_list);
421 up_write(&pcmcia_socket_list_rwsem);
423 /* wait for sysfs to drop all references */
424 wait_for_completion(&socket->socket_released);
425 } /* pcmcia_unregister_socket */
426 EXPORT_SYMBOL(pcmcia_unregister_socket);
429 struct pcmcia_socket * pcmcia_get_socket_by_nr(unsigned int nr)
431 struct pcmcia_socket *s;
433 down_read(&pcmcia_socket_list_rwsem);
434 list_for_each_entry(s, &pcmcia_socket_list, socket_list)
436 up_read(&pcmcia_socket_list_rwsem);
439 up_read(&pcmcia_socket_list_rwsem);
444 EXPORT_SYMBOL(pcmcia_get_socket_by_nr);
447 /*======================================================================
449 Shutdown_Socket() and setup_socket() are scheduled using add_timer
450 calls by the main event handler when card insertion and removal
451 events are received. Shutdown_Socket() unconfigures a socket and
452 turns off socket power. Setup_socket() turns on socket power
453 and resets the socket, in two stages.
455 ======================================================================*/
457 static void free_regions(memory_handle_t *list)
460 while (*list != NULL) {
462 *list = tmp->info.next;
463 tmp->region_magic = 0;
468 static int send_event(struct pcmcia_socket *s, event_t event, int priority);
470 static void shutdown_socket(struct pcmcia_socket *s)
474 DEBUG(1, "cs: shutdown_socket(%p)\n", s);
476 /* Blank out the socket state */
477 s->state &= SOCKET_PRESENT|SOCKET_SETUP_PENDING;
478 s->socket = dead_socket;
480 s->irq.AssignedIRQ = s->irq.Config = 0;
482 destroy_cis_cache(s);
487 /* Should not the socket be forced quiet as well? e.g. turn off Vcc */
488 /* Without these changes, the socket is left hot, even though card-services */
489 /* realizes that no card is in place. */
490 s->socket.flags &= ~SS_OUTPUT_ENA;
493 s->socket.io_irq = 0;
494 s->ops->set_socket(s, &s->socket);
496 #ifdef CONFIG_CARDBUS
504 for (c = &s->clients; *c; ) {
505 if ((*c)->state & CLIENT_UNBOUND) {
513 free_regions(&s->a_region);
514 free_regions(&s->c_region);
515 } /* shutdown_socket */
517 /*======================================================================
519 The central event handler. Send_event() sends an event to all
520 valid clients. Parse_events() interprets the event bits from
521 a card status change report. Do_shutdown() handles the high
522 priority stuff associated with a card removal.
524 ======================================================================*/
526 static int send_event(struct pcmcia_socket *s, event_t event, int priority)
528 client_t *client = s->clients;
530 DEBUG(1, "cs: send_event(sock %d, event %d, pri %d)\n",
531 s->sock, event, priority);
533 if (s->state & SOCKET_CARDBUS)
535 for (; client; client = client->next) {
536 if (client->state & (CLIENT_UNBOUND|CLIENT_STALE))
538 if (client->EventMask & event) {
539 ret = EVENT(client, event, priority);
547 static void pcmcia_error(struct pcmcia_socket *skt, const char *fmt, ...)
549 static char buf[128];
554 len = vsnprintf(buf, sizeof(buf), fmt, ap);
558 printk(KERN_ERR "PCMCIA: socket %p: %s", skt, buf);
561 #define cs_to_timeout(cs) (((cs) * HZ + 99) / 100)
563 static void socket_remove_drivers(struct pcmcia_socket *skt)
567 send_event(skt, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
569 for (client = skt->clients; client; client = client->next)
570 if (!(client->Attributes & INFO_MASTER_CLIENT))
571 client->state |= CLIENT_STALE;
574 static void socket_shutdown(struct pcmcia_socket *skt)
576 socket_remove_drivers(skt);
577 set_current_state(TASK_UNINTERRUPTIBLE);
578 schedule_timeout(cs_to_timeout(shutdown_delay));
579 skt->state &= ~SOCKET_PRESENT;
580 shutdown_socket(skt);
583 static int socket_reset(struct pcmcia_socket *skt)
587 skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET;
588 skt->ops->set_socket(skt, &skt->socket);
589 udelay((long)reset_time);
591 skt->socket.flags &= ~SS_RESET;
592 skt->ops->set_socket(skt, &skt->socket);
594 set_current_state(TASK_UNINTERRUPTIBLE);
595 schedule_timeout(cs_to_timeout(unreset_delay));
596 for (i = 0; i < unreset_limit; i++) {
597 skt->ops->get_status(skt, &status);
599 if (!(status & SS_DETECT))
602 if (status & SS_READY)
605 set_current_state(TASK_UNINTERRUPTIBLE);
606 schedule_timeout(cs_to_timeout(unreset_check));
609 pcmcia_error(skt, "time out after reset.\n");
610 return CS_GENERAL_FAILURE;
613 static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
617 skt->ops->get_status(skt, &status);
618 if (!(status & SS_DETECT))
621 set_current_state(TASK_UNINTERRUPTIBLE);
622 schedule_timeout(cs_to_timeout(initial_delay));
624 for (i = 0; i < 100; i++) {
625 skt->ops->get_status(skt, &status);
626 if (!(status & SS_DETECT))
629 if (!(status & SS_PENDING))
632 set_current_state(TASK_UNINTERRUPTIBLE);
633 schedule_timeout(cs_to_timeout(10));
636 if (status & SS_PENDING) {
637 pcmcia_error(skt, "voltage interrogation timed out.\n");
638 return CS_GENERAL_FAILURE;
641 if (status & SS_CARDBUS) {
642 skt->state |= SOCKET_CARDBUS;
643 #ifndef CONFIG_CARDBUS
644 pcmcia_error(skt, "cardbus cards are not supported.\n");
650 * Decode the card voltage requirements, and apply power to the card.
652 if (status & SS_3VCARD)
653 skt->socket.Vcc = skt->socket.Vpp = 33;
654 else if (!(status & SS_XVCARD))
655 skt->socket.Vcc = skt->socket.Vpp = 50;
657 pcmcia_error(skt, "unsupported voltage key.\n");
660 skt->state |= SOCKET_PRESENT;
661 skt->socket.flags = SS_DEBOUNCED;
662 skt->ops->set_socket(skt, &skt->socket);
665 * Wait "vcc_settle" for the supply to stabilise.
667 set_current_state(TASK_UNINTERRUPTIBLE);
668 schedule_timeout(cs_to_timeout(vcc_settle));
670 return socket_reset(skt);
674 * Handle card insertion. Setup the socket, reset the card,
675 * and then tell the rest of PCMCIA that a card is present.
677 static int socket_insert(struct pcmcia_socket *skt)
681 if (!try_module_get(skt->owner))
684 ret = socket_setup(skt, setup_delay);
685 if (ret == CS_SUCCESS) {
686 #ifdef CONFIG_CARDBUS
687 if (skt->state & SOCKET_CARDBUS) {
689 skt->state |= SOCKET_CARDBUS_CONFIG;
692 send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
693 skt->socket.flags &= ~SS_DEBOUNCED;
695 socket_shutdown(skt);
696 module_put(skt->owner);
702 static int socket_suspend(struct pcmcia_socket *skt)
704 if (skt->state & SOCKET_SUSPEND)
707 send_event(skt, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
708 skt->socket = dead_socket;
709 skt->ops->suspend(skt);
710 skt->state |= SOCKET_SUSPEND;
716 * Resume a socket. If a card is present, verify its CIS against
717 * our cached copy. If they are different, the card has been
718 * replaced, and we need to tell the drivers.
720 static int socket_resume(struct pcmcia_socket *skt)
724 if (!(skt->state & SOCKET_SUSPEND))
727 skt->socket = dead_socket;
730 ret = socket_setup(skt, resume_delay);
731 if (ret == CS_SUCCESS) {
733 * FIXME: need a better check here for cardbus cards.
735 if (verify_cis_cache(skt) != 0) {
736 socket_remove_drivers(skt);
737 destroy_cis_cache(skt);
738 send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
740 send_event(skt, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW);
742 skt->socket.flags &= ~SS_DEBOUNCED;
744 unsigned int old_state = skt->state;
745 socket_shutdown(skt);
746 if (old_state & SOCKET_PRESENT)
747 module_put(skt->owner);
750 skt->state &= ~SOCKET_SUSPEND;
755 static void socket_remove(struct pcmcia_socket *skt)
757 socket_shutdown(skt);
758 module_put(skt->owner);
762 * Process a socket card detect status change.
764 * If we don't have a card already present, delay the detect event for
765 * about 20ms (to be on the safe side) before reading the socket status.
767 * Some i82365-based systems send multiple SS_DETECT events during card
768 * insertion, and the "card present" status bit seems to bounce. This
769 * will probably be true with GPIO-based card detection systems after
770 * the product has aged.
772 static void socket_detect_change(struct pcmcia_socket *skt)
774 if (!(skt->state & SOCKET_SUSPEND)) {
777 if (!(skt->state & SOCKET_PRESENT)) {
778 set_current_state(TASK_UNINTERRUPTIBLE);
779 schedule_timeout(cs_to_timeout(2));
782 skt->ops->get_status(skt, &status);
783 if ((skt->state & SOCKET_PRESENT) &&
784 !(status & SS_DETECT))
786 if (!(skt->state & SOCKET_PRESENT) &&
787 (status & SS_DETECT))
792 static int pccardd(void *__skt)
794 struct pcmcia_socket *skt = __skt;
795 DECLARE_WAITQUEUE(wait, current);
797 daemonize("pccardd");
798 skt->thread = current;
799 complete(&skt->thread_done);
801 add_wait_queue(&skt->thread_wait, &wait);
806 set_current_state(TASK_INTERRUPTIBLE);
808 spin_lock_irqsave(&skt->thread_lock, flags);
809 events = skt->thread_events;
810 skt->thread_events = 0;
811 spin_unlock_irqrestore(&skt->thread_lock, flags);
815 if (events & SS_DETECT)
816 socket_detect_change(skt);
817 if (events & SS_BATDEAD)
818 send_event(skt, CS_EVENT_BATTERY_DEAD, CS_EVENT_PRI_LOW);
819 if (events & SS_BATWARN)
820 send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW);
821 if (events & SS_READY)
822 send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW);
828 if (current->flags & PF_FREEZE)
829 refrigerator(PF_IOTHREAD);
834 remove_wait_queue(&skt->thread_wait, &wait);
836 complete_and_exit(&skt->thread_done, 0);
840 * Yenta (at least) probes interrupts before registering the socket and
841 * starting the handler thread.
843 void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
846 spin_lock(&s->thread_lock);
847 s->thread_events |= events;
848 spin_unlock(&s->thread_lock);
850 wake_up(&s->thread_wait);
852 } /* pcmcia_parse_events */
855 /*======================================================================
857 Special stuff for managing IO windows, because they are scarce.
859 ======================================================================*/
861 static int alloc_io_space(struct pcmcia_socket *s, u_int attr, ioaddr_t *base,
862 ioaddr_t num, u_int lines, char *name)
867 align = (*base) ? (lines ? 1<<lines : 0) : 1;
868 if (align && (align < num)) {
870 DEBUG(0, "odd IO request: num %04x align %04x\n",
874 while (align && (align < num)) align <<= 1;
876 if (*base & ~(align-1)) {
877 DEBUG(0, "odd IO request: base %04x align %04x\n",
881 if ((s->features & SS_CAP_STATIC_MAP) && s->io_offset) {
882 *base = s->io_offset | (*base & 0x0fff);
885 /* Check for an already-allocated window that must conflict with
886 what was asked for. It is a hack because it does not catch all
887 potential conflicts, just the most obvious ones. */
888 for (i = 0; i < MAX_IO_WIN; i++)
889 if ((s->io[i].NumPorts != 0) &&
890 ((s->io[i].BasePort & (align-1)) == *base))
892 for (i = 0; i < MAX_IO_WIN; i++) {
893 if (s->io[i].NumPorts == 0) {
894 if (find_io_region(base, num, align, name, s) == 0) {
895 s->io[i].Attributes = attr;
896 s->io[i].BasePort = *base;
897 s->io[i].NumPorts = s->io[i].InUse = num;
901 } else if (s->io[i].Attributes != attr)
903 /* Try to extend top of window */
904 try = s->io[i].BasePort + s->io[i].NumPorts;
905 if ((*base == 0) || (*base == try))
906 if (find_io_region(&try, num, 0, name, s) == 0) {
908 s->io[i].NumPorts += num;
909 s->io[i].InUse += num;
912 /* Try to extend bottom of window */
913 try = s->io[i].BasePort - num;
914 if ((*base == 0) || (*base == try))
915 if (find_io_region(&try, num, 0, name, s) == 0) {
916 s->io[i].BasePort = *base = try;
917 s->io[i].NumPorts += num;
918 s->io[i].InUse += num;
922 return (i == MAX_IO_WIN);
923 } /* alloc_io_space */
925 static void release_io_space(struct pcmcia_socket *s, ioaddr_t base,
929 if(!(s->features & SS_CAP_STATIC_MAP))
930 release_region(base, num);
931 for (i = 0; i < MAX_IO_WIN; i++) {
932 if ((s->io[i].BasePort <= base) &&
933 (s->io[i].BasePort+s->io[i].NumPorts >= base+num)) {
934 s->io[i].InUse -= num;
935 /* Free the window if no one else is using it */
936 if (s->io[i].InUse == 0)
937 s->io[i].NumPorts = 0;
942 /*======================================================================
944 Access_configuration_register() reads and writes configuration
945 registers in attribute memory. Memory window 0 is reserved for
946 this and the tuple reading services.
948 ======================================================================*/
950 int pcmcia_access_configuration_register(client_handle_t handle,
953 struct pcmcia_socket *s;
958 if (CHECK_HANDLE(handle))
959 return CS_BAD_HANDLE;
961 if (handle->Function == BIND_FN_ALL) {
962 if (reg->Function >= s->functions)
964 c = &s->config[reg->Function];
971 if (!(c->state & CONFIG_LOCKED))
972 return CS_CONFIGURATION_LOCKED;
974 addr = (c->ConfigBase + reg->Offset) >> 1;
976 switch (reg->Action) {
978 read_cis_mem(s, 1, addr, 1, &val);
983 write_cis_mem(s, 1, addr, 1, &val);
990 } /* access_configuration_register */
992 /*======================================================================
994 Bind_device() associates a device driver with a particular socket.
995 It is normally called by Driver Services after it has identified
996 a newly inserted card. An instance of that driver will then be
997 eligible to register as a client of this socket.
999 ======================================================================*/
1001 int pcmcia_bind_device(bind_req_t *req)
1004 struct pcmcia_socket *s;
1008 return CS_BAD_SOCKET;
1010 client = (client_t *)kmalloc(sizeof(client_t), GFP_KERNEL);
1011 if (!client) return CS_OUT_OF_RESOURCE;
1012 memset(client, '\0', sizeof(client_t));
1013 client->client_magic = CLIENT_MAGIC;
1014 strlcpy(client->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
1016 client->Function = req->Function;
1017 client->state = CLIENT_UNBOUND;
1018 client->erase_busy.next = &client->erase_busy;
1019 client->erase_busy.prev = &client->erase_busy;
1020 init_waitqueue_head(&client->mtd_req);
1021 client->next = s->clients;
1022 s->clients = client;
1023 DEBUG(1, "cs: bind_device(): client 0x%p, sock %d, dev %s\n",
1024 client, client->Socket, client->dev_info);
1028 /*======================================================================
1030 Bind_mtd() associates a device driver with a particular memory
1031 region. It is normally called by Driver Services after it has
1032 identified a memory device type. An instance of the corresponding
1033 driver will then be able to register to control this region.
1035 ======================================================================*/
1037 int pcmcia_bind_mtd(mtd_bind_t *req)
1039 struct pcmcia_socket *s;
1040 memory_handle_t region;
1044 return CS_BAD_SOCKET;
1046 if (req->Attributes & REGION_TYPE_AM)
1047 region = s->a_region;
1049 region = s->c_region;
1052 if (region->info.CardOffset == req->CardOffset) break;
1053 region = region->info.next;
1055 if (!region || (region->mtd != NULL))
1056 return CS_BAD_OFFSET;
1057 strlcpy(region->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
1059 DEBUG(1, "cs: bind_mtd(): attr 0x%x, offset 0x%x, dev %s\n",
1060 req->Attributes, req->CardOffset, (char *)req->dev_info);
1064 /*====================================================================*/
1066 int pcmcia_deregister_client(client_handle_t handle)
1069 struct pcmcia_socket *s;
1070 memory_handle_t region;
1074 DEBUG(1, "cs: deregister_client(%p)\n", handle);
1075 if (CHECK_HANDLE(handle))
1076 return CS_BAD_HANDLE;
1078 (CLIENT_IRQ_REQ|CLIENT_IO_REQ|CLIENT_CONFIG_LOCKED))
1080 for (i = 0; i < MAX_WIN; i++)
1081 if (handle->state & CLIENT_WIN_REQ(i))
1084 /* Disconnect all MTD links */
1086 if (handle->mtd_count) {
1087 for (region = s->a_region; region; region = region->info.next)
1088 if (region->mtd == handle) region->mtd = NULL;
1089 for (region = s->c_region; region; region = region->info.next)
1090 if (region->mtd == handle) region->mtd = NULL;
1093 if ((handle->state & CLIENT_STALE) ||
1094 (handle->Attributes & INFO_MASTER_CLIENT)) {
1095 spin_lock_irqsave(&s->lock, flags);
1096 client = &s->clients;
1097 while ((*client) && ((*client) != handle))
1098 client = &(*client)->next;
1099 if (*client == NULL) {
1100 spin_unlock_irqrestore(&s->lock, flags);
1101 return CS_BAD_HANDLE;
1103 *client = handle->next;
1104 handle->client_magic = 0;
1106 spin_unlock_irqrestore(&s->lock, flags);
1108 handle->state = CLIENT_UNBOUND;
1109 handle->mtd_count = 0;
1110 handle->event_handler = NULL;
1114 } /* deregister_client */
1116 /*====================================================================*/
1118 int pcmcia_get_configuration_info(client_handle_t handle,
1119 config_info_t *config)
1121 struct pcmcia_socket *s;
1124 if (CHECK_HANDLE(handle))
1125 return CS_BAD_HANDLE;
1127 if (!(s->state & SOCKET_PRESENT))
1130 if (handle->Function == BIND_FN_ALL) {
1131 if (config->Function && (config->Function >= s->functions))
1134 config->Function = handle->Function;
1136 #ifdef CONFIG_CARDBUS
1137 if (s->state & SOCKET_CARDBUS) {
1138 u_char fn = config->Function;
1139 memset(config, 0, sizeof(config_info_t));
1140 config->Function = fn;
1141 config->Vcc = s->socket.Vcc;
1142 config->Vpp1 = config->Vpp2 = s->socket.Vpp;
1143 config->Option = s->cb_dev->subordinate->number;
1144 if (s->state & SOCKET_CARDBUS_CONFIG) {
1145 config->Attributes = CONF_VALID_CLIENT;
1146 config->IntType = INT_CARDBUS;
1147 config->AssignedIRQ = s->irq.AssignedIRQ;
1148 if (config->AssignedIRQ)
1149 config->Attributes |= CONF_ENABLE_IRQ;
1150 config->BasePort1 = s->io[0].BasePort;
1151 config->NumPorts1 = s->io[0].NumPorts;
1157 c = (s->config != NULL) ? &s->config[config->Function] : NULL;
1159 if ((c == NULL) || !(c->state & CONFIG_LOCKED)) {
1160 config->Attributes = 0;
1161 config->Vcc = s->socket.Vcc;
1162 config->Vpp1 = config->Vpp2 = s->socket.Vpp;
1166 /* !!! This is a hack !!! */
1167 memcpy(&config->Attributes, &c->Attributes, sizeof(config_t));
1168 config->Attributes |= CONF_VALID_CLIENT;
1169 config->CardValues = c->CardValues;
1170 config->IRQAttributes = c->irq.Attributes;
1171 config->AssignedIRQ = s->irq.AssignedIRQ;
1172 config->BasePort1 = c->io.BasePort1;
1173 config->NumPorts1 = c->io.NumPorts1;
1174 config->Attributes1 = c->io.Attributes1;
1175 config->BasePort2 = c->io.BasePort2;
1176 config->NumPorts2 = c->io.NumPorts2;
1177 config->Attributes2 = c->io.Attributes2;
1178 config->IOAddrLines = c->io.IOAddrLines;
1181 } /* get_configuration_info */
1183 /*======================================================================
1185 Return information about this version of Card Services.
1187 ======================================================================*/
1189 int pcmcia_get_card_services_info(servinfo_t *info)
1191 unsigned int socket_count = 0;
1192 struct list_head *tmp;
1193 info->Signature[0] = 'C';
1194 info->Signature[1] = 'S';
1195 down_read(&pcmcia_socket_list_rwsem);
1196 list_for_each(tmp, &pcmcia_socket_list)
1198 up_read(&pcmcia_socket_list_rwsem);
1199 info->Count = socket_count;
1200 info->Revision = CS_RELEASE_CODE;
1201 info->CSLevel = 0x0210;
1202 info->VendorString = (char *)release;
1204 } /* get_card_services_info */
1206 /*======================================================================
1208 Note that get_first_client() *does* recognize the Socket field
1209 in the request structure.
1211 ======================================================================*/
1213 int pcmcia_get_first_client(client_handle_t *handle, client_req_t *req)
1216 struct pcmcia_socket *socket;
1217 if (req->Attributes & CLIENT_THIS_SOCKET)
1221 socket = pcmcia_get_socket_by_nr(s);
1223 return CS_BAD_SOCKET;
1224 if (socket->clients == NULL)
1225 return CS_NO_MORE_ITEMS;
1226 *handle = socket->clients;
1228 } /* get_first_client */
1230 /*====================================================================*/
1232 int pcmcia_get_next_client(client_handle_t *handle, client_req_t *req)
1234 struct pcmcia_socket *s;
1235 if ((handle == NULL) || CHECK_HANDLE(*handle))
1236 return CS_BAD_HANDLE;
1237 if ((*handle)->next == NULL) {
1238 if (req->Attributes & CLIENT_THIS_SOCKET)
1239 return CS_NO_MORE_ITEMS;
1240 s = (*handle)->Socket;
1241 if (s->clients == NULL)
1242 return CS_NO_MORE_ITEMS;
1243 *handle = s->clients;
1245 *handle = (*handle)->next;
1247 } /* get_next_client */
1249 /*====================================================================*/
1251 int pcmcia_get_window(window_handle_t *handle, int idx, win_req_t *req)
1253 struct pcmcia_socket *s;
1258 s = ((client_handle_t)*handle)->Socket;
1260 s = (*handle)->sock;
1261 if (!(s->state & SOCKET_PRESENT))
1263 for (w = idx; w < MAX_WIN; w++)
1264 if (s->state & SOCKET_WIN_REQ(w)) break;
1266 return CS_NO_MORE_ITEMS;
1268 req->Base = win->ctl.sys_start;
1269 req->Size = win->ctl.sys_stop - win->ctl.sys_start + 1;
1270 req->AccessSpeed = win->ctl.speed;
1271 req->Attributes = 0;
1272 if (win->ctl.flags & MAP_ATTRIB)
1273 req->Attributes |= WIN_MEMORY_TYPE_AM;
1274 if (win->ctl.flags & MAP_ACTIVE)
1275 req->Attributes |= WIN_ENABLE;
1276 if (win->ctl.flags & MAP_16BIT)
1277 req->Attributes |= WIN_DATA_WIDTH_16;
1278 if (win->ctl.flags & MAP_USE_WAIT)
1279 req->Attributes |= WIN_USE_WAIT;
1284 int pcmcia_get_first_window(window_handle_t *win, win_req_t *req)
1286 if ((win == NULL) || ((*win)->magic != WINDOW_MAGIC))
1287 return CS_BAD_HANDLE;
1288 return pcmcia_get_window(win, 0, req);
1291 int pcmcia_get_next_window(window_handle_t *win, win_req_t *req)
1293 if ((win == NULL) || ((*win)->magic != WINDOW_MAGIC))
1294 return CS_BAD_HANDLE;
1295 return pcmcia_get_window(win, (*win)->index+1, req);
1298 /*=====================================================================
1300 Return the PCI device associated with a card..
1302 ======================================================================*/
1304 #ifdef CONFIG_CARDBUS
1306 struct pci_bus *pcmcia_lookup_bus(client_handle_t handle)
1308 struct pcmcia_socket *s;
1310 if (CHECK_HANDLE(handle))
1313 if (!(s->state & SOCKET_CARDBUS))
1316 return s->cb_dev->subordinate;
1319 EXPORT_SYMBOL(pcmcia_lookup_bus);
1323 /*======================================================================
1325 Get the current socket state bits. We don't support the latched
1326 SocketState yet: I haven't seen any point for it.
1328 ======================================================================*/
1330 int pcmcia_get_status(client_handle_t handle, cs_status_t *status)
1332 struct pcmcia_socket *s;
1336 if (CHECK_HANDLE(handle))
1337 return CS_BAD_HANDLE;
1339 s->ops->get_status(s, &val);
1340 status->CardState = status->SocketState = 0;
1341 status->CardState |= (val & SS_DETECT) ? CS_EVENT_CARD_DETECT : 0;
1342 status->CardState |= (val & SS_CARDBUS) ? CS_EVENT_CB_DETECT : 0;
1343 status->CardState |= (val & SS_3VCARD) ? CS_EVENT_3VCARD : 0;
1344 status->CardState |= (val & SS_XVCARD) ? CS_EVENT_XVCARD : 0;
1345 if (s->state & SOCKET_SUSPEND)
1346 status->CardState |= CS_EVENT_PM_SUSPEND;
1347 if (!(s->state & SOCKET_PRESENT))
1349 if (s->state & SOCKET_SETUP_PENDING)
1350 status->CardState |= CS_EVENT_CARD_INSERTION;
1352 /* Get info from the PRR, if necessary */
1353 if (handle->Function == BIND_FN_ALL) {
1354 if (status->Function && (status->Function >= s->functions))
1356 c = (s->config != NULL) ? &s->config[status->Function] : NULL;
1359 if ((c != NULL) && (c->state & CONFIG_LOCKED) &&
1360 (c->IntType & INT_MEMORY_AND_IO)) {
1362 if (c->Present & PRESENT_PIN_REPLACE) {
1363 read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, ®);
1364 status->CardState |=
1365 (reg & PRR_WP_STATUS) ? CS_EVENT_WRITE_PROTECT : 0;
1366 status->CardState |=
1367 (reg & PRR_READY_STATUS) ? CS_EVENT_READY_CHANGE : 0;
1368 status->CardState |=
1369 (reg & PRR_BVD2_STATUS) ? CS_EVENT_BATTERY_LOW : 0;
1370 status->CardState |=
1371 (reg & PRR_BVD1_STATUS) ? CS_EVENT_BATTERY_DEAD : 0;
1373 /* No PRR? Then assume we're always ready */
1374 status->CardState |= CS_EVENT_READY_CHANGE;
1376 if (c->Present & PRESENT_EXT_STATUS) {
1377 read_cis_mem(s, 1, (c->ConfigBase+CISREG_ESR)>>1, 1, ®);
1378 status->CardState |=
1379 (reg & ESR_REQ_ATTN) ? CS_EVENT_REQUEST_ATTENTION : 0;
1383 status->CardState |=
1384 (val & SS_WRPROT) ? CS_EVENT_WRITE_PROTECT : 0;
1385 status->CardState |=
1386 (val & SS_BATDEAD) ? CS_EVENT_BATTERY_DEAD : 0;
1387 status->CardState |=
1388 (val & SS_BATWARN) ? CS_EVENT_BATTERY_LOW : 0;
1389 status->CardState |=
1390 (val & SS_READY) ? CS_EVENT_READY_CHANGE : 0;
1394 /*======================================================================
1396 Change the card address of an already open memory window.
1398 ======================================================================*/
1400 int pcmcia_get_mem_page(window_handle_t win, memreq_t *req)
1402 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1403 return CS_BAD_HANDLE;
1405 req->CardOffset = win->ctl.card_start;
1407 } /* get_mem_page */
1409 int pcmcia_map_mem_page(window_handle_t win, memreq_t *req)
1411 struct pcmcia_socket *s;
1412 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1413 return CS_BAD_HANDLE;
1417 win->ctl.card_start = req->CardOffset;
1418 if (s->ops->set_mem_map(s, &win->ctl) != 0)
1419 return CS_BAD_OFFSET;
1421 } /* map_mem_page */
1423 /*======================================================================
1425 Modify a locked socket configuration
1427 ======================================================================*/
1429 int pcmcia_modify_configuration(client_handle_t handle,
1432 struct pcmcia_socket *s;
1435 if (CHECK_HANDLE(handle))
1436 return CS_BAD_HANDLE;
1437 s = SOCKET(handle); c = CONFIG(handle);
1438 if (!(s->state & SOCKET_PRESENT))
1440 if (!(c->state & CONFIG_LOCKED))
1441 return CS_CONFIGURATION_LOCKED;
1443 if (mod->Attributes & CONF_IRQ_CHANGE_VALID) {
1444 if (mod->Attributes & CONF_ENABLE_IRQ) {
1445 c->Attributes |= CONF_ENABLE_IRQ;
1446 s->socket.io_irq = s->irq.AssignedIRQ;
1448 c->Attributes &= ~CONF_ENABLE_IRQ;
1449 s->socket.io_irq = 0;
1451 s->ops->set_socket(s, &s->socket);
1454 if (mod->Attributes & CONF_VCC_CHANGE_VALID)
1457 /* We only allow changing Vpp1 and Vpp2 to the same value */
1458 if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) &&
1459 (mod->Attributes & CONF_VPP2_CHANGE_VALID)) {
1460 if (mod->Vpp1 != mod->Vpp2)
1462 c->Vpp1 = c->Vpp2 = s->socket.Vpp = mod->Vpp1;
1463 if (s->ops->set_socket(s, &s->socket))
1465 } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) ||
1466 (mod->Attributes & CONF_VPP2_CHANGE_VALID))
1470 } /* modify_configuration */
1472 /*======================================================================
1474 Modify the attributes of a window returned by RequestWindow.
1476 ======================================================================*/
1478 int pcmcia_modify_window(window_handle_t win, modwin_t *req)
1480 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1481 return CS_BAD_HANDLE;
1483 win->ctl.flags &= ~(MAP_ATTRIB|MAP_ACTIVE);
1484 if (req->Attributes & WIN_MEMORY_TYPE)
1485 win->ctl.flags |= MAP_ATTRIB;
1486 if (req->Attributes & WIN_ENABLE)
1487 win->ctl.flags |= MAP_ACTIVE;
1488 if (req->Attributes & WIN_DATA_WIDTH_16)
1489 win->ctl.flags |= MAP_16BIT;
1490 if (req->Attributes & WIN_USE_WAIT)
1491 win->ctl.flags |= MAP_USE_WAIT;
1492 win->ctl.speed = req->AccessSpeed;
1493 win->sock->ops->set_mem_map(win->sock, &win->ctl);
1496 } /* modify_window */
1498 /*======================================================================
1500 Register_client() uses the dev_info_t handle to match the
1501 caller with a socket. The driver must have already been bound
1502 to a socket with bind_device() -- in fact, bind_device()
1503 allocates the client structure that will be used.
1505 ======================================================================*/
1507 int pcmcia_register_client(client_handle_t *handle, client_reg_t *req)
1509 client_t *client = NULL;
1510 struct pcmcia_socket *s;
1512 /* Look for unbound client with matching dev_info */
1513 down_read(&pcmcia_socket_list_rwsem);
1514 list_for_each_entry(s, &pcmcia_socket_list, socket_list) {
1515 client = s->clients;
1516 while (client != NULL) {
1517 if ((strcmp(client->dev_info, (char *)req->dev_info) == 0)
1518 && (client->state & CLIENT_UNBOUND)) break;
1519 client = client->next;
1521 if (client != NULL) break;
1523 up_read(&pcmcia_socket_list_rwsem);
1525 return CS_OUT_OF_RESOURCE;
1528 client->state &= ~CLIENT_UNBOUND;
1530 client->Attributes = req->Attributes;
1531 client->EventMask = req->EventMask;
1532 client->event_handler = req->event_handler;
1533 client->event_callback_args = req->event_callback_args;
1534 client->event_callback_args.client_handle = client;
1536 if (s->state & SOCKET_CARDBUS)
1537 client->state |= CLIENT_CARDBUS;
1539 if ((!(s->state & SOCKET_CARDBUS)) && (s->functions == 0) &&
1540 (client->Function != BIND_FN_ALL)) {
1541 cistpl_longlink_mfc_t mfc;
1542 if (read_tuple(client, CISTPL_LONGLINK_MFC, &mfc)
1544 s->functions = mfc.nfn;
1547 s->config = kmalloc(sizeof(config_t) * s->functions,
1550 return CS_OUT_OF_RESOURCE;
1551 memset(s->config, 0, sizeof(config_t) * s->functions);
1554 DEBUG(1, "cs: register_client(): client 0x%p, sock %d, dev %s\n",
1555 client, client->Socket, client->dev_info);
1556 if (client->EventMask & CS_EVENT_REGISTRATION_COMPLETE)
1557 EVENT(client, CS_EVENT_REGISTRATION_COMPLETE, CS_EVENT_PRI_LOW);
1558 if ((s->state & SOCKET_PRESENT) &&
1559 !(s->state & SOCKET_SETUP_PENDING)) {
1560 if (client->EventMask & CS_EVENT_CARD_INSERTION)
1561 EVENT(client, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
1563 client->PendingEvents |= CS_EVENT_CARD_INSERTION;
1566 } /* register_client */
1568 /*====================================================================*/
1570 int pcmcia_release_configuration(client_handle_t handle)
1572 pccard_io_map io = { 0, 0, 0, 0, 1 };
1573 struct pcmcia_socket *s;
1576 if (CHECK_HANDLE(handle) ||
1577 !(handle->state & CLIENT_CONFIG_LOCKED))
1578 return CS_BAD_HANDLE;
1579 handle->state &= ~CLIENT_CONFIG_LOCKED;
1582 #ifdef CONFIG_CARDBUS
1583 if (handle->state & CLIENT_CARDBUS)
1587 if (!(handle->state & CLIENT_STALE)) {
1588 config_t *c = CONFIG(handle);
1589 if (--(s->lock_count) == 0) {
1590 s->socket.flags = SS_OUTPUT_ENA; /* Is this correct? */
1592 s->socket.io_irq = 0;
1593 s->ops->set_socket(s, &s->socket);
1595 if (c->state & CONFIG_IO_REQ)
1596 for (i = 0; i < MAX_IO_WIN; i++) {
1597 if (s->io[i].NumPorts == 0)
1600 if (s->io[i].Config != 0)
1603 s->ops->set_io_map(s, &io);
1605 c->state &= ~CONFIG_LOCKED;
1609 } /* release_configuration */
1611 /*======================================================================
1613 Release_io() releases the I/O ranges allocated by a client. This
1614 may be invoked some time after a card ejection has already dumped
1615 the actual socket configuration, so if the client is "stale", we
1616 don't bother checking the port ranges against the current socket
1619 ======================================================================*/
1621 int pcmcia_release_io(client_handle_t handle, io_req_t *req)
1623 struct pcmcia_socket *s;
1625 if (CHECK_HANDLE(handle) || !(handle->state & CLIENT_IO_REQ))
1626 return CS_BAD_HANDLE;
1627 handle->state &= ~CLIENT_IO_REQ;
1630 #ifdef CONFIG_CARDBUS
1631 if (handle->state & CLIENT_CARDBUS)
1635 if (!(handle->state & CLIENT_STALE)) {
1636 config_t *c = CONFIG(handle);
1637 if (c->state & CONFIG_LOCKED)
1638 return CS_CONFIGURATION_LOCKED;
1639 if ((c->io.BasePort1 != req->BasePort1) ||
1640 (c->io.NumPorts1 != req->NumPorts1) ||
1641 (c->io.BasePort2 != req->BasePort2) ||
1642 (c->io.NumPorts2 != req->NumPorts2))
1644 c->state &= ~CONFIG_IO_REQ;
1647 release_io_space(s, req->BasePort1, req->NumPorts1);
1649 release_io_space(s, req->BasePort2, req->NumPorts2);
1654 /*====================================================================*/
1656 int pcmcia_release_irq(client_handle_t handle, irq_req_t *req)
1658 struct pcmcia_socket *s;
1659 if (CHECK_HANDLE(handle) || !(handle->state & CLIENT_IRQ_REQ))
1660 return CS_BAD_HANDLE;
1661 handle->state &= ~CLIENT_IRQ_REQ;
1664 if (!(handle->state & CLIENT_STALE)) {
1665 config_t *c = CONFIG(handle);
1666 if (c->state & CONFIG_LOCKED)
1667 return CS_CONFIGURATION_LOCKED;
1668 if (c->irq.Attributes != req->Attributes)
1669 return CS_BAD_ATTRIBUTE;
1670 if (s->irq.AssignedIRQ != req->AssignedIRQ)
1672 if (--s->irq.Config == 0) {
1673 c->state &= ~CONFIG_IRQ_REQ;
1674 s->irq.AssignedIRQ = 0;
1678 if (req->Attributes & IRQ_HANDLE_PRESENT) {
1679 free_irq(req->AssignedIRQ, req->Instance);
1682 #ifdef CONFIG_PCMCIA_PROBE
1683 if (req->AssignedIRQ != s->pci_irq)
1684 undo_irq(req->Attributes, req->AssignedIRQ);
1688 } /* cs_release_irq */
1690 /*====================================================================*/
1692 int pcmcia_release_window(window_handle_t win)
1694 struct pcmcia_socket *s;
1696 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1697 return CS_BAD_HANDLE;
1699 if (!(win->handle->state & CLIENT_WIN_REQ(win->index)))
1700 return CS_BAD_HANDLE;
1702 /* Shut down memory window */
1703 win->ctl.flags &= ~MAP_ACTIVE;
1704 s->ops->set_mem_map(s, &win->ctl);
1705 s->state &= ~SOCKET_WIN_REQ(win->index);
1707 /* Release system memory */
1708 if(!(s->features & SS_CAP_STATIC_MAP))
1709 release_mem_region(win->base, win->size);
1710 win->handle->state &= ~CLIENT_WIN_REQ(win->index);
1715 } /* release_window */
1717 /*====================================================================*/
1719 int pcmcia_request_configuration(client_handle_t handle,
1724 struct pcmcia_socket *s;
1726 pccard_io_map iomap;
1728 if (CHECK_HANDLE(handle))
1729 return CS_BAD_HANDLE;
1731 if (!(s->state & SOCKET_PRESENT))
1734 #ifdef CONFIG_CARDBUS
1735 if (handle->state & CLIENT_CARDBUS)
1736 return CS_UNSUPPORTED_MODE;
1739 if (req->IntType & INT_CARDBUS)
1740 return CS_UNSUPPORTED_MODE;
1742 if (c->state & CONFIG_LOCKED)
1743 return CS_CONFIGURATION_LOCKED;
1745 /* Do power control. We don't allow changes in Vcc. */
1746 if (s->socket.Vcc != req->Vcc)
1748 if (req->Vpp1 != req->Vpp2)
1750 s->socket.Vpp = req->Vpp1;
1751 if (s->ops->set_socket(s, &s->socket))
1754 c->Vcc = req->Vcc; c->Vpp1 = c->Vpp2 = req->Vpp1;
1756 /* Pick memory or I/O card, DMA mode, interrupt */
1757 c->IntType = req->IntType;
1758 c->Attributes = req->Attributes;
1759 if (req->IntType & INT_MEMORY_AND_IO)
1760 s->socket.flags |= SS_IOCARD;
1761 if (req->Attributes & CONF_ENABLE_DMA)
1762 s->socket.flags |= SS_DMA_MODE;
1763 if (req->Attributes & CONF_ENABLE_SPKR)
1764 s->socket.flags |= SS_SPKR_ENA;
1765 if (req->Attributes & CONF_ENABLE_IRQ)
1766 s->socket.io_irq = s->irq.AssignedIRQ;
1768 s->socket.io_irq = 0;
1769 s->ops->set_socket(s, &s->socket);
1772 /* Set up CIS configuration registers */
1773 base = c->ConfigBase = req->ConfigBase;
1774 c->Present = c->CardValues = req->Present;
1775 if (req->Present & PRESENT_COPY) {
1776 c->Copy = req->Copy;
1777 write_cis_mem(s, 1, (base + CISREG_SCR)>>1, 1, &c->Copy);
1779 if (req->Present & PRESENT_OPTION) {
1780 if (s->functions == 1) {
1781 c->Option = req->ConfigIndex & COR_CONFIG_MASK;
1783 c->Option = req->ConfigIndex & COR_MFC_CONFIG_MASK;
1784 c->Option |= COR_FUNC_ENA|COR_IREQ_ENA;
1785 if (req->Present & PRESENT_IOBASE_0)
1786 c->Option |= COR_ADDR_DECODE;
1788 if (c->state & CONFIG_IRQ_REQ)
1789 if (!(c->irq.Attributes & IRQ_FORCED_PULSE))
1790 c->Option |= COR_LEVEL_REQ;
1791 write_cis_mem(s, 1, (base + CISREG_COR)>>1, 1, &c->Option);
1794 if (req->Present & PRESENT_STATUS) {
1795 c->Status = req->Status;
1796 write_cis_mem(s, 1, (base + CISREG_CCSR)>>1, 1, &c->Status);
1798 if (req->Present & PRESENT_PIN_REPLACE) {
1800 write_cis_mem(s, 1, (base + CISREG_PRR)>>1, 1, &c->Pin);
1802 if (req->Present & PRESENT_EXT_STATUS) {
1803 c->ExtStatus = req->ExtStatus;
1804 write_cis_mem(s, 1, (base + CISREG_ESR)>>1, 1, &c->ExtStatus);
1806 if (req->Present & PRESENT_IOBASE_0) {
1807 u_char b = c->io.BasePort1 & 0xff;
1808 write_cis_mem(s, 1, (base + CISREG_IOBASE_0)>>1, 1, &b);
1809 b = (c->io.BasePort1 >> 8) & 0xff;
1810 write_cis_mem(s, 1, (base + CISREG_IOBASE_1)>>1, 1, &b);
1812 if (req->Present & PRESENT_IOSIZE) {
1813 u_char b = c->io.NumPorts1 + c->io.NumPorts2 - 1;
1814 write_cis_mem(s, 1, (base + CISREG_IOSIZE)>>1, 1, &b);
1817 /* Configure I/O windows */
1818 if (c->state & CONFIG_IO_REQ) {
1819 iomap.speed = io_speed;
1820 for (i = 0; i < MAX_IO_WIN; i++)
1821 if (s->io[i].NumPorts != 0) {
1823 iomap.flags = MAP_ACTIVE;
1824 switch (s->io[i].Attributes & IO_DATA_PATH_WIDTH) {
1825 case IO_DATA_PATH_WIDTH_16:
1826 iomap.flags |= MAP_16BIT; break;
1827 case IO_DATA_PATH_WIDTH_AUTO:
1828 iomap.flags |= MAP_AUTOSZ; break;
1832 iomap.start = s->io[i].BasePort;
1833 iomap.stop = iomap.start + s->io[i].NumPorts - 1;
1834 s->ops->set_io_map(s, &iomap);
1839 c->state |= CONFIG_LOCKED;
1840 handle->state |= CLIENT_CONFIG_LOCKED;
1842 } /* request_configuration */
1844 /*======================================================================
1846 Request_io() reserves ranges of port addresses for a socket.
1847 I have not implemented range sharing or alias addressing.
1849 ======================================================================*/
1851 int pcmcia_request_io(client_handle_t handle, io_req_t *req)
1853 struct pcmcia_socket *s;
1856 if (CHECK_HANDLE(handle))
1857 return CS_BAD_HANDLE;
1859 if (!(s->state & SOCKET_PRESENT))
1862 if (handle->state & CLIENT_CARDBUS) {
1863 #ifdef CONFIG_CARDBUS
1864 handle->state |= CLIENT_IO_REQ;
1867 return CS_UNSUPPORTED_FUNCTION;
1872 return CS_UNSUPPORTED_MODE;
1874 if (c->state & CONFIG_LOCKED)
1875 return CS_CONFIGURATION_LOCKED;
1876 if (c->state & CONFIG_IO_REQ)
1878 if (req->Attributes1 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS))
1879 return CS_BAD_ATTRIBUTE;
1880 if ((req->NumPorts2 > 0) &&
1881 (req->Attributes2 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS)))
1882 return CS_BAD_ATTRIBUTE;
1884 if (alloc_io_space(s, req->Attributes1, &req->BasePort1,
1885 req->NumPorts1, req->IOAddrLines,
1889 if (req->NumPorts2) {
1890 if (alloc_io_space(s, req->Attributes2, &req->BasePort2,
1891 req->NumPorts2, req->IOAddrLines,
1892 handle->dev_info)) {
1893 release_io_space(s, req->BasePort1, req->NumPorts1);
1899 c->state |= CONFIG_IO_REQ;
1900 handle->state |= CLIENT_IO_REQ;
1904 /*======================================================================
1906 Request_irq() reserves an irq for this client.
1908 Also, since Linux only reserves irq's when they are actually
1909 hooked, we don't guarantee that an irq will still be available
1910 when the configuration is locked. Now that I think about it,
1911 there might be a way to fix this using a dummy handler.
1913 ======================================================================*/
1915 int pcmcia_request_irq(client_handle_t handle, irq_req_t *req)
1917 struct pcmcia_socket *s;
1919 int ret = 0, irq = 0;
1921 if (CHECK_HANDLE(handle))
1922 return CS_BAD_HANDLE;
1924 if (!(s->state & SOCKET_PRESENT))
1927 if (c->state & CONFIG_LOCKED)
1928 return CS_CONFIGURATION_LOCKED;
1929 if (c->state & CONFIG_IRQ_REQ)
1932 /* Short cut: if there are no ISA interrupts, then it is PCI */
1935 ret = (irq) ? 0 : CS_IN_USE;
1936 #ifdef CONFIG_PCMCIA_PROBE
1937 } else if (s->irq.AssignedIRQ != 0) {
1938 /* If the interrupt is already assigned, it must match */
1939 irq = s->irq.AssignedIRQ;
1940 if (req->IRQInfo1 & IRQ_INFO2_VALID) {
1941 u_int mask = req->IRQInfo2 & s->irq_mask;
1942 ret = ((mask >> irq) & 1) ? 0 : CS_BAD_ARGS;
1944 ret = ((req->IRQInfo1&IRQ_MASK) == irq) ? 0 : CS_BAD_ARGS;
1947 if (req->IRQInfo1 & IRQ_INFO2_VALID) {
1948 u_int try, mask = req->IRQInfo2 & s->irq_mask;
1949 for (try = 0; try < 2; try++) {
1950 for (irq = 0; irq < 32; irq++)
1951 if ((mask >> irq) & 1) {
1952 ret = try_irq(req->Attributes, irq, try);
1953 if (ret == 0) break;
1955 if (ret == 0) break;
1958 irq = req->IRQInfo1 & IRQ_MASK;
1959 ret = try_irq(req->Attributes, irq, 1);
1963 ret = CS_UNSUPPORTED_MODE;
1966 if (ret != 0) return ret;
1968 if (req->Attributes & IRQ_HANDLE_PRESENT) {
1969 if (request_irq(irq, req->Handler,
1970 ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) ||
1971 (s->functions > 1) ||
1972 (irq == s->pci_irq)) ? SA_SHIRQ : 0,
1973 handle->dev_info, req->Instance))
1977 c->irq.Attributes = req->Attributes;
1978 s->irq.AssignedIRQ = req->AssignedIRQ = irq;
1981 c->state |= CONFIG_IRQ_REQ;
1982 handle->state |= CLIENT_IRQ_REQ;
1984 } /* pcmcia_request_irq */
1986 /*======================================================================
1988 Request_window() establishes a mapping between card memory space
1989 and system memory space.
1991 ======================================================================*/
1993 int pcmcia_request_window(client_handle_t *handle, win_req_t *req, window_handle_t *wh)
1995 struct pcmcia_socket *s;
2000 if (CHECK_HANDLE(*handle))
2001 return CS_BAD_HANDLE;
2002 s = (*handle)->Socket;
2003 if (!(s->state & SOCKET_PRESENT))
2005 if (req->Attributes & (WIN_PAGED | WIN_SHARED))
2006 return CS_BAD_ATTRIBUTE;
2008 /* Window size defaults to smallest available */
2010 req->Size = s->map_size;
2011 align = (((s->features & SS_CAP_MEM_ALIGN) ||
2012 (req->Attributes & WIN_STRICT_ALIGN)) ?
2013 req->Size : s->map_size);
2014 if (req->Size & (s->map_size-1))
2016 if ((req->Base && (s->features & SS_CAP_STATIC_MAP)) ||
2017 (req->Base & (align-1)))
2022 /* Allocate system memory window */
2023 for (w = 0; w < MAX_WIN; w++)
2024 if (!(s->state & SOCKET_WIN_REQ(w))) break;
2026 return CS_OUT_OF_RESOURCE;
2029 win->magic = WINDOW_MAGIC;
2031 win->handle = *handle;
2033 win->base = req->Base;
2034 win->size = req->Size;
2036 if (!(s->features & SS_CAP_STATIC_MAP) &&
2037 find_mem_region(&win->base, win->size, align,
2038 (req->Attributes & WIN_MAP_BELOW_1MB),
2039 (*handle)->dev_info, s))
2041 (*handle)->state |= CLIENT_WIN_REQ(w);
2043 /* Configure the socket controller */
2046 win->ctl.speed = req->AccessSpeed;
2047 if (req->Attributes & WIN_MEMORY_TYPE)
2048 win->ctl.flags |= MAP_ATTRIB;
2049 if (req->Attributes & WIN_ENABLE)
2050 win->ctl.flags |= MAP_ACTIVE;
2051 if (req->Attributes & WIN_DATA_WIDTH_16)
2052 win->ctl.flags |= MAP_16BIT;
2053 if (req->Attributes & WIN_USE_WAIT)
2054 win->ctl.flags |= MAP_USE_WAIT;
2055 win->ctl.sys_start = win->base;
2056 win->ctl.sys_stop = win->base + win->size-1;
2057 win->ctl.card_start = 0;
2058 if (s->ops->set_mem_map(s, &win->ctl) != 0)
2060 s->state |= SOCKET_WIN_REQ(w);
2062 /* Return window handle */
2063 req->Base = win->ctl.sys_start;
2067 } /* request_window */
2069 /*======================================================================
2071 I'm not sure which "reset" function this is supposed to use,
2072 but for now, it uses the low-level interface's reset, not the
2075 ======================================================================*/
2077 int pcmcia_reset_card(client_handle_t handle, client_req_t *req)
2079 struct pcmcia_socket *skt;
2082 if (CHECK_HANDLE(handle))
2083 return CS_BAD_HANDLE;
2084 DEBUG(1, "cs: resetting socket %d\n", handle->Socket);
2085 skt = SOCKET(handle);
2087 down(&skt->skt_sem);
2089 if (!(skt->state & SOCKET_PRESENT)) {
2093 if (skt->state & SOCKET_SUSPEND) {
2097 if (skt->state & SOCKET_CARDBUS) {
2098 ret = CS_UNSUPPORTED_FUNCTION;
2102 ret = send_event(skt, CS_EVENT_RESET_REQUEST, CS_EVENT_PRI_LOW);
2104 send_event(skt, CS_EVENT_RESET_PHYSICAL, CS_EVENT_PRI_LOW);
2105 if (socket_reset(skt) == CS_SUCCESS)
2106 send_event(skt, CS_EVENT_CARD_RESET, CS_EVENT_PRI_LOW);
2109 handle->event_callback_args.info = (void *)(u_long)ret;
2110 EVENT(handle, CS_EVENT_RESET_COMPLETE, CS_EVENT_PRI_LOW);
2119 /*======================================================================
2121 These shut down or wake up a socket. They are sort of user
2122 initiated versions of the APM suspend and resume actions.
2124 ======================================================================*/
2126 int pcmcia_suspend_card(client_handle_t handle, client_req_t *req)
2128 struct pcmcia_socket *skt;
2131 if (CHECK_HANDLE(handle))
2132 return CS_BAD_HANDLE;
2133 DEBUG(1, "cs: suspending socket %d\n", handle->Socket);
2134 skt = SOCKET(handle);
2136 down(&skt->skt_sem);
2138 if (!(skt->state & SOCKET_PRESENT)) {
2142 if (skt->state & SOCKET_CARDBUS) {
2143 ret = CS_UNSUPPORTED_FUNCTION;
2146 ret = socket_suspend(skt);
2151 } /* suspend_card */
2153 int pcmcia_resume_card(client_handle_t handle, client_req_t *req)
2155 struct pcmcia_socket *skt;
2158 if (CHECK_HANDLE(handle))
2159 return CS_BAD_HANDLE;
2160 DEBUG(1, "cs: waking up socket %d\n", handle->Socket);
2161 skt = SOCKET(handle);
2163 down(&skt->skt_sem);
2165 if (!(skt->state & SOCKET_PRESENT)) {
2169 if (skt->state & SOCKET_CARDBUS) {
2170 ret = CS_UNSUPPORTED_FUNCTION;
2173 ret = socket_resume(skt);
2180 /*======================================================================
2182 These handle user requests to eject or insert a card.
2184 ======================================================================*/
2186 int pcmcia_eject_card(client_handle_t handle, client_req_t *req)
2188 struct pcmcia_socket *skt;
2191 if (CHECK_HANDLE(handle))
2192 return CS_BAD_HANDLE;
2193 DEBUG(1, "cs: user eject request on socket %d\n", handle->Socket);
2194 skt = SOCKET(handle);
2196 down(&skt->skt_sem);
2198 if (!(skt->state & SOCKET_PRESENT)) {
2203 ret = send_event(skt, CS_EVENT_EJECTION_REQUEST, CS_EVENT_PRI_LOW);
2215 int pcmcia_insert_card(client_handle_t handle, client_req_t *req)
2217 struct pcmcia_socket *skt;
2220 if (CHECK_HANDLE(handle))
2221 return CS_BAD_HANDLE;
2222 DEBUG(1, "cs: user insert request on socket %d\n", handle->Socket);
2223 skt = SOCKET(handle);
2225 down(&skt->skt_sem);
2227 if (skt->state & SOCKET_PRESENT) {
2231 if (socket_insert(skt) == CS_NO_CARD) {
2242 /*======================================================================
2244 Maybe this should send a CS_EVENT_CARD_INSERTION event if we
2245 haven't sent one to this client yet?
2247 ======================================================================*/
2249 int pcmcia_set_event_mask(client_handle_t handle, eventmask_t *mask)
2252 if (CHECK_HANDLE(handle))
2253 return CS_BAD_HANDLE;
2254 if (handle->Attributes & CONF_EVENT_MASK_VALID)
2255 return CS_BAD_SOCKET;
2256 handle->EventMask = mask->EventMask;
2257 events = handle->PendingEvents & handle->EventMask;
2258 handle->PendingEvents -= events;
2259 while (events != 0) {
2260 bit = ((events ^ (events-1)) + 1) >> 1;
2261 EVENT(handle, bit, CS_EVENT_PRI_LOW);
2265 } /* set_event_mask */
2267 /*====================================================================*/
2269 int pcmcia_report_error(client_handle_t handle, error_info_t *err)
2274 if (CHECK_HANDLE(handle))
2275 printk(KERN_NOTICE);
2277 printk(KERN_NOTICE "%s: ", handle->dev_info);
2279 for (i = 0; i < SERVICE_COUNT; i++)
2280 if (service_table[i].key == err->func) break;
2281 if (i < SERVICE_COUNT)
2282 serv = service_table[i].msg;
2284 serv = "Unknown service number";
2286 for (i = 0; i < ERROR_COUNT; i++)
2287 if (error_table[i].key == err->retcode) break;
2288 if (i < ERROR_COUNT)
2289 printk("%s: %s\n", serv, error_table[i].msg);
2291 printk("%s: Unknown error code %#x\n", serv, err->retcode);
2294 } /* report_error */
2296 /*====================================================================*/
2298 int CardServices(int func, void *a1, void *a2, void *a3)
2304 for (i = 0; i < SERVICE_COUNT; i++)
2305 if (service_table[i].key == func) break;
2306 if (i < SERVICE_COUNT)
2307 printk(KERN_DEBUG "cs: CardServices(%s, 0x%p, 0x%p)\n",
2308 service_table[i].msg, a1, a2);
2310 printk(KERN_DEBUG "cs: CardServices(Unknown func %d, "
2311 "0x%p, 0x%p)\n", func, a1, a2);
2315 case AccessConfigurationRegister:
2316 return pcmcia_access_configuration_register(a1, a2); break;
2317 case AdjustResourceInfo:
2318 return pcmcia_adjust_resource_info(a1, a2); break;
2319 case CheckEraseQueue:
2320 return pcmcia_check_erase_queue(a1); break;
2322 return pcmcia_close_memory(a1); break;
2324 return pcmcia_copy_memory(a1, a2); break;
2325 case DeregisterClient:
2326 return pcmcia_deregister_client(a1); break;
2327 case DeregisterEraseQueue:
2328 return pcmcia_deregister_erase_queue(a1); break;
2329 case GetFirstClient:
2330 return pcmcia_get_first_client(a1, a2); break;
2331 case GetCardServicesInfo:
2332 return pcmcia_get_card_services_info(a1); break;
2333 case GetConfigurationInfo:
2334 return pcmcia_get_configuration_info(a1, a2); break;
2336 return pcmcia_get_next_client(a1, a2); break;
2337 case GetFirstRegion:
2338 return pcmcia_get_first_region(a1, a2); break;
2340 return pcmcia_get_first_tuple(a1, a2); break;
2342 return pcmcia_get_next_region(a1, a2); break;
2344 return pcmcia_get_next_tuple(a1, a2); break;
2346 return pcmcia_get_status(a1, a2); break;
2348 return pcmcia_get_tuple_data(a1, a2); break;
2350 return pcmcia_map_mem_page(a1, a2); break;
2351 case ModifyConfiguration:
2352 return pcmcia_modify_configuration(a1, a2); break;
2354 return pcmcia_modify_window(a1, a2); break;
2356 /* return pcmcia_open_memory(a1, a2); */
2359 int ret = pcmcia_open_memory(a1, a2, &m);
2360 *(memory_handle_t *)a1 = m;
2365 return pcmcia_parse_tuple(a1, a2, a3); break;
2367 return pcmcia_read_memory(a1, a2, a3); break;
2368 case RegisterClient:
2369 return pcmcia_register_client(a1, a2); break;
2370 case RegisterEraseQueue:
2373 int ret = pcmcia_register_erase_queue(a1, a2, &w);
2374 *(eraseq_handle_t *)a1 = w;
2378 /* return pcmcia_register_erase_queue(a1, a2); break; */
2380 return pcmcia_register_mtd(a1, a2); break;
2381 case ReleaseConfiguration:
2382 return pcmcia_release_configuration(a1); break;
2384 return pcmcia_release_io(a1, a2); break;
2386 return pcmcia_release_irq(a1, a2); break;
2388 return pcmcia_release_window(a1); break;
2389 case RequestConfiguration:
2390 return pcmcia_request_configuration(a1, a2); break;
2392 return pcmcia_request_io(a1, a2); break;
2394 return pcmcia_request_irq(a1, a2); break;
2398 int ret = pcmcia_request_window(a1, a2, &w);
2399 *(window_handle_t *)a1 = w;
2404 return pcmcia_reset_card(a1, a2); break;
2406 return pcmcia_set_event_mask(a1, a2); break;
2408 return pcmcia_validate_cis(a1, a2); break;
2410 return pcmcia_write_memory(a1, a2, a3); break;
2412 return pcmcia_bind_device(a1); break;
2414 return pcmcia_bind_mtd(a1); break;
2416 return pcmcia_report_error(a1, a2); break;
2418 return pcmcia_suspend_card(a1, a2); break;
2420 return pcmcia_resume_card(a1, a2); break;
2422 return pcmcia_eject_card(a1, a2); break;
2424 return pcmcia_insert_card(a1, a2); break;
2426 return pcmcia_replace_cis(a1, a2); break;
2427 case GetFirstWindow:
2428 return pcmcia_get_first_window(a1, a2); break;
2430 return pcmcia_get_next_window(a1, a2); break;
2432 return pcmcia_get_mem_page(a1, a2); break;
2434 return CS_UNSUPPORTED_FUNCTION; break;
2437 } /* CardServices */
2439 /*======================================================================
2441 OS-specific module glue goes here
2443 ======================================================================*/
2444 /* in alpha order */
2445 EXPORT_SYMBOL(pcmcia_access_configuration_register);
2446 EXPORT_SYMBOL(pcmcia_adjust_resource_info);
2447 EXPORT_SYMBOL(pcmcia_bind_device);
2448 EXPORT_SYMBOL(pcmcia_bind_mtd);
2449 EXPORT_SYMBOL(pcmcia_check_erase_queue);
2450 EXPORT_SYMBOL(pcmcia_close_memory);
2451 EXPORT_SYMBOL(pcmcia_copy_memory);
2452 EXPORT_SYMBOL(pcmcia_deregister_client);
2453 EXPORT_SYMBOL(pcmcia_deregister_erase_queue);
2454 EXPORT_SYMBOL(pcmcia_eject_card);
2455 EXPORT_SYMBOL(pcmcia_get_first_client);
2456 EXPORT_SYMBOL(pcmcia_get_card_services_info);
2457 EXPORT_SYMBOL(pcmcia_get_configuration_info);
2458 EXPORT_SYMBOL(pcmcia_get_mem_page);
2459 EXPORT_SYMBOL(pcmcia_get_next_client);
2460 EXPORT_SYMBOL(pcmcia_get_first_region);
2461 EXPORT_SYMBOL(pcmcia_get_first_tuple);
2462 EXPORT_SYMBOL(pcmcia_get_first_window);
2463 EXPORT_SYMBOL(pcmcia_get_next_region);
2464 EXPORT_SYMBOL(pcmcia_get_next_tuple);
2465 EXPORT_SYMBOL(pcmcia_get_next_window);
2466 EXPORT_SYMBOL(pcmcia_get_status);
2467 EXPORT_SYMBOL(pcmcia_get_tuple_data);
2468 EXPORT_SYMBOL(pcmcia_insert_card);
2469 EXPORT_SYMBOL(pcmcia_map_mem_page);
2470 EXPORT_SYMBOL(pcmcia_modify_configuration);
2471 EXPORT_SYMBOL(pcmcia_modify_window);
2472 EXPORT_SYMBOL(pcmcia_open_memory);
2473 EXPORT_SYMBOL(pcmcia_parse_tuple);
2474 EXPORT_SYMBOL(pcmcia_read_memory);
2475 EXPORT_SYMBOL(pcmcia_register_client);
2476 EXPORT_SYMBOL(pcmcia_register_erase_queue);
2477 EXPORT_SYMBOL(pcmcia_register_mtd);
2478 EXPORT_SYMBOL(pcmcia_release_configuration);
2479 EXPORT_SYMBOL(pcmcia_release_io);
2480 EXPORT_SYMBOL(pcmcia_release_irq);
2481 EXPORT_SYMBOL(pcmcia_release_window);
2482 EXPORT_SYMBOL(pcmcia_replace_cis);
2483 EXPORT_SYMBOL(pcmcia_report_error);
2484 EXPORT_SYMBOL(pcmcia_request_configuration);
2485 EXPORT_SYMBOL(pcmcia_request_io);
2486 EXPORT_SYMBOL(pcmcia_request_irq);
2487 EXPORT_SYMBOL(pcmcia_request_window);
2488 EXPORT_SYMBOL(pcmcia_reset_card);
2489 EXPORT_SYMBOL(pcmcia_resume_card);
2490 EXPORT_SYMBOL(pcmcia_set_event_mask);
2491 EXPORT_SYMBOL(pcmcia_suspend_card);
2492 EXPORT_SYMBOL(pcmcia_validate_cis);
2493 EXPORT_SYMBOL(pcmcia_write_memory);
2495 EXPORT_SYMBOL(dead_socket);
2496 EXPORT_SYMBOL(CardServices);
2497 EXPORT_SYMBOL(MTDHelperEntry);
2498 EXPORT_SYMBOL(pcmcia_parse_events);
2500 struct class pcmcia_socket_class = {
2501 .name = "pcmcia_socket",
2502 .release = pcmcia_release_socket,
2504 EXPORT_SYMBOL(pcmcia_socket_class);
2506 static struct class_interface pcmcia_socket = {
2507 .class = &pcmcia_socket_class,
2508 .add = &pcmcia_add_socket,
2509 .remove = &pcmcia_remove_socket,
2513 static int __init init_pcmcia_cs(void)
2515 printk(KERN_INFO "%s\n", release);
2516 printk(KERN_INFO " %s\n", options);
2517 DEBUG(0, "%s\n", version);
2518 class_register(&pcmcia_socket_class);
2519 class_interface_register(&pcmcia_socket);
2524 static void __exit exit_pcmcia_cs(void)
2526 printk(KERN_INFO "unloading Kernel Card Services\n");
2527 release_resource_db();
2528 class_interface_unregister(&pcmcia_socket);
2529 class_unregister(&pcmcia_socket_class);
2532 subsys_initcall(init_pcmcia_cs);
2533 module_exit(exit_pcmcia_cs);
2535 /*====================================================================*/