netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andy Lutomirski <luto@stanford.edu>
To: Kernel Mailing List <linux-kernel@vger.kernel.org>,
	netdev@oss.sgi.com, shuchen@realtek.com.tw
Subject: r8169 excessive PHY reset
Date: Thu, 15 Apr 2004 22:19:04 -0700	[thread overview]
Message-ID: <407F6CC8.1060903@stanford.edu> (raw)

[-- Attachment #1: Type: text/plain, Size: 527 bytes --]

On my r8169 (Really 8110S, I think -- it's a MSI K8T Neo-FIS2R, running x86_64), 
if I unplug the network cable and reconnect it, the link stays down and the 
driver starts resetting the PHY at an absurd rate (many times per second).

Strangely enough, simply removing all the PHY reset code fixes it.  Is there any 
reason for this code?  (The other end of my link is e1000, and I'm using 1000Mbps.)

Patch against 2.6.5-mm5 (attached because my mailer will mangle it otherwise).

--Andy

Please CC me b/c i'm not subscribed.

[-- Attachment #2: r8169fix.patch --]
[-- Type: text/plain, Size: 3140 bytes --]

--- ./drivers/net/r8169.c.orig	2004-04-15 22:08:07.962654280 -0700
+++ ./drivers/net/r8169.c	2004-04-15 22:09:22.101383480 -0700
@@ -98,7 +98,6 @@
 
 #define RTL_MIN_IO_SIZE 0x80
 #define RTL8169_TX_TIMEOUT	(6*HZ)
-#define RTL8169_PHY_TIMEOUT	(HZ) 
 
 /* write/read MMIO register */
 #define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
@@ -323,7 +322,6 @@
 	dma_addr_t RxPhyAddr;
 	struct sk_buff *Rx_skbuff[NUM_RX_DESC];	/* Rx data buffers */
 	struct sk_buff *Tx_skbuff[NUM_TX_DESC];	/* Index of Transmit data buffer */
-	struct timer_list timer;
 	unsigned long phy_link_down_cnt;
 	u16 cp_cmd;
 };
@@ -568,90 +566,6 @@
 	mdio_write(ioaddr, 31, 0x0000); //w 31 2 0 0
 }
 
-static void rtl8169_hw_phy_reset(struct net_device *dev)
-{
-	struct rtl8169_private *tp = dev->priv;
-	void *ioaddr = tp->mmio_addr;
-	int i, val;
-
-	printk(KERN_WARNING PFX "%s: Reset RTL8169s PHY\n", dev->name);
-
-	val = (mdio_read(ioaddr, 0) | 0x8000) & 0xffff;
-	mdio_write(ioaddr, 0, val);
-
-	for (i = 50; i >= 0; i--) {
-		if (!(mdio_read(ioaddr, 0) & 0x8000))
-			break;
-		udelay(100); /* Gross */
-	}
-
-	if (i < 0) {
-		printk(KERN_WARNING PFX "%s: no PHY Reset ack. Giving up.\n",
-		       dev->name);
-	}
-}
-
-static void rtl8169_phy_timer(unsigned long __opaque)
-{
-	struct net_device *dev = (struct net_device *)__opaque;
-	struct rtl8169_private *tp = dev->priv;
-	struct timer_list *timer = &tp->timer;
-	void *ioaddr = tp->mmio_addr;
-
-	assert(tp->mac_version > RTL_GIGA_MAC_VER_B);
-	assert(tp->phy_version < RTL_GIGA_PHY_VER_G);
-
-	if (RTL_R8(PHYstatus) & LinkStatus)
-		tp->phy_link_down_cnt = 0;
-	else {
-		tp->phy_link_down_cnt++;
-		if (tp->phy_link_down_cnt >= 12) {
-			int reg;
-
-			// If link on 1000, perform phy reset.
-			reg = mdio_read(ioaddr, PHY_1000_CTRL_REG);
-			if (reg & PHY_Cap_1000_Full) 
-				rtl8169_hw_phy_reset(dev);
-
-			tp->phy_link_down_cnt = 0;
-		}
-	}
-
-	mod_timer(timer, RTL8169_PHY_TIMEOUT);
-}
-
-static inline void rtl8169_delete_timer(struct net_device *dev)
-{
-	struct rtl8169_private *tp = dev->priv;
-	struct timer_list *timer = &tp->timer;
-
-	if ((tp->mac_version <= RTL_GIGA_MAC_VER_B) ||
-	    (tp->phy_version >= RTL_GIGA_PHY_VER_G))
-		return;
-
-	del_timer_sync(timer);
-
-	tp->phy_link_down_cnt = 0;
-}
-
-static inline void rtl8169_request_timer(struct net_device *dev)
-{
-	struct rtl8169_private *tp = dev->priv;
-	struct timer_list *timer = &tp->timer;
-
-	if ((tp->mac_version <= RTL_GIGA_MAC_VER_B) ||
-	    (tp->phy_version >= RTL_GIGA_PHY_VER_G))
-		return;
-
-	tp->phy_link_down_cnt = 0;
-
-	init_timer(timer);
-	timer->expires = jiffies + RTL8169_PHY_TIMEOUT;
-	timer->data = (unsigned long)(dev);
-	timer->function = rtl8169_phy_timer;
-	add_timer(timer);
-}
-
 static int __devinit
 rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
 		   void **ioaddr_out)
@@ -1074,8 +988,6 @@
 		goto err_free_rx;
 
 	rtl8169_hw_start(dev);
-
-	rtl8169_request_timer(dev);
 out:
 	return retval;
 
@@ -1587,8 +1499,6 @@
 
 	netif_stop_queue(dev);
 
-	rtl8169_delete_timer(dev);
-
 	spin_lock_irq(&tp->lock);
 
 	/* Stop the chip's Tx and Rx DMA processes. */

             reply	other threads:[~2004-04-16  5:19 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-04-16  5:19 Andy Lutomirski [this message]
2004-04-16  6:38 ` r8169 excessive PHY reset Francois Romieu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=407F6CC8.1060903@stanford.edu \
    --to=luto@stanford.edu \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@oss.sgi.com \
    --cc=shuchen@realtek.com.tw \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).