git: 438b8352856a - stable/13 - cxgbe(4): Do not request an FEC that is invalid for the requested speed.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 28 Feb 2022 06:55:48 UTC
The branch stable/13 has been updated by np: URL: https://cgit.FreeBSD.org/src/commit/?id=438b8352856ad3bd5ef410f60a4dca47ec17cf7b commit 438b8352856ad3bd5ef410f60a4dca47ec17cf7b Author: Navdeep Parhar <np@FreeBSD.org> AuthorDate: 2022-01-05 18:45:06 +0000 Commit: Navdeep Parhar <np@FreeBSD.org> CommitDate: 2022-02-28 06:48:49 +0000 cxgbe(4): Do not request an FEC that is invalid for the requested speed. This eliminates error messages like this from the driver when running at 50Gbps with 100G cables: [3726] cc0: l1cfg failed: 71 [4407] cc0: l1cfg failed: 71 Note that link comes up anyway with or without this change. Reported by: Suhas Lokesha @ Chelsio Sponsored by: Chelsio Communications (cherry picked from commit f3c2987f2f5c91f0801fa8bbf9e1bc09d91aeb46) --- sys/dev/cxgbe/common/t4_hw.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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 { /*