[PATCH] yenta: no CardBus if IRQ fails
authorRussell King <rmk+pcmcia@arm.linux.org.uk>
Fri, 8 Jul 2005 00:59:07 +0000 (17:59 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 8 Jul 2005 01:24:07 +0000 (18:24 -0700)
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 <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/pcmcia/cs.c
drivers/pcmcia/yenta_socket.c

index 4d1cc5304e173d814ced277746b77bc95e712aec..e39178fc59d08efb74efe4eaf1e8ba80a6fbdace 100644 (file)
@@ -215,6 +215,13 @@ int pcmcia_register_socket(struct pcmcia_socket *socket)
        list_add_tail(&socket->socket_list, &pcmcia_socket_list);
        up_write(&pcmcia_socket_list_rwsem);
 
+#ifndef CONFIG_CARDBUS
+       /*
+        * If we do not support Cardbus, ensure that
+        * the Cardbus socket capability is disabled.
+        */
+       socket->features &= ~SS_CAP_CARDBUS;
+#endif
 
        /* set proper values in socket->dev */
        socket->dev.class_data = socket;
@@ -448,11 +455,11 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
        }
 
        if (status & SS_CARDBUS) {
+               if (!(skt->features & SS_CAP_CARDBUS)) {
+                       cs_err(skt, "cardbus cards are not supported.\n");
+                       return CS_BAD_TYPE;
+               }
                skt->state |= SOCKET_CARDBUS;
-#ifndef CONFIG_CARDBUS
-               cs_err(skt, "cardbus cards are not supported.\n");
-               return CS_BAD_TYPE;
-#endif
        }
 
        /*
index 1d593e1dc3d9a47dd38f97322ab90ebb5e5b8e73..0e7aa8176692f1aa60f5dc874af8a6afde17d740 100644 (file)
@@ -868,14 +868,11 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket)
  */
 static void yenta_get_socket_capabilities(struct yenta_socket *socket, u32 isa_irq_mask)
 {
-       socket->socket.features |= SS_CAP_PAGE_REGS | SS_CAP_PCCARD | SS_CAP_CARDBUS;
-       socket->socket.map_size = 0x1000;
        socket->socket.pci_irq = socket->cb_irq;
        if (isa_probe)
                socket->socket.irq_mask = yenta_probe_irq(socket, isa_irq_mask);
        else
                socket->socket.irq_mask = 0;
-       socket->socket.cb_dev = socket->dev;
 
        printk(KERN_INFO "Yenta: ISA IRQ mask 0x%04x, PCI irq %d\n",
               socket->socket.irq_mask, socket->cb_irq);
@@ -941,6 +938,9 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
        socket->socket.dev.dev = &dev->dev;
        socket->socket.driver_data = socket;
        socket->socket.owner = THIS_MODULE;
+       socket->socket.features = SS_CAP_PAGE_REGS | SS_CAP_PCCARD;
+       socket->socket.map_size = 0x1000;
+       socket->socket.cb_dev = dev;
 
        /* prepare struct yenta_socket */
        socket->dev = dev;
@@ -1011,6 +1011,10 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
                socket->poll_timer.data = (unsigned long)socket;
                socket->poll_timer.expires = jiffies + HZ;
                add_timer(&socket->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->socket.features |= SS_CAP_CARDBUS;
        }
 
        /* Figure out what the dang thing can do for the PCMCIA layer... */