From: Martin Blumenstingl <[email protected]>
Only bits [5:0] in mac_bridge.key[3] are reserved for the FID. Add a
macro so this becomes obvious when reading the driver code.
Signed-off-by: Martin Blumenstingl <[email protected]>
---
drivers/net/dsa/lantiq_gswip.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/dsa/lantiq_gswip.c b/drivers/net/dsa/lantiq_gswip.c
index f2faee112e33..4bb894e75b81 100644
--- a/drivers/net/dsa/lantiq_gswip.c
+++ b/drivers/net/dsa/lantiq_gswip.c
@@ -238,6 +238,7 @@
#define GSWIP_TABLE_MAC_BRIDGE 0x0b
#define GSWIP_TABLE_MAC_BRIDGE_STATIC BIT(0) /* Static not, aging entry */
#define GSWIP_TABLE_MAC_BRIDGE_PORT GENMASK(7, 4) /* Port on learned entries */
+#define GSWIP_TABLE_MAC_BRIDGE_FID GENMASK(5, 0) /* Filtering identifier */
#define XRX200_GPHY_FW_ALIGN (16 * 1024)
@@ -1385,7 +1386,7 @@ static int gswip_port_fdb(struct dsa_switch *ds, int port,
mac_bridge.key[0] = addr[5] | (addr[4] << 8);
mac_bridge.key[1] = addr[3] | (addr[2] << 8);
mac_bridge.key[2] = addr[1] | (addr[0] << 8);
- mac_bridge.key[3] = fid;
+ mac_bridge.key[3] = FIELD_PREP(GSWIP_TABLE_MAC_BRIDGE_FID, fid);
mac_bridge.val[0] = add ? BIT(port) : 0; /* port map */
mac_bridge.val[1] = GSWIP_TABLE_MAC_BRIDGE_STATIC;
mac_bridge.valid = add;
--
2.39.2
On Thu, Jun 06, 2024 at 10:52:33AM +0200, Martin Schiller wrote:
> From: Martin Blumenstingl <[email protected]>
>
> Only bits [5:0] in mac_bridge.key[3] are reserved for the FID. Add a
> macro so this becomes obvious when reading the driver code.
>
> Signed-off-by: Martin Blumenstingl <[email protected]>
> ---
> drivers/net/dsa/lantiq_gswip.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/dsa/lantiq_gswip.c b/drivers/net/dsa/lantiq_gswip.c
> index f2faee112e33..4bb894e75b81 100644
> --- a/drivers/net/dsa/lantiq_gswip.c
> +++ b/drivers/net/dsa/lantiq_gswip.c
> @@ -238,6 +238,7 @@
> #define GSWIP_TABLE_MAC_BRIDGE 0x0b
> #define GSWIP_TABLE_MAC_BRIDGE_STATIC BIT(0) /* Static not, aging entry */
> #define GSWIP_TABLE_MAC_BRIDGE_PORT GENMASK(7, 4) /* Port on learned entries */
> +#define GSWIP_TABLE_MAC_BRIDGE_FID GENMASK(5, 0) /* Filtering identifier */
>
> #define XRX200_GPHY_FW_ALIGN (16 * 1024)
>
> @@ -1385,7 +1386,7 @@ static int gswip_port_fdb(struct dsa_switch *ds, int port,
> mac_bridge.key[0] = addr[5] | (addr[4] << 8);
> mac_bridge.key[1] = addr[3] | (addr[2] << 8);
> mac_bridge.key[2] = addr[1] | (addr[0] << 8);
> - mac_bridge.key[3] = fid;
> + mac_bridge.key[3] = FIELD_PREP(GSWIP_TABLE_MAC_BRIDGE_FID, fid);
> mac_bridge.val[0] = add ? BIT(port) : 0; /* port map */
> mac_bridge.val[1] = GSWIP_TABLE_MAC_BRIDGE_STATIC;
> mac_bridge.valid = add;
> --
> 2.39.2
On second thought, I disagree with the naming scheme of the
GSWIP_TABLE_MAC_BRIDGE_* macros. It is completely non obvious that they
are non-overlapping, because they have the same name prefix, but:
_STATIC applies to gswip_pce_table_entry :: val[1]
_PORT applies to gswip_pce_table_entry :: val[0]
_FID applies to gswip_pce_table_entry :: key[3]
I think it's all too easy to use the wrong macro on the wrong register field.
If the macros incorporated names like VAL1, KEY3 etc, it would be much
more obvious. Could you please do that?
On 2024-06-07 13:36, Vladimir Oltean wrote:
> On Thu, Jun 06, 2024 at 10:52:33AM +0200, Martin Schiller wrote:
>> From: Martin Blumenstingl <[email protected]>
>>
>> Only bits [5:0] in mac_bridge.key[3] are reserved for the FID. Add a
>> macro so this becomes obvious when reading the driver code.
>>
>> Signed-off-by: Martin Blumenstingl
>> <[email protected]>
>> ---
>> drivers/net/dsa/lantiq_gswip.c | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/dsa/lantiq_gswip.c
>> b/drivers/net/dsa/lantiq_gswip.c
>> index f2faee112e33..4bb894e75b81 100644
>> --- a/drivers/net/dsa/lantiq_gswip.c
>> +++ b/drivers/net/dsa/lantiq_gswip.c
>> @@ -238,6 +238,7 @@
>> #define GSWIP_TABLE_MAC_BRIDGE 0x0b
>> #define GSWIP_TABLE_MAC_BRIDGE_STATIC BIT(0) /* Static not, aging
>> entry */
>> #define GSWIP_TABLE_MAC_BRIDGE_PORT GENMASK(7, 4) /* Port on learned
>> entries */
>> +#define GSWIP_TABLE_MAC_BRIDGE_FID GENMASK(5, 0) /* Filtering
>> identifier */
>>
>> #define XRX200_GPHY_FW_ALIGN (16 * 1024)
>>
>> @@ -1385,7 +1386,7 @@ static int gswip_port_fdb(struct dsa_switch *ds,
>> int port,
>> mac_bridge.key[0] = addr[5] | (addr[4] << 8);
>> mac_bridge.key[1] = addr[3] | (addr[2] << 8);
>> mac_bridge.key[2] = addr[1] | (addr[0] << 8);
>> - mac_bridge.key[3] = fid;
>> + mac_bridge.key[3] = FIELD_PREP(GSWIP_TABLE_MAC_BRIDGE_FID, fid);
>> mac_bridge.val[0] = add ? BIT(port) : 0; /* port map */
>> mac_bridge.val[1] = GSWIP_TABLE_MAC_BRIDGE_STATIC;
>> mac_bridge.valid = add;
>> --
>> 2.39.2
>
> On second thought, I disagree with the naming scheme of the
> GSWIP_TABLE_MAC_BRIDGE_* macros. It is completely non obvious that they
> are non-overlapping, because they have the same name prefix, but:
> _STATIC applies to gswip_pce_table_entry :: val[1]
> _PORT applies to gswip_pce_table_entry :: val[0]
> _FID applies to gswip_pce_table_entry :: key[3]
>
> I think it's all too easy to use the wrong macro on the wrong register
> field.
> If the macros incorporated names like VAL1, KEY3 etc, it would be much
> more obvious. Could you please do that?
OK, so I'll change the macro names to
GSWIP_TABLE_MAC_BRIDGE_KEY3_FID
GSWIP_TABLE_MAC_BRIDGE_VAL0_PORT
GSWIP_TABLE_MAC_BRIDGE_VAL1_STATIC
Also the comment of GSWIP_TABLE_MAC_BRIDGE_VAL1_STATIC should be changed
to
/* Static, not aging entry */
While looking again at this diff above, I noticed that val[0] is set
incorrectly. Shouldn't it be either "port << 4" or (after the previous
patch)
"FIELD_PREP(GSWIP_TABLE_MAC_BRIDGE_PORT, port);" instead of "BIT(port)"?
On 2024-06-07 16:27, Martin Schiller wrote:
> While looking again at this diff above, I noticed that val[0] is set
> incorrectly. Shouldn't it be either "port << 4" or (after the previous
> patch)
> "FIELD_PREP(GSWIP_TABLE_MAC_BRIDGE_PORT, port);" instead of
> "BIT(port)"?
Please ignore this comment. The format of the port specification differs
for static and dynamic (learned) entries.