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,

Reply via email to