diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2011-08-15 14:11:41 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2011-08-15 14:11:41 +0000 |
commit | bb64fb2e58cdb2ea92120b9e63bdc4a8b03685cb (patch) | |
tree | 98d72592af4f56dd9c2c9b71cf0f5b401a0ead74 /target/linux/generic/files | |
parent | f48acb1dc2efdd22f3bfbe7dac893e3a35fe85ea (diff) | |
download | master-31e0f0ae-bb64fb2e58cdb2ea92120b9e63bdc4a8b03685cb.tar.gz master-31e0f0ae-bb64fb2e58cdb2ea92120b9e63bdc4a8b03685cb.tar.bz2 master-31e0f0ae-bb64fb2e58cdb2ea92120b9e63bdc4a8b03685cb.zip |
generic: ar8216: add support for get link status
SVN-Revision: 27989
Diffstat (limited to 'target/linux/generic/files')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/ar8216.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 587f41fc02..2ce93ffa45 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -46,6 +46,7 @@ struct ar8216_priv { int chip; bool initialized; bool port4_phy; + char buf[80]; /* all fields below are cleared on reset */ bool vlan; @@ -217,6 +218,59 @@ ar8216_get_vid(struct switch_dev *dev, const struct switch_attr *attr, return 0; } +static const char *ar8216_speed_str(unsigned speed) +{ + switch (speed) { + case AR8216_PORT_SPEED_10M: + return "10baseT"; + case AR8216_PORT_SPEED_100M: + return "100baseT"; + case AR8216_PORT_SPEED_1000M: + return "1000baseT"; + } + + return "unknown"; +} + +static int ar8216_port_get_link(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct ar8216_priv *priv = to_ar8216(dev); + u32 len; + u32 status; + int port; + + port = val->port_vlan; + + memset(priv->buf, '\0', sizeof(priv->buf)); + status = priv->read(priv, AR8216_REG_PORT_STATUS(port)); + + if (status & AR8216_PORT_STATUS_LINK_UP) { + len = snprintf(priv->buf, sizeof(priv->buf), + "port:%d link:up speed:%s %s-duplex %s%s%s", + port, + ar8216_speed_str((status & + AR8216_PORT_STATUS_SPEED) >> + AR8216_PORT_STATUS_SPEED_S), + (status & AR8216_PORT_STATUS_DUPLEX) ? + "full" : "half", + (status & AR8216_PORT_STATUS_TXFLOW) ? + "txflow ": "", + (status & AR8216_PORT_STATUS_RXFLOW) ? + "rxflow " : "", + (status & AR8216_PORT_STATUS_LINK_AUTO) ? + "auto ": ""); + } else { + len = snprintf(priv->buf, sizeof(priv->buf), "port:%d link:down", + port); + } + + val->value.s = priv->buf; + val->len = len; + + return 0; +} static int ar8216_mangle_tx(struct sk_buff *skb, struct net_device *dev) @@ -327,6 +381,14 @@ static struct switch_attr ar8216_globals[] = { }; static struct switch_attr ar8216_port[] = { + { + .type = SWITCH_TYPE_STRING, + .name = "link", + .description = "Get port link information", + .max = 1, + .set = NULL, + .get = ar8216_port_get_link, + }, }; static struct switch_attr ar8216_vlan[] = { |