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
From: Suresh Reddy <redacted>
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 <redacted>
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(-)
@@ -720,29 +720,32 @@ static int be_set_phys_id(struct net_device *netdev,enumethtool_phys_id_statestate){structbe_adapter*adapter=netdev_priv(netdev);+intstatus=0;switch(state){caseETHTOOL_ID_ACTIVE:-be_cmd_get_beacon_state(adapter,adapter->hba_port_num,-&adapter->beacon_state);-return1;/* cycle on/off once per second */+status=be_cmd_get_beacon_state(adapter,adapter->hba_port_num,+&adapter->beacon_state);+if(status)+returnbe_cmd_status(status);+return1;/* cycle on/off once per second */caseETHTOOL_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;caseETHTOOL_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;caseETHTOOL_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);}-return0;+returnbe_cmd_status(status);}staticintbe_set_dump(structnet_device*netdev,structethtool_dump*dump)
From: Suresh Reddy <redacted>
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 <redacted>
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(-)
@@ -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);
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(+)
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(-)
@@ -3792,18 +3792,15 @@ static u16 be_calculate_vf_qs(struct be_adapter *adapter, u16 num_vfs)structbe_resourcesres=adapter->pool_res;u16num_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*Donotdistributequeueresourcesinmulti-channelconfiguration.*/if(num_vfs&&!be_is_mc(adapter)){-/* If number of VFs requested is 8 less than max supported,-*assign8queuepairstothePFanddividetheremaining-*resourcesevenlyamongtheVFs-*/-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+*atVF-EQ-count.AnyremainderqpairsbelongtothePF.+*/+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*interfacesperport.ProvideRSSonVFs,onlyifnumber
From: Padmanabh Ratnakar <redacted>
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 <redacted>
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(-)
@@ -4859,21 +4859,27 @@ static int be_resume(struct be_adapter *adapter)staticintbe_err_recover(structbe_adapter*adapter){-structdevice*dev=&adapter->pdev->dev;intstatus;+/* Error recovery is supported only Lancer as of now */+if(!lancer_chip(adapter))+return-EIO;++/* Wait for adapter to reach quiescent state before+*destroyingqueues+*/+status=be_fw_wait_ready(adapter);+if(status)+gotoerr;++be_cleanup(adapter);+status=be_resume(adapter);if(status)gotoerr;-dev_info(dev,"Adapter recovery successful\n");return0;err:-if(be_physfn(adapter))-dev_err(dev,"Adapter recovery failed\n");-else-dev_err(dev,"Re-trying adapter recovery\n");-returnstatus;}
@@ -4882,21 +4888,32 @@ static void be_err_detection_task(struct work_struct *work)structbe_adapter*adapter=container_of(work,structbe_adapter,be_err_detection_work.work);-intstatus=0;+structdevice*dev=&adapter->pdev->dev;+intrecovery_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+gotoreschedule_task;++if(!recovery_status){+dev_info(dev,"Adapter recovery successful\n");+gotoreschedule_task;+}elseif(be_virtfn(adapter)){+/* For VFs, check if PF have allocated resources+*everysecond.+*/+dev_err(dev,"Re-trying adapter recovery\n");+gotoreschedule_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);}staticvoidbe_log_sfp_info(structbe_adapter*adapter)
From: Somnath Kotur <redacted>
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 <redacted>
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(-)
@@ -4907,13 +4909,22 @@ static void be_err_detection_task(struct work_struct *work)*/dev_err(dev,"Re-trying adapter recovery\n");gotoreschedule_task;+}elseif(adapter->recovery_retries++<+MAX_ERR_RECOVERY_RETRY_COUNT){+/* In case of another error during recovery, it takes 30 sec+*foradaptertocomeoutoferror.Retryerrorrecoveryafter+*thistimeinterval.+*/+dev_err(&adapter->pdev->dev,"Re-trying adapter recovery\n");+delay=ERR_RECOVERY_RETRY_DELAY;+gotoreschedule_task;}else{dev_err(dev,"Adapter recovery failed\n");}return;reschedule_task:-be_schedule_err_detection(adapter);+be_schedule_err_detection(adapter,delay);}staticvoidbe_log_sfp_info(structbe_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)returnstatus;-be_schedule_err_detection(adapter);+be_schedule_err_detection(adapter,ERR_DETECTION_DELAY);if(adapter->wol_en)be_setup_wol(adapter,false);
From: Padmanabh Ratnakar <redacted>
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 <redacted>
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(-)
From: Sergei Shtylyov <hidden> Date: 2016-02-02 14:30:51
Hello.
On 2/2/2016 1:20 PM, Sriharsha Basavapatna wrote:
quoted hunk
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(-)
@@ -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
On Tue, Feb 2, 2016 at 8:00 PM, Sergei Shtylyov
[off-list ref] wrote:
Hello.
On 2/2/2016 1:20 PM, Sriharsha Basavapatna wrote:
quoted
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(-)
From: Sergei Shtylyov <hidden> Date: 2016-02-02 16:41:54
On 02/02/2016 06:41 PM, Sriharsha Basavapatna wrote:
quoted
quoted
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(-)