summaryrefslogtreecommitdiffstats
path: root/target/linux
diff options
context:
space:
mode:
authorjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2012-03-07 16:32:37 +0000
committerjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2012-03-07 16:32:37 +0000
commit34271f8723dae544382d4070d0a820147c44c888 (patch)
treea84a8f016a4a5181ae4c588cb82b16c290935dd2 /target/linux
parentd32129c1105b5b26d0818c813f0a9520ba1a644e (diff)
generic: rtl8366rb: use the generic get_port_link implementation
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@30842 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux')
-rw-r--r--target/linux/generic/files/drivers/net/phy/rtl8366rb.c82
1 files changed, 32 insertions, 50 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
index d6a9ece36..020e93a44 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
@@ -681,59 +681,47 @@ static int rtl8366rb_sw_set_learning_enable(struct switch_dev *dev,
return 0;
}
-
-static const char *rtl8366rb_speed_str(unsigned speed)
-{
- switch (speed) {
- case 0:
- return "10baseT";
- case 1:
- return "100baseT";
- case 2:
- return "1000baseT";
- }
-
- return "unknown";
-}
-
static int rtl8366rb_sw_get_port_link(struct switch_dev *dev,
- const struct switch_attr *attr,
- struct switch_val *val)
+ int port,
+ struct switch_port_link *link)
{
struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
- u32 len = 0, data = 0;
+ u32 data = 0;
+ u32 speed;
- if (val->port_vlan >= RTL8366RB_NUM_PORTS)
+ if (port >= RTL8366RB_NUM_PORTS)
return -EINVAL;
- memset(smi->buf, '\0', sizeof(smi->buf));
- rtl8366_smi_read_reg(smi, RTL8366RB_PORT_LINK_STATUS_BASE +
- (val->port_vlan / 2), &data);
+ rtl8366_smi_read_reg(smi, RTL8366RB_PORT_LINK_STATUS_BASE + (port / 2),
+ &data);
- if (val->port_vlan % 2)
+ if (port % 2)
data = data >> 8;
- if (data & RTL8366RB_PORT_STATUS_LINK_MASK) {
- len = snprintf(smi->buf, sizeof(smi->buf),
- "port:%d link:up speed:%s %s-duplex %s%s%s",
- val->port_vlan,
- rtl8366rb_speed_str(data &
- RTL8366RB_PORT_STATUS_SPEED_MASK),
- (data & RTL8366RB_PORT_STATUS_DUPLEX_MASK) ?
- "full" : "half",
- (data & RTL8366RB_PORT_STATUS_TXPAUSE_MASK) ?
- "tx-pause ": "",
- (data & RTL8366RB_PORT_STATUS_RXPAUSE_MASK) ?
- "rx-pause " : "",
- (data & RTL8366RB_PORT_STATUS_AN_MASK) ?
- "nway ": "");
- } else {
- len = snprintf(smi->buf, sizeof(smi->buf), "port:%d link: down",
- val->port_vlan);
- }
+ link->link = !!(data & RTL8366RB_PORT_STATUS_LINK_MASK);
+ if (!link->link)
+ return 0;
+
+ link->duplex = !!(data & RTL8366RB_PORT_STATUS_DUPLEX_MASK);
+ link->rx_flow = !!(data & RTL8366RB_PORT_STATUS_RXPAUSE_MASK);
+ link->tx_flow = !!(data & RTL8366RB_PORT_STATUS_TXPAUSE_MASK);
+ link->aneg = !!(data & RTL8366RB_PORT_STATUS_AN_MASK);
- val->value.s = smi->buf;
- val->len = len;
+ speed = (data & RTL8366RB_PORT_STATUS_SPEED_MASK);
+ switch (speed) {
+ case 0:
+ link->speed = SWITCH_PORT_SPEED_10;
+ break;
+ case 1:
+ link->speed = SWITCH_PORT_SPEED_100;
+ break;
+ case 2:
+ link->speed = SWITCH_PORT_SPEED_1000;
+ break;
+ default:
+ link->speed = SWITCH_PORT_SPEED_UNKNOWN;
+ break;
+ }
return 0;
}
@@ -1018,13 +1006,6 @@ static struct switch_attr rtl8366rb_globals[] = {
static struct switch_attr rtl8366rb_port[] = {
{
- .type = SWITCH_TYPE_STRING,
- .name = "link",
- .description = "Get port link information",
- .max = 1,
- .set = NULL,
- .get = rtl8366rb_sw_get_port_link,
- }, {
.type = SWITCH_TYPE_NOVAL,
.name = "reset_mib",
.description = "Reset single port MIB counters",
@@ -1104,6 +1085,7 @@ static const struct switch_dev_ops rtl8366_ops = {
.get_port_pvid = rtl8366_sw_get_port_pvid,
.set_port_pvid = rtl8366_sw_set_port_pvid,
.reset_switch = rtl8366rb_sw_reset_switch,
+ .get_port_link = rtl8366rb_sw_get_port_link,
};
static int rtl8366rb_switch_init(struct rtl8366_smi *smi)