diff options
author | Suresh Reddy <suresh.reddy@emulex.com> | 2014-01-15 02:53:40 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-01-15 18:52:03 -0500 |
commit | 76a9e08e33ced4a87277edb63456ce108ad4e712 (patch) | |
tree | 44c5077a1731f33ca88ac52d5cd6b99c35c04152 | |
parent | b188f0907aa82ca1bee917e4a263c2f29a0895de (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.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 16 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_ethtool.c | 13 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 23 |
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 | } |
3093 | err: | 3091 | err: |
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 | ||
4280 | bool 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 | |||
4286 | static int be_get_initial_config(struct be_adapter *adapter) | 4282 | static 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; |