patch-2.4.0-test11 linux/drivers/pcmcia/tcic.c
Next file: linux/drivers/pcmcia/yenta.c
Previous file: linux/drivers/pcmcia/pci_socket.h
Back to the patch index
Back to the overall index
- Lines: 44
- Date:
Thu Nov 16 16:38:16 2000
- Orig file:
v2.4.0-test10/linux/drivers/pcmcia/tcic.c
- Orig date:
Tue May 2 17:38:58 2000
diff -u --recursive --new-file v2.4.0-test10/linux/drivers/pcmcia/tcic.c linux/drivers/pcmcia/tcic.c
@@ -530,6 +530,28 @@
/*====================================================================*/
+static u_int pending_events[2];
+static spinlock_t pending_event_lock = SPIN_LOCK_UNLOCKED;
+
+static void tcic_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_table[i].handler)
+ socket_table[i].handler(socket_table[i].info, events);
+ }
+}
+
+static struct tq_struct tcic_task = {
+ routine: tcic_bh
+};
+
static void tcic_interrupt(int irq, void *dev, struct pt_regs *regs)
{
int i, quick = 0;
@@ -568,8 +590,12 @@
events |= (latch & TCIC_SSTAT_LBAT1) ? SS_BATDEAD : 0;
events |= (latch & TCIC_SSTAT_LBAT2) ? SS_BATWARN : 0;
}
- if (events)
- socket_table[i].handler(socket_table[i].info, events);
+ if (events) {
+ spin_lock(&pending_event_lock);
+ pending_events[i] |= events;
+ spin_unlock(&pending_event_lock);
+ schedule_task(&tcic_task);
+ }
}
/* Schedule next poll, if needed */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)