summaryrefslogtreecommitdiffstats
path: root/sys/dev/mvs
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/mvs')
-rw-r--r--sys/dev/mvs/mvs.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/sys/dev/mvs/mvs.c b/sys/dev/mvs/mvs.c
index 0ab60cd..69e7a14 100644
--- a/sys/dev/mvs/mvs.c
+++ b/sys/dev/mvs/mvs.c
@@ -1781,7 +1781,6 @@ mvs_issue_recovery(device_t dev)
struct ccb_scsiio *csio;
int i;
- ch->recoverycmd = 1;
/* Find some holden command. */
for (i = 0; i < MVS_MAX_SLOTS; i++) {
if (ch->hold[i])
@@ -1789,8 +1788,20 @@ mvs_issue_recovery(device_t dev)
}
ccb = xpt_alloc_ccb_nowait();
if (ccb == NULL) {
- device_printf(dev, "Unable allocate READ LOG command");
- return; /* XXX */
+ device_printf(dev, "Unable allocate recovery command\n");
+completeall:
+ /* We can't do anything -- complete holden commands. */
+ for (i = 0; i < MVS_MAX_SLOTS; i++) {
+ if (ch->hold[i] == NULL)
+ continue;
+ ch->hold[i]->ccb_h.status &= ~CAM_STATUS_MASK;
+ ch->hold[i]->ccb_h.status |= CAM_RESRC_UNAVAIL;
+ xpt_done(ch->hold[i]);
+ ch->hold[i] = NULL;
+ ch->numhslots--;
+ }
+ mvs_reset(dev);
+ return;
}
ccb->ccb_h = ch->hold[i]->ccb_h; /* Reuse old header. */
if (ccb->ccb_h.func_code == XPT_ATA_IO) {
@@ -1803,8 +1814,9 @@ mvs_issue_recovery(device_t dev)
ataio->data_ptr = malloc(512, M_MVS, M_NOWAIT);
if (ataio->data_ptr == NULL) {
xpt_free_ccb(ccb);
- device_printf(dev, "Unable allocate memory for READ LOG command");
- return; /* XXX */
+ device_printf(dev,
+ "Unable allocate memory for READ LOG command\n");
+ goto completeall;
}
ataio->dxfer_len = 512;
bzero(&ataio->cmd, sizeof(ataio->cmd));
@@ -1831,7 +1843,8 @@ mvs_issue_recovery(device_t dev)
csio->cdb_io.cdb_bytes[0] = 0x03;
csio->cdb_io.cdb_bytes[4] = csio->dxfer_len;
}
- /* Freeze SIM while doing READ LOG EXT. */
+ /* Freeze SIM while doing recovery. */
+ ch->recoverycmd = 1;
xpt_freeze_simq(ch->sim, 1);
mvs_begin_transaction(dev, ccb);
}
OpenPOWER on IntegriCloud