|
@@ -4777,7 +4777,7 @@ static int ipr_eh_host_reset(struct scsi_cmnd *cmd)
|
|
|
ioa_cfg = (struct ipr_ioa_cfg *) cmd->device->host->hostdata;
|
|
|
spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
|
|
|
|
|
|
- if (!ioa_cfg->in_reset_reload) {
|
|
|
+ if (!ioa_cfg->in_reset_reload && !ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) {
|
|
|
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_ABBREV);
|
|
|
dev_err(&ioa_cfg->pdev->dev,
|
|
|
"Adapter being reset as a result of error recovery.\n");
|
|
@@ -6739,6 +6739,7 @@ static int ipr_invalid_adapter(struct ipr_ioa_cfg *ioa_cfg)
|
|
|
static int ipr_ioa_bringdown_done(struct ipr_cmnd *ipr_cmd)
|
|
|
{
|
|
|
struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
|
|
|
+ int i;
|
|
|
|
|
|
ENTER;
|
|
|
if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa) {
|
|
@@ -6750,6 +6751,13 @@ static int ipr_ioa_bringdown_done(struct ipr_cmnd *ipr_cmd)
|
|
|
|
|
|
ioa_cfg->in_reset_reload = 0;
|
|
|
ioa_cfg->reset_retries = 0;
|
|
|
+ for (i = 0; i < ioa_cfg->hrrq_num; i++) {
|
|
|
+ spin_lock(&ioa_cfg->hrrq[i]._lock);
|
|
|
+ ioa_cfg->hrrq[i].ioa_is_dead = 1;
|
|
|
+ spin_unlock(&ioa_cfg->hrrq[i]._lock);
|
|
|
+ }
|
|
|
+ wmb();
|
|
|
+
|
|
|
list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
|
|
|
wake_up_all(&ioa_cfg->reset_wait_q);
|
|
|
LEAVE;
|
|
@@ -8651,7 +8659,7 @@ static void ipr_pci_perm_failure(struct pci_dev *pdev)
|
|
|
spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
|
|
|
if (ioa_cfg->sdt_state == WAIT_FOR_DUMP)
|
|
|
ioa_cfg->sdt_state = ABORT_DUMP;
|
|
|
- ioa_cfg->reset_retries = IPR_NUM_RESET_RELOAD_RETRIES;
|
|
|
+ ioa_cfg->reset_retries = IPR_NUM_RESET_RELOAD_RETRIES - 1;
|
|
|
ioa_cfg->in_ioa_bringdown = 1;
|
|
|
for (i = 0; i < ioa_cfg->hrrq_num; i++) {
|
|
|
spin_lock(&ioa_cfg->hrrq[i]._lock);
|