===================================================================
@@ -777,8 +777,7 @@ static void lprint_opcode(int opcode, st
static int NCR5380_init(struct Scsi_Host *instance, int flags)
{
- int i, pass;
- unsigned long timeout;
+ int i;
struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
if(in_interrupt())
@@ -831,18 +830,26 @@ static int NCR5380_init(struct Scsi_Host
NCR5380_write(C400_CONTROL_STATUS_REG, CSR_BASE);
}
#endif
+ return 0;
+}
- /*
- * Detect and correct bus wedge problems.
- *
- * If the system crashed, it may have crashed in a state
- * where a SCSI command was still executing, and the
- * SCSI bus is not in a BUS FREE STATE.
- *
- * If this is the case, we'll try to abort the currently
- * established nexus which we know nothing about, and that
- * failing, do a hard reset of the SCSI bus
- */
+/**
+ * NCR5380_maybe_reset_bus - Detect and correct bus wedge problems.
+ * @instance: adapter to check
+ *
+ * If the system crashed, it may have crashed with a connected target and
+ * the SCSI bus busy. Check for BUS FREE phase. If not, try to abort the
+ * currently established nexus, which we know nothing about. Failing that
+ * do a bus reset.
+ *
+ * Note that a bus reset will cause the chip to assert IRQ.
+ *
+ * Returns 0 if successful, otherwise -ENXIO.
+ */
+
+static int NCR5380_maybe_reset_bus(struct Scsi_Host *instance)
+{
+ int pass;
for (pass = 1; (NCR5380_read(STATUS_REG) & SR_BSY) && pass <= 6; ++pass) {
switch (pass) {
@@ -850,7 +857,6 @@ static int NCR5380_init(struct Scsi_Host
case 3:
case 5:
printk(KERN_INFO "scsi%d: SCSI bus busy, waiting up to five seconds\n", instance->host_no);
- timeout = jiffies + 5 * HZ;
NCR5380_poll_politely(instance, STATUS_REG, SR_BSY, 0, 5*HZ);
break;
case 2:
===================================================================
@@ -318,6 +318,7 @@ static void NCR5380_print(struct Scsi_Ho
static int NCR5380_probe_irq(struct Scsi_Host *instance, int possible);
#endif
static int NCR5380_init(struct Scsi_Host *instance, int flags);
+static int NCR5380_maybe_reset_bus(struct Scsi_Host *);
static void NCR5380_exit(struct Scsi_Host *instance);
static void NCR5380_information_transfer(struct Scsi_Host *instance);
#ifndef DONT_USE_INTR
===================================================================
@@ -240,6 +240,8 @@ static int cumanascsi1_probe(struct expa
NCR5380_init(host, 0);
+ NCR5380_maybe_reset_bus(host);
+
priv(host)->ctrl = 0;
writeb(0, priv(host)->base + CTRL);
===================================================================
@@ -145,6 +145,8 @@ static int oakscsi_probe(struct expansio
NCR5380_init(host, 0);
+ NCR5380_maybe_reset_bus(host);
+
ret = scsi_add_host(host, &ec->dev);
if (ret)
goto out_unmap;
===================================================================
@@ -97,6 +97,8 @@ static int dmx3191d_probe_one(struct pci
NCR5380_init(shost, FLAG_NO_PSEUDO_DMA | FLAG_DTC3181E);
+ NCR5380_maybe_reset_bus(shost);
+
pci_set_drvdata(pdev, shost);
error = scsi_add_host(shost, &pdev->dev);
===================================================================
@@ -237,6 +237,8 @@ found:
NCR5380_init(instance, 0);
+ NCR5380_maybe_reset_bus(instance);
+
NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR); /* Enable int's */
if (overrides[current_override].irq != IRQ_AUTO)
instance->irq = overrides[current_override].irq;
===================================================================
@@ -422,6 +422,8 @@ static int __init generic_NCR5380_detect
NCR5380_init(instance, flags);
+ NCR5380_maybe_reset_bus(instance);
+
if (overrides[current_override].irq != IRQ_AUTO)
instance->irq = overrides[current_override].irq;
else
===================================================================
@@ -384,6 +384,8 @@ static int __init pas16_detect(struct sc
NCR5380_init(instance, 0);
+ NCR5380_maybe_reset_bus(instance);
+
if (overrides[current_override].irq != IRQ_AUTO)
instance->irq = overrides[current_override].irq;
else
===================================================================
@@ -215,6 +215,8 @@ found:
NCR5380_init(instance, 0);
+ NCR5380_maybe_reset_bus(instance);
+
if (overrides[current_override].irq != IRQ_AUTO)
instance->irq = overrides[current_override].irq;
else