[SCSI] bfa: Store port configuration in flash for persistency.
authorKrishna Gudipati <kgudipat@brocade.com>
Tue, 14 Dec 2010 00:16:50 +0000 (16:16 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Tue, 21 Dec 2010 18:37:12 +0000 (12:37 -0600)
When the bfa driver is loaded a flogi is sent without the knowledge of
trunking configuration. This normal flogi causes the switch ports
which had trunking enabled to go to persistent offline.  Solution is
to store the port configuration (which has trunking info) in the flash
for persistency. The firmware will read this configuration when the
very first fcport enable is received.

Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/bfa/bfa_svc.c
drivers/scsi/bfa/bfa_svc.h
drivers/scsi/bfa/bfi_ms.h

index 8dc2e7752e4cd1977bc4c8f846110b937c4ecba5..2666472d142906c74bd24c848316be0cb60ca6d5 100644 (file)
@@ -1890,6 +1890,8 @@ bfa_fcport_sm_uninit(struct bfa_fcport_s *fcport,
                /*
                 * Start event after IOC is configured and BFA is started.
                 */
+               fcport->use_flash_cfg = BFA_TRUE;
+
                if (bfa_fcport_send_enable(fcport)) {
                        bfa_trc(fcport->bfa, BFA_TRUE);
                        bfa_sm_set_state(fcport, bfa_fcport_sm_enabling);
@@ -2855,6 +2857,7 @@ bfa_fcport_send_enable(struct bfa_fcport_s *fcport)
        m->port_cfg = fcport->cfg;
        m->msgtag = fcport->msgtag;
        m->port_cfg.maxfrsize = cpu_to_be16(fcport->cfg.maxfrsize);
+        m->use_flash_cfg = fcport->use_flash_cfg;
        bfa_dma_be_addr_set(m->stats_dma_addr, fcport->stats_pa);
        bfa_trc(fcport->bfa, m->stats_dma_addr.a32.addr_lo);
        bfa_trc(fcport->bfa, m->stats_dma_addr.a32.addr_hi);
@@ -3251,8 +3254,28 @@ bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg)
 
        switch (msg->mhdr.msg_id) {
        case BFI_FCPORT_I2H_ENABLE_RSP:
-               if (fcport->msgtag == i2hmsg.penable_rsp->msgtag)
+               if (fcport->msgtag == i2hmsg.penable_rsp->msgtag) {
+
+                       if (fcport->use_flash_cfg) {
+                               fcport->cfg = i2hmsg.penable_rsp->port_cfg;
+                               fcport->cfg.maxfrsize =
+                                       cpu_to_be16(fcport->cfg.maxfrsize);
+                               fcport->cfg.path_tov =
+                                       cpu_to_be16(fcport->cfg.path_tov);
+                               fcport->cfg.q_depth =
+                                       cpu_to_be16(fcport->cfg.q_depth);
+
+                               if (fcport->cfg.trunked)
+                                       fcport->trunk.attr.state =
+                                               BFA_TRUNK_OFFLINE;
+                               else
+                                       fcport->trunk.attr.state =
+                                               BFA_TRUNK_DISABLED;
+                               fcport->use_flash_cfg = BFA_FALSE;
+                       }
+
                        bfa_sm_send_event(fcport, BFA_FCPORT_SM_FWRSP);
+               }
                break;
 
        case BFI_FCPORT_I2H_DISABLE_RSP:
index 29b091826e9b6951dde256cce5cdc23703c75cfe..36c81c74f04aacb482f97ed2ae59532046f2b0d5 100644 (file)
@@ -444,6 +444,7 @@ struct bfa_fcport_s {
        u8                      myalpa; /*  my ALPA in LOOP topology */
        u8                      rsvd[3];
        struct bfa_port_cfg_s   cfg;    /*  current port configuration */
+       bfa_boolean_t           use_flash_cfg; /* get port cfg from flash */
        struct bfa_qos_attr_s  qos_attr;   /* QoS Attributes */
        struct bfa_qos_vc_attr_s qos_vc_attr;  /*  VC info from ELP */
        struct bfa_reqq_wait_s  reqq_wait;
index e0e5318ce007012134271c71d77da2f8ff50350e..8f22ef1a6ed9940aa6f70c0e3752ac6d4c2f6cd3 100644 (file)
@@ -188,7 +188,8 @@ struct bfi_fcport_rsp_s {
        struct bfi_mhdr_s  mh;          /*  common msg header               */
        u8                 status;      /*  port enable status              */
        u8                 rsvd[3];
-       u32        msgtag;      /*  msgtag for reply                */
+       struct  bfa_port_cfg_s port_cfg;/* port configuration   */
+       u32     msgtag;                 /* msgtag for reply     */
 };
 
 /*
@@ -202,7 +203,8 @@ struct bfi_fcport_enable_req_s {
        struct bfa_port_cfg_s port_cfg; /*  port configuration      */
        union bfi_addr_u   stats_dma_addr; /*  DMA address for stats        */
        u32        msgtag;      /*  msgtag for reply                */
-       u32        rsvd2;
+       u8      use_flash_cfg;  /* get prot cfg from flash */
+       u8      rsvd2[3];
 };
 
 /*