summaryrefslogtreecommitdiffstats
path: root/drivers/pcmcia/i82365.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pcmcia/i82365.c')
-rw-r--r--drivers/pcmcia/i82365.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c
index ed7bd3c30..685e65fe9 100644
--- a/drivers/pcmcia/i82365.c
+++ b/drivers/pcmcia/i82365.c
@@ -3,7 +3,7 @@
Device driver for Intel 82365 and compatible PC Card controllers,
and Yenta-compatible PCI-to-CardBus controllers.
- i82365.c 1.260 1999/10/21 00:56:07
+ i82365.c 1.265 1999/11/10 18:36:21
The contents of this file are subject to the Mozilla Public
License Version 1.1 (the "License"); you may not use this file
@@ -16,7 +16,7 @@
rights and limitations under the License.
The initial developer of the original code is David A. Hinds
- <dhinds@hyper.stanford.edu>. Portions created by David A. Hinds
+ <dhinds@pcmcia.sourceforge.org>. Portions created by David A. Hinds
are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
Alternatively, the contents of this file may be used under the
@@ -76,7 +76,7 @@ static int pc_debug = PCMCIA_DEBUG;
MODULE_PARM(pc_debug, "i");
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
static const char *version =
-"i82365.c 1.260 1999/10/21 00:56:07 (David Hinds)";
+"i82365.c 1.265 1999/11/10 18:36:21 (David Hinds)";
#else
#define DEBUG(n, args...) do { } while (0)
#endif
@@ -189,7 +189,7 @@ MODULE_PARM(cb_write_post, "i");
#ifdef CONFIG_ISA
#ifdef CONFIG_PCI
/* PCI card status change interrupts? */
-static int pci_csc = 1;
+static int pci_csc = 0;
/* PCI IO card functional interrupts? */
static int pci_int = 0;
MODULE_PARM(pci_csc, "i");
@@ -903,7 +903,8 @@ static void o2micro_get_state(u_short s)
{
socket_info_t *t = &socket[s];
o2micro_state_t *p = &socket[s].state.o2micro;
- if ((t->revision == 0x34) || (t->revision == 0x62)) {
+ if ((t->revision == 0x34) || (t->revision == 0x62) ||
+ (t->type == IS_OZ6812)) {
p->mode_a = i365_get(s, O2_MODE_A_2);
p->mode_b = i365_get(s, O2_MODE_B_2);
} else {
@@ -923,7 +924,8 @@ static void o2micro_set_state(u_short s)
{
socket_info_t *t = &socket[s];
o2micro_state_t *p = &socket[s].state.o2micro;
- if ((t->revision == 0x34) || (t->revision == 0x62)) {
+ if ((t->revision == 0x34) || (t->revision == 0x62) ||
+ (t->type == IS_OZ6812)) {
i365_set(s, O2_MODE_A_2, p->mode_a);
i365_set(s, O2_MODE_B_2, p->mode_b);
} else {
@@ -1007,6 +1009,7 @@ static int topic_set_irq_mode(u_short s, int pcsc, int pint)
flip(p->ccr, TOPIC97_ICR_IRQSEL, pcsc);
return 0;
} else {
+ /* no ISA card status change irq */
return !pcsc;
}
}
@@ -1541,7 +1544,8 @@ static void __init add_pcic(int ns, int type)
#ifdef CONFIG_ISA
/* Poll if only two interrupts available */
if (!use_pci && !poll_interval) {
- u_int tmp = (mask & (mask-1));
+ u_int tmp = (mask & 0xff20);
+ tmp = tmp & (tmp-1);
if ((tmp & (tmp-1)) == 0)
poll_interval = HZ;
}
@@ -1627,7 +1631,7 @@ static void __init add_cb_bridge(int type, u_char bus, u_char devfn,
u_short v, u_short d0)
{
socket_info_t *s = &socket[sockets];
- u_short d, ns;
+ u_short d, ns, i;
u_char a, b, r, max;
/* PCI bus enumeration is broken on some systems */
@@ -1666,7 +1670,6 @@ static void __init add_cb_bridge(int type, u_char bus, u_char devfn,
pci_writel(bus, devfn, CB_LEGACY_MODE_BASE, 0);
pci_readl(bus, devfn, PCI_BASE_ADDRESS_0, &s->cb_phys);
if (s->cb_phys == 0) {
- int i;
pci_writew(bus, devfn, PCI_COMMAND, CMD_DFLT);
for (i = 0; i < sizeof(cb_mem_base)/sizeof(u_int); i++) {
s->cb_phys = cb_mem_base[i];
@@ -1710,10 +1713,21 @@ static void __init add_cb_bridge(int type, u_char bus, u_char devfn,
}
add_pcic(ns, type);
- /* Re-do card type & voltage detection */
- cb_writel(sockets-ns, CB_SOCKET_FORCE, CB_SF_CVSTEST);
- __set_current_state(TASK_UNINTERRUPTIBLE);
- schedule_timeout(HZ/5);
+ /* Re-do card voltage detection, if needed: this checks for
+ card presence with no voltage detect bits set */
+ for (a = sockets-ns; a < sockets; a++)
+ if (!(cb_readl(a, CB_SOCKET_STATE) & 0x3c86))
+ cb_writel(a, CB_SOCKET_FORCE, CB_SF_CVSTEST);
+ for (i = 0; i < 200; i++) {
+ for (a = sockets-ns; a < sockets; a++)
+ if (!(cb_readl(a, CB_SOCKET_STATE) & 0x3c86)) break;
+ if (a == sockets) break;
+ __set_current_state(TASK_UNINTERRUPTIBLE);
+ schedule_timeout(HZ/20);
+ }
+ if (i == 200)
+ printk(KERN_NOTICE "i82365: card voltage interrogation"
+ " timed out!\n");
/* Set up PCI bus bridge structures if needed */
for (a = 0; a < ns; a++) {