uint32_t io_cnt;
        uint32_t head, tail;
        uint32_t busy, max_read;
-       uint64_t total, rcv, lat, mbpi;
+       uint64_t total, rcv, lat, mbpi, extra;
        int timer_interval = LPFC_CMF_INTERVAL;
        uint32_t ms;
        struct lpfc_cgn_stat *cgs;
            phba->hba_flag & HBA_SETUP) {
                mbpi = phba->cmf_last_sync_bw;
                phba->cmf_last_sync_bw = 0;
-               lpfc_issue_cmf_sync_wqe(phba, LPFC_CMF_INTERVAL, total);
+               extra = 0;
+
+               /* Calculate any extra bytes needed to account for the
+                * timer accuracy. If we are less than LPFC_CMF_INTERVAL
+                * add an extra 3% slop factor, equal to LPFC_CMF_INTERVAL
+                * add an extra 2%. The goal is to equalize total with a
+                * time > LPFC_CMF_INTERVAL or <= LPFC_CMF_INTERVAL + 1
+                */
+               if (ms == LPFC_CMF_INTERVAL)
+                       extra = div_u64(total, 50);
+               else if (ms < LPFC_CMF_INTERVAL)
+                       extra = div_u64(total, 33);
+               lpfc_issue_cmf_sync_wqe(phba, LPFC_CMF_INTERVAL, total + extra);
        } else {
                /* For Monitor mode or link down we want mbpi
                 * to be the full link speed