|
|
|
@ -903,24 +903,17 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
enum nexus_wait_type { |
|
|
|
|
WAIT_HOST = 0, |
|
|
|
|
WAIT_TARGET, |
|
|
|
|
WAIT_LUN, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
|
int |
|
|
|
|
qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *vha, unsigned int t, |
|
|
|
|
unsigned int l, srb_t *sp, enum nexus_wait_type type) |
|
|
|
|
unsigned int l, enum nexus_wait_type type) |
|
|
|
|
{ |
|
|
|
|
int cnt, match, status; |
|
|
|
|
unsigned long flags; |
|
|
|
|
struct qla_hw_data *ha = vha->hw; |
|
|
|
|
struct req_que *req; |
|
|
|
|
srb_t *sp; |
|
|
|
|
|
|
|
|
|
status = QLA_SUCCESS; |
|
|
|
|
if (!sp) |
|
|
|
|
return status; |
|
|
|
|
|
|
|
|
|
spin_lock_irqsave(&ha->hardware_lock, flags); |
|
|
|
|
req = vha->req; |
|
|
|
@ -958,24 +951,6 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *vha, unsigned int t, |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void qla82xx_wait_for_pending_commands(scsi_qla_host_t *vha) |
|
|
|
|
{ |
|
|
|
|
int cnt; |
|
|
|
|
srb_t *sp; |
|
|
|
|
struct req_que *req = vha->req; |
|
|
|
|
|
|
|
|
|
DEBUG2(qla_printk(KERN_INFO, vha->hw, |
|
|
|
|
"Waiting for pending commands\n")); |
|
|
|
|
for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { |
|
|
|
|
sp = req->outstanding_cmds[cnt]; |
|
|
|
|
if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, |
|
|
|
|
sp, WAIT_HOST) == QLA_SUCCESS) { |
|
|
|
|
DEBUG2(qla_printk(KERN_INFO, vha->hw, |
|
|
|
|
"Done wait for pending commands\n")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static char *reset_errors[] = { |
|
|
|
|
"HBA not online", |
|
|
|
|
"HBA not ready", |
|
|
|
@ -1011,7 +986,7 @@ __qla2xxx_eh_generic_reset(char *name, enum nexus_wait_type type, |
|
|
|
|
goto eh_reset_failed; |
|
|
|
|
err = 3; |
|
|
|
|
if (qla2x00_eh_wait_for_pending_commands(vha, cmd->device->id, |
|
|
|
|
cmd->device->lun, (srb_t *) CMD_SP(cmd), type) != QLA_SUCCESS) |
|
|
|
|
cmd->device->lun, type) != QLA_SUCCESS) |
|
|
|
|
goto eh_reset_failed; |
|
|
|
|
|
|
|
|
|
qla_printk(KERN_INFO, vha->hw, "scsi(%ld:%d:%d): %s RESET SUCCEEDED.\n", |
|
|
|
@ -1019,7 +994,7 @@ __qla2xxx_eh_generic_reset(char *name, enum nexus_wait_type type, |
|
|
|
|
|
|
|
|
|
return SUCCESS; |
|
|
|
|
|
|
|
|
|
eh_reset_failed: |
|
|
|
|
eh_reset_failed: |
|
|
|
|
qla_printk(KERN_INFO, vha->hw, "scsi(%ld:%d:%d): %s RESET FAILED: %s.\n" |
|
|
|
|
, vha->host_no, cmd->device->id, cmd->device->lun, name, |
|
|
|
|
reset_errors[err]); |
|
|
|
@ -1069,7 +1044,6 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) |
|
|
|
|
int ret = FAILED; |
|
|
|
|
unsigned int id, lun; |
|
|
|
|
unsigned long serial; |
|
|
|
|
srb_t *sp = (srb_t *) CMD_SP(cmd); |
|
|
|
|
|
|
|
|
|
fc_block_scsi_eh(cmd); |
|
|
|
|
|
|
|
|
@ -1096,7 +1070,7 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) |
|
|
|
|
goto eh_bus_reset_done; |
|
|
|
|
|
|
|
|
|
/* Flush outstanding commands. */ |
|
|
|
|
if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, sp, WAIT_HOST) != |
|
|
|
|
if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, WAIT_HOST) != |
|
|
|
|
QLA_SUCCESS) |
|
|
|
|
ret = FAILED; |
|
|
|
|
|
|
|
|
@ -1131,7 +1105,6 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) |
|
|
|
|
int ret = FAILED; |
|
|
|
|
unsigned int id, lun; |
|
|
|
|
unsigned long serial; |
|
|
|
|
srb_t *sp = (srb_t *) CMD_SP(cmd); |
|
|
|
|
scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); |
|
|
|
|
|
|
|
|
|
fc_block_scsi_eh(cmd); |
|
|
|
@ -1186,7 +1159,7 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Waiting for command to be returned to OS.*/ |
|
|
|
|
if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, sp, WAIT_HOST) == |
|
|
|
|
if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, WAIT_HOST) == |
|
|
|
|
QLA_SUCCESS) |
|
|
|
|
ret = SUCCESS; |
|
|
|
|
|
|
|
|
|