All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/8] be2net patch-set
@ 2016-02-02 10:20 Sriharsha Basavapatna
  2016-02-02 10:20 ` [PATCH net-next 1/8] be2net: return error status from be_set_phys_id() Sriharsha Basavapatna
                   ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Sriharsha Basavapatna @ 2016-02-02 10:20 UTC (permalink / raw)
  To: netdev

Hi David,

The following patch set contains a few non-critical bug fixes. Please
consider applying this to the net-next tree. Thanks.

Patch-1 fixes be_set_phys_id() ethtool function to return an error code.
Patch-2 fixes a warning when some commands fail for VFs.
Patch-3 fixes be_vlan_rem_vid() to verify vlan being removed is in the list.
Patch-4 improves SRIOV queue distribution logic.
Patch-5 avoids running self test on VFs.
Patch-6 fixes error recovery in Lancer to clean up after moving to ready state.
Patch-7 adds retry logic to error recovery in case of recovery failures
Patch-8 fixes time interval used in eq delay computation routine

********

Padmanabh Ratnakar (3):
  benet: Fix Lancer error recovery
  benet: Add retry in case of error recovery failure
  benet: Fix interval calculation in interrupt moderation

Somnath Kotur (1):
  be2net: Don't run ethtool self-tests for VFs

Sriharsha Basavapatna (2):
  be2net: Fix be_vlan_rem_vid() to check vlan id being removed
  be2net: SRIOV Queue distribution should factor in EQ-count of VFs

Suresh Reddy (2):
  be2net: return error status from be_set_phys_id()
  be2net: check for INSUFFICIENT_PRIVILEGES error

 drivers/net/ethernet/emulex/benet/be.h         |  9 +++
 drivers/net/ethernet/emulex/benet/be_cmds.c    | 32 ++++++++-
 drivers/net/ethernet/emulex/benet/be_cmds.h    |  3 +-
 drivers/net/ethernet/emulex/benet/be_ethtool.c | 23 ++++---
 drivers/net/ethernet/emulex/benet/be_main.c    | 93 +++++++++++++++++---------
 5 files changed, 114 insertions(+), 46 deletions(-)

-- 
2.3.0.rc2

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [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

* [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

* 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

end of thread, other threads:[~2016-02-02 16:41 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 ` [PATCH net-next 3/8] be2net: Fix be_vlan_rem_vid() to check vlan id being removed 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
2016-02-02 14:30   ` Sergei Shtylyov
2016-02-02 15:41     ` Sriharsha Basavapatna
2016-02-02 16:41       ` Sergei Shtylyov
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 ` [PATCH net-next 6/8] benet: Fix Lancer error recovery 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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.