* [PATCH net-next 0/9] be2net: patch set
@ 2015-07-10 9:32 Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 1/9] be2net: remove duplicate code in be_setup_wol() Sathya Perla
` (9 more replies)
0 siblings, 10 replies; 11+ messages in thread
From: Sathya Perla @ 2015-07-10 9:32 UTC (permalink / raw)
To: netdev
Hi David, the following patch set has code cleanup patches, minor enhancements
and non-critical fixes. Pls consider applying to the net-next tree. Thanks!
Patch 1 removes duplicate code in be_setup_wol() routine making it simpler
and more readable.
Patch 2 fixes the the bridge mode return value for the ndo_bridge_getlink()
call. Instead of just relying on the SRIOV enabled state, the driver now
queries the FW, for the actual mode of bridge.
Patch 3 removes code for setting D0 power state as it's already done
in pci_enable_device()
Patch 4 fixes a bad return value in be_check_ufi_compatibility() routine
introduced by an earlier commit.
Patch 5 fixes a field in udp header being accessed while in network endian
format.
Patch 6 fixes the be_mcc_notify() routine to return an error status when
the FW/HW is in an error state.
Patch 7 fixes the be_cmd_rx_filter() routine to issue the RX_FILTER cmd
and not wait for a completion from the FW. If the FW/adapter
is in an error state, this change helps in not holding up the rtnl_lock
and keeping bottom halves disabled while the driver timesout waiting for
a response from the FW.
Patch 8 fixes the be_cmd_set_loopback() routine to issue the LOOPBACK cmd
and not wait for the FW completion while spin_lock_bh() is held on the
mcc_lock. As the cmd is always issued from ethtool in a process context,
it can sleep till the FW completion is received.
Patch 9 bumps up the driver version to 10.6.0.3
Kalesh Purayil (3):
be2net: remove duplicate code in be_setup_wol()
be2net: query FW to check if EVB is enabled
be2net: remove redundant D0 power state set
Sathya Perla (1):
be2net: bump up the driver version to 10.6.0.3
Suresh Reddy (3):
be2net: return error status from be_mcc_notify()
be2net: make the RX_FILTER command asynchronous
be2net: make SET_LOOPBACK_MODE cmd asynchrounous
Vasundhara Volam (1):
be2net: fix wrong return value in be_check_ufi_compatibility()
Venkat Duvvuru (1):
be2net: convert dest field in udp-hdr to host-endian
drivers/net/ethernet/emulex/benet/be.h | 2 +-
drivers/net/ethernet/emulex/benet/be_cmds.c | 64 ++++++++++++++++++++------
drivers/net/ethernet/emulex/benet/be_cmds.h | 3 ++
drivers/net/ethernet/emulex/benet/be_ethtool.c | 15 +++++-
drivers/net/ethernet/emulex/benet/be_main.c | 40 +++++++---------
5 files changed, 82 insertions(+), 42 deletions(-)
--
2.4.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH net-next 1/9] be2net: remove duplicate code in be_setup_wol()
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
@ 2015-07-10 9:32 ` Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 2/9] be2net: query FW to check if EVB is enabled Sathya Perla
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sathya Perla @ 2015-07-10 9:32 UTC (permalink / raw)
To: netdev
From: Kalesh Purayil <kalesh.purayil@avagotech.com>
This change will make be_setup_wol() routine more compact and readable
by removing some duplicate code.
Signed-off-by: Kalesh AP <kalesh.purayil@avagotech.com>
Signed-off-by: Sathya Perla <sathya.perla@avagotech.com>
---
drivers/net/ethernet/emulex/benet/be_main.c | 28 +++++++++++-----------------
1 file changed, 11 insertions(+), 17 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 6f64242..635c62f 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -3529,15 +3529,15 @@ err:
static int be_setup_wol(struct be_adapter *adapter, bool enable)
{
+ struct device *dev = &adapter->pdev->dev;
struct be_dma_mem cmd;
- int status = 0;
u8 mac[ETH_ALEN];
+ int status;
eth_zero_addr(mac);
cmd.size = sizeof(struct be_cmd_req_acpi_wol_magic_config);
- cmd.va = dma_zalloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma,
- GFP_KERNEL);
+ cmd.va = dma_zalloc_coherent(dev, cmd.size, &cmd.dma, GFP_KERNEL);
if (!cmd.va)
return -ENOMEM;
@@ -3546,24 +3546,18 @@ static int be_setup_wol(struct be_adapter *adapter, bool enable)
PCICFG_PM_CONTROL_OFFSET,
PCICFG_PM_CONTROL_MASK);
if (status) {
- dev_err(&adapter->pdev->dev,
- "Could not enable Wake-on-lan\n");
- dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va,
- cmd.dma);
- return status;
+ dev_err(dev, "Could not enable Wake-on-lan\n");
+ goto err;
}
- status = be_cmd_enable_magic_wol(adapter,
- adapter->netdev->dev_addr,
- &cmd);
- pci_enable_wake(adapter->pdev, PCI_D3hot, 1);
- pci_enable_wake(adapter->pdev, PCI_D3cold, 1);
} else {
- status = be_cmd_enable_magic_wol(adapter, mac, &cmd);
- pci_enable_wake(adapter->pdev, PCI_D3hot, 0);
- pci_enable_wake(adapter->pdev, PCI_D3cold, 0);
+ ether_addr_copy(mac, adapter->netdev->dev_addr);
}
- dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
+ status = be_cmd_enable_magic_wol(adapter, mac, &cmd);
+ pci_enable_wake(adapter->pdev, PCI_D3hot, enable);
+ pci_enable_wake(adapter->pdev, PCI_D3cold, enable);
+err:
+ dma_free_coherent(dev, cmd.size, cmd.va, cmd.dma);
return status;
}
--
2.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next 2/9] be2net: query FW to check if EVB is enabled
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 1/9] be2net: remove duplicate code in be_setup_wol() Sathya Perla
@ 2015-07-10 9:32 ` Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 3/9] be2net: remove redundant D0 power state set Sathya Perla
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sathya Perla @ 2015-07-10 9:32 UTC (permalink / raw)
To: netdev
From: Kalesh Purayil <kalesh.purayil@avagotech.com>
The current code assumes that bridge functionality (EVB) in the adapter
is enabled only when SR-IOV is enabled. This is not always true.
This patch uses the GET_HSW_CONFIG FW cmd to query this from the FW.
Signed-off-by: Kalesh AP <kalesh.purayil@avagotech.com>
Signed-off-by: Sathya Perla <sathya.perla@avagotech.com>
---
drivers/net/ethernet/emulex/benet/be_cmds.h | 1 +
drivers/net/ethernet/emulex/benet/be_main.c | 6 +++---
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index 2716e6f..f0a92b7 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -1758,6 +1758,7 @@ struct be_cmd_req_set_mac_list {
/*********************** HSW Config ***********************/
#define PORT_FWD_TYPE_VEPA 0x3
#define PORT_FWD_TYPE_VEB 0x2
+#define PORT_FWD_TYPE_PASSTHRU 0x1
#define ENABLE_MAC_SPOOFCHK 0x2
#define DISABLE_MAC_SPOOFCHK 0x3
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 635c62f..f21c56a 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -5073,9 +5073,6 @@ static int be_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
int status = 0;
u8 hsw_mode;
- if (!sriov_enabled(adapter))
- return 0;
-
/* BE and Lancer chips support VEB mode only */
if (BEx_chip(adapter) || lancer_chip(adapter)) {
hsw_mode = PORT_FWD_TYPE_VEB;
@@ -5085,6 +5082,9 @@ static int be_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
NULL);
if (status)
return 0;
+
+ if (hsw_mode == PORT_FWD_TYPE_PASSTHRU)
+ return 0;
}
return ndo_dflt_bridge_getlink(skb, pid, seq, dev,
--
2.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next 3/9] be2net: remove redundant D0 power state set
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 1/9] be2net: remove duplicate code in be_setup_wol() Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 2/9] be2net: query FW to check if EVB is enabled Sathya Perla
@ 2015-07-10 9:32 ` Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 4/9] be2net: fix wrong return value in be_check_ufi_compatibility() Sathya Perla
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sathya Perla @ 2015-07-10 9:32 UTC (permalink / raw)
To: netdev
From: Kalesh Purayil <kalesh.purayil@avagotech.com>
pci_enable_device() call sets device power state to D0; there is no need
doing it again.
Signed-off-by: Kalesh AP <kalesh.purayil@avagotech.com>
Signed-off-by: Sathya Perla <sathya.perla@avagotech.com>
---
drivers/net/ethernet/emulex/benet/be_main.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index f21c56a..8b81e23 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -5807,7 +5807,6 @@ static int be_pci_resume(struct pci_dev *pdev)
if (status)
return status;
- pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev);
status = be_resume(adapter);
@@ -5887,7 +5886,6 @@ static pci_ers_result_t be_eeh_reset(struct pci_dev *pdev)
return PCI_ERS_RESULT_DISCONNECT;
pci_set_master(pdev);
- pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev);
/* Check if card is ok and fw is ready */
--
2.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next 4/9] be2net: fix wrong return value in be_check_ufi_compatibility()
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
` (2 preceding siblings ...)
2015-07-10 9:32 ` [PATCH net-next 3/9] be2net: remove redundant D0 power state set Sathya Perla
@ 2015-07-10 9:32 ` Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 5/9] be2net: convert dest field in udp-hdr to host-endian Sathya Perla
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sathya Perla @ 2015-07-10 9:32 UTC (permalink / raw)
To: netdev
From: Vasundhara Volam <vasundhara.volam@avagotech.com>
In the commit a6e6ff6eee12f3e
("be2net: simplify UFI compatibility checking"), a return value of "-1"
was incorrectly used in place of "false". This patch fixes it.
Fixes: a6e6ff6eee12f3e ("be2net: simplify UFI compatibility checking")
Signed-off-by: Vasundhara Volam <vasundhara.volam@avagotech.com>
Signed-off-by: Sathya Perla <sathya.perla@avagotech.com>
---
drivers/net/ethernet/emulex/benet/be_main.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 8b81e23..8ef7ea5 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -4918,7 +4918,7 @@ static bool be_check_ufi_compatibility(struct be_adapter *adapter,
{
if (!fhdr) {
dev_err(&adapter->pdev->dev, "Invalid FW UFI file");
- return -1;
+ return false;
}
/* First letter of the build version is used to identify
--
2.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next 5/9] be2net: convert dest field in udp-hdr to host-endian
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
` (3 preceding siblings ...)
2015-07-10 9:32 ` [PATCH net-next 4/9] be2net: fix wrong return value in be_check_ufi_compatibility() Sathya Perla
@ 2015-07-10 9:32 ` Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 6/9] be2net: return error status from be_mcc_notify() Sathya Perla
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sathya Perla @ 2015-07-10 9:32 UTC (permalink / raw)
To: netdev
From: Venkat Duvvuru <VenkatKumar.Duvvuru@Emulex.com>
The "dest" field in the UDP-hdr of a TX skb is in network endian format.
Convert it to host endian before accessing it. The os2bmc patch,
mentioned below introduced this code.
Fixes: 760c295e0e8d ("be2net: Support for OS2BMC")
Signed-off-by: Venkat Duvvuru <VenkatKumar.Duvvuru@Emulex.com>
Signed-off-by: Sathya Perla <sathya.perla@avagotech.com>
---
drivers/net/ethernet/emulex/benet/be_main.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 8ef7ea5..c996dd7 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -1254,7 +1254,7 @@ static bool be_send_pkt_to_bmc(struct be_adapter *adapter,
if (is_udp_pkt((*skb))) {
struct udphdr *udp = udp_hdr((*skb));
- switch (udp->dest) {
+ switch (ntohs(udp->dest)) {
case DHCP_CLIENT_PORT:
os2bmc = is_dhcp_client_filt_enabled(adapter);
goto done;
--
2.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next 6/9] be2net: return error status from be_mcc_notify()
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
` (4 preceding siblings ...)
2015-07-10 9:32 ` [PATCH net-next 5/9] be2net: convert dest field in udp-hdr to host-endian Sathya Perla
@ 2015-07-10 9:32 ` Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 7/9] be2net: make the RX_FILTER command asynchronous Sathya Perla
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sathya Perla @ 2015-07-10 9:32 UTC (permalink / raw)
To: netdev
From: Suresh Reddy <Suresh.Reddy@emulex.com>
When the adapter is in error state, return error from be_mcc_notify()
so that the caller routines need not sleep waiting for a response.
Signed-off-by: Suresh Reddy <suresh.reddy@avagotech.com>
Signed-off-by: Sathya Perla <sathya.perla@avagotech.com>
---
drivers/net/ethernet/emulex/benet/be_cmds.c | 39 +++++++++++++++++++++--------
1 file changed, 28 insertions(+), 11 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 9eac322..a299f7b 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -88,19 +88,21 @@ static inline void *embedded_payload(struct be_mcc_wrb *wrb)
return wrb->payload.embedded_payload;
}
-static void be_mcc_notify(struct be_adapter *adapter)
+static int be_mcc_notify(struct be_adapter *adapter)
{
struct be_queue_info *mccq = &adapter->mcc_obj.q;
u32 val = 0;
if (be_check_error(adapter, BE_ERROR_ANY))
- return;
+ return -EIO;
val |= mccq->id & DB_MCCQ_RING_ID_MASK;
val |= 1 << DB_MCCQ_NUM_POSTED_SHIFT;
wmb();
iowrite32(val, adapter->db + DB_MCCQ_OFFSET);
+
+ return 0;
}
/* To check if valid bit is set, check the entire word as we don't know
@@ -541,7 +543,9 @@ static int be_mcc_notify_wait(struct be_adapter *adapter)
resp = be_decode_resp_hdr(wrb->tag0, wrb->tag1);
- be_mcc_notify(adapter);
+ status = be_mcc_notify(adapter);
+ if (status)
+ goto out;
status = be_mcc_wait_compl(adapter);
if (status == -EIO)
@@ -1547,7 +1551,10 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
else
hdr->version = 2;
- be_mcc_notify(adapter);
+ status = be_mcc_notify(adapter);
+ if (status)
+ goto err;
+
adapter->stats_cmd_sent = true;
err:
@@ -1583,7 +1590,10 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
req->cmd_params.params.pport_num = cpu_to_le16(adapter->hba_port_num);
req->cmd_params.params.reset_stats = 0;
- be_mcc_notify(adapter);
+ status = be_mcc_notify(adapter);
+ if (status)
+ goto err;
+
adapter->stats_cmd_sent = true;
err:
@@ -1687,8 +1697,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES,
sizeof(*req), wrb, NULL);
- be_mcc_notify(adapter);
-
+ status = be_mcc_notify(adapter);
err:
spin_unlock_bh(&adapter->mcc_lock);
return status;
@@ -1860,7 +1869,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter,
cpu_to_le32(set_eqd[i].delay_multiplier);
}
- be_mcc_notify(adapter);
+ status = be_mcc_notify(adapter);
err:
spin_unlock_bh(&adapter->mcc_lock);
return status;
@@ -2320,7 +2329,10 @@ int lancer_cmd_write_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
req->addr_high = cpu_to_le32(upper_32_bits(cmd->dma +
sizeof(struct lancer_cmd_req_write_object)));
- be_mcc_notify(adapter);
+ status = be_mcc_notify(adapter);
+ if (status)
+ goto err_unlock;
+
spin_unlock_bh(&adapter->mcc_lock);
if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
@@ -2491,7 +2503,10 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
req->params.op_code = cpu_to_le32(flash_opcode);
req->params.data_buf_size = cpu_to_le32(buf_size);
- be_mcc_notify(adapter);
+ status = be_mcc_notify(adapter);
+ if (status)
+ goto err_unlock;
+
spin_unlock_bh(&adapter->mcc_lock);
if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
@@ -2636,7 +2651,9 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
req->num_pkts = cpu_to_le32(num_pkts);
req->loopback_type = cpu_to_le32(loopback_type);
- be_mcc_notify(adapter);
+ status = be_mcc_notify(adapter);
+ if (status)
+ goto err;
spin_unlock_bh(&adapter->mcc_lock);
--
2.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next 7/9] be2net: make the RX_FILTER command asynchronous
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
` (5 preceding siblings ...)
2015-07-10 9:32 ` [PATCH net-next 6/9] be2net: return error status from be_mcc_notify() Sathya Perla
@ 2015-07-10 9:32 ` Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 8/9] be2net: make SET_LOOPBACK_MODE cmd asynchrounous Sathya Perla
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sathya Perla @ 2015-07-10 9:32 UTC (permalink / raw)
To: netdev
From: Suresh Reddy <suresh.reddy@avagotech.com>
This fix makes the RX_FILTER cmd asynchronous, i.e., the caller issues
this cmd and doesn't wait for a completion from the FW. If the FW/adapter
is in an error state, this change helps in not holding up the rtnl_lock
and keeping bottom halves disabled while the driver timesout waiting for
a response from the FW.
Signed-off-by: Suresh Reddy <suresh.reddy@avagotech.com>
Signed-off-by: Sathya Perla <sathya.perla@avagotech.com>
---
drivers/net/ethernet/emulex/benet/be_cmds.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index a299f7b..93934d3 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -1962,7 +1962,7 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
memcpy(req->mcast_mac[i++].byte, ha->addr, ETH_ALEN);
}
- status = be_mcc_notify_wait(adapter);
+ status = be_mcc_notify(adapter);
err:
spin_unlock_bh(&adapter->mcc_lock);
return status;
--
2.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next 8/9] be2net: make SET_LOOPBACK_MODE cmd asynchrounous
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
` (6 preceding siblings ...)
2015-07-10 9:32 ` [PATCH net-next 7/9] be2net: make the RX_FILTER command asynchronous Sathya Perla
@ 2015-07-10 9:32 ` Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 9/9] be2net: bump up the driver version to 10.6.0.3 Sathya Perla
2015-07-11 6:24 ` [PATCH net-next 0/9] be2net: patch set David Miller
9 siblings, 0 replies; 11+ messages in thread
From: Sathya Perla @ 2015-07-10 9:32 UTC (permalink / raw)
To: netdev
From: Suresh Reddy <Suresh.Reddy@emulex.com>
The SET_LOOPBACK_MODE command is always issued from ethtool only in a
process context. So, while waiting for the cmd to complete, the driver
can sleep instead of holding spin_lock_bh() on the mcc_lock. This is done
by calling be_mcc_notify() instead of be_mcc_notify_wait() (that returns
only after the cmd completes while the MCCQ is locked).
Signed-off-by: Suresh Reddy <suresh.reddy@avagotech.com>
Signed-off-by: Sathya Perla <sathya.perla@avagotech.com>
---
drivers/net/ethernet/emulex/benet/be_cmds.c | 23 ++++++++++++++++++++---
drivers/net/ethernet/emulex/benet/be_cmds.h | 2 ++
drivers/net/ethernet/emulex/benet/be_ethtool.c | 15 +++++++++++++--
3 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 93934d3..ecad46f 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -172,6 +172,12 @@ static void be_async_cmd_process(struct be_adapter *adapter,
return;
}
+ if (opcode == OPCODE_LOWLEVEL_SET_LOOPBACK_MODE &&
+ subsystem == CMD_SUBSYSTEM_LOWLEVEL) {
+ complete(&adapter->et_cmd_compl);
+ return;
+ }
+
if ((opcode == OPCODE_COMMON_WRITE_FLASHROM ||
opcode == OPCODE_COMMON_WRITE_OBJECT) &&
subsystem == CMD_SUBSYSTEM_COMMON) {
@@ -2600,7 +2606,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
wrb = wrb_from_mccq(adapter);
if (!wrb) {
status = -EBUSY;
- goto err;
+ goto err_unlock;
}
req = embedded_payload(wrb);
@@ -2614,8 +2620,19 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
req->loopback_type = loopback_type;
req->loopback_state = enable;
- status = be_mcc_notify_wait(adapter);
-err:
+ status = be_mcc_notify(adapter);
+ if (status)
+ goto err_unlock;
+
+ spin_unlock_bh(&adapter->mcc_lock);
+
+ if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
+ msecs_to_jiffies(SET_LB_MODE_TIMEOUT)))
+ status = -ETIMEDOUT;
+
+ return status;
+
+err_unlock:
spin_unlock_bh(&adapter->mcc_lock);
return status;
}
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index f0a92b7..a4479f7 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -1495,6 +1495,8 @@ struct be_cmd_resp_acpi_wol_magic_config_v1 {
#define BE_PME_D3COLD_CAP 0x80
/********************** LoopBack test *********************/
+#define SET_LB_MODE_TIMEOUT 12000
+
struct be_cmd_req_loopback_test {
struct be_cmd_req_hdr hdr;
u32 loopback_type;
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c
index b2476db..d20ff05 100644
--- a/drivers/net/ethernet/emulex/benet/be_ethtool.c
+++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c
@@ -847,10 +847,21 @@ err:
static u64 be_loopback_test(struct be_adapter *adapter, u8 loopback_type,
u64 *status)
{
- be_cmd_set_loopback(adapter, adapter->hba_port_num, loopback_type, 1);
+ int ret;
+
+ ret = be_cmd_set_loopback(adapter, adapter->hba_port_num,
+ loopback_type, 1);
+ if (ret)
+ return ret;
+
*status = be_cmd_loopback_test(adapter, adapter->hba_port_num,
loopback_type, 1500, 2, 0xabc);
- be_cmd_set_loopback(adapter, adapter->hba_port_num, BE_NO_LOOPBACK, 1);
+
+ ret = be_cmd_set_loopback(adapter, adapter->hba_port_num,
+ BE_NO_LOOPBACK, 1);
+ if (ret)
+ return ret;
+
return *status;
}
--
2.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next 9/9] be2net: bump up the driver version to 10.6.0.3
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
` (7 preceding siblings ...)
2015-07-10 9:32 ` [PATCH net-next 8/9] be2net: make SET_LOOPBACK_MODE cmd asynchrounous Sathya Perla
@ 2015-07-10 9:32 ` Sathya Perla
2015-07-11 6:24 ` [PATCH net-next 0/9] be2net: patch set David Miller
9 siblings, 0 replies; 11+ messages in thread
From: Sathya Perla @ 2015-07-10 9:32 UTC (permalink / raw)
To: netdev
Signed-off-by: Sathya Perla <sathya.perla@avagotech.com>
---
drivers/net/ethernet/emulex/benet/be.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index 8d12b41..cb5777b 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -37,7 +37,7 @@
#include "be_hw.h"
#include "be_roce.h"
-#define DRV_VER "10.6.0.2"
+#define DRV_VER "10.6.0.3"
#define DRV_NAME "be2net"
#define BE_NAME "Emulex BladeEngine2"
#define BE3_NAME "Emulex BladeEngine3"
--
2.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH net-next 0/9] be2net: patch set
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
` (8 preceding siblings ...)
2015-07-10 9:32 ` [PATCH net-next 9/9] be2net: bump up the driver version to 10.6.0.3 Sathya Perla
@ 2015-07-11 6:24 ` David Miller
9 siblings, 0 replies; 11+ messages in thread
From: David Miller @ 2015-07-11 6:24 UTC (permalink / raw)
To: sathya.perla; +Cc: netdev
From: Sathya Perla <sathya.perla@avagotech.com>
Date: Fri, 10 Jul 2015 05:32:42 -0400
> Hi David, the following patch set has code cleanup patches, minor enhancements
> and non-critical fixes. Pls consider applying to the net-next tree. Thanks!
Series applied, thanks.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-07-11 6:24 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-10 9:32 [PATCH net-next 0/9] be2net: patch set Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 1/9] be2net: remove duplicate code in be_setup_wol() Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 2/9] be2net: query FW to check if EVB is enabled Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 3/9] be2net: remove redundant D0 power state set Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 4/9] be2net: fix wrong return value in be_check_ufi_compatibility() Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 5/9] be2net: convert dest field in udp-hdr to host-endian Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 6/9] be2net: return error status from be_mcc_notify() Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 7/9] be2net: make the RX_FILTER command asynchronous Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 8/9] be2net: make SET_LOOPBACK_MODE cmd asynchrounous Sathya Perla
2015-07-10 9:32 ` [PATCH net-next 9/9] be2net: bump up the driver version to 10.6.0.3 Sathya Perla
2015-07-11 6:24 ` [PATCH net-next 0/9] be2net: patch set David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).