summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--target/linux/generic/files/drivers/net/phy/rtl8306.c47
1 files changed, 26 insertions, 21 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8306.c b/target/linux/generic/files/drivers/net/phy/rtl8306.c
index 513ef9e4e2..1f27065a33 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8306.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8306.c
@@ -582,6 +582,27 @@ rtl_attr_get_port_int(struct switch_dev *dev, const struct switch_attr *attr, st
return rtl_attr_get_int(dev, attr, val);
}
+static int
+rtl_get_port_link(struct switch_dev *dev, int port, struct switch_port_link *link)
+{
+ if (port >= RTL8306_NUM_PORTS)
+ return -EINVAL;
+
+ link->link = rtl_get(dev, RTL_PORT_REG(port, LINK));
+ if (!link->link)
+ return 0;
+
+ link->duplex = rtl_get(dev, RTL_PORT_REG(port, DUPLEX));
+ link->aneg = rtl_get(dev, RTL_PORT_REG(port, NWAY));
+
+ if (rtl_get(dev, RTL_PORT_REG(port, SPEED)))
+ link->speed = SWITCH_PORT_SPEED_100;
+ else
+ link->speed = SWITCH_PORT_SPEED_10;
+
+ return 0;
+}
+
static int
rtl_attr_set_vlan_int(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)
{
@@ -614,7 +635,8 @@ rtl_get_ports(struct switch_dev *dev, struct switch_val *val)
port = &val->value.ports[val->len];
port->id = i;
- port->flags = 0;
+ if (rtl_get(dev, RTL_PORT_REG(i, TAG_INSERT)) == 2 || i == dev->cpu_port)
+ port->flags = (1 << SWITCH_PORT_FLAG_TAGGED);
val->len++;
}
@@ -653,7 +675,8 @@ rtl_set_vlan(struct switch_dev *dev, const struct switch_attr *attr, struct swit
static int
rtl_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)
{
- return rtl_get(dev, RTL_REG_VLAN_ENABLE);
+ val->value.i = rtl_get(dev, RTL_REG_VLAN_ENABLE);
+ return 0;
}
static int
@@ -776,13 +799,6 @@ static struct switch_attr rtl_port[] = {
.description = "Port VLAN ID",
.max = RTL8306_NUM_VLANS - 1,
},
- {
- RTL_PORT_REGATTR(LINK),
- .name = "link",
- .description = "get the current link state",
- .max = 1,
- .set = NULL,
- },
#ifdef DEBUG
{
RTL_PORT_REGATTR(NULL_VID_REPLACE),
@@ -809,18 +825,6 @@ static struct switch_attr rtl_port[] = {
.max = 3,
},
#endif
- {
- RTL_PORT_REGATTR(SPEED),
- .name = "speed",
- .description = "current link speed",
- .max = 1,
- },
- {
- RTL_PORT_REGATTR(NWAY),
- .name = "nway",
- .description = "enable autonegotiation",
- .max = 1,
- },
};
static struct switch_attr rtl_vlan[] = {
@@ -850,6 +854,7 @@ static const struct switch_dev_ops rtl8306_ops = {
.set_vlan_ports = rtl_set_ports,
.apply_config = rtl_hw_apply,
.reset_switch = rtl_reset,
+ .get_port_link = rtl_get_port_link,
};
static int