e1000e: fix S0ix flows for cable connected case
authorVitaly Lifshits <vitaly.lifshits@intel.com>
Thu, 12 Mar 2020 11:57:07 +0000 (13:57 +0200)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sun, 19 Apr 2020 18:37:00 +0000 (11:37 -0700)
Added a fix to S0ix entry and exit flows for TGP and above
MAC types, to the case when the Ethernet cable is connected
and the link is up. With that the system is able to reach
SLP_S0 when going to freeze power state.

Signed-off-by: Vitaly Lifshits <vitaly.lifshits@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/e1000e/netdev.c
drivers/net/ethernet/intel/e1000e/regs.h

index 177c6da80c576f06b73c7754d4a68a350379c22c..e0b074820b473eb464a5a112cae004c68ca34f7d 100644 (file)
@@ -6404,6 +6404,31 @@ static void e1000e_s0ix_entry_flow(struct e1000_adapter *adapter)
        mac_data |= BIT(3);
        ew32(CTRL_EXT, mac_data);
 
+       /* Disable disconnected cable conditioning for Power Gating */
+       mac_data = er32(DPGFR);
+       mac_data |= BIT(2);
+       ew32(DPGFR, mac_data);
+
+       /* Don't wake from dynamic Power Gating with clock request */
+       mac_data = er32(FEXTNVM12);
+       mac_data |= BIT(12);
+       ew32(FEXTNVM12, mac_data);
+
+       /* Ungate PGCB clock */
+       mac_data = er32(FEXTNVM9);
+       mac_data |= BIT(28);
+       ew32(FEXTNVM9, mac_data);
+
+       /* Enable K1 off to enable mPHY Power Gating */
+       mac_data = er32(FEXTNVM6);
+       mac_data |= BIT(31);
+       ew32(FEXTNVM12, mac_data);
+
+       /* Enable mPHY power gating for any link and speed */
+       mac_data = er32(FEXTNVM8);
+       mac_data |= BIT(9);
+       ew32(FEXTNVM8, mac_data);
+
        /* Enable the Dynamic Clock Gating in the DMA and MAC */
        mac_data = er32(CTRL_EXT);
        mac_data |= E1000_CTRL_EXT_DMA_DYN_CLK_EN;
@@ -6433,6 +6458,35 @@ static void e1000e_s0ix_exit_flow(struct e1000_adapter *adapter)
        mac_data |= BIT(0);
        ew32(FEXTNVM7, mac_data);
 
+       /* Disable mPHY power gating for any link and speed */
+       mac_data = er32(FEXTNVM8);
+       mac_data &= ~BIT(9);
+       ew32(FEXTNVM8, mac_data);
+
+       /* Disable K1 off */
+       mac_data = er32(FEXTNVM6);
+       mac_data &= ~BIT(31);
+       ew32(FEXTNVM12, mac_data);
+
+       /* Disable Ungate PGCB clock */
+       mac_data = er32(FEXTNVM9);
+       mac_data &= ~BIT(28);
+       ew32(FEXTNVM9, mac_data);
+
+       /* Cancel not waking from dynamic
+        * Power Gating with clock request
+        */
+       mac_data = er32(FEXTNVM12);
+       mac_data &= ~BIT(12);
+       ew32(FEXTNVM12, mac_data);
+
+       /* Cancel disable disconnected cable conditioning
+        * for Power Gating
+        */
+       mac_data = er32(DPGFR);
+       mac_data &= ~BIT(2);
+       ew32(DPGFR, mac_data);
+
        /* Disable Dynamic Power Gating */
        mac_data = er32(CTRL_EXT);
        mac_data &= 0xFFFFFFF7;
index df59fd1d660c524c33e1174acfe825f1a6f0e237..8165ba2619a4de1a20c4835e07cd7d573e7dc7a7 100644 (file)
 #define E1000_FEXTNVM5 0x00014 /* Future Extended NVM 5 - RW */
 #define E1000_FEXTNVM6 0x00010 /* Future Extended NVM 6 - RW */
 #define E1000_FEXTNVM7 0x000E4 /* Future Extended NVM 7 - RW */
+#define E1000_FEXTNVM8 0x5BB0  /* Future Extended NVM 8 - RW */
 #define E1000_FEXTNVM9 0x5BB4  /* Future Extended NVM 9 - RW */
 #define E1000_FEXTNVM11        0x5BBC  /* Future Extended NVM 11 - RW */
+#define E1000_FEXTNVM12        0x5BC0  /* Future Extended NVM 12 - RW */
 #define E1000_PCIEANACFG       0x00F18 /* PCIE Analog Config */
+#define E1000_DPGFR    0x00FAC /* Dynamic Power Gate Force Control Register */
 #define E1000_FCT      0x00030 /* Flow Control Type - RW */
 #define E1000_VET      0x00038 /* VLAN Ether Type - RW */
 #define E1000_ICR      0x000C0 /* Interrupt Cause Read - R/clr */