rtl8366_smi: simplify rtl8366_attr_get_port_link function
[openwrt/svn-archive/archive.git] / target / linux / ar71xx / files / drivers / net / phy / rtl8366_smi.c
index 20510724c5dd7f714e42769bde5054e0f73d3191..fe1659133324cf48bacacaf9bbe9292a58919c03 100644 (file)
@@ -1275,71 +1275,52 @@ static int rtl8366_set_vlan(struct switch_dev *dev,
                return rtl8366_vlan_set_4ktable(smi, val->value.i);
 }
 
+static const char *rtl8366_speed_str(unsigned speed)
+{
+       switch (speed) {
+       case 0:
+               return "10baseT";
+       case 1:
+               return "100baseT";
+       case 2:
+               return "1000baseT";
+       }
+
+       return "unknown";
+}
+
 static int rtl8366_attr_get_port_link(struct switch_dev *dev,
                                      const struct switch_attr *attr,
                                      struct switch_val *val)
 {
-       u32 len = 0, data = 0;
-       int speed, duplex, link, txpause, rxpause, nway;
        struct rtl8366_smi *smi = sw_to_rtl8366(dev);
-       char *buf = smi->buf;
+       u32 len = 0, data = 0;
 
        if (val->port_vlan >= RTL8366_NUM_PORTS)
                return -EINVAL;
 
-       memset(buf, '\0', sizeof(smi->buf));
+       memset(smi->buf, '\0', sizeof(smi->buf));
        rtl8366_smi_read_reg(smi, RTL8366S_PORT_LINK_STATUS_BASE +
-                            (val->port_vlan >> 1),
-                            &data);
+                            (val->port_vlan / 2), &data);
 
-       if (val->port_vlan & 0x1)
+       if (val->port_vlan % 2)
                data = data >> 8;
 
-       speed = (data & RTL8366S_PORT_STATUS_SPEED_MASK);
-       duplex = (data & RTL8366S_PORT_STATUS_DUPLEX_MASK) >> 2;
-       link = (data & RTL8366S_PORT_STATUS_LINK_MASK) >> 4;
-       txpause = (data & RTL8366S_PORT_STATUS_TXPAUSE_MASK) >> 5;
-       rxpause = (data & RTL8366S_PORT_STATUS_RXPAUSE_MASK) >> 6;
-       nway = (data & RTL8366S_PORT_STATUS_AN_MASK) >> 7;
-
-       len += snprintf(buf + len, sizeof(smi->buf) - len, "Port %d: ",
-                       val->port_vlan);
-
-       if (link)
-               len += snprintf(buf + len, sizeof(smi->buf) - len,
-                               "Link UP, Speed: ");
-       else
-               len += snprintf(buf + len, sizeof(smi->buf) - len,
-                               "Link DOWN, Speed: ");
-
-       if (speed == 0)
-               len += snprintf(buf + len, sizeof(smi->buf) - len,
-                               "10Base-TX ");
-       else if (speed == 1)
-               len += snprintf(buf + len, sizeof(smi->buf) - len,
-                               "100Base-TX ");
-       else if (speed == 2)
-               len += snprintf(buf + len, sizeof(smi->buf) - len,
-                               "1000Base-TX ");
-
-       if (duplex)
-               len += snprintf(buf + len, sizeof(smi->buf) - len,
-                               "Full-Duplex, ");
-       else
-               len += snprintf(buf + len, sizeof(smi->buf) - len,
-                               "Half-Duplex, ");
-
-       if (txpause)
-               len += snprintf(buf + len, sizeof(smi->buf) - len,
-                               "TX-Pause ");
-       if (rxpause)
-               len += snprintf(buf + len, sizeof(smi->buf) - len,
-                               "RX-Pause ");
-       if (nway)
-               len += snprintf(buf + len, sizeof(smi->buf) - len,
-                               "nway ");
-
-       val->value.s = buf;
+       len = snprintf(smi->buf, sizeof(smi->buf),
+                       "port:%d link:%s speed:%s %s-duplex %s%s%s",
+                       val->port_vlan,
+                       (data & RTL8366S_PORT_STATUS_LINK_MASK) ? "up" : "down",
+                       rtl8366_speed_str(data &
+                                         RTL8366S_PORT_STATUS_SPEED_MASK),
+                       (data & RTL8366S_PORT_STATUS_DUPLEX_MASK) ?
+                               "full" : "half",
+                       (data & RTL8366S_PORT_STATUS_TXPAUSE_MASK) ?
+                               "tx-pause ": "",
+                       (data & RTL8366S_PORT_STATUS_RXPAUSE_MASK) ?
+                               "rx-pause " : "",
+                       (data & RTL8366S_PORT_STATUS_AN_MASK) ? "nway ": "");
+
+       val->value.s = smi->buf;
        val->len = len;
 
        return 0;