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 #include #include -#include +#include #include #include #include #include #include +#include #include @@ -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 */