diff options
author | Ajit Khaparde <ajitk@serverengines.com> | 2009-12-03 01:16:59 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-12-03 15:39:21 -0500 |
commit | 71d8d1b58aa4025ea73a66a130a98d0ed077f9b1 (patch) | |
tree | 36034463fa1b1438ad018fbaafbe9dac60159751 /drivers/net/benet/be_main.c | |
parent | d744b44e21a2c908aae23a60da1b4ce35cd925ef (diff) |
be2net: Support for WoL using magic packet after suspend.
Add support for WOL using Magic Packet after suspend is done.
Signed-off-by: Sarveshwar Bandi <sarveshwarb@serverengines.com>
Signed-off-by: Ajit Khaparde <ajitk@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/benet/be_main.c')
-rw-r--r-- | drivers/net/benet/be_main.c | 44 |
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 | ||
1662 | static 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 | |||
1662 | static int be_setup(struct be_adapter *adapter) | 1700 | static 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 | ||