Hi,

I'm currently doing some cleanup in *very* old patches I had against
2.6.10. (patch inlined below)

At that time a patch was provided to me to fix link status problems on
two ATCA boards (Mot ATCA-7101 and Mot ATCA-6101). If I'm correct the
7101 is using a variant of the 82546EB, and the 6101 a variant of the
82546GB.

I'm trying to achieve two things with that patch:

1. Cleanup the #if defined (CONFIG_ ...) that are introducing
useless kernel CONFIG options that are probably not board specific.

        1.a If needed move those to check based on DEVID or media_type
        1.b If not needed, trash them.

2. Asking around if playing with those PHY registers is the best
approach.
        2.a Submit patch upstream when cleaned up

I'm currently testing with the e1000 driver as of "commit
c6c427835cd755115a0f86da1aa9c97b2f8ffff8" (2.6.27.11)

When issuing ifdown on the interfaces I get some hanging, so I believe
those old changes might still be required in their current form, or
rebased for the current driver.

I think I've identified where in the current driver where that code
could fit, just asking around if you think it could be needed.

Cheers,

/jonathan

----------------------------------------------------------------------

--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -29,6 +29,9 @@
 #include "e1000.h"

 /* Change Log
+ * 5.3.13      3/23/06
+ * - synchronize physical link with interface (j.pie...@xxx)
+ *
  * 5.3.12      6/7/04
  * - kcompat NETIF_MSG for older kernels (2.4.9) <sean.p.mcderm...@xxx>
  * - if_mii support and associated kcompat for older kernels
@@ -258,12 +261,35 @@
        /* hardware has been reset, we need to reload some things */

        /* Reset the PHY if it was previously powered down */
-       if(adapter->hw.media_type == e1000_media_type_copper) {
+       if(adapter->hw.media_type == e1000_media_type_copper)
+       {
                uint16_t mii_reg;
                e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
                if(mii_reg & MII_CR_POWER_DOWN)
                        e1000_phy_reset(&adapter->hw);
        }
+#if defined(CONFIG_PPC_ATCA6101) || defined(CONFIG_INTEL_ATCA7101)
+       else if((adapter->hw.media_type == e1000_media_type_fiber) ||
+               (adapter->hw.media_type == e1000_media_type_internal_serdes))
+       {
+               int32_t  ret_val;
+               int32_t  ret_val2;
+               uint16_t default_page = 0;
+               uint16_t phy_data;
+
+               /* Set PHY register 30, page 31, bits 15:0 <= 0h */
+               ret_val2 = ret_val = e1000_read_phy_reg(&adapter->hw,
M88E1000_PHY_PAGE_SELECT, &default_page);
+               if(ret_val == E1000_SUCCESS)
+                       ret_val = e1000_write_phy_reg(&adapter->hw,
M88E1000_PHY_PAGE_SELECT, 31);
+               if(ret_val == E1000_SUCCESS)
+                       ret_val = e1000_read_phy_reg(&adapter->hw,
M88E1000_PHY_GEN_CONTROL, &phy_data);
+               phy_data &= 0xFFFF0000;
+               if(ret_val == E1000_SUCCESS)
+                       e1000_write_phy_reg(&adapter->hw,
M88E1000_PHY_GEN_CONTROL, phy_data);
+               if(ret_val2 == E1000_SUCCESS)
+                       e1000_write_phy_reg(&adapter->hw,
M88E1000_PHY_PAGE_SELECT, default_page);
+       }
+#endif

        e1000_set_multi(netdev);

@@ -306,12 +332,43 @@

        /* If WoL is not enabled
         * Power down the PHY so no link is implied when interface is down */
+#if defined(CONFIG_PPC_ATCA6101) || defined(CONFIG_INTEL_ATCA7101)
+       if(!adapter->wol)
+       {
+               if(adapter->hw.media_type == e1000_media_type_copper)
+               {
+#else
        if(!adapter->wol && adapter->hw.media_type == e1000_media_type_copper) {
+#endif
                uint16_t mii_reg;
                e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
                mii_reg |= MII_CR_POWER_DOWN;
                e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg);
        }
+#if defined(CONFIG_PPC_ATCA6101) || defined(CONFIG_INTEL_ATCA7101)
+               else if((adapter->hw.media_type == e1000_media_type_fiber) ||
+                       (adapter->hw.media_type ==
e1000_media_type_internal_serdes))
+               {
+                       int32_t  ret_val;
+                       int32_t  ret_val2;
+                       uint16_t default_page = 0;
+                       uint16_t phy_data;
+
+                       /* Set PHY register 30, page 31, bits 15:0 <= 2001h */
+                       ret_val2 = ret_val =
e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_PAGE_SELECT,
&default_page);
+                       if(ret_val == E1000_SUCCESS)
+                               ret_val =
e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_PAGE_SELECT, 31);
+                       if(ret_val == E1000_SUCCESS)
+                               ret_val =
e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_GEN_CONTROL, &phy_data);
+                       phy_data &= 0xFFFF0000;
+                       phy_data |= 0x2001;
+                       if(ret_val == E1000_SUCCESS)
+                               ret_val =
e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_GEN_CONTROL, phy_data);
+                       if(ret_val2 == E1000_SUCCESS)
+                               e1000_write_phy_reg(&adapter->hw,
M88E1000_PHY_PAGE_SELECT, default_page);
+               }
+       }
+#endif
 }

 void
@@ -588,6 +645,42 @@
        if((err = register_netdev(netdev)))
                goto err_register;

+#if defined(CONFIG_PPC_ATCA6101) || defined(CONFIG_INTEL_ATCA7101)
+       /* If WoL is not enabled
+        * Power down the PHY so no link is implied when interface is down */
+       if(!adapter->wol)
+       {
+               if(adapter->hw.media_type == e1000_media_type_copper)
+               {
+                       uint16_t mii_reg;
+                       e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
+                       mii_reg |= MII_CR_POWER_DOWN;
+                       e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg);
+               }
+               else if((adapter->hw.media_type == e1000_media_type_fiber) ||
+                       (adapter->hw.media_type ==
e1000_media_type_internal_serdes))
+               {
+                       int32_t  ret_val;
+                       int32_t  ret_val2;
+                       uint16_t default_page = 0;
+                       uint16_t phy_data;
+
+                       /* Set PHY register 30, page 31, bits 15:0 <= 2001h */
+                       ret_val2 = ret_val =
e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_PAGE_SELECT,
&default_page);
+                       if(ret_val == E1000_SUCCESS)
+                               ret_val =
e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_PAGE_SELECT, 31);
+                       if(ret_val == E1000_SUCCESS)
+                               ret_val =
e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_GEN_CONTROL, &phy_data);
+                       phy_data &= 0xFFFF0000;
+                       phy_data |= 0x2001;
+                       if(ret_val == E1000_SUCCESS)
+                               ret_val =
e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_GEN_CONTROL, phy_data);
+                       if(ret_val2 == E1000_SUCCESS)
+                               e1000_write_phy_reg(&adapter->hw,
M88E1000_PHY_PAGE_SELECT, default_page);
+               }
+       }
+#endif
+
        DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n");

        cards_found++;

------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel

Reply via email to