From: Vikas Chaudhary <vikas.chaudhary@xxxxxxxxxx> Signed-off-by: Nilesh Javali <nilesh.javali@xxxxxxxxxx> Signed-off-by: Vikas Chaudhary <vikas.chaudhary@xxxxxxxxxx> Signed-off-by: Ravi Anand <ravi.anand@xxxxxxxxxx> --- drivers/scsi/qla4xxx/ql4_os.c | 27 ++++++++++++++++++++++++--- 1 files changed, 24 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index 9057860..e5c9b85 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c @@ -370,6 +370,7 @@ void qla4xxx_mark_device_missing(struct scsi_qla_host *ha, ddb_entry->fw_ddb_index)); iscsi_block_session(ddb_entry->sess); iscsi_conn_error_event(ddb_entry->conn, ISCSI_ERR_CONN_FAILED); + set_bit(DF_NO_RELOGIN, &ddb_entry->flags); } /*** @@ -642,6 +643,24 @@ static void qla4xxx_timer(struct scsi_qla_host *ha) /* Search for relogin's to time-out and port down retry. */ list_for_each_entry_safe(ddb_entry, dtemp, &ha->ddb_list, list) { + /* First check to see if the device has exhausted the + * port down retry count */ + if (atomic_read(&ddb_entry->state) == DDB_STATE_MISSING) { + if (atomic_read(&ddb_entry->port_down_timer) == 0) + continue; + + if (atomic_dec_and_test(&ddb_entry->port_down_timer)) { + DEBUG2(printk("scsi%ld: %s: index [%d] " + "port down retry count of (%d) secs " + "exhausted.\n", + ha->host_no, __func__, + ddb_entry->fw_ddb_index, + ha->port_down_retry_count);) + + atomic_set(&ddb_entry->state, DDB_STATE_DEAD); + start_dpc++; + } + } /* Count down time between sending relogins */ if (adapter_up(ha) && !test_bit(DF_RELOGIN, &ddb_entry->flags) && @@ -676,7 +695,8 @@ static void qla4xxx_timer(struct scsi_qla_host *ha) if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE && ddb_entry->fw_ddb_device_state == - DDB_DS_SESSION_FAILED) { + DDB_DS_SESSION_FAILED && + !test_bit(DF_NO_RELOGIN, &ddb_entry->flags)) { /* Reset retry relogin timer */ atomic_inc(&ddb_entry->relogin_retry_count); DEBUG2(printk("scsi%ld: index[%d] relogin" @@ -1111,8 +1131,9 @@ static void qla4xxx_do_dpc(struct work_struct *work) test_and_clear_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags)) { list_for_each_entry_safe(ddb_entry, dtemp, &ha->ddb_list, list) { - if (test_and_clear_bit(DF_RELOGIN, &ddb_entry->flags) && - atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE) + if ((test_and_clear_bit(DF_RELOGIN, &ddb_entry->flags)) && + (!test_bit(DF_NO_RELOGIN, &ddb_entry->flags)) && + (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE)) qla4xxx_relogin_device(ha, ddb_entry); /* -- 1.6.0.2 -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html