Thread (62 messages) 62 messages, 3 authors, 2021-02-24

[dpdk-dev] [PATCH v3 12/23] net/dpaa2: support dpdmux to not drop parse err pkts

From: Hemant Agrawal <hidden>
Date: 2021-02-24 12:44:59
Subsystem: networking drivers, the rest · Maintainers: Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds

DPDMUX should not drop parse error packets. They shall
be left to the decision of the connected DPNI interfaces

Signed-off-by: Hemant Agrawal <redacted>
---
 drivers/net/dpaa2/dpaa2_mux.c         |  18 ++++
 drivers/net/dpaa2/mc/dpdmux.c         |  37 +++++++++
 drivers/net/dpaa2/mc/fsl_dpdmux.h     | 113 +++++++++++++++++++++++++-
 drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h |  25 ++++--
 4 files changed, 187 insertions(+), 6 deletions(-)
diff --git a/drivers/net/dpaa2/dpaa2_mux.c b/drivers/net/dpaa2/dpaa2_mux.c
index 1ff00ca8f7..811f417491 100644
--- a/drivers/net/dpaa2/dpaa2_mux.c
+++ b/drivers/net/dpaa2/dpaa2_mux.c
@@ -324,6 +324,24 @@ dpaa2_create_dpdmux_device(int vdev_fd __rte_unused,
 		}
 	}
 
+	if (maj_ver >= 6 && min_ver >= 9) {
+		struct dpdmux_error_cfg mux_err_cfg;
+
+		memset(&mux_err_cfg, 0, sizeof(mux_err_cfg));
+		mux_err_cfg.error_action = DPDMUX_ERROR_ACTION_CONTINUE;
+		mux_err_cfg.errors = DPDMUX_ERROR_DISC;
+
+		ret = dpdmux_if_set_errors_behavior(&dpdmux_dev->dpdmux,
+				CMD_PRI_LOW,
+				dpdmux_dev->token, dpdmux_id,
+				&mux_err_cfg);
+		if (ret) {
+			DPAA2_PMD_ERR("dpdmux_if_set_errors_behavior %s err %d",
+				      __func__, ret);
+			goto init_err;
+		}
+	}
+
 	dpdmux_dev->dpdmux_id = dpdmux_id;
 	dpdmux_dev->num_ifs = attr.num_ifs;
 
diff --git a/drivers/net/dpaa2/mc/dpdmux.c b/drivers/net/dpaa2/mc/dpdmux.c
index 57c811c70f..93912ef9d3 100644
--- a/drivers/net/dpaa2/mc/dpdmux.c
+++ b/drivers/net/dpaa2/mc/dpdmux.c
@@ -1012,3 +1012,40 @@ int dpdmux_get_api_version(struct fsl_mc_io *mc_io,
 
 	return 0;
 }
+
+/**
+ * dpdmux_if_set_errors_behavior() - Set errors behavior
+ * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:	Token of DPSW object
+ * @if_id:  Interface Identifier
+ * @cfg:	Errors configuration
+ *
+ * Provides a set of frame errors that will be rejected or accepted by the
+ * dpdmux interface. The frame with this errors will no longer be dropped by
+ * the dpdmux interface. When frame has parsing error the distribution to
+ * expected interface may fail. If the frame must be distributed using the
+ * information from a header that was not parsed due errors the frame may
+ * be discarded or end up on a default interface because needed data was not
+ * parsed properly.
+ * This function may be called numerous times with different error masks
+ *
+ * Return:	'0' on Success; Error code otherwise.
+ */
+int dpdmux_if_set_errors_behavior(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
+		uint16_t token, uint16_t if_id, struct dpdmux_error_cfg *cfg)
+{
+	struct mc_command cmd = { 0 };
+	struct dpdmux_cmd_set_errors_behavior *cmd_params;
+
+	/* prepare command */
+	cmd.header = mc_encode_cmd_header(DPDMUX_CMDID_SET_ERRORS_BEHAVIOR,
+					cmd_flags,
+					token);
+	cmd_params = (struct dpdmux_cmd_set_errors_behavior *)cmd.params;
+	cmd_params->errors = cpu_to_le32(cfg->errors);
+	dpdmux_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action);
+	cmd_params->if_id = cpu_to_le16(if_id);
+
+	/* send command to mc*/
+	return mc_send_command(mc_io, &cmd);
+}
diff --git a/drivers/net/dpaa2/mc/fsl_dpdmux.h b/drivers/net/dpaa2/mc/fsl_dpdmux.h
index dc067b81cd..f4f9598a29 100644
--- a/drivers/net/dpaa2/mc/fsl_dpdmux.h
+++ b/drivers/net/dpaa2/mc/fsl_dpdmux.h
@@ -39,6 +39,12 @@ int dpdmux_close(struct fsl_mc_io *mc_io,
  */
 #define DPDMUX_OPT_CLS_MASK_SUPPORT		0x0000000000000020ULL
 
+/**
+ * Automatic max frame length - maximum frame length for dpdmux interface will
+ * be changed automatically by connected dpni objects.
+ */
+#define DPDMUX_OPT_AUTO_MAX_FRAME_LEN	0x0000000000000040ULL
+
 #define DPDMUX_IRQ_INDEX_IF	0x0000
 #define DPDMUX_IRQ_INDEX	0x0001
 
@@ -203,6 +209,7 @@ int dpdmux_set_max_frame_length(struct fsl_mc_io *mc_io,
  * @DPDMUX_CNT_EGR_FRAME: Counts egress frames
  * @DPDMUX_CNT_EGR_BYTE: Counts egress bytes
  * @DPDMUX_CNT_EGR_FRAME_DISCARD: Counts discarded egress frames
+ * @DPDMUX_CNT_ING_NO_BUFFER_DISCARD: Counts ingress no buffer discard frames
  */
 enum dpdmux_counter_type {
 	DPDMUX_CNT_ING_FRAME = 0x0,
@@ -215,7 +222,8 @@ enum dpdmux_counter_type {
 	DPDMUX_CNT_ING_BCAST_BYTES = 0x7,
 	DPDMUX_CNT_EGR_FRAME = 0x8,
 	DPDMUX_CNT_EGR_BYTE = 0x9,
-	DPDMUX_CNT_EGR_FRAME_DISCARD = 0xa
+	DPDMUX_CNT_EGR_FRAME_DISCARD = 0xa,
+	DPDMUX_CNT_ING_NO_BUFFER_DISCARD = 0xb,
 };
 
 /**
@@ -447,4 +455,107 @@ int dpdmux_get_api_version(struct fsl_mc_io *mc_io,
 			   uint16_t *major_ver,
 			   uint16_t *minor_ver);
 
+/**
+ * Discard bit. This bit must be used together with other bits in
+ * DPDMUX_ERROR_ACTION_CONTINUE to disable discarding of frames containing
+ * errors
+ */
+#define DPDMUX_ERROR_DISC		0x80000000
+/**
+ * MACSEC is enabled
+ */
+#define DPDMUX_ERROR_MS			0x40000000
+/**
+ * PTP event frame
+ */
+#define DPDMUX_ERROR_PTP			0x08000000
+/**
+ * This is a multicast frame
+ */
+#define DPDMUX_ERROR_MC			0x04000000
+/**
+ * This is a broadcast frame
+ */
+#define DPDMUX_ERROR_BC			0x02000000
+/**
+ * Invalid Key composition or key size error
+ */
+#define DPDMUX_ERROR_KSE			0x00040000
+/**
+ * Extract out of frame header
+ */
+#define DPDMUX_ERROR_EOFHE		0x00020000
+/**
+ * Maximum number of chained lookups is reached
+ */
+#define DPDMUX_ERROR_MNLE			0x00010000
+/**
+ * Invalid table ID
+ */
+#define DPDMUX_ERROR_TIDE			0x00008000
+/**
+ * Policer initialization entry error
+ */
+#define DPDMUX_ERROR_PIEE			0x00004000
+/**
+ * Frame length error
+ */
+#define DPDMUX_ERROR_FLE			0x00002000
+/**
+ * Frame physical error
+ */
+#define DPDMUX_ERROR_FPE			0x00001000
+/**
+ * Cycle limit is exceeded and frame parsing is forced to terminate early
+ */
+#define DPDMUX_ERROR_PTE			0x00000080
+/**
+ * Invalid softparse instruction is encountered
+ */
+#define DPDMUX_ERROR_ISP			0x00000040
+/**
+ * Parsing header error
+ */
+#define DPDMUX_ERROR_PHE			0x00000020
+/*
+ * Block limit is exceeded. Maximum data that can be read and parsed is 256
+ * bytes.
+ * Parser will set this bit if it needs more that this limit to parse.
+ */
+#define DPDMUX_ERROR_BLE			0x00000010
+/**
+ * L3 checksum validation
+ */
+#define DPDMUX__ERROR_L3CV			0x00000008
+/**
+ * L3 checksum error
+ */
+#define DPDMUX__ERROR_L3CE			0x00000004
+/**
+ * L4 checksum validation
+ */
+#define DPDMUX__ERROR_L4CV			0x00000002
+/**
+ * L4 checksum error
+ */
+#define DPDMUX__ERROR_L4CE			0x00000001
+
+enum dpdmux_error_action {
+	DPDMUX_ERROR_ACTION_DISCARD = 0,
+	DPDMUX_ERROR_ACTION_CONTINUE = 1
+};
+
+/**
+ * Configure how dpdmux interface behaves on errors
+ * @errors - or'ed combination of DPDMUX_ERROR_*
+ * @action - set to DPDMUX_ERROR_ACTION_DISCARD or DPDMUX_ERROR_ACTION_CONTINUE
+ */
+struct dpdmux_error_cfg {
+	uint32_t errors;
+	enum dpdmux_error_action error_action;
+};
+
+int dpdmux_if_set_errors_behavior(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
+		uint16_t token, uint16_t if_id, struct dpdmux_error_cfg *cfg);
+
 #endif /* __FSL_DPDMUX_H */
diff --git a/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h b/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h
index 2444e9a2e5..2ab4d75dfb 100644
--- a/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h
+++ b/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h
@@ -9,30 +9,35 @@
 
 /* DPDMUX Version */
 #define DPDMUX_VER_MAJOR		6
-#define DPDMUX_VER_MINOR		3
+#define DPDMUX_VER_MINOR		9
 
 #define DPDMUX_CMD_BASE_VERSION		1
 #define DPDMUX_CMD_VERSION_2		2
+#define DPDMUX_CMD_VERSION_3		3
+#define DPDMUX_CMD_VERSION_4		4
 #define DPDMUX_CMD_ID_OFFSET		4
 
 #define DPDMUX_CMD(id)	(((id) << DPDMUX_CMD_ID_OFFSET) |\
 				DPDMUX_CMD_BASE_VERSION)
 #define DPDMUX_CMD_V2(id) (((id) << DPDMUX_CMD_ID_OFFSET) | \
 				DPDMUX_CMD_VERSION_2)
+#define DPDMUX_CMD_V3(id)	(((id) << DPDMUX_CMD_ID_OFFSET) |\
+				DPDMUX_CMD_VERSION_3)
+#define DPDMUX_CMD_V4(id)	(((id) << DPDMUX_CMD_ID_OFFSET) |\
+				DPDMUX_CMD_VERSION_4)
 
 /* Command IDs */
 #define DPDMUX_CMDID_CLOSE			DPDMUX_CMD(0x800)
 #define DPDMUX_CMDID_OPEN			DPDMUX_CMD(0x806)
-#define DPDMUX_CMDID_CREATE			DPDMUX_CMD(0x906)
+#define DPDMUX_CMDID_CREATE			DPDMUX_CMD_V4(0x906)
 #define DPDMUX_CMDID_DESTROY			DPDMUX_CMD(0x986)
 #define DPDMUX_CMDID_GET_API_VERSION		DPDMUX_CMD(0xa06)
 
 #define DPDMUX_CMDID_ENABLE			DPDMUX_CMD(0x002)
 #define DPDMUX_CMDID_DISABLE			DPDMUX_CMD(0x003)
-#define DPDMUX_CMDID_GET_ATTR			DPDMUX_CMD(0x004)
+#define DPDMUX_CMDID_GET_ATTR			DPDMUX_CMD_V2(0x004)
 #define DPDMUX_CMDID_RESET			DPDMUX_CMD(0x005)
 #define DPDMUX_CMDID_IS_ENABLED			DPDMUX_CMD(0x006)
-
 #define DPDMUX_CMDID_SET_MAX_FRAME_LENGTH	DPDMUX_CMD(0x0a1)
 
 #define DPDMUX_CMDID_UL_RESET_COUNTERS		DPDMUX_CMD(0x0a3)
@@ -49,7 +54,7 @@
 #define DPDMUX_CMDID_IF_GET_LINK_STATE		DPDMUX_CMD_V2(0x0b4)
 
 #define DPDMUX_CMDID_SET_CUSTOM_KEY		DPDMUX_CMD(0x0b5)
-#define DPDMUX_CMDID_ADD_CUSTOM_CLS_ENTRY	DPDMUX_CMD(0x0b6)
+#define DPDMUX_CMDID_ADD_CUSTOM_CLS_ENTRY	DPDMUX_CMD_V2(0x0b6)
 #define DPDMUX_CMDID_REMOVE_CUSTOM_CLS_ENTRY	DPDMUX_CMD(0x0b7)
 
 #define DPDMUX_CMDID_IF_SET_DEFAULT		DPDMUX_CMD(0x0b8)
@@ -57,6 +62,7 @@
 
 #define DPDMUX_CMDID_SET_RESETABLE		DPDMUX_CMD(0x0ba)
 #define DPDMUX_CMDID_GET_RESETABLE		DPDMUX_CMD(0x0bb)
+#define DPDMUX_CMDID_SET_ERRORS_BEHAVIOR	DPDMUX_CMD(0x0bf)
 
 #define DPDMUX_MASK(field)        \
 	GENMASK(DPDMUX_##field##_SHIFT + DPDMUX_##field##_SIZE - 1, \
@@ -233,5 +239,14 @@ struct dpdmux_rsp_get_skip_reset_flags {
 	uint8_t skip_reset_flags;
 };
 
+#define DPDMUX_ERROR_ACTION_SHIFT		0
+#define DPDMUX_ERROR_ACTION_SIZE		4
+
+struct dpdmux_cmd_set_errors_behavior {
+	uint32_t errors;
+	uint16_t flags;
+	uint16_t if_id;
+};
+
 #pragma pack(pop)
 #endif /* _FSL_DPDMUX_CMD_H */
-- 
2.17.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help