Explorar el Código

Fixed at91 ethernet driver for dm9161a PHY interrupt issue

SVN-Revision: 7493
Hamish Guthrie hace 18 años
padre
commit
e759465420
Se han modificado 1 ficheros con 28 adiciones y 0 borrados
  1. 28 0
      target/linux/at91-2.6/patches/010-dm9161a-phyfix.patch

+ 28 - 0
target/linux/at91-2.6/patches/010-dm9161a-phyfix.patch

@@ -0,0 +1,28 @@
+--- linux-2.6.21.1/drivers/net/arm/at91_ether.c.old	2007-06-04 18:15:49.000000000 +0200
++++ linux-2.6.21.1/drivers/net/arm/at91_ether.c	2007-06-04 18:10:36.000000000 +0200
+@@ -146,6 +146,7 @@
+ 	struct at91_private *lp = netdev_priv(dev);
+ 	unsigned int bmsr, bmcr, lpa, mac_cfg;
+ 	unsigned int speed, duplex;
++	unsigned long timeout = jiffies + HZ;
+ 
+ 	if (!mii_link_ok(&lp->mii)) {		/* no link */
+ 		netif_carrier_off(dev);
+@@ -158,8 +159,15 @@
+ 	read_phy(lp->phy_address, MII_BMSR, &bmsr);
+ 	read_phy(lp->phy_address, MII_BMCR, &bmcr);
+ 	if (bmcr & BMCR_ANENABLE) {				/* AutoNegotiation is enabled */
+-		if (!(bmsr & BMSR_ANEGCOMPLETE))
+-			return;			/* Do nothing - another interrupt generated when negotiation complete */
++		while (!(bmsr & BMSR_ANEGCOMPLETE)) {
++			if (time_after(jiffies, timeout)) {
++				printk("at91_ether: Auto-negotiate timeout\n");
++				return;
++			}
++			read_phy(lp->phy_address, MII_BMSR, &bmsr);
++			read_phy(lp->phy_address, MII_BMCR, &bmcr);
++			cpu_relax();
++		}
+ 
+ 		read_phy(lp->phy_address, MII_LPA, &lpa);
+ 		if ((lpa & LPA_100FULL) || (lpa & LPA_100HALF)) speed = SPEED_100;