diff mbox series

[net-next,11/11] bnxt_en: Use "enable_ecn" devlink param

Message ID 1584458246-29370-5-git-send-email-vasundhara-v.volam@broadcom.com
State Changes Requested
Delegated to: David Miller
Headers show
Series bnxt_en updates to devlink cmd | expand

Commit Message

Vasundhara Volam March 17, 2020, 3:17 p.m. UTC
From: Pavan Chebbi <pavan.chebbi@broadcom.com>

Add support for "enable_ecn" devlink parameter with configuration
mode as permanent and runtime. Also update bnxt.rst documentation
file.

Signed-off-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
 Documentation/networking/devlink/bnxt.rst         |  2 +
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 81 ++++++++++++++++++++---
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h |  1 +
 3 files changed, 73 insertions(+), 11 deletions(-)
diff mbox series

Patch

diff --git a/Documentation/networking/devlink/bnxt.rst b/Documentation/networking/devlink/bnxt.rst
index 17b6522..5541826 100644
--- a/Documentation/networking/devlink/bnxt.rst
+++ b/Documentation/networking/devlink/bnxt.rst
@@ -22,6 +22,8 @@  Parameters
      - Permanent
    * - ``msix_vec_per_pf_min``
      - Permanent
+   * - ``enable_ecn``
+     - Permanent, runtime
 
 The ``bnxt`` driver also implements the following driver-specific
 parameters.
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index 6065602..53274be 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -312,6 +312,8 @@  enum bnxt_dl_param_id {
 	 NVM_OFF_MSIX_VEC_PER_PF_MAX, BNXT_NVM_SHARED_CFG, 10, 4},
 	{DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN,
 	 NVM_OFF_MSIX_VEC_PER_PF_MIN, BNXT_NVM_SHARED_CFG, 7, 4},
+	{DEVLINK_PARAM_GENERIC_ID_ENABLE_ECN, NVM_OFF_ENABLE_ECN,
+	 BNXT_NVM_SHARED_CFG, 1, 1},
 	{BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK, NVM_OFF_DIS_GRE_VER_CHECK,
 	 BNXT_NVM_SHARED_CFG, 1, 1},
 };
@@ -626,15 +628,42 @@  static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
 static int bnxt_dl_nvm_param_get(struct devlink *dl, u32 id,
 				 struct devlink_param_gset_ctx *ctx)
 {
-	struct hwrm_nvm_get_variable_input req = {0};
 	struct bnxt *bp = bnxt_get_bp_from_dl(dl);
 	int rc;
 
-	bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_GET_VARIABLE, -1, -1);
-	rc = bnxt_hwrm_nvm_req(bp, id, &req, sizeof(req), &ctx->val);
-	if (!rc)
-		if (id == BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK)
-			ctx->val.vbool = !ctx->val.vbool;
+	if (ctx->cmode == DEVLINK_PARAM_CMODE_PERMANENT) {
+		struct hwrm_nvm_get_variable_input req = {0};
+
+		bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_GET_VARIABLE, -1, -1);
+		rc = bnxt_hwrm_nvm_req(bp, id, &req, sizeof(req), &ctx->val);
+		if (!rc)
+			if (id == BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK)
+				ctx->val.vbool = !ctx->val.vbool;
+	} else if (ctx->cmode == DEVLINK_PARAM_CMODE_RUNTIME) {
+		switch (id) {
+		case DEVLINK_PARAM_GENERIC_ID_ENABLE_ECN:
+		{
+			struct hwrm_fw_ecn_qcfg_input req = {0};
+			struct hwrm_fw_ecn_qcfg_output *resp =
+				bp->hwrm_cmd_resp_addr;
+
+			bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FW_ECN_QCFG,
+					       -1, -1);
+			rc = hwrm_send_message(bp, &req, sizeof(req),
+					       HWRM_CMD_TIMEOUT);
+			if (!rc) {
+				if (resp->flags &
+				    FW_ECN_QCFG_RESP_FLAGS_ENABLE_ECN)
+					ctx->val.vbool = true;
+			}
+			break;
+		}
+		default:
+			netdev_err(bp->dev, "Unsupported devlink parameter\n");
+			rc = -EOPNOTSUPP;
+			break;
+		}
+	}
 
 	return rc;
 }
@@ -642,15 +671,40 @@  static int bnxt_dl_nvm_param_get(struct devlink *dl, u32 id,
 static int bnxt_dl_nvm_param_set(struct devlink *dl, u32 id,
 				 struct devlink_param_gset_ctx *ctx)
 {
-	struct hwrm_nvm_set_variable_input req = {0};
 	struct bnxt *bp = bnxt_get_bp_from_dl(dl);
+	int rc;
 
-	bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_SET_VARIABLE, -1, -1);
+	if (ctx->cmode == DEVLINK_PARAM_CMODE_PERMANENT) {
+		struct hwrm_nvm_set_variable_input req = {0};
 
-	if (id == BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK)
-		ctx->val.vbool = !ctx->val.vbool;
+		if (id == BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK)
+			ctx->val.vbool = !ctx->val.vbool;
 
-	return bnxt_hwrm_nvm_req(bp, id, &req, sizeof(req), &ctx->val);
+		bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_SET_VARIABLE, -1, -1);
+		rc = bnxt_hwrm_nvm_req(bp, id, &req, sizeof(req), &ctx->val);
+	} else if (ctx->cmode == DEVLINK_PARAM_CMODE_RUNTIME) {
+		switch (id) {
+		case DEVLINK_PARAM_GENERIC_ID_ENABLE_ECN:
+		{
+			struct hwrm_fw_ecn_cfg_input req = {0};
+
+			bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FW_ECN_CFG,
+					       -1, -1);
+			if (ctx->val.vbool)
+				req.flags =
+				cpu_to_le32(FW_ECN_CFG_REQ_FLAGS_ENABLE_ECN);
+			rc = hwrm_send_message(bp, &req, sizeof(req),
+					       HWRM_CMD_TIMEOUT);
+			break;
+		}
+		default:
+			netdev_err(bp->dev, "Unsupported devlink parameter\n");
+			rc = -EOPNOTSUPP;
+			break;
+		}
+	}
+
+	return rc;
 }
 
 static int bnxt_dl_msix_validate(struct devlink *dl, u32 id,
@@ -690,6 +744,11 @@  static int bnxt_dl_msix_validate(struct devlink *dl, u32 id,
 			      BIT(DEVLINK_PARAM_CMODE_PERMANENT),
 			      bnxt_dl_nvm_param_get, bnxt_dl_nvm_param_set,
 			      bnxt_dl_msix_validate),
+	DEVLINK_PARAM_GENERIC(ENABLE_ECN,
+			      BIT(DEVLINK_PARAM_CMODE_PERMANENT) |
+			      BIT(DEVLINK_PARAM_CMODE_RUNTIME),
+			      bnxt_dl_nvm_param_get, bnxt_dl_nvm_param_set,
+			      NULL),
 	DEVLINK_PARAM_DRIVER(BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK,
 			     "gre_ver_check", DEVLINK_PARAM_TYPE_BOOL,
 			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h
index e720b1d..71ba65a 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h
@@ -38,6 +38,7 @@  static inline void bnxt_link_bp_to_dl(struct bnxt *bp, struct devlink *dl)
 #define NVM_OFF_MSIX_VEC_PER_PF_MIN	114
 #define NVM_OFF_IGNORE_ARI		164
 #define NVM_OFF_DIS_GRE_VER_CHECK	171
+#define NVM_OFF_ENABLE_ECN		173
 #define NVM_OFF_ENABLE_SRIOV		401
 #define NVM_OFF_NVM_CFG_VER		602