u32 per_vf_tids;
 };
 
-static void qed_cxt_tm_iids(struct qed_cxt_mngr *p_mngr,
+static void qed_cxt_tm_iids(struct qed_hwfn *p_hwfn,
+                           struct qed_cxt_mngr *p_mngr,
                            struct qed_tm_iids *iids)
 {
-       u32 i, j;
-
-       for (i = 0; i < MAX_CONN_TYPES; i++) {
+       bool tm_vf_required = false;
+       bool tm_required = false;
+       int i, j;
+
+       /* Timers is a special case -> we don't count how many cids require
+        * timers but what's the max cid that will be used by the timer block.
+        * therefore we traverse in reverse order, and once we hit a protocol
+        * that requires the timers memory, we'll sum all the protocols up
+        * to that one.
+        */
+       for (i = MAX_CONN_TYPES - 1; i >= 0; i--) {
                struct qed_conn_type_cfg *p_cfg = &p_mngr->conn_cfg[i];
 
-               if (tm_cid_proto(i)) {
+               if (tm_cid_proto(i) || tm_required) {
+                       if (p_cfg->cid_count)
+                               tm_required = true;
+
                        iids->pf_cids += p_cfg->cid_count;
+               }
+
+               if (tm_cid_proto(i) || tm_vf_required) {
+                       if (p_cfg->cids_per_vf)
+                               tm_vf_required = true;
+
                        iids->per_vf_cids += p_cfg->cids_per_vf;
                }
 
 
        /* TM PF */
        p_cli = &p_mngr->clients[ILT_CLI_TM];
-       qed_cxt_tm_iids(p_mngr, &tm_iids);
+       qed_cxt_tm_iids(p_hwfn, p_mngr, &tm_iids);
        total = tm_iids.pf_cids + tm_iids.pf_tids_total;
        if (total) {
                p_blk = &p_cli->pf_blks[0];
        u8 i;
 
        memset(&tm_iids, 0, sizeof(tm_iids));
-       qed_cxt_tm_iids(p_mngr, &tm_iids);
+       qed_cxt_tm_iids(p_hwfn, p_mngr, &tm_iids);
 
        /* @@@TBD No pre-scan for now */