From: Jiri Pirko <j...@mellanox.com>

RX_ACL_SYSTEM_PORT is 8 bit but SRC_SYS_PORT is 16 bits. Internally,
SRC_SYS_PORT is used to carry the value. Relax the checker in case of
RX_ACL_SYSTEM_PORT and allow different size.

Signed-off-by: Jiri Pirko <j...@mellanox.com>
Signed-off-by: Ido Schimmel <ido...@mellanox.com>
---
 .../ethernet/mellanox/mlxsw/core_acl_flex_keys.c   |  5 +++--
 .../ethernet/mellanox/mlxsw/core_acl_flex_keys.h   | 14 +++++++++-----
 .../mellanox/mlxsw/spectrum_acl_flex_keys.c        |  2 +-
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c 
b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c
index f6e44ca50cae..feb4672a5ac0 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c
@@ -30,8 +30,9 @@ static bool mlxsw_afk_blocks_check(struct mlxsw_afk 
*mlxsw_afk)
 
                        elinst = &block->instances[j];
                        if (elinst->type != elinst->info->type ||
-                           elinst->item.size.bits !=
-                           elinst->info->item.size.bits)
+                           (!elinst->avoid_size_check &&
+                            elinst->item.size.bits !=
+                            elinst->info->item.size.bits))
                                return false;
                }
        }
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h 
b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
index 78495826ff17..d99a70eec357 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
@@ -110,10 +110,11 @@ struct mlxsw_afk_element_inst { /* element instance in 
actual block */
        int u32_key_diff; /* in case value needs to be adjusted before write
                           * this diff is here to handle that
                           */
+       bool avoid_size_check;
 };
 
 #define MLXSW_AFK_ELEMENT_INST(_type, _element, _offset,                       
\
-                              _shift, _size, _u32_key_diff)                    
\
+                              _shift, _size, _u32_key_diff, _avoid_size_check) 
\
        {                                                                       
\
                .info = &mlxsw_afk_element_infos[MLXSW_AFK_ELEMENT_##_element], 
\
                .type = _type,                                                  
\
@@ -124,20 +125,23 @@ struct mlxsw_afk_element_inst { /* element instance in 
actual block */
                        .name = #_element,                                      
\
                },                                                              
\
                .u32_key_diff = _u32_key_diff,                                  
\
+               .avoid_size_check = _avoid_size_check,                          
\
        }
 
 #define MLXSW_AFK_ELEMENT_INST_U32(_element, _offset, _shift, _size)           
\
        MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_U32,                      
\
-                              _element, _offset, _shift, _size, 0)
+                              _element, _offset, _shift, _size, 0, false)
 
 #define MLXSW_AFK_ELEMENT_INST_EXT_U32(_element, _offset,                      
\
-                                      _shift, _size, _key_diff)                
\
+                                      _shift, _size, _key_diff,                
\
+                                      _avoid_size_check)                       
\
        MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_U32,                      
\
-                              _element, _offset, _shift, _size, _key_diff)
+                              _element, _offset, _shift, _size,                
\
+                              _key_diff, _avoid_size_check)
 
 #define MLXSW_AFK_ELEMENT_INST_BUF(_element, _offset, _size)                   
\
        MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_BUF,                      
\
-                              _element, _offset, 0, _size, 0)
+                              _element, _offset, 0, _size, 0, false)
 
 struct mlxsw_afk_block {
        u16 encoding; /* block ID */
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c
index 682c19e220fa..96fc981ed851 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c
@@ -149,7 +149,7 @@ static struct mlxsw_afk_element_inst 
mlxsw_sp_afk_element_info_mac_4[] = {
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_mac_5[] = {
        MLXSW_AFK_ELEMENT_INST_U32(VID, 0x04, 16, 12),
-       MLXSW_AFK_ELEMENT_INST_EXT_U32(SRC_SYS_PORT, 0x04, 0, 8, -1), /* 
RX_ACL_SYSTEM_PORT */
+       MLXSW_AFK_ELEMENT_INST_EXT_U32(SRC_SYS_PORT, 0x04, 0, 8, -1, true), /* 
RX_ACL_SYSTEM_PORT */
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_0[] = {
-- 
2.20.1

Reply via email to