On Jan 26, 2007, at 08:36, Maciej W. Rozycki wrote:

Kumar,

I've got a BCM5461 that requires this fix to be able to force the speeds on the PHY. Not sure if its needed on the other variants or not. The problem is the genphy_config_aneg resets the PHY when forcing the speed and once we reset the BCM5461 it doesn't remember any of its settings.

I recall seeing a similar problem before and having checked with the IEEE spec I believe it's the generic code that is incorrect. Following is my
fix to address this problem.  Please try and see if it works for you.

 I am waiting for 2.6.20 to happen before I recheck my list of patches
related to the BCM1250 MAC and the PHY library and (re)submit whatever is
still relevant.  This patch is one of candidates.


I'm sifting through patches, and rediscovered this one waiting around. I'm mostly happy with it, but I have a few questions...



  Maciej

patch-mips-2.6.18-20060920-phy-forcing-1
diff -up --recursive --new-file linux-mips-2.6.18-20060920.macro/ drivers/net/phy/phy.c linux-mips-2.6.18-20060920/drivers/net/phy/phy.c --- linux-mips-2.6.18-20060920.macro/drivers/net/phy/phy.c 2006-08-05 04:58:46.000000000 +0000 +++ linux-mips-2.6.18-20060920/drivers/net/phy/phy.c 2006-09-25 03:03:45.000000000 +0000
@@ -713,6 +713,8 @@ static void phy_timer(unsigned long data
                                } else {
                                        phydev->state = PHY_NOLINK;
                                        netif_carrier_off(phydev->attached_dev);
+                                       phydev->link_timeout =
+                                               PHY_NOLINK_TIMEOUT;


What's the purpose of a NOLINK timeout? What problem is this solving? I'd prefer not to constantly restart AN every 3 seconds when the link is actually down. Do we need the autoneg code to wait a few seconds before it considers a link state of 0 valid?


diff -up --recursive --new-file linux-mips-2.6.18-20060920.macro/ drivers/net/phy/phy_device.c linux-mips-2.6.18-20060920/drivers/net/ phy/phy_device.c --- linux-mips-2.6.18-20060920.macro/drivers/net/phy/phy_device.c 2006-09-20 20:50:26.000000000 +0000 +++ linux-mips-2.6.18-20060920/drivers/net/phy/phy_device.c 2006-09-25 01:51:34.000000000 +0000
@@ -325,10 +325,18 @@ EXPORT_SYMBOL(genphy_config_advert);
  *   Please see phy_sanitize_settings() */
 int genphy_setup_forced(struct phy_device *phydev)
 {
-       int ctl = BMCR_RESET;
+       int ctl;

        phydev->pause = phydev->asym_pause = 0;

+       ctl = phy_read(phydev, MII_BMCR);
+
+       ctl &= ~(BMCR_ANENABLE | BMCR_ANRESTART);
+
+       ctl &= ~(BMCR_ISOLATE);
+
+       ctl &= ~(BMCR_SPEED1000 | BMCR_SPEED100 | BMCR_FULLDPLX);
+


This is fine, but I'm wondering if it's really necessary to go through all this effort just to preserve the values of RESET, LOOPBACK, POWER, and collision test. I agree, in principle, it's probably more robust, though. But can we perhaps make a constant like:

#define BMCR_FORCE_MASK (all the bits we want to keep)

And then use that? Or do it all in one line? It just feels a little clunky to me this way (Just my own sense of code aesthetics).


Andy


-
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

Reply via email to