From 3d43972b1b4281d5fcdae80504bde9164a737253 Mon Sep 17 00:00:00 2001 From: Hemant Agrawal Date: Wed, 24 Feb 2021 18:13:00 +0530 Subject: [PATCH] net/dpaa2: do not drop parse error packets by dpdmux DPDMUX should not drop parse error packets. They shall be left to the decision of the connected DPNI interfaces Signed-off-by: Hemant Agrawal --- 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.20.1