Commit 6cf7a1ac authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'net-dsa-hellcreek-fix-handling-of-mgmt-protocols'

Kurt Kanzenbach says:

====================
net: dsa: hellcreek: Fix handling of MGMT protocols

this series fixes some minor issues with regards to management protocols
such as PTP and STP in the hellcreek DSA driver. Configure static FDB
for these protocols. The end result is:

|root@tsn:~# mv88e6xxx_dump --atu
|Using device <platform/ff240000.switch>
|ATU:
|FID  MAC               0123 Age OBT Pass Static Reprio Prio
|   0 01:1b:19:00:00:00 1100   1               X       X    6
|   1 01:00:5e:00:01:81 1100   1               X       X    6
|   2 33:33:00:00:01:81 1100   1               X       X    6
|   3 01:80:c2:00:00:0e 1100   1        X      X       X    6
|   4 01:00:5e:00:00:6b 1100   1        X      X       X    6
|   5 33:33:00:00:00:6b 1100   1        X      X       X    6
|   6 01:80:c2:00:00:00 1100   1        X      X       X    6

Previous version:
 * https://lore.kernel.org/r/20211213101810.121553-1-kurt@linutronix.de/

Changes since v1:
 * Target net-next, as this never worked correctly and is not critical
 * Add STP and PTP over UDP rules
 * Use pass_blocked for PDelay messages only (Richard Cochran)
====================

Link: https://lore.kernel.org/r/20211214134508.57806-1-kurt@linutronix.deSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 9280ac2e 6cf01e45
...@@ -711,8 +711,9 @@ static int __hellcreek_fdb_add(struct hellcreek *hellcreek, ...@@ -711,8 +711,9 @@ static int __hellcreek_fdb_add(struct hellcreek *hellcreek,
u16 meta = 0; u16 meta = 0;
dev_dbg(hellcreek->dev, "Add static FDB entry: MAC=%pM, MASK=0x%02x, " dev_dbg(hellcreek->dev, "Add static FDB entry: MAC=%pM, MASK=0x%02x, "
"OBT=%d, REPRIO_EN=%d, PRIO=%d\n", entry->mac, entry->portmask, "OBT=%d, PASS_BLOCKED=%d, REPRIO_EN=%d, PRIO=%d\n", entry->mac,
entry->is_obt, entry->reprio_en, entry->reprio_tc); entry->portmask, entry->is_obt, entry->pass_blocked,
entry->reprio_en, entry->reprio_tc);
/* Add mac address */ /* Add mac address */
hellcreek_write(hellcreek, entry->mac[1] | (entry->mac[0] << 8), HR_FDBWDH); hellcreek_write(hellcreek, entry->mac[1] | (entry->mac[0] << 8), HR_FDBWDH);
...@@ -723,6 +724,8 @@ static int __hellcreek_fdb_add(struct hellcreek *hellcreek, ...@@ -723,6 +724,8 @@ static int __hellcreek_fdb_add(struct hellcreek *hellcreek,
meta |= entry->portmask << HR_FDBWRM0_PORTMASK_SHIFT; meta |= entry->portmask << HR_FDBWRM0_PORTMASK_SHIFT;
if (entry->is_obt) if (entry->is_obt)
meta |= HR_FDBWRM0_OBT; meta |= HR_FDBWRM0_OBT;
if (entry->pass_blocked)
meta |= HR_FDBWRM0_PASS_BLOCKED;
if (entry->reprio_en) { if (entry->reprio_en) {
meta |= HR_FDBWRM0_REPRIO_EN; meta |= HR_FDBWRM0_REPRIO_EN;
meta |= entry->reprio_tc << HR_FDBWRM0_REPRIO_TC_SHIFT; meta |= entry->reprio_tc << HR_FDBWRM0_REPRIO_TC_SHIFT;
...@@ -1050,7 +1053,7 @@ static void hellcreek_setup_tc_identity_mapping(struct hellcreek *hellcreek) ...@@ -1050,7 +1053,7 @@ static void hellcreek_setup_tc_identity_mapping(struct hellcreek *hellcreek)
static int hellcreek_setup_fdb(struct hellcreek *hellcreek) static int hellcreek_setup_fdb(struct hellcreek *hellcreek)
{ {
static struct hellcreek_fdb_entry ptp = { static struct hellcreek_fdb_entry l2_ptp = {
/* MAC: 01-1B-19-00-00-00 */ /* MAC: 01-1B-19-00-00-00 */
.mac = { 0x01, 0x1b, 0x19, 0x00, 0x00, 0x00 }, .mac = { 0x01, 0x1b, 0x19, 0x00, 0x00, 0x00 },
.portmask = 0x03, /* Management ports */ .portmask = 0x03, /* Management ports */
...@@ -1061,24 +1064,94 @@ static int hellcreek_setup_fdb(struct hellcreek *hellcreek) ...@@ -1061,24 +1064,94 @@ static int hellcreek_setup_fdb(struct hellcreek *hellcreek)
.reprio_tc = 6, /* TC: 6 as per IEEE 802.1AS */ .reprio_tc = 6, /* TC: 6 as per IEEE 802.1AS */
.reprio_en = 1, .reprio_en = 1,
}; };
static struct hellcreek_fdb_entry p2p = { static struct hellcreek_fdb_entry udp4_ptp = {
/* MAC: 01-00-5E-00-01-81 */
.mac = { 0x01, 0x00, 0x5e, 0x00, 0x01, 0x81 },
.portmask = 0x03, /* Management ports */
.age = 0,
.is_obt = 0,
.pass_blocked = 0,
.is_static = 1,
.reprio_tc = 6,
.reprio_en = 1,
};
static struct hellcreek_fdb_entry udp6_ptp = {
/* MAC: 33-33-00-00-01-81 */
.mac = { 0x33, 0x33, 0x00, 0x00, 0x01, 0x81 },
.portmask = 0x03, /* Management ports */
.age = 0,
.is_obt = 0,
.pass_blocked = 0,
.is_static = 1,
.reprio_tc = 6,
.reprio_en = 1,
};
static struct hellcreek_fdb_entry l2_p2p = {
/* MAC: 01-80-C2-00-00-0E */ /* MAC: 01-80-C2-00-00-0E */
.mac = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e }, .mac = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e },
.portmask = 0x03, /* Management ports */ .portmask = 0x03, /* Management ports */
.age = 0, .age = 0,
.is_obt = 0, .is_obt = 0,
.pass_blocked = 0, .pass_blocked = 1,
.is_static = 1, .is_static = 1,
.reprio_tc = 6, /* TC: 6 as per IEEE 802.1AS */ .reprio_tc = 6, /* TC: 6 as per IEEE 802.1AS */
.reprio_en = 1, .reprio_en = 1,
}; };
static struct hellcreek_fdb_entry udp4_p2p = {
/* MAC: 01-00-5E-00-00-6B */
.mac = { 0x01, 0x00, 0x5e, 0x00, 0x00, 0x6b },
.portmask = 0x03, /* Management ports */
.age = 0,
.is_obt = 0,
.pass_blocked = 1,
.is_static = 1,
.reprio_tc = 6,
.reprio_en = 1,
};
static struct hellcreek_fdb_entry udp6_p2p = {
/* MAC: 33-33-00-00-00-6B */
.mac = { 0x33, 0x33, 0x00, 0x00, 0x00, 0x6b },
.portmask = 0x03, /* Management ports */
.age = 0,
.is_obt = 0,
.pass_blocked = 1,
.is_static = 1,
.reprio_tc = 6,
.reprio_en = 1,
};
static struct hellcreek_fdb_entry stp = {
/* MAC: 01-80-C2-00-00-00 */
.mac = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 },
.portmask = 0x03, /* Management ports */
.age = 0,
.is_obt = 0,
.pass_blocked = 1,
.is_static = 1,
.reprio_tc = 6,
.reprio_en = 1,
};
int ret; int ret;
mutex_lock(&hellcreek->reg_lock); mutex_lock(&hellcreek->reg_lock);
ret = __hellcreek_fdb_add(hellcreek, &ptp); ret = __hellcreek_fdb_add(hellcreek, &l2_ptp);
if (ret)
goto out;
ret = __hellcreek_fdb_add(hellcreek, &udp4_ptp);
if (ret)
goto out;
ret = __hellcreek_fdb_add(hellcreek, &udp6_ptp);
if (ret)
goto out;
ret = __hellcreek_fdb_add(hellcreek, &l2_p2p);
if (ret)
goto out;
ret = __hellcreek_fdb_add(hellcreek, &udp4_p2p);
if (ret)
goto out;
ret = __hellcreek_fdb_add(hellcreek, &udp6_p2p);
if (ret) if (ret)
goto out; goto out;
ret = __hellcreek_fdb_add(hellcreek, &p2p); ret = __hellcreek_fdb_add(hellcreek, &stp);
out: out:
mutex_unlock(&hellcreek->reg_lock); mutex_unlock(&hellcreek->reg_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment