]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
scsi: qla2xxx: Replace GPDB with async ADISC command
authorQuinn Tran <quinn.tran@cavium.com>
Thu, 28 Dec 2017 20:33:15 +0000 (12:33 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 4 Jan 2018 04:41:05 +0000 (23:41 -0500)
Replace call to Get Port DataBase MB with PDO_FORCE_ADISC
flag with async ADISC command so driver can see ADISC command
has error or not.

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_def.h
drivers/scsi/qla2xxx/qla_gs.c
drivers/scsi/qla2xxx/qla_init.c

index 043dd51a27600e9167ec61892efb83334326e900..ca2ad477a4df94e98400aaf161c40c8e9e344630 100644 (file)
@@ -2277,6 +2277,7 @@ enum discovery_state {
        DSC_GPSC,
        DSC_UPD_FCPORT,
        DSC_LOGIN_COMPLETE,
+       DSC_ADISC,
        DSC_DELETE_PEND,
 };
 
@@ -2303,6 +2304,7 @@ enum fcport_mgt_event {
        FCME_GPNID_DONE,
        FCME_GFFID_DONE,
        FCME_DELETE_DONE,
+       FCME_ADISC_DONE,
 };
 
 enum rscn_addr_format {
index 07fe17a986b0b4d0554d723de9b9b054bc8aad4f..bb96219ce5255b2fdab275796b9d77c51f3552c9 100644 (file)
@@ -2823,15 +2823,19 @@ void qla24xx_handle_gidpn_event(scsi_qla_host_t *vha, struct event_arg *ea)
                                            "%s %d %8phC post %s\n", __func__,
                                            __LINE__, fcport->port_name,
                                            (atomic_read(&fcport->state) ==
-                                           FCS_ONLINE) ? "gpdb" : "gnl");
+                                           FCS_ONLINE) ? "adisc" : "gnl");
 
                                        if (atomic_read(&fcport->state) ==
-                                           FCS_ONLINE)
-                                               qla24xx_post_gpdb_work(vha,
-                                                   fcport, PDO_FORCE_ADISC);
-                                       else
+                                           FCS_ONLINE) {
+                                               u16 data[2];
+
+                                               data[0] = data[1] = 0;
+                                               qla2x00_post_async_adisc_work(
+                                                   vha, fcport, data);
+                                       } else {
                                                qla24xx_post_gnl_work(vha,
                                                    fcport);
+                                       }
                                        break;
                                }
                        } else { /* fcport->d_id.b24 != ea->id.b24 */
@@ -3172,6 +3176,7 @@ void qla24xx_async_gpnid_done(scsi_qla_host_t *vha, srb_t *sp)
 void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, struct event_arg *ea)
 {
        fc_port_t *fcport, *conflict, *t;
+       u16 data[2];
 
        ql_dbg(ql_dbg_disc, vha, 0xffff,
            "%s %d port_id: %06x\n",
@@ -3246,8 +3251,9 @@ void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, struct event_arg *ea)
                                ql_dbg(ql_dbg_disc, vha, 0x210d,
                                    "%s %d %8phC revalidate session with ADISC\n",
                                    __func__, __LINE__, fcport->port_name);
-                               qla24xx_post_gpdb_work(vha, fcport,
-                                   PDO_FORCE_ADISC);
+                               data[0] = data[1] = 0;
+                               qla2x00_post_async_adisc_work(vha, fcport,
+                                   data);
                                break;
                        case DSC_DELETED:
                                ql_dbg(ql_dbg_disc, vha, 0x210d,
index fc307752b2f54ff79f61c4ba95c8a018cbdfb1ed..93d0077ba38878e2e99c4d57e64fc714955444cc 100644 (file)
@@ -41,6 +41,7 @@ static void qla24xx_handle_plogi_done_event(struct scsi_qla_host *,
     struct event_arg *);
 static void qla24xx_handle_prli_done_event(struct scsi_qla_host *,
     struct event_arg *);
+static void qla24xx_handle_gpdb_event(scsi_qla_host_t *, struct event_arg *);
 
 /* SRB Extensions ---------------------------------------------------------- */
 
@@ -277,17 +278,31 @@ qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport)
        fcport->flags &= ~FCF_ASYNC_SENT;
        return rval;
 }
+static
+void qla24xx_handle_adisc_event(scsi_qla_host_t *vha, struct event_arg *ea)
+{
+       qla24xx_handle_gpdb_event(vha, ea);
+}
 
 static void
 qla2x00_async_adisc_sp_done(void *ptr, int res)
 {
        srb_t *sp = ptr;
        struct scsi_qla_host *vha = sp->vha;
-       struct srb_iocb *lio = &sp->u.iocb_cmd;
+       struct event_arg ea;
+
+       ql_dbg(ql_dbg_disc, vha, 0x2066,
+           "Async done-%s res %x %8phC\n",
+           sp->name, res, sp->fcport->port_name);
+
+       memset(&ea, 0, sizeof(ea));
+       ea.event = FCME_ADISC_DONE;
+       ea.rc = res;
+       ea.fcport = sp->fcport;
+       ea.sp = sp;
+
+       qla2x00_fcport_event_handler(vha, &ea);
 
-       if (!test_bit(UNLOADING, &vha->dpc_flags))
-               qla2x00_post_async_adisc_done_work(sp->vha, sp->fcport,
-                   lio->u.logio.data);
        sp->free(sp);
 }
 
@@ -319,15 +334,15 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport,
                goto done_free_sp;
 
        ql_dbg(ql_dbg_disc, vha, 0x206f,
-           "Async-adisc - hdl=%x loopid=%x portid=%02x%02x%02x.\n",
-           sp->handle, fcport->loop_id, fcport->d_id.b.domain,
-           fcport->d_id.b.area, fcport->d_id.b.al_pa);
+           "Async-adisc - hdl=%x loopid=%x portid=%06x %8phC.\n",
+           sp->handle, fcport->loop_id, fcport->d_id.b24, fcport->port_name);
        return rval;
 
 done_free_sp:
        sp->free(sp);
 done:
        fcport->flags &= ~FCF_ASYNC_SENT;
+       qla2x00_post_async_adisc_work(vha, fcport, data);
        return rval;
 }
 
@@ -869,7 +884,6 @@ void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea)
        int rval = ea->rc;
        fc_port_t *fcport = ea->fcport;
        unsigned long flags;
-       u16 opt = ea->sp->u.iocb_cmd.u.mbx.out_mb[10];
 
        fcport->flags &= ~FCF_ASYNC_SENT;
 
@@ -900,8 +914,7 @@ void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea)
        }
 
        spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
-       if (opt != PDO_FORCE_ADISC)
-               ea->fcport->login_gen++;
+       ea->fcport->login_gen++;
        ea->fcport->deleted = 0;
        ea->fcport->logout_on_delete = 1;
 
@@ -941,6 +954,7 @@ void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea)
 
 int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport)
 {
+       u16 data[2];
        if (fcport->login_retry == 0)
                return 0;
 
@@ -999,23 +1013,11 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport)
                        break;
                }
 
-               if (fcport->flags & FCF_FCP2_DEVICE) {
-                       u8 opt = PDO_FORCE_ADISC;
-
-                       ql_dbg(ql_dbg_disc, vha, 0x20c9,
-                           "%s %d %8phC post gpdb\n",
-                           __func__, __LINE__, fcport->port_name);
-
-                       fcport->disc_state = DSC_GPDB;
-                       qla24xx_post_gpdb_work(vha, fcport, opt);
-               } else {
-                       ql_dbg(ql_dbg_disc, vha, 0x20cf,
-                           "%s %d %8phC post login\n",
-                           __func__, __LINE__, fcport->port_name);
-                       fcport->disc_state = DSC_LOGIN_PEND;
-                       qla2x00_post_async_login_work(vha, fcport, NULL);
-               }
-
+               ql_dbg(ql_dbg_disc, vha, 0x20cf,
+                   "%s %d %8phC post login\n",
+                   __func__, __LINE__, fcport->port_name);
+               fcport->disc_state = DSC_LOGIN_PEND;
+               qla2x00_post_async_login_work(vha, fcport, NULL);
                break;
 
        case DSC_LOGIN_FAILED:
@@ -1029,10 +1031,10 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport)
        case DSC_LOGIN_COMPLETE:
                /* recheck login state */
                ql_dbg(ql_dbg_disc, vha, 0x20d1,
-                   "%s %d %8phC post gpdb\n",
+                   "%s %d %8phC post adisc\n",
                    __func__, __LINE__, fcport->port_name);
-
-               qla24xx_post_gpdb_work(vha, fcport, PDO_FORCE_ADISC);
+               data[0] = data[1] = 0;
+               qla2x00_post_async_adisc_work(vha, fcport, data);
                break;
 
        default:
@@ -1264,6 +1266,9 @@ void qla2x00_fcport_event_handler(scsi_qla_host_t *vha, struct event_arg *ea)
        case FCME_DELETE_DONE:
                qla24xx_handle_delete_done_event(vha, ea);
                break;
+       case FCME_ADISC_DONE:
+               qla24xx_handle_adisc_event(vha, ea);
+               break;
        default:
                BUG_ON(1);
                break;