Patch for link detection for R8169

From: Miroslaw Mieszczak
Date: Tue Sep 06 2005 - 09:33:14 EST


There is a patch to driver of RLT8169 network card. This match make possible detection of the link status even if network interface is down.
This is usefull for laptop users.



--- 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,