aboutsummaryrefslogtreecommitdiffstats
path: root/target
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2013-05-30 17:38:22 +0000
committerGabor Juhos <juhosg@openwrt.org>2013-05-30 17:38:22 +0000
commitc170d3c3e46fb164b22c23852f9299f9dacf72e0 (patch)
tree96797b01e26b869be1ffdd86c527d20d123cd63b /target
parent3467b17e69e2e4eebe7b21f4792e5da55ead970c (diff)
downloadupstream-c170d3c3e46fb164b22c23852f9299f9dacf72e0.tar.gz
upstream-c170d3c3e46fb164b22c23852f9299f9dacf72e0.tar.bz2
upstream-c170d3c3e46fb164b22c23852f9299f9dacf72e0.zip
generic: ar8216: add get_port_link callback
Signed-off-by: Gabor Juhos <juhosg@openwrt.org> SVN-Revision: 36797
Diffstat (limited to 'target')
-rw-r--r--target/linux/generic/files/drivers/net/phy/ar8216.c19
-rw-r--r--target/linux/generic/files/include/linux/ar8216_platform.h2
2 files changed, 19 insertions, 2 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c
index 6f836d7920..bc36efc3a8 100644
--- a/target/linux/generic/files/drivers/net/phy/ar8216.c
+++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
@@ -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);
diff --git a/target/linux/generic/files/include/linux/ar8216_platform.h b/target/linux/generic/files/include/linux/ar8216_platform.h
index c6c6144e85..92e8eda663 100644
--- a/target/linux/generic/files/include/linux/ar8216_platform.h
+++ b/target/linux/generic/files/include/linux/ar8216_platform.h
@@ -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