|
@@ -55,6 +55,8 @@
|
|
#define NSP_ETH_PORT_INDEX GENMASK_ULL(15, 8)
|
|
#define NSP_ETH_PORT_INDEX GENMASK_ULL(15, 8)
|
|
#define NSP_ETH_PORT_LABEL GENMASK_ULL(53, 48)
|
|
#define NSP_ETH_PORT_LABEL GENMASK_ULL(53, 48)
|
|
#define NSP_ETH_PORT_PHYLABEL GENMASK_ULL(59, 54)
|
|
#define NSP_ETH_PORT_PHYLABEL GENMASK_ULL(59, 54)
|
|
|
|
+#define NSP_ETH_PORT_FEC_SUPP_BASER BIT_ULL(60)
|
|
|
|
+#define NSP_ETH_PORT_FEC_SUPP_RS BIT_ULL(61)
|
|
|
|
|
|
#define NSP_ETH_PORT_LANES_MASK cpu_to_le64(NSP_ETH_PORT_LANES)
|
|
#define NSP_ETH_PORT_LANES_MASK cpu_to_le64(NSP_ETH_PORT_LANES)
|
|
|
|
|
|
@@ -67,6 +69,7 @@
|
|
#define NSP_ETH_STATE_MEDIA GENMASK_ULL(21, 20)
|
|
#define NSP_ETH_STATE_MEDIA GENMASK_ULL(21, 20)
|
|
#define NSP_ETH_STATE_OVRD_CHNG BIT_ULL(22)
|
|
#define NSP_ETH_STATE_OVRD_CHNG BIT_ULL(22)
|
|
#define NSP_ETH_STATE_ANEG GENMASK_ULL(25, 23)
|
|
#define NSP_ETH_STATE_ANEG GENMASK_ULL(25, 23)
|
|
|
|
+#define NSP_ETH_STATE_FEC GENMASK_ULL(27, 26)
|
|
|
|
|
|
#define NSP_ETH_CTRL_CONFIGURED BIT_ULL(0)
|
|
#define NSP_ETH_CTRL_CONFIGURED BIT_ULL(0)
|
|
#define NSP_ETH_CTRL_ENABLED BIT_ULL(1)
|
|
#define NSP_ETH_CTRL_ENABLED BIT_ULL(1)
|
|
@@ -75,6 +78,7 @@
|
|
#define NSP_ETH_CTRL_SET_RATE BIT_ULL(4)
|
|
#define NSP_ETH_CTRL_SET_RATE BIT_ULL(4)
|
|
#define NSP_ETH_CTRL_SET_LANES BIT_ULL(5)
|
|
#define NSP_ETH_CTRL_SET_LANES BIT_ULL(5)
|
|
#define NSP_ETH_CTRL_SET_ANEG BIT_ULL(6)
|
|
#define NSP_ETH_CTRL_SET_ANEG BIT_ULL(6)
|
|
|
|
+#define NSP_ETH_CTRL_SET_FEC BIT_ULL(7)
|
|
|
|
|
|
enum nfp_eth_raw {
|
|
enum nfp_eth_raw {
|
|
NSP_ETH_RAW_PORT = 0,
|
|
NSP_ETH_RAW_PORT = 0,
|
|
@@ -152,6 +156,7 @@ nfp_eth_port_translate(struct nfp_nsp *nsp, const union eth_table_entry *src,
|
|
unsigned int index, struct nfp_eth_table_port *dst)
|
|
unsigned int index, struct nfp_eth_table_port *dst)
|
|
{
|
|
{
|
|
unsigned int rate;
|
|
unsigned int rate;
|
|
|
|
+ unsigned int fec;
|
|
u64 port, state;
|
|
u64 port, state;
|
|
|
|
|
|
port = le64_to_cpu(src->port);
|
|
port = le64_to_cpu(src->port);
|
|
@@ -183,6 +188,18 @@ nfp_eth_port_translate(struct nfp_nsp *nsp, const union eth_table_entry *src,
|
|
|
|
|
|
dst->override_changed = FIELD_GET(NSP_ETH_STATE_OVRD_CHNG, state);
|
|
dst->override_changed = FIELD_GET(NSP_ETH_STATE_OVRD_CHNG, state);
|
|
dst->aneg = FIELD_GET(NSP_ETH_STATE_ANEG, state);
|
|
dst->aneg = FIELD_GET(NSP_ETH_STATE_ANEG, state);
|
|
|
|
+
|
|
|
|
+ if (nfp_nsp_get_abi_ver_minor(nsp) < 22)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ fec = FIELD_GET(NSP_ETH_PORT_FEC_SUPP_BASER, port);
|
|
|
|
+ dst->fec_modes_supported |= fec << NFP_FEC_BASER_BIT;
|
|
|
|
+ fec = FIELD_GET(NSP_ETH_PORT_FEC_SUPP_RS, port);
|
|
|
|
+ dst->fec_modes_supported |= fec << NFP_FEC_REED_SOLOMON_BIT;
|
|
|
|
+ if (dst->fec_modes_supported)
|
|
|
|
+ dst->fec_modes_supported |= NFP_FEC_AUTO | NFP_FEC_DISABLED;
|
|
|
|
+
|
|
|
|
+ dst->fec = 1 << FIELD_GET(NSP_ETH_STATE_FEC, state);
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -527,6 +544,53 @@ int __nfp_eth_set_aneg(struct nfp_nsp *nsp, enum nfp_eth_aneg mode)
|
|
NSP_ETH_CTRL_SET_ANEG);
|
|
NSP_ETH_CTRL_SET_ANEG);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * __nfp_eth_set_fec() - set PHY forward error correction control bit
|
|
|
|
+ * @nsp: NFP NSP handle returned from nfp_eth_config_start()
|
|
|
|
+ * @mode: Desired fec mode
|
|
|
|
+ *
|
|
|
|
+ * Set the PHY module forward error correction mode.
|
|
|
|
+ * Will write to hwinfo overrides in the flash (persistent config).
|
|
|
|
+ *
|
|
|
|
+ * Return: 0 or -ERRNO.
|
|
|
|
+ */
|
|
|
|
+static int __nfp_eth_set_fec(struct nfp_nsp *nsp, enum nfp_eth_fec mode)
|
|
|
|
+{
|
|
|
|
+ return NFP_ETH_SET_BIT_CONFIG(nsp, NSP_ETH_RAW_STATE,
|
|
|
|
+ NSP_ETH_STATE_FEC, mode,
|
|
|
|
+ NSP_ETH_CTRL_SET_FEC);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * nfp_eth_set_fec() - set PHY forward error correction control mode
|
|
|
|
+ * @cpp: NFP CPP handle
|
|
|
|
+ * @idx: NFP chip-wide port index
|
|
|
|
+ * @mode: Desired fec mode
|
|
|
|
+ *
|
|
|
|
+ * Return:
|
|
|
|
+ * 0 - configuration successful;
|
|
|
|
+ * 1 - no changes were needed;
|
|
|
|
+ * -ERRNO - configuration failed.
|
|
|
|
+ */
|
|
|
|
+int
|
|
|
|
+nfp_eth_set_fec(struct nfp_cpp *cpp, unsigned int idx, enum nfp_eth_fec mode)
|
|
|
|
+{
|
|
|
|
+ struct nfp_nsp *nsp;
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ nsp = nfp_eth_config_start(cpp, idx);
|
|
|
|
+ if (IS_ERR(nsp))
|
|
|
|
+ return PTR_ERR(nsp);
|
|
|
|
+
|
|
|
|
+ err = __nfp_eth_set_fec(nsp, mode);
|
|
|
|
+ if (err) {
|
|
|
|
+ nfp_eth_config_cleanup_end(nsp);
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return nfp_eth_config_commit_end(nsp);
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* __nfp_eth_set_speed() - set interface speed/rate
|
|
* __nfp_eth_set_speed() - set interface speed/rate
|
|
* @nsp: NFP NSP handle returned from nfp_eth_config_start()
|
|
* @nsp: NFP NSP handle returned from nfp_eth_config_start()
|