scsi: lpfc: Add warning notification period to CMF_SYNC_WQE
authorJames Smart <jsmart2021@gmail.com>
Fri, 19 Aug 2022 01:17:33 +0000 (18:17 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 1 Sep 2022 03:39:58 +0000 (23:39 -0400)
Add capability to specify warning notification period to help firmware
adjust to congestion accordingly.

Link: https://lore.kernel.org/r/20220819011736.14141-5-jsmart2021@gmail.com
Co-developed-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc.h
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_sli.c

index 11a05f2c88c44a34b7ee555bacdf1ee4c7892e0f..71e6dae5eae85e22cff18995fdf4e35aa2b7925a 100644 (file)
@@ -1564,7 +1564,7 @@ struct lpfc_hba {
                /* cgn_reg_signal and cgn_init_reg_signal use
                 * enum fc_edc_cg_signal_cap_types
                 */
-       u16 cgn_fpin_frequency;
+       u16 cgn_fpin_frequency;         /* In units of msecs */
 #define LPFC_FPIN_INIT_FREQ    0xffff
        u32 cgn_sig_freq;
        u32 cgn_acqe_cnt;
index 4527fef23ae76257d44f76fc468c0dcc0677b474..ca49679e87b9b35e2bdc17fbbface3d6e47eadc5 100644 (file)
@@ -738,6 +738,7 @@ struct lpfc_register {
 #define lpfc_sliport_eqdelay_id_WORD   word0
 #define LPFC_SEC_TO_USEC               1000000
 #define LPFC_SEC_TO_MSEC               1000
+#define LPFC_MSECS_TO_SECS(msecs) ((msecs) / 1000)
 
 /* The following Registers apply to SLI4 if_type 0 UCNAs. They typically
  * reside in BAR 2.
@@ -4798,6 +4799,9 @@ struct cmf_sync_wqe {
 #define cmf_sync_cqid_WORD     word11
        uint32_t read_bytes;
        uint32_t word13;
+#define cmf_sync_period_SHIFT  16
+#define cmf_sync_period_MASK   0x0000ffff
+#define cmf_sync_period_WORD   word13
        uint32_t word14;
        uint32_t word15;
 };
index 55c9eb39ea19441abd8298a7c9c409a4a165e269..0f2b6ac56bafe303010bd831e11435f44c139b63 100644 (file)
@@ -1916,6 +1916,7 @@ lpfc_issue_cmf_sync_wqe(struct lpfc_hba *phba, u32 ms, u64 total)
        unsigned long iflags;
        u32 ret_val;
        u32 atot, wtot, max;
+       u16 warn_sync_period = 0;
 
        /* First address any alarm / warning activity */
        atot = atomic_xchg(&phba->cgn_sync_alarm_cnt, 0);
@@ -1970,10 +1971,14 @@ lpfc_issue_cmf_sync_wqe(struct lpfc_hba *phba, u32 ms, u64 total)
                                lpfc_acqe_cgn_frequency;
                        bf_set(cmf_sync_wsigmax, &wqe->cmf_sync, max);
                        bf_set(cmf_sync_wsigcnt, &wqe->cmf_sync, wtot);
+                       warn_sync_period = lpfc_acqe_cgn_frequency;
                } else {
                        /* We hit a FPIN warning condition */
                        bf_set(cmf_sync_wfpinmax, &wqe->cmf_sync, 1);
                        bf_set(cmf_sync_wfpincnt, &wqe->cmf_sync, 1);
+                       if (phba->cgn_fpin_frequency != LPFC_FPIN_INIT_FREQ)
+                               warn_sync_period =
+                               LPFC_MSECS_TO_SECS(phba->cgn_fpin_frequency);
                }
        }
 
@@ -1989,6 +1994,7 @@ initpath:
        bf_set(cmf_sync_reqtag, &wqe->cmf_sync, sync_buf->iotag);
 
        bf_set(cmf_sync_qosd, &wqe->cmf_sync, 1);
+       bf_set(cmf_sync_period, &wqe->cmf_sync, warn_sync_period);
 
        bf_set(cmf_sync_cmd_type, &wqe->cmf_sync, CMF_SYNC_COMMAND);
        bf_set(cmf_sync_wqec, &wqe->cmf_sync, 1);