[patches 3/8] pcmcia: ignore driver IRQ mask
Dominik Brodowski
linux at dominikbrodowski.de
Tue Jan 11 11:58:37 EST 2005
As its just one pin which can be used for IRQs on PCMCIA/CardBus cards,
and only the _socket drivers_ care with which IRQ this pin is connected,
only the socket drivers (assisted by the PCCARD core) should care about which
IRQ to use. Therefore, ignore the information passed to pcmcia_request_irq()
in IRQInfo2. In additional patches, all in-kernel users of IRQInfo2 will
be removed; users wishing to influence the usage of IRQs can do so by modifying
several driver's irq_mask parameter and/or by adding "exclude irq 3" to
/etc/pcmcia/config.opts. Note that a new sysfs-based interface to do so
will be added in subsequent patches.
Signed-off-by: Dominik Brodowski <linux at brodo.de>
---
drivers/pcmcia/cs.c | 37 +++++++++++++++----------------------
include/pcmcia/cs.h | 2 +-
2 files changed, 16 insertions(+), 23 deletions(-)
Index: 2.6.10/drivers/pcmcia/cs.c
===================================================================
--- 2.6.10.orig/drivers/pcmcia/cs.c 2004-12-27 18:03:08.000000000 +0100
+++ 2.6.10/drivers/pcmcia/cs.c 2004-12-29 11:25:54.081315266 +0100
@@ -1551,30 +1551,23 @@
return CS_IN_USE;
#ifdef CONFIG_PCMCIA_PROBE
- if (s->irq.AssignedIRQ != 0) {
- /* If the interrupt is already assigned, it must match */
- irq = s->irq.AssignedIRQ;
- if (req->IRQInfo1 & IRQ_INFO2_VALID) {
- u_int mask = req->IRQInfo2 & s->irq_mask;
- ret = ((mask >> irq) & 1) ? 0 : CS_BAD_ARGS;
- } else
- ret = ((req->IRQInfo1&IRQ_MASK) == irq) ? 0 : CS_BAD_ARGS;
- } else {
- if (req->IRQInfo1 & IRQ_INFO2_VALID) {
- u_int try, mask = req->IRQInfo2 & s->irq_mask;
- for (try = 0; try < 2; try++) {
- for (irq = 0; irq < 32; irq++)
- if ((mask >> irq) & 1) {
- ret = try_irq(req->Attributes, irq, try);
- if (ret == 0) break;
- }
- if (ret == 0) break;
- }
+ if (s->irq.AssignedIRQ != 0) {
+ /* If the interrupt is already assigned, it must be the same */
+ irq = s->irq.AssignedIRQ;
} else {
- irq = req->IRQInfo1 & IRQ_MASK;
- ret = try_irq(req->Attributes, irq, 1);
+ u_int try, mask = s->irq_mask;
+ for (try = 0; try < 2; try++) {
+ for (irq = 0; irq < 32; irq++) {
+ if ((mask >> irq) & 1) {
+ ret = try_irq(req->Attributes, irq, try);
+ if (!ret)
+ break;
+ }
+ }
+ if (!ret)
+ break;
+ }
}
- }
#endif
if (ret != 0) {
if (!s->pci_irq)
Index: 2.6.10/include/pcmcia/cs.h
===================================================================
--- 2.6.10.orig/include/pcmcia/cs.h 2004-12-27 18:03:07.000000000 +0100
+++ 2.6.10/include/pcmcia/cs.h 2004-12-29 11:25:46.878328344 +0100
@@ -191,7 +191,7 @@
typedef struct irq_req_t {
u_int Attributes;
u_int AssignedIRQ;
- u_int IRQInfo1, IRQInfo2;
+ u_int IRQInfo1, IRQInfo2; /* IRQInfo2 is ignored */
void *Handler;
void *Instance;
} irq_req_t;
More information about the linux-pcmcia
mailing list