|
From: Kenn H. <ke...@us...> - 2004-08-15 22:22:53
|
Update of /cvsroot/linux-vax/kernel-2.5/drivers/scsi In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4736/drivers/scsi Modified Files: NCR5380.c Log Message: Apply the locking bits of this patch http://marc.theaimsgroup.com/?l=linux-scsi&m=109250314410187&w=2 Index: NCR5380.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.5/drivers/scsi/NCR5380.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- NCR5380.c 14 Aug 2004 00:53:58 -0000 1.4 +++ NCR5380.c 15 Aug 2004 22:22:44 -0000 1.5 @@ -28,6 +28,11 @@ /* * $Log$ + * Revision 1.5 2004/08/15 22:22:44 kenn + * Apply the locking bits of this patch + * + * http://marc.theaimsgroup.com/?l=linux-scsi&m=109250314410187&w=2 + * * Revision 1.4 2004/08/14 00:53:58 kenn * Fix two compiler warnings about unused code * @@ -1204,7 +1209,6 @@ Scsi_Cmnd *tmp, *prev; struct Scsi_Host *instance; int done; - unsigned long flags = 0; /* * We run (with interrupts disabled) until we're sure that none of @@ -1220,8 +1224,7 @@ instance = hostdata->host; - if(instance->irq != SCSI_IRQ_NONE) - spin_lock_irqsave(instance->host_lock, flags); + spin_lock_irq(instance->host_lock); do { /* Lock held here */ @@ -1321,8 +1324,7 @@ break; } while (!done); - if(instance->irq != SCSI_IRQ_NONE) - spin_unlock_irqrestore(instance->host_lock, flags); + spin_unlock_irq(instance->host_lock); } #ifndef DONT_USE_INTR @@ -1347,12 +1349,13 @@ struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata; int done; unsigned char basr; + unsigned long flags; dprintk(NDEBUG_INTR, ("scsi : NCR5380 irq %d triggered\n", irq)); do { done = 1; - spin_lock_irq(instance->host_lock); + spin_lock_irqsave(instance->host_lock, flags); /* Look for pending interrupts */ NCR5380_setup(instance); basr = NCR5380_read(BUS_AND_STATUS_REG); @@ -1403,7 +1406,7 @@ #endif } } /* if BASR_IRQ */ - spin_unlock_irq(instance->host_lock); + spin_unlock_irqrestore(instance->host_lock, flags); if(!done) schedule_work(&hostdata->coroutine); } while (!done); @@ -1486,12 +1489,8 @@ int err; NCR5380_setup(instance); - if (hostdata->selecting) { - if(instance->irq != SCSI_IRQ_NONE) - spin_unlock_irq(instance->host_lock); - goto part2; /* RvC: sorry prof. Dijkstra, but it keeps the - rest of the code nearly the same */ - } + if (hostdata->selecting) + goto part2; hostdata->restart_select = 0; @@ -1512,15 +1511,14 @@ NCR5380_write(OUTPUT_DATA_REG, hostdata->id_mask); NCR5380_write(MODE_REG, MR_ARBITRATE); - if(instance->irq != SCSI_IRQ_NONE) - spin_unlock_irq(instance->host_lock); /* We can be relaxed here, interrupts are on, we are in workqueue context, the birds are singing in the trees */ + spin_unlock_irq(instance->host_lock); err = NCR5380_poll_politely(instance, INITIATOR_COMMAND_REG, ICR_ARBITRATION_PROGRESS, ICR_ARBITRATION_PROGRESS, 5*HZ); - if(instance->irq != SCSI_IRQ_NONE) - spin_lock_irq(instance->host_lock); + + spin_lock_irq(instance->host_lock); if (err < 0) { printk(KERN_DEBUG "scsi: arbitration timeout at %d\n", __LINE__); @@ -1636,10 +1634,6 @@ hostdata->select_time = 0; /* we count the clock ticks at which we polled */ hostdata->selecting = cmd; - /* We always expect the lock to be released at part2: */ - if(instance->irq != SCSI_IRQ_NONE) - spin_unlock_irq(instance->host_lock); - part2: /* RvC: here we enter after a sleeping period, or immediately after execution of part 1 @@ -1648,8 +1642,6 @@ if (!value && (hostdata->select_time < HZ/4)) { /* RvC: we still must wait for a device response */ - if(instance->irq != SCSI_IRQ_NONE) - spin_lock_irq(instance->host_lock); hostdata->select_time++; /* after 25 ticks the device has failed */ hostdata->time_expires = jiffies + 1; NCR5380_set_timer(instance); @@ -1661,8 +1653,6 @@ waiting period */ if ((NCR5380_read(STATUS_REG) & (SR_SEL | SR_IO)) == (SR_SEL | SR_IO)) { NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - if(instance->irq != SCSI_IRQ_NONE) - spin_lock_irq(instance->host_lock); NCR5380_reselect(instance); printk("scsi%d : reselection after won arbitration?\n", instance->host_no); NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); @@ -1680,8 +1670,6 @@ if (!(NCR5380_read(STATUS_REG) & SR_BSY)) { NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - if(instance->irq != SCSI_IRQ_NONE) - spin_lock_irq(instance->host_lock); if (hostdata->targets_present & (1 << cmd->device->id)) { printk(KERN_DEBUG "scsi%d : weirdness\n", instance->host_no); if (hostdata->restart_select) @@ -1717,10 +1705,12 @@ /* Wait for start of REQ/ACK handshake */ + spin_unlock_irq(instance->host_lock); err = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ); + spin_lock_irq(instance->host_lock); - if(err) - { printk(KERN_ERR "scsi%d: timeout at NCR5380.c:%d\n", instance->host_no, __LINE__); + if(err) { + printk(KERN_ERR "scsi%d: timeout at NCR5380.c:%d\n", instance->host_no, __LINE__); NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); goto failed; } @@ -1728,9 +1718,6 @@ dprintk(NDEBUG_SELECTION, ("scsi%d : target %d selected, going into MESSAGE OUT phase.\n", instance->host_no, cmd->device->id)); tmp[0] = IDENTIFY(((instance->irq == SCSI_IRQ_NONE) ? 0 : 1), cmd->device->lun); - if(instance->irq != SCSI_IRQ_NONE) - spin_lock_irq(instance->host_lock); - len = 1; cmd->tag = 0; @@ -1751,8 +1738,6 @@ /* Selection failed */ failed: - if(instance->irq != SCSI_IRQ_NONE) - spin_lock_irq(instance->host_lock); return -1; } |