Parcourir la source

[SCSI] qla2xxx: Correct FCAL login retry logic for ISP24xx.

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>
andrew.vasquez@qlogic.com il y a 19 ans
Parent
commit
9a52a57cb9

+ 3 - 2
drivers/scsi/qla2xxx/qla_gbl.h

@@ -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_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_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);
 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);
     uint16_t *, uint8_t);
 
 
 extern int
 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
 extern int
 qla2x00_fabric_logout(scsi_qla_host_t *, uint16_t, uint8_t, uint8_t, uint8_t);
 qla2x00_fabric_logout(scsi_qla_host_t *, uint16_t, uint8_t, uint8_t, uint8_t);

+ 2 - 2
drivers/scsi/qla2xxx/qla_init.c

@@ -2888,13 +2888,13 @@ qla2x00_fabric_login(scsi_qla_host_t *ha, fc_port_t *fcport,
  *      3 - Fatal error
  *      3 - Fatal error
  */
  */
 int
 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;
 	int		rval;
 	uint16_t	mb[MAILBOX_REGISTER_COUNT];
 	uint16_t	mb[MAILBOX_REGISTER_COUNT];
 
 
 	memset(mb, 0, sizeof(mb));
 	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) {
 	if (rval == QLA_SUCCESS) {
 		/* Interrogate mailbox registers for any errors */
 		/* Interrogate mailbox registers for any errors */
 		if (mb[0] == MBS_COMMAND_ERROR)
 		if (mb[0] == MBS_COMMAND_ERROR)

+ 8 - 3
drivers/scsi/qla2xxx/qla_mbx.c

@@ -1631,20 +1631,25 @@ qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,
  *
  *
  */
  */
 int
 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)
     uint16_t *mb_ret, uint8_t opt)
 {
 {
 	int rval;
 	int rval;
 	mbx_cmd_t mc;
 	mbx_cmd_t mc;
 	mbx_cmd_t *mcp = &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);)
 	DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);)
 
 
 	mcp->mb[0] = MBC_LOGIN_LOOP_PORT;
 	mcp->mb[0] = MBC_LOGIN_LOOP_PORT;
 	if (HAS_EXTENDED_IDS(ha))
 	if (HAS_EXTENDED_IDS(ha))
-		mcp->mb[1] = loop_id;
+		mcp->mb[1] = fcport->loop_id;
 	else
 	else
-		mcp->mb[1] = loop_id << 8;
+		mcp->mb[1] = fcport->loop_id << 8;
 	mcp->mb[2] = opt;
 	mcp->mb[2] = opt;
 	mcp->out_mb = MBX_2|MBX_1|MBX_0;
 	mcp->out_mb = MBX_2|MBX_1|MBX_0;
  	mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0;
  	mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0;

+ 1 - 1
drivers/scsi/qla2xxx/qla_os.c

@@ -2295,7 +2295,7 @@ qla2x00_do_dpc(void *data)
 					} else
 					} else
 						status =
 						status =
 						    qla2x00_local_device_login(
 						    qla2x00_local_device_login(
-							ha, fcport->loop_id);
+							ha, fcport);
 
 
 					if (status == QLA_SUCCESS) {
 					if (status == QLA_SUCCESS) {
 						fcport->old_loop_id = fcport->loop_id;
 						fcport->old_loop_id = fcport->loop_id;