diff -ur /opt/kernel/linux-2.4.15-pre4/drivers/scsi/sym53c8xx_2/sym_glue.c drivers/scsi/sym53c8xx_2/sym_glue.c
--- /opt/kernel/linux-2.4.15-pre4/drivers/scsi/sym53c8xx_2/sym_glue.c	Tue Nov 13 08:53:29 2001
+++ drivers/scsi/sym53c8xx_2/sym_glue.c	Wed Nov 14 11:06:25 2001
@@ -959,6 +959,20 @@
 	}
 }
 
+static void sym_requeue(unsigned long arg)
+{
+	unsigned long flags, flags1;
+	hcb_p np = (hcb_p) arg;
+
+	SYM_LOCK_SCSI(np, flags1);
+	SYM_LOCK_HCB(np, flags);
+
+	sym_requeue_awaiting_cmds(np);
+
+	SYM_UNLOCK_HCB(np, flags);
+	SYM_UNLOCK_SCSI(np, flags1);
+}
+
 /*
  *  Linux entry point of the queuecommand() function
  */
@@ -1021,7 +1035,7 @@
 	sym_interrupt(np);
 
 	if (!sym_que_empty(&np->s.wait_cmdq) && !np->s.settle_time_valid)
-		sym_requeue_awaiting_cmds(np);
+		tasklet_schedule(&np->s.task_queue);
 
 	SYM_UNLOCK_HCB(np, flags);
 	SYM_UNLOCK_SCSI(np, flags1);
@@ -1994,6 +2008,8 @@
 	np->maxoffs	= dev->chip.offset_max;
 	np->maxburst	= dev->chip.burst_max;
 	np->myaddr	= dev->host_id;
+
+	tasklet_init(&np->s.task_queue, sym_requeue, (unsigned long) np);
 
 	/*
 	 *  Edit its name.
diff -ur /opt/kernel/linux-2.4.15-pre4/drivers/scsi/sym53c8xx_2/sym_glue.h drivers/scsi/sym53c8xx_2/sym_glue.h
--- /opt/kernel/linux-2.4.15-pre4/drivers/scsi/sym53c8xx_2/sym_glue.h	Tue Nov 13 08:53:29 2001
+++ drivers/scsi/sym53c8xx_2/sym_glue.h	Wed Nov 14 11:06:59 2001
@@ -77,12 +77,13 @@
 #include <linux/errno.h>
 #include <linux/pci.h>
 #include <linux/string.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/mm.h>
 #include <linux/ioport.h>
 #include <linux/time.h>
 #include <linux/timer.h>
 #include <linux/stat.h>
+#include <linux/interrupt.h>
 
 #include <linux/blk.h>
 
@@ -455,6 +456,8 @@
 	char		inst_name[16];
 	char		chip_name[8];
 	struct pci_dev	*device;
+
+	struct tasklet_struct task_queue;
 
 	u_char		bus;		/* PCI BUS number		*/
 	u_char		device_fn;	/* PCI BUS device and function	*/