From: Russell King 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 Signed-off-by: Dominik Brodowski Signed-off-by: Andrew Morton --- 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(&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_so } 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 } /* 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->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); @@ -1024,6 +1021,9 @@ static int __devinit yenta_probe (struct 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; @@ -1094,6 +1094,10 @@ static int __devinit yenta_probe (struct 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... */ _