From: Vladimir Oltean <vladimir.olt...@nxp.com>

The dynamic configuration interface for the General Params and the L2
Lookup Params tables was copy-pasted between E/T devices and P/Q/R/S
devices. Nonetheless, these interfaces are bitwise different.

The driver is using dynamic reconfiguration of the General Parameters
table for the port mirroring feature, which was therefore broken on
P/Q/R/S.

Note that this patch can't be backported easily very far to stable trees
(since it conflicts with some other development done since the
introduction of the driver). So the Fixes: tag is purely informational.

Fixes: 8aa9ebccae87 ("net: dsa: Introduce driver for NXP SJA1105 5-port L2 
switch")
Signed-off-by: Vladimir Oltean <vladimir.olt...@nxp.com>
---
 .../net/dsa/sja1105/sja1105_dynamic_config.c  | 50 +++++++++++++++----
 .../net/dsa/sja1105/sja1105_static_config.c   | 10 ++--
 .../net/dsa/sja1105/sja1105_static_config.h   |  4 ++
 3 files changed, 48 insertions(+), 16 deletions(-)

diff --git a/drivers/net/dsa/sja1105/sja1105_dynamic_config.c 
b/drivers/net/dsa/sja1105/sja1105_dynamic_config.c
index 7516f2ffdd4e..4471eeccc293 100644
--- a/drivers/net/dsa/sja1105/sja1105_dynamic_config.c
+++ b/drivers/net/dsa/sja1105/sja1105_dynamic_config.c
@@ -127,9 +127,15 @@
 #define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_DYN_CMD                        \
        SJA1105_SIZE_DYN_CMD
 
+#define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_DYN_CMD              \
+       (SJA1105_SIZE_DYN_CMD + SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY)
+
 #define SJA1105ET_SIZE_GENERAL_PARAMS_DYN_CMD                  \
        SJA1105_SIZE_DYN_CMD
 
+#define SJA1105PQRS_SIZE_GENERAL_PARAMS_DYN_CMD                        \
+       (SJA1105_SIZE_DYN_CMD + SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY)
+
 #define SJA1105PQRS_SIZE_AVB_PARAMS_DYN_CMD                    \
        (SJA1105_SIZE_DYN_CMD + SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY)
 
@@ -143,7 +149,7 @@
        (SJA1105_SIZE_DYN_CMD + SJA1105PQRS_SIZE_CBS_ENTRY)
 
 #define SJA1105_MAX_DYN_CMD_SIZE                               \
-       SJA1105PQRS_SIZE_MAC_CONFIG_DYN_CMD
+       SJA1105PQRS_SIZE_GENERAL_PARAMS_DYN_CMD
 
 struct sja1105_dyn_cmd {
        bool search;
@@ -500,6 +506,18 @@ sja1105et_l2_lookup_params_entry_packing(void *buf, void 
*entry_ptr,
        return 0;
 }
 
+static void
+sja1105pqrs_l2_lookup_params_cmd_packing(void *buf,
+                                        struct sja1105_dyn_cmd *cmd,
+                                        enum packing_op op)
+{
+       u8 *p = buf + SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY;
+       const int size = SJA1105_SIZE_DYN_CMD;
+
+       sja1105_packing(p, &cmd->valid,   31, 31, size, op);
+       sja1105_packing(p, &cmd->rdwrset, 30, 30, size, op);
+}
+
 static void
 sja1105et_general_params_cmd_packing(void *buf, struct sja1105_dyn_cmd *cmd,
                                     enum packing_op op)
@@ -522,6 +540,18 @@ sja1105et_general_params_entry_packing(void *buf, void 
*entry_ptr,
        return 0;
 }
 
+static void
+sja1105pqrs_general_params_cmd_packing(void *buf, struct sja1105_dyn_cmd *cmd,
+                                      enum packing_op op)
+{
+       u8 *p = buf + SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY;
+       const int size = SJA1105_SIZE_DYN_CMD;
+
+       sja1105_packing(p, &cmd->valid,   31, 31, size, op);
+       sja1105_packing(p, &cmd->errors,  30, 30, size, op);
+       sja1105_packing(p, &cmd->rdwrset, 28, 28, size, op);
+}
+
 static void
 sja1105pqrs_avb_params_cmd_packing(void *buf, struct sja1105_dyn_cmd *cmd,
                                   enum packing_op op)
@@ -761,12 +791,12 @@ struct sja1105_dynamic_table_ops 
sja1105pqrs_dyn_ops[BLK_IDX_MAX_DYN] = {
        [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {0},
        [BLK_IDX_VL_FORWARDING_PARAMS] = {0},
        [BLK_IDX_L2_LOOKUP_PARAMS] = {
-               .entry_packing = sja1105et_l2_lookup_params_entry_packing,
-               .cmd_packing = sja1105et_l2_lookup_params_cmd_packing,
+               .entry_packing = sja1105pqrs_l2_lookup_params_entry_packing,
+               .cmd_packing = sja1105pqrs_l2_lookup_params_cmd_packing,
                .max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
                .access = (OP_READ | OP_WRITE),
-               .packed_size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_DYN_CMD,
-               .addr = 0x38,
+               .packed_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_DYN_CMD,
+               .addr = 0x54,
        },
        [BLK_IDX_L2_FORWARDING_PARAMS] = {0},
        [BLK_IDX_AVB_PARAMS] = {
@@ -778,12 +808,12 @@ struct sja1105_dynamic_table_ops 
sja1105pqrs_dyn_ops[BLK_IDX_MAX_DYN] = {
                .addr = 0x8003,
        },
        [BLK_IDX_GENERAL_PARAMS] = {
-               .entry_packing = sja1105et_general_params_entry_packing,
-               .cmd_packing = sja1105et_general_params_cmd_packing,
+               .entry_packing = sja1105pqrs_general_params_entry_packing,
+               .cmd_packing = sja1105pqrs_general_params_cmd_packing,
                .max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
-               .access = OP_WRITE,
-               .packed_size = SJA1105ET_SIZE_GENERAL_PARAMS_DYN_CMD,
-               .addr = 0x34,
+               .access = (OP_READ | OP_WRITE),
+               .packed_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_DYN_CMD,
+               .addr = 0x3B,
        },
        [BLK_IDX_RETAGGING] = {
                .entry_packing = sja1105_retagging_entry_packing,
diff --git a/drivers/net/dsa/sja1105/sja1105_static_config.c 
b/drivers/net/dsa/sja1105/sja1105_static_config.c
index 780aca034cdc..ff3fe471efc2 100644
--- a/drivers/net/dsa/sja1105/sja1105_static_config.c
+++ b/drivers/net/dsa/sja1105/sja1105_static_config.c
@@ -146,9 +146,8 @@ static size_t sja1105et_general_params_entry_packing(void 
*buf, void *entry_ptr,
 /* TPID and TPID2 are intentionally reversed so that semantic
  * compatibility with E/T is kept.
  */
-static size_t
-sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
-                                        enum packing_op op)
+size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
+                                               enum packing_op op)
 {
        const size_t size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY;
        struct sja1105_general_params_entry *entry = entry_ptr;
@@ -228,9 +227,8 @@ sja1105et_l2_lookup_params_entry_packing(void *buf, void 
*entry_ptr,
        return size;
 }
 
-static size_t
-sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
-                                          enum packing_op op)
+size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
+                                                 enum packing_op op)
 {
        const size_t size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY;
        struct sja1105_l2_lookup_params_entry *entry = entry_ptr;
diff --git a/drivers/net/dsa/sja1105/sja1105_static_config.h 
b/drivers/net/dsa/sja1105/sja1105_static_config.h
index 8279f4f31eff..ee0f10062763 100644
--- a/drivers/net/dsa/sja1105/sja1105_static_config.h
+++ b/drivers/net/dsa/sja1105/sja1105_static_config.h
@@ -431,6 +431,10 @@ void sja1105_packing(void *buf, u64 *val, int start, int 
end,
                     size_t len, enum packing_op op);
 
 /* Common implementations for the static and dynamic configs */
+size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
+                                               enum packing_op op);
+size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
+                                                 enum packing_op op);
 size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
                                           enum packing_op op);
 size_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
-- 
2.25.1

Reply via email to