Skip to contentSkip to conversation

fix promisc and tcam problem

PATCH In review Xiaoyun wang 2 participants 8 messages Jun 27, 2020 – Jul 7, 2020 Network drivers

lore
Share & tools
lore
#0 lore raw

cover fix promisc and tcam problem

This patch adds multi-thread resource protection when setting promiscuous or allmulticast mode, adds bufout and out size parameter for mgmt sync channel and removes unused parameters for mgmt channel with no ack, adds TCAM filter switch for FDIR, and modifies return errors.

--
v1:
- add out parameter for mgmt sync channel
- remove unused parameter
- fix setting promiscuous mode problem
- add tcam filter switch for FDIR
- modify return errors

Xiaoyun wang (5):
net/hinic/base: add out parameter for mgmt sync channel net/hinic/base: remove unused parameter net/hinic: fix setting promiscuous mode problem net/hinic: add tcam filter switch for FDIR net/hinic/base: modify return errors

 drivers/net/hinic/base/hinic_pmd_cfg.c    |   4 +-
 drivers/net/hinic/base/hinic_pmd_cmd.h    |   1 +
 drivers/net/hinic/base/hinic_pmd_cmdq.c   |  31 ++++--
 drivers/net/hinic/base/hinic_pmd_hwdev.c  | 147 +++++++++++++++++---------
 drivers/net/hinic/base/hinic_pmd_hwif.c   |   4 +-
 drivers/net/hinic/base/hinic_pmd_mgmt.c   |   3 +-
 drivers/net/hinic/base/hinic_pmd_mgmt.h   |   3 +-
 drivers/net/hinic/base/hinic_pmd_niccfg.c | 170 ++++++++++++++++++------------
 drivers/net/hinic/base/hinic_pmd_niccfg.h |  11 ++
 drivers/net/hinic/base/hinic_pmd_nicio.c  |  42 ++++++--
 drivers/net/hinic/hinic_pmd_ethdev.c      |  34 +++++-
 drivers/net/hinic/hinic_pmd_ethdev.h      |   1 +
 drivers/net/hinic/hinic_pmd_flow.c        |  13 +++
 13 files changed, 316 insertions(+), 148 deletions(-)
Signature · 1 line
1.8.3.1
#1 lore raw

PATCH 1/5 net/hinic/base: add out parameter for mgmt sync channel

Add bufout and out size info for some cmds that use mgmt sync channel, which can improve dfx capability when send msg failed.

Fixes 7fcd6b05b923 ("net/hinic/base: support cmdq mechanism")
---
 drivers/net/hinic/base/hinic_pmd_cmdq.c   |  31 ++++---
 drivers/net/hinic/base/hinic_pmd_hwdev.c  | 129 +++++++++++++++++++++---------
 drivers/net/hinic/base/hinic_pmd_niccfg.c |  27 +++----
 drivers/net/hinic/base/hinic_pmd_nicio.c  |  36 +++++++--
 4 files changed, 151 insertions(+), 72 deletions(-)
drivers/net/hinic/base/hinic_pmd_cmdq.c +22 -9
index 2e98b9c..1816636 100644
@@ -426,27 +426,31 @@ static int hinic_set_cmdq_ctxts(struct hinic_hwdev *hwdev)
 {
 	struct hinic_cmdqs *cmdqs = hwdev->cmdqs;
 	struct hinic_cmdq_ctxt *cmdq_ctxt;
+	struct hinic_cmdq_ctxt cmdq_ctxt_out;
 	enum hinic_cmdq_type cmdq_type;
+	u16 out_size = sizeof(cmdq_ctxt_out);
 	u16 in_size;
 	int err;
 
 	cmdq_type = HINIC_CMDQ_SYNC;
+	memset(&cmdq_ctxt_out, 0, out_size);
 	for (; cmdq_type < HINIC_MAX_CMDQ_TYPES; cmdq_type++) {
 		cmdq_ctxt = &cmdqs->cmdq[cmdq_type].cmdq_ctxt;
 		cmdq_ctxt->resp_aeq_num = HINIC_AEQ1;
 		in_size = sizeof(*cmdq_ctxt);
 		err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
 					     HINIC_MGMT_CMD_CMDQ_CTXT_SET,
-					     cmdq_ctxt, in_size, NULL,
-					     NULL, 0);
-		if (err) {
+					     cmdq_ctxt, in_size, &cmdq_ctxt_out,
+					     &out_size, 0);
+		if (err || !out_size || cmdq_ctxt_out.status) {
 			if (err == HINIC_MBOX_PF_BUSY_ACTIVE_FW ||
 				err == HINIC_DEV_BUSY_ACTIVE_FW) {
 				cmdqs->status |= HINIC_CMDQ_SET_FAIL;
 				PMD_DRV_LOG(ERR, "PF or VF fw is hot active");
 			}
-			PMD_DRV_LOG(ERR, "Set cmdq ctxt failed, err: %d", err);
-			return -EFAULT;
+			PMD_DRV_LOG(ERR, "Set cmdq ctxt failed, err: %d, status: 0x%x, out_size: 0x%x",
+				err, cmdq_ctxt_out.status, out_size);
+			return -EIO;
 		}
 	}
 
@@ -631,6 +635,8 @@ static void hinic_cmdqs_free(struct hinic_hwdev *hwdev)
 static int hinic_set_cmdq_depth(struct hinic_hwdev *hwdev, u16 cmdq_depth)
 {
 	struct hinic_root_ctxt root_ctxt;
+	u16 out_size = sizeof(root_ctxt);
+	int err;
 
 	memset(&root_ctxt, 0, sizeof(root_ctxt));
 	root_ctxt.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
@@ -638,10 +644,17 @@ static int hinic_set_cmdq_depth(struct hinic_hwdev *hwdev, u16 cmdq_depth)
 	root_ctxt.ppf_idx = hinic_ppf_idx(hwdev);
 	root_ctxt.set_cmdq_depth = 1;
 	root_ctxt.cmdq_depth = (u8)ilog2(cmdq_depth);
-	return hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
-				      HINIC_MGMT_CMD_VAT_SET,
-				      &root_ctxt, sizeof(root_ctxt),
-				      NULL, NULL, 0);
+	err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
+				     HINIC_MGMT_CMD_VAT_SET,
+				     &root_ctxt, sizeof(root_ctxt),
+				     &root_ctxt, &out_size, 0);
+	if (err || !out_size || root_ctxt.mgmt_msg_head.status) {
+		PMD_DRV_LOG(ERR, "Set cmdq depth failed, err: %d, status: 0x%x, out_size: 0x%x",
+			err, root_ctxt.mgmt_msg_head.status, out_size);
+		return -EIO;
+	}
+
+	return 0;
 }
 
 int hinic_comm_cmdqs_init(struct hinic_hwdev *hwdev)
drivers/net/hinic/base/hinic_pmd_hwdev.c +90 -39

237 lines not on this page · raw message

drivers/net/hinic/base/hinic_pmd_niccfg.c +11 -16
index c5663df..e894503 100644
@@ -18,7 +18,6 @@
 			buf_in, in_size,			\
 			buf_out, out_size, 0)
 
-
 /**
  * hinic_init_function_table - Initialize function table.
  *
@@ -380,9 +379,8 @@ int hinic_add_remove_vlan(void *hwdev, u16 vlan_id, u16 func_id, bool add)
 	vlan_info.func_id = func_id;
 	vlan_info.vlan_id = vlan_id;
 
-	err = l2nic_msg_to_mgmt_sync(hwdev, cmd, &vlan_info,
-				     sizeof(vlan_info), &vlan_info,
-				     &out_size);
+	err = l2nic_msg_to_mgmt_sync(hwdev, cmd, &vlan_info, sizeof(vlan_info),
+				     &vlan_info, &out_size);
 	if (err || !out_size || vlan_info.mgmt_msg_head.status) {
 		PMD_DRV_LOG(ERR,
 			"Failed to %s vlan, err: %d, status: 0x%x, out size: 0x%x",
@@ -469,8 +467,8 @@ int hinic_set_rx_vlan_offload(void *hwdev, u8 en)
 	vlan_cfg.vlan_rx_offload = en;
 
 	err = l2nic_msg_to_mgmt_sync(hwdev, HINIC_PORT_CMD_SET_RX_VLAN_OFFLOAD,
-					&vlan_cfg, sizeof(vlan_cfg),
-					&vlan_cfg, &out_size);
+				     &vlan_cfg, sizeof(vlan_cfg),
+				     &vlan_cfg, &out_size);
 	if (err || !out_size || vlan_cfg.mgmt_msg_head.status) {
 		PMD_DRV_LOG(ERR,
 			"Failed to set rx vlan offload, err: %d, status: 0x%x, out size: 0x%x",
@@ -626,7 +624,7 @@ int hinic_get_port_info(void *hwdev, struct nic_port_info *port_info)
 		PMD_DRV_LOG(ERR,
 			"Failed to get port info, err: %d, status: 0x%x, out size: 0x%x",
 			err, port_msg.mgmt_msg_head.status, out_size);
-		return err;
+		return -EIO;
 	}
 
 	port_info->autoneg_cap = port_msg.autoneg_cap;
@@ -1270,7 +1268,6 @@ int hinic_set_rx_vhd_mode(void *hwdev, u16 vhd_mode, u16 rx_buf_sz)
 		PMD_DRV_LOG(ERR,
 			"Failed to set vhd mode, err: %d, status: 0x%x, out size: 0x%x",
 			err, vhd_mode_cfg.mgmt_msg_head.status, out_size);
-
 		return -EIO;
 	}
 
@@ -1425,8 +1422,7 @@ int hinic_set_anti_attack(void *hwdev, bool enable)
 	rate.xbs = ANTI_ATTACK_DEFAULT_XBS;
 
 	err = l2nic_msg_to_mgmt_sync(hwdev, HINIC_PORT_CMD_SET_ANTI_ATTACK_RATE,
-				     &rate, sizeof(rate), &rate,
-				     &out_size);
+				     &rate, sizeof(rate), &rate, &out_size);
 	if (err || !out_size || rate.mgmt_msg_head.status) {
 		PMD_DRV_LOG(ERR, "Can't %s port Anti-Attack rate limit, err: %d, status: 0x%x, out size: 0x%x",
 			(enable ? "enable" : "disable"), err,
@@ -1530,9 +1526,9 @@ int hinic_set_fast_recycle_mode(void *hwdev, u8 mode)
 				     sizeof(fast_recycled_mode),
 				     &fast_recycled_mode, &out_size, 0);
 	if (err || fast_recycled_mode.mgmt_msg_head.status || !out_size) {
-		PMD_DRV_LOG(ERR, "Failed to set recycle mode, ret: %d",
-			fast_recycled_mode.mgmt_msg_head.status);
-		return -EFAULT;
+		PMD_DRV_LOG(ERR, "Failed to set recycle mode, err: %d, status: 0x%x, out size: 0x%x",
+			err, fast_recycled_mode.mgmt_msg_head.status, out_size);
+		return -EIO;
 	}
 
 	return 0;
@@ -1756,12 +1752,11 @@ int hinic_vf_get_default_cos(struct hinic_hwdev *hwdev, u8 *cos_id)
 
 	err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_L2NIC,
 				     HINIC_PORT_CMD_GET_VF_COS, &vf_cos,
-				     sizeof(vf_cos), &vf_cos,
-				     &out_size, 0);
+				     sizeof(vf_cos), &vf_cos, &out_size, 0);
 	if (err || !out_size || vf_cos.mgmt_msg_head.status) {
 		PMD_DRV_LOG(ERR, "Get VF default cos failed, err: %d, status: 0x%x, out size: 0x%x",
 			err, vf_cos.mgmt_msg_head.status, out_size);
-		return -EFAULT;
+		return -EIO;
 	}
 	*cos_id = vf_cos.state.default_cos;
 
drivers/net/hinic/base/hinic_pmd_nicio.c +28 -8
index 7f7e11d..7ec3e4c 100644
@@ -471,6 +471,8 @@ static u16 get_hw_rx_buf_size(u32 rx_buf_sz)
 hinic_set_root_ctxt(void *hwdev, u16 rq_depth, u16 sq_depth, int rx_buf_sz)
 {
 	struct hinic_root_ctxt root_ctxt;
+	u16 out_size = sizeof(root_ctxt);
+	int err;
 
 	memset(&root_ctxt, 0, sizeof(root_ctxt));
 	root_ctxt.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
@@ -483,10 +485,18 @@ static u16 get_hw_rx_buf_size(u32 rx_buf_sz)
 	root_ctxt.rx_buf_sz = get_hw_rx_buf_size(rx_buf_sz);
 	root_ctxt.sq_depth  = (u16)ilog2(sq_depth);
 
-	return hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
-				      HINIC_MGMT_CMD_VAT_SET,
-				      &root_ctxt, sizeof(root_ctxt),
-				      NULL, NULL, 0);
+	err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
+				     HINIC_MGMT_CMD_VAT_SET,
+				     &root_ctxt, sizeof(root_ctxt),
+				     &root_ctxt, &out_size, 0);
+	if (err || !out_size || root_ctxt.mgmt_msg_head.status) {
+		PMD_DRV_LOG(ERR,
+			"Set root context failed, err: %d, status: 0x%x, out_size: 0x%x",
+			err, root_ctxt.mgmt_msg_head.status, out_size);
+		return -EIO;
+	}
+
+	return 0;
 }
 
 /**
@@ -499,6 +509,8 @@ static u16 get_hw_rx_buf_size(u32 rx_buf_sz)
 static int hinic_clean_root_ctxt(void *hwdev)
 {
 	struct hinic_root_ctxt root_ctxt;
+	u16 out_size = sizeof(root_ctxt);
+	int err;
 
 	memset(&root_ctxt, 0, sizeof(root_ctxt));
 	root_ctxt.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
@@ -511,10 +523,18 @@ static int hinic_clean_root_ctxt(void *hwdev)
 	root_ctxt.rx_buf_sz = 0;
 	root_ctxt.sq_depth  = 0;
 
-	return hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
-				      HINIC_MGMT_CMD_VAT_SET,
-				      &root_ctxt, sizeof(root_ctxt),
-				      NULL, NULL, 0);
+	err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
+				     HINIC_MGMT_CMD_VAT_SET,
+				     &root_ctxt, sizeof(root_ctxt),
+				     &root_ctxt, &out_size, 0);
+	if (err || !out_size || root_ctxt.mgmt_msg_head.status) {
+		PMD_DRV_LOG(ERR,
+			"Clean root context failed, err: %d, status: 0x%x, out_size: 0x%x",
+			err, root_ctxt.mgmt_msg_head.status, out_size);
+		return -EIO;
+	}
+
+	return 0;
 }
 
 /* init qps ctxt and set sq ci attr and arm all sq and set vat page_size */
Signature · 1 line
1.8.3.1
#2 lore raw

PATCH 2/5 net/hinic/base: remove unused parameter

In reply to Xiaoyun wang

Remove unused parameters for mgmt channel with no ack.

Fixes a4957d87e05a ("net/hinic/base: add mgmt module")
---
 drivers/net/hinic/base/hinic_pmd_hwdev.c | 2 +-
 drivers/net/hinic/base/hinic_pmd_mgmt.c  | 3 +--
 drivers/net/hinic/base/hinic_pmd_mgmt.h  | 3 +--
 3 files changed, 3 insertions(+), 5 deletions(-)
drivers/net/hinic/base/hinic_pmd_hwdev.c +1 -1
index c132de0..a93f240 100644
@@ -599,7 +599,7 @@ static int hinic_pf_rx_tx_flush(struct hinic_hwdev *hwdev)
 
 	err = hinic_msg_to_mgmt_no_ack(hwdev, HINIC_MOD_COMM,
 				       HINIC_MGMT_CMD_START_FLR, &clr_res,
-				       sizeof(clr_res), NULL, NULL);
+				       sizeof(clr_res));
 	if (err) {
 		PMD_DRV_LOG(WARNING, "Notice flush msg failed, err: %d", err);
 		ret = err;
drivers/net/hinic/base/hinic_pmd_mgmt.c +1 -2
index 94bc45f..babb93a 100644
@@ -504,8 +504,7 @@ int hinic_msg_to_mgmt_sync(void *hwdev, enum hinic_mod_type mod, u8 cmd,
 }
 
 int hinic_msg_to_mgmt_no_ack(void *hwdev, enum hinic_mod_type mod, u8 cmd,
-		     void *buf_in, u16 in_size, __rte_unused void *buf_out,
-		     __rte_unused u16 *out_size)
+			     void *buf_in, u16 in_size)
 {
 	struct hinic_msg_pf_to_mgmt *pf_to_mgmt =
 				((struct hinic_hwdev *)hwdev)->pf_to_mgmt;
drivers/net/hinic/base/hinic_pmd_mgmt.h +1 -2
index 52b319e..0f32865 100644
@@ -101,8 +101,7 @@ struct hinic_msg_pf_to_mgmt {
 };
 
 int hinic_msg_to_mgmt_no_ack(void *hwdev, enum hinic_mod_type mod, u8 cmd,
-			     void *buf_in, u16 in_size, void *buf_out,
-			     u16 *out_size);
+			     void *buf_in, u16 in_size);
 
 int hinic_comm_pf_to_mgmt_init(struct hinic_hwdev *hwdev);
 
Signature · 1 line
1.8.3.1
#3 lore raw

PATCH 3/5 net/hinic: fix setting promiscuous mode problem

In reply to Xiaoyun wang

When setting promiscuous or allmulticast mode, increase multi-thread resource protection, because the patch "net/bonding: prefer allmulti to promiscuous for LACP" adds trying to use allmulti when adding a slave, and EVS bond driver also sets promisc with another thread, which may lead to thread reentry and cause failure to set promiscuous mode.

Fixes cb7b6606ebff ("net/hinic: add RSS stats and promiscuous ops")
---
 drivers/net/hinic/hinic_pmd_ethdev.c | 34 ++++++++++++++++++++++++++++++----
 drivers/net/hinic/hinic_pmd_ethdev.h |  1 +
 2 files changed, 31 insertions(+), 4 deletions(-)
drivers/net/hinic/hinic_pmd_ethdev.c +30 -4
index 0c3e1c0..8de9714 100644
@@ -1271,14 +1271,25 @@ static void hinic_disable_interrupt(struct rte_eth_dev *dev)
 
 static int hinic_set_dev_promiscuous(struct hinic_nic_dev *nic_dev, bool enable)
 {
-	u32 rx_mode_ctrl = nic_dev->rx_mode_status;
+	u32 rx_mode_ctrl;
+	int err;
+
+	err = hinic_mutex_lock(&nic_dev->rx_mode_mutex);
+	if (err)
+		return err;
+
+	rx_mode_ctrl = nic_dev->rx_mode_status;
 
 	if (enable)
 		rx_mode_ctrl |= HINIC_RX_MODE_PROMISC;
 	else
 		rx_mode_ctrl &= (~HINIC_RX_MODE_PROMISC);
 
-	return hinic_config_rx_mode(nic_dev, rx_mode_ctrl);
+	err = hinic_config_rx_mode(nic_dev, rx_mode_ctrl);
+
+	(void)hinic_mutex_unlock(&nic_dev->rx_mode_mutex);
+
+	return err;
 }
 
 /**
@@ -1731,14 +1742,25 @@ static void hinic_remove_all_vlanid(struct rte_eth_dev *eth_dev)
 static int hinic_set_dev_allmulticast(struct hinic_nic_dev *nic_dev,
 				bool enable)
 {
-	u32 rx_mode_ctrl = nic_dev->rx_mode_status;
+	u32 rx_mode_ctrl;
+	int err;
+
+	err = hinic_mutex_lock(&nic_dev->rx_mode_mutex);
+	if (err)
+		return err;
+
+	rx_mode_ctrl = nic_dev->rx_mode_status;
 
 	if (enable)
 		rx_mode_ctrl |= HINIC_RX_MODE_MC_ALL;
 	else
 		rx_mode_ctrl &= (~HINIC_RX_MODE_MC_ALL);
 
-	return hinic_config_rx_mode(nic_dev, rx_mode_ctrl);
+	err = hinic_config_rx_mode(nic_dev, rx_mode_ctrl);
+
+	(void)hinic_mutex_unlock(&nic_dev->rx_mode_mutex);
+
+	return err;
 }
 
 /**
@@ -3130,6 +3152,8 @@ static int hinic_func_init(struct rte_eth_dev *eth_dev)
 	}
 	rte_bit_relaxed_set32(HINIC_DEV_INTR_EN, &nic_dev->dev_status);
 
+	hinic_mutex_init(&nic_dev->rx_mode_mutex, NULL);
+
 	/* initialize filter info */
 	filter_info = &nic_dev->filter;
 	tcam_info = &nic_dev->tcam;
@@ -3204,6 +3228,8 @@ static int hinic_dev_uninit(struct rte_eth_dev *dev)
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return 0;
 
+	hinic_mutex_destroy(&nic_dev->rx_mode_mutex);
+
 	hinic_dev_close(dev);
 
 	dev->dev_ops = NULL;
drivers/net/hinic/hinic_pmd_ethdev.h +1 -0
index 77b4b91..3f2d51d 100644
@@ -329,6 +329,7 @@ struct hinic_nic_dev {
 	unsigned int flags;
 	struct nic_service_cap nic_cap;
 	u32 rx_mode_status;	/* promisc or allmulticast */
+	pthread_mutex_t rx_mode_mutex;
 	u32 dev_status;
 
 	char proc_dev_name[HINIC_DEV_NAME_LEN];
Signature · 1 line
1.8.3.1
#4 lore raw

PATCH 4/5 net/hinic: add tcam filter switch for FDIR

In reply to Xiaoyun wang

When the filter rule needs to use the TCAM method, PMD driver enables the TCAM filter switch, otherwise disables it, which can improve the performance of microcode in FDIR scenarios that not use TCAM method.

Fixes 1fe89aa37f36 ("net/hinic: add flow director filter")
---
 drivers/net/hinic/base/hinic_pmd_cmd.h    |  1 +
 drivers/net/hinic/base/hinic_pmd_niccfg.c | 41 +++++++++++++++++++++++++++++++
 drivers/net/hinic/base/hinic_pmd_niccfg.h | 11 +++++++++
 drivers/net/hinic/hinic_pmd_flow.c        | 13 ++++++++++
 4 files changed, 66 insertions(+)
drivers/net/hinic/base/hinic_pmd_cmd.h +1 -0
index 09918a7..9ecb712 100644
@@ -120,6 +120,7 @@ enum hinic_port_cmd {
 	HINIC_PORT_CMD_UP_TC_GET_FLOW		= 0xb1,
 	HINIC_PORT_CMD_UP_TC_FLUSH_TCAM		= 0xb2,
 	HINIC_PORT_CMD_UP_TC_CTRL_TCAM_BLOCK	= 0xb3,
+	HINIC_PORT_CMD_UP_TC_ENABLE		= 0xb4,
 
 	HINIC_PORT_CMD_SET_IPSU_MAC		= 0xcb,
 	HINIC_PORT_CMD_GET_IPSU_MAC		= 0xcc,
drivers/net/hinic/base/hinic_pmd_niccfg.c +41 -0

44 lines not on this page · raw message

drivers/net/hinic/base/hinic_pmd_niccfg.h +11 -0
index 846b597..73b16b4 100644
@@ -766,6 +766,15 @@ struct hinic_port_qfilter_info {
 	u32 key;
 };
 
+struct hinic_port_tcam_info {
+	struct hinic_mgmt_msg_head mgmt_msg_head;
+
+	u16 func_id;
+	u8 tcam_enable;
+	u8 rsvd1;
+	u32 rsvd2;
+};
+
 #define HINIC_MAX_TCAM_RULES_NUM   (10240)
 #define HINIC_TCAM_BLOCK_ENABLE      1
 #define HINIC_TCAM_BLOCK_DISABLE     0
@@ -941,4 +950,6 @@ int hinic_set_fdir_tcam(void *hwdev, u16 type_mask,
 
 int hinic_flush_tcam_rule(void *hwdev);
 
+int hinic_set_fdir_tcam_rule_filter(void *hwdev, bool enable);
+
 #endif /* _HINIC_PMD_NICCFG_H_ */
drivers/net/hinic/hinic_pmd_flow.c +13 -0
index cc0744d..a7bad57 100644
@@ -1900,6 +1900,8 @@ void hinic_free_fdir_filter(struct hinic_nic_dev *nic_dev)
 {
 	(void)hinic_set_fdir_filter(nic_dev->hwdev, 0, 0, 0, false);
 
+	(void)hinic_set_fdir_tcam_rule_filter(nic_dev->hwdev, false);
+
 	(void)hinic_clear_fdir_tcam(nic_dev->hwdev, TCAM_PKT_BGP_DPORT);
 
 	(void)hinic_clear_fdir_tcam(nic_dev->hwdev, TCAM_PKT_BGP_SPORT);
@@ -2801,6 +2803,15 @@ static int hinic_add_tcam_filter(struct rte_eth_dev *dev,
 						fdir_tcam_rule->index);
 			return rc;
 		}
+
+		rc = hinic_set_fdir_tcam_rule_filter(nic_dev->hwdev, true);
+		if (rc && rc != HINIC_MGMT_CMD_UNSUPPORTED) {
+			(void)hinic_set_fdir_filter(nic_dev->hwdev, 0, 0, 0,
+						false);
+			(void)hinic_del_tcam_rule(nic_dev->hwdev,
+						fdir_tcam_rule->index);
+			return rc;
+		}
 	}
 
 	TAILQ_INSERT_TAIL(&tcam_info->tcam_list, tcam_filter, entries);
@@ -3197,6 +3208,8 @@ static void hinic_clear_all_fdir_filter(struct rte_eth_dev *dev)
 
 	(void)hinic_set_fdir_filter(nic_dev->hwdev, 0, 0, 0, false);
 
+	(void)hinic_set_fdir_tcam_rule_filter(nic_dev->hwdev, false);
+
 	(void)hinic_flush_tcam_rule(nic_dev->hwdev);
 }
 
Signature · 1 line
1.8.3.1
#5 lore raw

PATCH 5/5 net/hinic/base: modify return errors

In reply to Xiaoyun wang

Modify return errors with linux system errors when system requests fail.

---
 drivers/net/hinic/base/hinic_pmd_cfg.c    |   4 +-
 drivers/net/hinic/base/hinic_pmd_hwdev.c  |  16 ++---
 drivers/net/hinic/base/hinic_pmd_hwif.c   |   4 +-
 drivers/net/hinic/base/hinic_pmd_niccfg.c | 104 +++++++++++++++---------------
 drivers/net/hinic/base/hinic_pmd_nicio.c  |   6 +-
 5 files changed, 66 insertions(+), 68 deletions(-)
drivers/net/hinic/base/hinic_pmd_cfg.c +2 -2
index 2d25dc9..a0cc16d 100644
@@ -179,7 +179,7 @@ static int get_cap_from_fw(struct hinic_hwdev *dev, enum func_type type)
 	if (err || dev_cap.mgmt_msg_head.status || !out_len) {
 		PMD_DRV_LOG(ERR, "Get capability from FW failed, err: %d, status: %d, out_len: %d",
 			err, dev_cap.mgmt_msg_head.status, out_len);
-		return -EFAULT;
+		return -EIO;
 	}
 
 	parse_dev_cap(dev, &dev_cap, type);
@@ -201,7 +201,7 @@ static int get_cap_from_pf(struct hinic_hwdev *dev, enum func_type type)
 	if (err || dev_cap.mgmt_msg_head.status || !out_len) {
 		PMD_DRV_LOG(ERR, "Get capability from PF failed, err: %d, status: %d, out_len: %d",
 				err, dev_cap.mgmt_msg_head.status, out_len);
-		return -EFAULT;
+		return -EIO;
 	}
 
 	parse_dev_cap(dev, &dev_cap, type);
drivers/net/hinic/base/hinic_pmd_hwdev.c +7 -9
index a93f240..2af3bd9 100644
@@ -475,7 +475,7 @@ static int wait_for_flr_finish(struct hinic_hwif *hwif)
 		rte_delay_ms(10);
 	} while (time_before(jiffies, end));
 
-	return -EFAULT;
+	return -ETIME;
 }
 
 #define HINIC_WAIT_CMDQ_IDLE_TIMEOUT		1000
@@ -681,17 +681,15 @@ int hinic_set_interrupt_cfg(struct hinic_hwdev *hwdev,
 	u16 out_size = sizeof(msix_cfg);
 	int err;
 
-	memset(&msix_cfg, 0, sizeof(msix_cfg));
-	msix_cfg.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
-	msix_cfg.func_id = hinic_global_func_id(hwdev);
-	msix_cfg.msix_index = (u16)interrupt_info.msix_index;
-
 	temp_info.msix_index = interrupt_info.msix_index;
-
 	err = hinic_get_interrupt_cfg(hwdev, &temp_info);
 	if (err)
-		return -EINVAL;
+		return -EIO;
 
+	memset(&msix_cfg, 0, sizeof(msix_cfg));
+	msix_cfg.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
+	msix_cfg.func_id = hinic_global_func_id(hwdev);
+	msix_cfg.msix_index = (u16)interrupt_info.msix_index;
 	msix_cfg.lli_credit_cnt = temp_info.lli_credit_limit;
 	msix_cfg.lli_tmier_cnt = temp_info.lli_timer_cfg;
 	msix_cfg.pending_cnt = temp_info.pending_limt;
@@ -1051,7 +1049,7 @@ int hinic_get_board_info(void *hwdev, struct hinic_board_info *info)
 	if (err || board_info.mgmt_msg_head.status || !out_size) {
 		PMD_DRV_LOG(ERR, "Failed to get board info, err: %d, status: 0x%x, out size: 0x%x",
 			err, board_info.mgmt_msg_head.status, out_size);
-		return -EFAULT;
+		return -EIO;
 	}
 
 	memcpy(info, &board_info.info, sizeof(*info));
drivers/net/hinic/base/hinic_pmd_hwif.c +2 -2
index 4578b68..a485cf0 100644
@@ -321,7 +321,7 @@ int wait_until_doorbell_flush_states(struct hinic_hwif *hwif,
 		rte_delay_ms(1);
 	} while (time_before(jiffies, end));
 
-	return -EFAULT;
+	return -ETIME;
 }
 
 static int wait_until_doorbell_and_outbound_enabled(struct hinic_hwif *hwif)
@@ -343,7 +343,7 @@ static int wait_until_doorbell_and_outbound_enabled(struct hinic_hwif *hwif)
 		rte_delay_ms(1);
 	} while (time_before(jiffies, end));
 
-	return -EFAULT;
+	return -ETIME;
 }
 
 u16 hinic_global_func_id(void *hwdev)
drivers/net/hinic/base/hinic_pmd_niccfg.c +52 -52

416 lines not on this page · raw message

drivers/net/hinic/base/hinic_pmd_nicio.c +3 -3
index 7ec3e4c..2914e99 100644
@@ -314,7 +314,7 @@ static int init_sq_ctxts(struct hinic_nic_io *nic_io)
 		if (err || out_param != 0) {
 			PMD_DRV_LOG(ERR, "Failed to set SQ ctxts, err: %d",
 				err);
-			err = -EFAULT;
+			err = -EIO;
 			break;
 		}
 
@@ -371,7 +371,7 @@ static int init_rq_ctxts(struct hinic_nic_io *nic_io)
 					     cmd_buf, &out_param, 0);
 		if ((err) || out_param != 0) {
 			PMD_DRV_LOG(ERR, "Failed to set RQ ctxts");
-			err = -EFAULT;
+			err = -EIO;
 			break;
 		}
 
@@ -422,7 +422,7 @@ static int clean_queue_offload_ctxt(struct hinic_nic_io *nic_io,
 
 	if ((err) || (out_param)) {
 		PMD_DRV_LOG(ERR, "Failed to clean queue offload ctxts");
-		err = -EFAULT;
+		err = -EIO;
 	}
 
 	hinic_free_cmd_buf(hwdev, cmd_buf);
Signature · 1 line
1.8.3.1
#6 lore raw

Re: [dpdk-dev] [PATCH v1 5/5] net/hinic/base: modify return errors

Quoted 4 lines · Xiaoyun wang

Modify return errors with linux system errors when system requests fail.

<...>

drivers/net/hinic/base/hinic_pmd_hwdev.c static int wait_for_flr_finish(struct hinic_hwif *hwif) · line 479

Quoted 7 lines
drivers/net/hinic/base/hinic_pmd_hwdev.c +1 -1
@@ -475,7 +475,7 @@ static int wait_for_flr_finish(struct hinic_hwif *hwif)
 		rte_delay_ms(10);
 	} while (time_before(jiffies, end));
 
-	return -EFAULT;
+	return -ETIME;
 }

Hi Xiaoyun,

'ETIME' is not defined in FreeBSD and was causing build error [1]. I have reverted the 'ETIME' changes in this patch (3 occurances) back.

Can you please do an incremental patch if 'EFAULT' errors needs to be replaced?

Thanks,
ferruh

[1]
http://mails.dpdk.org/archives/test-report/2020-July/142068.html

#7 lore raw
In reply to Xiaoyun wang
Quoted 14 lines · Xiaoyun wang

This patch adds multi-thread resource protection when setting promiscuous or allmulticast mode, adds bufout and out size parameter for mgmt sync channel and removes unused parameters for mgmt channel with no ack, adds TCAM filter switch for FDIR, and modifies return errors.

--
v1:
- add out parameter for mgmt sync channel
- remove unused parameter
- fix setting promiscuous mode problem
- add tcam filter switch for FDIR
- modify return errors

Quoted 6 lines

Xiaoyun wang (5):
net/hinic/base: add out parameter for mgmt sync channel net/hinic/base: remove unused parameter net/hinic: fix setting promiscuous mode problem net/hinic: add tcam filter switch for FDIR net/hinic/base: modify return errors

Series applied to dpdk-next-net/master, thanks.