[dpdk-dev] [PATCH 34/61] net/qede/base: prevent transmitter stuck condition
Rasesh Mody
rasesh.mody at cavium.com
Mon Feb 27 08:56:50 CET 2017
Change OOO TC properly to prevent transmitter stuck condition
due to credit underruns.
Signed-off-by: Rasesh Mody <rasesh.mody at cavium.com>
---
drivers/net/qede/base/ecore.h | 4 +---
drivers/net/qede/base/ecore_dcbx.c | 6 ++----
drivers/net/qede/base/ecore_dev.c | 19 ++++++++++++++-----
drivers/net/qede/base/mcp_public.h | 12 ++++++++----
4 files changed, 25 insertions(+), 16 deletions(-)
diff --git a/drivers/net/qede/base/ecore.h b/drivers/net/qede/base/ecore.h
index 479a991..c9b1b5a 100644
--- a/drivers/net/qede/base/ecore.h
+++ b/drivers/net/qede/base/ecore.h
@@ -358,9 +358,6 @@ struct ecore_hw_info {
u8 num_active_tc;
- /* Traffic class used for tcp out of order traffic */
- u8 ooo_tc;
-
/* The traffic class used by PF for it's offloaded protocol */
u8 offload_tc;
@@ -441,6 +438,7 @@ struct ecore_qm_info {
u16 num_vf_pqs;
u8 num_vports;
u8 max_phys_tcs_per_port;
+ u8 ooo_tc;
bool pf_rl_en;
bool pf_wfq_en;
bool vport_rl_en;
diff --git a/drivers/net/qede/base/ecore_dcbx.c b/drivers/net/qede/base/ecore_dcbx.c
index ca3aece..e82946a 100644
--- a/drivers/net/qede/base/ecore_dcbx.c
+++ b/drivers/net/qede/base/ecore_dcbx.c
@@ -129,11 +129,8 @@ static bool ecore_dcbx_default_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee)
p_data->arr[type].update = DONT_UPDATE_DCB_DSCP;
/* QM reconf data */
- if (p_hwfn->hw_info.personality == personality) {
+ if (p_hwfn->hw_info.personality == personality)
p_hwfn->hw_info.offload_tc = tc;
- if (personality == ECORE_PCI_ISCSI)
- p_hwfn->hw_info.ooo_tc = DCBX_ISCSI_OOO_TC;
- }
}
/* Update app protocol data and hw_info fields with the TLV info */
@@ -317,6 +314,7 @@ static bool ecore_dcbx_default_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee)
p_info->num_active_tc = ECORE_MFW_GET_FIELD(p_ets->flags,
DCBX_ETS_MAX_TCS);
+ p_hwfn->qm_info.ooo_tc = ECORE_MFW_GET_FIELD(p_ets->flags, DCBX_OOO_TC);
data.pf_id = p_hwfn->rel_pf_id;
data.dcbx_enabled = !!dcbx_version;
diff --git a/drivers/net/qede/base/ecore_dev.c b/drivers/net/qede/base/ecore_dev.c
index dfb95bb..704bd8f 100644
--- a/drivers/net/qede/base/ecore_dev.c
+++ b/drivers/net/qede/base/ecore_dev.c
@@ -297,6 +297,7 @@ u16 ecore_init_qm_get_num_pqs(struct ecore_hwfn *p_hwfn)
static void ecore_init_qm_params(struct ecore_hwfn *p_hwfn)
{
struct ecore_qm_info *qm_info = &p_hwfn->qm_info;
+ bool four_port;
/* pq and vport bases for this PF */
qm_info->start_pq = (u16)RESC_START(p_hwfn, ECORE_PQ);
@@ -306,10 +307,19 @@ static void ecore_init_qm_params(struct ecore_hwfn *p_hwfn)
qm_info->vport_rl_en = 1;
qm_info->vport_wfq_en = 1;
+ /* TC config is different for AH 4 port */
+ four_port = p_hwfn->p_dev->num_ports_in_engines == MAX_NUM_PORTS_K2;
+
/* in AH 4 port we have fewer TCs per port */
- qm_info->max_phys_tcs_per_port =
- p_hwfn->p_dev->num_ports_in_engines == MAX_NUM_PORTS_K2 ?
- NUM_PHYS_TCS_4PORT_K2 : NUM_OF_PHYS_TCS;
+ qm_info->max_phys_tcs_per_port = four_port ? NUM_PHYS_TCS_4PORT_K2 :
+ NUM_OF_PHYS_TCS;
+
+ /* unless MFW indicated otherwise, ooo_tc should be 3 for AH 4 port and
+ * 4 otherwise
+ */
+ if (!qm_info->ooo_tc)
+ qm_info->ooo_tc = four_port ? DCBX_TCP_OOO_K2_4PORT_TC :
+ DCBX_TCP_OOO_TC;
}
/* initialize qm vport params */
@@ -538,8 +548,7 @@ static void ecore_init_qm_ooo_pq(struct ecore_hwfn *p_hwfn)
return;
ecore_init_qm_set_idx(p_hwfn, PQ_FLAGS_OOO, qm_info->num_pqs);
- ecore_init_qm_pq(p_hwfn, qm_info, DCBX_ISCSI_OOO_TC,
- PQ_INIT_SHARE_VPORT);
+ ecore_init_qm_pq(p_hwfn, qm_info, qm_info->ooo_tc, PQ_INIT_SHARE_VPORT);
}
static void ecore_init_qm_pure_ack_pq(struct ecore_hwfn *p_hwfn)
diff --git a/drivers/net/qede/base/mcp_public.h b/drivers/net/qede/base/mcp_public.h
index 28909fb..bd34557 100644
--- a/drivers/net/qede/base/mcp_public.h
+++ b/drivers/net/qede/base/mcp_public.h
@@ -294,16 +294,20 @@ struct dcbx_ets_feature {
#define DCBX_ETS_CBS_SHIFT 3
#define DCBX_ETS_MAX_TCS_MASK 0x000000f0
#define DCBX_ETS_MAX_TCS_SHIFT 4
-#define DCBX_ISCSI_OOO_TC_MASK 0x00000f00
-#define DCBX_ISCSI_OOO_TC_SHIFT 8
+#define DCBX_OOO_TC_MASK 0x00000f00
+#define DCBX_OOO_TC_SHIFT 8
/* Entries in tc table are orginized that the left most is pri 0, right most is
* prio 7
*/
u32 pri_tc_tbl[1];
-#define DCBX_ISCSI_OOO_TC (4)
+/* Fixed TCP OOO TC usage is deprecated and used only for driver backward
+ * compatibility
+ */
+#define DCBX_TCP_OOO_TC (4)
+#define DCBX_TCP_OOO_K2_4PORT_TC (3)
-#define NIG_ETS_ISCSI_OOO_CLIENT_OFFSET (DCBX_ISCSI_OOO_TC + 1)
+#define NIG_ETS_ISCSI_OOO_CLIENT_OFFSET (DCBX_TCP_OOO_TC + 1)
#define DCBX_CEE_STRICT_PRIORITY 0xf
/* Entries in tc table are orginized that the left most is pri 0, right most is
* prio 7
--
1.7.10.3
More information about the dev
mailing list