aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/qla4xxx/ql4_init.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c
index b0bffe15c287..064a3a311e77 100644
--- a/drivers/scsi/qla4xxx/ql4_init.c
+++ b/drivers/scsi/qla4xxx/ql4_init.c
@@ -765,6 +765,44 @@ int qla4xxx_start_firmware(struct scsi_qla_host *ha)
765 } 765 }
766 return status; 766 return status;
767} 767}
768/**
769 * qla4xxx_free_ddb_index - Free DDBs reserved by firmware
770 * @ha: pointer to adapter structure
771 *
772 * Since firmware is not running in autoconnect mode the DDB indices should
773 * be freed so that when login happens from user space there are free DDB
774 * indices available.
775 **/
776static void qla4xxx_free_ddb_index(struct scsi_qla_host *ha)
777{
778 int max_ddbs;
779 int ret;
780 uint32_t idx = 0, next_idx = 0;
781 uint32_t state = 0, conn_err = 0;
782
783 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES :
784 MAX_DEV_DB_ENTRIES;
785
786 for (idx = 0; idx < max_ddbs; idx = next_idx) {
787 ret = qla4xxx_get_fwddb_entry(ha, idx, NULL, 0, NULL,
788 &next_idx, &state, &conn_err,
789 NULL, NULL);
790 if (ret == QLA_ERROR)
791 continue;
792 if (state == DDB_DS_NO_CONNECTION_ACTIVE ||
793 state == DDB_DS_SESSION_FAILED) {
794 DEBUG2(ql4_printk(KERN_INFO, ha,
795 "Freeing DDB index = 0x%x\n", idx));
796 ret = qla4xxx_clear_ddb_entry(ha, idx);
797 if (ret == QLA_ERROR)
798 ql4_printk(KERN_ERR, ha,
799 "Unable to clear DDB index = "
800 "0x%x\n", idx);
801 }
802 if (next_idx == 0)
803 break;
804 }
805}
768 806
769 807
770/** 808/**
@@ -802,6 +840,8 @@ int qla4xxx_initialize_adapter(struct scsi_qla_host *ha)
802 if (status == QLA_ERROR) 840 if (status == QLA_ERROR)
803 goto exit_init_hba; 841 goto exit_init_hba;
804 842
843 qla4xxx_free_ddb_index(ha);
844
805 set_bit(AF_ONLINE, &ha->flags); 845 set_bit(AF_ONLINE, &ha->flags);
806exit_init_hba: 846exit_init_hba:
807 if (is_qla8022(ha) && (status == QLA_ERROR)) { 847 if (is_qla8022(ha) && (status == QLA_ERROR)) {