aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/benet/be_main.c
diff options
context:
space:
mode:
authorAjit Khaparde <ajitk@serverengines.com>2009-12-03 01:16:59 -0500
committerDavid S. Miller <davem@davemloft.net>2009-12-03 15:39:21 -0500
commit71d8d1b58aa4025ea73a66a130a98d0ed077f9b1 (patch)
tree36034463fa1b1438ad018fbaafbe9dac60159751 /drivers/net/benet/be_main.c
parentd744b44e21a2c908aae23a60da1b4ce35cd925ef (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.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