|
Johannes Thumshirn |
2d9adb |
From: Quinn Tran <quinn.tran@cavium.com>
|
|
Johannes Thumshirn |
2d9adb |
Date: Thu, 28 Dec 2017 12:33:33 -0800
|
|
Johannes Thumshirn |
2d9adb |
Subject: scsi: qla2xxx: Fix GPNFT/GNNFT error handling
|
|
Johannes Thumshirn |
8ad9d9 |
Patch-mainline: v4.16-rc1
|
|
Johannes Thumshirn |
2d9adb |
Git-commit: cf055fb0b709d56da122a498a141212b511dad80
|
|
Johannes Thumshirn |
2d9adb |
References: bsc#1077338
|
|
Johannes Thumshirn |
2d9adb |
|
|
Johannes Thumshirn |
2d9adb |
retry gpnft/gnnft if error is encountered.
|
|
Johannes Thumshirn |
2d9adb |
|
|
Johannes Thumshirn |
2d9adb |
Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
|
|
Johannes Thumshirn |
2d9adb |
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
|
|
Johannes Thumshirn |
2d9adb |
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
|
Johannes Thumshirn |
2d9adb |
Acked-by: Johannes Thumshirn <jthumshirn@suse.de>
|
|
Johannes Thumshirn |
2d9adb |
---
|
|
Johannes Thumshirn |
2d9adb |
drivers/scsi/qla2xxx/qla_gs.c | 15 +++++++++++++++
|
|
Johannes Thumshirn |
2d9adb |
drivers/scsi/qla2xxx/qla_init.c | 8 ++++----
|
|
Johannes Thumshirn |
2d9adb |
2 files changed, 19 insertions(+), 4 deletions(-)
|
|
Johannes Thumshirn |
2d9adb |
|
|
Johannes Thumshirn |
2d9adb |
--- a/drivers/scsi/qla2xxx/qla_gs.c
|
|
Johannes Thumshirn |
2d9adb |
+++ b/drivers/scsi/qla2xxx/qla_gs.c
|
|
Johannes Thumshirn |
2d9adb |
@@ -3878,6 +3878,7 @@ void qla24xx_async_gnnft_done(scsi_qla_h
|
|
Johannes Thumshirn |
2d9adb |
ql_dbg(ql_dbg_disc, vha, 0xffff,
|
|
Johannes Thumshirn |
2d9adb |
"GPNFT failed. FC4type %x. Rescanning.\n",
|
|
Johannes Thumshirn |
2d9adb |
fc4type);
|
|
Johannes Thumshirn |
2d9adb |
+ set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
|
Johannes Thumshirn |
2d9adb |
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
|
Johannes Thumshirn |
2d9adb |
goto out;
|
|
Johannes Thumshirn |
2d9adb |
}
|
|
Johannes Thumshirn |
2d9adb |
@@ -3987,6 +3988,19 @@ static void qla2x00_async_gpnft_gnnft_sp
|
|
Johannes Thumshirn |
2d9adb |
"Async done-%s res %x FC4Type %x\n",
|
|
Johannes Thumshirn |
2d9adb |
sp->name, res, sp->gen2);
|
|
Johannes Thumshirn |
2d9adb |
|
|
Johannes Thumshirn |
2d9adb |
+ if (res) {
|
|
Johannes Thumshirn |
2d9adb |
+ unsigned long flags;
|
|
Johannes Thumshirn |
2d9adb |
+
|
|
Johannes Thumshirn |
2d9adb |
+ ql_dbg(ql_dbg_disc, sp->vha, 0xffff,
|
|
Johannes Thumshirn |
2d9adb |
+ "Async done-%s timed out.\n",
|
|
Johannes Thumshirn |
2d9adb |
+ sp->name);
|
|
Johannes Thumshirn |
2d9adb |
+ sp->free(sp);
|
|
Johannes Thumshirn |
2d9adb |
+ set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
|
Johannes Thumshirn |
2d9adb |
+ set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
|
Johannes Thumshirn |
2d9adb |
+ qla2xxx_wake_dpc(vha);
|
|
Johannes Thumshirn |
2d9adb |
+ return;
|
|
Johannes Thumshirn |
2d9adb |
+ }
|
|
Johannes Thumshirn |
2d9adb |
+
|
|
Johannes Thumshirn |
2d9adb |
if (!res) {
|
|
Johannes Thumshirn |
2d9adb |
port_id_t id;
|
|
Johannes Thumshirn |
2d9adb |
u64 wwn;
|
|
Johannes Thumshirn |
2d9adb |
@@ -4048,6 +4062,7 @@ static void qla2x00_async_gpnft_gnnft_sp
|
|
Johannes Thumshirn |
2d9adb |
"Async done-%s unable to alloc work element\n",
|
|
Johannes Thumshirn |
2d9adb |
sp->name);
|
|
Johannes Thumshirn |
2d9adb |
sp->free(sp);
|
|
Johannes Thumshirn |
2d9adb |
+ set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
|
Johannes Thumshirn |
2d9adb |
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
|
Johannes Thumshirn |
2d9adb |
return;
|
|
Johannes Thumshirn |
2d9adb |
}
|
|
Johannes Thumshirn |
2d9adb |
--- a/drivers/scsi/qla2xxx/qla_init.c
|
|
Johannes Thumshirn |
2d9adb |
+++ b/drivers/scsi/qla2xxx/qla_init.c
|
|
Johannes Thumshirn |
2d9adb |
@@ -681,15 +681,15 @@ qla24xx_async_gnl_sp_done(void *s, int r
|
|
Johannes Thumshirn |
2d9adb |
}
|
|
Johannes Thumshirn |
2d9adb |
}
|
|
Johannes Thumshirn |
2d9adb |
|
|
Johannes Thumshirn |
2d9adb |
- id.b.domain = e->port_id[0];
|
|
Johannes Thumshirn |
2d9adb |
+ id.b.domain = e->port_id[2];
|
|
Johannes Thumshirn |
2d9adb |
id.b.area = e->port_id[1];
|
|
Johannes Thumshirn |
2d9adb |
- id.b.al_pa = e->port_id[2];
|
|
Johannes Thumshirn |
2d9adb |
+ id.b.al_pa = e->port_id[0];
|
|
Johannes Thumshirn |
2d9adb |
id.b.rsvd_1 = 0;
|
|
Johannes Thumshirn |
2d9adb |
|
|
Johannes Thumshirn |
2d9adb |
if (!found && wwn && !IS_SW_RESV_ADDR(id)) {
|
|
Johannes Thumshirn |
2d9adb |
ql_dbg(ql_dbg_disc, vha, 0x2065,
|
|
Johannes Thumshirn |
2d9adb |
- "%s %d %8phC post new sess\n",
|
|
Johannes Thumshirn |
2d9adb |
- __func__, __LINE__, (u8 *)&wwn);
|
|
Johannes Thumshirn |
2d9adb |
+ "%s %d %8phC %06x post new sess\n",
|
|
Johannes Thumshirn |
2d9adb |
+ __func__, __LINE__, (u8 *)&wwn, id.b24);
|
|
Johannes Thumshirn |
2d9adb |
wwnn = wwn_to_u64(e->node_name);
|
|
Johannes Thumshirn |
2d9adb |
qla24xx_post_newsess_work(vha, &id, (u8 *)&wwn,
|
|
Johannes Thumshirn |
2d9adb |
(u8 *)&wwnn, NULL, FC4_TYPE_UNKNOWN);
|