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

RX_ACL_SYSTEM_PORT is equal to SRC_SYS_PORT - 1. So before write to
block we need to adjust the key value. Introduce new "EXT" helper to
implement this.

Signed-off-by: Jiri Pirko <j...@mellanox.com>
Signed-off-by: Ido Schimmel <ido...@mellanox.com>
---
 .../ethernet/mellanox/mlxsw/core_acl_flex_keys.c | 13 +++++++------
 .../ethernet/mellanox/mlxsw/core_acl_flex_keys.h | 16 +++++++++++++---
 .../mellanox/mlxsw/spectrum_acl_flex_keys.c      |  2 +-
 3 files changed, 21 insertions(+), 10 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 cb3e663b1d37..f6e44ca50cae 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c
@@ -385,12 +385,12 @@ EXPORT_SYMBOL(mlxsw_afk_values_add_buf);
 
 static void mlxsw_sp_afk_encode_u32(const struct mlxsw_item *storage_item,
                                    const struct mlxsw_item *output_item,
-                                   char *storage, char *output)
+                                   char *storage, char *output, int diff)
 {
        u32 value;
 
        value = __mlxsw_item_get32(storage, storage_item, 0);
-       __mlxsw_item_set32(output, output_item, 0, value);
+       __mlxsw_item_set32(output, output_item, 0, value + diff);
 }
 
 static void mlxsw_sp_afk_encode_buf(const struct mlxsw_item *storage_item,
@@ -406,14 +406,14 @@ static void mlxsw_sp_afk_encode_buf(const struct 
mlxsw_item *storage_item,
 
 static void
 mlxsw_sp_afk_encode_one(const struct mlxsw_afk_element_inst *elinst,
-                       char *output, char *storage)
+                       char *output, char *storage, int u32_diff)
 {
        const struct mlxsw_item *storage_item = &elinst->info->item;
        const struct mlxsw_item *output_item = &elinst->item;
 
        if (elinst->type == MLXSW_AFK_ELEMENT_TYPE_U32)
                mlxsw_sp_afk_encode_u32(storage_item, output_item,
-                                       storage, output);
+                                       storage, output, u32_diff);
        else if (elinst->type == MLXSW_AFK_ELEMENT_TYPE_BUF)
                mlxsw_sp_afk_encode_buf(storage_item, output_item,
                                        storage, output);
@@ -446,9 +446,10 @@ void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
                                continue;
 
                        mlxsw_sp_afk_encode_one(elinst, block_key,
-                                               values->storage.key);
+                                               values->storage.key,
+                                               elinst->u32_key_diff);
                        mlxsw_sp_afk_encode_one(elinst, block_mask,
-                                               values->storage.mask);
+                                               values->storage.mask, 0);
                }
 
                mlxsw_afk->ops->encode_block(key, i, block_key);
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 4a625cdf3e7c..78495826ff17 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
@@ -107,9 +107,13 @@ struct mlxsw_afk_element_inst { /* element instance in 
actual block */
        const struct mlxsw_afk_element_info *info;
        enum mlxsw_afk_element_type type;
        struct mlxsw_item item; /* element geometry in block */
+       int u32_key_diff; /* in case value needs to be adjusted before write
+                          * this diff is here to handle that
+                          */
 };
 
-#define MLXSW_AFK_ELEMENT_INST(_type, _element, _offset, _shift, _size)        
        \
+#define MLXSW_AFK_ELEMENT_INST(_type, _element, _offset,                       
\
+                              _shift, _size, _u32_key_diff)                    
\
        {                                                                       
\
                .info = &mlxsw_afk_element_infos[MLXSW_AFK_ELEMENT_##_element], 
\
                .type = _type,                                                  
\
@@ -119,15 +123,21 @@ struct mlxsw_afk_element_inst { /* element instance in 
actual block */
                        .size = {.bits = _size},                                
\
                        .name = #_element,                                      
\
                },                                                              
\
+               .u32_key_diff = _u32_key_diff,                                  
\
        }
 
 #define MLXSW_AFK_ELEMENT_INST_U32(_element, _offset, _shift, _size)           
\
        MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_U32,                      
\
-                              _element, _offset, _shift, _size)
+                              _element, _offset, _shift, _size, 0)
+
+#define MLXSW_AFK_ELEMENT_INST_EXT_U32(_element, _offset,                      
\
+                                      _shift, _size, _key_diff)                
\
+       MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_U32,                      
\
+                              _element, _offset, _shift, _size, _key_diff)
 
 #define MLXSW_AFK_ELEMENT_INST_BUF(_element, _offset, _size)                   
\
        MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_BUF,                      
\
-                              _element, _offset, 0, _size)
+                              _element, _offset, 0, _size, 0)
 
 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 2a998dea4f39..682c19e220fa 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_U32(SRC_SYS_PORT, 0x04, 0, 8), /* 
RX_ACL_SYSTEM_PORT */
+       MLXSW_AFK_ELEMENT_INST_EXT_U32(SRC_SYS_PORT, 0x04, 0, 8, -1), /* 
RX_ACL_SYSTEM_PORT */
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_0[] = {
-- 
2.20.1

Reply via email to