static int siena_set_wol(struct efx_nic *efx, u32 type) { struct siena_nic_data *nic_data = efx->nic_data; int rc; if (type & ~WAKE_MAGIC) return -EINVAL; if (type & WAKE_MAGIC) { if (nic_data->wol_filter_id != -1) efx_mcdi_wol_filter_remove(efx, nic_data->wol_filter_id); rc = efx_mcdi_wol_filter_set_magic(efx, efx->net_dev->dev_addr, &nic_data->wol_filter_id); if (rc) goto fail; pci_wake_from_d3(efx->pci_dev, true); } else { rc = efx_mcdi_wol_filter_reset(efx); nic_data->wol_filter_id = -1; pci_wake_from_d3(efx->pci_dev, false); if (rc) goto fail; } return 0; fail: netif_err(efx, hw, efx->net_dev, "%s failed: type=%d rc=%d\n", __func__, type, rc); return rc; }
static void aq_pci_shutdown(struct pci_dev *pdev) { struct aq_nic_s *self = pci_get_drvdata(pdev); aq_nic_shutdown(self); pci_disable_device(pdev); if (system_state == SYSTEM_POWER_OFF) { pci_wake_from_d3(pdev, false); pci_set_power_state(pdev, PCI_D3hot); } }
static void siena_init_wol(struct efx_nic *efx) { struct siena_nic_data *nic_data = efx->nic_data; int rc; rc = efx_mcdi_wol_filter_get_magic(efx, &nic_data->wol_filter_id); if (rc != 0) { /* If it failed, attempt to get into a synchronised * state with MC by resetting any set WoL filters */ efx_mcdi_wol_filter_reset(efx); nic_data->wol_filter_id = -1; } else if (nic_data->wol_filter_id != -1) { pci_wake_from_d3(efx->pci_dev, true); } }
static int __maybe_unused stmmac_pci_suspend(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); int ret; ret = stmmac_suspend(dev); if (ret) return ret; ret = pci_save_state(pdev); if (ret) return ret; pci_disable_device(pdev); pci_wake_from_d3(pdev, true); return 0; }