* [PATCH net-next 1/8] be2net: return error status from be_set_phys_id()
2016-02-02 10:20 [PATCH net-next 0/8] be2net patch-set Sriharsha Basavapatna
@ 2016-02-02 10:20 ` Sriharsha Basavapatna
2016-02-02 10:20 ` [PATCH net-next 2/8] be2net: check for INSUFFICIENT_PRIVILEGES error Sriharsha Basavapatna
` (6 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Sriharsha Basavapatna @ 2016-02-02 10:20 UTC (permalink / raw)
To: netdev
From: Suresh Reddy <suresh.reddy@broadcom.com>
be_set_phys_id() returns 0 to ethtool when the command fails in the FW.
This patch fixes the set_phys_id() to return -EIO in case the FW cmd fails.
Signed-off-by: Suresh Reddy <suresh.reddy@broadcom.com>
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
---
drivers/net/ethernet/emulex/benet/be_ethtool.c | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c
index a19ac44..2ff6916 100644
--- a/drivers/net/ethernet/emulex/benet/be_ethtool.c
+++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c
@@ -720,29 +720,32 @@ static int be_set_phys_id(struct net_device *netdev,
enum ethtool_phys_id_state state)
{
struct be_adapter *adapter = netdev_priv(netdev);
+ int status = 0;
switch (state) {
case ETHTOOL_ID_ACTIVE:
- be_cmd_get_beacon_state(adapter, adapter->hba_port_num,
- &adapter->beacon_state);
- return 1; /* cycle on/off once per second */
+ status = be_cmd_get_beacon_state(adapter, adapter->hba_port_num,
+ &adapter->beacon_state);
+ if (status)
+ return be_cmd_status(status);
+ return 1; /* cycle on/off once per second */
case ETHTOOL_ID_ON:
- be_cmd_set_beacon_state(adapter, adapter->hba_port_num, 0, 0,
- BEACON_STATE_ENABLED);
+ status = be_cmd_set_beacon_state(adapter, adapter->hba_port_num,
+ 0, 0, BEACON_STATE_ENABLED);
break;
case ETHTOOL_ID_OFF:
- be_cmd_set_beacon_state(adapter, adapter->hba_port_num, 0, 0,
- BEACON_STATE_DISABLED);
+ status = be_cmd_set_beacon_state(adapter, adapter->hba_port_num,
+ 0, 0, BEACON_STATE_DISABLED);
break;
case ETHTOOL_ID_INACTIVE:
- be_cmd_set_beacon_state(adapter, adapter->hba_port_num, 0, 0,
- adapter->beacon_state);
+ status = be_cmd_set_beacon_state(adapter, adapter->hba_port_num,
+ 0, 0, adapter->beacon_state);
}
- return 0;
+ return be_cmd_status(status);
}
static int be_set_dump(struct net_device *netdev, struct ethtool_dump *dump)
--
2.3.0.rc2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 2/8] be2net: check for INSUFFICIENT_PRIVILEGES error
2016-02-02 10:20 [PATCH net-next 0/8] be2net patch-set Sriharsha Basavapatna
2016-02-02 10:20 ` [PATCH net-next 1/8] be2net: return error status from be_set_phys_id() Sriharsha Basavapatna
@ 2016-02-02 10:20 ` Sriharsha Basavapatna
2016-02-02 10:20 ` [PATCH net-next 3/8] be2net: Fix be_vlan_rem_vid() to check vlan id being removed Sriharsha Basavapatna
` (5 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Sriharsha Basavapatna @ 2016-02-02 10:20 UTC (permalink / raw)
To: netdev
From: Suresh Reddy <suresh.reddy@broadcom.com>
The driver currently logs the message "VF is not privileged to issue
opcode" by checking only the base_status field for UNAUTHORIZED_REQUEST.
Add check to look for INSUFFICIENT_PRIVILEGES in the additional status
field also as not all cmds fail with that base status.
Signed-off-by: Suresh Reddy <suresh.reddy@broadcom.com>
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
---
drivers/net/ethernet/emulex/benet/be_cmds.c | 3 ++-
drivers/net/ethernet/emulex/benet/be_cmds.h | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index b63d8ad..3b665f1 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -236,7 +236,8 @@ static int be_mcc_compl_process(struct be_adapter *adapter,
if (base_status != MCC_STATUS_SUCCESS &&
!be_skip_err_log(opcode, base_status, addl_status)) {
- if (base_status == MCC_STATUS_UNAUTHORIZED_REQUEST) {
+ if (base_status == MCC_STATUS_UNAUTHORIZED_REQUEST ||
+ addl_status == MCC_ADDL_STATUS_INSUFFICIENT_PRIVILEGES) {
dev_warn(&adapter->pdev->dev,
"VF is not privileged to issue opcode %d-%d\n",
opcode, subsystem);
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index 241819b..f260ef3 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -68,7 +68,8 @@ enum mcc_addl_status {
MCC_ADDL_STATUS_TOO_MANY_INTERFACES = 0x4a,
MCC_ADDL_STATUS_INSUFFICIENT_VLANS = 0xab,
MCC_ADDL_STATUS_INVALID_SIGNATURE = 0x56,
- MCC_ADDL_STATUS_MISSING_SIGNATURE = 0x57
+ MCC_ADDL_STATUS_MISSING_SIGNATURE = 0x57,
+ MCC_ADDL_STATUS_INSUFFICIENT_PRIVILEGES = 0x60
};
#define CQE_BASE_STATUS_MASK 0xFFFF
--
2.3.0.rc2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 3/8] be2net: Fix be_vlan_rem_vid() to check vlan id being removed
2016-02-02 10:20 [PATCH net-next 0/8] be2net patch-set Sriharsha Basavapatna
2016-02-02 10:20 ` [PATCH net-next 1/8] be2net: return error status from be_set_phys_id() Sriharsha Basavapatna
2016-02-02 10:20 ` [PATCH net-next 2/8] be2net: check for INSUFFICIENT_PRIVILEGES error Sriharsha Basavapatna
@ 2016-02-02 10:20 ` Sriharsha Basavapatna
2016-02-02 10:20 ` [PATCH net-next 4/8] be2net: SRIOV Queue distribution should factor in EQ-count of VFs Sriharsha Basavapatna
` (4 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Sriharsha Basavapatna @ 2016-02-02 10:20 UTC (permalink / raw)
To: netdev
The driver decrements its vlan count without checking if it is really
present in its list. This results in an invalid vlan count and impacts
subsequent vlan add/rem ops. The function be_vlan_rem_vid() should be
updated to fix this.
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
---
drivers/net/ethernet/emulex/benet/be_main.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index f99de36..09e6f2c 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -1463,6 +1463,9 @@ static int be_vlan_rem_vid(struct net_device *netdev, __be16 proto, u16 vid)
if (lancer_chip(adapter) && vid == 0)
return 0;
+ if (!test_bit(vid, adapter->vids))
+ return 0;
+
clear_bit(vid, adapter->vids);
adapter->vlans_added--;
--
2.3.0.rc2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 4/8] be2net: SRIOV Queue distribution should factor in EQ-count of VFs
2016-02-02 10:20 [PATCH net-next 0/8] be2net patch-set Sriharsha Basavapatna
` (2 preceding siblings ...)
2016-02-02 10:20 ` [PATCH net-next 3/8] be2net: Fix be_vlan_rem_vid() to check vlan id being removed Sriharsha Basavapatna
@ 2016-02-02 10:20 ` Sriharsha Basavapatna
2016-02-02 14:30 ` Sergei Shtylyov
2016-02-02 10:20 ` [PATCH net-next 5/8] be2net: Don't run ethtool self-tests for VFs Sriharsha Basavapatna
` (3 subsequent siblings)
7 siblings, 1 reply; 12+ messages in thread
From: Sriharsha Basavapatna @ 2016-02-02 10:20 UTC (permalink / raw)
To: netdev
The SRIOV resource distribution logic for RX/TX queue counts is not optimal
when a small number of VFs are enabled. It does not take into account the
VF's EQ count while computing the queue counts. Because of this, the VF
gets a large number of queues, though it doesn't have sufficient EQs,
resulting in wasted queue resources. And the PF gets a smaller share of
queues though it has more EQs. Fix this by capping the VF queue count at
its EQ count.
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
---
drivers/net/ethernet/emulex/benet/be.h | 4 ++++
drivers/net/ethernet/emulex/benet/be_main.c | 15 ++++++---------
2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index cf83783..f33d73c 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -89,6 +89,10 @@
#define BE3_MAX_TX_QS 16
#define BE3_MAX_EVT_QS 16
#define BE3_SRIOV_MAX_EVT_QS 8
+#define SH_VF_MAX_NIC_EQS 3 /* Skyhawk VFs can have a max of 4 EQs
+ * and at least 1 is granted to either
+ * SURF/DPDK
+ */
#define MAX_RSS_IFACES 15
#define MAX_RX_QS 32
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 09e6f2c..62f6fbb 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -3792,18 +3792,15 @@ static u16 be_calculate_vf_qs(struct be_adapter *adapter, u16 num_vfs)
struct be_resources res = adapter->pool_res;
u16 num_vf_qs = 1;
- /* Distribute the queue resources equally among the PF and it's VFs
+ /* Distribute the queue resources among the PF and it's VFs
* Do not distribute queue resources in multi-channel configuration.
*/
if (num_vfs && !be_is_mc(adapter)) {
- /* If number of VFs requested is 8 less than max supported,
- * assign 8 queue pairs to the PF and divide the remaining
- * resources evenly among the VFs
- */
- if (num_vfs < (be_max_vfs(adapter) - 8))
- num_vf_qs = (res.max_rss_qs - 8) / num_vfs;
- else
- num_vf_qs = res.max_rss_qs / num_vfs;
+ /* Divide the qpairs evenly among the VFs and the PF, capped
+ * at VF-EQ-count. Any remainder qpairs belong to the PF.
+ */
+ num_vf_qs = min(SH_VF_MAX_NIC_EQS,
+ res.max_rss_qs / (num_vfs + 1));
/* Skyhawk-R chip supports only MAX_RSS_IFACES RSS capable
* interfaces per port. Provide RSS on VFs, only if number
--
2.3.0.rc2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH net-next 4/8] be2net: SRIOV Queue distribution should factor in EQ-count of VFs
2016-02-02 10:20 ` [PATCH net-next 4/8] be2net: SRIOV Queue distribution should factor in EQ-count of VFs Sriharsha Basavapatna
@ 2016-02-02 14:30 ` Sergei Shtylyov
2016-02-02 15:41 ` Sriharsha Basavapatna
0 siblings, 1 reply; 12+ messages in thread
From: Sergei Shtylyov @ 2016-02-02 14:30 UTC (permalink / raw)
To: Sriharsha Basavapatna, netdev
Hello.
On 2/2/2016 1:20 PM, Sriharsha Basavapatna wrote:
> The SRIOV resource distribution logic for RX/TX queue counts is not optimal
> when a small number of VFs are enabled. It does not take into account the
> VF's EQ count while computing the queue counts. Because of this, the VF
> gets a large number of queues, though it doesn't have sufficient EQs,
> resulting in wasted queue resources. And the PF gets a smaller share of
> queues though it has more EQs. Fix this by capping the VF queue count at
> its EQ count.
>
> Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
> ---
> drivers/net/ethernet/emulex/benet/be.h | 4 ++++
> drivers/net/ethernet/emulex/benet/be_main.c | 15 ++++++---------
> 2 files changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
> index cf83783..f33d73c 100644
> --- a/drivers/net/ethernet/emulex/benet/be.h
> +++ b/drivers/net/ethernet/emulex/benet/be.h
> @@ -89,6 +89,10 @@
> #define BE3_MAX_TX_QS 16
> #define BE3_MAX_EVT_QS 16
> #define BE3_SRIOV_MAX_EVT_QS 8
> +#define SH_VF_MAX_NIC_EQS 3 /* Skyhawk VFs can have a max of 4 EQs
Other #define's seem to have a space after them, not tab...
> + * and at least 1 is granted to either
> + * SURF/DPDK
> + */
>
> #define MAX_RSS_IFACES 15
> #define MAX_RX_QS 32
[...]
MBR, Sergei
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH net-next 4/8] be2net: SRIOV Queue distribution should factor in EQ-count of VFs
2016-02-02 14:30 ` Sergei Shtylyov
@ 2016-02-02 15:41 ` Sriharsha Basavapatna
2016-02-02 16:41 ` Sergei Shtylyov
0 siblings, 1 reply; 12+ messages in thread
From: Sriharsha Basavapatna @ 2016-02-02 15:41 UTC (permalink / raw)
To: Sergei Shtylyov; +Cc: netdev
On Tue, Feb 2, 2016 at 8:00 PM, Sergei Shtylyov
<sergei.shtylyov@cogentembedded.com> wrote:
> Hello.
>
> On 2/2/2016 1:20 PM, Sriharsha Basavapatna wrote:
>
>> The SRIOV resource distribution logic for RX/TX queue counts is not
>> optimal
>> when a small number of VFs are enabled. It does not take into account the
>> VF's EQ count while computing the queue counts. Because of this, the VF
>> gets a large number of queues, though it doesn't have sufficient EQs,
>> resulting in wasted queue resources. And the PF gets a smaller share of
>> queues though it has more EQs. Fix this by capping the VF queue count at
>> its EQ count.
>>
>> Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
>> ---
>> drivers/net/ethernet/emulex/benet/be.h | 4 ++++
>> drivers/net/ethernet/emulex/benet/be_main.c | 15 ++++++---------
>> 2 files changed, 10 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/emulex/benet/be.h
>> b/drivers/net/ethernet/emulex/benet/be.h
>> index cf83783..f33d73c 100644
>> --- a/drivers/net/ethernet/emulex/benet/be.h
>> +++ b/drivers/net/ethernet/emulex/benet/be.h
>> @@ -89,6 +89,10 @@
>> #define BE3_MAX_TX_QS 16
>> #define BE3_MAX_EVT_QS 16
>> #define BE3_SRIOV_MAX_EVT_QS 8
>> +#define SH_VF_MAX_NIC_EQS 3 /* Skyhawk VFs can have a
>> max of 4 EQs
>
>
> Other #define's seem to have a space after them, not tab...
Thanks for catching it, I'll fix it in a subsequent patch ?
Thanks,
-Harsha
>
>> + * and at least 1 is granted to
>> either
>> + * SURF/DPDK
>> + */
>>
>> #define MAX_RSS_IFACES 15
>> #define MAX_RX_QS 32
>
> [...]
>
> MBR, Sergei
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH net-next 4/8] be2net: SRIOV Queue distribution should factor in EQ-count of VFs
2016-02-02 15:41 ` Sriharsha Basavapatna
@ 2016-02-02 16:41 ` Sergei Shtylyov
0 siblings, 0 replies; 12+ messages in thread
From: Sergei Shtylyov @ 2016-02-02 16:41 UTC (permalink / raw)
To: Sriharsha Basavapatna; +Cc: netdev
On 02/02/2016 06:41 PM, Sriharsha Basavapatna wrote:
>>> The SRIOV resource distribution logic for RX/TX queue counts is not
>>> optimal
>>> when a small number of VFs are enabled. It does not take into account the
>>> VF's EQ count while computing the queue counts. Because of this, the VF
>>> gets a large number of queues, though it doesn't have sufficient EQs,
>>> resulting in wasted queue resources. And the PF gets a smaller share of
>>> queues though it has more EQs. Fix this by capping the VF queue count at
>>> its EQ count.
>>>
>>> Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
>>> ---
>>> drivers/net/ethernet/emulex/benet/be.h | 4 ++++
>>> drivers/net/ethernet/emulex/benet/be_main.c | 15 ++++++---------
>>> 2 files changed, 10 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/drivers/net/ethernet/emulex/benet/be.h
>>> b/drivers/net/ethernet/emulex/benet/be.h
>>> index cf83783..f33d73c 100644
>>> --- a/drivers/net/ethernet/emulex/benet/be.h
>>> +++ b/drivers/net/ethernet/emulex/benet/be.h
>>> @@ -89,6 +89,10 @@
>>> #define BE3_MAX_TX_QS 16
>>> #define BE3_MAX_EVT_QS 16
>>> #define BE3_SRIOV_MAX_EVT_QS 8
>>> +#define SH_VF_MAX_NIC_EQS 3 /* Skyhawk VFs can have a
>>> max of 4 EQs
>>
>>
>> Other #define's seem to have a space after them, not tab...
>
> Thanks for catching it, I'll fix it in a subsequent patch ?
Please just don't use tab here, no need for new patch.
> Thanks,
> -Harsha
[...]
MBR, Sergei
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH net-next 5/8] be2net: Don't run ethtool self-tests for VFs
2016-02-02 10:20 [PATCH net-next 0/8] be2net patch-set Sriharsha Basavapatna
` (3 preceding siblings ...)
2016-02-02 10:20 ` [PATCH net-next 4/8] be2net: SRIOV Queue distribution should factor in EQ-count of VFs Sriharsha Basavapatna
@ 2016-02-02 10:20 ` Sriharsha Basavapatna
2016-02-02 10:20 ` [PATCH net-next 6/8] benet: Fix Lancer error recovery Sriharsha Basavapatna
` (2 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Sriharsha Basavapatna @ 2016-02-02 10:20 UTC (permalink / raw)
To: netdev
From: Somnath Kotur <somnath.kotur@broadcom.com>
The CMD_SUBSYSTEM_LOWLEVEL cmds need DEV_CFG Privilege to run
which VFs don't have by default.
Self-tests need to be issued only for PFs.
Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
---
drivers/net/ethernet/emulex/benet/be_cmds.c | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 3b665f1..7d51d47 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -65,7 +65,22 @@ static struct be_cmd_priv_map cmd_priv_map[] = {
CMD_SUBSYSTEM_COMMON,
BE_PRIV_LNKMGMT | BE_PRIV_VHADM |
BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
- }
+ },
+ {
+ OPCODE_LOWLEVEL_HOST_DDR_DMA,
+ CMD_SUBSYSTEM_LOWLEVEL,
+ BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
+ },
+ {
+ OPCODE_LOWLEVEL_LOOPBACK_TEST,
+ CMD_SUBSYSTEM_LOWLEVEL,
+ BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
+ },
+ {
+ OPCODE_LOWLEVEL_SET_LOOPBACK_MODE,
+ CMD_SUBSYSTEM_LOWLEVEL,
+ BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
+ },
};
static bool be_cmd_allowed(struct be_adapter *adapter, u8 opcode, u8 subsystem)
@@ -3169,6 +3184,10 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
struct be_cmd_req_set_lmode *req;
int status;
+ if (!be_cmd_allowed(adapter, OPCODE_LOWLEVEL_SET_LOOPBACK_MODE,
+ CMD_SUBSYSTEM_LOWLEVEL))
+ return -EPERM;
+
spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
@@ -3214,6 +3233,10 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
struct be_cmd_resp_loopback_test *resp;
int status;
+ if (!be_cmd_allowed(adapter, OPCODE_LOWLEVEL_LOOPBACK_TEST,
+ CMD_SUBSYSTEM_LOWLEVEL))
+ return -EPERM;
+
spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
@@ -3260,6 +3283,10 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
int status;
int i, j = 0;
+ if (!be_cmd_allowed(adapter, OPCODE_LOWLEVEL_HOST_DDR_DMA,
+ CMD_SUBSYSTEM_LOWLEVEL))
+ return -EPERM;
+
spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
--
2.3.0.rc2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 6/8] benet: Fix Lancer error recovery
2016-02-02 10:20 [PATCH net-next 0/8] be2net patch-set Sriharsha Basavapatna
` (4 preceding siblings ...)
2016-02-02 10:20 ` [PATCH net-next 5/8] be2net: Don't run ethtool self-tests for VFs Sriharsha Basavapatna
@ 2016-02-02 10:20 ` Sriharsha Basavapatna
2016-02-02 10:20 ` [PATCH net-next 7/8] benet: Add retry in case of error recovery failure Sriharsha Basavapatna
2016-02-02 10:20 ` [PATCH net-next 8/8] benet: Fix interval calculation in interrupt moderation Sriharsha Basavapatna
7 siblings, 0 replies; 12+ messages in thread
From: Sriharsha Basavapatna @ 2016-02-02 10:20 UTC (permalink / raw)
To: netdev
From: Padmanabh Ratnakar <padmanabh.ratnakar@broadcom.com>
After error is detected, wait for adapter to move to ready state
before destroying queues and cleanup of other resources. Also
skip performing any cleanup for non-Lancer chips and move debug
messages to correct routine.
Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@broadcom.com>
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
---
drivers/net/ethernet/emulex/benet/be_main.c | 51 +++++++++++++++++++----------
1 file changed, 34 insertions(+), 17 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 62f6fbb..6eb3aba 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -4859,21 +4859,27 @@ static int be_resume(struct be_adapter *adapter)
static int be_err_recover(struct be_adapter *adapter)
{
- struct device *dev = &adapter->pdev->dev;
int status;
+ /* Error recovery is supported only Lancer as of now */
+ if (!lancer_chip(adapter))
+ return -EIO;
+
+ /* Wait for adapter to reach quiescent state before
+ * destroying queues
+ */
+ status = be_fw_wait_ready(adapter);
+ if (status)
+ goto err;
+
+ be_cleanup(adapter);
+
status = be_resume(adapter);
if (status)
goto err;
- dev_info(dev, "Adapter recovery successful\n");
return 0;
err:
- if (be_physfn(adapter))
- dev_err(dev, "Adapter recovery failed\n");
- else
- dev_err(dev, "Re-trying adapter recovery\n");
-
return status;
}
@@ -4882,21 +4888,32 @@ static void be_err_detection_task(struct work_struct *work)
struct be_adapter *adapter =
container_of(work, struct be_adapter,
be_err_detection_work.work);
- int status = 0;
+ struct device *dev = &adapter->pdev->dev;
+ int recovery_status;
be_detect_error(adapter);
- if (be_check_error(adapter, BE_ERROR_HW)) {
- be_cleanup(adapter);
-
- /* As of now error recovery support is in Lancer only */
- if (lancer_chip(adapter))
- status = be_err_recover(adapter);
+ if (be_check_error(adapter, BE_ERROR_HW))
+ recovery_status = be_err_recover(adapter);
+ else
+ goto reschedule_task;
+
+ if (!recovery_status) {
+ dev_info(dev, "Adapter recovery successful\n");
+ goto reschedule_task;
+ } else if (be_virtfn(adapter)) {
+ /* For VFs, check if PF have allocated resources
+ * every second.
+ */
+ dev_err(dev, "Re-trying adapter recovery\n");
+ goto reschedule_task;
+ } else {
+ dev_err(dev, "Adapter recovery failed\n");
}
- /* Always attempt recovery on VFs */
- if (!status || be_virtfn(adapter))
- be_schedule_err_detection(adapter);
+ return;
+reschedule_task:
+ be_schedule_err_detection(adapter);
}
static void be_log_sfp_info(struct be_adapter *adapter)
--
2.3.0.rc2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 7/8] benet: Add retry in case of error recovery failure
2016-02-02 10:20 [PATCH net-next 0/8] be2net patch-set Sriharsha Basavapatna
` (5 preceding siblings ...)
2016-02-02 10:20 ` [PATCH net-next 6/8] benet: Fix Lancer error recovery Sriharsha Basavapatna
@ 2016-02-02 10:20 ` Sriharsha Basavapatna
2016-02-02 10:20 ` [PATCH net-next 8/8] benet: Fix interval calculation in interrupt moderation Sriharsha Basavapatna
7 siblings, 0 replies; 12+ messages in thread
From: Sriharsha Basavapatna @ 2016-02-02 10:20 UTC (permalink / raw)
To: netdev
From: Padmanabh Ratnakar <padmanabh.ratnakar@broadcom.com>
Retry error recovery MAX_ERR_RECOVERY_RETRY_COUNT times in case of
failure during error recovery.
Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@broadcom.com>
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
---
drivers/net/ethernet/emulex/benet/be.h | 5 +++++
drivers/net/ethernet/emulex/benet/be_main.c | 23 +++++++++++++++++------
2 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index f33d73c..5277974 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -397,6 +397,10 @@ enum vf_state {
#define BE_UC_PMAC_COUNT 30
#define BE_VF_UC_PMAC_COUNT 2
+#define MAX_ERR_RECOVERY_RETRY_COUNT 3
+#define ERR_DETECTION_DELAY 1000
+#define ERR_RECOVERY_RETRY_DELAY 30000
+
/* Ethtool set_dump flags */
#define LANCER_INITIATE_FW_DUMP 0x1
#define LANCER_DELETE_FW_DUMP 0x2
@@ -534,6 +538,7 @@ struct be_adapter {
u16 work_counter;
struct delayed_work be_err_detection_work;
+ u8 recovery_retries;
u8 err_flags;
u32 flags;
u32 cmd_privileges;
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 6eb3aba..d5286d3 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -4265,10 +4265,10 @@ static void be_schedule_worker(struct be_adapter *adapter)
adapter->flags |= BE_FLAGS_WORKER_SCHEDULED;
}
-static void be_schedule_err_detection(struct be_adapter *adapter)
+static void be_schedule_err_detection(struct be_adapter *adapter, u32 delay)
{
schedule_delayed_work(&adapter->be_err_detection_work,
- msecs_to_jiffies(1000));
+ msecs_to_jiffies(delay));
adapter->flags |= BE_FLAGS_ERR_DETECTION_SCHEDULED;
}
@@ -4890,6 +4890,7 @@ static void be_err_detection_task(struct work_struct *work)
be_err_detection_work.work);
struct device *dev = &adapter->pdev->dev;
int recovery_status;
+ int delay = ERR_DETECTION_DELAY;
be_detect_error(adapter);
@@ -4899,6 +4900,7 @@ static void be_err_detection_task(struct work_struct *work)
goto reschedule_task;
if (!recovery_status) {
+ adapter->recovery_retries = 0;
dev_info(dev, "Adapter recovery successful\n");
goto reschedule_task;
} else if (be_virtfn(adapter)) {
@@ -4907,13 +4909,22 @@ static void be_err_detection_task(struct work_struct *work)
*/
dev_err(dev, "Re-trying adapter recovery\n");
goto reschedule_task;
+ } else if (adapter->recovery_retries++ <
+ MAX_ERR_RECOVERY_RETRY_COUNT) {
+ /* In case of another error during recovery, it takes 30 sec
+ * for adapter to come out of error. Retry error recovery after
+ * this time interval.
+ */
+ dev_err(&adapter->pdev->dev, "Re-trying adapter recovery\n");
+ delay = ERR_RECOVERY_RETRY_DELAY;
+ goto reschedule_task;
} else {
dev_err(dev, "Adapter recovery failed\n");
}
return;
reschedule_task:
- be_schedule_err_detection(adapter);
+ be_schedule_err_detection(adapter, delay);
}
static void be_log_sfp_info(struct be_adapter *adapter)
@@ -5309,7 +5320,7 @@ static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id)
be_roce_dev_add(adapter);
- be_schedule_err_detection(adapter);
+ be_schedule_err_detection(adapter, ERR_DETECTION_DELAY);
/* On Die temperature not supported for VF. */
if (be_physfn(adapter) && IS_ENABLED(CONFIG_BE2NET_HWMON)) {
@@ -5376,7 +5387,7 @@ static int be_pci_resume(struct pci_dev *pdev)
if (status)
return status;
- be_schedule_err_detection(adapter);
+ be_schedule_err_detection(adapter, ERR_DETECTION_DELAY);
if (adapter->wol_en)
be_setup_wol(adapter, false);
@@ -5476,7 +5487,7 @@ static void be_eeh_resume(struct pci_dev *pdev)
if (status)
goto err;
- be_schedule_err_detection(adapter);
+ be_schedule_err_detection(adapter, ERR_DETECTION_DELAY);
return;
err:
dev_err(&adapter->pdev->dev, "EEH resume failed\n");
--
2.3.0.rc2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 8/8] benet: Fix interval calculation in interrupt moderation
2016-02-02 10:20 [PATCH net-next 0/8] be2net patch-set Sriharsha Basavapatna
` (6 preceding siblings ...)
2016-02-02 10:20 ` [PATCH net-next 7/8] benet: Add retry in case of error recovery failure Sriharsha Basavapatna
@ 2016-02-02 10:20 ` Sriharsha Basavapatna
7 siblings, 0 replies; 12+ messages in thread
From: Sriharsha Basavapatna @ 2016-02-02 10:20 UTC (permalink / raw)
To: netdev
From: Padmanabh Ratnakar <padmanabh.ratnakar@broadcom.com>
Interrupt moderation parameters need to be recalculated only
after a time interval of 1 ms. Interval calculation is wrong
when there is a rollover of jiffies. Using recommended way of interval
calculation using jiffies to fix this.
Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@broadcom.com>
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
---
drivers/net/ethernet/emulex/benet/be_main.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index d5286d3..9c1fc9d 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -1917,8 +1917,7 @@ static u32 be_get_eq_delay_mult_enc(struct be_eq_obj *eqo)
if (!aic->enable)
return 0;
- if (time_before_eq(now, aic->jiffies) ||
- jiffies_to_msecs(now - aic->jiffies) < 1)
+ if (jiffies_to_msecs(now - aic->jiffies) < 1)
eqd = aic->prev_eqd;
else
eqd = be_get_new_eqd(eqo);
--
2.3.0.rc2
^ permalink raw reply related [flat|nested] 12+ messages in thread