e1000e: disable s0ix entry and exit flows for ME systems
[linux-2.6-microblaze.git] / drivers / net / ethernet / intel / e1000e / netdev.c
index 66609cf..32f23a1 100644 (file)
@@ -107,6 +107,45 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = {
        {0, NULL}
 };
 
+struct e1000e_me_supported {
+       u16 device_id;          /* supported device ID */
+};
+
+static const struct e1000e_me_supported me_supported[] = {
+       {E1000_DEV_ID_PCH_LPT_I217_LM},
+       {E1000_DEV_ID_PCH_LPTLP_I218_LM},
+       {E1000_DEV_ID_PCH_I218_LM2},
+       {E1000_DEV_ID_PCH_I218_LM3},
+       {E1000_DEV_ID_PCH_SPT_I219_LM},
+       {E1000_DEV_ID_PCH_SPT_I219_LM2},
+       {E1000_DEV_ID_PCH_LBG_I219_LM3},
+       {E1000_DEV_ID_PCH_SPT_I219_LM4},
+       {E1000_DEV_ID_PCH_SPT_I219_LM5},
+       {E1000_DEV_ID_PCH_CNP_I219_LM6},
+       {E1000_DEV_ID_PCH_CNP_I219_LM7},
+       {E1000_DEV_ID_PCH_ICP_I219_LM8},
+       {E1000_DEV_ID_PCH_ICP_I219_LM9},
+       {E1000_DEV_ID_PCH_CMP_I219_LM10},
+       {E1000_DEV_ID_PCH_CMP_I219_LM11},
+       {E1000_DEV_ID_PCH_CMP_I219_LM12},
+       {E1000_DEV_ID_PCH_TGP_I219_LM13},
+       {E1000_DEV_ID_PCH_TGP_I219_LM14},
+       {E1000_DEV_ID_PCH_TGP_I219_LM15},
+       {0}
+};
+
+static bool e1000e_check_me(u16 device_id)
+{
+       struct e1000e_me_supported *id;
+
+       for (id = (struct e1000e_me_supported *)me_supported;
+            id->device_id; id++)
+               if (device_id == id->device_id)
+                       return true;
+
+       return false;
+}
+
 /**
  * __ew32_prepare - prepare to write to MAC CSR register on certain parts
  * @hw: pointer to the HW structure
@@ -6916,7 +6955,8 @@ static int e1000e_pm_suspend(struct device *dev)
                e1000e_pm_thaw(dev);
 
        /* Introduce S0ix implementation */
-       if (hw->mac.type >= e1000_pch_cnp)
+       if (hw->mac.type >= e1000_pch_cnp &&
+           !e1000e_check_me(hw->adapter->pdev->device))
                e1000e_s0ix_entry_flow(adapter);
 
        return rc;
@@ -6931,7 +6971,8 @@ static int e1000e_pm_resume(struct device *dev)
        int rc;
 
        /* Introduce S0ix implementation */
-       if (hw->mac.type >= e1000_pch_cnp)
+       if (hw->mac.type >= e1000_pch_cnp &&
+           !e1000e_check_me(hw->adapter->pdev->device))
                e1000e_s0ix_exit_flow(adapter);
 
        rc = __e1000_resume(pdev);