[OpenWrt-Devel] [PATCH v2 1/1] kernel: ar8xxx: get_arl_table now shows all ports of an entry
John Crispin
john at phrozen.org
Mon Nov 26 12:41:51 EST 2018
On 26/11/2018 15:44, Günther Kelleter wrote:
> Multicast ARL entries can have multiple destination ports. Get and dump
> all destination ports of each entry, not just the lowest.
>
> Signed-off-by: Günther Kelleter <guenther.kelleter at devolo.de>
merged, Thanks !
> ---
>
> Changes in v2:
> - code readability
> - commit message
>
> .../generic/files/drivers/net/phy/ar8216.c | 18 ++++++++----------
> .../generic/files/drivers/net/phy/ar8216.h | 3 ++-
> .../generic/files/drivers/net/phy/ar8327.c | 10 ++--------
> .../generic/files/drivers/net/phy/ar8327.h | 1 +
> 4 files changed, 13 insertions(+), 19 deletions(-)
>
> diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c
> index 7512ee1b43..10ee037171 100644
> --- a/target/linux/generic/files/drivers/net/phy/ar8216.c
> +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
> @@ -749,7 +749,6 @@ static void ar8216_get_arl_entry(struct ar8xxx_priv *priv,
> u16 r2, page;
> u16 r1_func0, r1_func1, r1_func2;
> u32 t, val0, val1, val2;
> - int i;
>
> split_addr(AR8216_REG_ATU_FUNC0, &r1_func0, &r2, &page);
> r2 |= 0x10;
> @@ -785,12 +784,7 @@ static void ar8216_get_arl_entry(struct ar8xxx_priv *priv,
> if (!*status)
> break;
>
> - i = 0;
> - t = AR8216_ATU_PORT0;
> - while (!(val2 & t) && ++i < priv->dev.ports)
> - t <<= 1;
> -
> - a->port = i;
> + a->portmap = (val2 & AR8216_ATU_PORTS) >> AR8216_ATU_PORTS_S;
> a->mac[0] = (val0 & AR8216_ATU_ADDR5) >> AR8216_ATU_ADDR5_S;
> a->mac[1] = (val0 & AR8216_ATU_ADDR4) >> AR8216_ATU_ADDR4_S;
> a->mac[2] = (val1 & AR8216_ATU_ADDR3) >> AR8216_ATU_ADDR3_S;
> @@ -1516,8 +1510,12 @@ ar8xxx_sw_get_arl_table(struct switch_dev *dev,
> */
> for (j = 0; j < i; ++j) {
> a1 = &priv->arl_table[j];
> - if (a->port == a1->port && !memcmp(a->mac, a1->mac, sizeof(a->mac)))
> - goto duplicate;
> + if (!memcmp(a->mac, a1->mac, sizeof(a->mac))) {
> + /* ignore ports already seen in former entry */
> + a->portmap &= ~a1->portmap;
> + if (!a->portmap)
> + goto duplicate;
> + }
> }
> }
>
> @@ -1534,7 +1532,7 @@ ar8xxx_sw_get_arl_table(struct switch_dev *dev,
> for (j = 0; j < priv->dev.ports; ++j) {
> for (k = 0; k < i; ++k) {
> a = &priv->arl_table[k];
> - if (a->port != j)
> + if (!(a->portmap & BIT(j)))
> continue;
> len += snprintf(buf + len, sizeof(priv->arl_buf) - len,
> "Port %d: MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
> diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.h b/target/linux/generic/files/drivers/net/phy/ar8216.h
> index ba0e0ddccd..509818c50d 100644
> --- a/target/linux/generic/files/drivers/net/phy/ar8216.h
> +++ b/target/linux/generic/files/drivers/net/phy/ar8216.h
> @@ -112,6 +112,7 @@
>
> #define AR8216_REG_ATU_FUNC2 0x0058
> #define AR8216_ATU_PORTS BITS(0, 6)
> +#define AR8216_ATU_PORTS_S 0
> #define AR8216_ATU_PORT0 BIT(0)
> #define AR8216_ATU_PORT1 BIT(1)
> #define AR8216_ATU_PORT2 BIT(2)
> @@ -367,7 +368,7 @@ enum arl_op {
> };
>
> struct arl_entry {
> - u8 port;
> + u16 portmap;
> u8 mac[6];
> };
>
> diff --git a/target/linux/generic/files/drivers/net/phy/ar8327.c b/target/linux/generic/files/drivers/net/phy/ar8327.c
> index 74f0a08d76..803fb3d49f 100644
> --- a/target/linux/generic/files/drivers/net/phy/ar8327.c
> +++ b/target/linux/generic/files/drivers/net/phy/ar8327.c
> @@ -1057,8 +1057,7 @@ static void ar8327_get_arl_entry(struct ar8xxx_priv *priv,
> struct mii_bus *bus = priv->mii_bus;
> u16 r2, page;
> u16 r1_data0, r1_data1, r1_data2, r1_func;
> - u32 t, val0, val1, val2;
> - int i;
> + u32 val0, val1, val2;
>
> split_addr(AR8327_REG_ATU_DATA0, &r1_data0, &r2, &page);
> r2 |= 0x10;
> @@ -1095,12 +1094,7 @@ static void ar8327_get_arl_entry(struct ar8xxx_priv *priv,
> if (!*status)
> break;
>
> - i = 0;
> - t = AR8327_ATU_PORT0;
> - while (!(val1 & t) && ++i < AR8327_NUM_PORTS)
> - t <<= 1;
> -
> - a->port = i;
> + a->portmap = (val1 & AR8327_ATU_PORTS) >> AR8327_ATU_PORTS_S;
> a->mac[0] = (val0 & AR8327_ATU_ADDR0) >> AR8327_ATU_ADDR0_S;
> a->mac[1] = (val0 & AR8327_ATU_ADDR1) >> AR8327_ATU_ADDR1_S;
> a->mac[2] = (val0 & AR8327_ATU_ADDR2) >> AR8327_ATU_ADDR2_S;
> diff --git a/target/linux/generic/files/drivers/net/phy/ar8327.h b/target/linux/generic/files/drivers/net/phy/ar8327.h
> index d53ef885b1..38e33ea57e 100644
> --- a/target/linux/generic/files/drivers/net/phy/ar8327.h
> +++ b/target/linux/generic/files/drivers/net/phy/ar8327.h
> @@ -199,6 +199,7 @@
> #define AR8327_ATU_ADDR5 BITS(8, 8)
> #define AR8327_ATU_ADDR5_S 8
> #define AR8327_ATU_PORTS BITS(16, 7)
> +#define AR8327_ATU_PORTS_S 16
> #define AR8327_ATU_PORT0 BIT(16)
> #define AR8327_ATU_PORT1 BIT(17)
> #define AR8327_ATU_PORT2 BIT(18)
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list