]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
[SCSI] bfa: fix prli retry issues
authorJing Huang <huangj@brocade.com>
Fri, 9 Jul 2010 02:52:00 +0000 (19:52 -0700)
committerJames Bottomley <James.Bottomley@suse.de>
Tue, 27 Jul 2010 17:04:11 +0000 (12:04 -0500)
Add a max retry limit for PRLI retries. Max retry limit (5) is same as used
in rport PLOGI. Once the retries are exhausted, invoke rport offline so that
existing logic of rport re-discovery can kick-in. Also fixed a bug in rport.c
where one less retry was happening.

Signed-off-by: Jing Huang <huangj@brocade.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/bfa/fcpim.c
drivers/scsi/bfa/fcs_rport.h
drivers/scsi/bfa/include/fcs/bfa_fcs_fcpim.h
drivers/scsi/bfa/rport.c

index 7a0207e56693257552c130ef189fb51e4dc6686d..d090f7a6368ae3e3daca173794102cfa8c9b1e18 100644 (file)
@@ -110,6 +110,7 @@ bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim,
        switch (event) {
        case BFA_FCS_ITNIM_SM_ONLINE:
                bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
+               itnim->prli_retries = 0;
                bfa_fcs_itnim_send_prli(itnim, NULL);
                break;
 
@@ -218,8 +219,16 @@ bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
 
        switch (event) {
        case BFA_FCS_ITNIM_SM_TIMEOUT:
-               bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
-               bfa_fcs_itnim_send_prli(itnim, NULL);
+               if (itnim->prli_retries < BFA_FCS_RPORT_MAX_RETRIES) {
+                       itnim->prli_retries++;
+                       bfa_trc(itnim->fcs, itnim->prli_retries);
+                       bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
+                       bfa_fcs_itnim_send_prli(itnim, NULL);
+               } else {
+                       /* invoke target offline */
+                       bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
+                       bfa_fcs_rport_logo_imp(itnim->rport);
+               }
                break;
 
        case BFA_FCS_ITNIM_SM_OFFLINE:
index 9c8d1d2923807b759549f2eaffc0a2858ad9f7b4..5242ee0f03c63546b0253450e526fc9ddbf0ac59 100644 (file)
@@ -24,6 +24,8 @@
 
 #include <fcs/bfa_fcs_rport.h>
 
+#define BFA_FCS_RPORT_MAX_RETRIES               (5)
+
 void bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport, struct fchs_s *fchs,
                        u16 len);
 void bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport);
index e719f2c3eb35eee07c9469dc932503e477165942..9a35ecf5cdf0becdb5421fe81bfe695a0e7c3c51 100644 (file)
@@ -41,6 +41,7 @@ struct bfa_fcs_itnim_s {
        struct bfa_fcs_s        *fcs;           /*  fcs instance         */
        struct bfa_timer_s      timer;          /*  timer functions      */
        struct bfa_itnim_s      *bfa_itnim;     /*  BFA itnim struct     */
+       u32                     prli_retries;   /*  max prli retry attempts */
        bfa_boolean_t           seq_rec;        /*  seq recovery support */
        bfa_boolean_t           rec_support;    /*  REC supported        */
        bfa_boolean_t           conf_comp;      /*  FCP_CONF     support */
index 2796403222e161927a5620ef250dcc39525388c3..4e1fff21a5bcc3435f3aa8a92bc94a7713ff750a 100644 (file)
@@ -36,8 +36,6 @@
 
 BFA_TRC_FILE(FCS, RPORT);
 
-#define BFA_FCS_RPORT_MAX_RETRIES              (5)
-
 /* In millisecs */
 static u32 bfa_fcs_rport_del_timeout =
                        BFA_FCS_RPORT_DEF_DEL_TIMEOUT * 1000;
@@ -356,8 +354,8 @@ bfa_fcs_rport_sm_plogi_retry(struct bfa_fcs_rport_s *rport,
                 */
 
        case RPSM_EVENT_TIMEOUT:
-               rport->plogi_retries++;
                if (rport->plogi_retries < BFA_FCS_RPORT_MAX_RETRIES) {
+                       rport->plogi_retries++;
                        bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_sending);
                        bfa_fcs_rport_send_plogi(rport, NULL);
                } else {