patch-2.4.0-test11 linux/drivers/pcmcia/i82365.c
Next file: linux/drivers/pcmcia/pci_socket.c
Previous file: linux/drivers/pcmcia/cs.c
Back to the patch index
Back to the overall index
- Lines: 45
- Date:
Thu Nov 16 16:38:16 2000
- Orig file:
v2.4.0-test10/linux/drivers/pcmcia/i82365.c
- Orig date:
Wed May 3 01:45:17 2000
diff -u --recursive --new-file v2.4.0-test10/linux/drivers/pcmcia/i82365.c linux/drivers/pcmcia/i82365.c
@@ -859,6 +859,28 @@
/*====================================================================*/
+static u_int pending_events[8];
+static spinlock_t pending_event_lock = SPIN_LOCK_UNLOCKED;
+
+static void pcic_bh(void *dummy)
+{
+ u_int events;
+ int i;
+
+ for (i=0; i < sockets; i++) {
+ spin_lock_irq(&pending_event_lock);
+ events = pending_events[i];
+ pending_events[i] = 0;
+ spin_unlock_irq(&pending_event_lock);
+ if (socket[i].handler)
+ socket[i].handler(socket[i].info, events);
+ }
+}
+
+static struct tq_struct pcic_task = {
+ routine: pcic_bh
+};
+
static void pcic_interrupt(int irq, void *dev,
struct pt_regs *regs)
{
@@ -893,8 +915,13 @@
}
ISA_UNLOCK(i, flags);
DEBUG(2, "i82365: socket %d event 0x%02x\n", i, events);
- if (events)
- socket[i].handler(socket[i].info, events);
+
+ if (events) {
+ spin_lock(&pending_event_lock);
+ pending_events[i] |= events;
+ spin_unlock(&pending_event_lock);
+ schedule_task(&pcic_task);
+ }
active |= events;
}
if (!active) break;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)