Hello there!

I've recently stumbled about the fact that igb driver uses a wrong EEMNGCTL
register for some mac types.

This register is used in e1000_82575.c:igb_get_cfg_done_82575() and defined in
e1000_regs.h:

#define E1000_EEMNGCTL 0x01010  /* MNG EEprom Control */

But at least my i210 docs tell me a different offset for this register, 0x12030
to be exact. So I've added some code to use the correct register at least for
the Springville in my application (0x1533):

--- a/drivers/net/ethernet/intel/igb/e1000_82575.c  2015-09-08
19:15:29.000000000 +0200
+++ b/drivers/net/ethernet/intel/igb/e1000_82575.c  2015-09-11
16:41:51.000000000 +0200
@@ -1259,8 +1258,18 @@
 {
        s32 timeout = PHY_CFG_TIMEOUT;
        s32 ret_val = 0;
+       u32 reg;
        u32 mask = E1000_NVM_CFG_DONE_PORT_0;

+       switch (hw->mac.type) {
+       case e1000_i210:
+         reg = E1000_EEMNGCTL_I210;
+         break;
+       default:
+         reg = E1000_EEMNGCTL;
+         break;
+       }
+
        if (hw->bus.func == 1)
                mask = E1000_NVM_CFG_DONE_PORT_1;
        else if (hw->bus.func == E1000_FUNC_2)
@@ -1269,7 +1278,7 @@
                mask = E1000_NVM_CFG_DONE_PORT_3;

        while (timeout) {
-               if (rd32(E1000_EEMNGCTL) & mask)
+               if (rd32(reg) & mask)
                        break;
                usleep_range(1000,2000);
                timeout--;
--- a/drivers/net/ethernet/intel/igb/e1000_regs.h   2015-09-11
16:27:55.000000000 +0200
+++ b/drivers/net/ethernet/intel/igb/e1000_regs.h   2015-09-11
16:42:02.000000000 +0200
@@ -70,6 +70,7 @@
 #define E1000_PBS      0x01008  /* Packet Buffer Size */
 #define E1000_EEMNGCTL 0x01010  /* MNG EEprom Control */
 #define E1000_EEARBC_I210 0x12024  /* EEPROM Auto Read Bus Control */
+#define E1000_EEMNGCTL_I210 0x12030  /* MNG EEprom Control */
 #define E1000_EEWR     0x0102C  /* EEPROM Write Register - RW */
 #define E1000_I2CCMD   0x01028  /* SFPI2C Command Register - RW */
 #define E1000_FRTIMER  0x01048  /* Free Running Timer - RW */


With that change, I can save ~ 200ms while turning on Ethernet, which otherwise
get lost while waiting for the timeout.

However, I don't know which MAC types are really affected by the move of
EEMNGCTL. Maybe it's better to use a condition like (hw->mac.type >=
e1000_i210) or similar, or to expand the cases in the switch stmt. I think you
might know better ;-)

Roman

------------------------------------------------------------------------------
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit 
http://communities.intel.com/community/wired

Reply via email to