generic: ar8216: add get_port_link callback
authorGabor Juhos <juhosg@openwrt.org>
Thu, 30 May 2013 17:38:22 +0000 (17:38 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Thu, 30 May 2013 17:38:22 +0000 (17:38 +0000)
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
SVN-Revision: 36797

target/linux/generic/files/drivers/net/phy/ar8216.c
target/linux/generic/files/include/linux/ar8216_platform.h

index 6f836d79200010cdbd3848eb2d6658e164484e64..bc36efc3a83d74e0ac2873218a9624303fc034b4 100644 (file)
@@ -88,8 +88,12 @@ struct ar8xxx_priv {
        struct switch_dev dev;
        struct mii_bus *mii_bus;
        struct phy_device *phy;
+
        u32 (*read)(struct ar8xxx_priv *priv, int reg);
        void (*write)(struct ar8xxx_priv *priv, int reg, u32 val);
+
+       int (*get_port_link)(unsigned port);
+
        const struct net_device_ops *ndo_old;
        struct net_device_ops ndo;
        struct mutex reg_mutex;
@@ -480,12 +484,21 @@ ar8216_read_port_link(struct ar8xxx_priv *priv, int port,
        link->aneg = !!(status & AR8216_PORT_STATUS_LINK_AUTO);
        if (link->aneg) {
                link->link = !!(status & AR8216_PORT_STATUS_LINK_UP);
-               if (!link->link)
-                       return;
        } else {
                link->link = true;
+
+               if (priv->get_port_link) {
+                       int err;
+
+                       err = priv->get_port_link(port);
+                       if (err >= 0)
+                               link->link = !!err;
+               }
        }
 
+       if (!link->link)
+               return;
+
        link->duplex = !!(status & AR8216_PORT_STATUS_DUPLEX);
        link->tx_flow = !!(status & AR8216_PORT_STATUS_TXFLOW);
        link->rx_flow = !!(status & AR8216_PORT_STATUS_RXFLOW);
@@ -1058,6 +1071,8 @@ ar8327_hw_config_pdata(struct ar8xxx_priv *priv,
        if (!pdata)
                return -EINVAL;
 
+       priv->get_port_link = pdata->get_port_link;
+
        data = &priv->chip_data.ar8327;
 
        data->port0_status = ar8327_get_port_init_status(&pdata->port0_cfg);
index c6c6144e850ef7e9d35f2dbe9d2c3fbac2bbfdec..92e8eda663d0121b847ce4e5a2bde5496b39e905 100644 (file)
@@ -78,6 +78,8 @@ struct ar8327_platform_data {
        struct ar8327_port_cfg port0_cfg;
        struct ar8327_port_cfg port6_cfg;
        struct ar8327_led_cfg *led_cfg;
+
+       int (*get_port_link)(unsigned port);
 };
 
 #endif /* AR8216_PLATFORM_H */
\ No newline at end of file