[SCSI] qla2xxx: Correct FCAL login retry logic for ISP24xx.
authorandrew.vasquez@qlogic.com <andrew.vasquez@qlogic.com>
Thu, 9 Mar 2006 22:27:44 +0000 (14:27 -0800)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Sun, 12 Mar 2006 15:40:37 +0000 (09:40 -0600)
ISP24XX FW does not support Mbx 0x74 ie Login Local Port.
Added the equivalent code for ISP24XX ie to relogin in non
fabric case for ISP24XX use login iocb.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_mbx.c
drivers/scsi/qla2xxx/qla_os.c

index e897eadf0362ec06af9f1aa22bd14ad3e2a0e235..91e83e2c1eb8eae78df11905304f83d0f64be67f 100644 (file)
@@ -42,7 +42,7 @@ extern int qla2x00_loop_resync(scsi_qla_host_t *);
 
 extern int qla2x00_find_new_loop_id(scsi_qla_host_t *, fc_port_t *);
 extern int qla2x00_fabric_login(scsi_qla_host_t *, fc_port_t *, uint16_t *);
-extern int qla2x00_local_device_login(scsi_qla_host_t *, uint16_t);
+extern int qla2x00_local_device_login(scsi_qla_host_t *, fc_port_t *);
 
 extern void qla2x00_restart_queues(scsi_qla_host_t *, uint8_t);
 
@@ -166,7 +166,8 @@ qla24xx_login_fabric(scsi_qla_host_t *, uint16_t, uint8_t, uint8_t, uint8_t,
     uint16_t *, uint8_t);
 
 extern int
-qla2x00_login_local_device(scsi_qla_host_t *, uint16_t, uint16_t *, uint8_t);
+qla2x00_login_local_device(scsi_qla_host_t *, fc_port_t *, uint16_t *,
+    uint8_t);
 
 extern int
 qla2x00_fabric_logout(scsi_qla_host_t *, uint16_t, uint8_t, uint8_t, uint8_t);
index ebc7c24980672301732295d83ab32c8a1266c315..89a3fc0595bbe4c7236d3d6118d8544e4541e7b3 100644 (file)
@@ -2888,13 +2888,13 @@ qla2x00_fabric_login(scsi_qla_host_t *ha, fc_port_t *fcport,
  *      3 - Fatal error
  */
 int
-qla2x00_local_device_login(scsi_qla_host_t *ha, uint16_t loop_id)
+qla2x00_local_device_login(scsi_qla_host_t *ha, fc_port_t *fcport)
 {
        int             rval;
        uint16_t        mb[MAILBOX_REGISTER_COUNT];
 
        memset(mb, 0, sizeof(mb));
-       rval = qla2x00_login_local_device(ha, loop_id, mb, BIT_0);
+       rval = qla2x00_login_local_device(ha, fcport, mb, BIT_0);
        if (rval == QLA_SUCCESS) {
                /* Interrogate mailbox registers for any errors */
                if (mb[0] == MBS_COMMAND_ERROR)
index 85c83e0027ff866e2145e8991efaf4c6ff39f2a4..d6cb3bd1a29a4b0277e47c97287730a3b11255b5 100644 (file)
@@ -1631,20 +1631,25 @@ qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,
  *
  */
 int
-qla2x00_login_local_device(scsi_qla_host_t *ha, uint16_t loop_id,
+qla2x00_login_local_device(scsi_qla_host_t *ha, fc_port_t *fcport,
     uint16_t *mb_ret, uint8_t opt)
 {
        int rval;
        mbx_cmd_t mc;
        mbx_cmd_t *mcp = &mc;
 
+       if (IS_QLA24XX(ha) || IS_QLA54XX(ha))
+               return qla24xx_login_fabric(ha, fcport->loop_id,
+                   fcport->d_id.b.domain, fcport->d_id.b.area,
+                   fcport->d_id.b.al_pa, mb_ret, opt);
+
        DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);)
 
        mcp->mb[0] = MBC_LOGIN_LOOP_PORT;
        if (HAS_EXTENDED_IDS(ha))
-               mcp->mb[1] = loop_id;
+               mcp->mb[1] = fcport->loop_id;
        else
-               mcp->mb[1] = loop_id << 8;
+               mcp->mb[1] = fcport->loop_id << 8;
        mcp->mb[2] = opt;
        mcp->out_mb = MBX_2|MBX_1|MBX_0;
        mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0;
index 0fc89ac6a51baebb3e9332d1a376413511c4dcb4..029bbf461bb2d034441b03dfd4caff95186627d6 100644 (file)
@@ -2295,7 +2295,7 @@ qla2x00_do_dpc(void *data)
                                        } else
                                                status =
                                                    qla2x00_local_device_login(
-                                                       ha, fcport->loop_id);
+                                                       ha, fcport);
 
                                        if (status == QLA_SUCCESS) {
                                                fcport->old_loop_id = fcport->loop_id;