#define MVPP22_CLS_C2_TCAM_DATA4               0x1b20
 #define     MVPP22_CLS_C2_LU_TYPE(lu)          ((lu) & 0x3f)
 #define     MVPP22_CLS_C2_PORT_ID(port)                ((port) << 8)
+#define MVPP22_CLS_C2_TCAM_INV                 0x1b24
+#define     MVPP22_CLS_C2_TCAM_INV_BIT         BIT(31)
 #define MVPP22_CLS_C2_HIT_CTR                  0x1b50
 #define MVPP22_CLS_C2_ACT                      0x1b60
 #define     MVPP22_CLS_C2_ACT_RSS_EN(act)      (((act) & 0x3) << 19)
 
 static void mvpp2_cls_c2_write(struct mvpp2 *priv,
                               struct mvpp2_cls_c2_entry *c2)
 {
+       u32 val;
        mvpp2_write(priv, MVPP22_CLS_C2_TCAM_IDX, c2->index);
 
+       val = mvpp2_read(priv, MVPP22_CLS_C2_TCAM_INV);
+       if (c2->valid)
+               val &= ~MVPP22_CLS_C2_TCAM_INV_BIT;
+       else
+               val |= MVPP22_CLS_C2_TCAM_INV_BIT;
+       mvpp2_write(priv, MVPP22_CLS_C2_TCAM_INV, val);
+
        mvpp2_write(priv, MVPP22_CLS_C2_ACT, c2->act);
 
        mvpp2_write(priv, MVPP22_CLS_C2_ATTR0, c2->attr[0]);
 void mvpp2_cls_c2_read(struct mvpp2 *priv, int index,
                       struct mvpp2_cls_c2_entry *c2)
 {
+       u32 val;
        mvpp2_write(priv, MVPP22_CLS_C2_TCAM_IDX, index);
 
        c2->index = index;
        c2->attr[1] = mvpp2_read(priv, MVPP22_CLS_C2_ATTR1);
        c2->attr[2] = mvpp2_read(priv, MVPP22_CLS_C2_ATTR2);
        c2->attr[3] = mvpp2_read(priv, MVPP22_CLS_C2_ATTR3);
+
+       val = mvpp2_read(priv, MVPP22_CLS_C2_TCAM_INV);
+       c2->valid = !(val & MVPP22_CLS_C2_TCAM_INV_BIT);
 }
 
 /* Initialize the flow table entries for the given flow */
        c2.attr[0] = MVPP22_CLS_C2_ATTR0_QHIGH(qh) |
                      MVPP22_CLS_C2_ATTR0_QLOW(ql);
 
+       c2.valid = true;
+
        mvpp2_cls_c2_write(port->priv, &c2);
 }
 
 {
        struct mvpp2_cls_lookup_entry le;
        struct mvpp2_cls_flow_entry fe;
+       struct mvpp2_cls_c2_entry c2;
        int index;
 
        /* Enable classifier */
                mvpp2_cls_lookup_write(priv, &le);
        }
 
+       /* Clear C2 TCAM engine table */
+       memset(&c2, 0, sizeof(c2));
+       c2.valid = false;
+       for (index = 0; index < MVPP22_CLS_C2_N_ENTRIES; index++) {
+               c2.index = index;
+               mvpp2_cls_c2_write(priv, &c2);
+       }
+
        mvpp2_cls_port_init_flows(priv);
 }