[SCSI] bfa: Changes to support vport disable and enable operations.
authorKrishna Gudipati <kgudipat@brocade.com>
Mon, 13 Jun 2011 22:51:24 +0000 (15:51 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Wed, 29 Jun 2011 20:37:48 +0000 (15:37 -0500)
Made changes to FCS lport, vport state machines to support vport
enable / disable operations.

Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/bfa/bfa_core.c
drivers/scsi/bfa/bfa_defs_svc.h
drivers/scsi/bfa/bfa_fc.h
drivers/scsi/bfa/bfa_fcpim.c
drivers/scsi/bfa/bfa_fcs.c
drivers/scsi/bfa/bfa_fcs.h
drivers/scsi/bfa/bfa_fcs_lport.c
drivers/scsi/bfa/bfi.h
drivers/scsi/bfa/bfi_ms.h

index 5a00217..4c9e838 100644 (file)
@@ -51,7 +51,7 @@ static bfa_isr_func_t  bfa_isrs[BFI_MC_MAX] = {
        bfa_fcxp_isr,           /* BFI_MC_FCXP */
        bfa_lps_isr,            /* BFI_MC_LPS */
        bfa_rport_isr,          /* BFI_MC_RPORT */
-       bfa_itnim_isr,          /* BFI_MC_ITNIM */
+       bfa_itnim_isr,          /* BFI_MC_ITN */
        bfa_isr_unhandled,      /* BFI_MC_IOIM_READ */
        bfa_isr_unhandled,      /* BFI_MC_IOIM_WRITE */
        bfa_isr_unhandled,      /* BFI_MC_IOIM_IO */
index 207f598..bcc919c 100644 (file)
@@ -47,8 +47,6 @@ struct bfa_iocfc_fwcfg_s {
        u16        num_rports;  /*  number of remote ports      */
        u16        num_ioim_reqs;       /*  number of IO reqs           */
        u16        num_tskim_reqs;      /*  task management requests    */
-       u16        num_iotm_reqs;       /*  number of TM IO reqs        */
-       u16        num_tsktm_reqs;      /*  TM task management requests*/
        u16        num_fcxp_reqs;       /*  unassisted FC exchanges     */
        u16        num_uf_bufs; /*  unsolicited recv buffers    */
        u8              num_cqs;
index bf0067e..7bc0208 100644 (file)
@@ -1048,15 +1048,6 @@ struct fc_vft_s {
        u32        res_c:24;
 };
 
-/*
- * FCP
- */
-enum {
-       FCP_RJT         = 0x01000000,   /* SRR reject */
-       FCP_SRR_ACCEPT  = 0x02000000,   /* SRR accept */
-       FCP_SRR         = 0x14000000,   /* Sequence Retransmission Request */
-};
-
 /*
  * FCP_CMND definitions
  */
index c0353cd..874cd79 100644 (file)
@@ -1043,7 +1043,7 @@ bfa_itnim_iocdisable(struct bfa_itnim_s *itnim)
 static bfa_boolean_t
 bfa_itnim_send_fwcreate(struct bfa_itnim_s *itnim)
 {
-       struct bfi_itnim_create_req_s *m;
+       struct bfi_itn_create_req_s *m;
 
        itnim->msg_no++;
 
@@ -1056,7 +1056,7 @@ bfa_itnim_send_fwcreate(struct bfa_itnim_s *itnim)
                return BFA_FALSE;
        }
 
-       bfi_h2i_set(m->mh, BFI_MC_ITNIM, BFI_ITNIM_H2I_CREATE_REQ,
+       bfi_h2i_set(m->mh, BFI_MC_ITN, BFI_ITN_H2I_CREATE_REQ,
                        bfa_lpuid(itnim->bfa));
        m->fw_handle = itnim->rport->fw_handle;
        m->class = FC_CLASS_3;
@@ -1074,7 +1074,7 @@ bfa_itnim_send_fwcreate(struct bfa_itnim_s *itnim)
 static bfa_boolean_t
 bfa_itnim_send_fwdelete(struct bfa_itnim_s *itnim)
 {
-       struct bfi_itnim_delete_req_s *m;
+       struct bfi_itn_delete_req_s *m;
 
        /*
         * check for room in queue to send request now
@@ -1085,7 +1085,7 @@ bfa_itnim_send_fwdelete(struct bfa_itnim_s *itnim)
                return BFA_FALSE;
        }
 
-       bfi_h2i_set(m->mh, BFI_MC_ITNIM, BFI_ITNIM_H2I_DELETE_REQ,
+       bfi_h2i_set(m->mh, BFI_MC_ITN, BFI_ITN_H2I_DELETE_REQ,
                        bfa_lpuid(itnim->bfa));
        m->fw_handle = itnim->rport->fw_handle;
        bfa_stats(itnim, fw_delete);
@@ -1251,7 +1251,7 @@ void
 bfa_itnim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
 {
        struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
-       union bfi_itnim_i2h_msg_u msg;
+       union bfi_itn_i2h_msg_u msg;
        struct bfa_itnim_s *itnim;
 
        bfa_trc(bfa, m->mhdr.msg_id);
@@ -1259,7 +1259,7 @@ bfa_itnim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
        msg.msg = m;
 
        switch (m->mhdr.msg_id) {
-       case BFI_ITNIM_I2H_CREATE_RSP:
+       case BFI_ITN_I2H_CREATE_RSP:
                itnim = BFA_ITNIM_FROM_TAG(fcpim,
                                                msg.create_rsp->bfa_handle);
                WARN_ON(msg.create_rsp->status != BFA_STATUS_OK);
@@ -1267,7 +1267,7 @@ bfa_itnim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
                bfa_sm_send_event(itnim, BFA_ITNIM_SM_FWRSP);
                break;
 
-       case BFI_ITNIM_I2H_DELETE_RSP:
+       case BFI_ITN_I2H_DELETE_RSP:
                itnim = BFA_ITNIM_FROM_TAG(fcpim,
                                                msg.delete_rsp->bfa_handle);
                WARN_ON(msg.delete_rsp->status != BFA_STATUS_OK);
@@ -1275,7 +1275,7 @@ bfa_itnim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
                bfa_sm_send_event(itnim, BFA_ITNIM_SM_FWRSP);
                break;
 
-       case BFI_ITNIM_I2H_SLER_EVENT:
+       case BFI_ITN_I2H_SLER_EVENT:
                itnim = BFA_ITNIM_FROM_TAG(fcpim,
                                                msg.sler_event->bfa_handle);
                bfa_stats(itnim, sler_events);
index 9b43ca4..eb42e74 100644 (file)
@@ -269,8 +269,8 @@ bfa_fcs_fabric_sm_created(struct bfa_fcs_fabric_s *fabric,
                break;
 
        case BFA_FCS_FABRIC_SM_DELETE:
-               bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_uninit);
-               bfa_wc_down(&fabric->fcs->wc);
+               bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_deleting);
+               bfa_fcs_fabric_delete(fabric);
                break;
 
        default:
index 61cdce4..a9942b4 100644 (file)
@@ -379,6 +379,7 @@ void bfa_fcs_vport_online(struct bfa_fcs_vport_s *vport);
 void bfa_fcs_vport_offline(struct bfa_fcs_vport_s *vport);
 void bfa_fcs_vport_delete_comp(struct bfa_fcs_vport_s *vport);
 void bfa_fcs_vport_fcs_delete(struct bfa_fcs_vport_s *vport);
+void bfa_fcs_vport_stop_comp(struct bfa_fcs_vport_s *vport);
 
 #define BFA_FCS_RPORT_DEF_DEL_TIMEOUT  90      /* in secs */
 #define BFA_FCS_RPORT_MAX_RETRIES      (5)
index 1d6be8c..a0c6f96 100644 (file)
@@ -74,6 +74,7 @@ enum bfa_fcs_lport_event {
        BFA_FCS_PORT_SM_OFFLINE = 3,
        BFA_FCS_PORT_SM_DELETE = 4,
        BFA_FCS_PORT_SM_DELRPORT = 5,
+       BFA_FCS_PORT_SM_STOP = 6,
 };
 
 static void     bfa_fcs_lport_sm_uninit(struct bfa_fcs_lport_s *port,
@@ -86,6 +87,8 @@ static void     bfa_fcs_lport_sm_offline(struct bfa_fcs_lport_s *port,
                                        enum bfa_fcs_lport_event event);
 static void     bfa_fcs_lport_sm_deleting(struct bfa_fcs_lport_s *port,
                                        enum bfa_fcs_lport_event event);
+static void    bfa_fcs_lport_sm_stopping(struct bfa_fcs_lport_s *port,
+                                       enum bfa_fcs_lport_event event);
 
 static void
 bfa_fcs_lport_sm_uninit(
@@ -123,6 +126,12 @@ bfa_fcs_lport_sm_init(struct bfa_fcs_lport_s *port,
                bfa_fcs_lport_deleted(port);
                break;
 
+       case BFA_FCS_PORT_SM_STOP:
+               /* If vport - send completion call back */
+               if (port->vport)
+                       bfa_fcs_vport_stop_comp(port->vport);
+               break;
+
        case BFA_FCS_PORT_SM_OFFLINE:
                break;
 
@@ -148,6 +157,23 @@ bfa_fcs_lport_sm_online(
                bfa_fcs_lport_offline_actions(port);
                break;
 
+       case BFA_FCS_PORT_SM_STOP:
+               __port_action[port->fabric->fab_type].offline(port);
+
+               if (port->num_rports == 0) {
+                       bfa_sm_set_state(port, bfa_fcs_lport_sm_init);
+                       /* If vport - send completion call back */
+                       if (port->vport)
+                               bfa_fcs_vport_stop_comp(port->vport);
+               } else {
+                       bfa_sm_set_state(port, bfa_fcs_lport_sm_stopping);
+                       list_for_each_safe(qe, qen, &port->rport_q) {
+                               rport = (struct bfa_fcs_rport_s *) qe;
+                               bfa_sm_send_event(rport, RPSM_EVENT_DELETE);
+                       }
+               }
+               break;
+
        case BFA_FCS_PORT_SM_DELETE:
 
                __port_action[port->fabric->fab_type].offline(port);
@@ -189,6 +215,21 @@ bfa_fcs_lport_sm_offline(
                bfa_fcs_lport_online_actions(port);
                break;
 
+       case BFA_FCS_PORT_SM_STOP:
+               if (port->num_rports == 0) {
+                       bfa_sm_set_state(port, bfa_fcs_lport_sm_init);
+                       /* If vport - send completion call back */
+                       if (port->vport)
+                               bfa_fcs_vport_stop_comp(port->vport);
+               } else {
+                       bfa_sm_set_state(port, bfa_fcs_lport_sm_stopping);
+                       list_for_each_safe(qe, qen, &port->rport_q) {
+                               rport = (struct bfa_fcs_rport_s *) qe;
+                               bfa_sm_send_event(rport, RPSM_EVENT_DELETE);
+                       }
+               }
+               break;
+
        case BFA_FCS_PORT_SM_DELETE:
                if (port->num_rports == 0) {
                        bfa_sm_set_state(port, bfa_fcs_lport_sm_uninit);
@@ -211,6 +252,28 @@ bfa_fcs_lport_sm_offline(
        }
 }
 
+static void
+bfa_fcs_lport_sm_stopping(struct bfa_fcs_lport_s *port,
+                         enum bfa_fcs_lport_event event)
+{
+       bfa_trc(port->fcs, port->port_cfg.pwwn);
+       bfa_trc(port->fcs, event);
+
+       switch (event) {
+       case BFA_FCS_PORT_SM_DELRPORT:
+               if (port->num_rports == 0) {
+                       bfa_sm_set_state(port, bfa_fcs_lport_sm_init);
+                       /* If vport - send completion call back */
+                       if (port->vport)
+                               bfa_fcs_vport_stop_comp(port->vport);
+               }
+               break;
+
+       default:
+               bfa_sm_fault(port->fcs, event);
+       }
+}
+
 static void
 bfa_fcs_lport_sm_deleting(
        struct bfa_fcs_lport_s *port,
@@ -1672,7 +1735,7 @@ bfa_fcs_lport_fdmi_build_rhba_pyld(struct bfa_fcs_lport_fdmi_s *fdmi, u8 *pyld)
        memcpy(attr->value, fcs_hba_attr->driver_version, templen);
        templen = fc_roundup(templen, sizeof(u32));
        curr_ptr += sizeof(attr->type) + sizeof(templen) + templen;
-       len += templen;;
+       len += templen;
        count++;
        attr->len = cpu_to_be16(templen + sizeof(attr->type) +
                             sizeof(templen));
@@ -4918,6 +4981,7 @@ enum bfa_fcs_vport_event {
        BFA_FCS_VPORT_SM_DELCOMP = 11,  /*  lport delete completion */
        BFA_FCS_VPORT_SM_RSP_DUP_WWN = 12,      /*  Dup wnn error*/
        BFA_FCS_VPORT_SM_RSP_FAILED = 13,       /*  non-retryable failure */
+       BFA_FCS_VPORT_SM_STOPCOMP = 14, /* vport delete completion */
 };
 
 static void     bfa_fcs_vport_sm_uninit(struct bfa_fcs_vport_s *vport,
@@ -4940,6 +5004,10 @@ static void     bfa_fcs_vport_sm_logo(struct bfa_fcs_vport_s *vport,
                                      enum bfa_fcs_vport_event event);
 static void     bfa_fcs_vport_sm_error(struct bfa_fcs_vport_s *vport,
                                      enum bfa_fcs_vport_event event);
+static void    bfa_fcs_vport_sm_stopping(struct bfa_fcs_vport_s *vport,
+                                       enum bfa_fcs_vport_event event);
+static void    bfa_fcs_vport_sm_logo_for_stop(struct bfa_fcs_vport_s *vport,
+                                       enum bfa_fcs_vport_event event);
 
 static struct bfa_sm_table_s  vport_sm_table[] = {
        {BFA_SM(bfa_fcs_vport_sm_uninit), BFA_FCS_VPORT_UNINIT},
@@ -5042,6 +5110,11 @@ bfa_fcs_vport_sm_offline(struct bfa_fcs_vport_s *vport,
                bfa_fcs_vport_do_fdisc(vport);
                break;
 
+       case BFA_FCS_VPORT_SM_STOP:
+               bfa_sm_set_state(vport, bfa_fcs_vport_sm_cleanup);
+               bfa_sm_send_event(&vport->lport, BFA_FCS_PORT_SM_STOP);
+               break;
+
        case BFA_FCS_VPORT_SM_OFFLINE:
                /*
                 * This can happen if the vport couldn't be initialzied
@@ -5155,6 +5228,11 @@ bfa_fcs_vport_sm_online(struct bfa_fcs_vport_s *vport,
                bfa_fcs_lport_delete(&vport->lport);
                break;
 
+       case BFA_FCS_VPORT_SM_STOP:
+               bfa_sm_set_state(vport, bfa_fcs_vport_sm_stopping);
+               bfa_sm_send_event(&vport->lport, BFA_FCS_PORT_SM_STOP);
+               break;
+
        case BFA_FCS_VPORT_SM_OFFLINE:
                bfa_sm_set_state(vport, bfa_fcs_vport_sm_offline);
                bfa_sm_send_event(vport->lps, BFA_LPS_SM_OFFLINE);
@@ -5166,6 +5244,32 @@ bfa_fcs_vport_sm_online(struct bfa_fcs_vport_s *vport,
        }
 }
 
+/*
+ * Vport is being stopped - awaiting lport stop completion to send
+ * LOGO to fabric.
+ */
+static void
+bfa_fcs_vport_sm_stopping(struct bfa_fcs_vport_s *vport,
+                         enum bfa_fcs_vport_event event)
+{
+       bfa_trc(__vport_fcs(vport), __vport_pwwn(vport));
+       bfa_trc(__vport_fcs(vport), event);
+
+       switch (event) {
+       case BFA_FCS_VPORT_SM_STOPCOMP:
+               bfa_sm_set_state(vport, bfa_fcs_vport_sm_logo_for_stop);
+               bfa_fcs_vport_do_logo(vport);
+               break;
+
+       case BFA_FCS_VPORT_SM_OFFLINE:
+               bfa_sm_set_state(vport, bfa_fcs_vport_sm_cleanup);
+               break;
+
+       default:
+               bfa_sm_fault(__vport_fcs(vport), event);
+       }
+}
+
 /*
  * Vport is being deleted - awaiting lport delete completion to send
  * LOGO to fabric.
@@ -5236,6 +5340,10 @@ bfa_fcs_vport_sm_cleanup(struct bfa_fcs_vport_s *vport,
                bfa_fcs_vport_free(vport);
                break;
 
+       case BFA_FCS_VPORT_SM_STOPCOMP:
+               bfa_sm_set_state(vport, bfa_fcs_vport_sm_created);
+               break;
+
        case BFA_FCS_VPORT_SM_DELETE:
                break;
 
@@ -5244,6 +5352,34 @@ bfa_fcs_vport_sm_cleanup(struct bfa_fcs_vport_s *vport,
        }
 }
 
+/*
+ * LOGO is sent to fabric. Vport stop is in progress. Lport stop cleanup
+ * is done.
+ */
+static void
+bfa_fcs_vport_sm_logo_for_stop(struct bfa_fcs_vport_s *vport,
+                              enum bfa_fcs_vport_event event)
+{
+       bfa_trc(__vport_fcs(vport), __vport_pwwn(vport));
+       bfa_trc(__vport_fcs(vport), event);
+
+       switch (event) {
+       case BFA_FCS_VPORT_SM_OFFLINE:
+               bfa_sm_send_event(vport->lps, BFA_LPS_SM_OFFLINE);
+               /*
+                * !!! fall through !!!
+                */
+
+       case BFA_FCS_VPORT_SM_RSP_OK:
+       case BFA_FCS_VPORT_SM_RSP_ERROR:
+               bfa_sm_set_state(vport, bfa_fcs_vport_sm_created);
+               break;
+
+       default:
+               bfa_sm_fault(__vport_fcs(vport), event);
+       }
+}
+
 /*
  * LOGO is sent to fabric. Vport delete is in progress. Lport delete cleanup
  * is done.
@@ -5421,6 +5557,15 @@ bfa_fcs_vport_fcs_delete(struct bfa_fcs_vport_s *vport)
        bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_DELETE);
 }
 
+/*
+ * Stop completion callback from associated lport
+ */
+void
+bfa_fcs_vport_stop_comp(struct bfa_fcs_vport_s *vport)
+{
+       bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_STOPCOMP);
+}
+
 /*
  * Delete completion callback from associated lport
  */
index 3917967..7096c5f 100644 (file)
@@ -172,7 +172,7 @@ enum bfi_mclass {
        BFI_MC_FCXP             = 9,    /*  FC Transport                    */
        BFI_MC_LPS              = 10,   /*  lport fc login services         */
        BFI_MC_RPORT            = 11,   /*  Remote port             */
-       BFI_MC_ITNIM            = 12,   /*  I-T nexus (Initiator mode)      */
+       BFI_MC_ITN              = 12,   /*  I-T nexus (Initiator mode)      */
        BFI_MC_IOIM_READ        = 13,   /*  read IO (Initiator mode)        */
        BFI_MC_IOIM_WRITE       = 14,   /*  write IO (Initiator mode)       */
        BFI_MC_IOIM_IO          = 15,   /*  IO (Initiator mode)     */
index c9c8e8d..d43bf6a 100644 (file)
@@ -373,7 +373,8 @@ struct bfi_lps_login_req_s {
        wwn_t           nwwn;
        u8              fdisc;
        u8              auth_en;
-       u8              rsvd[2];
+       u8              lps_role;
+       u8              rsvd[1];
 };
 
 struct bfi_lps_login_rsp_s {
@@ -515,62 +516,63 @@ union bfi_rport_i2h_msg_u {
  * Initiator mode I-T nexus interface defines.
  */
 
-enum bfi_itnim_h2i {
-       BFI_ITNIM_H2I_CREATE_REQ = 1,   /*  i-t nexus creation */
-       BFI_ITNIM_H2I_DELETE_REQ = 2,   /*  i-t nexus deletion */
+enum bfi_itn_h2i {
+       BFI_ITN_H2I_CREATE_REQ = 1,     /*  i-t nexus creation */
+       BFI_ITN_H2I_DELETE_REQ = 2,     /*  i-t nexus deletion */
 };
 
-enum bfi_itnim_i2h {
-       BFI_ITNIM_I2H_CREATE_RSP = BFA_I2HM(1),
-       BFI_ITNIM_I2H_DELETE_RSP = BFA_I2HM(2),
-       BFI_ITNIM_I2H_SLER_EVENT = BFA_I2HM(3),
+enum bfi_itn_i2h {
+       BFI_ITN_I2H_CREATE_RSP = BFA_I2HM(1),
+       BFI_ITN_I2H_DELETE_RSP = BFA_I2HM(2),
+       BFI_ITN_I2H_SLER_EVENT = BFA_I2HM(3),
 };
 
-struct bfi_itnim_create_req_s {
+struct bfi_itn_create_req_s {
        struct bfi_mhdr_s  mh;          /*  common msg header            */
        u16     fw_handle;      /*  f/w handle for itnim         */
        u8      class;          /*  FC class for IO              */
        u8      seq_rec;        /*  sequence recovery support    */
        u8      msg_no;         /*  seq id of the msg            */
+       u8      role;
 };
 
-struct bfi_itnim_create_rsp_s {
+struct bfi_itn_create_rsp_s {
        struct bfi_mhdr_s  mh;          /*  common msg header            */
        u16     bfa_handle;     /*  bfa handle for itnim         */
        u8      status;         /*  fcp request status           */
        u8      seq_id;         /*  seq id of the msg            */
 };
 
-struct bfi_itnim_delete_req_s {
+struct bfi_itn_delete_req_s {
        struct bfi_mhdr_s  mh;          /*  common msg header            */
        u16     fw_handle;      /*  f/w itnim handle             */
        u8      seq_id;         /*  seq id of the msg            */
        u8      rsvd;
 };
 
-struct bfi_itnim_delete_rsp_s {
+struct bfi_itn_delete_rsp_s {
        struct bfi_mhdr_s  mh;          /*  common msg header            */
        u16     bfa_handle;     /*  bfa handle for itnim         */
        u8      status;         /*  fcp request status           */
        u8      seq_id;         /*  seq id of the msg            */
 };
 
-struct bfi_itnim_sler_event_s {
+struct bfi_itn_sler_event_s {
        struct bfi_mhdr_s  mh;          /*  common msg header            */
        u16     bfa_handle;     /*  bfa handle for itnim         */
        u16     rsvd;
 };
 
-union bfi_itnim_h2i_msg_u {
-       struct bfi_itnim_create_req_s *create_req;
-       struct bfi_itnim_delete_req_s *delete_req;
+union bfi_itn_h2i_msg_u {
+       struct bfi_itn_create_req_s *create_req;
+       struct bfi_itn_delete_req_s *delete_req;
        struct bfi_msg_s        *msg;
 };
 
-union bfi_itnim_i2h_msg_u {
-       struct bfi_itnim_create_rsp_s *create_rsp;
-       struct bfi_itnim_delete_rsp_s *delete_rsp;
-       struct bfi_itnim_sler_event_s *sler_event;
+union bfi_itn_i2h_msg_u {
+       struct bfi_itn_create_rsp_s *create_rsp;
+       struct bfi_itn_delete_rsp_s *delete_rsp;
+       struct bfi_itn_sler_event_s *sler_event;
        struct bfi_msg_s        *msg;
 };