diff options
Diffstat (limited to 'target/linux/generic/files')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/rtl8306.c | 47 |
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 |