Thomas Bogendoerfer fae8c3
From: Ganesh Goudar <ganeshgr@chelsio.com>
Thomas Bogendoerfer fae8c3
Date: Thu, 2 Nov 2017 19:28:20 +0530
Thomas Bogendoerfer fae8c3
Subject: cxgb4vf: define get_fecparam ethtool callback
Thomas Bogendoerfer fae8c3
Patch-mainline: v4.15-rc1
Thomas Bogendoerfer fae8c3
Git-commit: 9a7b96b3462679a2fcf7205d396dbf1f8f28454c
Thomas Bogendoerfer fae8c3
References: bsc#1064802 bsc#1066129
Thomas Bogendoerfer fae8c3
Thomas Bogendoerfer fae8c3
Add support to new ethtool operation get_fecparam to
Thomas Bogendoerfer fae8c3
fetch FEC parameters.
Thomas Bogendoerfer fae8c3
Thomas Bogendoerfer fae8c3
Original Work by: Casey Leedom <leedom@chelsio.com>
Thomas Bogendoerfer fae8c3
Signed-off-by: Ganesh Goudar <ganeshgr@chelsio.com>
Thomas Bogendoerfer fae8c3
Signed-off-by: David S. Miller <davem@davemloft.net>
Thomas Bogendoerfer fae8c3
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer fae8c3
---
Thomas Bogendoerfer fae8c3
 drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c |   58 ++++++++++++++++++++
Thomas Bogendoerfer fae8c3
 1 file changed, 58 insertions(+)
Thomas Bogendoerfer fae8c3
Thomas Bogendoerfer fae8c3
--- a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
Thomas Bogendoerfer fae8c3
+++ b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
Thomas Bogendoerfer fae8c3
@@ -1401,6 +1401,63 @@ static int cxgb4vf_get_link_ksettings(st
Thomas Bogendoerfer fae8c3
 	return 0;
Thomas Bogendoerfer fae8c3
 }
Thomas Bogendoerfer fae8c3
 
Thomas Bogendoerfer fae8c3
+/* Translate the Firmware FEC value into the ethtool value. */
Thomas Bogendoerfer fae8c3
+static inline unsigned int fwcap_to_eth_fec(unsigned int fw_fec)
Thomas Bogendoerfer fae8c3
+{
Thomas Bogendoerfer fae8c3
+	unsigned int eth_fec = 0;
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
+	if (fw_fec & FW_PORT_CAP32_FEC_RS)
Thomas Bogendoerfer fae8c3
+		eth_fec |= ETHTOOL_FEC_RS;
Thomas Bogendoerfer fae8c3
+	if (fw_fec & FW_PORT_CAP32_FEC_BASER_RS)
Thomas Bogendoerfer fae8c3
+		eth_fec |= ETHTOOL_FEC_BASER;
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
+	/* if nothing is set, then FEC is off */
Thomas Bogendoerfer fae8c3
+	if (!eth_fec)
Thomas Bogendoerfer fae8c3
+		eth_fec = ETHTOOL_FEC_OFF;
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
+	return eth_fec;
Thomas Bogendoerfer fae8c3
+}
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
+/* Translate Common Code FEC value into ethtool value. */
Thomas Bogendoerfer fae8c3
+static inline unsigned int cc_to_eth_fec(unsigned int cc_fec)
Thomas Bogendoerfer fae8c3
+{
Thomas Bogendoerfer fae8c3
+	unsigned int eth_fec = 0;
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
+	if (cc_fec & FEC_AUTO)
Thomas Bogendoerfer fae8c3
+		eth_fec |= ETHTOOL_FEC_AUTO;
Thomas Bogendoerfer fae8c3
+	if (cc_fec & FEC_RS)
Thomas Bogendoerfer fae8c3
+		eth_fec |= ETHTOOL_FEC_RS;
Thomas Bogendoerfer fae8c3
+	if (cc_fec & FEC_BASER_RS)
Thomas Bogendoerfer fae8c3
+		eth_fec |= ETHTOOL_FEC_BASER;
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
+	/* if nothing is set, then FEC is off */
Thomas Bogendoerfer fae8c3
+	if (!eth_fec)
Thomas Bogendoerfer fae8c3
+		eth_fec = ETHTOOL_FEC_OFF;
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
+	return eth_fec;
Thomas Bogendoerfer fae8c3
+}
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
+static int cxgb4vf_get_fecparam(struct net_device *dev,
Thomas Bogendoerfer fae8c3
+				struct ethtool_fecparam *fec)
Thomas Bogendoerfer fae8c3
+{
Thomas Bogendoerfer fae8c3
+	const struct port_info *pi = netdev_priv(dev);
Thomas Bogendoerfer fae8c3
+	const struct link_config *lc = &pi->link_cfg;
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
+	/* Translate the Firmware FEC Support into the ethtool value.  We
Thomas Bogendoerfer fae8c3
+	 * always support IEEE 802.3 "automatic" selection of Link FEC type if
Thomas Bogendoerfer fae8c3
+	 * any FEC is supported.
Thomas Bogendoerfer fae8c3
+	 */
Thomas Bogendoerfer fae8c3
+	fec->fec = fwcap_to_eth_fec(lc->pcaps);
Thomas Bogendoerfer fae8c3
+	if (fec->fec != ETHTOOL_FEC_OFF)
Thomas Bogendoerfer fae8c3
+		fec->fec |= ETHTOOL_FEC_AUTO;
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
+	/* Translate the current internal FEC parameters into the
Thomas Bogendoerfer fae8c3
+	 * ethtool values.
Thomas Bogendoerfer fae8c3
+	 */
Thomas Bogendoerfer fae8c3
+	fec->active_fec = cc_to_eth_fec(lc->fec);
Thomas Bogendoerfer fae8c3
+	return 0;
Thomas Bogendoerfer fae8c3
+}
Thomas Bogendoerfer fae8c3
+
Thomas Bogendoerfer fae8c3
 /*
Thomas Bogendoerfer fae8c3
  * Return our driver information.
Thomas Bogendoerfer fae8c3
  */
Thomas Bogendoerfer fae8c3
@@ -1774,6 +1831,7 @@ static void cxgb4vf_get_wol(struct net_d
Thomas Bogendoerfer fae8c3
 
Thomas Bogendoerfer fae8c3
 static const struct ethtool_ops cxgb4vf_ethtool_ops = {
Thomas Bogendoerfer fae8c3
 	.get_link_ksettings	= cxgb4vf_get_link_ksettings,
Thomas Bogendoerfer fae8c3
+	.get_fecparam		= cxgb4vf_get_fecparam,
Thomas Bogendoerfer fae8c3
 	.get_drvinfo		= cxgb4vf_get_drvinfo,
Thomas Bogendoerfer fae8c3
 	.get_msglevel		= cxgb4vf_get_msglevel,
Thomas Bogendoerfer fae8c3
 	.set_msglevel		= cxgb4vf_set_msglevel,