scsi: qla2xxx: Fix GPNFT/GNNFT error handling
authorQuinn Tran <quinn.tran@cavium.com>
Thu, 28 Dec 2017 20:33:33 +0000 (12:33 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 4 Jan 2018 04:41:07 +0000 (23:41 -0500)
retry gpnft/gnnft if error is encountered.

Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_gs.c
drivers/scsi/qla2xxx/qla_init.c

index a530c77..fff12d7 100644 (file)
@@ -3878,6 +3878,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
                ql_dbg(ql_dbg_disc, vha, 0xffff,
                    "GPNFT failed. FC4type %x. Rescanning.\n",
                    fc4type);
+               set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
                set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
                goto out;
        }
@@ -3987,6 +3988,19 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res)
            "Async done-%s res %x FC4Type %x\n",
            sp->name, res, sp->gen2);
 
+       if (res) {
+               unsigned long flags;
+
+               ql_dbg(ql_dbg_disc, sp->vha, 0xffff,
+                   "Async done-%s timed out.\n",
+                   sp->name);
+               sp->free(sp);
+               set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
+               set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
+               qla2xxx_wake_dpc(vha);
+               return;
+       }
+
        if (!res) {
                port_id_t id;
                u64 wwn;
@@ -4048,6 +4062,7 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res)
                    "Async done-%s unable to alloc work element\n",
                    sp->name);
                sp->free(sp);
+               set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
                set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
                return;
        }
index bb06699..0ea948d 100644 (file)
@@ -681,15 +681,15 @@ qla24xx_async_gnl_sp_done(void *s, int res)
                        }
                }
 
-               id.b.domain = e->port_id[0];
+               id.b.domain = e->port_id[2];
                id.b.area = e->port_id[1];
-               id.b.al_pa = e->port_id[2];
+               id.b.al_pa = e->port_id[0];
                id.b.rsvd_1 = 0;
 
                if (!found && wwn && !IS_SW_RESV_ADDR(id)) {
                        ql_dbg(ql_dbg_disc, vha, 0x2065,
-                           "%s %d %8phC post new sess\n",
-                           __func__, __LINE__, (u8 *)&wwn);
+                           "%s %d %8phC %06x post new sess\n",
+                           __func__, __LINE__, (u8 *)&wwn, id.b24);
                        wwnn = wwn_to_u64(e->node_name);
                        qla24xx_post_newsess_work(vha, &id, (u8 *)&wwn,
                            (u8 *)&wwnn, NULL, FC4_TYPE_UNKNOWN);