mlxsw: spectrum_acl: Write RX_ACL_SYSTEM_PORT acl element correctly
authorJiri Pirko <jiri@mellanox.com>
Wed, 19 Jun 2019 06:41:05 +0000 (09:41 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 19 Jun 2019 14:09:22 +0000 (10:09 -0400)
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 <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c
drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c

index cb3e663b1d374e7da4c47ec167dd02d49c833201..f6e44ca50cae03270f389c6a5d613347f44cfe4b 100644 (file)
@@ -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);
index 4a625cdf3e7cf694259f7f31683046ad53e5781d..78495826ff17555e5c8f15fa524ff956dafe15af 100644 (file)
@@ -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 */
index 2a998dea4f39c30bf16d1303aac383c20a113982..682c19e220fab6e56171e4aa9c986f4f94a18087 100644 (file)
@@ -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[] = {