netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [Patch v3 net-next 0/7] ethtool support for fec and link configuration
@ 2021-02-01  5:24 Hariprasad Kelam
  2021-02-01  5:24 ` [Patch v3 net-next 1/7] octeontx2-af: forward error correction configuration Hariprasad Kelam
                   ` (7 more replies)
  0 siblings, 8 replies; 22+ messages in thread
From: Hariprasad Kelam @ 2021-02-01  5:24 UTC (permalink / raw)
  To: netdev, linux-kernel
  Cc: kuba, davem, willemdebruijn.kernel, andrew, sgoutham, lcherian,
	gakula, jerinj, sbhatta, hkelam

This series of patches add support for forward error correction(fec) and
physical link configuration. Patches 1&2 adds necessary mbox handlers for fec
mode configuration request and to fetch stats. Patch 3 registers driver
callbacks for fec mode configuration and display. Patch 4&5 adds support of mbox
handlers for configuring link parameters like speed/duplex and autoneg etc.
Patche 6&7 registers driver callbacks for physical link configuration.

Change-log:
v2:
	- Fixed review comments
	- Corrected indentation issues
        - Return -ENOMEM incase of mbox allocation failure
	- added validation for input fecparams bitmask values
        - added more comments

V3:
	- Removed inline functions
        - Make use of ethtool helpers APIs to display supported
          advertised modes
        - corrected indentation issues
        - code changes such that return early in case of failure
          to aid branch prediction


Christina Jacob (6):
  octeontx2-af: forward error correction configuration
  octeontx2-pf: ethtool fec mode support
  octeontx2-af: Physical link configuration support
  octeontx2-af: advertised link modes support on cgx
  octeontx2-pf: ethtool physical link status
  octeontx2-pf: ethtool physical link configuration

Felix Manlunas (1):
  octeontx2-af: Add new CGX_CMD to get PHY FEC statistics

 drivers/net/ethernet/marvell/octeontx2/af/cgx.c    | 258 ++++++++++++-
 drivers/net/ethernet/marvell/octeontx2/af/cgx.h    |  10 +
 .../net/ethernet/marvell/octeontx2/af/cgx_fw_if.h  |  70 +++-
 drivers/net/ethernet/marvell/octeontx2/af/mbox.h   |  87 ++++-
 drivers/net/ethernet/marvell/octeontx2/af/rvu.h    |   4 +
 .../net/ethernet/marvell/octeontx2/af/rvu_cgx.c    |  80 +++++
 .../ethernet/marvell/octeontx2/nic/otx2_common.c   |  20 ++
 .../ethernet/marvell/octeontx2/nic/otx2_common.h   |   6 +
 .../ethernet/marvell/octeontx2/nic/otx2_ethtool.c  | 399 ++++++++++++++++++++-
 .../net/ethernet/marvell/octeontx2/nic/otx2_pf.c   |   3 +
 10 files changed, 930 insertions(+), 7 deletions(-)

--
2.7.4

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [Patch v3 net-next 1/7] octeontx2-af: forward error correction configuration
  2021-02-01  5:24 [Patch v3 net-next 0/7] ethtool support for fec and link configuration Hariprasad Kelam
@ 2021-02-01  5:24 ` Hariprasad Kelam
  2021-02-03  0:43   ` Jesse Brandeburg
  2021-02-01  5:24 ` [Patch v3 net-next 2/7] octeontx2-af: Add new CGX_CMD to get PHY FEC statistics Hariprasad Kelam
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 22+ messages in thread
From: Hariprasad Kelam @ 2021-02-01  5:24 UTC (permalink / raw)
  To: netdev, linux-kernel
  Cc: kuba, davem, willemdebruijn.kernel, andrew, sgoutham, lcherian,
	gakula, jerinj, sbhatta, hkelam

From: Christina Jacob <cjacob@marvell.com>

CGX block supports forward error correction modes baseR
and RS. This patch adds support to set encoding mode
and to read corrected/uncorrected block counters

Adds new mailbox handlers set_fec to configure encoding modes
and fec_stats to read counters and also increase mbox timeout
to accomdate firmware command response timeout.

Along with new CGX_CMD_SET_FEC command add other commands to
sync with kernel enum list with firmware.

Signed-off-by: Christina Jacob <cjacob@marvell.com>
Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
---
 drivers/net/ethernet/marvell/octeontx2/af/cgx.c    | 76 ++++++++++++++++++++++
 drivers/net/ethernet/marvell/octeontx2/af/cgx.h    |  7 ++
 .../net/ethernet/marvell/octeontx2/af/cgx_fw_if.h  | 17 ++++-
 drivers/net/ethernet/marvell/octeontx2/af/mbox.h   | 22 ++++++-
 .../net/ethernet/marvell/octeontx2/af/rvu_cgx.c    | 31 +++++++++
 5 files changed, 151 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
index 84a9123..fe5512d 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
@@ -340,6 +340,60 @@ int cgx_get_tx_stats(void *cgxd, int lmac_id, int idx, u64 *tx_stat)
 	return 0;
 }
 
+static int cgx_set_fec_stats_count(struct cgx_link_user_info *linfo)
+{
+	if (!linfo->fec)
+		return 0;
+
+	switch (linfo->lmac_type_id) {
+	case LMAC_MODE_SGMII:
+	case LMAC_MODE_XAUI:
+	case LMAC_MODE_RXAUI:
+	case LMAC_MODE_QSGMII:
+		return 0;
+	case LMAC_MODE_10G_R:
+	case LMAC_MODE_25G_R:
+	case LMAC_MODE_100G_R:
+	case LMAC_MODE_USXGMII:
+		return 1;
+	case LMAC_MODE_40G_R:
+		return 4;
+	case LMAC_MODE_50G_R:
+		if (linfo->fec == OTX2_FEC_BASER)
+			return 2;
+		else
+			return 1;
+	default:
+		return 0;
+	}
+}
+
+int cgx_get_fec_stats(void *cgxd, int lmac_id, struct cgx_fec_stats_rsp *rsp)
+{
+	int stats, fec_stats_count = 0;
+	int corr_reg, uncorr_reg;
+	struct cgx *cgx = cgxd;
+
+	if (!cgx || lmac_id >= cgx->lmac_count)
+		return -ENODEV;
+	fec_stats_count =
+		cgx_set_fec_stats_count(&cgx->lmac_idmap[lmac_id]->link_info);
+	if (cgx->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_BASER) {
+		corr_reg = CGXX_SPUX_LNX_FEC_CORR_BLOCKS;
+		uncorr_reg = CGXX_SPUX_LNX_FEC_UNCORR_BLOCKS;
+	} else {
+		corr_reg = CGXX_SPUX_RSFEC_CORR;
+		uncorr_reg = CGXX_SPUX_RSFEC_UNCORR;
+	}
+	for (stats = 0; stats < fec_stats_count; stats++) {
+		rsp->fec_corr_blks +=
+			cgx_read(cgx, lmac_id, corr_reg + (stats * 8));
+		rsp->fec_uncorr_blks +=
+			cgx_read(cgx, lmac_id, uncorr_reg + (stats * 8));
+	}
+	return 0;
+}
+
 int cgx_lmac_rx_tx_enable(void *cgxd, int lmac_id, bool enable)
 {
 	struct cgx *cgx = cgxd;
@@ -615,6 +669,7 @@ static inline void link_status_user_format(u64 lstat,
 	linfo->link_up = FIELD_GET(RESP_LINKSTAT_UP, lstat);
 	linfo->full_duplex = FIELD_GET(RESP_LINKSTAT_FDUPLEX, lstat);
 	linfo->speed = cgx_speed_mbps[FIELD_GET(RESP_LINKSTAT_SPEED, lstat)];
+	linfo->fec = FIELD_GET(RESP_LINKSTAT_FEC, lstat);
 	linfo->lmac_type_id = cgx_get_lmac_type(cgx, lmac_id);
 	lmac_string = cgx_lmactype_string[linfo->lmac_type_id];
 	strncpy(linfo->lmac_type, lmac_string, LMACTYPE_STR_LEN - 1);
@@ -785,6 +840,27 @@ int cgx_get_fwdata_base(u64 *base)
 	return err;
 }
 
+int cgx_set_fec(u64 fec, int cgx_id, int lmac_id)
+{
+	u64 req = 0, resp;
+	struct cgx *cgx;
+	int err = 0;
+
+	cgx = cgx_get_pdata(cgx_id);
+	if (!cgx)
+		return -ENXIO;
+
+	req = FIELD_SET(CMDREG_ID, CGX_CMD_SET_FEC, req);
+	req = FIELD_SET(CMDSETFEC, fec, req);
+	err = cgx_fwi_cmd_generic(req, &resp, cgx, lmac_id);
+	if (err)
+		return err;
+
+	cgx->lmac_idmap[lmac_id]->link_info.fec =
+			FIELD_GET(RESP_LINKSTAT_FEC, resp);
+	return cgx->lmac_idmap[lmac_id]->link_info.fec;
+}
+
 static int cgx_fwi_link_change(struct cgx *cgx, int lmac_id, bool enable)
 {
 	u64 req = 0;
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.h b/drivers/net/ethernet/marvell/octeontx2/af/cgx.h
index bcfc3e5..1824e95 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.h
@@ -56,6 +56,11 @@
 #define CGXX_SCRATCH1_REG		0x1058
 #define CGX_CONST			0x2000
 #define CGXX_SPUX_CONTROL1		0x10000
+#define CGXX_SPUX_LNX_FEC_CORR_BLOCKS	0x10700
+#define CGXX_SPUX_LNX_FEC_UNCORR_BLOCKS	0x10800
+#define CGXX_SPUX_RSFEC_CORR		0x10088
+#define CGXX_SPUX_RSFEC_UNCORR		0x10090
+
 #define CGXX_SPUX_CONTROL1_LBK		BIT_ULL(14)
 #define CGXX_GMP_PCS_MRX_CTL		0x30000
 #define CGXX_GMP_PCS_MRX_CTL_LBK	BIT_ULL(14)
@@ -147,5 +152,7 @@ int cgx_lmac_set_pause_frm(void *cgxd, int lmac_id,
 			   u8 tx_pause, u8 rx_pause);
 void cgx_lmac_ptp_config(void *cgxd, int lmac_id, bool enable);
 u8 cgx_lmac_get_p2x(int cgx_id, int lmac_id);
+int cgx_set_fec(u64 fec, int cgx_id, int lmac_id);
+int cgx_get_fec_stats(void *cgxd, int lmac_id, struct cgx_fec_stats_rsp *rsp);
 
 #endif /* CGX_H */
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
index c3702fa..3485596 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
@@ -81,6 +81,14 @@ enum cgx_cmd_id {
 	CGX_CMD_GET_MKEX_PRFL_SIZE,
 	CGX_CMD_GET_MKEX_PRFL_ADDR,
 	CGX_CMD_GET_FWD_BASE,		/* get base address of shared FW data */
+	CGX_CMD_GET_LINK_MODES,		/* Supported Link Modes */
+	CGX_CMD_SET_LINK_MODE,
+	CGX_CMD_GET_SUPPORTED_FEC,
+	CGX_CMD_SET_FEC,
+	CGX_CMD_GET_AN,
+	CGX_CMD_SET_AN,
+	CGX_CMD_GET_ADV_LINK_MODES,
+	CGX_CMD_GET_ADV_FEC,
 };
 
 /* async event ids */
@@ -171,13 +179,19 @@ struct cgx_lnk_sts {
 	uint64_t full_duplex:1;
 	uint64_t speed:4;		/* cgx_link_speed */
 	uint64_t err_type:10;
-	uint64_t reserved2:39;
+	uint64_t an:1;			/* AN supported or not */
+	uint64_t fec:2;			/* FEC type if enabled, if not 0 */
+	uint64_t port:8;
+	uint64_t reserved2:28;
 };
 
 #define RESP_LINKSTAT_UP		GENMASK_ULL(9, 9)
 #define RESP_LINKSTAT_FDUPLEX		GENMASK_ULL(10, 10)
 #define RESP_LINKSTAT_SPEED		GENMASK_ULL(14, 11)
 #define RESP_LINKSTAT_ERRTYPE		GENMASK_ULL(24, 15)
+#define RESP_LINKSTAT_AN		GENMASK_ULL(25, 25)
+#define RESP_LINKSTAT_FEC		GENMASK_ULL(27, 26)
+#define RESP_LINKSTAT_PORT		GENMASK_ULL(35, 28)
 
 /* scratchx(1) CSR used for non-secure SW->ATF communication
  * This CSR acts as a command register
@@ -199,4 +213,5 @@ struct cgx_lnk_sts {
 #define CMDLINKCHANGE_FULLDPLX	BIT_ULL(9)
 #define CMDLINKCHANGE_SPEED	GENMASK_ULL(13, 10)
 
+#define CMDSETFEC			GENMASK_ULL(9, 8)
 #endif /* __CGX_FW_INTF_H__ */
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
index 89e93eb..a59a355 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
@@ -36,7 +36,7 @@
 
 #define INTR_MASK(pfvfs) ((pfvfs < 64) ? (BIT_ULL(pfvfs) - 1) : (~0ull))
 
-#define MBOX_RSP_TIMEOUT	2000 /* Time(ms) to wait for mbox response */
+#define MBOX_RSP_TIMEOUT	3000 /* Time(ms) to wait for mbox response */
 
 #define MBOX_MSG_ALIGN		16  /* Align mbox msg start to 16bytes */
 
@@ -149,6 +149,9 @@ M(CGX_PTP_RX_ENABLE,	0x20C, cgx_ptp_rx_enable, msg_req, msg_rsp)	\
 M(CGX_PTP_RX_DISABLE,	0x20D, cgx_ptp_rx_disable, msg_req, msg_rsp)	\
 M(CGX_CFG_PAUSE_FRM,	0x20E, cgx_cfg_pause_frm, cgx_pause_frm_cfg,	\
 			       cgx_pause_frm_cfg)			\
+M(CGX_FEC_SET,		0x210, cgx_set_fec_param, fec_mode, fec_mode)   \
+M(CGX_FEC_STATS,	0x211, cgx_fec_stats, msg_req, cgx_fec_stats_rsp) \
+ /* NPA mbox IDs (range 0x400 - 0x5FF) */				\
 /* NPA mbox IDs (range 0x400 - 0x5FF) */				\
 M(NPA_LF_ALLOC,		0x400, npa_lf_alloc,				\
 				npa_lf_alloc_req, npa_lf_alloc_rsp)	\
@@ -360,6 +363,11 @@ struct cgx_stats_rsp {
 	u64 tx_stats[CGX_TX_STATS_COUNT];
 };
 
+struct cgx_fec_stats_rsp {
+	struct mbox_msghdr hdr;
+	u64 fec_corr_blks;
+	u64 fec_uncorr_blks;
+};
 /* Structure for requesting the operation for
  * setting/getting mac address in the CGX interface
  */
@@ -373,6 +381,7 @@ struct cgx_link_user_info {
 	uint64_t full_duplex:1;
 	uint64_t lmac_type_id:4;
 	uint64_t speed:20; /* speed in Mbps */
+	uint64_t fec:2;	 /* FEC type if enabled else 0 */
 #define LMACTYPE_STR_LEN 16
 	char lmac_type[LMACTYPE_STR_LEN];
 };
@@ -391,6 +400,17 @@ struct cgx_pause_frm_cfg {
 	u8 tx_pause;
 };
 
+enum fec_type {
+	OTX2_FEC_NONE,
+	OTX2_FEC_BASER,
+	OTX2_FEC_RS,
+};
+
+struct fec_mode {
+	struct mbox_msghdr hdr;
+	int fec;
+};
+
 /* NPA mbox message formats */
 
 /* NPA mailbox error codes
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c
index 6c6b411..0d806c5 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c
@@ -462,6 +462,22 @@ int rvu_mbox_handler_cgx_stats(struct rvu *rvu, struct msg_req *req,
 	return 0;
 }
 
+int rvu_mbox_handler_cgx_fec_stats(struct rvu *rvu,
+				   struct msg_req *req,
+				   struct cgx_fec_stats_rsp *rsp)
+{
+	int pf = rvu_get_pf(req->hdr.pcifunc);
+	u8 cgx_idx, lmac;
+	void *cgxd;
+
+	if (!is_cgx_config_permitted(rvu, req->hdr.pcifunc))
+		return -EPERM;
+	rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_idx, &lmac);
+
+	cgxd = rvu_cgx_pdata(cgx_idx, rvu);
+	return cgx_get_fec_stats(cgxd, lmac, rsp);
+}
+
 int rvu_mbox_handler_cgx_mac_addr_set(struct rvu *rvu,
 				      struct cgx_mac_addr_set_or_get *req,
 				      struct cgx_mac_addr_set_or_get *rsp)
@@ -767,3 +783,18 @@ int rvu_cgx_start_stop_io(struct rvu *rvu, u16 pcifunc, bool start)
 	mutex_unlock(&rvu->cgx_cfg_lock);
 	return err;
 }
+
+int rvu_mbox_handler_cgx_set_fec_param(struct rvu *rvu,
+				       struct fec_mode *req,
+				       struct fec_mode *rsp)
+{
+	int pf = rvu_get_pf(req->hdr.pcifunc);
+	u8 cgx_id, lmac_id;
+
+	if (!is_pf_cgxmapped(rvu, pf))
+		return -EPERM;
+
+	rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id);
+	rsp->fec = cgx_set_fec(req->fec, cgx_id, lmac_id);
+	return 0;
+}
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Patch v3 net-next 2/7] octeontx2-af: Add new CGX_CMD to get PHY FEC statistics
  2021-02-01  5:24 [Patch v3 net-next 0/7] ethtool support for fec and link configuration Hariprasad Kelam
  2021-02-01  5:24 ` [Patch v3 net-next 1/7] octeontx2-af: forward error correction configuration Hariprasad Kelam
@ 2021-02-01  5:24 ` Hariprasad Kelam
  2021-02-03  0:43   ` Jesse Brandeburg
  2021-02-01  5:24 ` [Patch v3 net-next 3/7] octeontx2-pf: ethtool fec mode support Hariprasad Kelam
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 22+ messages in thread
From: Hariprasad Kelam @ 2021-02-01  5:24 UTC (permalink / raw)
  To: netdev, linux-kernel
  Cc: kuba, davem, willemdebruijn.kernel, andrew, sgoutham, lcherian,
	gakula, jerinj, sbhatta, hkelam

From: Felix Manlunas <fmanlunas@marvell.com>

This patch adds support to fetch fec stats from PHY. The stats are
put in the shared data struct fwdata.  A PHY driver indicates
that it has FEC stats by setting the flag fwdata.phy.misc.has_fec_stats

Besides CGX_CMD_GET_PHY_FEC_STATS, also add CGX_CMD_PRBS and
CGX_CMD_DISPLAY_EYE to enum cgx_cmd_id so that Linux's enum list is in sync
with firmware's enum list.

Signed-off-by: Felix Manlunas <fmanlunas@marvell.com>
Signed-off-by: Christina Jacob <cjacob@marvell.com>
Signed-off-by: Sunil Kovvuri Goutham <Sunil.Goutham@cavium.com>
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
---
 drivers/net/ethernet/marvell/octeontx2/af/cgx.c    | 12 ++++++
 drivers/net/ethernet/marvell/octeontx2/af/cgx.h    |  1 +
 .../net/ethernet/marvell/octeontx2/af/cgx_fw_if.h  |  5 +++
 drivers/net/ethernet/marvell/octeontx2/af/mbox.h   | 43 ++++++++++++++++++++++
 drivers/net/ethernet/marvell/octeontx2/af/rvu.h    |  4 ++
 .../net/ethernet/marvell/octeontx2/af/rvu_cgx.c    | 32 ++++++++++++++++
 6 files changed, 97 insertions(+)

diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
index fe5512d..b636341 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
@@ -861,6 +861,18 @@ int cgx_set_fec(u64 fec, int cgx_id, int lmac_id)
 	return cgx->lmac_idmap[lmac_id]->link_info.fec;
 }
 
+int cgx_get_phy_fec_stats(void *cgxd, int lmac_id)
+{
+	struct cgx *cgx = cgxd;
+	u64 req = 0, resp;
+
+	if (!cgx)
+		return -ENODEV;
+
+	req = FIELD_SET(CMDREG_ID, CGX_CMD_GET_PHY_FEC_STATS, req);
+	return cgx_fwi_cmd_generic(req, &resp, cgx, lmac_id);
+}
+
 static int cgx_fwi_link_change(struct cgx *cgx, int lmac_id, bool enable)
 {
 	u64 req = 0;
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.h b/drivers/net/ethernet/marvell/octeontx2/af/cgx.h
index 1824e95..c5294b7 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.h
@@ -154,5 +154,6 @@ void cgx_lmac_ptp_config(void *cgxd, int lmac_id, bool enable);
 u8 cgx_lmac_get_p2x(int cgx_id, int lmac_id);
 int cgx_set_fec(u64 fec, int cgx_id, int lmac_id);
 int cgx_get_fec_stats(void *cgxd, int lmac_id, struct cgx_fec_stats_rsp *rsp);
+int cgx_get_phy_fec_stats(void *cgxd, int lmac_id);
 
 #endif /* CGX_H */
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
index 3485596..65f832a 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
@@ -89,6 +89,11 @@ enum cgx_cmd_id {
 	CGX_CMD_SET_AN,
 	CGX_CMD_GET_ADV_LINK_MODES,
 	CGX_CMD_GET_ADV_FEC,
+	CGX_CMD_GET_PHY_MOD_TYPE, /* line-side modulation type: NRZ or PAM4 */
+	CGX_CMD_SET_PHY_MOD_TYPE,
+	CGX_CMD_PRBS,
+	CGX_CMD_DISPLAY_EYE,
+	CGX_CMD_GET_PHY_FEC_STATS,
 };
 
 /* async event ids */
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
index a59a355..204040e 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
@@ -151,6 +151,8 @@ M(CGX_CFG_PAUSE_FRM,	0x20E, cgx_cfg_pause_frm, cgx_pause_frm_cfg,	\
 			       cgx_pause_frm_cfg)			\
 M(CGX_FEC_SET,		0x210, cgx_set_fec_param, fec_mode, fec_mode)   \
 M(CGX_FEC_STATS,	0x211, cgx_fec_stats, msg_req, cgx_fec_stats_rsp) \
+M(CGX_GET_PHY_FEC_STATS, 0x212, cgx_get_phy_fec_stats, msg_req, msg_rsp) \
+M(CGX_FW_DATA_GET,	0x213, cgx_get_aux_link_info, msg_req, cgx_fw_data) \
  /* NPA mbox IDs (range 0x400 - 0x5FF) */				\
 /* NPA mbox IDs (range 0x400 - 0x5FF) */				\
 M(NPA_LF_ALLOC,		0x400, npa_lf_alloc,				\
@@ -411,6 +413,47 @@ struct fec_mode {
 	int fec;
 };
 
+struct sfp_eeprom_s {
+#define SFP_EEPROM_SIZE 256
+	u16 sff_id;
+	u8 buf[SFP_EEPROM_SIZE];
+	u64 reserved;
+};
+
+struct phy_s {
+	struct {
+		u64 can_change_mod_type:1;
+		u64 mod_type:1;
+		u64 has_fec_stats:1;
+	} misc;
+	struct fec_stats_s {
+		u32 rsfec_corr_cws;
+		u32 rsfec_uncorr_cws;
+		u32 brfec_corr_blks;
+		u32 brfec_uncorr_blks;
+	} fec_stats;
+};
+
+struct cgx_lmac_fwdata_s {
+	u16 rw_valid;
+	u64 supported_fec;
+	u64 supported_an;
+	u64 supported_link_modes;
+	/* only applicable if AN is supported */
+	u64 advertised_fec;
+	u64 advertised_link_modes;
+	/* Only applicable if SFP/QSFP slot is present */
+	struct sfp_eeprom_s sfp_eeprom;
+	struct phy_s phy;
+#define LMAC_FWDATA_RESERVED_MEM 1021
+	u64 reserved[LMAC_FWDATA_RESERVED_MEM];
+};
+
+struct cgx_fw_data {
+	struct mbox_msghdr hdr;
+	struct cgx_lmac_fwdata_s fwdata;
+};
+
 /* NPA mbox message formats */
 
 /* NPA mailbox error codes
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
index b1a6ecf..49b493b 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
@@ -350,6 +350,10 @@ struct rvu_fwdata {
 	u64 msixtr_base;
 #define FWDATA_RESERVED_MEM 1023
 	u64 reserved[FWDATA_RESERVED_MEM];
+#define CGX_MAX         5
+#define CGX_LMACS_MAX   4
+	struct cgx_lmac_fwdata_s cgx_fw_data[CGX_MAX][CGX_LMACS_MAX];
+	/* Do not add new fields below this line */
 };
 
 struct ptp;
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c
index 0d806c5..c6fd2d5 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c
@@ -692,6 +692,19 @@ int rvu_mbox_handler_cgx_cfg_pause_frm(struct rvu *rvu,
 	return 0;
 }
 
+int rvu_mbox_handler_cgx_get_phy_fec_stats(struct rvu *rvu, struct msg_req *req,
+					   struct msg_rsp *rsp)
+{
+	int pf = rvu_get_pf(req->hdr.pcifunc);
+	u8 cgx_id, lmac_id;
+
+	if (!is_pf_cgxmapped(rvu, pf))
+		return -EPERM;
+
+	rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id);
+	return cgx_get_phy_fec_stats(rvu_cgx_pdata(cgx_id, rvu), lmac_id);
+}
+
 /* Finds cumulative status of NIX rx/tx counters from LF of a PF and those
  * from its VFs as well. ie. NIX rx/tx counters at the CGX port level
  */
@@ -798,3 +811,22 @@ int rvu_mbox_handler_cgx_set_fec_param(struct rvu *rvu,
 	rsp->fec = cgx_set_fec(req->fec, cgx_id, lmac_id);
 	return 0;
 }
+
+int rvu_mbox_handler_cgx_get_aux_link_info(struct rvu *rvu, struct msg_req *req,
+					   struct cgx_fw_data *rsp)
+{
+	int pf = rvu_get_pf(req->hdr.pcifunc);
+	u8 cgx_id, lmac_id;
+
+	if (!rvu->fwdata)
+		return -ENXIO;
+
+	if (!is_pf_cgxmapped(rvu, pf))
+		return -EPERM;
+
+	rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id);
+
+	memcpy(&rsp->fwdata, &rvu->fwdata->cgx_fw_data[cgx_id][lmac_id],
+	       sizeof(struct cgx_lmac_fwdata_s));
+	return 0;
+}
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Patch v3 net-next 3/7] octeontx2-pf: ethtool fec mode support
  2021-02-01  5:24 [Patch v3 net-next 0/7] ethtool support for fec and link configuration Hariprasad Kelam
  2021-02-01  5:24 ` [Patch v3 net-next 1/7] octeontx2-af: forward error correction configuration Hariprasad Kelam
  2021-02-01  5:24 ` [Patch v3 net-next 2/7] octeontx2-af: Add new CGX_CMD to get PHY FEC statistics Hariprasad Kelam
@ 2021-02-01  5:24 ` Hariprasad Kelam
  2021-02-03  0:44   ` Jesse Brandeburg
  2021-02-03  1:12   ` Jakub Kicinski
  2021-02-01  5:24 ` [Patch v3 net-next 4/7] octeontx2-af: Physical link configuration support Hariprasad Kelam
                   ` (4 subsequent siblings)
  7 siblings, 2 replies; 22+ messages in thread
From: Hariprasad Kelam @ 2021-02-01  5:24 UTC (permalink / raw)
  To: netdev, linux-kernel
  Cc: kuba, davem, willemdebruijn.kernel, andrew, sgoutham, lcherian,
	gakula, jerinj, sbhatta, hkelam

From: Christina Jacob <cjacob@marvell.com>

Add ethtool support to configure fec modes baser/rs and
support to fecth FEC stats from CGX as well PHY.

Configure fec mode
	- ethtool --set-fec eth0 encoding rs/baser/off/auto
Query fec mode
	- ethtool --show-fec eth0

Signed-off-by: Christina Jacob <cjacob@marvell.com>
Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
---
 .../ethernet/marvell/octeontx2/nic/otx2_common.c   |  20 +++
 .../ethernet/marvell/octeontx2/nic/otx2_common.h   |   6 +
 .../ethernet/marvell/octeontx2/nic/otx2_ethtool.c  | 181 ++++++++++++++++++++-
 .../net/ethernet/marvell/octeontx2/nic/otx2_pf.c   |   3 +
 4 files changed, 208 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
index 5ddedc3..1e67072 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
@@ -60,6 +60,19 @@ void otx2_update_lmac_stats(struct otx2_nic *pfvf)
 	mutex_unlock(&pfvf->mbox.lock);
 }
 
+void otx2_update_lmac_fec_stats(struct otx2_nic *pfvf)
+{
+	struct msg_req *req;
+
+	if (!netif_running(pfvf->netdev))
+		return;
+	mutex_lock(&pfvf->mbox.lock);
+	req = otx2_mbox_alloc_msg_cgx_fec_stats(&pfvf->mbox);
+	if (req)
+		otx2_sync_mbox_msg(&pfvf->mbox);
+	mutex_unlock(&pfvf->mbox.lock);
+}
+
 int otx2_update_rq_stats(struct otx2_nic *pfvf, int qidx)
 {
 	struct otx2_rcv_queue *rq = &pfvf->qset.rq[qidx];
@@ -1492,6 +1505,13 @@ void mbox_handler_cgx_stats(struct otx2_nic *pfvf,
 		pfvf->hw.cgx_tx_stats[id] = rsp->tx_stats[id];
 }
 
+void mbox_handler_cgx_fec_stats(struct otx2_nic *pfvf,
+				struct cgx_fec_stats_rsp *rsp)
+{
+	pfvf->hw.cgx_fec_corr_blks += rsp->fec_corr_blks;
+	pfvf->hw.cgx_fec_uncorr_blks += rsp->fec_uncorr_blks;
+}
+
 void mbox_handler_nix_txsch_alloc(struct otx2_nic *pf,
 				  struct nix_txsch_alloc_rsp *rsp)
 {
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
index 143ae04..b3f3de9 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
@@ -204,6 +204,8 @@ struct otx2_hw {
 	struct otx2_drv_stats	drv_stats;
 	u64			cgx_rx_stats[CGX_RX_STATS_COUNT];
 	u64			cgx_tx_stats[CGX_TX_STATS_COUNT];
+	u64			cgx_fec_corr_blks;
+	u64			cgx_fec_uncorr_blks;
 	u8			cgx_links;  /* No. of CGX links present in HW */
 	u8			lbk_links;  /* No. of LBK links present in HW */
 };
@@ -660,6 +662,9 @@ void mbox_handler_nix_txsch_alloc(struct otx2_nic *pf,
 				  struct nix_txsch_alloc_rsp *rsp);
 void mbox_handler_cgx_stats(struct otx2_nic *pfvf,
 			    struct cgx_stats_rsp *rsp);
+void mbox_handler_cgx_fec_stats(struct otx2_nic *pfvf,
+				struct cgx_fec_stats_rsp *rsp);
+void otx2_set_fec_stats_count(struct otx2_nic *pfvf);
 void mbox_handler_nix_bp_enable(struct otx2_nic *pfvf,
 				struct nix_bp_cfg_rsp *rsp);
 
@@ -668,6 +673,7 @@ void otx2_get_dev_stats(struct otx2_nic *pfvf);
 void otx2_get_stats64(struct net_device *netdev,
 		      struct rtnl_link_stats64 *stats);
 void otx2_update_lmac_stats(struct otx2_nic *pfvf);
+void otx2_update_lmac_fec_stats(struct otx2_nic *pfvf);
 int otx2_update_rq_stats(struct otx2_nic *pfvf, int qidx);
 int otx2_update_sq_stats(struct otx2_nic *pfvf, int qidx);
 void otx2_set_ethtool_ops(struct net_device *netdev);
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
index e0199f0..e5b1a57 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
@@ -66,6 +66,8 @@ static const unsigned int otx2_n_dev_stats = ARRAY_SIZE(otx2_dev_stats);
 static const unsigned int otx2_n_drv_stats = ARRAY_SIZE(otx2_drv_stats);
 static const unsigned int otx2_n_queue_stats = ARRAY_SIZE(otx2_queue_stats);
 
+static struct cgx_fw_data *otx2_get_fwdata(struct otx2_nic *pfvf);
+
 static void otx2_get_drvinfo(struct net_device *netdev,
 			     struct ethtool_drvinfo *info)
 {
@@ -128,6 +130,12 @@ static void otx2_get_strings(struct net_device *netdev, u32 sset, u8 *data)
 
 	strcpy(data, "reset_count");
 	data += ETH_GSTRING_LEN;
+	if (pfvf->linfo.fec) {
+		sprintf(data, "Fec Corrected Errors: ");
+		data += ETH_GSTRING_LEN;
+		sprintf(data, "Fec Uncorrected Errors: ");
+		data += ETH_GSTRING_LEN;
+	}
 }
 
 static void otx2_get_qset_stats(struct otx2_nic *pfvf,
@@ -160,11 +168,30 @@ static void otx2_get_qset_stats(struct otx2_nic *pfvf,
 	}
 }
 
+static int otx2_get_phy_fec_stats(struct otx2_nic *pfvf)
+{
+	struct msg_req *req;
+	int rc = -ENOMEM;
+
+	mutex_lock(&pfvf->mbox.lock);
+	req = otx2_mbox_alloc_msg_cgx_get_phy_fec_stats(&pfvf->mbox);
+	if (!req)
+		goto end;
+
+	if (!otx2_sync_mbox_msg(&pfvf->mbox))
+		rc = 0;
+end:
+	mutex_unlock(&pfvf->mbox.lock);
+	return rc;
+}
+
 /* Get device and per queue statistics */
 static void otx2_get_ethtool_stats(struct net_device *netdev,
 				   struct ethtool_stats *stats, u64 *data)
 {
 	struct otx2_nic *pfvf = netdev_priv(netdev);
+	u64 fec_corr_blks, fec_uncorr_blks;
+	struct cgx_fw_data *rsp;
 	int stat;
 
 	otx2_get_dev_stats(pfvf);
@@ -183,12 +210,43 @@ static void otx2_get_ethtool_stats(struct net_device *netdev,
 	for (stat = 0; stat < CGX_TX_STATS_COUNT; stat++)
 		*(data++) = pfvf->hw.cgx_tx_stats[stat];
 	*(data++) = pfvf->reset_count;
+
+	/* Do not request fec stats if interface fec mode is none */
+	if (pfvf->linfo.fec == OTX2_FEC_NONE)
+		return;
+
+	fec_corr_blks = pfvf->hw.cgx_fec_corr_blks;
+	fec_uncorr_blks = pfvf->hw.cgx_fec_uncorr_blks;
+
+	rsp = otx2_get_fwdata(pfvf);
+	if (!IS_ERR(rsp) && rsp->fwdata.phy.misc.has_fec_stats &&
+	    !otx2_get_phy_fec_stats(pfvf)) {
+		/* Fetch fwdata again because it's been recently populated with
+		 * latest PHY FEC stats.
+		 */
+		rsp = otx2_get_fwdata(pfvf);
+		if (!IS_ERR(rsp)) {
+			struct fec_stats_s *p = &rsp->fwdata.phy.fec_stats;
+
+			if (pfvf->linfo.fec == OTX2_FEC_BASER) {
+				fec_corr_blks   = p->brfec_corr_blks;
+				fec_uncorr_blks = p->brfec_uncorr_blks;
+			} else {
+				fec_corr_blks   = p->rsfec_corr_cws;
+				fec_uncorr_blks = p->rsfec_uncorr_cws;
+			}
+		}
+	}
+
+	*(data++) = fec_corr_blks;
+	*(data++) = fec_uncorr_blks;
 }
 
 static int otx2_get_sset_count(struct net_device *netdev, int sset)
 {
 	struct otx2_nic *pfvf = netdev_priv(netdev);
-	int qstats_count;
+	int qstats_count, fec_stats_count = 0;
+	bool if_up = netif_running(netdev);
 
 	if (sset != ETH_SS_STATS)
 		return -EINVAL;
@@ -196,8 +254,16 @@ static int otx2_get_sset_count(struct net_device *netdev, int sset)
 	qstats_count = otx2_n_queue_stats *
 		       (pfvf->hw.rx_queues + pfvf->hw.tx_queues);
 
+	/* Do not show fec stats if interface fec mode is none */
+	if (!if_up || !pfvf->linfo.fec)
+		return otx2_n_dev_stats + otx2_n_drv_stats + qstats_count +
+			CGX_RX_STATS_COUNT + CGX_TX_STATS_COUNT + 1;
+
+	fec_stats_count = 2;
+	otx2_update_lmac_fec_stats(pfvf);
+
 	return otx2_n_dev_stats + otx2_n_drv_stats + qstats_count +
-		CGX_RX_STATS_COUNT + CGX_TX_STATS_COUNT + 1;
+	       CGX_RX_STATS_COUNT + CGX_TX_STATS_COUNT + 1 + fec_stats_count;
 }
 
 /* Get no of queues device supports and current queue count */
@@ -859,6 +925,115 @@ static int otx2_get_ts_info(struct net_device *netdev,
 	return 0;
 }
 
+static struct cgx_fw_data *otx2_get_fwdata(struct otx2_nic *pfvf)
+{
+	struct cgx_fw_data *rsp = NULL;
+	struct msg_req *req;
+	int err = 0;
+
+	mutex_lock(&pfvf->mbox.lock);
+	req = otx2_mbox_alloc_msg_cgx_get_aux_link_info(&pfvf->mbox);
+	if (!req) {
+		mutex_unlock(&pfvf->mbox.lock);
+		return ERR_PTR(-ENOMEM);
+	}
+
+	err = otx2_sync_mbox_msg(&pfvf->mbox);
+	if (!err) {
+		rsp = (struct cgx_fw_data *)
+			otx2_mbox_get_rsp(&pfvf->mbox.mbox, 0, &req->hdr);
+	} else {
+		rsp = ERR_PTR(err);
+	}
+
+	mutex_unlock(&pfvf->mbox.lock);
+	return rsp;
+}
+
+static int otx2_get_fecparam(struct net_device *netdev,
+			     struct ethtool_fecparam *fecparam)
+{
+	struct otx2_nic *pfvf = netdev_priv(netdev);
+	struct cgx_fw_data *rsp;
+	const int fec[] = {
+		ETHTOOL_FEC_OFF,
+		ETHTOOL_FEC_BASER,
+		ETHTOOL_FEC_RS,
+		ETHTOOL_FEC_BASER | ETHTOOL_FEC_RS};
+#define FEC_MAX_INDEX 3
+	if (pfvf->linfo.fec < FEC_MAX_INDEX)
+		fecparam->active_fec = fec[pfvf->linfo.fec];
+
+	rsp = otx2_get_fwdata(pfvf);
+	if (IS_ERR(rsp))
+		return PTR_ERR(rsp);
+
+	if (rsp->fwdata.supported_fec <= FEC_MAX_INDEX) {
+		if (!rsp->fwdata.supported_fec)
+			fecparam->fec = ETHTOOL_FEC_NONE;
+		else
+			fecparam->fec = fec[rsp->fwdata.supported_fec];
+	}
+	return 0;
+}
+
+static int otx2_set_fecparam(struct net_device *netdev,
+			     struct ethtool_fecparam *fecparam)
+{
+	struct otx2_nic *pfvf = netdev_priv(netdev);
+	struct mbox *mbox = &pfvf->mbox;
+	struct fec_mode *req, *rsp;
+	int err = 0, fec = 0;
+
+	switch (fecparam->fec) {
+	/* Firmware does not support AUTO mode consider it as FEC_NONE */
+	case ETHTOOL_FEC_OFF:
+	case ETHTOOL_FEC_AUTO:
+	case ETHTOOL_FEC_NONE:
+		fec = OTX2_FEC_NONE;
+		break;
+	case ETHTOOL_FEC_RS:
+		fec = OTX2_FEC_RS;
+		break;
+	case ETHTOOL_FEC_BASER:
+		fec = OTX2_FEC_BASER;
+		break;
+	default:
+		netdev_warn(pfvf->netdev, "Unsupported FEC mode: %d",
+			    fecparam->fec);
+		return -EINVAL;
+	}
+
+	if (fec == pfvf->linfo.fec)
+		return 0;
+
+	mutex_lock(&mbox->lock);
+	req = otx2_mbox_alloc_msg_cgx_set_fec_param(&pfvf->mbox);
+	if (!req) {
+		err = -ENOMEM;
+		goto end;
+	}
+	req->fec = fec;
+	err = otx2_sync_mbox_msg(&pfvf->mbox);
+	if (err)
+		goto end;
+
+	rsp = (struct fec_mode *)otx2_mbox_get_rsp(&pfvf->mbox.mbox,
+						   0, &req->hdr);
+	if (rsp->fec >= 0) {
+		pfvf->linfo.fec = rsp->fec;
+		/* clear stale counters */
+		pfvf->hw.cgx_fec_corr_blks = 0;
+		pfvf->hw.cgx_fec_uncorr_blks = 0;
+	} else {
+		err = rsp->fec;
+	}
+
+end:
+	mutex_unlock(&mbox->lock);
+	return err;
+}
+
 static const struct ethtool_ops otx2_ethtool_ops = {
 	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
 				     ETHTOOL_COALESCE_MAX_FRAMES,
@@ -886,6 +1061,8 @@ static const struct ethtool_ops otx2_ethtool_ops = {
 	.get_pauseparam		= otx2_get_pauseparam,
 	.set_pauseparam		= otx2_set_pauseparam,
 	.get_ts_info		= otx2_get_ts_info,
+	.get_fecparam		= otx2_get_fecparam,
+	.set_fecparam		= otx2_set_fecparam,
 };
 
 void otx2_set_ethtool_ops(struct net_device *netdev)
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
index 07ec85a..d024dac 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
@@ -779,6 +779,9 @@ static void otx2_process_pfaf_mbox_msg(struct otx2_nic *pf,
 	case MBOX_MSG_CGX_STATS:
 		mbox_handler_cgx_stats(pf, (struct cgx_stats_rsp *)msg);
 		break;
+	case MBOX_MSG_CGX_FEC_STATS:
+		mbox_handler_cgx_fec_stats(pf, (struct cgx_fec_stats_rsp *)msg);
+		break;
 	default:
 		if (msg->rc)
 			dev_err(pf->dev,
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Patch v3 net-next 4/7] octeontx2-af: Physical link configuration support
  2021-02-01  5:24 [Patch v3 net-next 0/7] ethtool support for fec and link configuration Hariprasad Kelam
                   ` (2 preceding siblings ...)
  2021-02-01  5:24 ` [Patch v3 net-next 3/7] octeontx2-pf: ethtool fec mode support Hariprasad Kelam
@ 2021-02-01  5:24 ` Hariprasad Kelam
  2021-02-03  0:44   ` Jesse Brandeburg
  2021-02-01  5:24 ` [Patch v3 net-next 5/7] octeontx2-af: advertised link modes support on cgx Hariprasad Kelam
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 22+ messages in thread
From: Hariprasad Kelam @ 2021-02-01  5:24 UTC (permalink / raw)
  To: netdev, linux-kernel
  Cc: kuba, davem, willemdebruijn.kernel, andrew, sgoutham, lcherian,
	gakula, jerinj, sbhatta, hkelam

From: Christina Jacob <cjacob@marvell.com>

CGX LMAC, the physical interface support link configuration parameters
like speed, auto negotiation, duplex  etc. Firmware saves these into
memory region shared between firmware and this driver.

This patch adds mailbox handler set_link_mode, fw_data_get to
configure and read these parameters.

Signed-off-by: Christina Jacob <cjacob@marvell.com>
Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
---
 drivers/net/ethernet/marvell/octeontx2/af/cgx.c    | 58 +++++++++++++++++++++-
 drivers/net/ethernet/marvell/octeontx2/af/cgx.h    |  2 +
 .../net/ethernet/marvell/octeontx2/af/cgx_fw_if.h  | 18 ++++++-
 drivers/net/ethernet/marvell/octeontx2/af/mbox.h   | 21 ++++++++
 .../net/ethernet/marvell/octeontx2/af/rvu_cgx.c    | 17 +++++++
 5 files changed, 113 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
index b636341..5b7d858 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
@@ -660,6 +660,39 @@ static inline void cgx_link_usertable_init(void)
 	cgx_lmactype_string[LMAC_MODE_USXGMII] = "USXGMII";
 }
 
+static int cgx_link_usertable_index_map(int speed)
+{
+	switch (speed) {
+	case SPEED_10:
+		return CGX_LINK_10M;
+	case SPEED_100:
+		return CGX_LINK_100M;
+	case SPEED_1000:
+		return CGX_LINK_1G;
+	case SPEED_2500:
+		return CGX_LINK_2HG;
+	case SPEED_5000:
+		return CGX_LINK_5G;
+	case SPEED_10000:
+		return CGX_LINK_10G;
+	case SPEED_20000:
+		return CGX_LINK_20G;
+	case SPEED_25000:
+		return CGX_LINK_25G;
+	case SPEED_40000:
+		return CGX_LINK_40G;
+	case SPEED_50000:
+		return CGX_LINK_50G;
+	case 80000:
+		return CGX_LINK_80G;
+	case SPEED_100000:
+		return CGX_LINK_100G;
+	case SPEED_UNKNOWN:
+		return CGX_LINK_NONE;
+	}
+	return CGX_LINK_NONE;
+}
+
 static inline void link_status_user_format(u64 lstat,
 					   struct cgx_link_user_info *linfo,
 					   struct cgx *cgx, u8 lmac_id)
@@ -669,6 +702,7 @@ static inline void link_status_user_format(u64 lstat,
 	linfo->link_up = FIELD_GET(RESP_LINKSTAT_UP, lstat);
 	linfo->full_duplex = FIELD_GET(RESP_LINKSTAT_FDUPLEX, lstat);
 	linfo->speed = cgx_speed_mbps[FIELD_GET(RESP_LINKSTAT_SPEED, lstat)];
+	linfo->an = FIELD_GET(RESP_LINKSTAT_AN, lstat);
 	linfo->fec = FIELD_GET(RESP_LINKSTAT_FEC, lstat);
 	linfo->lmac_type_id = cgx_get_lmac_type(cgx, lmac_id);
 	lmac_string = cgx_lmactype_string[linfo->lmac_type_id];
@@ -697,6 +731,9 @@ static inline void cgx_link_change_handler(u64 lstat,
 	lmac->link_info = event.link_uinfo;
 	linfo = &lmac->link_info;
 
+	if (err_type == CGX_ERR_SPEED_CHANGE_INVALID)
+		return;
+
 	/* Ensure callback doesn't get unregistered until we finish it */
 	spin_lock(&lmac->event_cb_lock);
 
@@ -725,7 +762,8 @@ static inline bool cgx_cmdresp_is_linkevent(u64 event)
 
 	id = FIELD_GET(EVTREG_ID, event);
 	if (id == CGX_CMD_LINK_BRING_UP ||
-	    id == CGX_CMD_LINK_BRING_DOWN)
+	    id == CGX_CMD_LINK_BRING_DOWN ||
+	    id == CGX_CMD_MODE_CHANGE)
 		return true;
 	else
 		return false;
@@ -840,6 +878,24 @@ int cgx_get_fwdata_base(u64 *base)
 	return err;
 }
 
+int cgx_set_link_mode(void *cgxd, struct cgx_set_link_mode_args args,
+		      int cgx_id, int lmac_id)
+{
+	struct cgx *cgx = cgxd;
+	u64 req = 0, resp;
+
+	if (!cgx)
+		return -ENODEV;
+
+	req = FIELD_SET(CMDREG_ID, CGX_CMD_MODE_CHANGE, req);
+	req = FIELD_SET(CMDMODECHANGE_SPEED,
+			cgx_link_usertable_index_map(args.speed), req);
+	req = FIELD_SET(CMDMODECHANGE_DUPLEX, args.duplex, req);
+	req = FIELD_SET(CMDMODECHANGE_AN, args.an, req);
+	req = FIELD_SET(CMDMODECHANGE_PORT, args.ports, req);
+	req = FIELD_SET(CMDMODECHANGE_FLAGS, args.flags, req);
+	return cgx_fwi_cmd_generic(req, &resp, cgx, lmac_id);
+}
 int cgx_set_fec(u64 fec, int cgx_id, int lmac_id)
 {
 	u64 req = 0, resp;
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.h b/drivers/net/ethernet/marvell/octeontx2/af/cgx.h
index c5294b7..b458ad0 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.h
@@ -155,5 +155,7 @@ u8 cgx_lmac_get_p2x(int cgx_id, int lmac_id);
 int cgx_set_fec(u64 fec, int cgx_id, int lmac_id);
 int cgx_get_fec_stats(void *cgxd, int lmac_id, struct cgx_fec_stats_rsp *rsp);
 int cgx_get_phy_fec_stats(void *cgxd, int lmac_id);
+int cgx_set_link_mode(void *cgxd, struct cgx_set_link_mode_args args,
+		      int cgx_id, int lmac_id);
 
 #endif /* CGX_H */
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
index 65f832a..70610e7 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
@@ -43,7 +43,13 @@ enum cgx_error_type {
 	CGX_ERR_TRAINING_FAIL,
 	CGX_ERR_RX_EQU_FAIL,
 	CGX_ERR_SPUX_BER_FAIL,
-	CGX_ERR_SPUX_RSFEC_ALGN_FAIL,   /* = 22 */
+	CGX_ERR_SPUX_RSFEC_ALGN_FAIL,
+	CGX_ERR_SPUX_MARKER_LOCK_FAIL,
+	CGX_ERR_SET_FEC_INVALID,
+	CGX_ERR_SET_FEC_FAIL,
+	CGX_ERR_MODULE_INVALID,
+	CGX_ERR_MODULE_NOT_PRESENT,
+	CGX_ERR_SPEED_CHANGE_INVALID,
 };
 
 /* LINK speed types */
@@ -59,6 +65,7 @@ enum cgx_link_speed {
 	CGX_LINK_25G,
 	CGX_LINK_40G,
 	CGX_LINK_50G,
+	CGX_LINK_80G,
 	CGX_LINK_100G,
 	CGX_LINK_SPEED_MAX,
 };
@@ -75,7 +82,7 @@ enum cgx_cmd_id {
 	CGX_CMD_INTERNAL_LBK,
 	CGX_CMD_EXTERNAL_LBK,
 	CGX_CMD_HIGIG,
-	CGX_CMD_LINK_STATE_CHANGE,
+	CGX_CMD_LINK_STAT_CHANGE,
 	CGX_CMD_MODE_CHANGE,		/* hot plug support */
 	CGX_CMD_INTF_SHUTDOWN,
 	CGX_CMD_GET_MKEX_PRFL_SIZE,
@@ -219,4 +226,11 @@ struct cgx_lnk_sts {
 #define CMDLINKCHANGE_SPEED	GENMASK_ULL(13, 10)
 
 #define CMDSETFEC			GENMASK_ULL(9, 8)
+/* command argument to be passed for cmd ID - CGX_CMD_MODE_CHANGE */
+#define CMDMODECHANGE_SPEED		GENMASK_ULL(11, 8)
+#define CMDMODECHANGE_DUPLEX		GENMASK_ULL(12, 12)
+#define CMDMODECHANGE_AN		GENMASK_ULL(13, 13)
+#define CMDMODECHANGE_PORT		GENMASK_ULL(21, 14)
+#define CMDMODECHANGE_FLAGS		GENMASK_ULL(29, 22)
+
 #endif /* __CGX_FW_INTF_H__ */
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
index 204040e..a050902 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
@@ -153,6 +153,8 @@ M(CGX_FEC_SET,		0x210, cgx_set_fec_param, fec_mode, fec_mode)   \
 M(CGX_FEC_STATS,	0x211, cgx_fec_stats, msg_req, cgx_fec_stats_rsp) \
 M(CGX_GET_PHY_FEC_STATS, 0x212, cgx_get_phy_fec_stats, msg_req, msg_rsp) \
 M(CGX_FW_DATA_GET,	0x213, cgx_get_aux_link_info, msg_req, cgx_fw_data) \
+M(CGX_SET_LINK_MODE,	0x214, cgx_set_link_mode, cgx_set_link_mode_req,\
+			       cgx_set_link_mode_rsp)	\
  /* NPA mbox IDs (range 0x400 - 0x5FF) */				\
 /* NPA mbox IDs (range 0x400 - 0x5FF) */				\
 M(NPA_LF_ALLOC,		0x400, npa_lf_alloc,				\
@@ -383,6 +385,7 @@ struct cgx_link_user_info {
 	uint64_t full_duplex:1;
 	uint64_t lmac_type_id:4;
 	uint64_t speed:20; /* speed in Mbps */
+	uint64_t an:1;		/* AN supported or not */
 	uint64_t fec:2;	 /* FEC type if enabled else 0 */
 #define LMACTYPE_STR_LEN 16
 	char lmac_type[LMACTYPE_STR_LEN];
@@ -454,6 +457,24 @@ struct cgx_fw_data {
 	struct cgx_lmac_fwdata_s fwdata;
 };
 
+struct cgx_set_link_mode_args {
+	u32 speed;
+	u8 duplex;
+	u8 an;
+	u8 ports;
+	u8 flags;
+};
+
+struct cgx_set_link_mode_req {
+	struct mbox_msghdr hdr;
+	struct cgx_set_link_mode_args args;
+};
+
+struct cgx_set_link_mode_rsp {
+	struct mbox_msghdr hdr;
+	int status;
+};
+
 /* NPA mbox message formats */
 
 /* NPA mailbox error codes
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c
index c6fd2d5..1247bb7 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c
@@ -830,3 +830,20 @@ int rvu_mbox_handler_cgx_get_aux_link_info(struct rvu *rvu, struct msg_req *req,
 	       sizeof(struct cgx_lmac_fwdata_s));
 	return 0;
 }
+
+int rvu_mbox_handler_cgx_set_link_mode(struct rvu *rvu,
+				       struct cgx_set_link_mode_req *req,
+				       struct cgx_set_link_mode_rsp *rsp)
+{
+	int pf = rvu_get_pf(req->hdr.pcifunc);
+	u8 cgx_idx, lmac;
+	void *cgxd;
+
+	if (!is_cgx_config_permitted(rvu, req->hdr.pcifunc))
+		return -EPERM;
+
+	rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_idx, &lmac);
+	cgxd = rvu_cgx_pdata(cgx_idx, rvu);
+	rsp->status = cgx_set_link_mode(cgxd, req->args, cgx_idx, lmac);
+	return 0;
+}
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Patch v3 net-next 5/7] octeontx2-af: advertised link modes support on cgx
  2021-02-01  5:24 [Patch v3 net-next 0/7] ethtool support for fec and link configuration Hariprasad Kelam
                   ` (3 preceding siblings ...)
  2021-02-01  5:24 ` [Patch v3 net-next 4/7] octeontx2-af: Physical link configuration support Hariprasad Kelam
@ 2021-02-01  5:24 ` Hariprasad Kelam
  2021-02-03  0:45   ` Jesse Brandeburg
  2022-12-01  2:02   ` Chris Packham
  2021-02-01  5:24 ` [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link status Hariprasad Kelam
                   ` (2 subsequent siblings)
  7 siblings, 2 replies; 22+ messages in thread
From: Hariprasad Kelam @ 2021-02-01  5:24 UTC (permalink / raw)
  To: netdev, linux-kernel
  Cc: kuba, davem, willemdebruijn.kernel, andrew, sgoutham, lcherian,
	gakula, jerinj, sbhatta, hkelam

From: Christina Jacob <cjacob@marvell.com>

CGX supports setting advertised link modes on physical link.
This patch adds support to derive cgx mode from ethtool
link mode and pass it to firmware to configure the same.

Signed-off-by: Christina Jacob <cjacob@marvell.com>
Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
---
 drivers/net/ethernet/marvell/octeontx2/af/cgx.c    | 114 ++++++++++++++++++++-
 .../net/ethernet/marvell/octeontx2/af/cgx_fw_if.h  |  32 +++++-
 drivers/net/ethernet/marvell/octeontx2/af/mbox.h   |   3 +-
 3 files changed, 146 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
index 5b7d858..9c62129 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
@@ -14,6 +14,7 @@
 #include <linux/pci.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
+#include <linux/ethtool.h>
 #include <linux/phy.h>
 #include <linux/of.h>
 #include <linux/of_mdio.h>
@@ -646,6 +647,7 @@ static inline void cgx_link_usertable_init(void)
 	cgx_speed_mbps[CGX_LINK_25G] = 25000;
 	cgx_speed_mbps[CGX_LINK_40G] = 40000;
 	cgx_speed_mbps[CGX_LINK_50G] = 50000;
+	cgx_speed_mbps[CGX_LINK_80G] = 80000;
 	cgx_speed_mbps[CGX_LINK_100G] = 100000;
 
 	cgx_lmactype_string[LMAC_MODE_SGMII] = "SGMII";
@@ -693,6 +695,110 @@ static int cgx_link_usertable_index_map(int speed)
 	return CGX_LINK_NONE;
 }
 
+static void set_mod_args(struct cgx_set_link_mode_args *args,
+			 u32 speed, u8 duplex, u8 autoneg, u64 mode)
+{
+	/* Fill default values incase of user did not pass
+	 * valid parameters
+	 */
+	if (args->duplex == DUPLEX_UNKNOWN)
+		args->duplex = duplex;
+	if (args->speed == SPEED_UNKNOWN)
+		args->speed = speed;
+	if (args->an == AUTONEG_UNKNOWN)
+		args->an = autoneg;
+	args->mode = mode;
+	args->ports = 0;
+}
+
+static void otx2_map_ethtool_link_modes(u64 bitmask,
+					struct cgx_set_link_mode_args *args)
+{
+	switch (bitmask) {
+	case ETHTOOL_LINK_MODE_10baseT_Half_BIT:
+		set_mod_args(args, 10, 1, 1, BIT_ULL(CGX_MODE_SGMII));
+		break;
+	case  ETHTOOL_LINK_MODE_10baseT_Full_BIT:
+		set_mod_args(args, 10, 0, 1, BIT_ULL(CGX_MODE_SGMII));
+		break;
+	case  ETHTOOL_LINK_MODE_100baseT_Half_BIT:
+		set_mod_args(args, 100, 1, 1, BIT_ULL(CGX_MODE_SGMII));
+		break;
+	case  ETHTOOL_LINK_MODE_100baseT_Full_BIT:
+		set_mod_args(args, 100, 0, 1, BIT_ULL(CGX_MODE_SGMII));
+		break;
+	case  ETHTOOL_LINK_MODE_1000baseT_Half_BIT:
+		set_mod_args(args, 1000, 1, 1, BIT_ULL(CGX_MODE_SGMII));
+		break;
+	case  ETHTOOL_LINK_MODE_1000baseT_Full_BIT:
+		set_mod_args(args, 1000, 0, 1, BIT_ULL(CGX_MODE_SGMII));
+		break;
+	case  ETHTOOL_LINK_MODE_1000baseX_Full_BIT:
+		set_mod_args(args, 1000, 0, 0, BIT_ULL(CGX_MODE_1000_BASEX));
+		break;
+	case  ETHTOOL_LINK_MODE_10000baseT_Full_BIT:
+		set_mod_args(args, 1000, 0, 1, BIT_ULL(CGX_MODE_QSGMII));
+		break;
+	case  ETHTOOL_LINK_MODE_10000baseSR_Full_BIT:
+		set_mod_args(args, 10000, 0, 0, BIT_ULL(CGX_MODE_10G_C2C));
+		break;
+	case  ETHTOOL_LINK_MODE_10000baseLR_Full_BIT:
+		set_mod_args(args, 10000, 0, 0, BIT_ULL(CGX_MODE_10G_C2M));
+		break;
+	case  ETHTOOL_LINK_MODE_10000baseKR_Full_BIT:
+		set_mod_args(args, 10000, 0, 1, BIT_ULL(CGX_MODE_10G_KR));
+		break;
+	case  ETHTOOL_LINK_MODE_25000baseSR_Full_BIT:
+		set_mod_args(args, 25000, 0, 0, BIT_ULL(CGX_MODE_25G_C2C));
+		break;
+	case  ETHTOOL_LINK_MODE_25000baseCR_Full_BIT:
+		set_mod_args(args, 25000, 0, 1, BIT_ULL(CGX_MODE_25G_CR));
+		break;
+	case  ETHTOOL_LINK_MODE_25000baseKR_Full_BIT:
+		set_mod_args(args, 25000, 0, 1, BIT_ULL(CGX_MODE_25G_KR));
+		break;
+	case  ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT:
+		set_mod_args(args, 40000, 0, 0, BIT_ULL(CGX_MODE_40G_C2C));
+		break;
+	case  ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT:
+		set_mod_args(args, 40000, 0, 0, BIT_ULL(CGX_MODE_40G_C2M));
+		break;
+	case  ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT:
+		set_mod_args(args, 40000, 0, 1, BIT_ULL(CGX_MODE_40G_CR4));
+		break;
+	case  ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT:
+		set_mod_args(args, 40000, 0, 1, BIT_ULL(CGX_MODE_40G_KR4));
+		break;
+	case  ETHTOOL_LINK_MODE_50000baseSR_Full_BIT:
+		set_mod_args(args, 50000, 0, 0, BIT_ULL(CGX_MODE_50G_C2C));
+		break;
+	case  ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT:
+		set_mod_args(args, 50000, 0, 0, BIT_ULL(CGX_MODE_50G_C2M));
+		break;
+	case  ETHTOOL_LINK_MODE_50000baseCR_Full_BIT:
+		set_mod_args(args, 50000, 0, 1, BIT_ULL(CGX_MODE_50G_CR));
+		break;
+	case  ETHTOOL_LINK_MODE_50000baseKR_Full_BIT:
+		set_mod_args(args, 50000, 0, 1, BIT_ULL(CGX_MODE_50G_KR));
+		break;
+	case  ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT:
+		set_mod_args(args, 100000, 0, 0, BIT_ULL(CGX_MODE_100G_C2C));
+		break;
+	case  ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT:
+		set_mod_args(args, 100000, 0, 0, BIT_ULL(CGX_MODE_100G_C2M));
+		break;
+	case  ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT:
+		set_mod_args(args, 100000, 0, 1, BIT_ULL(CGX_MODE_100G_CR4));
+		break;
+	case  ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT:
+		set_mod_args(args, 100000, 0, 1, BIT_ULL(CGX_MODE_100G_KR4));
+		break;
+	default:
+		set_mod_args(args, 0, 1, 0, BIT_ULL(CGX_MODE_MAX));
+		break;
+	}
+}
+
 static inline void link_status_user_format(u64 lstat,
 					   struct cgx_link_user_info *linfo,
 					   struct cgx *cgx, u8 lmac_id)
@@ -887,13 +993,19 @@ int cgx_set_link_mode(void *cgxd, struct cgx_set_link_mode_args args,
 	if (!cgx)
 		return -ENODEV;
 
+	if (args.mode)
+		otx2_map_ethtool_link_modes(args.mode, &args);
+	if (!args.speed && args.duplex && !args.an)
+		return -EINVAL;
+
 	req = FIELD_SET(CMDREG_ID, CGX_CMD_MODE_CHANGE, req);
 	req = FIELD_SET(CMDMODECHANGE_SPEED,
 			cgx_link_usertable_index_map(args.speed), req);
 	req = FIELD_SET(CMDMODECHANGE_DUPLEX, args.duplex, req);
 	req = FIELD_SET(CMDMODECHANGE_AN, args.an, req);
 	req = FIELD_SET(CMDMODECHANGE_PORT, args.ports, req);
-	req = FIELD_SET(CMDMODECHANGE_FLAGS, args.flags, req);
+	req = FIELD_SET(CMDMODECHANGE_FLAGS, args.mode, req);
+
 	return cgx_fwi_cmd_generic(req, &resp, cgx, lmac_id);
 }
 int cgx_set_fec(u64 fec, int cgx_id, int lmac_id)
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
index 70610e7..dde2bd0 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
@@ -70,6 +70,36 @@ enum cgx_link_speed {
 	CGX_LINK_SPEED_MAX,
 };
 
+enum CGX_MODE_ {
+	CGX_MODE_SGMII,
+	CGX_MODE_1000_BASEX,
+	CGX_MODE_QSGMII,
+	CGX_MODE_10G_C2C,
+	CGX_MODE_10G_C2M,
+	CGX_MODE_10G_KR,
+	CGX_MODE_20G_C2C,
+	CGX_MODE_25G_C2C,
+	CGX_MODE_25G_C2M,
+	CGX_MODE_25G_2_C2C,
+	CGX_MODE_25G_CR,
+	CGX_MODE_25G_KR,
+	CGX_MODE_40G_C2C,
+	CGX_MODE_40G_C2M,
+	CGX_MODE_40G_CR4,
+	CGX_MODE_40G_KR4,
+	CGX_MODE_40GAUI_C2C,
+	CGX_MODE_50G_C2C,
+	CGX_MODE_50G_C2M,
+	CGX_MODE_50G_4_C2C,
+	CGX_MODE_50G_CR,
+	CGX_MODE_50G_KR,
+	CGX_MODE_80GAUI_C2C,
+	CGX_MODE_100G_C2C,
+	CGX_MODE_100G_C2M,
+	CGX_MODE_100G_CR4,
+	CGX_MODE_100G_KR4,
+	CGX_MODE_MAX /* = 29 */
+};
 /* REQUEST ID types. Input to firmware */
 enum cgx_cmd_id {
 	CGX_CMD_NONE,
@@ -231,6 +261,6 @@ struct cgx_lnk_sts {
 #define CMDMODECHANGE_DUPLEX		GENMASK_ULL(12, 12)
 #define CMDMODECHANGE_AN		GENMASK_ULL(13, 13)
 #define CMDMODECHANGE_PORT		GENMASK_ULL(21, 14)
-#define CMDMODECHANGE_FLAGS		GENMASK_ULL(29, 22)
+#define CMDMODECHANGE_FLAGS		GENMASK_ULL(63, 22)
 
 #endif /* __CGX_FW_INTF_H__ */
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
index a050902..05a6da2 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
@@ -462,10 +462,11 @@ struct cgx_set_link_mode_args {
 	u8 duplex;
 	u8 an;
 	u8 ports;
-	u8 flags;
+	u64 mode;
 };
 
 struct cgx_set_link_mode_req {
+#define AUTONEG_UNKNOWN		0xff
 	struct mbox_msghdr hdr;
 	struct cgx_set_link_mode_args args;
 };
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link status
  2021-02-01  5:24 [Patch v3 net-next 0/7] ethtool support for fec and link configuration Hariprasad Kelam
                   ` (4 preceding siblings ...)
  2021-02-01  5:24 ` [Patch v3 net-next 5/7] octeontx2-af: advertised link modes support on cgx Hariprasad Kelam
@ 2021-02-01  5:24 ` Hariprasad Kelam
  2021-02-03  0:46   ` Jesse Brandeburg
  2021-02-01  5:24 ` [Patch v3 net-next 7/7] octeontx2-pf: ethtool physical link configuration Hariprasad Kelam
  2021-02-03  0:41 ` [Patch v3 net-next 0/7] ethtool support for fec and " Jesse Brandeburg
  7 siblings, 1 reply; 22+ messages in thread
From: Hariprasad Kelam @ 2021-02-01  5:24 UTC (permalink / raw)
  To: netdev, linux-kernel
  Cc: kuba, davem, willemdebruijn.kernel, andrew, sgoutham, lcherian,
	gakula, jerinj, sbhatta, hkelam

From: Christina Jacob <cjacob@marvell.com>

Register get_link_ksettings callback to get link status information
from the driver. As virtual function (vf) shares same physical link
same API is used for both the drivers and for loop back drivers
simply returns the fixed values as its does not have physical link.

ethtool eth3
Settings for eth3:
        Supported ports: [ ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Half 1000baseT/Full
                                10000baseKR/Full
                                1000baseX/Full
        Supports auto-negotiation: No
        Supported FEC modes: BaseR RS
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: None

ethtool lbk0
Settings for lbk0:
	Speed: 100000Mb/s
        Duplex: Full

Signed-off-by: Christina Jacob <cjacob@marvell.com>
Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
---
 .../ethernet/marvell/octeontx2/nic/otx2_ethtool.c  | 151 +++++++++++++++++++++
 1 file changed, 151 insertions(+)

diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
index e5b1a57..d637815 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
@@ -14,6 +14,7 @@
 #include <linux/etherdevice.h>
 #include <linux/log2.h>
 #include <linux/net_tstamp.h>
+#include <linux/linkmode.h>
 
 #include "otx2_common.h"
 #include "otx2_ptp.h"
@@ -32,6 +33,24 @@ struct otx2_stat {
 	.index = offsetof(struct otx2_dev_stats, stat) / sizeof(u64), \
 }
 
+/* Physical link config */
+#define OTX2_ETHTOOL_SUPPORTED_MODES 0x638CCBF //110001110001100110010111111
+#define OTX2_RESERVED_ETHTOOL_LINK_MODE	0
+
+static const int otx2_sgmii_features_array[6] = {
+	ETHTOOL_LINK_MODE_10baseT_Half_BIT,
+	ETHTOOL_LINK_MODE_10baseT_Full_BIT,
+	ETHTOOL_LINK_MODE_100baseT_Half_BIT,
+	ETHTOOL_LINK_MODE_100baseT_Full_BIT,
+	ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
+	ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
+};
+
+enum link_mode {
+	OTX2_MODE_SUPPORTED,
+	OTX2_MODE_ADVERTISED
+};
+
 static const struct otx2_stat otx2_dev_stats[] = {
 	OTX2_DEV_STAT(rx_ucast_frames),
 	OTX2_DEV_STAT(rx_bcast_frames),
@@ -1034,6 +1053,123 @@ static int otx2_set_fecparam(struct net_device *netdev,
 	return err;
 }
 
+static void otx2_get_fec_info(u64 index, int req_mode,
+			      struct ethtool_link_ksettings *link_ksettings)
+{
+	__ETHTOOL_DECLARE_LINK_MODE_MASK(otx2_fec_modes) = { 0, };
+
+	switch (index) {
+	case OTX2_FEC_NONE:
+		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_NONE_BIT, otx2_fec_modes);
+		break;
+	case OTX2_FEC_BASER:
+		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT, otx2_fec_modes);
+		break;
+	case OTX2_FEC_RS:
+		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT, otx2_fec_modes);
+		break;
+	case OTX2_FEC_BASER | OTX2_FEC_RS:
+		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT, otx2_fec_modes);
+		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT, otx2_fec_modes);
+		break;
+	}
+
+	/* Add fec modes to existing modes */
+	if (req_mode == OTX2_MODE_ADVERTISED)
+		linkmode_or(link_ksettings->link_modes.advertising,
+			    link_ksettings->link_modes.advertising,
+			    otx2_fec_modes);
+	else
+		linkmode_or(link_ksettings->link_modes.supported,
+			    link_ksettings->link_modes.supported,
+			    otx2_fec_modes);
+}
+
+static void otx2_get_link_mode_info(u64 link_mode_bmap,
+				    bool req_mode,
+				    struct ethtool_link_ksettings
+				    *link_ksettings)
+{
+	__ETHTOOL_DECLARE_LINK_MODE_MASK(otx2_link_modes) = { 0, };
+	u8 bit;
+
+	/* CGX link modes to Ethtool link mode mapping */
+	const int cgx_link_mode[27] = {
+		0, /* SGMII  Mode */
+		ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
+		ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
+		ETHTOOL_LINK_MODE_10000baseSR_Full_BIT,
+		ETHTOOL_LINK_MODE_10000baseLR_Full_BIT,
+		ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		ETHTOOL_LINK_MODE_25000baseSR_Full_BIT,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		ETHTOOL_LINK_MODE_25000baseCR_Full_BIT,
+		ETHTOOL_LINK_MODE_25000baseKR_Full_BIT,
+		ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT,
+		ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT,
+		ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT,
+		ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		ETHTOOL_LINK_MODE_50000baseSR_Full_BIT,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT,
+		ETHTOOL_LINK_MODE_50000baseCR_Full_BIT,
+		ETHTOOL_LINK_MODE_50000baseKR_Full_BIT,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT,
+		ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT,
+		ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT,
+		ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT
+	};
+
+	link_mode_bmap = link_mode_bmap & OTX2_ETHTOOL_SUPPORTED_MODES;
+
+	for_each_set_bit(bit, (unsigned long *)&link_mode_bmap, 27) {
+		/* SGMII mode is set */
+		if (bit  ==  0)
+			linkmode_set_bit_array(otx2_sgmii_features_array,
+					       ARRAY_SIZE(otx2_sgmii_features_array),
+					       otx2_link_modes);
+		else
+			linkmode_set_bit(cgx_link_mode[bit], otx2_link_modes);
+	}
+
+	if (req_mode == OTX2_MODE_ADVERTISED)
+		linkmode_copy(link_ksettings->link_modes.advertising, otx2_link_modes);
+	else
+		linkmode_copy(link_ksettings->link_modes.supported, otx2_link_modes);
+}
+
+static int otx2_get_link_ksettings(struct net_device *netdev,
+				   struct ethtool_link_ksettings *cmd)
+{
+	struct otx2_nic *pfvf = netdev_priv(netdev);
+	struct cgx_fw_data *rsp = NULL;
+
+	cmd->base.duplex  = pfvf->linfo.full_duplex;
+	cmd->base.speed   = pfvf->linfo.speed;
+	cmd->base.autoneg = pfvf->linfo.an;
+
+	rsp = otx2_get_fwdata(pfvf);
+	if (IS_ERR(rsp))
+		return PTR_ERR(rsp);
+
+	if (rsp->fwdata.supported_an)
+		ethtool_link_ksettings_add_link_mode(cmd,
+						     supported,
+						     Autoneg);
+
+	otx2_get_link_mode_info(rsp->fwdata.advertised_link_modes, OTX2_MODE_ADVERTISED, cmd);
+	otx2_get_fec_info(rsp->fwdata.advertised_fec, OTX2_MODE_ADVERTISED, cmd);
+
+	otx2_get_link_mode_info(rsp->fwdata.supported_link_modes, OTX2_MODE_SUPPORTED, cmd);
+	otx2_get_fec_info(rsp->fwdata.supported_fec, OTX2_MODE_SUPPORTED, cmd);
+
+	return 0;
+}
+
 static const struct ethtool_ops otx2_ethtool_ops = {
 	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
 				     ETHTOOL_COALESCE_MAX_FRAMES,
@@ -1063,6 +1199,7 @@ static const struct ethtool_ops otx2_ethtool_ops = {
 	.get_ts_info		= otx2_get_ts_info,
 	.get_fecparam		= otx2_get_fecparam,
 	.set_fecparam		= otx2_set_fecparam,
+	.get_link_ksettings     = otx2_get_link_ksettings,
 };
 
 void otx2_set_ethtool_ops(struct net_device *netdev)
@@ -1137,6 +1274,19 @@ static int otx2vf_get_sset_count(struct net_device *netdev, int sset)
 	return otx2_n_dev_stats + otx2_n_drv_stats + qstats_count + 1;
 }
 
+static int otx2vf_get_link_ksettings(struct net_device *netdev,
+				     struct ethtool_link_ksettings *cmd)
+{
+	struct otx2_nic *pfvf = netdev_priv(netdev);
+
+	if (is_otx2_lbkvf(pfvf->pdev)) {
+		cmd->base.duplex = DUPLEX_FULL;
+		cmd->base.speed = SPEED_100000;
+	} else {
+		return	otx2_get_link_ksettings(netdev, cmd);
+	}
+	return 0;
+}
 static const struct ethtool_ops otx2vf_ethtool_ops = {
 	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
 				     ETHTOOL_COALESCE_MAX_FRAMES,
@@ -1163,6 +1313,7 @@ static const struct ethtool_ops otx2vf_ethtool_ops = {
 	.set_msglevel		= otx2_set_msglevel,
 	.get_pauseparam		= otx2_get_pauseparam,
 	.set_pauseparam		= otx2_set_pauseparam,
+	.get_link_ksettings     = otx2vf_get_link_ksettings,
 };
 
 void otx2vf_set_ethtool_ops(struct net_device *netdev)
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Patch v3 net-next 7/7] octeontx2-pf: ethtool physical link configuration
  2021-02-01  5:24 [Patch v3 net-next 0/7] ethtool support for fec and link configuration Hariprasad Kelam
                   ` (5 preceding siblings ...)
  2021-02-01  5:24 ` [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link status Hariprasad Kelam
@ 2021-02-01  5:24 ` Hariprasad Kelam
  2021-02-03  0:48   ` Jesse Brandeburg
  2021-02-03  0:41 ` [Patch v3 net-next 0/7] ethtool support for fec and " Jesse Brandeburg
  7 siblings, 1 reply; 22+ messages in thread
From: Hariprasad Kelam @ 2021-02-01  5:24 UTC (permalink / raw)
  To: netdev, linux-kernel
  Cc: kuba, davem, willemdebruijn.kernel, andrew, sgoutham, lcherian,
	gakula, jerinj, sbhatta, hkelam

From: Christina Jacob <cjacob@marvell.com>

Register set_link_ksetting callback with driver such that
link configurations parameters like advertised mode,speed, duplex
and autoneg can be configured.

below command
ethtool -s eth0 advertise 0x1 speed 10 duplex full autoneg on

Signed-off-by: Christina Jacob <cjacob@marvell.com>
Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
---
 .../ethernet/marvell/octeontx2/nic/otx2_ethtool.c  | 67 ++++++++++++++++++++++
 1 file changed, 67 insertions(+)

diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
index d637815..74a62de 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
@@ -1170,6 +1170,72 @@ static int otx2_get_link_ksettings(struct net_device *netdev,
 	return 0;
 }
 
+static void otx2_get_advertised_mode(const struct ethtool_link_ksettings *cmd,
+				     u64 *mode)
+{
+	u32 bit_pos;
+
+	/* Firmware does not support requesting multiple advertised modes
+	 * return first set bit
+	 */
+	bit_pos = find_first_bit(cmd->link_modes.advertising,
+				 __ETHTOOL_LINK_MODE_MASK_NBITS);
+	if (bit_pos != __ETHTOOL_LINK_MODE_MASK_NBITS)
+		*mode = bit_pos;
+}
+
+static int otx2_set_link_ksettings(struct net_device *netdev,
+				   const struct ethtool_link_ksettings *cmd)
+{
+	struct otx2_nic *pf = netdev_priv(netdev);
+	struct ethtool_link_ksettings req_ks;
+	struct ethtool_link_ksettings cur_ks;
+	struct cgx_set_link_mode_req *req;
+	struct mbox *mbox = &pf->mbox;
+	int err = 0;
+
+	/* save requested link settings */
+	memcpy(&req_ks, cmd, sizeof(struct ethtool_link_ksettings));
+
+	memset(&cur_ks, 0, sizeof(struct ethtool_link_ksettings));
+
+	if (!ethtool_validate_speed(cmd->base.speed) ||
+	    !ethtool_validate_duplex(cmd->base.duplex))
+		return -EINVAL;
+
+	if (cmd->base.autoneg != AUTONEG_ENABLE &&
+	    cmd->base.autoneg != AUTONEG_DISABLE)
+		return -EINVAL;
+
+	otx2_get_link_ksettings(netdev, &cur_ks);
+
+	/* Check requested modes against supported modes by hardware */
+	if (!bitmap_subset(req_ks.link_modes.advertising,
+			   cur_ks.link_modes.supported,
+			   __ETHTOOL_LINK_MODE_MASK_NBITS))
+		return -EINVAL;
+
+	mutex_lock(&mbox->lock);
+	req = otx2_mbox_alloc_msg_cgx_set_link_mode(&pf->mbox);
+	if (!req) {
+		err = -ENOMEM;
+		goto end;
+	}
+
+	req->args.speed = req_ks.base.speed;
+	/* firmware expects 1 for half duplex and 0 for full duplex
+	 * hence inverting
+	 */
+	req->args.duplex = req_ks.base.duplex ^ 0x1;
+	req->args.an = req_ks.base.autoneg;
+	otx2_get_advertised_mode(&req_ks, &req->args.mode);
+
+	err = otx2_sync_mbox_msg(&pf->mbox);
+end:
+	mutex_unlock(&mbox->lock);
+	return err;
+}
+
 static const struct ethtool_ops otx2_ethtool_ops = {
 	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
 				     ETHTOOL_COALESCE_MAX_FRAMES,
@@ -1200,6 +1266,7 @@ static const struct ethtool_ops otx2_ethtool_ops = {
 	.get_fecparam		= otx2_get_fecparam,
 	.set_fecparam		= otx2_set_fecparam,
 	.get_link_ksettings     = otx2_get_link_ksettings,
+	.set_link_ksettings     = otx2_set_link_ksettings,
 };
 
 void otx2_set_ethtool_ops(struct net_device *netdev)
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 0/7] ethtool support for fec and link configuration
  2021-02-01  5:24 [Patch v3 net-next 0/7] ethtool support for fec and link configuration Hariprasad Kelam
                   ` (6 preceding siblings ...)
  2021-02-01  5:24 ` [Patch v3 net-next 7/7] octeontx2-pf: ethtool physical link configuration Hariprasad Kelam
@ 2021-02-03  0:41 ` Jesse Brandeburg
  7 siblings, 0 replies; 22+ messages in thread
From: Jesse Brandeburg @ 2021-02-03  0:41 UTC (permalink / raw)
  To: Hariprasad Kelam
  Cc: netdev, linux-kernel, kuba, davem, willemdebruijn.kernel, andrew,
	sgoutham, lcherian, gakula, jerinj, sbhatta

Hariprasad Kelam wrote:

> This series of patches add support for forward error correction(fec) and
> physical link configuration. Patches 1&2 adds necessary mbox handlers for fec
> mode configuration request and to fetch stats. Patch 3 registers driver
> callbacks for fec mode configuration and display. Patch 4&5 adds support of mbox
> handlers for configuring link parameters like speed/duplex and autoneg etc.
> Patche 6&7 registers driver callbacks for physical link configuration.

For the series, in addition to the fact that Willem already replied to
the previous posting of v3 that it looked good.

Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 1/7] octeontx2-af: forward error correction configuration
  2021-02-01  5:24 ` [Patch v3 net-next 1/7] octeontx2-af: forward error correction configuration Hariprasad Kelam
@ 2021-02-03  0:43   ` Jesse Brandeburg
  0 siblings, 0 replies; 22+ messages in thread
From: Jesse Brandeburg @ 2021-02-03  0:43 UTC (permalink / raw)
  To: Hariprasad Kelam
  Cc: netdev, linux-kernel, kuba, davem, willemdebruijn.kernel, andrew,
	sgoutham, lcherian, gakula, jerinj, sbhatta

Hariprasad Kelam wrote:

> From: Christina Jacob <cjacob@marvell.com>
> 
> CGX block supports forward error correction modes baseR
> and RS. This patch adds support to set encoding mode
> and to read corrected/uncorrected block counters
> 
> Adds new mailbox handlers set_fec to configure encoding modes
> and fec_stats to read counters and also increase mbox timeout
> to accomdate firmware command response timeout.
> 
> Along with new CGX_CMD_SET_FEC command add other commands to
> sync with kernel enum list with firmware.
> 
> Signed-off-by: Christina Jacob <cjacob@marvell.com>
> Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
> Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>

Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 2/7] octeontx2-af: Add new CGX_CMD to get PHY FEC statistics
  2021-02-01  5:24 ` [Patch v3 net-next 2/7] octeontx2-af: Add new CGX_CMD to get PHY FEC statistics Hariprasad Kelam
@ 2021-02-03  0:43   ` Jesse Brandeburg
  0 siblings, 0 replies; 22+ messages in thread
From: Jesse Brandeburg @ 2021-02-03  0:43 UTC (permalink / raw)
  To: Hariprasad Kelam
  Cc: netdev, linux-kernel, kuba, davem, willemdebruijn.kernel, andrew,
	sgoutham, lcherian, gakula, jerinj, sbhatta

Hariprasad Kelam wrote:

> From: Felix Manlunas <fmanlunas@marvell.com>
> 
> This patch adds support to fetch fec stats from PHY. The stats are
> put in the shared data struct fwdata.  A PHY driver indicates
> that it has FEC stats by setting the flag fwdata.phy.misc.has_fec_stats
> 
> Besides CGX_CMD_GET_PHY_FEC_STATS, also add CGX_CMD_PRBS and
> CGX_CMD_DISPLAY_EYE to enum cgx_cmd_id so that Linux's enum list is in sync
> with firmware's enum list.
> 
> Signed-off-by: Felix Manlunas <fmanlunas@marvell.com>
> Signed-off-by: Christina Jacob <cjacob@marvell.com>
> Signed-off-by: Sunil Kovvuri Goutham <Sunil.Goutham@cavium.com>
> Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>

Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 3/7] octeontx2-pf: ethtool fec mode support
  2021-02-01  5:24 ` [Patch v3 net-next 3/7] octeontx2-pf: ethtool fec mode support Hariprasad Kelam
@ 2021-02-03  0:44   ` Jesse Brandeburg
  2021-02-03  1:12   ` Jakub Kicinski
  1 sibling, 0 replies; 22+ messages in thread
From: Jesse Brandeburg @ 2021-02-03  0:44 UTC (permalink / raw)
  To: Hariprasad Kelam
  Cc: netdev, linux-kernel, kuba, davem, willemdebruijn.kernel, andrew,
	sgoutham, lcherian, gakula, jerinj, sbhatta

Hariprasad Kelam wrote:

> From: Christina Jacob <cjacob@marvell.com>
> 
> Add ethtool support to configure fec modes baser/rs and
> support to fecth FEC stats from CGX as well PHY.
> 
> Configure fec mode
> 	- ethtool --set-fec eth0 encoding rs/baser/off/auto
> Query fec mode
> 	- ethtool --show-fec eth0
> 
> Signed-off-by: Christina Jacob <cjacob@marvell.com>
> Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
> Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>

Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 4/7] octeontx2-af: Physical link configuration support
  2021-02-01  5:24 ` [Patch v3 net-next 4/7] octeontx2-af: Physical link configuration support Hariprasad Kelam
@ 2021-02-03  0:44   ` Jesse Brandeburg
  0 siblings, 0 replies; 22+ messages in thread
From: Jesse Brandeburg @ 2021-02-03  0:44 UTC (permalink / raw)
  To: Hariprasad Kelam
  Cc: netdev, linux-kernel, kuba, davem, willemdebruijn.kernel, andrew,
	sgoutham, lcherian, gakula, jerinj, sbhatta

Hariprasad Kelam wrote:

> From: Christina Jacob <cjacob@marvell.com>
> 
> CGX LMAC, the physical interface support link configuration parameters
> like speed, auto negotiation, duplex  etc. Firmware saves these into
> memory region shared between firmware and this driver.
> 
> This patch adds mailbox handler set_link_mode, fw_data_get to
> configure and read these parameters.
> 
> Signed-off-by: Christina Jacob <cjacob@marvell.com>
> Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
> Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>

Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 5/7] octeontx2-af: advertised link modes support on cgx
  2021-02-01  5:24 ` [Patch v3 net-next 5/7] octeontx2-af: advertised link modes support on cgx Hariprasad Kelam
@ 2021-02-03  0:45   ` Jesse Brandeburg
  2022-12-01  2:02   ` Chris Packham
  1 sibling, 0 replies; 22+ messages in thread
From: Jesse Brandeburg @ 2021-02-03  0:45 UTC (permalink / raw)
  To: Hariprasad Kelam
  Cc: netdev, linux-kernel, kuba, davem, willemdebruijn.kernel, andrew,
	sgoutham, lcherian, gakula, jerinj, sbhatta

Hariprasad Kelam wrote:

> From: Christina Jacob <cjacob@marvell.com>
> 
> CGX supports setting advertised link modes on physical link.
> This patch adds support to derive cgx mode from ethtool
> link mode and pass it to firmware to configure the same.
> 
> Signed-off-by: Christina Jacob <cjacob@marvell.com>
> Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
> Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>

Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link status
  2021-02-01  5:24 ` [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link status Hariprasad Kelam
@ 2021-02-03  0:46   ` Jesse Brandeburg
  0 siblings, 0 replies; 22+ messages in thread
From: Jesse Brandeburg @ 2021-02-03  0:46 UTC (permalink / raw)
  To: Hariprasad Kelam
  Cc: netdev, linux-kernel, kuba, davem, willemdebruijn.kernel, andrew,
	sgoutham, lcherian, gakula, jerinj, sbhatta

Hariprasad Kelam wrote:

> From: Christina Jacob <cjacob@marvell.com>
> 
> Register get_link_ksettings callback to get link status information
> from the driver. As virtual function (vf) shares same physical link
> same API is used for both the drivers and for loop back drivers
> simply returns the fixed values as its does not have physical link.
> 
> ethtool eth3
> Settings for eth3:
>         Supported ports: [ ]
>         Supported link modes:   10baseT/Half 10baseT/Full
>                                 100baseT/Half 100baseT/Full
>                                 1000baseT/Half 1000baseT/Full
>                                 10000baseKR/Full
>                                 1000baseX/Full
>         Supports auto-negotiation: No
>         Supported FEC modes: BaseR RS
>         Advertised link modes:  Not reported
>         Advertised pause frame use: No
>         Advertised auto-negotiation: No
>         Advertised FEC modes: None
> 
> ethtool lbk0
> Settings for lbk0:
> 	Speed: 100000Mb/s
>         Duplex: Full
> 
> Signed-off-by: Christina Jacob <cjacob@marvell.com>
> Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
> Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>

besides the slightly long lines, looks good.
Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 7/7] octeontx2-pf: ethtool physical link configuration
  2021-02-01  5:24 ` [Patch v3 net-next 7/7] octeontx2-pf: ethtool physical link configuration Hariprasad Kelam
@ 2021-02-03  0:48   ` Jesse Brandeburg
  0 siblings, 0 replies; 22+ messages in thread
From: Jesse Brandeburg @ 2021-02-03  0:48 UTC (permalink / raw)
  To: Hariprasad Kelam
  Cc: netdev, linux-kernel, kuba, davem, willemdebruijn.kernel, andrew,
	sgoutham, lcherian, gakula, jerinj, sbhatta

Hariprasad Kelam wrote:

> From: Christina Jacob <cjacob@marvell.com>
> 
> Register set_link_ksetting callback with driver such that
> link configurations parameters like advertised mode,speed, duplex
> and autoneg can be configured.
> 
> below command
> ethtool -s eth0 advertise 0x1 speed 10 duplex full autoneg on
> 
> Signed-off-by: Christina Jacob <cjacob@marvell.com>
> Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
> Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>

Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 3/7] octeontx2-pf: ethtool fec mode support
  2021-02-01  5:24 ` [Patch v3 net-next 3/7] octeontx2-pf: ethtool fec mode support Hariprasad Kelam
  2021-02-03  0:44   ` Jesse Brandeburg
@ 2021-02-03  1:12   ` Jakub Kicinski
  1 sibling, 0 replies; 22+ messages in thread
From: Jakub Kicinski @ 2021-02-03  1:12 UTC (permalink / raw)
  To: Hariprasad Kelam
  Cc: netdev, linux-kernel, davem, willemdebruijn.kernel, andrew,
	sgoutham, lcherian, gakula, jerinj, sbhatta

On Mon, 1 Feb 2021 10:54:40 +0530 Hariprasad Kelam wrote:
> From: Christina Jacob <cjacob@marvell.com>
> 
> Add ethtool support to configure fec modes baser/rs and
> support to fecth FEC stats from CGX as well PHY.
> 
> Configure fec mode
> 	- ethtool --set-fec eth0 encoding rs/baser/off/auto
> Query fec mode
> 	- ethtool --show-fec eth0

> +	if (pfvf->linfo.fec) {
> +		sprintf(data, "Fec Corrected Errors: ");
> +		data += ETH_GSTRING_LEN;
> +		sprintf(data, "Fec Uncorrected Errors: ");
> +		data += ETH_GSTRING_LEN;

Once again, you can't dynamically hide stats. ethtool makes 3 separate
system calls - to get the number of stats, get the names, and get the
values. If someone changes the FEC config in between those user space
dumping stats will get confused.

> +	}
>  }

> +static int otx2_get_fecparam(struct net_device *netdev,
> +			     struct ethtool_fecparam *fecparam)
> +{
> +	struct otx2_nic *pfvf = netdev_priv(netdev);
> +	struct cgx_fw_data *rsp;
> +	const int fec[] = {
> +		ETHTOOL_FEC_OFF,
> +		ETHTOOL_FEC_BASER,
> +		ETHTOOL_FEC_RS,
> +		ETHTOOL_FEC_BASER | ETHTOOL_FEC_RS};
> +#define FEC_MAX_INDEX 3
> +	if (pfvf->linfo.fec < FEC_MAX_INDEX)

This should be <

> +		fecparam->active_fec = fec[pfvf->linfo.fec];


> +	rsp = otx2_get_fwdata(pfvf);
> +	if (IS_ERR(rsp))
> +		return PTR_ERR(rsp);
> +
> +	if (rsp->fwdata.supported_fec <= FEC_MAX_INDEX) {
> +		if (!rsp->fwdata.supported_fec)
> +			fecparam->fec = ETHTOOL_FEC_NONE;
> +		else
> +			fecparam->fec = fec[rsp->fwdata.supported_fec];
> +	}
> +	return 0;
> +}
> +
> +static int otx2_set_fecparam(struct net_device *netdev,
> +			     struct ethtool_fecparam *fecparam)
> +{
> +	struct otx2_nic *pfvf = netdev_priv(netdev);
> +	struct mbox *mbox = &pfvf->mbox;
> +	struct fec_mode *req, *rsp;
> +	int err = 0, fec = 0;
> +
> +	switch (fecparam->fec) {
> +	/* Firmware does not support AUTO mode consider it as FEC_NONE */
> +	case ETHTOOL_FEC_OFF:
> +	case ETHTOOL_FEC_AUTO:
> +	case ETHTOOL_FEC_NONE:

I _think_ NONE is for drivers to report that they don't support FEC
settings. It's an output only parameter. On input OFF should be used.

> +		fec = OTX2_FEC_NONE;
> +		break;
> +	case ETHTOOL_FEC_RS:
> +		fec = OTX2_FEC_RS;
> +		break;
> +	case ETHTOOL_FEC_BASER:
> +		fec = OTX2_FEC_BASER;
> +		break;
> +	default:
> +		netdev_warn(pfvf->netdev, "Unsupported FEC mode: %d",
> +			    fecparam->fec);
> +		return -EINVAL;
> +	}
> +
> +	if (fec == pfvf->linfo.fec)
> +		return 0;
> +
> +	mutex_lock(&mbox->lock);
> +	req = otx2_mbox_alloc_msg_cgx_set_fec_param(&pfvf->mbox);
> +	if (!req) {
> +		err = -ENOMEM;
> +		goto end;
> +	}
> +	req->fec = fec;
> +	err = otx2_sync_mbox_msg(&pfvf->mbox);
> +	if (err)
> +		goto end;
> +
> +	rsp = (struct fec_mode *)otx2_mbox_get_rsp(&pfvf->mbox.mbox,
> +						   0, &req->hdr);
> +	if (rsp->fec >= 0) {
> +		pfvf->linfo.fec = rsp->fec;
> +		/* clear stale counters */
> +		pfvf->hw.cgx_fec_corr_blks = 0;
> +		pfvf->hw.cgx_fec_uncorr_blks = 0;

Stats are supposed to be cumulative. Don't reset the stats just because
someone changed the FEC mode. You can miss errors this way.

> +	} else {
> +		err = rsp->fec;
> +	}

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 5/7] octeontx2-af: advertised link modes support on cgx
  2021-02-01  5:24 ` [Patch v3 net-next 5/7] octeontx2-af: advertised link modes support on cgx Hariprasad Kelam
  2021-02-03  0:45   ` Jesse Brandeburg
@ 2022-12-01  2:02   ` Chris Packham
  2022-12-02  7:56     ` Hariprasad Kelam
  1 sibling, 1 reply; 22+ messages in thread
From: Chris Packham @ 2022-12-01  2:02 UTC (permalink / raw)
  To: Hariprasad Kelam, netdev, linux-kernel, cjacob
  Cc: kuba, davem, willemdebruijn.kernel, andrew, sgoutham, lcherian,
	gakula, jerinj, sbhatta, Richard Laing

Hi Hariprasad, Christina,

Sorry for poking an old thread but Richard and I were looking at some 
code and noticed something odd about it.

On 1/02/21 18:24, Hariprasad Kelam wrote:
> From: Christina Jacob <cjacob@marvell.com>
>
> CGX supports setting advertised link modes on physical link.
> This patch adds support to derive cgx mode from ethtool
> link mode and pass it to firmware to configure the same.
>
> Signed-off-by: Christina Jacob <cjacob@marvell.com>
> Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
> Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
> ---
>   drivers/net/ethernet/marvell/octeontx2/af/cgx.c    | 114 ++++++++++++++++++++-
>   .../net/ethernet/marvell/octeontx2/af/cgx_fw_if.h  |  32 +++++-
>   drivers/net/ethernet/marvell/octeontx2/af/mbox.h   |   3 +-
>   3 files changed, 146 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
> index 5b7d858..9c62129 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
> @@ -14,6 +14,7 @@
>   #include <linux/pci.h>
>   #include <linux/netdevice.h>
>   #include <linux/etherdevice.h>
> +#include <linux/ethtool.h>
>   #include <linux/phy.h>
>   #include <linux/of.h>
>   #include <linux/of_mdio.h>
> @@ -646,6 +647,7 @@ static inline void cgx_link_usertable_init(void)
>   	cgx_speed_mbps[CGX_LINK_25G] = 25000;
>   	cgx_speed_mbps[CGX_LINK_40G] = 40000;
>   	cgx_speed_mbps[CGX_LINK_50G] = 50000;
> +	cgx_speed_mbps[CGX_LINK_80G] = 80000;
>   	cgx_speed_mbps[CGX_LINK_100G] = 100000;
>   
>   	cgx_lmactype_string[LMAC_MODE_SGMII] = "SGMII";
> @@ -693,6 +695,110 @@ static int cgx_link_usertable_index_map(int speed)
>   	return CGX_LINK_NONE;
>   }
>   
> +static void set_mod_args(struct cgx_set_link_mode_args *args,
> +			 u32 speed, u8 duplex, u8 autoneg, u64 mode)
> +{
> +	/* Fill default values incase of user did not pass
> +	 * valid parameters
> +	 */
> +	if (args->duplex == DUPLEX_UNKNOWN)
> +		args->duplex = duplex;
> +	if (args->speed == SPEED_UNKNOWN)
> +		args->speed = speed;
> +	if (args->an == AUTONEG_UNKNOWN)
> +		args->an = autoneg;
> +	args->mode = mode;
> +	args->ports = 0;
> +}
> +
> +static void otx2_map_ethtool_link_modes(u64 bitmask,
> +					struct cgx_set_link_mode_args *args)
> +{
> +	switch (bitmask) {
> +	case ETHTOOL_LINK_MODE_10baseT_Half_BIT:
> +		set_mod_args(args, 10, 1, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_10baseT_Full_BIT:
> +		set_mod_args(args, 10, 0, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100baseT_Half_BIT:
> +		set_mod_args(args, 100, 1, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100baseT_Full_BIT:
> +		set_mod_args(args, 100, 0, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_1000baseT_Half_BIT:
> +		set_mod_args(args, 1000, 1, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_1000baseT_Full_BIT:
> +		set_mod_args(args, 1000, 0, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_1000baseX_Full_BIT:
> +		set_mod_args(args, 1000, 0, 0, BIT_ULL(CGX_MODE_1000_BASEX));
> +		break;
> +	case  ETHTOOL_LINK_MODE_10000baseT_Full_BIT:
> +		set_mod_args(args, 1000, 0, 1, BIT_ULL(CGX_MODE_QSGMII));

Here the speed is set to 1000 but it looks like this should be 10000. I 
would have sent a patch to fix that but the mode is also a bit 
confusing. Normally I'd expect QSGMII to be used for Quad SGMII (i.e. 
4x1G Ethernet ports multiplexed over a single SERDES). I don't see any 
other mode in enum CGX_MODE_ that is obviously for 10GBase-T so I 
thought I'd bring this to your attention. I'd still be happy to whip up 
a patch if you could confirm what the correct mode should be.

> +		break;
> +	case  ETHTOOL_LINK_MODE_10000baseSR_Full_BIT:
> +		set_mod_args(args, 10000, 0, 0, BIT_ULL(CGX_MODE_10G_C2C));
> +		break;
> +	case  ETHTOOL_LINK_MODE_10000baseLR_Full_BIT:
> +		set_mod_args(args, 10000, 0, 0, BIT_ULL(CGX_MODE_10G_C2M));
> +		break;
> +	case  ETHTOOL_LINK_MODE_10000baseKR_Full_BIT:
> +		set_mod_args(args, 10000, 0, 1, BIT_ULL(CGX_MODE_10G_KR));
> +		break;
> +	case  ETHTOOL_LINK_MODE_25000baseSR_Full_BIT:
> +		set_mod_args(args, 25000, 0, 0, BIT_ULL(CGX_MODE_25G_C2C));
> +		break;
> +	case  ETHTOOL_LINK_MODE_25000baseCR_Full_BIT:
> +		set_mod_args(args, 25000, 0, 1, BIT_ULL(CGX_MODE_25G_CR));
> +		break;
> +	case  ETHTOOL_LINK_MODE_25000baseKR_Full_BIT:
> +		set_mod_args(args, 25000, 0, 1, BIT_ULL(CGX_MODE_25G_KR));
> +		break;
> +	case  ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT:
> +		set_mod_args(args, 40000, 0, 0, BIT_ULL(CGX_MODE_40G_C2C));
> +		break;
> +	case  ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT:
> +		set_mod_args(args, 40000, 0, 0, BIT_ULL(CGX_MODE_40G_C2M));
> +		break;
> +	case  ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT:
> +		set_mod_args(args, 40000, 0, 1, BIT_ULL(CGX_MODE_40G_CR4));
> +		break;
> +	case  ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT:
> +		set_mod_args(args, 40000, 0, 1, BIT_ULL(CGX_MODE_40G_KR4));
> +		break;
> +	case  ETHTOOL_LINK_MODE_50000baseSR_Full_BIT:
> +		set_mod_args(args, 50000, 0, 0, BIT_ULL(CGX_MODE_50G_C2C));
> +		break;
> +	case  ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT:
> +		set_mod_args(args, 50000, 0, 0, BIT_ULL(CGX_MODE_50G_C2M));
> +		break;
> +	case  ETHTOOL_LINK_MODE_50000baseCR_Full_BIT:
> +		set_mod_args(args, 50000, 0, 1, BIT_ULL(CGX_MODE_50G_CR));
> +		break;
> +	case  ETHTOOL_LINK_MODE_50000baseKR_Full_BIT:
> +		set_mod_args(args, 50000, 0, 1, BIT_ULL(CGX_MODE_50G_KR));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT:
> +		set_mod_args(args, 100000, 0, 0, BIT_ULL(CGX_MODE_100G_C2C));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT:
> +		set_mod_args(args, 100000, 0, 0, BIT_ULL(CGX_MODE_100G_C2M));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT:
> +		set_mod_args(args, 100000, 0, 1, BIT_ULL(CGX_MODE_100G_CR4));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT:
> +		set_mod_args(args, 100000, 0, 1, BIT_ULL(CGX_MODE_100G_KR4));
> +		break;
> +	default:
> +		set_mod_args(args, 0, 1, 0, BIT_ULL(CGX_MODE_MAX));
> +		break;
> +	}
> +}
> +
>   static inline void link_status_user_format(u64 lstat,
>   					   struct cgx_link_user_info *linfo,
>   					   struct cgx *cgx, u8 lmac_id)
> @@ -887,13 +993,19 @@ int cgx_set_link_mode(void *cgxd, struct cgx_set_link_mode_args args,
>   	if (!cgx)
>   		return -ENODEV;
>   
> +	if (args.mode)
> +		otx2_map_ethtool_link_modes(args.mode, &args);
> +	if (!args.speed && args.duplex && !args.an)
> +		return -EINVAL;
> +
>   	req = FIELD_SET(CMDREG_ID, CGX_CMD_MODE_CHANGE, req);
>   	req = FIELD_SET(CMDMODECHANGE_SPEED,
>   			cgx_link_usertable_index_map(args.speed), req);
>   	req = FIELD_SET(CMDMODECHANGE_DUPLEX, args.duplex, req);
>   	req = FIELD_SET(CMDMODECHANGE_AN, args.an, req);
>   	req = FIELD_SET(CMDMODECHANGE_PORT, args.ports, req);
> -	req = FIELD_SET(CMDMODECHANGE_FLAGS, args.flags, req);
> +	req = FIELD_SET(CMDMODECHANGE_FLAGS, args.mode, req);
> +
>   	return cgx_fwi_cmd_generic(req, &resp, cgx, lmac_id);
>   }
>   int cgx_set_fec(u64 fec, int cgx_id, int lmac_id)
> diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
> index 70610e7..dde2bd0 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
> +++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
> @@ -70,6 +70,36 @@ enum cgx_link_speed {
>   	CGX_LINK_SPEED_MAX,
>   };
>   
> +enum CGX_MODE_ {
> +	CGX_MODE_SGMII,
> +	CGX_MODE_1000_BASEX,
> +	CGX_MODE_QSGMII,
> +	CGX_MODE_10G_C2C,
> +	CGX_MODE_10G_C2M,
> +	CGX_MODE_10G_KR,
> +	CGX_MODE_20G_C2C,
> +	CGX_MODE_25G_C2C,
> +	CGX_MODE_25G_C2M,
> +	CGX_MODE_25G_2_C2C,
> +	CGX_MODE_25G_CR,
> +	CGX_MODE_25G_KR,
> +	CGX_MODE_40G_C2C,
> +	CGX_MODE_40G_C2M,
> +	CGX_MODE_40G_CR4,
> +	CGX_MODE_40G_KR4,
> +	CGX_MODE_40GAUI_C2C,
> +	CGX_MODE_50G_C2C,
> +	CGX_MODE_50G_C2M,
> +	CGX_MODE_50G_4_C2C,
> +	CGX_MODE_50G_CR,
> +	CGX_MODE_50G_KR,
> +	CGX_MODE_80GAUI_C2C,
> +	CGX_MODE_100G_C2C,
> +	CGX_MODE_100G_C2M,
> +	CGX_MODE_100G_CR4,
> +	CGX_MODE_100G_KR4,
> +	CGX_MODE_MAX /* = 29 */
> +};
>   /* REQUEST ID types. Input to firmware */
>   enum cgx_cmd_id {
>   	CGX_CMD_NONE,
> @@ -231,6 +261,6 @@ struct cgx_lnk_sts {
>   #define CMDMODECHANGE_DUPLEX		GENMASK_ULL(12, 12)
>   #define CMDMODECHANGE_AN		GENMASK_ULL(13, 13)
>   #define CMDMODECHANGE_PORT		GENMASK_ULL(21, 14)
> -#define CMDMODECHANGE_FLAGS		GENMASK_ULL(29, 22)
> +#define CMDMODECHANGE_FLAGS		GENMASK_ULL(63, 22)
>   
>   #endif /* __CGX_FW_INTF_H__ */
> diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
> index a050902..05a6da2 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
> +++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
> @@ -462,10 +462,11 @@ struct cgx_set_link_mode_args {
>   	u8 duplex;
>   	u8 an;
>   	u8 ports;
> -	u8 flags;
> +	u64 mode;
>   };
>   
>   struct cgx_set_link_mode_req {
> +#define AUTONEG_UNKNOWN		0xff
>   	struct mbox_msghdr hdr;
>   	struct cgx_set_link_mode_args args;
>   };

Thanks,
Chris

^ permalink raw reply	[flat|nested] 22+ messages in thread

* RE: [Patch v3 net-next 5/7] octeontx2-af: advertised link modes support on cgx
  2022-12-01  2:02   ` Chris Packham
@ 2022-12-02  7:56     ` Hariprasad Kelam
  0 siblings, 0 replies; 22+ messages in thread
From: Hariprasad Kelam @ 2022-12-02  7:56 UTC (permalink / raw)
  To: Chris Packham, netdev, linux-kernel, Christina Jacob
  Cc: kuba, davem, willemdebruijn.kernel, andrew,
	Sunil Kovvuri Goutham, Linu Cherian, Geethasowjanya Akula,
	Jerin Jacob Kollanukkaran, Subbaraya Sundeep Bhatta,
	Richard Laing

Hi Chris ,

See inline,

Hi Hariprasad, Christina,

Sorry for poking an old thread but Richard and I were looking at some code and noticed something odd about it.

On 1/02/21 18:24, Hariprasad Kelam wrote:
> From: Christina Jacob <cjacob@marvell.com>
>
> CGX supports setting advertised link modes on physical link.
> This patch adds support to derive cgx mode from ethtool link mode and 
> pass it to firmware to configure the same.
>
> Signed-off-by: Christina Jacob <cjacob@marvell.com>
> Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
> Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
> ---
>   drivers/net/ethernet/marvell/octeontx2/af/cgx.c    | 114 ++++++++++++++++++++-
>   .../net/ethernet/marvell/octeontx2/af/cgx_fw_if.h  |  32 +++++-
>   drivers/net/ethernet/marvell/octeontx2/af/mbox.h   |   3 +-
>   3 files changed, 146 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c 
> b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
> index 5b7d858..9c62129 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
> @@ -14,6 +14,7 @@
>   #include <linux/pci.h>
>   #include <linux/netdevice.h>
>   #include <linux/etherdevice.h>
> +#include <linux/ethtool.h>
>   #include <linux/phy.h>
>   #include <linux/of.h>
>   #include <linux/of_mdio.h>
> @@ -646,6 +647,7 @@ static inline void cgx_link_usertable_init(void)
>   	cgx_speed_mbps[CGX_LINK_25G] = 25000;
>   	cgx_speed_mbps[CGX_LINK_40G] = 40000;
>   	cgx_speed_mbps[CGX_LINK_50G] = 50000;
> +	cgx_speed_mbps[CGX_LINK_80G] = 80000;
>   	cgx_speed_mbps[CGX_LINK_100G] = 100000;
>   
>   	cgx_lmactype_string[LMAC_MODE_SGMII] = "SGMII"; @@ -693,6 +695,110 
> @@ static int cgx_link_usertable_index_map(int speed)
>   	return CGX_LINK_NONE;
>   }
>   
> +static void set_mod_args(struct cgx_set_link_mode_args *args,
> +			 u32 speed, u8 duplex, u8 autoneg, u64 mode) {
> +	/* Fill default values incase of user did not pass
> +	 * valid parameters
> +	 */
> +	if (args->duplex == DUPLEX_UNKNOWN)
> +		args->duplex = duplex;
> +	if (args->speed == SPEED_UNKNOWN)
> +		args->speed = speed;
> +	if (args->an == AUTONEG_UNKNOWN)
> +		args->an = autoneg;
> +	args->mode = mode;
> +	args->ports = 0;
> +}
> +
> +static void otx2_map_ethtool_link_modes(u64 bitmask,
> +					struct cgx_set_link_mode_args *args) {
> +	switch (bitmask) {
> +	case ETHTOOL_LINK_MODE_10baseT_Half_BIT:
> +		set_mod_args(args, 10, 1, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_10baseT_Full_BIT:
> +		set_mod_args(args, 10, 0, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100baseT_Half_BIT:
> +		set_mod_args(args, 100, 1, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100baseT_Full_BIT:
> +		set_mod_args(args, 100, 0, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_1000baseT_Half_BIT:
> +		set_mod_args(args, 1000, 1, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_1000baseT_Full_BIT:
> +		set_mod_args(args, 1000, 0, 1, BIT_ULL(CGX_MODE_SGMII));
> +		break;
> +	case  ETHTOOL_LINK_MODE_1000baseX_Full_BIT:
> +		set_mod_args(args, 1000, 0, 0, BIT_ULL(CGX_MODE_1000_BASEX));
> +		break;
> +	case  ETHTOOL_LINK_MODE_10000baseT_Full_BIT:
> +		set_mod_args(args, 1000, 0, 1, BIT_ULL(CGX_MODE_QSGMII));

Here the speed is set to 1000 but it looks like this should be 10000. I would have sent a patch to fix that but the mode is also a bit confusing. Normally I'd expect QSGMII to be used for Quad SGMII (i.e. 
4x1G Ethernet ports multiplexed over a single SERDES). I don't see any other mode in enum CGX_MODE_ that is obviously for 10GBase-T so I thought I'd bring this to your attention. I'd still be happy to whip up a patch if you could confirm what the correct mode should be.

>>  10GBase-T to QSGMII mapping is wrong. To correct it, we need to map proper 
      ETHTOOL_LINK_MODEX to QSGMII keeping all other parameters the same.
       As transmit and receive data paths of QSGMII leverage the 1000BASE-X , we may use
        ETHTOOL_LINK_MODE_1000baseSX_Full_BIT.
      If there are no objections to the above mode, go ahead and submit the patch.

Thanks,
Hariprasad k
      

> +		break;
> +	case  ETHTOOL_LINK_MODE_10000baseSR_Full_BIT:
> +		set_mod_args(args, 10000, 0, 0, BIT_ULL(CGX_MODE_10G_C2C));
> +		break;
> +	case  ETHTOOL_LINK_MODE_10000baseLR_Full_BIT:
> +		set_mod_args(args, 10000, 0, 0, BIT_ULL(CGX_MODE_10G_C2M));
> +		break;
> +	case  ETHTOOL_LINK_MODE_10000baseKR_Full_BIT:
> +		set_mod_args(args, 10000, 0, 1, BIT_ULL(CGX_MODE_10G_KR));
> +		break;
> +	case  ETHTOOL_LINK_MODE_25000baseSR_Full_BIT:
> +		set_mod_args(args, 25000, 0, 0, BIT_ULL(CGX_MODE_25G_C2C));
> +		break;
> +	case  ETHTOOL_LINK_MODE_25000baseCR_Full_BIT:
> +		set_mod_args(args, 25000, 0, 1, BIT_ULL(CGX_MODE_25G_CR));
> +		break;
> +	case  ETHTOOL_LINK_MODE_25000baseKR_Full_BIT:
> +		set_mod_args(args, 25000, 0, 1, BIT_ULL(CGX_MODE_25G_KR));
> +		break;
> +	case  ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT:
> +		set_mod_args(args, 40000, 0, 0, BIT_ULL(CGX_MODE_40G_C2C));
> +		break;
> +	case  ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT:
> +		set_mod_args(args, 40000, 0, 0, BIT_ULL(CGX_MODE_40G_C2M));
> +		break;
> +	case  ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT:
> +		set_mod_args(args, 40000, 0, 1, BIT_ULL(CGX_MODE_40G_CR4));
> +		break;
> +	case  ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT:
> +		set_mod_args(args, 40000, 0, 1, BIT_ULL(CGX_MODE_40G_KR4));
> +		break;
> +	case  ETHTOOL_LINK_MODE_50000baseSR_Full_BIT:
> +		set_mod_args(args, 50000, 0, 0, BIT_ULL(CGX_MODE_50G_C2C));
> +		break;
> +	case  ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT:
> +		set_mod_args(args, 50000, 0, 0, BIT_ULL(CGX_MODE_50G_C2M));
> +		break;
> +	case  ETHTOOL_LINK_MODE_50000baseCR_Full_BIT:
> +		set_mod_args(args, 50000, 0, 1, BIT_ULL(CGX_MODE_50G_CR));
> +		break;
> +	case  ETHTOOL_LINK_MODE_50000baseKR_Full_BIT:
> +		set_mod_args(args, 50000, 0, 1, BIT_ULL(CGX_MODE_50G_KR));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT:
> +		set_mod_args(args, 100000, 0, 0, BIT_ULL(CGX_MODE_100G_C2C));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT:
> +		set_mod_args(args, 100000, 0, 0, BIT_ULL(CGX_MODE_100G_C2M));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT:
> +		set_mod_args(args, 100000, 0, 1, BIT_ULL(CGX_MODE_100G_CR4));
> +		break;
> +	case  ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT:
> +		set_mod_args(args, 100000, 0, 1, BIT_ULL(CGX_MODE_100G_KR4));
> +		break;
> +	default:
> +		set_mod_args(args, 0, 1, 0, BIT_ULL(CGX_MODE_MAX));
> +		break;
> +	}
> +}
> +
>   static inline void link_status_user_format(u64 lstat,
>   					   struct cgx_link_user_info *linfo,
>   					   struct cgx *cgx, u8 lmac_id) @@ -887,13 +993,19 @@ int 
> cgx_set_link_mode(void *cgxd, struct cgx_set_link_mode_args args,
>   	if (!cgx)
>   		return -ENODEV;
>   
> +	if (args.mode)
> +		otx2_map_ethtool_link_modes(args.mode, &args);
> +	if (!args.speed && args.duplex && !args.an)
> +		return -EINVAL;
> +
>   	req = FIELD_SET(CMDREG_ID, CGX_CMD_MODE_CHANGE, req);
>   	req = FIELD_SET(CMDMODECHANGE_SPEED,
>   			cgx_link_usertable_index_map(args.speed), req);
>   	req = FIELD_SET(CMDMODECHANGE_DUPLEX, args.duplex, req);
>   	req = FIELD_SET(CMDMODECHANGE_AN, args.an, req);
>   	req = FIELD_SET(CMDMODECHANGE_PORT, args.ports, req);
> -	req = FIELD_SET(CMDMODECHANGE_FLAGS, args.flags, req);
> +	req = FIELD_SET(CMDMODECHANGE_FLAGS, args.mode, req);
> +
>   	return cgx_fwi_cmd_generic(req, &resp, cgx, lmac_id);
>   }
>   int cgx_set_fec(u64 fec, int cgx_id, int lmac_id) diff --git 
> a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h 
> b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
> index 70610e7..dde2bd0 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
> +++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h
> @@ -70,6 +70,36 @@ enum cgx_link_speed {
>   	CGX_LINK_SPEED_MAX,
>   };
>   
> +enum CGX_MODE_ {
> +	CGX_MODE_SGMII,
> +	CGX_MODE_1000_BASEX,
> +	CGX_MODE_QSGMII,
> +	CGX_MODE_10G_C2C,
> +	CGX_MODE_10G_C2M,
> +	CGX_MODE_10G_KR,
> +	CGX_MODE_20G_C2C,
> +	CGX_MODE_25G_C2C,
> +	CGX_MODE_25G_C2M,
> +	CGX_MODE_25G_2_C2C,
> +	CGX_MODE_25G_CR,
> +	CGX_MODE_25G_KR,
> +	CGX_MODE_40G_C2C,
> +	CGX_MODE_40G_C2M,
> +	CGX_MODE_40G_CR4,
> +	CGX_MODE_40G_KR4,
> +	CGX_MODE_40GAUI_C2C,
> +	CGX_MODE_50G_C2C,
> +	CGX_MODE_50G_C2M,
> +	CGX_MODE_50G_4_C2C,
> +	CGX_MODE_50G_CR,
> +	CGX_MODE_50G_KR,
> +	CGX_MODE_80GAUI_C2C,
> +	CGX_MODE_100G_C2C,
> +	CGX_MODE_100G_C2M,
> +	CGX_MODE_100G_CR4,
> +	CGX_MODE_100G_KR4,
> +	CGX_MODE_MAX /* = 29 */
> +};
>   /* REQUEST ID types. Input to firmware */
>   enum cgx_cmd_id {
>   	CGX_CMD_NONE,
> @@ -231,6 +261,6 @@ struct cgx_lnk_sts {
>   #define CMDMODECHANGE_DUPLEX		GENMASK_ULL(12, 12)
>   #define CMDMODECHANGE_AN		GENMASK_ULL(13, 13)
>   #define CMDMODECHANGE_PORT		GENMASK_ULL(21, 14)
> -#define CMDMODECHANGE_FLAGS		GENMASK_ULL(29, 22)
> +#define CMDMODECHANGE_FLAGS		GENMASK_ULL(63, 22)
>   
>   #endif /* __CGX_FW_INTF_H__ */
> diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h 
> b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
> index a050902..05a6da2 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
> +++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
> @@ -462,10 +462,11 @@ struct cgx_set_link_mode_args {
>   	u8 duplex;
>   	u8 an;
>   	u8 ports;
> -	u8 flags;
> +	u64 mode;
>   };
>   
>   struct cgx_set_link_mode_req {
> +#define AUTONEG_UNKNOWN		0xff
>   	struct mbox_msghdr hdr;
>   	struct cgx_set_link_mode_args args;
>   };

Thanks,
Chris

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link status
@ 2021-02-04 15:37 Hariprasad Kelam
  0 siblings, 0 replies; 22+ messages in thread
From: Hariprasad Kelam @ 2021-02-04 15:37 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, linux-kernel, davem, willemdebruijn.kernel, andrew,
	Sunil Kovvuri Goutham, Linu Cherian, Geethasowjanya Akula,
	Jerin Jacob Kollanukkaran, Subbaraya Sundeep Bhatta

Hi Jakub,

> -----Original Message-----
> From: Jakub Kicinski <kuba@kernel.org>
> Sent: Wednesday, February 3, 2021 6:54 AM
> To: Hariprasad Kelam <hkelam@marvell.com>
> Cc: netdev@vger.kernel.org; linux-kernel@vger.kernel.org;
> davem@davemloft.net; willemdebruijn.kernel@gmail.com;
> andrew@lunn.ch; Sunil Kovvuri Goutham <sgoutham@marvell.com>; Linu
> Cherian <lcherian@marvell.com>; Geethasowjanya Akula
> <gakula@marvell.com>; Jerin Jacob Kollanukkaran <jerinj@marvell.com>;
> Subbaraya Sundeep Bhatta <sbhatta@marvell.com>
> Subject: [EXT] Re: [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link
> status
> 
> External Email
> 
> ----------------------------------------------------------------------
> On Sun, 31 Jan 2021 18:41:04 +0530 Hariprasad Kelam wrote:
> > From: Christina Jacob <cjacob@marvell.com>
> >
> > Register get_link_ksettings callback to get link status information
> > from the driver. As virtual function (vf) shares same physical link
> > same API is used for both the drivers and for loop back drivers simply
> > returns the fixed values as its does not have physical link.
> >
> > ethtool eth3
> > Settings for eth3:
> >         Supported ports: [ ]
> >         Supported link modes:   10baseT/Half 10baseT/Full
> >                                 100baseT/Half 100baseT/Full
> >                                 1000baseT/Half 1000baseT/Full
> >                                 10000baseKR/Full
> >                                 1000baseX/Full
> >         Supports auto-negotiation: No
> >         Supported FEC modes: BaseR RS
> >         Advertised link modes:  Not reported
> >         Advertised pause frame use: No
> >         Advertised auto-negotiation: No
> >         Advertised FEC modes: None
> >
> > ethtool lbk0
> > Settings for lbk0:
> > 	Speed: 100000Mb/s
> >         Duplex: Full
> >
> > Signed-off-by: Christina Jacob <cjacob@marvell.com>
> > Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
> > Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
> > ---
> >  .../ethernet/marvell/octeontx2/nic/otx2_ethtool.c  | 151
> > +++++++++++++++++++++
> >  1 file changed, 151 insertions(+)
> >
> > diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
> > b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
> > index e5b1a57..d637815 100644
> > --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
> > +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
> > @@ -14,6 +14,7 @@
> >  #include <linux/etherdevice.h>
> >  #include <linux/log2.h>
> >  #include <linux/net_tstamp.h>
> > +#include <linux/linkmode.h>
> >
> >  #include "otx2_common.h"
> >  #include "otx2_ptp.h"
> > @@ -32,6 +33,24 @@ struct otx2_stat {
> >  	.index = offsetof(struct otx2_dev_stats, stat) / sizeof(u64), \  }
> >
> > +/* Physical link config */
> > +#define OTX2_ETHTOOL_SUPPORTED_MODES 0x638CCBF
> //110001110001100110010111111
> > +#define OTX2_RESERVED_ETHTOOL_LINK_MODE	0
> 
> Just use 0 directly in the code.
> 
Will fix this in next version.

> > +static const int otx2_sgmii_features_array[6] = {
> > +	ETHTOOL_LINK_MODE_10baseT_Half_BIT,
> > +	ETHTOOL_LINK_MODE_10baseT_Full_BIT,
> > +	ETHTOOL_LINK_MODE_100baseT_Half_BIT,
> > +	ETHTOOL_LINK_MODE_100baseT_Full_BIT,
> > +	ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
> > +	ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
> > +};
> 
> Why is this one up at the top of the file but other arrays are not?
> It seems to be used only in once function.
>
Yes . This array used in only in once function. 
Will fix in next version.
 
> > +enum link_mode {
> > +	OTX2_MODE_SUPPORTED,
> > +	OTX2_MODE_ADVERTISED
> > +};
> > +
> >  static const struct otx2_stat otx2_dev_stats[] = {
> >  	OTX2_DEV_STAT(rx_ucast_frames),
> >  	OTX2_DEV_STAT(rx_bcast_frames),
> > @@ -1034,6 +1053,123 @@ static int otx2_set_fecparam(struct net_device
> *netdev,
> >  	return err;
> >  }
> >
> > +static void otx2_get_fec_info(u64 index, int req_mode,
> > +			      struct ethtool_link_ksettings *link_ksettings) {
> > +	__ETHTOOL_DECLARE_LINK_MODE_MASK(otx2_fec_modes) = { 0, };
> > +
> > +	switch (index) {
> > +	case OTX2_FEC_NONE:
> > +		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_NONE_BIT,
> otx2_fec_modes);
> > +		break;
> > +	case OTX2_FEC_BASER:
> > +		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT,
> otx2_fec_modes);
> > +		break;
> > +	case OTX2_FEC_RS:
> > +		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT,
> otx2_fec_modes);
> > +		break;
> > +	case OTX2_FEC_BASER | OTX2_FEC_RS:
> > +		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT,
> otx2_fec_modes);
> > +		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT,
> otx2_fec_modes);
> > +		break;
> > +	}
> > +
> > +	/* Add fec modes to existing modes */
> > +	if (req_mode == OTX2_MODE_ADVERTISED)
> > +		linkmode_or(link_ksettings->link_modes.advertising,
> > +			    link_ksettings->link_modes.advertising,
> > +			    otx2_fec_modes);
> > +	else
> > +		linkmode_or(link_ksettings->link_modes.supported,
> > +			    link_ksettings->link_modes.supported,
> > +			    otx2_fec_modes);
> > +}
> > +
> > +static void otx2_get_link_mode_info(u64 link_mode_bmap,
> > +				    bool req_mode,
> > +				    struct ethtool_link_ksettings
> > +				    *link_ksettings)
> > +{
> > +	__ETHTOOL_DECLARE_LINK_MODE_MASK(otx2_link_modes) = { 0, };
> > +	u8 bit;
> > +
> 
> No empty lines in the middle of variable declarations.
> 
Thanks for pointing this. Will fix in next version.

> > +	/* CGX link modes to Ethtool link mode mapping */
> > +	const int cgx_link_mode[27] = {
> > +		0, /* SGMII  Mode */
> > +		ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
> > +		ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
> > +		ETHTOOL_LINK_MODE_10000baseSR_Full_BIT,
> > +		ETHTOOL_LINK_MODE_10000baseLR_Full_BIT,
> > +		ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
> > +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> > +		ETHTOOL_LINK_MODE_25000baseSR_Full_BIT,
> > +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> > +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> > +		ETHTOOL_LINK_MODE_25000baseCR_Full_BIT,
> > +		ETHTOOL_LINK_MODE_25000baseKR_Full_BIT,
> > +		ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT,
> > +		ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT,
> > +		ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT,
> > +		ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT,
> > +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> > +		ETHTOOL_LINK_MODE_50000baseSR_Full_BIT,
> > +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> > +		ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT,
> > +		ETHTOOL_LINK_MODE_50000baseCR_Full_BIT,
> > +		ETHTOOL_LINK_MODE_50000baseKR_Full_BIT,
> > +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> > +		ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT,
> > +		ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT,
> > +		ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT,
> > +		ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT
> > +	};
> > +
> > +	link_mode_bmap = link_mode_bmap &
> OTX2_ETHTOOL_SUPPORTED_MODES;
> > +
> > +	for_each_set_bit(bit, (unsigned long *)&link_mode_bmap, 27) {
> > +		/* SGMII mode is set */
> > +		if (bit  ==  0)
> 
> Double spaces x2
>
Will fix this in next version.
 
> > +			linkmode_set_bit_array(otx2_sgmii_features_array,
> > +
> ARRAY_SIZE(otx2_sgmii_features_array),
> > +					       otx2_link_modes);
> > +		else
> > +			linkmode_set_bit(cgx_link_mode[bit],
> otx2_link_modes);
> > +	}
> > +
> > +	if (req_mode == OTX2_MODE_ADVERTISED)
> > +		linkmode_copy(link_ksettings->link_modes.advertising,
> otx2_link_modes);
> > +	else
> > +		linkmode_copy(link_ksettings->link_modes.supported,
> > +otx2_link_modes); }
> 
> > +	otx2_get_link_mode_info(rsp->fwdata.advertised_link_modes,
> OTX2_MODE_ADVERTISED, cmd);
> > +	otx2_get_fec_info(rsp->fwdata.advertised_fec,
> OTX2_MODE_ADVERTISED,
> > +cmd);
> > +
> > +	otx2_get_link_mode_info(rsp->fwdata.supported_link_modes,
> OTX2_MODE_SUPPORTED, cmd);
> > +	otx2_get_fec_info(rsp->fwdata.supported_fec,
> OTX2_MODE_SUPPORTED,
> > +cmd);
> 
> Wrap those lines please.
> 
Will fix this in next version.

> > +	return 0;
> > +}
> 
> > +static int otx2vf_get_link_ksettings(struct net_device *netdev,
> > +				     struct ethtool_link_ksettings *cmd) {
> > +	struct otx2_nic *pfvf = netdev_priv(netdev);
> > +
> > +	if (is_otx2_lbkvf(pfvf->pdev)) {
> > +		cmd->base.duplex = DUPLEX_FULL;
> > +		cmd->base.speed = SPEED_100000;
> > +	} else {
> > +		return	otx2_get_link_ksettings(netdev, cmd);
> 
> Double space

Will fix this in next version.

Thanks,
Hariprasad k

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link status
  2021-01-31 13:11 ` Hariprasad Kelam
@ 2021-02-03  1:23   ` Jakub Kicinski
  0 siblings, 0 replies; 22+ messages in thread
From: Jakub Kicinski @ 2021-02-03  1:23 UTC (permalink / raw)
  To: Hariprasad Kelam
  Cc: netdev, linux-kernel, davem, willemdebruijn.kernel, andrew,
	sgoutham, lcherian, gakula, jerinj, sbhatta

On Sun, 31 Jan 2021 18:41:04 +0530 Hariprasad Kelam wrote:
> From: Christina Jacob <cjacob@marvell.com>
> 
> Register get_link_ksettings callback to get link status information
> from the driver. As virtual function (vf) shares same physical link
> same API is used for both the drivers and for loop back drivers
> simply returns the fixed values as its does not have physical link.
> 
> ethtool eth3
> Settings for eth3:
>         Supported ports: [ ]
>         Supported link modes:   10baseT/Half 10baseT/Full
>                                 100baseT/Half 100baseT/Full
>                                 1000baseT/Half 1000baseT/Full
>                                 10000baseKR/Full
>                                 1000baseX/Full
>         Supports auto-negotiation: No
>         Supported FEC modes: BaseR RS
>         Advertised link modes:  Not reported
>         Advertised pause frame use: No
>         Advertised auto-negotiation: No
>         Advertised FEC modes: None
> 
> ethtool lbk0
> Settings for lbk0:
> 	Speed: 100000Mb/s
>         Duplex: Full
> 
> Signed-off-by: Christina Jacob <cjacob@marvell.com>
> Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
> Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
> ---
>  .../ethernet/marvell/octeontx2/nic/otx2_ethtool.c  | 151 +++++++++++++++++++++
>  1 file changed, 151 insertions(+)
> 
> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
> index e5b1a57..d637815 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
> @@ -14,6 +14,7 @@
>  #include <linux/etherdevice.h>
>  #include <linux/log2.h>
>  #include <linux/net_tstamp.h>
> +#include <linux/linkmode.h>
>  
>  #include "otx2_common.h"
>  #include "otx2_ptp.h"
> @@ -32,6 +33,24 @@ struct otx2_stat {
>  	.index = offsetof(struct otx2_dev_stats, stat) / sizeof(u64), \
>  }
>  
> +/* Physical link config */
> +#define OTX2_ETHTOOL_SUPPORTED_MODES 0x638CCBF //110001110001100110010111111
> +#define OTX2_RESERVED_ETHTOOL_LINK_MODE	0

Just use 0 directly in the code.

> +static const int otx2_sgmii_features_array[6] = {
> +	ETHTOOL_LINK_MODE_10baseT_Half_BIT,
> +	ETHTOOL_LINK_MODE_10baseT_Full_BIT,
> +	ETHTOOL_LINK_MODE_100baseT_Half_BIT,
> +	ETHTOOL_LINK_MODE_100baseT_Full_BIT,
> +	ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
> +	ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
> +};

Why is this one up at the top of the file but other arrays are not?
It seems to be used only in once function.

> +enum link_mode {
> +	OTX2_MODE_SUPPORTED,
> +	OTX2_MODE_ADVERTISED
> +};
> +
>  static const struct otx2_stat otx2_dev_stats[] = {
>  	OTX2_DEV_STAT(rx_ucast_frames),
>  	OTX2_DEV_STAT(rx_bcast_frames),
> @@ -1034,6 +1053,123 @@ static int otx2_set_fecparam(struct net_device *netdev,
>  	return err;
>  }
>  
> +static void otx2_get_fec_info(u64 index, int req_mode,
> +			      struct ethtool_link_ksettings *link_ksettings)
> +{
> +	__ETHTOOL_DECLARE_LINK_MODE_MASK(otx2_fec_modes) = { 0, };
> +
> +	switch (index) {
> +	case OTX2_FEC_NONE:
> +		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_NONE_BIT, otx2_fec_modes);
> +		break;
> +	case OTX2_FEC_BASER:
> +		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT, otx2_fec_modes);
> +		break;
> +	case OTX2_FEC_RS:
> +		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT, otx2_fec_modes);
> +		break;
> +	case OTX2_FEC_BASER | OTX2_FEC_RS:
> +		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT, otx2_fec_modes);
> +		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT, otx2_fec_modes);
> +		break;
> +	}
> +
> +	/* Add fec modes to existing modes */
> +	if (req_mode == OTX2_MODE_ADVERTISED)
> +		linkmode_or(link_ksettings->link_modes.advertising,
> +			    link_ksettings->link_modes.advertising,
> +			    otx2_fec_modes);
> +	else
> +		linkmode_or(link_ksettings->link_modes.supported,
> +			    link_ksettings->link_modes.supported,
> +			    otx2_fec_modes);
> +}
> +
> +static void otx2_get_link_mode_info(u64 link_mode_bmap,
> +				    bool req_mode,
> +				    struct ethtool_link_ksettings
> +				    *link_ksettings)
> +{
> +	__ETHTOOL_DECLARE_LINK_MODE_MASK(otx2_link_modes) = { 0, };
> +	u8 bit;
> +

No empty lines in the middle of variable declarations.

> +	/* CGX link modes to Ethtool link mode mapping */
> +	const int cgx_link_mode[27] = {
> +		0, /* SGMII  Mode */
> +		ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
> +		ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
> +		ETHTOOL_LINK_MODE_10000baseSR_Full_BIT,
> +		ETHTOOL_LINK_MODE_10000baseLR_Full_BIT,
> +		ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
> +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> +		ETHTOOL_LINK_MODE_25000baseSR_Full_BIT,
> +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> +		ETHTOOL_LINK_MODE_25000baseCR_Full_BIT,
> +		ETHTOOL_LINK_MODE_25000baseKR_Full_BIT,
> +		ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT,
> +		ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT,
> +		ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT,
> +		ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT,
> +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> +		ETHTOOL_LINK_MODE_50000baseSR_Full_BIT,
> +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> +		ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT,
> +		ETHTOOL_LINK_MODE_50000baseCR_Full_BIT,
> +		ETHTOOL_LINK_MODE_50000baseKR_Full_BIT,
> +		OTX2_RESERVED_ETHTOOL_LINK_MODE,
> +		ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT,
> +		ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT,
> +		ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT,
> +		ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT
> +	};
> +
> +	link_mode_bmap = link_mode_bmap & OTX2_ETHTOOL_SUPPORTED_MODES;
> +
> +	for_each_set_bit(bit, (unsigned long *)&link_mode_bmap, 27) {
> +		/* SGMII mode is set */
> +		if (bit  ==  0)

Double spaces x2

> +			linkmode_set_bit_array(otx2_sgmii_features_array,
> +					       ARRAY_SIZE(otx2_sgmii_features_array),
> +					       otx2_link_modes);
> +		else
> +			linkmode_set_bit(cgx_link_mode[bit], otx2_link_modes);
> +	}
> +
> +	if (req_mode == OTX2_MODE_ADVERTISED)
> +		linkmode_copy(link_ksettings->link_modes.advertising, otx2_link_modes);
> +	else
> +		linkmode_copy(link_ksettings->link_modes.supported, otx2_link_modes);
> +}

> +	otx2_get_link_mode_info(rsp->fwdata.advertised_link_modes, OTX2_MODE_ADVERTISED, cmd);
> +	otx2_get_fec_info(rsp->fwdata.advertised_fec, OTX2_MODE_ADVERTISED, cmd);
> +
> +	otx2_get_link_mode_info(rsp->fwdata.supported_link_modes, OTX2_MODE_SUPPORTED, cmd);
> +	otx2_get_fec_info(rsp->fwdata.supported_fec, OTX2_MODE_SUPPORTED, cmd);

Wrap those lines please.

> +	return 0;
> +}

> +static int otx2vf_get_link_ksettings(struct net_device *netdev,
> +				     struct ethtool_link_ksettings *cmd)
> +{
> +	struct otx2_nic *pfvf = netdev_priv(netdev);
> +
> +	if (is_otx2_lbkvf(pfvf->pdev)) {
> +		cmd->base.duplex = DUPLEX_FULL;
> +		cmd->base.speed = SPEED_100000;
> +	} else {
> +		return	otx2_get_link_ksettings(netdev, cmd);

Double space

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link status
       [not found] <1612098665-187767-1-git-send-email-hkelam@marvell.com>
@ 2021-01-31 13:11 ` Hariprasad Kelam
  2021-02-03  1:23   ` Jakub Kicinski
  0 siblings, 1 reply; 22+ messages in thread
From: Hariprasad Kelam @ 2021-01-31 13:11 UTC (permalink / raw)
  To: netdev, linux-kernel
  Cc: kuba, davem, willemdebruijn.kernel, andrew, sgoutham, lcherian,
	gakula, jerinj, sbhatta, hkelam

From: Christina Jacob <cjacob@marvell.com>

Register get_link_ksettings callback to get link status information
from the driver. As virtual function (vf) shares same physical link
same API is used for both the drivers and for loop back drivers
simply returns the fixed values as its does not have physical link.

ethtool eth3
Settings for eth3:
        Supported ports: [ ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Half 1000baseT/Full
                                10000baseKR/Full
                                1000baseX/Full
        Supports auto-negotiation: No
        Supported FEC modes: BaseR RS
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: None

ethtool lbk0
Settings for lbk0:
	Speed: 100000Mb/s
        Duplex: Full

Signed-off-by: Christina Jacob <cjacob@marvell.com>
Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
---
 .../ethernet/marvell/octeontx2/nic/otx2_ethtool.c  | 151 +++++++++++++++++++++
 1 file changed, 151 insertions(+)

diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
index e5b1a57..d637815 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
@@ -14,6 +14,7 @@
 #include <linux/etherdevice.h>
 #include <linux/log2.h>
 #include <linux/net_tstamp.h>
+#include <linux/linkmode.h>
 
 #include "otx2_common.h"
 #include "otx2_ptp.h"
@@ -32,6 +33,24 @@ struct otx2_stat {
 	.index = offsetof(struct otx2_dev_stats, stat) / sizeof(u64), \
 }
 
+/* Physical link config */
+#define OTX2_ETHTOOL_SUPPORTED_MODES 0x638CCBF //110001110001100110010111111
+#define OTX2_RESERVED_ETHTOOL_LINK_MODE	0
+
+static const int otx2_sgmii_features_array[6] = {
+	ETHTOOL_LINK_MODE_10baseT_Half_BIT,
+	ETHTOOL_LINK_MODE_10baseT_Full_BIT,
+	ETHTOOL_LINK_MODE_100baseT_Half_BIT,
+	ETHTOOL_LINK_MODE_100baseT_Full_BIT,
+	ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
+	ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
+};
+
+enum link_mode {
+	OTX2_MODE_SUPPORTED,
+	OTX2_MODE_ADVERTISED
+};
+
 static const struct otx2_stat otx2_dev_stats[] = {
 	OTX2_DEV_STAT(rx_ucast_frames),
 	OTX2_DEV_STAT(rx_bcast_frames),
@@ -1034,6 +1053,123 @@ static int otx2_set_fecparam(struct net_device *netdev,
 	return err;
 }
 
+static void otx2_get_fec_info(u64 index, int req_mode,
+			      struct ethtool_link_ksettings *link_ksettings)
+{
+	__ETHTOOL_DECLARE_LINK_MODE_MASK(otx2_fec_modes) = { 0, };
+
+	switch (index) {
+	case OTX2_FEC_NONE:
+		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_NONE_BIT, otx2_fec_modes);
+		break;
+	case OTX2_FEC_BASER:
+		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT, otx2_fec_modes);
+		break;
+	case OTX2_FEC_RS:
+		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT, otx2_fec_modes);
+		break;
+	case OTX2_FEC_BASER | OTX2_FEC_RS:
+		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT, otx2_fec_modes);
+		linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT, otx2_fec_modes);
+		break;
+	}
+
+	/* Add fec modes to existing modes */
+	if (req_mode == OTX2_MODE_ADVERTISED)
+		linkmode_or(link_ksettings->link_modes.advertising,
+			    link_ksettings->link_modes.advertising,
+			    otx2_fec_modes);
+	else
+		linkmode_or(link_ksettings->link_modes.supported,
+			    link_ksettings->link_modes.supported,
+			    otx2_fec_modes);
+}
+
+static void otx2_get_link_mode_info(u64 link_mode_bmap,
+				    bool req_mode,
+				    struct ethtool_link_ksettings
+				    *link_ksettings)
+{
+	__ETHTOOL_DECLARE_LINK_MODE_MASK(otx2_link_modes) = { 0, };
+	u8 bit;
+
+	/* CGX link modes to Ethtool link mode mapping */
+	const int cgx_link_mode[27] = {
+		0, /* SGMII  Mode */
+		ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
+		ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
+		ETHTOOL_LINK_MODE_10000baseSR_Full_BIT,
+		ETHTOOL_LINK_MODE_10000baseLR_Full_BIT,
+		ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		ETHTOOL_LINK_MODE_25000baseSR_Full_BIT,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		ETHTOOL_LINK_MODE_25000baseCR_Full_BIT,
+		ETHTOOL_LINK_MODE_25000baseKR_Full_BIT,
+		ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT,
+		ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT,
+		ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT,
+		ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		ETHTOOL_LINK_MODE_50000baseSR_Full_BIT,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT,
+		ETHTOOL_LINK_MODE_50000baseCR_Full_BIT,
+		ETHTOOL_LINK_MODE_50000baseKR_Full_BIT,
+		OTX2_RESERVED_ETHTOOL_LINK_MODE,
+		ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT,
+		ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT,
+		ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT,
+		ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT
+	};
+
+	link_mode_bmap = link_mode_bmap & OTX2_ETHTOOL_SUPPORTED_MODES;
+
+	for_each_set_bit(bit, (unsigned long *)&link_mode_bmap, 27) {
+		/* SGMII mode is set */
+		if (bit  ==  0)
+			linkmode_set_bit_array(otx2_sgmii_features_array,
+					       ARRAY_SIZE(otx2_sgmii_features_array),
+					       otx2_link_modes);
+		else
+			linkmode_set_bit(cgx_link_mode[bit], otx2_link_modes);
+	}
+
+	if (req_mode == OTX2_MODE_ADVERTISED)
+		linkmode_copy(link_ksettings->link_modes.advertising, otx2_link_modes);
+	else
+		linkmode_copy(link_ksettings->link_modes.supported, otx2_link_modes);
+}
+
+static int otx2_get_link_ksettings(struct net_device *netdev,
+				   struct ethtool_link_ksettings *cmd)
+{
+	struct otx2_nic *pfvf = netdev_priv(netdev);
+	struct cgx_fw_data *rsp = NULL;
+
+	cmd->base.duplex  = pfvf->linfo.full_duplex;
+	cmd->base.speed   = pfvf->linfo.speed;
+	cmd->base.autoneg = pfvf->linfo.an;
+
+	rsp = otx2_get_fwdata(pfvf);
+	if (IS_ERR(rsp))
+		return PTR_ERR(rsp);
+
+	if (rsp->fwdata.supported_an)
+		ethtool_link_ksettings_add_link_mode(cmd,
+						     supported,
+						     Autoneg);
+
+	otx2_get_link_mode_info(rsp->fwdata.advertised_link_modes, OTX2_MODE_ADVERTISED, cmd);
+	otx2_get_fec_info(rsp->fwdata.advertised_fec, OTX2_MODE_ADVERTISED, cmd);
+
+	otx2_get_link_mode_info(rsp->fwdata.supported_link_modes, OTX2_MODE_SUPPORTED, cmd);
+	otx2_get_fec_info(rsp->fwdata.supported_fec, OTX2_MODE_SUPPORTED, cmd);
+
+	return 0;
+}
+
 static const struct ethtool_ops otx2_ethtool_ops = {
 	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
 				     ETHTOOL_COALESCE_MAX_FRAMES,
@@ -1063,6 +1199,7 @@ static const struct ethtool_ops otx2_ethtool_ops = {
 	.get_ts_info		= otx2_get_ts_info,
 	.get_fecparam		= otx2_get_fecparam,
 	.set_fecparam		= otx2_set_fecparam,
+	.get_link_ksettings     = otx2_get_link_ksettings,
 };
 
 void otx2_set_ethtool_ops(struct net_device *netdev)
@@ -1137,6 +1274,19 @@ static int otx2vf_get_sset_count(struct net_device *netdev, int sset)
 	return otx2_n_dev_stats + otx2_n_drv_stats + qstats_count + 1;
 }
 
+static int otx2vf_get_link_ksettings(struct net_device *netdev,
+				     struct ethtool_link_ksettings *cmd)
+{
+	struct otx2_nic *pfvf = netdev_priv(netdev);
+
+	if (is_otx2_lbkvf(pfvf->pdev)) {
+		cmd->base.duplex = DUPLEX_FULL;
+		cmd->base.speed = SPEED_100000;
+	} else {
+		return	otx2_get_link_ksettings(netdev, cmd);
+	}
+	return 0;
+}
 static const struct ethtool_ops otx2vf_ethtool_ops = {
 	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
 				     ETHTOOL_COALESCE_MAX_FRAMES,
@@ -1163,6 +1313,7 @@ static const struct ethtool_ops otx2vf_ethtool_ops = {
 	.set_msglevel		= otx2_set_msglevel,
 	.get_pauseparam		= otx2_get_pauseparam,
 	.set_pauseparam		= otx2_set_pauseparam,
+	.get_link_ksettings     = otx2vf_get_link_ksettings,
 };
 
 void otx2vf_set_ethtool_ops(struct net_device *netdev)
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2022-12-02  7:57 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-01  5:24 [Patch v3 net-next 0/7] ethtool support for fec and link configuration Hariprasad Kelam
2021-02-01  5:24 ` [Patch v3 net-next 1/7] octeontx2-af: forward error correction configuration Hariprasad Kelam
2021-02-03  0:43   ` Jesse Brandeburg
2021-02-01  5:24 ` [Patch v3 net-next 2/7] octeontx2-af: Add new CGX_CMD to get PHY FEC statistics Hariprasad Kelam
2021-02-03  0:43   ` Jesse Brandeburg
2021-02-01  5:24 ` [Patch v3 net-next 3/7] octeontx2-pf: ethtool fec mode support Hariprasad Kelam
2021-02-03  0:44   ` Jesse Brandeburg
2021-02-03  1:12   ` Jakub Kicinski
2021-02-01  5:24 ` [Patch v3 net-next 4/7] octeontx2-af: Physical link configuration support Hariprasad Kelam
2021-02-03  0:44   ` Jesse Brandeburg
2021-02-01  5:24 ` [Patch v3 net-next 5/7] octeontx2-af: advertised link modes support on cgx Hariprasad Kelam
2021-02-03  0:45   ` Jesse Brandeburg
2022-12-01  2:02   ` Chris Packham
2022-12-02  7:56     ` Hariprasad Kelam
2021-02-01  5:24 ` [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link status Hariprasad Kelam
2021-02-03  0:46   ` Jesse Brandeburg
2021-02-01  5:24 ` [Patch v3 net-next 7/7] octeontx2-pf: ethtool physical link configuration Hariprasad Kelam
2021-02-03  0:48   ` Jesse Brandeburg
2021-02-03  0:41 ` [Patch v3 net-next 0/7] ethtool support for fec and " Jesse Brandeburg
  -- strict thread matches above, loose matches on Subject: below --
2021-02-04 15:37 [Patch v3 net-next 6/7] octeontx2-pf: ethtool physical link status Hariprasad Kelam
     [not found] <1612098665-187767-1-git-send-email-hkelam@marvell.com>
2021-01-31 13:11 ` Hariprasad Kelam
2021-02-03  1:23   ` Jakub Kicinski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).