aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2011-08-15 14:11:41 +0000
committerGabor Juhos <juhosg@openwrt.org>2011-08-15 14:11:41 +0000
commitbb64fb2e58cdb2ea92120b9e63bdc4a8b03685cb (patch)
tree98d72592af4f56dd9c2c9b71cf0f5b401a0ead74 /target/linux/generic
parentf48acb1dc2efdd22f3bfbe7dac893e3a35fe85ea (diff)
downloadupstream-bb64fb2e58cdb2ea92120b9e63bdc4a8b03685cb.tar.gz
upstream-bb64fb2e58cdb2ea92120b9e63bdc4a8b03685cb.tar.bz2
upstream-bb64fb2e58cdb2ea92120b9e63bdc4a8b03685cb.zip
generic: ar8216: add support for get link status
SVN-Revision: 27989
Diffstat (limited to 'target/linux/generic')
-rw-r--r--target/linux/generic/files/drivers/net/phy/ar8216.c62
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[] = {