• Vladimir Oltean's avatar
    net: mscc: ocelot: fix last VCAP IS1/IS2 filter persisting in hardware when deleted · 16bbebd3
    Vladimir Oltean authored
    ocelot_vcap_filter_del() works by moving the next filters over the
    current one, and then deleting the last filter by calling vcap_entry_set()
    with a del_filter which was specially created by memsetting its memory
    to zeroes. vcap_entry_set() then programs this to the TCAM and action
    RAM via the cache registers.
    
    The problem is that vcap_entry_set() is a dispatch function which looks
    at del_filter->block_id. But since del_filter is zeroized memory, the
    block_id is 0, or otherwise said, VCAP_ES0. So practically, what we do
    is delete the entry at the same TCAM index from VCAP ES0 instead of IS1
    or IS2.
    
    The code was not always like this. vcap_entry_set() used to simply be
    is2_entry_set(), and then, the logic used to work.
    
    Restore the functionality by populating the block_id of the del_filter
    based on the VCAP block of the filter that we're deleting. This makes
    vcap_entry_set() know what to do.
    
    Fixes: 1397a2eb ("net: mscc: ocelot: create TCAM skeleton from tc filter chains")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    16bbebd3
ocelot_vcap.c 43 KB