--- r8169.c 2005-09-02 15:34:52.000000000 +0200 +++ linux/drivers/net/r8169.c 2005-09-05 21:11:15.000000000 +0200 @@ -538,14 +538,27 @@ static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr) { - return RTL_R32(TBICSR) & TBILinkOk; + return (RTL_R32(TBICSR) & TBILinkOk) == TBILinkOk ? 1:0; } static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr) { - return RTL_R8(PHYstatus) & LinkStatus; + return (RTL_R8(PHYstatus) & LinkStatus) == LinkStatus ? 1:0; } +static u32 rtl8169_get_link(struct net_device *dev) +{ + struct rtl8169_private *np = netdev_priv(dev); + unsigned int result; + unsigned long flags; + + spin_lock_irqsave(&np->lock, flags); + result = np->link_ok(np->mmio_addr); + spin_unlock_irqrestore(&np->lock, flags); + return result; +} + + static void rtl8169_tbi_reset_enable(void __iomem *ioaddr) { RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset); @@ -577,6 +590,8 @@ spin_unlock_irqrestore(&tp->lock, flags); } + + static void rtl8169_link_option(int idx, u8 *autoneg, u16 *speed, u8 *duplex) { struct { @@ -1010,7 +1025,7 @@ static struct ethtool_ops rtl8169_ethtool_ops = { .get_drvinfo = rtl8169_get_drvinfo, .get_regs_len = rtl8169_get_regs_len, - .get_link = ethtool_op_get_link, + .get_link = rtl8169_get_link,/* ethtool_op_get_link,*/ .get_settings = rtl8169_get_settings, .set_settings = rtl8169_set_settings, .get_msglevel = rtl8169_get_msglevel,