kernel: ar8xxx: get_arl_table now shows all ports of an entry
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@devolo.de>
This commit is contained in:
parent
be3e69d991
commit
33878b0a40
4 changed files with 13 additions and 19 deletions
|
@ -749,7 +749,6 @@ static void ar8216_get_arl_entry(struct ar8xxx_priv *priv,
|
||||||
u16 r2, page;
|
u16 r2, page;
|
||||||
u16 r1_func0, r1_func1, r1_func2;
|
u16 r1_func0, r1_func1, r1_func2;
|
||||||
u32 t, val0, val1, val2;
|
u32 t, val0, val1, val2;
|
||||||
int i;
|
|
||||||
|
|
||||||
split_addr(AR8216_REG_ATU_FUNC0, &r1_func0, &r2, &page);
|
split_addr(AR8216_REG_ATU_FUNC0, &r1_func0, &r2, &page);
|
||||||
r2 |= 0x10;
|
r2 |= 0x10;
|
||||||
|
@ -785,12 +784,7 @@ static void ar8216_get_arl_entry(struct ar8xxx_priv *priv,
|
||||||
if (!*status)
|
if (!*status)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
i = 0;
|
a->portmap = (val2 & AR8216_ATU_PORTS) >> AR8216_ATU_PORTS_S;
|
||||||
t = AR8216_ATU_PORT0;
|
|
||||||
while (!(val2 & t) && ++i < priv->dev.ports)
|
|
||||||
t <<= 1;
|
|
||||||
|
|
||||||
a->port = i;
|
|
||||||
a->mac[0] = (val0 & AR8216_ATU_ADDR5) >> AR8216_ATU_ADDR5_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[1] = (val0 & AR8216_ATU_ADDR4) >> AR8216_ATU_ADDR4_S;
|
||||||
a->mac[2] = (val1 & AR8216_ATU_ADDR3) >> AR8216_ATU_ADDR3_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) {
|
for (j = 0; j < i; ++j) {
|
||||||
a1 = &priv->arl_table[j];
|
a1 = &priv->arl_table[j];
|
||||||
if (a->port == a1->port && !memcmp(a->mac, a1->mac, sizeof(a->mac)))
|
if (!memcmp(a->mac, a1->mac, sizeof(a->mac))) {
|
||||||
goto duplicate;
|
/* 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 (j = 0; j < priv->dev.ports; ++j) {
|
||||||
for (k = 0; k < i; ++k) {
|
for (k = 0; k < i; ++k) {
|
||||||
a = &priv->arl_table[k];
|
a = &priv->arl_table[k];
|
||||||
if (a->port != j)
|
if (!(a->portmap & BIT(j)))
|
||||||
continue;
|
continue;
|
||||||
len += snprintf(buf + len, sizeof(priv->arl_buf) - len,
|
len += snprintf(buf + len, sizeof(priv->arl_buf) - len,
|
||||||
"Port %d: MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
|
"Port %d: MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||||
|
|
|
@ -112,6 +112,7 @@
|
||||||
|
|
||||||
#define AR8216_REG_ATU_FUNC2 0x0058
|
#define AR8216_REG_ATU_FUNC2 0x0058
|
||||||
#define AR8216_ATU_PORTS BITS(0, 6)
|
#define AR8216_ATU_PORTS BITS(0, 6)
|
||||||
|
#define AR8216_ATU_PORTS_S 0
|
||||||
#define AR8216_ATU_PORT0 BIT(0)
|
#define AR8216_ATU_PORT0 BIT(0)
|
||||||
#define AR8216_ATU_PORT1 BIT(1)
|
#define AR8216_ATU_PORT1 BIT(1)
|
||||||
#define AR8216_ATU_PORT2 BIT(2)
|
#define AR8216_ATU_PORT2 BIT(2)
|
||||||
|
@ -367,7 +368,7 @@ enum arl_op {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct arl_entry {
|
struct arl_entry {
|
||||||
u8 port;
|
u16 portmap;
|
||||||
u8 mac[6];
|
u8 mac[6];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1057,8 +1057,7 @@ static void ar8327_get_arl_entry(struct ar8xxx_priv *priv,
|
||||||
struct mii_bus *bus = priv->mii_bus;
|
struct mii_bus *bus = priv->mii_bus;
|
||||||
u16 r2, page;
|
u16 r2, page;
|
||||||
u16 r1_data0, r1_data1, r1_data2, r1_func;
|
u16 r1_data0, r1_data1, r1_data2, r1_func;
|
||||||
u32 t, val0, val1, val2;
|
u32 val0, val1, val2;
|
||||||
int i;
|
|
||||||
|
|
||||||
split_addr(AR8327_REG_ATU_DATA0, &r1_data0, &r2, &page);
|
split_addr(AR8327_REG_ATU_DATA0, &r1_data0, &r2, &page);
|
||||||
r2 |= 0x10;
|
r2 |= 0x10;
|
||||||
|
@ -1095,12 +1094,7 @@ static void ar8327_get_arl_entry(struct ar8xxx_priv *priv,
|
||||||
if (!*status)
|
if (!*status)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
i = 0;
|
a->portmap = (val1 & AR8327_ATU_PORTS) >> AR8327_ATU_PORTS_S;
|
||||||
t = AR8327_ATU_PORT0;
|
|
||||||
while (!(val1 & t) && ++i < AR8327_NUM_PORTS)
|
|
||||||
t <<= 1;
|
|
||||||
|
|
||||||
a->port = i;
|
|
||||||
a->mac[0] = (val0 & AR8327_ATU_ADDR0) >> AR8327_ATU_ADDR0_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[1] = (val0 & AR8327_ATU_ADDR1) >> AR8327_ATU_ADDR1_S;
|
||||||
a->mac[2] = (val0 & AR8327_ATU_ADDR2) >> AR8327_ATU_ADDR2_S;
|
a->mac[2] = (val0 & AR8327_ATU_ADDR2) >> AR8327_ATU_ADDR2_S;
|
||||||
|
|
|
@ -199,6 +199,7 @@
|
||||||
#define AR8327_ATU_ADDR5 BITS(8, 8)
|
#define AR8327_ATU_ADDR5 BITS(8, 8)
|
||||||
#define AR8327_ATU_ADDR5_S 8
|
#define AR8327_ATU_ADDR5_S 8
|
||||||
#define AR8327_ATU_PORTS BITS(16, 7)
|
#define AR8327_ATU_PORTS BITS(16, 7)
|
||||||
|
#define AR8327_ATU_PORTS_S 16
|
||||||
#define AR8327_ATU_PORT0 BIT(16)
|
#define AR8327_ATU_PORT0 BIT(16)
|
||||||
#define AR8327_ATU_PORT1 BIT(17)
|
#define AR8327_ATU_PORT1 BIT(17)
|
||||||
#define AR8327_ATU_PORT2 BIT(18)
|
#define AR8327_ATU_PORT2 BIT(18)
|
||||||
|
|
Loading…
Reference in a new issue