aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/benet/be_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/benet/be_main.c')
-rw-r--r--drivers/net/benet/be_main.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index f24ac4b5ce8f..84f686f41b53 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -1659,6 +1659,44 @@ ret_sts:
1659 return status; 1659 return status;
1660} 1660}
1661 1661
1662static int be_setup_wol(struct be_adapter *adapter, bool enable)
1663{
1664 struct be_dma_mem cmd;
1665 int status = 0;
1666 u8 mac[ETH_ALEN];
1667
1668 memset(mac, 0, ETH_ALEN);
1669
1670 cmd.size = sizeof(struct be_cmd_req_acpi_wol_magic_config);
1671 cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, &cmd.dma);
1672 if (cmd.va == NULL)
1673 return -1;
1674 memset(cmd.va, 0, cmd.size);
1675
1676 if (enable) {
1677 status = pci_write_config_dword(adapter->pdev,
1678 PCICFG_PM_CONTROL_OFFSET, PCICFG_PM_CONTROL_MASK);
1679 if (status) {
1680 dev_err(&adapter->pdev->dev,
1681 "Could not enable Wake-on-lan \n");
1682 pci_free_consistent(adapter->pdev, cmd.size, cmd.va,
1683 cmd.dma);
1684 return status;
1685 }
1686 status = be_cmd_enable_magic_wol(adapter,
1687 adapter->netdev->dev_addr, &cmd);
1688 pci_enable_wake(adapter->pdev, PCI_D3hot, 1);
1689 pci_enable_wake(adapter->pdev, PCI_D3cold, 1);
1690 } else {
1691 status = be_cmd_enable_magic_wol(adapter, mac, &cmd);
1692 pci_enable_wake(adapter->pdev, PCI_D3hot, 0);
1693 pci_enable_wake(adapter->pdev, PCI_D3cold, 0);
1694 }
1695
1696 pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma);
1697 return status;
1698}
1699
1662static int be_setup(struct be_adapter *adapter) 1700static int be_setup(struct be_adapter *adapter)
1663{ 1701{
1664 struct net_device *netdev = adapter->netdev; 1702 struct net_device *netdev = adapter->netdev;
@@ -2282,6 +2320,9 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state)
2282 struct be_adapter *adapter = pci_get_drvdata(pdev); 2320 struct be_adapter *adapter = pci_get_drvdata(pdev);
2283 struct net_device *netdev = adapter->netdev; 2321 struct net_device *netdev = adapter->netdev;
2284 2322
2323 if (adapter->wol)
2324 be_setup_wol(adapter, true);
2325
2285 netif_device_detach(netdev); 2326 netif_device_detach(netdev);
2286 if (netif_running(netdev)) { 2327 if (netif_running(netdev)) {
2287 rtnl_lock(); 2328 rtnl_lock();
@@ -2324,6 +2365,9 @@ static int be_resume(struct pci_dev *pdev)
2324 rtnl_unlock(); 2365 rtnl_unlock();
2325 } 2366 }
2326 netif_device_attach(netdev); 2367 netif_device_attach(netdev);
2368
2369 if (adapter->wol)
2370 be_setup_wol(adapter, false);
2327 return 0; 2371 return 0;
2328} 2372}
2329 2373