summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aha1542.c
diff options
context:
space:
mode:
authorOndrej Zary <linux@rainbow-software.org>2015-02-06 23:11:37 +0100
committerJames Bottomley <JBottomley@Odin.com>2015-04-09 18:07:42 -0700
commit8537cba8b6e14ff86f088dd71592090606c97050 (patch)
tree868c23f351d6430f1c1762e1cf94ebbd67680824 /drivers/scsi/aha1542.c
parentdfd7c991f31261fb4fb14adf0479206b178d270d (diff)
downloadlinux-stable-8537cba8b6e14ff86f088dd71592090606c97050.tar.gz
linux-stable-8537cba8b6e14ff86f088dd71592090606c97050.tar.bz2
linux-stable-8537cba8b6e14ff86f088dd71592090606c97050.zip
aha1542: Merge aha1542_host_reset and aha1542_bus_reset
aha1542_host_reset and aha1542_bus_reset are almost same, merge them into aha1542_reset Signed-off-by: Ondrej Zary <linux@rainbow-software.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: James Bottomley <JBottomley@Odin.com>
Diffstat (limited to 'drivers/scsi/aha1542.c')
-rw-r--r--drivers/scsi/aha1542.c82
1 files changed, 14 insertions, 68 deletions
diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c
index 67fdd2fad9a7..4bfba454a032 100644
--- a/drivers/scsi/aha1542.c
+++ b/drivers/scsi/aha1542.c
@@ -1070,7 +1070,7 @@ static int aha1542_dev_reset(Scsi_Cmnd * SCpnt)
return SUCCESS;
}
-static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
+static int aha1542_reset(Scsi_Cmnd *SCpnt, u8 reset_cmd)
{
struct aha1542_hostdata *aha1542 = shost_priv(SCpnt->device->host);
int i;
@@ -1081,7 +1081,7 @@ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
* we do this? Try this first, and we can add that later
* if it turns out to be useful.
*/
- outb(SCRST, CONTROL(SCpnt->device->host->io_port));
+ outb(reset_cmd, CONTROL(SCpnt->device->host->io_port));
/*
* Wait for the thing to settle down a bit. Unfortunately
@@ -1091,7 +1091,6 @@ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
* we are pretty desperate anyways.
*/
ssleep(4);
-
spin_lock_irq(SCpnt->device->host->host_lock);
if (!wait_mask(STATUS(SCpnt->device->host->io_port),
@@ -1099,7 +1098,12 @@ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
spin_unlock_irq(SCpnt->device->host->host_lock);
return FAILED;
}
-
+ /*
+ * We need to do this too before the 1542 can interact with
+ * us again after host reset.
+ */
+ if (reset_cmd & HRST)
+ setup_mailboxes(SCpnt->device->host->io_port, SCpnt->device->host);
/*
* Now try to pick up the pieces. For all pending commands,
* free any internal data structures, and basically clear things
@@ -1113,7 +1117,6 @@ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
Scsi_Cmnd *SCtmp;
SCtmp = aha1542->SCint[i];
-
if (SCtmp->device->soft_reset) {
/*
* If this device implements the soft reset option,
@@ -1134,71 +1137,14 @@ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
return SUCCESS;
}
-static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
+static int aha1542_bus_reset(Scsi_Cmnd *SCpnt)
{
- struct aha1542_hostdata *aha1542 = shost_priv(SCpnt->device->host);
- int i;
-
- /*
- * This does a scsi reset for all devices on the bus.
- * In principle, we could also reset the 1542 - should
- * we do this? Try this first, and we can add that later
- * if it turns out to be useful.
- */
- outb(HRST | SCRST, CONTROL(SCpnt->device->host->io_port));
-
- /*
- * Wait for the thing to settle down a bit. Unfortunately
- * this is going to basically lock up the machine while we
- * wait for this to complete. To be 100% correct, we need to
- * check for timeout, and if we are doing something like this
- * we are pretty desperate anyways.
- */
- ssleep(4);
- spin_lock_irq(SCpnt->device->host->host_lock);
-
- if (!wait_mask(STATUS(SCpnt->device->host->io_port),
- STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
- spin_unlock_irq(SCpnt->device->host->host_lock);
- return FAILED;
- }
- /*
- * We need to do this too before the 1542 can interact with
- * us again.
- */
- setup_mailboxes(SCpnt->device->host->io_port, SCpnt->device->host);
-
- /*
- * Now try to pick up the pieces. For all pending commands,
- * free any internal data structures, and basically clear things
- * out. We do not try and restart any commands or anything -
- * the strategy handler takes care of that crap.
- */
- printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
-
- for (i = 0; i < AHA1542_MAILBOXES; i++) {
- if (aha1542->SCint[i] != NULL) {
- Scsi_Cmnd *SCtmp;
- SCtmp = aha1542->SCint[i];
-
- if (SCtmp->device->soft_reset) {
- /*
- * If this device implements the soft reset option,
- * then it is still holding onto the command, and
- * may yet complete it. In this case, we don't
- * flush the data.
- */
- continue;
- }
- kfree(SCtmp->host_scribble);
- SCtmp->host_scribble = NULL;
- aha1542->SCint[i] = NULL;
- aha1542->mb[i].status = 0;
- }
- }
+ return aha1542_reset(SCpnt, SCRST);
+}
- spin_unlock_irq(SCpnt->device->host->host_lock);
- return SUCCESS;
+static int aha1542_host_reset(Scsi_Cmnd *SCpnt)
+{
+ return aha1542_reset(SCpnt, HRST | SCRST);
}
static int aha1542_biosparam(struct scsi_device *sdev,