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/moduleparam.h>
36 #include <linux/init.h>
37 #include <linux/kernel.h>
38 #include <linux/config.h>
39 #include <linux/string.h>
40 #include <linux/major.h>
41 #include <linux/errno.h>
42 #include <linux/slab.h>
44 #include <linux/interrupt.h>
45 #include <linux/timer.h>
46 #include <linux/ioport.h>
47 #include <linux/delay.h>
49 #include <linux/pci.h>
50 #include <linux/device.h>
51 #include <linux/suspend.h>
52 #include <asm/system.h>
55 #define IN_CARD_SERVICES
56 #include <pcmcia/version.h>
57 #include <pcmcia/cs_types.h>
58 #include <pcmcia/ss.h>
59 #include <pcmcia/cs.h>
60 #include <pcmcia/bulkmem.h>
61 #include <pcmcia/cistpl.h>
62 #include <pcmcia/cisreg.h>
63 #include "cs_internal.h"
66 #define PCI_OPT " [pci]"
71 #define CB_OPT " [cardbus]"
76 #define PM_OPT " [pm]"
80 #if !defined(CONFIG_CARDBUS) && !defined(CONFIG_PCI) && !defined(CONFIG_PM)
81 #define OPTIONS " none"
83 #define OPTIONS PCI_OPT CB_OPT PM_OPT
86 static const char *release = "Linux Kernel Card Services";
87 static const char *options = "options: " OPTIONS;
89 /*====================================================================*/
91 /* Module parameters */
93 MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
94 MODULE_DESCRIPTION("Linux Kernel Card Services\noptions:" OPTIONS);
95 MODULE_LICENSE("Dual MPL/GPL");
97 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
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 */
117 module_param(pc_debug, int, 0644);
119 int cs_debug_level(int level)
121 return pc_debug > level;
125 /*====================================================================*/
127 socket_state_t dead_socket = {
128 .csc_mask = SS_DETECT,
132 /* List of all sockets, protected by a rwsem */
133 LIST_HEAD(pcmcia_socket_list);
134 DECLARE_RWSEM(pcmcia_socket_list_rwsem);
137 /*====================================================================
139 Low-level PC Card interface drivers need to register with Card
140 Services using these calls.
142 ======================================================================*/
145 * socket drivers are expected to use the following callbacks in their
147 * - pcmcia_socket_dev_suspend
148 * - pcmcia_socket_dev_resume
149 * These functions check for the appropriate struct pcmcia_soket arrays,
150 * and pass them to the low-level functions pcmcia_{suspend,resume}_socket
152 static int socket_resume(struct pcmcia_socket *skt);
153 static int socket_suspend(struct pcmcia_socket *skt);
155 int pcmcia_socket_dev_suspend(struct device *dev, u32 state)
157 struct pcmcia_socket *socket;
159 down_read(&pcmcia_socket_list_rwsem);
160 list_for_each_entry(socket, &pcmcia_socket_list, socket_list) {
161 if (socket->dev.dev != dev)
163 down(&socket->skt_sem);
164 socket_suspend(socket);
165 up(&socket->skt_sem);
167 up_read(&pcmcia_socket_list_rwsem);
171 EXPORT_SYMBOL(pcmcia_socket_dev_suspend);
173 int pcmcia_socket_dev_resume(struct device *dev)
175 struct pcmcia_socket *socket;
177 down_read(&pcmcia_socket_list_rwsem);
178 list_for_each_entry(socket, &pcmcia_socket_list, socket_list) {
179 if (socket->dev.dev != dev)
181 down(&socket->skt_sem);
182 socket_resume(socket);
183 up(&socket->skt_sem);
185 up_read(&pcmcia_socket_list_rwsem);
189 EXPORT_SYMBOL(pcmcia_socket_dev_resume);
192 static void pcmcia_release_socket(struct class_device *class_dev)
194 struct pcmcia_socket *socket = class_get_devdata(class_dev);
197 while (socket->clients) {
198 client = socket->clients;
199 socket->clients = socket->clients->next;
203 complete(&socket->socket_released);
206 static int pccardd(void *__skt);
209 * pcmcia_register_socket - add a new pcmcia socket device
211 int pcmcia_register_socket(struct pcmcia_socket *socket)
215 if (!socket || !socket->ops || !socket->dev.dev)
218 cs_dbg(socket, 0, "pcmcia_register_socket(0x%p)\n", socket->ops);
220 /* try to obtain a socket number [yes, it gets ugly if we
221 * register more than 2^sizeof(unsigned int) pcmcia
222 * sockets... but the socket number is deprecated
223 * anyways, so I don't care] */
224 down_write(&pcmcia_socket_list_rwsem);
225 if (list_empty(&pcmcia_socket_list))
228 unsigned int found, i = 1;
229 struct pcmcia_socket *tmp;
232 list_for_each_entry(tmp, &pcmcia_socket_list, socket_list) {
238 socket->sock = i - 1;
240 list_add_tail(&socket->socket_list, &pcmcia_socket_list);
241 up_write(&pcmcia_socket_list_rwsem);
244 /* set proper values in socket->dev */
245 socket->dev.class_data = socket;
246 socket->dev.class = &pcmcia_socket_class;
247 snprintf(socket->dev.class_id, BUS_ID_SIZE, "pcmcia_socket%u", socket->sock);
249 /* base address = 0, map = 0 */
250 socket->cis_mem.flags = 0;
251 socket->cis_mem.speed = cis_speed;
252 socket->erase_busy.next = socket->erase_busy.prev = &socket->erase_busy;
253 INIT_LIST_HEAD(&socket->cis_cache);
254 spin_lock_init(&socket->lock);
256 init_completion(&socket->socket_released);
257 init_completion(&socket->thread_done);
258 init_waitqueue_head(&socket->thread_wait);
259 init_MUTEX(&socket->skt_sem);
260 spin_lock_init(&socket->thread_lock);
262 ret = kernel_thread(pccardd, socket, CLONE_KERNEL);
266 wait_for_completion(&socket->thread_done);
267 BUG_ON(!socket->thread);
268 pcmcia_parse_events(socket, SS_DETECT);
273 down_write(&pcmcia_socket_list_rwsem);
274 list_del(&socket->socket_list);
275 up_write(&pcmcia_socket_list_rwsem);
277 } /* pcmcia_register_socket */
278 EXPORT_SYMBOL(pcmcia_register_socket);
282 * pcmcia_unregister_socket - remove a pcmcia socket device
284 void pcmcia_unregister_socket(struct pcmcia_socket *socket)
289 cs_dbg(socket, 0, "pcmcia_unregister_socket(0x%p)\n", socket->ops);
291 if (socket->thread) {
292 init_completion(&socket->thread_done);
293 socket->thread = NULL;
294 wake_up(&socket->thread_wait);
295 wait_for_completion(&socket->thread_done);
297 release_cis_mem(socket);
299 /* remove from our own list */
300 down_write(&pcmcia_socket_list_rwsem);
301 list_del(&socket->socket_list);
302 up_write(&pcmcia_socket_list_rwsem);
304 /* wait for sysfs to drop all references */
305 wait_for_completion(&socket->socket_released);
306 } /* pcmcia_unregister_socket */
307 EXPORT_SYMBOL(pcmcia_unregister_socket);
310 struct pcmcia_socket * pcmcia_get_socket_by_nr(unsigned int nr)
312 struct pcmcia_socket *s;
314 down_read(&pcmcia_socket_list_rwsem);
315 list_for_each_entry(s, &pcmcia_socket_list, socket_list)
317 up_read(&pcmcia_socket_list_rwsem);
320 up_read(&pcmcia_socket_list_rwsem);
325 EXPORT_SYMBOL(pcmcia_get_socket_by_nr);
328 /*======================================================================
330 Shutdown_Socket() and setup_socket() are scheduled using add_timer
331 calls by the main event handler when card insertion and removal
332 events are received. Shutdown_Socket() unconfigures a socket and
333 turns off socket power. Setup_socket() turns on socket power
334 and resets the socket, in two stages.
336 ======================================================================*/
338 static void free_regions(memory_handle_t *list)
341 while (*list != NULL) {
343 *list = tmp->info.next;
344 tmp->region_magic = 0;
349 static int send_event(struct pcmcia_socket *s, event_t event, int priority);
351 static void shutdown_socket(struct pcmcia_socket *s)
355 cs_dbg(s, 1, "shutdown_socket\n");
357 /* Blank out the socket state */
358 s->socket = dead_socket;
360 s->ops->set_socket(s, &s->socket);
361 s->irq.AssignedIRQ = s->irq.Config = 0;
363 destroy_cis_cache(s);
368 #ifdef CONFIG_CARDBUS
376 for (c = &s->clients; *c; ) {
377 if ((*c)->state & CLIENT_UNBOUND) {
385 free_regions(&s->a_region);
386 free_regions(&s->c_region);
390 s->ops->get_status(s, &status);
391 if (status & SS_POWERON) {
392 printk(KERN_ERR "PCMCIA: socket %p: *** DANGER *** unable to remove socket power\n", s);
395 } /* shutdown_socket */
397 /*======================================================================
399 The central event handler. Send_event() sends an event to all
400 valid clients. Parse_events() interprets the event bits from
401 a card status change report. Do_shutdown() handles the high
402 priority stuff associated with a card removal.
404 ======================================================================*/
406 static int send_event(struct pcmcia_socket *s, event_t event, int priority)
408 client_t *client = s->clients;
410 cs_dbg(s, 1, "send_event(event %d, pri %d)\n",
413 if (s->state & SOCKET_CARDBUS)
415 for (; client; client = client->next) {
416 if (client->state & (CLIENT_UNBOUND|CLIENT_STALE))
418 if (client->EventMask & event) {
419 ret = EVENT(client, event, priority);
427 #define cs_to_timeout(cs) (((cs) * HZ + 99) / 100)
429 static void socket_remove_drivers(struct pcmcia_socket *skt)
433 cs_dbg(skt, 4, "remove_drivers\n");
435 send_event(skt, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
437 for (client = skt->clients; client; client = client->next)
438 if (!(client->Attributes & INFO_MASTER_CLIENT))
439 client->state |= CLIENT_STALE;
442 static void socket_shutdown(struct pcmcia_socket *skt)
444 cs_dbg(skt, 4, "shutdown\n");
446 socket_remove_drivers(skt);
447 skt->state &= SOCKET_INUSE|SOCKET_PRESENT;
448 set_current_state(TASK_UNINTERRUPTIBLE);
449 schedule_timeout(cs_to_timeout(shutdown_delay));
450 skt->state &= SOCKET_INUSE;
451 shutdown_socket(skt);
454 static int socket_reset(struct pcmcia_socket *skt)
458 cs_dbg(skt, 4, "reset\n");
460 skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET;
461 skt->ops->set_socket(skt, &skt->socket);
462 udelay((long)reset_time);
464 skt->socket.flags &= ~SS_RESET;
465 skt->ops->set_socket(skt, &skt->socket);
467 set_current_state(TASK_UNINTERRUPTIBLE);
468 schedule_timeout(cs_to_timeout(unreset_delay));
469 for (i = 0; i < unreset_limit; i++) {
470 skt->ops->get_status(skt, &status);
472 if (!(status & SS_DETECT))
475 if (status & SS_READY)
478 set_current_state(TASK_UNINTERRUPTIBLE);
479 schedule_timeout(cs_to_timeout(unreset_check));
482 cs_err(skt, "time out after reset.\n");
483 return CS_GENERAL_FAILURE;
486 static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
490 cs_dbg(skt, 4, "setup\n");
492 skt->ops->get_status(skt, &status);
493 if (!(status & SS_DETECT))
496 set_current_state(TASK_UNINTERRUPTIBLE);
497 schedule_timeout(cs_to_timeout(initial_delay));
499 for (i = 0; i < 100; i++) {
500 skt->ops->get_status(skt, &status);
501 if (!(status & SS_DETECT))
504 if (!(status & SS_PENDING))
507 set_current_state(TASK_UNINTERRUPTIBLE);
508 schedule_timeout(cs_to_timeout(10));
511 if (status & SS_PENDING) {
512 cs_err(skt, "voltage interrogation timed out.\n");
513 return CS_GENERAL_FAILURE;
516 if (status & SS_CARDBUS) {
517 skt->state |= SOCKET_CARDBUS;
518 #ifndef CONFIG_CARDBUS
519 cs_err(skt, "cardbus cards are not supported.\n");
525 * Decode the card voltage requirements, and apply power to the card.
527 if (status & SS_3VCARD)
528 skt->socket.Vcc = skt->socket.Vpp = 33;
529 else if (!(status & SS_XVCARD))
530 skt->socket.Vcc = skt->socket.Vpp = 50;
532 cs_err(skt, "unsupported voltage key.\n");
535 skt->socket.flags = 0;
536 skt->ops->set_socket(skt, &skt->socket);
539 * Wait "vcc_settle" for the supply to stabilise.
541 set_current_state(TASK_UNINTERRUPTIBLE);
542 schedule_timeout(cs_to_timeout(vcc_settle));
544 skt->ops->get_status(skt, &status);
545 if (!(status & SS_POWERON)) {
546 cs_err(skt, "unable to apply power.\n");
550 return socket_reset(skt);
554 * Handle card insertion. Setup the socket, reset the card,
555 * and then tell the rest of PCMCIA that a card is present.
557 static int socket_insert(struct pcmcia_socket *skt)
561 cs_dbg(skt, 4, "insert\n");
563 if (!cs_socket_get(skt))
566 ret = socket_setup(skt, setup_delay);
567 if (ret == CS_SUCCESS) {
568 skt->state |= SOCKET_PRESENT;
569 #ifdef CONFIG_CARDBUS
570 if (skt->state & SOCKET_CARDBUS) {
572 skt->state |= SOCKET_CARDBUS_CONFIG;
575 cs_dbg(skt, 4, "insert done\n");
577 send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
579 socket_shutdown(skt);
586 static int socket_suspend(struct pcmcia_socket *skt)
588 if (skt->state & SOCKET_SUSPEND)
591 send_event(skt, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
592 skt->socket = dead_socket;
593 skt->ops->suspend(skt);
594 skt->state |= SOCKET_SUSPEND;
600 * Resume a socket. If a card is present, verify its CIS against
601 * our cached copy. If they are different, the card has been
602 * replaced, and we need to tell the drivers.
604 static int socket_resume(struct pcmcia_socket *skt)
608 if (!(skt->state & SOCKET_SUSPEND))
611 skt->socket = dead_socket;
613 skt->ops->set_socket(skt, &skt->socket);
615 ret = socket_setup(skt, resume_delay);
616 if (ret == CS_SUCCESS) {
618 * FIXME: need a better check here for cardbus cards.
620 if (verify_cis_cache(skt) != 0) {
621 socket_remove_drivers(skt);
622 destroy_cis_cache(skt);
623 send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
625 send_event(skt, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW);
628 socket_shutdown(skt);
632 skt->state &= ~SOCKET_SUSPEND;
637 static void socket_remove(struct pcmcia_socket *skt)
639 socket_shutdown(skt);
644 * Process a socket card detect status change.
646 * If we don't have a card already present, delay the detect event for
647 * about 20ms (to be on the safe side) before reading the socket status.
649 * Some i82365-based systems send multiple SS_DETECT events during card
650 * insertion, and the "card present" status bit seems to bounce. This
651 * will probably be true with GPIO-based card detection systems after
652 * the product has aged.
654 static void socket_detect_change(struct pcmcia_socket *skt)
656 if (!(skt->state & SOCKET_SUSPEND)) {
659 if (!(skt->state & SOCKET_PRESENT)) {
660 set_current_state(TASK_UNINTERRUPTIBLE);
661 schedule_timeout(cs_to_timeout(2));
664 skt->ops->get_status(skt, &status);
665 if ((skt->state & SOCKET_PRESENT) &&
666 !(status & SS_DETECT))
668 if (!(skt->state & SOCKET_PRESENT) &&
669 (status & SS_DETECT))
674 static int pccardd(void *__skt)
676 struct pcmcia_socket *skt = __skt;
677 DECLARE_WAITQUEUE(wait, current);
680 daemonize("pccardd");
681 skt->thread = current;
682 complete(&skt->thread_done);
684 skt->socket = dead_socket;
686 skt->ops->set_socket(skt, &skt->socket);
688 /* register with the device core */
689 ret = class_device_register(&skt->dev);
691 printk(KERN_WARNING "PCMCIA: unable to register socket 0x%p\n",
695 add_wait_queue(&skt->thread_wait, &wait);
700 set_current_state(TASK_INTERRUPTIBLE);
702 spin_lock_irqsave(&skt->thread_lock, flags);
703 events = skt->thread_events;
704 skt->thread_events = 0;
705 spin_unlock_irqrestore(&skt->thread_lock, flags);
709 if (events & SS_DETECT)
710 socket_detect_change(skt);
711 if (events & SS_BATDEAD)
712 send_event(skt, CS_EVENT_BATTERY_DEAD, CS_EVENT_PRI_LOW);
713 if (events & SS_BATWARN)
714 send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW);
715 if (events & SS_READY)
716 send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW);
722 if (current->flags & PF_FREEZE)
723 refrigerator(PF_FREEZE);
728 remove_wait_queue(&skt->thread_wait, &wait);
730 /* remove from the device core */
731 class_device_unregister(&skt->dev);
733 complete_and_exit(&skt->thread_done, 0);
737 * Yenta (at least) probes interrupts before registering the socket and
738 * starting the handler thread.
740 void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
742 cs_dbg(s, 4, "parse_events: events %08x\n", events);
744 spin_lock(&s->thread_lock);
745 s->thread_events |= events;
746 spin_unlock(&s->thread_lock);
748 wake_up(&s->thread_wait);
750 } /* pcmcia_parse_events */
753 /*======================================================================
755 Special stuff for managing IO windows, because they are scarce.
757 ======================================================================*/
759 static int alloc_io_space(struct pcmcia_socket *s, u_int attr, ioaddr_t *base,
760 ioaddr_t num, u_int lines, char *name)
765 align = (*base) ? (lines ? 1<<lines : 0) : 1;
766 if (align && (align < num)) {
768 cs_dbg(s, 0, "odd IO request: num %04x align %04x\n",
772 while (align && (align < num)) align <<= 1;
774 if (*base & ~(align-1)) {
775 cs_dbg(s, 0, "odd IO request: base %04x align %04x\n",
779 if ((s->features & SS_CAP_STATIC_MAP) && s->io_offset) {
780 *base = s->io_offset | (*base & 0x0fff);
783 /* Check for an already-allocated window that must conflict with
784 what was asked for. It is a hack because it does not catch all
785 potential conflicts, just the most obvious ones. */
786 for (i = 0; i < MAX_IO_WIN; i++)
787 if ((s->io[i].NumPorts != 0) &&
788 ((s->io[i].BasePort & (align-1)) == *base))
790 for (i = 0; i < MAX_IO_WIN; i++) {
791 if (s->io[i].NumPorts == 0) {
792 if (find_io_region(base, num, align, name, s) == 0) {
793 s->io[i].Attributes = attr;
794 s->io[i].BasePort = *base;
795 s->io[i].NumPorts = s->io[i].InUse = num;
799 } else if (s->io[i].Attributes != attr)
801 /* Try to extend top of window */
802 try = s->io[i].BasePort + s->io[i].NumPorts;
803 if ((*base == 0) || (*base == try))
804 if (find_io_region(&try, num, 0, name, s) == 0) {
806 s->io[i].NumPorts += num;
807 s->io[i].InUse += num;
810 /* Try to extend bottom of window */
811 try = s->io[i].BasePort - num;
812 if ((*base == 0) || (*base == try))
813 if (find_io_region(&try, num, 0, name, s) == 0) {
814 s->io[i].BasePort = *base = try;
815 s->io[i].NumPorts += num;
816 s->io[i].InUse += num;
820 return (i == MAX_IO_WIN);
821 } /* alloc_io_space */
823 static void release_io_space(struct pcmcia_socket *s, ioaddr_t base,
827 if(!(s->features & SS_CAP_STATIC_MAP))
828 release_region(base, num);
829 for (i = 0; i < MAX_IO_WIN; i++) {
830 if ((s->io[i].BasePort <= base) &&
831 (s->io[i].BasePort+s->io[i].NumPorts >= base+num)) {
832 s->io[i].InUse -= num;
833 /* Free the window if no one else is using it */
834 if (s->io[i].InUse == 0)
835 s->io[i].NumPorts = 0;
840 /*======================================================================
842 Access_configuration_register() reads and writes configuration
843 registers in attribute memory. Memory window 0 is reserved for
844 this and the tuple reading services.
846 ======================================================================*/
848 int pcmcia_access_configuration_register(client_handle_t handle,
851 struct pcmcia_socket *s;
856 if (CHECK_HANDLE(handle))
857 return CS_BAD_HANDLE;
859 if (handle->Function == BIND_FN_ALL) {
860 if (reg->Function >= s->functions)
862 c = &s->config[reg->Function];
869 if (!(c->state & CONFIG_LOCKED))
870 return CS_CONFIGURATION_LOCKED;
872 addr = (c->ConfigBase + reg->Offset) >> 1;
874 switch (reg->Action) {
876 read_cis_mem(s, 1, addr, 1, &val);
881 write_cis_mem(s, 1, addr, 1, &val);
888 } /* access_configuration_register */
891 /*====================================================================*/
893 int pcmcia_deregister_client(client_handle_t handle)
896 struct pcmcia_socket *s;
897 memory_handle_t region;
901 if (CHECK_HANDLE(handle))
902 return CS_BAD_HANDLE;
905 cs_dbg(s, 1, "deregister_client(%p)\n", handle);
908 (CLIENT_IRQ_REQ|CLIENT_IO_REQ|CLIENT_CONFIG_LOCKED))
910 for (i = 0; i < MAX_WIN; i++)
911 if (handle->state & CLIENT_WIN_REQ(i))
914 /* Disconnect all MTD links */
915 if (handle->mtd_count) {
916 for (region = s->a_region; region; region = region->info.next)
917 if (region->mtd == handle) region->mtd = NULL;
918 for (region = s->c_region; region; region = region->info.next)
919 if (region->mtd == handle) region->mtd = NULL;
922 if ((handle->state & CLIENT_STALE) ||
923 (handle->Attributes & INFO_MASTER_CLIENT)) {
924 spin_lock_irqsave(&s->lock, flags);
925 client = &s->clients;
926 while ((*client) && ((*client) != handle))
927 client = &(*client)->next;
928 if (*client == NULL) {
929 spin_unlock_irqrestore(&s->lock, flags);
930 return CS_BAD_HANDLE;
932 *client = handle->next;
933 handle->client_magic = 0;
935 spin_unlock_irqrestore(&s->lock, flags);
937 handle->state = CLIENT_UNBOUND;
938 handle->mtd_count = 0;
939 handle->event_handler = NULL;
943 } /* deregister_client */
945 /*====================================================================*/
947 int pcmcia_get_configuration_info(client_handle_t handle,
948 config_info_t *config)
950 struct pcmcia_socket *s;
953 if (CHECK_HANDLE(handle))
954 return CS_BAD_HANDLE;
956 if (!(s->state & SOCKET_PRESENT))
959 if (handle->Function == BIND_FN_ALL) {
960 if (config->Function && (config->Function >= s->functions))
963 config->Function = handle->Function;
965 #ifdef CONFIG_CARDBUS
966 if (s->state & SOCKET_CARDBUS) {
967 u_char fn = config->Function;
968 memset(config, 0, sizeof(config_info_t));
969 config->Function = fn;
970 config->Vcc = s->socket.Vcc;
971 config->Vpp1 = config->Vpp2 = s->socket.Vpp;
972 config->Option = s->cb_dev->subordinate->number;
973 if (s->state & SOCKET_CARDBUS_CONFIG) {
974 config->Attributes = CONF_VALID_CLIENT;
975 config->IntType = INT_CARDBUS;
976 config->AssignedIRQ = s->irq.AssignedIRQ;
977 if (config->AssignedIRQ)
978 config->Attributes |= CONF_ENABLE_IRQ;
979 config->BasePort1 = s->io[0].BasePort;
980 config->NumPorts1 = s->io[0].NumPorts;
986 c = (s->config != NULL) ? &s->config[config->Function] : NULL;
988 if ((c == NULL) || !(c->state & CONFIG_LOCKED)) {
989 config->Attributes = 0;
990 config->Vcc = s->socket.Vcc;
991 config->Vpp1 = config->Vpp2 = s->socket.Vpp;
995 /* !!! This is a hack !!! */
996 memcpy(&config->Attributes, &c->Attributes, sizeof(config_t));
997 config->Attributes |= CONF_VALID_CLIENT;
998 config->CardValues = c->CardValues;
999 config->IRQAttributes = c->irq.Attributes;
1000 config->AssignedIRQ = s->irq.AssignedIRQ;
1001 config->BasePort1 = c->io.BasePort1;
1002 config->NumPorts1 = c->io.NumPorts1;
1003 config->Attributes1 = c->io.Attributes1;
1004 config->BasePort2 = c->io.BasePort2;
1005 config->NumPorts2 = c->io.NumPorts2;
1006 config->Attributes2 = c->io.Attributes2;
1007 config->IOAddrLines = c->io.IOAddrLines;
1010 } /* get_configuration_info */
1012 /*======================================================================
1014 Return information about this version of Card Services.
1016 ======================================================================*/
1018 int pcmcia_get_card_services_info(servinfo_t *info)
1020 unsigned int socket_count = 0;
1021 struct list_head *tmp;
1022 info->Signature[0] = 'C';
1023 info->Signature[1] = 'S';
1024 down_read(&pcmcia_socket_list_rwsem);
1025 list_for_each(tmp, &pcmcia_socket_list)
1027 up_read(&pcmcia_socket_list_rwsem);
1028 info->Count = socket_count;
1029 info->Revision = CS_RELEASE_CODE;
1030 info->CSLevel = 0x0210;
1031 info->VendorString = (char *)release;
1033 } /* get_card_services_info */
1035 /*======================================================================
1037 Note that get_first_client() *does* recognize the Socket field
1038 in the request structure.
1040 ======================================================================*/
1042 int pcmcia_get_first_client(client_handle_t *handle, client_req_t *req)
1045 struct pcmcia_socket *socket;
1046 if (req->Attributes & CLIENT_THIS_SOCKET)
1050 socket = pcmcia_get_socket_by_nr(s);
1052 return CS_BAD_SOCKET;
1053 if (socket->clients == NULL)
1054 return CS_NO_MORE_ITEMS;
1055 *handle = socket->clients;
1057 } /* get_first_client */
1059 /*====================================================================*/
1061 int pcmcia_get_next_client(client_handle_t *handle, client_req_t *req)
1063 struct pcmcia_socket *s;
1064 if ((handle == NULL) || CHECK_HANDLE(*handle))
1065 return CS_BAD_HANDLE;
1066 if ((*handle)->next == NULL) {
1067 if (req->Attributes & CLIENT_THIS_SOCKET)
1068 return CS_NO_MORE_ITEMS;
1069 s = (*handle)->Socket;
1070 if (s->clients == NULL)
1071 return CS_NO_MORE_ITEMS;
1072 *handle = s->clients;
1074 *handle = (*handle)->next;
1076 } /* get_next_client */
1078 /*====================================================================*/
1080 int pcmcia_get_window(window_handle_t *handle, int idx, win_req_t *req)
1082 struct pcmcia_socket *s;
1087 s = ((client_handle_t)*handle)->Socket;
1089 s = (*handle)->sock;
1090 if (!(s->state & SOCKET_PRESENT))
1092 for (w = idx; w < MAX_WIN; w++)
1093 if (s->state & SOCKET_WIN_REQ(w)) break;
1095 return CS_NO_MORE_ITEMS;
1097 req->Base = win->ctl.sys_start;
1098 req->Size = win->ctl.sys_stop - win->ctl.sys_start + 1;
1099 req->AccessSpeed = win->ctl.speed;
1100 req->Attributes = 0;
1101 if (win->ctl.flags & MAP_ATTRIB)
1102 req->Attributes |= WIN_MEMORY_TYPE_AM;
1103 if (win->ctl.flags & MAP_ACTIVE)
1104 req->Attributes |= WIN_ENABLE;
1105 if (win->ctl.flags & MAP_16BIT)
1106 req->Attributes |= WIN_DATA_WIDTH_16;
1107 if (win->ctl.flags & MAP_USE_WAIT)
1108 req->Attributes |= WIN_USE_WAIT;
1113 int pcmcia_get_first_window(window_handle_t *win, win_req_t *req)
1115 if ((win == NULL) || ((*win)->magic != WINDOW_MAGIC))
1116 return CS_BAD_HANDLE;
1117 return pcmcia_get_window(win, 0, req);
1120 int pcmcia_get_next_window(window_handle_t *win, win_req_t *req)
1122 if ((win == NULL) || ((*win)->magic != WINDOW_MAGIC))
1123 return CS_BAD_HANDLE;
1124 return pcmcia_get_window(win, (*win)->index+1, req);
1127 /*=====================================================================
1129 Return the PCI device associated with a card..
1131 ======================================================================*/
1133 #ifdef CONFIG_CARDBUS
1135 struct pci_bus *pcmcia_lookup_bus(client_handle_t handle)
1137 struct pcmcia_socket *s;
1139 if (CHECK_HANDLE(handle))
1142 if (!(s->state & SOCKET_CARDBUS))
1145 return s->cb_dev->subordinate;
1148 EXPORT_SYMBOL(pcmcia_lookup_bus);
1152 /*======================================================================
1154 Get the current socket state bits. We don't support the latched
1155 SocketState yet: I haven't seen any point for it.
1157 ======================================================================*/
1159 int pcmcia_get_status(client_handle_t handle, cs_status_t *status)
1161 struct pcmcia_socket *s;
1165 if (CHECK_HANDLE(handle))
1166 return CS_BAD_HANDLE;
1168 s->ops->get_status(s, &val);
1169 status->CardState = status->SocketState = 0;
1170 status->CardState |= (val & SS_DETECT) ? CS_EVENT_CARD_DETECT : 0;
1171 status->CardState |= (val & SS_CARDBUS) ? CS_EVENT_CB_DETECT : 0;
1172 status->CardState |= (val & SS_3VCARD) ? CS_EVENT_3VCARD : 0;
1173 status->CardState |= (val & SS_XVCARD) ? CS_EVENT_XVCARD : 0;
1174 if (s->state & SOCKET_SUSPEND)
1175 status->CardState |= CS_EVENT_PM_SUSPEND;
1176 if (!(s->state & SOCKET_PRESENT))
1179 /* Get info from the PRR, if necessary */
1180 if (handle->Function == BIND_FN_ALL) {
1181 if (status->Function && (status->Function >= s->functions))
1183 c = (s->config != NULL) ? &s->config[status->Function] : NULL;
1186 if ((c != NULL) && (c->state & CONFIG_LOCKED) &&
1187 (c->IntType & (INT_MEMORY_AND_IO | INT_ZOOMED_VIDEO))) {
1189 if (c->Present & PRESENT_PIN_REPLACE) {
1190 read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, ®);
1191 status->CardState |=
1192 (reg & PRR_WP_STATUS) ? CS_EVENT_WRITE_PROTECT : 0;
1193 status->CardState |=
1194 (reg & PRR_READY_STATUS) ? CS_EVENT_READY_CHANGE : 0;
1195 status->CardState |=
1196 (reg & PRR_BVD2_STATUS) ? CS_EVENT_BATTERY_LOW : 0;
1197 status->CardState |=
1198 (reg & PRR_BVD1_STATUS) ? CS_EVENT_BATTERY_DEAD : 0;
1200 /* No PRR? Then assume we're always ready */
1201 status->CardState |= CS_EVENT_READY_CHANGE;
1203 if (c->Present & PRESENT_EXT_STATUS) {
1204 read_cis_mem(s, 1, (c->ConfigBase+CISREG_ESR)>>1, 1, ®);
1205 status->CardState |=
1206 (reg & ESR_REQ_ATTN) ? CS_EVENT_REQUEST_ATTENTION : 0;
1210 status->CardState |=
1211 (val & SS_WRPROT) ? CS_EVENT_WRITE_PROTECT : 0;
1212 status->CardState |=
1213 (val & SS_BATDEAD) ? CS_EVENT_BATTERY_DEAD : 0;
1214 status->CardState |=
1215 (val & SS_BATWARN) ? CS_EVENT_BATTERY_LOW : 0;
1216 status->CardState |=
1217 (val & SS_READY) ? CS_EVENT_READY_CHANGE : 0;
1221 /*======================================================================
1223 Change the card address of an already open memory window.
1225 ======================================================================*/
1227 int pcmcia_get_mem_page(window_handle_t win, memreq_t *req)
1229 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1230 return CS_BAD_HANDLE;
1232 req->CardOffset = win->ctl.card_start;
1234 } /* get_mem_page */
1236 int pcmcia_map_mem_page(window_handle_t win, memreq_t *req)
1238 struct pcmcia_socket *s;
1239 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1240 return CS_BAD_HANDLE;
1244 win->ctl.card_start = req->CardOffset;
1245 if (s->ops->set_mem_map(s, &win->ctl) != 0)
1246 return CS_BAD_OFFSET;
1248 } /* map_mem_page */
1250 /*======================================================================
1252 Modify a locked socket configuration
1254 ======================================================================*/
1256 int pcmcia_modify_configuration(client_handle_t handle,
1259 struct pcmcia_socket *s;
1262 if (CHECK_HANDLE(handle))
1263 return CS_BAD_HANDLE;
1264 s = SOCKET(handle); c = CONFIG(handle);
1265 if (!(s->state & SOCKET_PRESENT))
1267 if (!(c->state & CONFIG_LOCKED))
1268 return CS_CONFIGURATION_LOCKED;
1270 if (mod->Attributes & CONF_IRQ_CHANGE_VALID) {
1271 if (mod->Attributes & CONF_ENABLE_IRQ) {
1272 c->Attributes |= CONF_ENABLE_IRQ;
1273 s->socket.io_irq = s->irq.AssignedIRQ;
1275 c->Attributes &= ~CONF_ENABLE_IRQ;
1276 s->socket.io_irq = 0;
1278 s->ops->set_socket(s, &s->socket);
1281 if (mod->Attributes & CONF_VCC_CHANGE_VALID)
1284 /* We only allow changing Vpp1 and Vpp2 to the same value */
1285 if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) &&
1286 (mod->Attributes & CONF_VPP2_CHANGE_VALID)) {
1287 if (mod->Vpp1 != mod->Vpp2)
1289 c->Vpp1 = c->Vpp2 = s->socket.Vpp = mod->Vpp1;
1290 if (s->ops->set_socket(s, &s->socket))
1292 } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) ||
1293 (mod->Attributes & CONF_VPP2_CHANGE_VALID))
1297 } /* modify_configuration */
1299 /*======================================================================
1301 Modify the attributes of a window returned by RequestWindow.
1303 ======================================================================*/
1305 int pcmcia_modify_window(window_handle_t win, modwin_t *req)
1307 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1308 return CS_BAD_HANDLE;
1310 win->ctl.flags &= ~(MAP_ATTRIB|MAP_ACTIVE);
1311 if (req->Attributes & WIN_MEMORY_TYPE)
1312 win->ctl.flags |= MAP_ATTRIB;
1313 if (req->Attributes & WIN_ENABLE)
1314 win->ctl.flags |= MAP_ACTIVE;
1315 if (req->Attributes & WIN_DATA_WIDTH_16)
1316 win->ctl.flags |= MAP_16BIT;
1317 if (req->Attributes & WIN_USE_WAIT)
1318 win->ctl.flags |= MAP_USE_WAIT;
1319 win->ctl.speed = req->AccessSpeed;
1320 win->sock->ops->set_mem_map(win->sock, &win->ctl);
1323 } /* modify_window */
1325 /*======================================================================
1327 Register_client() uses the dev_info_t handle to match the
1328 caller with a socket. The driver must have already been bound
1329 to a socket with bind_device() -- in fact, bind_device()
1330 allocates the client structure that will be used.
1332 ======================================================================*/
1334 int pcmcia_register_client(client_handle_t *handle, client_reg_t *req)
1336 client_t *client = NULL;
1337 struct pcmcia_socket *s;
1339 /* Look for unbound client with matching dev_info */
1340 down_read(&pcmcia_socket_list_rwsem);
1341 list_for_each_entry(s, &pcmcia_socket_list, socket_list) {
1342 client = s->clients;
1343 while (client != NULL) {
1344 if ((strcmp(client->dev_info, (char *)req->dev_info) == 0)
1345 && (client->state & CLIENT_UNBOUND)) break;
1346 client = client->next;
1348 if (client != NULL) break;
1350 up_read(&pcmcia_socket_list_rwsem);
1352 return CS_OUT_OF_RESOURCE;
1355 * Prevent this racing with a card insertion.
1359 client->state &= ~CLIENT_UNBOUND;
1361 client->Attributes = req->Attributes;
1362 client->EventMask = req->EventMask;
1363 client->event_handler = req->event_handler;
1364 client->event_callback_args = req->event_callback_args;
1365 client->event_callback_args.client_handle = client;
1367 if (s->state & SOCKET_CARDBUS)
1368 client->state |= CLIENT_CARDBUS;
1370 if ((!(s->state & SOCKET_CARDBUS)) && (s->functions == 0) &&
1371 (client->Function != BIND_FN_ALL)) {
1372 cistpl_longlink_mfc_t mfc;
1373 if (read_tuple(client, CISTPL_LONGLINK_MFC, &mfc)
1375 s->functions = mfc.nfn;
1378 s->config = kmalloc(sizeof(config_t) * s->functions,
1381 goto out_no_resource;
1382 memset(s->config, 0, sizeof(config_t) * s->functions);
1385 cs_dbg(s, 1, "register_client(): client 0x%p, dev %s\n",
1386 client, client->dev_info);
1387 if (client->EventMask & CS_EVENT_REGISTRATION_COMPLETE)
1388 EVENT(client, CS_EVENT_REGISTRATION_COMPLETE, CS_EVENT_PRI_LOW);
1390 if ((s->state & (SOCKET_PRESENT|SOCKET_CARDBUS)) == SOCKET_PRESENT) {
1391 if (client->EventMask & CS_EVENT_CARD_INSERTION)
1392 EVENT(client, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
1394 client->PendingEvents |= CS_EVENT_CARD_INSERTION;
1402 return CS_OUT_OF_RESOURCE;
1403 } /* register_client */
1405 /*====================================================================*/
1407 int pcmcia_release_configuration(client_handle_t handle)
1409 pccard_io_map io = { 0, 0, 0, 0, 1 };
1410 struct pcmcia_socket *s;
1413 if (CHECK_HANDLE(handle) ||
1414 !(handle->state & CLIENT_CONFIG_LOCKED))
1415 return CS_BAD_HANDLE;
1416 handle->state &= ~CLIENT_CONFIG_LOCKED;
1419 #ifdef CONFIG_CARDBUS
1420 if (handle->state & CLIENT_CARDBUS)
1424 if (!(handle->state & CLIENT_STALE)) {
1425 config_t *c = CONFIG(handle);
1426 if (--(s->lock_count) == 0) {
1427 s->socket.flags = SS_OUTPUT_ENA; /* Is this correct? */
1429 s->socket.io_irq = 0;
1430 s->ops->set_socket(s, &s->socket);
1432 if (c->state & CONFIG_IO_REQ)
1433 for (i = 0; i < MAX_IO_WIN; i++) {
1434 if (s->io[i].NumPorts == 0)
1437 if (s->io[i].Config != 0)
1440 s->ops->set_io_map(s, &io);
1442 c->state &= ~CONFIG_LOCKED;
1446 } /* release_configuration */
1448 /*======================================================================
1450 Release_io() releases the I/O ranges allocated by a client. This
1451 may be invoked some time after a card ejection has already dumped
1452 the actual socket configuration, so if the client is "stale", we
1453 don't bother checking the port ranges against the current socket
1456 ======================================================================*/
1458 int pcmcia_release_io(client_handle_t handle, io_req_t *req)
1460 struct pcmcia_socket *s;
1462 if (CHECK_HANDLE(handle) || !(handle->state & CLIENT_IO_REQ))
1463 return CS_BAD_HANDLE;
1464 handle->state &= ~CLIENT_IO_REQ;
1467 #ifdef CONFIG_CARDBUS
1468 if (handle->state & CLIENT_CARDBUS)
1472 if (!(handle->state & CLIENT_STALE)) {
1473 config_t *c = CONFIG(handle);
1474 if (c->state & CONFIG_LOCKED)
1475 return CS_CONFIGURATION_LOCKED;
1476 if ((c->io.BasePort1 != req->BasePort1) ||
1477 (c->io.NumPorts1 != req->NumPorts1) ||
1478 (c->io.BasePort2 != req->BasePort2) ||
1479 (c->io.NumPorts2 != req->NumPorts2))
1481 c->state &= ~CONFIG_IO_REQ;
1484 release_io_space(s, req->BasePort1, req->NumPorts1);
1486 release_io_space(s, req->BasePort2, req->NumPorts2);
1491 /*====================================================================*/
1493 int pcmcia_release_irq(client_handle_t handle, irq_req_t *req)
1495 struct pcmcia_socket *s;
1496 if (CHECK_HANDLE(handle) || !(handle->state & CLIENT_IRQ_REQ))
1497 return CS_BAD_HANDLE;
1498 handle->state &= ~CLIENT_IRQ_REQ;
1501 if (!(handle->state & CLIENT_STALE)) {
1502 config_t *c = CONFIG(handle);
1503 if (c->state & CONFIG_LOCKED)
1504 return CS_CONFIGURATION_LOCKED;
1505 if (c->irq.Attributes != req->Attributes)
1506 return CS_BAD_ATTRIBUTE;
1507 if (s->irq.AssignedIRQ != req->AssignedIRQ)
1509 if (--s->irq.Config == 0) {
1510 c->state &= ~CONFIG_IRQ_REQ;
1511 s->irq.AssignedIRQ = 0;
1515 if (req->Attributes & IRQ_HANDLE_PRESENT) {
1516 free_irq(req->AssignedIRQ, req->Instance);
1519 #ifdef CONFIG_PCMCIA_PROBE
1520 if (req->AssignedIRQ != s->pci_irq)
1521 undo_irq(req->Attributes, req->AssignedIRQ);
1525 } /* cs_release_irq */
1527 /*====================================================================*/
1529 int pcmcia_release_window(window_handle_t win)
1531 struct pcmcia_socket *s;
1533 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1534 return CS_BAD_HANDLE;
1536 if (!(win->handle->state & CLIENT_WIN_REQ(win->index)))
1537 return CS_BAD_HANDLE;
1539 /* Shut down memory window */
1540 win->ctl.flags &= ~MAP_ACTIVE;
1541 s->ops->set_mem_map(s, &win->ctl);
1542 s->state &= ~SOCKET_WIN_REQ(win->index);
1544 /* Release system memory */
1545 if(!(s->features & SS_CAP_STATIC_MAP))
1546 release_mem_region(win->base, win->size);
1547 win->handle->state &= ~CLIENT_WIN_REQ(win->index);
1552 } /* release_window */
1554 /*====================================================================*/
1556 int pcmcia_request_configuration(client_handle_t handle,
1561 struct pcmcia_socket *s;
1563 pccard_io_map iomap;
1565 if (CHECK_HANDLE(handle))
1566 return CS_BAD_HANDLE;
1568 if (!(s->state & SOCKET_PRESENT))
1571 #ifdef CONFIG_CARDBUS
1572 if (handle->state & CLIENT_CARDBUS)
1573 return CS_UNSUPPORTED_MODE;
1576 if (req->IntType & INT_CARDBUS)
1577 return CS_UNSUPPORTED_MODE;
1579 if (c->state & CONFIG_LOCKED)
1580 return CS_CONFIGURATION_LOCKED;
1582 /* Do power control. We don't allow changes in Vcc. */
1583 if (s->socket.Vcc != req->Vcc)
1585 if (req->Vpp1 != req->Vpp2)
1587 s->socket.Vpp = req->Vpp1;
1588 if (s->ops->set_socket(s, &s->socket))
1591 c->Vcc = req->Vcc; c->Vpp1 = c->Vpp2 = req->Vpp1;
1593 /* Pick memory or I/O card, DMA mode, interrupt */
1594 c->IntType = req->IntType;
1595 c->Attributes = req->Attributes;
1596 if (req->IntType & INT_MEMORY_AND_IO)
1597 s->socket.flags |= SS_IOCARD;
1598 if (req->IntType & INT_ZOOMED_VIDEO)
1599 s->socket.flags |= SS_ZVCARD | SS_IOCARD;
1600 if (req->Attributes & CONF_ENABLE_DMA)
1601 s->socket.flags |= SS_DMA_MODE;
1602 if (req->Attributes & CONF_ENABLE_SPKR)
1603 s->socket.flags |= SS_SPKR_ENA;
1604 if (req->Attributes & CONF_ENABLE_IRQ)
1605 s->socket.io_irq = s->irq.AssignedIRQ;
1607 s->socket.io_irq = 0;
1608 s->ops->set_socket(s, &s->socket);
1611 /* Set up CIS configuration registers */
1612 base = c->ConfigBase = req->ConfigBase;
1613 c->Present = c->CardValues = req->Present;
1614 if (req->Present & PRESENT_COPY) {
1615 c->Copy = req->Copy;
1616 write_cis_mem(s, 1, (base + CISREG_SCR)>>1, 1, &c->Copy);
1618 if (req->Present & PRESENT_OPTION) {
1619 if (s->functions == 1) {
1620 c->Option = req->ConfigIndex & COR_CONFIG_MASK;
1622 c->Option = req->ConfigIndex & COR_MFC_CONFIG_MASK;
1623 c->Option |= COR_FUNC_ENA|COR_IREQ_ENA;
1624 if (req->Present & PRESENT_IOBASE_0)
1625 c->Option |= COR_ADDR_DECODE;
1627 if (c->state & CONFIG_IRQ_REQ)
1628 if (!(c->irq.Attributes & IRQ_FORCED_PULSE))
1629 c->Option |= COR_LEVEL_REQ;
1630 write_cis_mem(s, 1, (base + CISREG_COR)>>1, 1, &c->Option);
1633 if (req->Present & PRESENT_STATUS) {
1634 c->Status = req->Status;
1635 write_cis_mem(s, 1, (base + CISREG_CCSR)>>1, 1, &c->Status);
1637 if (req->Present & PRESENT_PIN_REPLACE) {
1639 write_cis_mem(s, 1, (base + CISREG_PRR)>>1, 1, &c->Pin);
1641 if (req->Present & PRESENT_EXT_STATUS) {
1642 c->ExtStatus = req->ExtStatus;
1643 write_cis_mem(s, 1, (base + CISREG_ESR)>>1, 1, &c->ExtStatus);
1645 if (req->Present & PRESENT_IOBASE_0) {
1646 u_char b = c->io.BasePort1 & 0xff;
1647 write_cis_mem(s, 1, (base + CISREG_IOBASE_0)>>1, 1, &b);
1648 b = (c->io.BasePort1 >> 8) & 0xff;
1649 write_cis_mem(s, 1, (base + CISREG_IOBASE_1)>>1, 1, &b);
1651 if (req->Present & PRESENT_IOSIZE) {
1652 u_char b = c->io.NumPorts1 + c->io.NumPorts2 - 1;
1653 write_cis_mem(s, 1, (base + CISREG_IOSIZE)>>1, 1, &b);
1656 /* Configure I/O windows */
1657 if (c->state & CONFIG_IO_REQ) {
1658 iomap.speed = io_speed;
1659 for (i = 0; i < MAX_IO_WIN; i++)
1660 if (s->io[i].NumPorts != 0) {
1662 iomap.flags = MAP_ACTIVE;
1663 switch (s->io[i].Attributes & IO_DATA_PATH_WIDTH) {
1664 case IO_DATA_PATH_WIDTH_16:
1665 iomap.flags |= MAP_16BIT; break;
1666 case IO_DATA_PATH_WIDTH_AUTO:
1667 iomap.flags |= MAP_AUTOSZ; break;
1671 iomap.start = s->io[i].BasePort;
1672 iomap.stop = iomap.start + s->io[i].NumPorts - 1;
1673 s->ops->set_io_map(s, &iomap);
1678 c->state |= CONFIG_LOCKED;
1679 handle->state |= CLIENT_CONFIG_LOCKED;
1681 } /* request_configuration */
1683 /*======================================================================
1685 Request_io() reserves ranges of port addresses for a socket.
1686 I have not implemented range sharing or alias addressing.
1688 ======================================================================*/
1690 int pcmcia_request_io(client_handle_t handle, io_req_t *req)
1692 struct pcmcia_socket *s;
1695 if (CHECK_HANDLE(handle))
1696 return CS_BAD_HANDLE;
1698 if (!(s->state & SOCKET_PRESENT))
1701 if (handle->state & CLIENT_CARDBUS) {
1702 #ifdef CONFIG_CARDBUS
1703 handle->state |= CLIENT_IO_REQ;
1706 return CS_UNSUPPORTED_FUNCTION;
1711 return CS_UNSUPPORTED_MODE;
1713 if (c->state & CONFIG_LOCKED)
1714 return CS_CONFIGURATION_LOCKED;
1715 if (c->state & CONFIG_IO_REQ)
1717 if (req->Attributes1 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS))
1718 return CS_BAD_ATTRIBUTE;
1719 if ((req->NumPorts2 > 0) &&
1720 (req->Attributes2 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS)))
1721 return CS_BAD_ATTRIBUTE;
1723 if (alloc_io_space(s, req->Attributes1, &req->BasePort1,
1724 req->NumPorts1, req->IOAddrLines,
1728 if (req->NumPorts2) {
1729 if (alloc_io_space(s, req->Attributes2, &req->BasePort2,
1730 req->NumPorts2, req->IOAddrLines,
1731 handle->dev_info)) {
1732 release_io_space(s, req->BasePort1, req->NumPorts1);
1738 c->state |= CONFIG_IO_REQ;
1739 handle->state |= CLIENT_IO_REQ;
1743 /*======================================================================
1745 Request_irq() reserves an irq for this client.
1747 Also, since Linux only reserves irq's when they are actually
1748 hooked, we don't guarantee that an irq will still be available
1749 when the configuration is locked. Now that I think about it,
1750 there might be a way to fix this using a dummy handler.
1752 ======================================================================*/
1754 int pcmcia_request_irq(client_handle_t handle, irq_req_t *req)
1756 struct pcmcia_socket *s;
1758 int ret = CS_IN_USE, irq = 0;
1760 if (CHECK_HANDLE(handle))
1761 return CS_BAD_HANDLE;
1763 if (!(s->state & SOCKET_PRESENT))
1766 if (c->state & CONFIG_LOCKED)
1767 return CS_CONFIGURATION_LOCKED;
1768 if (c->state & CONFIG_IRQ_REQ)
1771 #ifdef CONFIG_PCMCIA_PROBE
1772 if (s->irq.AssignedIRQ != 0) {
1773 /* If the interrupt is already assigned, it must match */
1774 irq = s->irq.AssignedIRQ;
1775 if (req->IRQInfo1 & IRQ_INFO2_VALID) {
1776 u_int mask = req->IRQInfo2 & s->irq_mask;
1777 ret = ((mask >> irq) & 1) ? 0 : CS_BAD_ARGS;
1779 ret = ((req->IRQInfo1&IRQ_MASK) == irq) ? 0 : CS_BAD_ARGS;
1781 if (req->IRQInfo1 & IRQ_INFO2_VALID) {
1782 u_int try, mask = req->IRQInfo2 & s->irq_mask;
1783 for (try = 0; try < 2; try++) {
1784 for (irq = 0; irq < 32; irq++)
1785 if ((mask >> irq) & 1) {
1786 ret = try_irq(req->Attributes, irq, try);
1787 if (ret == 0) break;
1789 if (ret == 0) break;
1792 irq = req->IRQInfo1 & IRQ_MASK;
1793 ret = try_irq(req->Attributes, irq, 1);
1803 if (req->Attributes & IRQ_HANDLE_PRESENT) {
1804 if (request_irq(irq, req->Handler,
1805 ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) ||
1806 (s->functions > 1) ||
1807 (irq == s->pci_irq)) ? SA_SHIRQ : 0,
1808 handle->dev_info, req->Instance))
1812 c->irq.Attributes = req->Attributes;
1813 s->irq.AssignedIRQ = req->AssignedIRQ = irq;
1816 c->state |= CONFIG_IRQ_REQ;
1817 handle->state |= CLIENT_IRQ_REQ;
1819 } /* pcmcia_request_irq */
1821 /*======================================================================
1823 Request_window() establishes a mapping between card memory space
1824 and system memory space.
1826 ======================================================================*/
1828 int pcmcia_request_window(client_handle_t *handle, win_req_t *req, window_handle_t *wh)
1830 struct pcmcia_socket *s;
1835 if (CHECK_HANDLE(*handle))
1836 return CS_BAD_HANDLE;
1837 s = (*handle)->Socket;
1838 if (!(s->state & SOCKET_PRESENT))
1840 if (req->Attributes & (WIN_PAGED | WIN_SHARED))
1841 return CS_BAD_ATTRIBUTE;
1843 /* Window size defaults to smallest available */
1845 req->Size = s->map_size;
1846 align = (((s->features & SS_CAP_MEM_ALIGN) ||
1847 (req->Attributes & WIN_STRICT_ALIGN)) ?
1848 req->Size : s->map_size);
1849 if (req->Size & (s->map_size-1))
1851 if ((req->Base && (s->features & SS_CAP_STATIC_MAP)) ||
1852 (req->Base & (align-1)))
1857 /* Allocate system memory window */
1858 for (w = 0; w < MAX_WIN; w++)
1859 if (!(s->state & SOCKET_WIN_REQ(w))) break;
1861 return CS_OUT_OF_RESOURCE;
1864 win->magic = WINDOW_MAGIC;
1866 win->handle = *handle;
1868 win->base = req->Base;
1869 win->size = req->Size;
1871 if (!(s->features & SS_CAP_STATIC_MAP) &&
1872 find_mem_region(&win->base, win->size, align,
1873 (req->Attributes & WIN_MAP_BELOW_1MB),
1874 (*handle)->dev_info, s))
1876 (*handle)->state |= CLIENT_WIN_REQ(w);
1878 /* Configure the socket controller */
1881 win->ctl.speed = req->AccessSpeed;
1882 if (req->Attributes & WIN_MEMORY_TYPE)
1883 win->ctl.flags |= MAP_ATTRIB;
1884 if (req->Attributes & WIN_ENABLE)
1885 win->ctl.flags |= MAP_ACTIVE;
1886 if (req->Attributes & WIN_DATA_WIDTH_16)
1887 win->ctl.flags |= MAP_16BIT;
1888 if (req->Attributes & WIN_USE_WAIT)
1889 win->ctl.flags |= MAP_USE_WAIT;
1890 win->ctl.sys_start = win->base;
1891 win->ctl.sys_stop = win->base + win->size-1;
1892 win->ctl.card_start = 0;
1893 if (s->ops->set_mem_map(s, &win->ctl) != 0)
1895 s->state |= SOCKET_WIN_REQ(w);
1897 /* Return window handle */
1898 req->Base = win->ctl.sys_start;
1902 } /* request_window */
1904 /*======================================================================
1906 I'm not sure which "reset" function this is supposed to use,
1907 but for now, it uses the low-level interface's reset, not the
1910 ======================================================================*/
1912 int pcmcia_reset_card(client_handle_t handle, client_req_t *req)
1914 struct pcmcia_socket *skt;
1917 if (CHECK_HANDLE(handle))
1918 return CS_BAD_HANDLE;
1919 skt = SOCKET(handle);
1920 cs_dbg(skt, 1, "resetting socket\n");
1922 down(&skt->skt_sem);
1924 if (!(skt->state & SOCKET_PRESENT)) {
1928 if (skt->state & SOCKET_SUSPEND) {
1932 if (skt->state & SOCKET_CARDBUS) {
1933 ret = CS_UNSUPPORTED_FUNCTION;
1937 ret = send_event(skt, CS_EVENT_RESET_REQUEST, CS_EVENT_PRI_LOW);
1939 send_event(skt, CS_EVENT_RESET_PHYSICAL, CS_EVENT_PRI_LOW);
1940 if (socket_reset(skt) == CS_SUCCESS)
1941 send_event(skt, CS_EVENT_CARD_RESET, CS_EVENT_PRI_LOW);
1944 handle->event_callback_args.info = (void *)(u_long)ret;
1945 EVENT(handle, CS_EVENT_RESET_COMPLETE, CS_EVENT_PRI_LOW);
1954 /*======================================================================
1956 These shut down or wake up a socket. They are sort of user
1957 initiated versions of the APM suspend and resume actions.
1959 ======================================================================*/
1961 int pcmcia_suspend_card(struct pcmcia_socket *skt)
1965 cs_dbg(skt, 1, "suspending socket\n");
1967 down(&skt->skt_sem);
1969 if (!(skt->state & SOCKET_PRESENT)) {
1973 if (skt->state & SOCKET_CARDBUS) {
1974 ret = CS_UNSUPPORTED_FUNCTION;
1977 ret = socket_suspend(skt);
1982 } /* suspend_card */
1984 int pcmcia_resume_card(struct pcmcia_socket *skt)
1988 cs_dbg(skt, 1, "waking up socket\n");
1990 down(&skt->skt_sem);
1992 if (!(skt->state & SOCKET_PRESENT)) {
1996 if (skt->state & SOCKET_CARDBUS) {
1997 ret = CS_UNSUPPORTED_FUNCTION;
2000 ret = socket_resume(skt);
2007 /*======================================================================
2009 These handle user requests to eject or insert a card.
2011 ======================================================================*/
2013 int pcmcia_eject_card(struct pcmcia_socket *skt)
2017 cs_dbg(skt, 1, "user eject request\n");
2019 down(&skt->skt_sem);
2021 if (!(skt->state & SOCKET_PRESENT)) {
2026 ret = send_event(skt, CS_EVENT_EJECTION_REQUEST, CS_EVENT_PRI_LOW);
2038 int pcmcia_insert_card(struct pcmcia_socket *skt)
2042 cs_dbg(skt, 1, "user insert request\n");
2044 down(&skt->skt_sem);
2046 if (skt->state & SOCKET_PRESENT) {
2050 if (socket_insert(skt) == CS_NO_CARD) {
2061 /*======================================================================
2063 Maybe this should send a CS_EVENT_CARD_INSERTION event if we
2064 haven't sent one to this client yet?
2066 ======================================================================*/
2068 int pcmcia_set_event_mask(client_handle_t handle, eventmask_t *mask)
2071 if (CHECK_HANDLE(handle))
2072 return CS_BAD_HANDLE;
2073 if (handle->Attributes & CONF_EVENT_MASK_VALID)
2074 return CS_BAD_SOCKET;
2075 handle->EventMask = mask->EventMask;
2076 events = handle->PendingEvents & handle->EventMask;
2077 handle->PendingEvents -= events;
2078 while (events != 0) {
2079 bit = ((events ^ (events-1)) + 1) >> 1;
2080 EVENT(handle, bit, CS_EVENT_PRI_LOW);
2084 } /* set_event_mask */
2086 /*======================================================================
2088 OS-specific module glue goes here
2090 ======================================================================*/
2091 /* in alpha order */
2092 EXPORT_SYMBOL(pcmcia_access_configuration_register);
2093 EXPORT_SYMBOL(pcmcia_adjust_resource_info);
2094 EXPORT_SYMBOL(pcmcia_check_erase_queue);
2095 EXPORT_SYMBOL(pcmcia_close_memory);
2096 EXPORT_SYMBOL(pcmcia_copy_memory);
2097 EXPORT_SYMBOL(pcmcia_deregister_client);
2098 EXPORT_SYMBOL(pcmcia_deregister_erase_queue);
2099 EXPORT_SYMBOL(pcmcia_eject_card);
2100 EXPORT_SYMBOL(pcmcia_get_first_client);
2101 EXPORT_SYMBOL(pcmcia_get_card_services_info);
2102 EXPORT_SYMBOL(pcmcia_get_configuration_info);
2103 EXPORT_SYMBOL(pcmcia_get_mem_page);
2104 EXPORT_SYMBOL(pcmcia_get_next_client);
2105 EXPORT_SYMBOL(pcmcia_get_first_region);
2106 EXPORT_SYMBOL(pcmcia_get_first_tuple);
2107 EXPORT_SYMBOL(pcmcia_get_first_window);
2108 EXPORT_SYMBOL(pcmcia_get_next_region);
2109 EXPORT_SYMBOL(pcmcia_get_next_tuple);
2110 EXPORT_SYMBOL(pcmcia_get_next_window);
2111 EXPORT_SYMBOL(pcmcia_get_status);
2112 EXPORT_SYMBOL(pcmcia_get_tuple_data);
2113 EXPORT_SYMBOL(pcmcia_insert_card);
2114 EXPORT_SYMBOL(pcmcia_map_mem_page);
2115 EXPORT_SYMBOL(pcmcia_modify_configuration);
2116 EXPORT_SYMBOL(pcmcia_modify_window);
2117 EXPORT_SYMBOL(pcmcia_open_memory);
2118 EXPORT_SYMBOL(pcmcia_parse_tuple);
2119 EXPORT_SYMBOL(pcmcia_read_memory);
2120 EXPORT_SYMBOL(pcmcia_register_client);
2121 EXPORT_SYMBOL(pcmcia_register_erase_queue);
2122 EXPORT_SYMBOL(pcmcia_register_mtd);
2123 EXPORT_SYMBOL(pcmcia_release_configuration);
2124 EXPORT_SYMBOL(pcmcia_release_io);
2125 EXPORT_SYMBOL(pcmcia_release_irq);
2126 EXPORT_SYMBOL(pcmcia_release_window);
2127 EXPORT_SYMBOL(pcmcia_replace_cis);
2128 EXPORT_SYMBOL(pcmcia_request_configuration);
2129 EXPORT_SYMBOL(pcmcia_request_io);
2130 EXPORT_SYMBOL(pcmcia_request_irq);
2131 EXPORT_SYMBOL(pcmcia_request_window);
2132 EXPORT_SYMBOL(pcmcia_reset_card);
2133 EXPORT_SYMBOL(pcmcia_resume_card);
2134 EXPORT_SYMBOL(pcmcia_set_event_mask);
2135 EXPORT_SYMBOL(pcmcia_suspend_card);
2136 EXPORT_SYMBOL(pcmcia_validate_cis);
2137 EXPORT_SYMBOL(pcmcia_write_memory);
2139 EXPORT_SYMBOL(dead_socket);
2140 EXPORT_SYMBOL(MTDHelperEntry);
2141 EXPORT_SYMBOL(pcmcia_parse_events);
2143 struct class pcmcia_socket_class = {
2144 .name = "pcmcia_socket",
2145 .release = pcmcia_release_socket,
2147 EXPORT_SYMBOL(pcmcia_socket_class);
2150 static int __init init_pcmcia_cs(void)
2152 printk(KERN_INFO "%s\n", release);
2153 printk(KERN_INFO " %s\n", options);
2155 return class_register(&pcmcia_socket_class);
2158 static void __exit exit_pcmcia_cs(void)
2160 printk(KERN_INFO "unloading Kernel Card Services\n");
2161 release_resource_db();
2162 class_unregister(&pcmcia_socket_class);
2165 subsys_initcall(init_pcmcia_cs);
2166 module_exit(exit_pcmcia_cs);
2168 /*====================================================================*/