|
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,
|