]> git.openfabrics.org - ~shefty/rdma-dev.git/commitdiff
[SCSI] qla2xxx: Correct loop-in-transition issues
authorRavi Anand <ravi.anand@qlogic.com>
Tue, 8 Nov 2005 22:37:20 +0000 (14:37 -0800)
committerJames Bottomley <jejb@mulgrave.(none)>
Wed, 9 Nov 2005 21:18:27 +0000 (16:18 -0500)
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>
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_mbx.c

index 72d9090df3dff8e8863204183b938c854392ce38..8fb084b706e0f4d8014d757235c717f7b3016d8b 100644 (file)
@@ -147,8 +147,8 @@ check_fw_ready_again:
                                         * 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;
                                        }
                                        wait_time--;
@@ -1258,9 +1258,15 @@ qla2x00_configure_hba(scsi_qla_host_t *ha)
        rval = qla2x00_get_adapter_id(ha,
            &loop_id, &al_pa, &area, &domain, &topo);
        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);
        }
 
@@ -1789,7 +1795,7 @@ qla2x00_configure_loop(scsi_qla_host_t *ha)
        }
 
        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;
                } else {
                        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))
                        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;
 
                if (swl != NULL) {
index ad3cacb9192d608e67f757edad61a945b978949a..0e963bf9c568d3df76a524eb5c656437f9a2cacb 100644 (file)
@@ -1008,6 +1008,8 @@ qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa,
        mcp->tov = 30;
        mcp->flags = 0;
        rval = qla2x00_mailbox_command(ha, mcp);
+       if (mcp->mb[0] == MBS_COMMAND_ERROR)
+               rval = QLA_COMMAND_ERROR;
 
        /* Return data. */
        *id = mcp->mb[1];