[OpenWrt-Devel] [PATCH] b53: Allow to enable/disable port protection for b53 switch

Alexandru Ardelean ardeleanalex at gmail.com
Fri Feb 13 14:10:24 EST 2015


From: Helmut Schaa <helmut.schaa at googlemail.com>

Signed-off-by: Helmut Schaa <helmut.schaa at googlemail.com>

---
 .../generic/files/drivers/net/phy/b53/b53_common.c | 44 ++++++++++++++++++++++
 .../generic/files/drivers/net/phy/b53/b53_priv.h   |  1 +
 .../generic/files/drivers/net/phy/b53/b53_regs.h   |  3 ++
 3 files changed, 48 insertions(+)

diff --git a/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_common.c b/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_common.c
index b82bc93..e4cfc29 100644
--- a/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_common.c
+++ b/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_common.c
@@ -363,6 +363,7 @@ static int b53_flush_arl(struct b53_device *dev)
 static void b53_enable_ports(struct b53_device *dev)
 {
 	unsigned i;
+	u16 protected = 0;
 
 	b53_for_each_port(dev, i) {
 		u8 port_ctrl;
@@ -401,7 +402,13 @@ static void b53_enable_ports(struct b53_device *dev)
 		if (!is63xx(dev) && !(is5301x(dev) && i == 6))
 			b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(i),
 				   port_ctrl);
+
+		/* Enable/disable port protection */
+		if (dev->ports[i].protected)
+			protected |= BIT(i);
 	}
+
+	b53_write16(dev, B53_CTRL_PAGE, B53_PROTECTED_PORT_SELECTION, protected);
 }
 
 static void b53_enable_mib(struct b53_device *dev)
@@ -862,6 +869,35 @@ static int b53_port_get_mib(struct switch_dev *sw_dev,
 	return 0;
 }
 
+static int b53_port_get_protected(struct switch_dev *sw_dev,
+				  const struct switch_attr *attr,
+				  struct switch_val *val)
+{
+	struct b53_device *dev = sw_to_b53(sw_dev);
+	int port = val->port_vlan;
+
+	if (!(BIT(port) & dev->enabled_ports))
+		return -1;
+
+	val->value.i = !!(dev->ports[port].protected);
+
+	return 0;
+}
+
+static int b53_port_set_protected(struct switch_dev *sw_dev,
+				  const struct switch_attr *attr,
+				  struct switch_val *val)
+{
+	struct b53_device *dev = sw_to_b53(sw_dev);
+	int port = val->port_vlan;
+
+	if (!(BIT(port) & dev->enabled_ports))
+		return -1;
+
+	dev->ports[port].protected = !!(val->value.i);
+	return 0;
+}
+
 static struct switch_attr b53_global_ops_25[] = {
 	{
 		.type = SWITCH_TYPE_INT,
@@ -948,6 +984,14 @@ static struct switch_attr b53_port_ops[] = {
 		.description = "Get port's MIB counters",
 		.get = b53_port_get_mib,
 	},
+	{
+		.type = SWITCH_TYPE_INT,
+		.name = "protected",
+		.description = "Enable protected mode",
+		.set = b53_port_set_protected,
+		.get = b53_port_get_protected,
+		.max = 1,
+	},
 };
 
 static struct switch_attr b53_no_ops[] = {
diff --git a/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h b/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h
index ce5b530..87ecbb5 100644
--- a/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h
+++ b/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h
@@ -65,6 +65,7 @@ struct b53_vlan {
 
 struct b53_port {
 	unsigned int	pvid:12;
+	unsigned int	protected:1;
 };
 
 struct b53_device {
diff --git a/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_regs.h b/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_regs.h
index ba50915..0f5b2cb 100644
--- a/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_regs.h
+++ b/openwrt/target/linux/generic/files/drivers/net/phy/b53/b53_regs.h
@@ -95,6 +95,9 @@
 #define  B53_MC_FWD_EN			BIT(7)
 
 /* (16 bit) */
+#define B53_PROTECTED_PORT_SELECTION	0x24
+
+/* (16 bit) */
 #define B53_UC_FLOOD_MASK		0x32
 #define B53_MC_FLOOD_MASK		0x34
 #define B53_IPMC_FLOOD_MASK		0x36
-- 
1.8.4.5
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list