Commit 76a9e08e authored by Suresh Reddy's avatar Suresh Reddy Committed by David S. Miller

be2net: cleanup wake-on-lan code

This patch cleans-up wake-on-lan code in the following ways:
1) Removes some driver hacks in be_cmd_get_acpi_wol_cap() that were based
on incorrect assumptions.
2) Uses the adapter->wol_en and wol_cap variables for checking if WoL
is supported and enabled on an interface instead of referring to the
exclusion list via the macro be_is_wol_supported()
Signed-off-by: default avatarSuresh Reddy <suresh.reddy@emulex.com>
Signed-off-by: default avatarSathya Perla <sathya.perla@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b188f090
...@@ -492,7 +492,7 @@ struct be_adapter { ...@@ -492,7 +492,7 @@ struct be_adapter {
u16 pvid; u16 pvid;
struct phy_info phy; struct phy_info phy;
u8 wol_cap; u8 wol_cap;
bool wol; bool wol_en;
u32 uc_macs; /* Count of secondary UC MAC programmed */ u32 uc_macs; /* Count of secondary UC MAC programmed */
u16 asic_rev; u16 asic_rev;
u16 qnq_vid; u16 qnq_vid;
......
...@@ -3040,14 +3040,16 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter) ...@@ -3040,14 +3040,16 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
{ {
struct be_mcc_wrb *wrb; struct be_mcc_wrb *wrb;
struct be_cmd_req_acpi_wol_magic_config_v1 *req; struct be_cmd_req_acpi_wol_magic_config_v1 *req;
int status; int status = 0;
int payload_len = sizeof(*req);
struct be_dma_mem cmd; struct be_dma_mem cmd;
if (!be_cmd_allowed(adapter, OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, if (!be_cmd_allowed(adapter, OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
CMD_SUBSYSTEM_ETH)) CMD_SUBSYSTEM_ETH))
return -EPERM; return -EPERM;
if (be_is_wol_excluded(adapter))
return status;
if (mutex_lock_interruptible(&adapter->mbox_lock)) if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1; return -1;
...@@ -3072,7 +3074,7 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter) ...@@ -3072,7 +3074,7 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
payload_len, wrb, &cmd); sizeof(*req), wrb, &cmd);
req->hdr.version = 1; req->hdr.version = 1;
req->query_options = BE_GET_WOL_CAP; req->query_options = BE_GET_WOL_CAP;
...@@ -3082,13 +3084,9 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter) ...@@ -3082,13 +3084,9 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
struct be_cmd_resp_acpi_wol_magic_config_v1 *resp; struct be_cmd_resp_acpi_wol_magic_config_v1 *resp;
resp = (struct be_cmd_resp_acpi_wol_magic_config_v1 *) cmd.va; resp = (struct be_cmd_resp_acpi_wol_magic_config_v1 *) cmd.va;
/* the command could succeed misleadingly on old f/w
* which is not aware of the V1 version. fake an error. */
if (resp->hdr.response_length < payload_len) {
status = -1;
goto err;
}
adapter->wol_cap = resp->wol_settings; adapter->wol_cap = resp->wol_settings;
if (adapter->wol_cap & BE_WOL_CAP)
adapter->wol_en = true;
} }
err: err:
mutex_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
......
...@@ -713,12 +713,13 @@ be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) ...@@ -713,12 +713,13 @@ be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
{ {
struct be_adapter *adapter = netdev_priv(netdev); struct be_adapter *adapter = netdev_priv(netdev);
if (be_is_wol_supported(adapter)) { if (adapter->wol_cap & BE_WOL_CAP) {
wol->supported |= WAKE_MAGIC; wol->supported |= WAKE_MAGIC;
if (adapter->wol) if (adapter->wol_en)
wol->wolopts |= WAKE_MAGIC; wol->wolopts |= WAKE_MAGIC;
} else } else {
wol->wolopts = 0; wol->wolopts = 0;
}
memset(&wol->sopass, 0, sizeof(wol->sopass)); memset(&wol->sopass, 0, sizeof(wol->sopass));
} }
...@@ -730,15 +731,15 @@ be_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) ...@@ -730,15 +731,15 @@ be_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
if (wol->wolopts & ~WAKE_MAGIC) if (wol->wolopts & ~WAKE_MAGIC)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (!be_is_wol_supported(adapter)) { if (!(adapter->wol_cap & BE_WOL_CAP)) {
dev_warn(&adapter->pdev->dev, "WOL not supported\n"); dev_warn(&adapter->pdev->dev, "WOL not supported\n");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
if (wol->wolopts & WAKE_MAGIC) if (wol->wolopts & WAKE_MAGIC)
adapter->wol = true; adapter->wol_en = true;
else else
adapter->wol = false; adapter->wol_en = false;
return 0; return 0;
} }
......
...@@ -3408,6 +3408,8 @@ static int be_setup(struct be_adapter *adapter) ...@@ -3408,6 +3408,8 @@ static int be_setup(struct be_adapter *adapter)
be_set_rx_mode(adapter->netdev); be_set_rx_mode(adapter->netdev);
be_cmd_get_acpi_wol_cap(adapter);
be_cmd_get_flow_control(adapter, &tx_fc, &rx_fc); be_cmd_get_flow_control(adapter, &tx_fc, &rx_fc);
if (rx_fc != adapter->rx_fc || tx_fc != adapter->tx_fc) if (rx_fc != adapter->rx_fc || tx_fc != adapter->tx_fc)
...@@ -4277,12 +4279,6 @@ static void be_remove(struct pci_dev *pdev) ...@@ -4277,12 +4279,6 @@ static void be_remove(struct pci_dev *pdev)
free_netdev(adapter->netdev); free_netdev(adapter->netdev);
} }
bool be_is_wol_supported(struct be_adapter *adapter)
{
return ((adapter->wol_cap & BE_WOL_CAP) &&
!be_is_wol_excluded(adapter)) ? true : false;
}
static int be_get_initial_config(struct be_adapter *adapter) static int be_get_initial_config(struct be_adapter *adapter)
{ {
int status, level; int status, level;
...@@ -4291,17 +4287,6 @@ static int be_get_initial_config(struct be_adapter *adapter) ...@@ -4291,17 +4287,6 @@ static int be_get_initial_config(struct be_adapter *adapter)
if (status) if (status)
return status; return status;
status = be_cmd_get_acpi_wol_cap(adapter);
if (status) {
/* in case of a failure to get wol capabillities
* check the exclusion list to determine WOL capability */
if (!be_is_wol_excluded(adapter))
adapter->wol_cap |= BE_WOL_CAP;
}
if (be_is_wol_supported(adapter))
adapter->wol = true;
/* Must be a power of 2 or else MODULO will BUG_ON */ /* Must be a power of 2 or else MODULO will BUG_ON */
adapter->be_get_temp_freq = 64; adapter->be_get_temp_freq = 64;
...@@ -4572,7 +4557,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -4572,7 +4557,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state)
struct be_adapter *adapter = pci_get_drvdata(pdev); struct be_adapter *adapter = pci_get_drvdata(pdev);
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
if (adapter->wol) if (adapter->wol_en)
be_setup_wol(adapter, true); be_setup_wol(adapter, true);
be_intr_set(adapter, false); be_intr_set(adapter, false);
...@@ -4628,7 +4613,7 @@ static int be_resume(struct pci_dev *pdev) ...@@ -4628,7 +4613,7 @@ static int be_resume(struct pci_dev *pdev)
msecs_to_jiffies(1000)); msecs_to_jiffies(1000));
netif_device_attach(netdev); netif_device_attach(netdev);
if (adapter->wol) if (adapter->wol_en)
be_setup_wol(adapter, false); be_setup_wol(adapter, false);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment