aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/cxgbe/common/t4_hw.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/dev/cxgbe/common/t4_hw.c b/sys/dev/cxgbe/common/t4_hw.c
index d65d69075e88..c60594596959 100644
--- a/sys/dev/cxgbe/common/t4_hw.c
+++ b/sys/dev/cxgbe/common/t4_hw.c
@@ -3924,6 +3924,9 @@ int t4_link_l1cfg(struct adapter *adap, unsigned int mbox, unsigned int port,
if (speed & FW_PORT_CAP32_SPEED_100G) {
fec |= FW_PORT_CAP32_FEC_RS;
fec |= FW_PORT_CAP32_FEC_NO_FEC;
+ } else if (speed & FW_PORT_CAP32_SPEED_50G) {
+ fec |= FW_PORT_CAP32_FEC_BASER_RS;
+ fec |= FW_PORT_CAP32_FEC_NO_FEC;
} else {
fec |= FW_PORT_CAP32_FEC_RS;
fec |= FW_PORT_CAP32_FEC_BASER_RS;
@@ -3937,6 +3940,19 @@ int t4_link_l1cfg(struct adapter *adap, unsigned int mbox, unsigned int port,
* because we aren't setting FORCE_FEC here.
*/
fec |= fec_to_fwcap(lc->fec_hint);
+ MPASS(powerof2(fec));
+
+ /*
+ * Override the hint if the FEC is not valid for
+ * the potential top speed. Request the best
+ * FEC at that speed instead.
+ */
+ if (speed & FW_PORT_CAP32_SPEED_100G &&
+ fec == FW_PORT_CAP32_FEC_BASER_RS)
+ fec = FW_PORT_CAP32_FEC_RS;
+ else if (speed & FW_PORT_CAP32_SPEED_50G &&
+ fec == FW_PORT_CAP32_FEC_RS)
+ fec = FW_PORT_CAP32_FEC_BASER_RS;
}
} else {
/*