diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-02-24 00:12:35 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-02-24 00:12:35 +0000 |
commit | 482368b1a8e45430672c58c9a42e7d2004367126 (patch) | |
tree | ce2a1a567d4d62dee7c2e71a46a99cf72cf1d606 /drivers/pcmcia | |
parent | e4d0251c6f56ab2e191afb70f80f382793e23f74 (diff) |
Merge with 2.3.47. Guys, this is buggy as shit. You've been warned.
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/cs.c | 38 | ||||
-rw-r--r-- | drivers/pcmcia/cs_internal.h | 2 | ||||
-rw-r--r-- | drivers/pcmcia/i82365.c | 26 | ||||
-rw-r--r-- | drivers/pcmcia/tcic.c | 21 |
4 files changed, 49 insertions, 38 deletions
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index e7c945c0c..7025263d4 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c @@ -2,7 +2,7 @@ PCMCIA Card Services -- core services - cs.c 1.247 2000/01/15 04:30:35 + cs.c 1.249 2000/02/10 23:26:11 The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file @@ -69,7 +69,7 @@ static int handle_pm_event(struct pm_dev *dev, pm_request_t rqst, void *data); int pc_debug = PCMCIA_DEBUG; MODULE_PARM(pc_debug, "i"); static const char *version = -"cs.c 1.247 2000/01/15 04:30:35 (David Hinds)"; +"cs.c 1.249 2000/02/10 23:26:11 (David Hinds)"; #endif #ifdef CONFIG_PCI @@ -82,13 +82,14 @@ static const char *version = #else #define CB_OPT "" #endif -#if defined(CONFIG_APM) || defined(CONFIG_ACPI) +#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE) || defined(CONFIG_ACPI) #define APM_OPT " [apm]" #else #define APM_OPT "" #endif #if !defined(CONFIG_CARDBUS) && !defined(CONFIG_PCI) && \ - !defined(CONFIG_APM) && !defined(CONFIG_ACPI) + !defined(CONFIG_APM) && !defined(CONFIG_APM_MODULE) && \ + !defined(CONFIG_ACPI) #define OPTIONS " none" #else #define OPTIONS PCI_OPT CB_OPT APM_OPT @@ -124,7 +125,7 @@ static int cis_speed = 300; /* ns */ static int io_speed = 0; /* ns */ /* Optional features */ -#if defined(CONFIG_APM) || defined(CONFIG_ACPI) +#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE) || defined(CONFIG_ACPI) static int do_apm = 1; MODULE_PARM(do_apm, "i"); #else @@ -341,6 +342,7 @@ int register_ss_entry(int nsock, struct pccard_operations * ss_entry) s->sock = ns; s->setup.data = sockets; s->setup.function = &setup_socket; + s->setup_timeout = 0; s->shutdown.data = sockets; s->shutdown.function = &shutdown_socket; /* base address = 0, map = 0 */ @@ -486,7 +488,17 @@ static void setup_socket(u_long i) socket_info_t *s = socket_table[i]; get_socket_status(s, &val); - if (val & SS_DETECT) { + if (val & SS_PENDING) { + /* Does the socket need more time? */ + DEBUG(2, "cs: setup_socket(%ld): status pending\n", i); + if (++s->setup_timeout > 100) { + printk(KERN_NOTICE "cs: socket %ld voltage interrogation" + " timed out\n", i); + } else { + s->setup.expires = jiffies + HZ/10; + add_timer(&s->setup); + } + } else if (val & SS_DETECT) { DEBUG(1, "cs: setup_socket(%ld): applying power\n", i); s->state |= SOCKET_PRESENT; s->socket.flags = 0; @@ -532,7 +544,7 @@ static void reset_socket(u_long i) udelay((long)reset_time); s->socket.flags &= ~SS_RESET; set_socket(s, &s->socket); - s->unreset_timeout = 0; + s->setup_timeout = 0; s->setup.expires = jiffies + unreset_delay; s->setup.function = &unreset_socket; add_timer(&s->setup); @@ -571,12 +583,11 @@ static void unreset_socket(u_long i) } } else { DEBUG(2, "cs: socket %ld not ready yet\n", i); - if (s->unreset_timeout > unreset_limit) { + if (++s->setup_timeout > unreset_limit) { printk(KERN_NOTICE "cs: socket %ld timed out during" " reset\n", i); s->state &= ~EVENT_MASK; } else { - s->unreset_timeout++; s->setup.expires = jiffies + unreset_check; add_timer(&s->setup); } @@ -1156,6 +1167,8 @@ struct pci_bus *pcmcia_lookup_bus(client_handle_t handle) return s->cap.cb_dev->subordinate; } +EXPORT_SYMBOL(pcmcia_lookup_bus); + #endif /*====================================================================== @@ -2188,7 +2201,7 @@ int CardServices(int func, void *a1, void *a2, void *a3) { memory_handle_t m; int ret = pcmcia_open_memory(a1, a2, &m); - (memory_handle_t *)a1 = m; + *(memory_handle_t *)a1 = m; return ret; } break; @@ -2202,7 +2215,7 @@ int CardServices(int func, void *a1, void *a2, void *a3) { eraseq_handle_t w; int ret = pcmcia_register_erase_queue(a1, a2, &w); - (eraseq_handle_t *)a1 = w; + *(eraseq_handle_t *)a1 = w; return ret; } break; @@ -2227,7 +2240,7 @@ int CardServices(int func, void *a1, void *a2, void *a3) { window_handle_t w; int ret = pcmcia_request_window(a1, a2, &w); - (window_handle_t *)a1 = w; + *(window_handle_t *)a1 = w; return ret; } break; @@ -2297,7 +2310,6 @@ EXPORT_SYMBOL(pcmcia_get_next_window); EXPORT_SYMBOL(pcmcia_get_status); EXPORT_SYMBOL(pcmcia_get_tuple_data); EXPORT_SYMBOL(pcmcia_insert_card); -EXPORT_SYMBOL(pcmcia_lookup_bus); EXPORT_SYMBOL(pcmcia_map_mem_page); EXPORT_SYMBOL(pcmcia_modify_configuration); EXPORT_SYMBOL(pcmcia_modify_window); diff --git a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h index cac2d350a..f355c337b 100644 --- a/drivers/pcmcia/cs_internal.h +++ b/drivers/pcmcia/cs_internal.h @@ -131,7 +131,7 @@ typedef struct socket_info_t { u_int real_clients; client_handle_t reset_handle; struct timer_list setup, shutdown; - u_long unreset_timeout; + u_long setup_timeout; pccard_mem_map cis_mem; u_char *cis_virt; config_t *config; diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c index 73c177d8d..18d47d9a8 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c @@ -82,9 +82,9 @@ static const char *version = static void irq_count(int, void *, struct pt_regs *); static inline int _check_irq(int irq, int flags) { - if (request_irq(irq, irq_count, flags, "x", NULL) != 0) + if (request_irq(irq, irq_count, flags, "x", irq_count) != 0) return -1; - free_irq(irq, NULL); + free_irq(irq, irq_count); return 0; } @@ -570,28 +570,26 @@ static void irq_count(int irq, void *dev, struct pt_regs *regs) DEBUG(2, "-> hit on irq %d\n", irq); } -static u_int __init test_irq(u_short sock, int irq, int pci) +static u_int __init test_irq(u_short sock, int irq) { - u_char csc = (pci) ? 0 : irq; - DEBUG(2, " testing %s irq %d\n", pci ? "PCI" : "ISA", irq); - - if (request_irq(irq, irq_count, (pci?SA_SHIRQ:0), "scan", NULL) != 0) + DEBUG(2, " testing ISA irq %d\n", irq); + if (request_irq(irq, irq_count, 0, "scan", irq_count) != 0) return 1; irq_hits = 0; irq_sock = sock; __set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ/100); if (irq_hits) { - free_irq(irq, NULL); + free_irq(irq, irq_count); DEBUG(2, " spurious hit!\n"); return 1; } /* Generate one interrupt */ - i365_set(sock, I365_CSCINT, I365_CSC_DETECT | (csc << 4)); + i365_set(sock, I365_CSCINT, I365_CSC_DETECT | (irq << 4)); i365_bset(sock, I365_GENCTL, I365_CTL_SW_IRQ); udelay(1000); - free_irq(irq, NULL); + free_irq(irq, irq_count); /* mask all interrupts */ i365_set(sock, I365_CSCINT, 0); @@ -617,10 +615,10 @@ static u_int __init isa_scan(u_short sock, u_int mask0) set_bridge_state(sock); i365_set(sock, I365_CSCINT, 0); for (i = 0; i < 16; i++) - if ((mask0 & (1 << i)) && (test_irq(sock, i, 0) == 0)) + if ((mask0 & (1 << i)) && (test_irq(sock, i) == 0)) mask1 |= (1 << i); for (i = 0; i < 16; i++) - if ((mask1 & (1 << i)) && (test_irq(sock, i, 0) != 0)) + if ((mask1 & (1 << i)) && (test_irq(sock, i) != 0)) mask1 ^= (1 << i); } @@ -1543,7 +1541,7 @@ static int __init init_i82365(void) /* Set up interrupt handler(s) */ #ifdef CONFIG_ISA if (grab_irq != 0) - request_irq(cs_irq, pcic_interrupt, 0, "i82365", NULL); + request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt); #endif if (register_ss_entry(sockets, &pcic_operations) != 0) @@ -1573,7 +1571,7 @@ static void __exit exit_i82365(void) del_timer(&poll_timer); #ifdef CONFIG_ISA if (grab_irq != 0) - free_irq(cs_irq, NULL); + free_irq(cs_irq, pcic_interrupt); #endif for (i = 0; i < sockets; i++) { /* Turn off all interrupt sources! */ diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c index ff25ac893..8939ea9f6 100644 --- a/drivers/pcmcia/tcic.c +++ b/drivers/pcmcia/tcic.c @@ -2,7 +2,7 @@ Device driver for Databook TCIC-2 PCMCIA controller - tcic.c 1.108 1999/12/09 20:17:29 + tcic.c 1.111 2000/02/15 04:13:12 The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file @@ -60,7 +60,7 @@ static int pc_debug = PCMCIA_DEBUG; MODULE_PARM(pc_debug, "i"); static const char *version = -"tcic.c 1.108 1999/12/09 20:17:29 (David Hinds)"; +"tcic.c 1.111 2000/02/15 04:13:12 (David Hinds)"; #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) #else #define DEBUG(n, args...) @@ -243,11 +243,11 @@ static u_int __init try_irq(int irq) u_short cfg; irq_hits = 0; - if (request_irq(irq, irq_count, 0, "irq scan", NULL) != 0) + if (request_irq(irq, irq_count, 0, "irq scan", irq_count) != 0) return -1; mdelay(10); if (irq_hits) { - free_irq(irq, NULL); + free_irq(irq, irq_count); return -1; } @@ -258,7 +258,7 @@ static u_int __init try_irq(int irq) tcic_setb(TCIC_ICSR, TCIC_ICSR_ERR | TCIC_ICSR_JAM); udelay(1000); - free_irq(irq, NULL); + free_irq(irq, irq_count); /* Turn off interrupts */ tcic_setb(TCIC_IENA, TCIC_IENA_CFG_OFF); @@ -299,9 +299,9 @@ static u_int __init irq_scan(u_int mask0) /* Fallback: just find interrupts that aren't in use */ for (i = 0; i < 16; i++) if ((mask0 & (1 << i)) && - (request_irq(i, irq_count, 0, "x", NULL) == 0)) { + (request_irq(i, irq_count, 0, "x", irq_count) == 0)) { mask1 |= (1 << i); - free_irq(i, NULL); + free_irq(i, irq_count); } printk("default"); } @@ -475,7 +475,8 @@ static int __init init_tcic(void) u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12)); for (i = 15; i > 0; i--) if ((cs_mask & (1 << i)) && - (request_irq(i, tcic_interrupt, 0, "tcic", NULL) == 0)) + (request_irq(i, tcic_interrupt, 0, "tcic", + tcic_interrupt) == 0)) break; cs_irq = i; if (cs_irq == 0) poll_interval = HZ; @@ -501,7 +502,7 @@ static int __init init_tcic(void) printk(KERN_NOTICE "tcic: register_ss_entry() failed\n"); release_region(tcic_base, 16); if (cs_irq != 0) - free_irq(cs_irq, NULL); + free_irq(cs_irq, tcic_interrupt); return -ENODEV; } @@ -519,7 +520,7 @@ static void __exit exit_tcic(void) cli(); if (cs_irq != 0) { tcic_aux_setw(TCIC_AUX_SYSCFG, TCIC_SYSCFG_AUTOBUSY|0x0a00); - free_irq(cs_irq, NULL); + free_irq(cs_irq, tcic_interrupt); } if (tcic_timer_pending) del_timer(&poll_timer); |