aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2010-08-16 19:21:57 +0000
committerFelix Fietkau <nbd@openwrt.org>2010-08-16 19:21:57 +0000
commit523fcf049784457433f4e194b5135431b218bf64 (patch)
treee7e468fba3bffb04d7dad75ced05f544f1acb7d4 /target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c
parent9f1ed6e4d34991db572747dc7242f62489b79b4e (diff)
downloadupstream-523fcf049784457433f4e194b5135431b218bf64.tar.gz
upstream-523fcf049784457433f4e194b5135431b218bf64.tar.bz2
upstream-523fcf049784457433f4e194b5135431b218bf64.zip
ar71xx: add a new driver for the ar7240 switch using swconfig. hooks directly into the ethernet driver, as MAC resets also require switch reinitializations and the switch is part of the cpu core anyway switch only tl-wr741nd (and other devices using this board file, such as tl-wr841nd) over to using this by default, as other devices are still untested fixes #7563
SVN-Revision: 22675
Diffstat (limited to 'target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c')
-rw-r--r--target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c
index 9c76544aff..eada693e77 100644
--- a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c
+++ b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c
@@ -44,9 +44,13 @@ static void ag71xx_phy_link_adjust(struct net_device *dev)
void ag71xx_phy_start(struct ag71xx *ag)
{
+ struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
+
if (ag->phy_dev) {
phy_start(ag->phy_dev);
} else {
+ if (pdata->has_ar7240_switch)
+ ag71xx_ar7240_start(ag);
ag->link = 1;
ag71xx_link_adjust(ag);
}
@@ -54,9 +58,13 @@ void ag71xx_phy_start(struct ag71xx *ag)
void ag71xx_phy_stop(struct ag71xx *ag)
{
+ struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
+
if (ag->phy_dev) {
phy_stop(ag->phy_dev);
} else {
+ if (pdata->has_ar7240_switch)
+ ag71xx_ar7240_stop(ag);
ag->link = 0;
ag71xx_link_adjust(ag);
}
@@ -200,6 +208,9 @@ int ag71xx_phy_connect(struct ag71xx *ag)
mutex_unlock(&ag->mii_bus->mdio_lock);
}
+ if (pdata->has_ar7240_switch)
+ return ag71xx_ar7240_init(ag);
+
if (pdata->phy_mask)
return ag71xx_phy_connect_multi(ag);
@@ -208,6 +219,10 @@ int ag71xx_phy_connect(struct ag71xx *ag)
void ag71xx_phy_disconnect(struct ag71xx *ag)
{
- if (ag->phy_dev)
+ struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
+
+ if (pdata->has_ar7240_switch)
+ ag71xx_ar7240_cleanup(ag);
+ else if (ag->phy_dev)
phy_disconnect(ag->phy_dev);
}