浏览代码

[SCSI] qla2xxx: Correct loop-in-transition issues

When mulitple initiators are coming up in an FCAL topology.

Signed-off-by: Ravi Anand <ravi.anand@qlogic.com>
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Ravi Anand 19 年之前
父节点
当前提交
33135aa2a5
共有 2 个文件被更改,包括 15 次插入8 次删除
  1. 13 8
      drivers/scsi/qla2xxx/qla_init.c
  2. 2 0
      drivers/scsi/qla2xxx/qla_mbx.c

+ 13 - 8
drivers/scsi/qla2xxx/qla_init.c

@@ -147,8 +147,8 @@ check_fw_ready_again:
 					 * LIP to complete
 					 * LIP to complete
 					 */
 					 */
 
 
-					if (atomic_read(&ha->loop_state) ==
-					    LOOP_DOWN && retry--) {
+					if (atomic_read(&ha->loop_state) !=
+					    LOOP_READY && retry--) {
 						goto check_fw_ready_again;
 						goto check_fw_ready_again;
 					}
 					}
 					wait_time--;
 					wait_time--;
@@ -1258,9 +1258,15 @@ qla2x00_configure_hba(scsi_qla_host_t *ha)
 	rval = qla2x00_get_adapter_id(ha,
 	rval = qla2x00_get_adapter_id(ha,
 	    &loop_id, &al_pa, &area, &domain, &topo);
 	    &loop_id, &al_pa, &area, &domain, &topo);
 	if (rval != QLA_SUCCESS) {
 	if (rval != QLA_SUCCESS) {
-		qla_printk(KERN_WARNING, ha,
-		    "ERROR -- Unable to get host loop ID.\n");
-		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
+		if (LOOP_NOT_READY(ha) || atomic_read(&ha->loop_down_timer) ||
+		    (rval == QLA_COMMAND_ERROR && loop_id == 0x7)) {
+			DEBUG2(printk("%s(%ld) Loop is in a transition state\n",
+			    __func__, ha->host_no));
+		} else {
+			qla_printk(KERN_WARNING, ha,
+			    "ERROR -- Unable to get host loop ID.\n");
+			set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
+		}
 		return (rval);
 		return (rval);
 	}
 	}
 
 
@@ -1789,7 +1795,7 @@ qla2x00_configure_loop(scsi_qla_host_t *ha)
 	}
 	}
 
 
 	if (rval == QLA_SUCCESS && test_bit(RSCN_UPDATE, &flags)) {
 	if (rval == QLA_SUCCESS && test_bit(RSCN_UPDATE, &flags)) {
-		if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) {
+		if (LOOP_NOT_READY(ha)) {
 			rval = QLA_FUNCTION_FAILED;
 			rval = QLA_FUNCTION_FAILED;
 		} else {
 		} else {
 			rval = qla2x00_configure_fabric(ha);
 			rval = qla2x00_configure_fabric(ha);
@@ -2362,8 +2368,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, struct list_head *new_fcports)
 		if (qla2x00_is_reserved_id(ha, loop_id))
 		if (qla2x00_is_reserved_id(ha, loop_id))
 			continue;
 			continue;
 
 
-		if (atomic_read(&ha->loop_down_timer) ||
-		    test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))
+		if (atomic_read(&ha->loop_down_timer) || LOOP_NOT_READY(ha))
 			break;
 			break;
 
 
 		if (swl != NULL) {
 		if (swl != NULL) {

+ 2 - 0
drivers/scsi/qla2xxx/qla_mbx.c

@@ -1008,6 +1008,8 @@ qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa,
 	mcp->tov = 30;
 	mcp->tov = 30;
 	mcp->flags = 0;
 	mcp->flags = 0;
 	rval = qla2x00_mailbox_command(ha, mcp);
 	rval = qla2x00_mailbox_command(ha, mcp);
+	if (mcp->mb[0] == MBS_COMMAND_ERROR)
+		rval = QLA_COMMAND_ERROR;
 
 
 	/* Return data. */
 	/* Return data. */
 	*id = mcp->mb[1];
 	*id = mcp->mb[1];