aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuresh Reddy <suresh.reddy@emulex.com>2014-01-15 02:53:40 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-15 18:52:03 -0500
commit76a9e08e33ced4a87277edb63456ce108ad4e712 (patch)
tree44c5077a1731f33ca88ac52d5cd6b99c35c04152
parentb188f0907aa82ca1bee917e4a263c2f29a0895de (diff)
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: Suresh Reddy <suresh.reddy@emulex.com> Signed-off-by: Sathya Perla <sathya.perla@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/emulex/benet/be.h2
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c16
-rw-r--r--drivers/net/ethernet/emulex/benet/be_ethtool.c13
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c23
4 files changed, 19 insertions, 35 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index 7f00baee1bc8..93826ae3da9d 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -492,7 +492,7 @@ struct be_adapter {
492 u16 pvid; 492 u16 pvid;
493 struct phy_info phy; 493 struct phy_info phy;
494 u8 wol_cap; 494 u8 wol_cap;
495 bool wol; 495 bool wol_en;
496 u32 uc_macs; /* Count of secondary UC MAC programmed */ 496 u32 uc_macs; /* Count of secondary UC MAC programmed */
497 u16 asic_rev; 497 u16 asic_rev;
498 u16 qnq_vid; 498 u16 qnq_vid;
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 5635f1ec24e0..48076a6370c3 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -3040,14 +3040,16 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
3040{ 3040{
3041 struct be_mcc_wrb *wrb; 3041 struct be_mcc_wrb *wrb;
3042 struct be_cmd_req_acpi_wol_magic_config_v1 *req; 3042 struct be_cmd_req_acpi_wol_magic_config_v1 *req;
3043 int status; 3043 int status = 0;
3044 int payload_len = sizeof(*req);
3045 struct be_dma_mem cmd; 3044 struct be_dma_mem cmd;
3046 3045
3047 if (!be_cmd_allowed(adapter, OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, 3046 if (!be_cmd_allowed(adapter, OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
3048 CMD_SUBSYSTEM_ETH)) 3047 CMD_SUBSYSTEM_ETH))
3049 return -EPERM; 3048 return -EPERM;
3050 3049
3050 if (be_is_wol_excluded(adapter))
3051 return status;
3052
3051 if (mutex_lock_interruptible(&adapter->mbox_lock)) 3053 if (mutex_lock_interruptible(&adapter->mbox_lock))
3052 return -1; 3054 return -1;
3053 3055
@@ -3072,7 +3074,7 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
3072 3074
3073 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, 3075 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
3074 OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, 3076 OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
3075 payload_len, wrb, &cmd); 3077 sizeof(*req), wrb, &cmd);
3076 3078
3077 req->hdr.version = 1; 3079 req->hdr.version = 1;
3078 req->query_options = BE_GET_WOL_CAP; 3080 req->query_options = BE_GET_WOL_CAP;
@@ -3082,13 +3084,9 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
3082 struct be_cmd_resp_acpi_wol_magic_config_v1 *resp; 3084 struct be_cmd_resp_acpi_wol_magic_config_v1 *resp;
3083 resp = (struct be_cmd_resp_acpi_wol_magic_config_v1 *) cmd.va; 3085 resp = (struct be_cmd_resp_acpi_wol_magic_config_v1 *) cmd.va;
3084 3086
3085 /* the command could succeed misleadingly on old f/w
3086 * which is not aware of the V1 version. fake an error. */
3087 if (resp->hdr.response_length < payload_len) {
3088 status = -1;
3089 goto err;
3090 }
3091 adapter->wol_cap = resp->wol_settings; 3087 adapter->wol_cap = resp->wol_settings;
3088 if (adapter->wol_cap & BE_WOL_CAP)
3089 adapter->wol_en = true;
3092 } 3090 }
3093err: 3091err:
3094 mutex_unlock(&adapter->mbox_lock); 3092 mutex_unlock(&adapter->mbox_lock);
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c
index a7b5aa78ae07..05be0070f55f 100644
--- a/drivers/net/ethernet/emulex/benet/be_ethtool.c
+++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c
@@ -713,12 +713,13 @@ be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
713{ 713{
714 struct be_adapter *adapter = netdev_priv(netdev); 714 struct be_adapter *adapter = netdev_priv(netdev);
715 715
716 if (be_is_wol_supported(adapter)) { 716 if (adapter->wol_cap & BE_WOL_CAP) {
717 wol->supported |= WAKE_MAGIC; 717 wol->supported |= WAKE_MAGIC;
718 if (adapter->wol) 718 if (adapter->wol_en)
719 wol->wolopts |= WAKE_MAGIC; 719 wol->wolopts |= WAKE_MAGIC;
720 } else 720 } else {
721 wol->wolopts = 0; 721 wol->wolopts = 0;
722 }
722 memset(&wol->sopass, 0, sizeof(wol->sopass)); 723 memset(&wol->sopass, 0, sizeof(wol->sopass));
723} 724}
724 725
@@ -730,15 +731,15 @@ be_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
730 if (wol->wolopts & ~WAKE_MAGIC) 731 if (wol->wolopts & ~WAKE_MAGIC)
731 return -EOPNOTSUPP; 732 return -EOPNOTSUPP;
732 733
733 if (!be_is_wol_supported(adapter)) { 734 if (!(adapter->wol_cap & BE_WOL_CAP)) {
734 dev_warn(&adapter->pdev->dev, "WOL not supported\n"); 735 dev_warn(&adapter->pdev->dev, "WOL not supported\n");
735 return -EOPNOTSUPP; 736 return -EOPNOTSUPP;
736 } 737 }
737 738
738 if (wol->wolopts & WAKE_MAGIC) 739 if (wol->wolopts & WAKE_MAGIC)
739 adapter->wol = true; 740 adapter->wol_en = true;
740 else 741 else
741 adapter->wol = false; 742 adapter->wol_en = false;
742 743
743 return 0; 744 return 0;
744} 745}
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 43cb4588b6c8..6d22d6f439e3 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -3408,6 +3408,8 @@ static int be_setup(struct be_adapter *adapter)
3408 3408
3409 be_set_rx_mode(adapter->netdev); 3409 be_set_rx_mode(adapter->netdev);
3410 3410
3411 be_cmd_get_acpi_wol_cap(adapter);
3412
3411 be_cmd_get_flow_control(adapter, &tx_fc, &rx_fc); 3413 be_cmd_get_flow_control(adapter, &tx_fc, &rx_fc);
3412 3414
3413 if (rx_fc != adapter->rx_fc || tx_fc != adapter->tx_fc) 3415 if (rx_fc != adapter->rx_fc || tx_fc != adapter->tx_fc)
@@ -4277,12 +4279,6 @@ static void be_remove(struct pci_dev *pdev)
4277 free_netdev(adapter->netdev); 4279 free_netdev(adapter->netdev);
4278} 4280}
4279 4281
4280bool be_is_wol_supported(struct be_adapter *adapter)
4281{
4282 return ((adapter->wol_cap & BE_WOL_CAP) &&
4283 !be_is_wol_excluded(adapter)) ? true : false;
4284}
4285
4286static int be_get_initial_config(struct be_adapter *adapter) 4282static int be_get_initial_config(struct be_adapter *adapter)
4287{ 4283{
4288 int status, level; 4284 int status, level;
@@ -4291,17 +4287,6 @@ static int be_get_initial_config(struct be_adapter *adapter)
4291 if (status) 4287 if (status)
4292 return status; 4288 return status;
4293 4289
4294 status = be_cmd_get_acpi_wol_cap(adapter);
4295 if (status) {
4296 /* in case of a failure to get wol capabillities
4297 * check the exclusion list to determine WOL capability */
4298 if (!be_is_wol_excluded(adapter))
4299 adapter->wol_cap |= BE_WOL_CAP;
4300 }
4301
4302 if (be_is_wol_supported(adapter))
4303 adapter->wol = true;
4304
4305 /* Must be a power of 2 or else MODULO will BUG_ON */ 4290 /* Must be a power of 2 or else MODULO will BUG_ON */
4306 adapter->be_get_temp_freq = 64; 4291 adapter->be_get_temp_freq = 64;
4307 4292
@@ -4572,7 +4557,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state)
4572 struct be_adapter *adapter = pci_get_drvdata(pdev); 4557 struct be_adapter *adapter = pci_get_drvdata(pdev);
4573 struct net_device *netdev = adapter->netdev; 4558 struct net_device *netdev = adapter->netdev;
4574 4559
4575 if (adapter->wol) 4560 if (adapter->wol_en)
4576 be_setup_wol(adapter, true); 4561 be_setup_wol(adapter, true);
4577 4562
4578 be_intr_set(adapter, false); 4563 be_intr_set(adapter, false);
@@ -4628,7 +4613,7 @@ static int be_resume(struct pci_dev *pdev)
4628 msecs_to_jiffies(1000)); 4613 msecs_to_jiffies(1000));
4629 netif_device_attach(netdev); 4614 netif_device_attach(netdev);
4630 4615
4631 if (adapter->wol) 4616 if (adapter->wol_en)
4632 be_setup_wol(adapter, false); 4617 be_setup_wol(adapter, false);
4633 4618
4634 return 0; 4619 return 0;