Re: [PATCH] Fixed a number of bugs in the PHY Layer

2006-11-07 Thread Jeff Garzik

Andy Fleming wrote:

* genphy_update_link is now exported
* Added a fix from [EMAIL PROTECTED] which changes forcing so it
  only updates the link.  Otherwise, it never tries the lower
  values, since it is always overwriting the speed/duplex values
  with the current ones, rather than the intended ones.
* Fixed a bug where bringing up a PHY with no link caused it to
  timeout, and enter forcing mode.  Once in forcing mode,
  plugging in the link didn't autonegotiate.  Now the AN state
  detects the lack of link, and enters the NO_LINK state.  AN
  only times out if the link is up and AN fails
* Cleaned up the PHY_AN case, reducing one level of indentation
  for the timeout code.


applied

Please include a Signed-off-by line in future patches!

Jeff



-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] Fixed a number of bugs in the PHY Layer

2006-10-16 Thread Andy Fleming

* genphy_update_link is now exported
* Added a fix from [EMAIL PROTECTED] which changes forcing so it
  only updates the link.  Otherwise, it never tries the lower
  values, since it is always overwriting the speed/duplex values
  with the current ones, rather than the intended ones.
* Fixed a bug where bringing up a PHY with no link caused it to
  timeout, and enter forcing mode.  Once in forcing mode,
  plugging in the link didn't autonegotiate.  Now the AN state
  detects the lack of link, and enters the NO_LINK state.  AN
  only times out if the link is up and AN fails
* Cleaned up the PHY_AN case, reducing one level of indentation
  for the timeout code.
---
 drivers/net/phy/phy.c|   81 --
 drivers/net/phy/phy_device.c |1 +
 2 files changed, 40 insertions(+), 42 deletions(-)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 3af9fcf..c81536d 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -693,60 +693,57 @@ static void phy_timer(unsigned long data
 
break;
case PHY_AN:
+   err = phy_read_status(phydev);
+
+   if (err < 0)
+   break;
+
+   /* If the link is down, give up on
+* negotiation for now */
+   if (!phydev->link) {
+   phydev->state = PHY_NOLINK;
+   netif_carrier_off(phydev->attached_dev);
+   phydev->adjust_link(phydev->attached_dev);
+   break;
+   }
+
/* Check if negotiation is done.  Break
 * if there's an error */
err = phy_aneg_done(phydev);
if (err < 0)
break;
 
-   /* If auto-negotiation is done, we change to
-* either RUNNING, or NOLINK */
+   /* If AN is done, we're running */
if (err > 0) {
-   err = phy_read_status(phydev);
+   phydev->state = PHY_RUNNING;
+   netif_carrier_on(phydev->attached_dev);
+   phydev->adjust_link(phydev->attached_dev);
+
+   } else if (0 == phydev->link_timeout--) {
+   int idx;
 
-   if (err)
+   needs_aneg = 1;
+   /* If we have the magic_aneg bit,
+* we try again */
+   if (phydev->drv->flags & PHY_HAS_MAGICANEG)
break;
 
-   if (phydev->link) {
-   phydev->state = PHY_RUNNING;
-   netif_carrier_on(phydev->attached_dev);
-   } else {
-   phydev->state = PHY_NOLINK;
-   netif_carrier_off(phydev->attached_dev);
-   }
+   /* The timer expired, and we still
+* don't have a setting, so we try
+* forcing it until we find one that
+* works, starting from the fastest speed,
+* and working our way down */
+   idx = phy_find_valid(0, phydev->supported);
 
-   phydev->adjust_link(phydev->attached_dev);
+   phydev->speed = settings[idx].speed;
+   phydev->duplex = settings[idx].duplex;
 
-   } else if (0 == phydev->link_timeout--) {
-   /* The counter expired, so either we
-* switch to forced mode, or the
-* magic_aneg bit exists, and we try aneg
-* again */
-   if (!(phydev->drv->flags & PHY_HAS_MAGICANEG)) {
-   int idx;
-
-   /* We'll start from the
-* fastest speed, and work
-* our way down */
-   idx = phy_find_valid(0,
-   phydev->supported);
-
-   phydev->speed = settings[idx].speed;
-   phydev->duplex = settings[idx].duplex;
-   
-   phydev->autoneg = AUTONEG_DISABLE;
-