diff --git a/sys/dev/igc/if_igc.c b/sys/dev/igc/if_igc.c index 8c9ec0566..2daffc592 100644 --- a/sys/dev/igc/if_igc.c +++ b/sys/dev/igc/if_igc.c @@ -2442,6 +2442,7 @@ igc_get_wakeup(if_ctx_t ctx) if (eeprom_data & apme_mask) sc->wol = IGC_WUFC_LNKC; + sc->wol |= IGC_WUFC_MAG; /* always enable magic packet wakeup */ } @@ -2456,6 +2457,7 @@ igc_enable_wakeup(if_ctx_t ctx) if_t ifp = iflib_get_ifp(ctx); int error = 0; u32 ctrl, rctl; + u32 phpm; if (!pci_has_pm(dev)) return; @@ -2490,6 +2492,14 @@ igc_enable_wakeup(if_ctx_t ctx) IGC_WRITE_REG(&sc->hw, IGC_WUC, IGC_WUC_PME_EN); IGC_WRITE_REG(&sc->hw, IGC_WUFC, sc->wol); + /* Clear PHPM bits that disable link speeds in D3, + * otherwise the NIC won't wake on magic packet */ + phpm = IGC_READ_REG(&sc->hw, IGC_I225_PHPM); + phpm &= ~IGC_I225_PHPM_DIS_100_D3; + phpm &= ~IGC_I225_PHPM_DIS_1000_D3; + phpm &= ~IGC_I225_PHPM_DIS_2500_D3; + IGC_WRITE_REG(&sc->hw, IGC_I225_PHPM, phpm); + pme: if (!error && (if_getcapenable(ifp) & IFCAP_WOL)) pci_enable_pme(dev);