implement ar2313_adjust_link

SVN-Revision: 10374
This commit is contained in:
Felix Fietkau 2008-02-03 18:00:46 +00:00
parent 7d93d975a5
commit 3afef97ed5
2 changed files with 27 additions and 13 deletions

View File

@ -1293,7 +1293,22 @@ static struct net_device_stats *ar2313_get_stats(struct net_device *dev)
static void ar2313_adjust_link(struct net_device *dev) static void ar2313_adjust_link(struct net_device *dev)
{ {
printk(KERN_ERR " ar2313_adjust_link implementation missing\n"); struct ar2313_private *sp = dev->priv;
unsigned int mc;
if (!sp->phy_dev->link)
return;
if (sp->phy_dev->duplex != sp->oldduplex) {
mc = readl(&sp->eth_regs->mac_control);
mc &= ~(MAC_CONTROL_F | MAC_CONTROL_DRO);
if (sp->phy_dev->duplex)
mc |= MAC_CONTROL_F;
else
mc |= MAC_CONTROL_DRO;
writel(mc, &sp->eth_regs->mac_control);
sp->oldduplex = sp->phy_dev->duplex;
}
} }
#define MII_ADDR(phy, reg) \ #define MII_ADDR(phy, reg) \
@ -1331,7 +1346,7 @@ static int mdiobus_reset(struct mii_bus *bus)
struct net_device *const dev = bus->priv; struct net_device *const dev = bus->priv;
ar2313_reset_reg(dev); ar2313_reset_reg(dev);
return 0; return 0;
} }
@ -1347,19 +1362,19 @@ static int mdiobus_probe (struct net_device *dev)
phydev = sp->mii_bus.phy_map[phy_addr]; phydev = sp->mii_bus.phy_map[phy_addr];
break; /* break out with first one found */ break; /* break out with first one found */
} }
if (!phydev) { if (!phydev) {
printk (KERN_ERR "ar2313:%s: no PHY found\n", dev->name); printk (KERN_ERR "ar2313:%s: no PHY found\n", dev->name);
return -1; return -1;
} }
/* now we are supposed to have a proper phydev, to attach to... */ /* now we are supposed to have a proper phydev, to attach to... */
BUG_ON(!phydev); BUG_ON(!phydev);
BUG_ON(phydev->attached_dev); BUG_ON(phydev->attached_dev);
phydev = phy_connect(dev, phydev->dev.bus_id, &ar2313_adjust_link, 0, phydev = phy_connect(dev, phydev->dev.bus_id, &ar2313_adjust_link, 0,
PHY_INTERFACE_MODE_MII); PHY_INTERFACE_MODE_MII);
if (IS_ERR(phydev)) { if (IS_ERR(phydev)) {
printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
return PTR_ERR(phydev); return PTR_ERR(phydev);
@ -1374,18 +1389,16 @@ static int mdiobus_probe (struct net_device *dev)
/* | SUPPORTED_Pause | SUPPORTED_Asym_Pause */ /* | SUPPORTED_Pause | SUPPORTED_Asym_Pause */
| SUPPORTED_MII | SUPPORTED_MII
| SUPPORTED_TP); | SUPPORTED_TP);
phydev->advertising = phydev->supported; phydev->advertising = phydev->supported;
//sp->old_link = 0; sp->oldduplex = -1;
//sp->old_speed = 0;
//sp->old_duplex = -1;
sp->phy_dev = phydev; sp->phy_dev = phydev;
printk(KERN_INFO "%s: attached PHY driver [%s] " printk(KERN_INFO "%s: attached PHY driver [%s] "
"(mii_bus:phy_addr=%s)\n", "(mii_bus:phy_addr=%s)\n",
dev->name, phydev->drv->name, phydev->dev.bus_id); dev->name, phydev->drv->name, phydev->dev.bus_id);
return 0; return 0;
} }

View File

@ -164,6 +164,7 @@ struct ar2313_private {
struct phy_device *phy_dev; struct phy_device *phy_dev;
struct mii_bus mii_bus; struct mii_bus mii_bus;
int oldduplex;
}; };