<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Russell King &lt;rmk+pcmcia@arm.linux.org.uk&gt;

If probing for the correct interrupt fails on yenta bridges, the driver falls
back to polling for interrupt actions.  However, CardBus cards cannot be used
then.

Signed-off-by: Russell King &lt;rmk+kernel@arm.linux.org.uk&gt;
Signed-off-by: Dominik Brodowski &lt;linux@dominikbrodowski.net&gt;
Signed-off-by: Andrew Morton &lt;akpm@osdl.org&gt;
---

 drivers/pcmcia/cs.c           |   15 +++++++++++----
 drivers/pcmcia/yenta_socket.c |   10 +++++++---
 2 files changed, 18 insertions(+), 7 deletions(-)

diff -puN drivers/pcmcia/cs.c~yenta-no-cardbus-if-irq-fails drivers/pcmcia/cs.c
--- devel/drivers/pcmcia/cs.c~yenta-no-cardbus-if-irq-fails	2005-07-06 01:15:43.000000000 -0700
+++ devel-akpm/drivers/pcmcia/cs.c	2005-07-06 01:15:43.000000000 -0700
@@ -215,6 +215,13 @@ int pcmcia_register_socket(struct pcmcia
 	list_add_tail(&amp;socket-&gt;socket_list, &amp;pcmcia_socket_list);
 	up_write(&amp;pcmcia_socket_list_rwsem);
 
+#ifndef CONFIG_CARDBUS
+	/*
+	 * If we do not support Cardbus, ensure that
+	 * the Cardbus socket capability is disabled.
+	 */
+	socket-&gt;features &amp;= ~SS_CAP_CARDBUS;
+#endif
 
 	/* set proper values in socket-&gt;dev */
 	socket-&gt;dev.class_data = socket;
@@ -448,11 +455,11 @@ static int socket_setup(struct pcmcia_so
 	}
 
 	if (status &amp; SS_CARDBUS) {
+		if (!(skt-&gt;features &amp; SS_CAP_CARDBUS)) {
+			cs_err(skt, "cardbus cards are not supported.\n");
+			return CS_BAD_TYPE;
+		}
 		skt-&gt;state |= SOCKET_CARDBUS;
-#ifndef CONFIG_CARDBUS
-		cs_err(skt, "cardbus cards are not supported.\n");
-		return CS_BAD_TYPE;
-#endif
 	}
 
 	/*
diff -puN drivers/pcmcia/yenta_socket.c~yenta-no-cardbus-if-irq-fails drivers/pcmcia/yenta_socket.c
--- devel/drivers/pcmcia/yenta_socket.c~yenta-no-cardbus-if-irq-fails	2005-07-06 01:15:43.000000000 -0700
+++ devel-akpm/drivers/pcmcia/yenta_socket.c	2005-07-06 01:15:43.000000000 -0700
@@ -951,14 +951,11 @@ static int yenta_probe_cb_irq(struct yen
  */
 static void yenta_get_socket_capabilities(struct yenta_socket *socket, u32 isa_irq_mask)
 {
-	socket-&gt;socket.features |= SS_CAP_PAGE_REGS | SS_CAP_PCCARD | SS_CAP_CARDBUS;
-	socket-&gt;socket.map_size = 0x1000;
 	socket-&gt;socket.pci_irq = socket-&gt;cb_irq;
 	if (isa_probe)
 		socket-&gt;socket.irq_mask = yenta_probe_irq(socket, isa_irq_mask);
 	else
 		socket-&gt;socket.irq_mask = 0;
-	socket-&gt;socket.cb_dev = socket-&gt;dev;
 
 	printk(KERN_INFO "Yenta: ISA IRQ mask 0x%04x, PCI irq %d\n",
 	       socket-&gt;socket.irq_mask, socket-&gt;cb_irq);
@@ -1024,6 +1021,9 @@ static int __devinit yenta_probe (struct
 	socket-&gt;socket.dev.dev = &amp;dev-&gt;dev;
 	socket-&gt;socket.driver_data = socket;
 	socket-&gt;socket.owner = THIS_MODULE;
+	socket-&gt;socket.features = SS_CAP_PAGE_REGS | SS_CAP_PCCARD;
+	socket-&gt;socket.map_size = 0x1000;
+	socket-&gt;socket.cb_dev = dev;
 
 	/* prepare struct yenta_socket */
 	socket-&gt;dev = dev;
@@ -1094,6 +1094,10 @@ static int __devinit yenta_probe (struct
 		socket-&gt;poll_timer.data = (unsigned long)socket;
 		socket-&gt;poll_timer.expires = jiffies + HZ;
 		add_timer(&amp;socket-&gt;poll_timer);
+		printk(KERN_INFO "Yenta: no PCI IRQ, CardBus support disabled for this socket.\n"
+		       KERN_INFO "Yenta: check your BIOS CardBus, BIOS IRQ or ACPI settings.\n");
+	} else {
+		socket-&gt;socket.features |= SS_CAP_CARDBUS;
 	}
 
 	/* Figure out what the dang thing can do for the PCMCIA layer... */
_
</pre></body></html>