[PATCH 3/3] test: check SFF-8472 calibration saturation and rounding
Roman Khromenok
roma55592 at yandex.ru
Fri Oct 2 14:52:37 CEST 2026
Check that externally calibrated SFF-8472 values out of the range
of their 16-bit fields saturate at both ends, for formula 1
(temperature, voltage, TX bias and TX power) and for the RX power
polynomial, and that calibrated values are rounded to the nearest.
Signed-off-by: Roman Khromenok <roma55592 at yandex.ru>
---
app/test/test_ethdev_module_eeprom.c | 96 ++++++++++++++++++++++++++++
1 file changed, 96 insertions(+)
diff --git a/app/test/test_ethdev_module_eeprom.c b/app/test/test_ethdev_module_eeprom.c
index b07a18aa06..1956fdd440 100644
--- a/app/test/test_ethdev_module_eeprom.c
+++ b/app/test/test_ethdev_module_eeprom.c
@@ -305,6 +305,99 @@ test_module_eeprom_sfp_8472_rx_power_polynomial(void)
return TEST_SUCCESS;
}
+/* SFF-8472 module externally calibrated with unit slopes and zero offsets */
+static void
+fill_sfp_ext_cal(uint8_t *data)
+{
+ uint8_t *a2 = data + RTE_ETH_MODULE_SFF_8079_LEN;
+
+ fill_sfp(data);
+ /* diagnostics implemented, externally calibrated, average RX power */
+ data[92] = 0x58;
+ a2[76] = 1; /* TX bias slope */
+ a2[80] = 1; /* TX power slope */
+ a2[84] = 1; /* temperature slope */
+ a2[88] = 1; /* voltage slope */
+ put_be_float(a2, 68, 0x3f800000); /* RX_PWR(1) = 1.0 */
+}
+
+static int
+test_module_eeprom_sfp_8472_cal_saturate_max(void)
+{
+ uint8_t data[RTE_ETH_MODULE_SFF_8472_LEN];
+ uint8_t *a2 = data + RTE_ETH_MODULE_SFF_8079_LEN;
+
+ fill_sfp_ext_cal(data);
+ /* results above the 16-bit range must saturate */
+ put_u16(a2, 100, 65535); /* raw TX bias */
+ put_u16(a2, 76, 0xffff); /* TX bias slope = 255.996 */
+ put_u16(a2, 102, 60000); /* raw TX power */
+ put_u16(a2, 82, 10000); /* TX power offset */
+ put_u16(a2, 96, 0x7f00); /* raw temperature: 127 C */
+ put_u16(a2, 84, 0x0200); /* temperature slope = 2.0 */
+ put_u16(a2, 98, 60000); /* raw voltage */
+ put_u16(a2, 90, 10000); /* voltage offset */
+ put_u16(a2, 104, 65535); /* raw RX power */
+ put_be_float(a2, 56, 0x3f800000); /* RX_PWR(4) = 1.0 */
+
+ TEST_ASSERT_SUCCESS(parse(RTE_ETH_MODULE_SFF_8472, data, sizeof(data)),
+ "Failed to parse externally calibrated SFF-8472 data");
+ CHECK_FIELD("Laser bias current", "131.070 mA");
+ CHECK_FIELD("Laser output power", "6.5535 mW / 8.16 dBm");
+ CHECK_FIELD("Module temperature", "128.00 degrees C / 262.39 degrees F");
+ CHECK_FIELD("Module voltage", "6.5535 V");
+ CHECK_FIELD("Receiver signal average optical power", "6.5535 mW / 8.16 dBm");
+ return TEST_SUCCESS;
+}
+
+static int
+test_module_eeprom_sfp_8472_cal_saturate_min(void)
+{
+ uint8_t data[RTE_ETH_MODULE_SFF_8472_LEN];
+ uint8_t *a2 = data + RTE_ETH_MODULE_SFF_8079_LEN;
+
+ fill_sfp_ext_cal(data);
+ /* results below the 16-bit range must saturate */
+ put_u16(a2, 100, 100); /* raw TX bias */
+ put_u16(a2, 78, -1000); /* TX bias offset */
+ put_u16(a2, 102, 100); /* raw TX power */
+ put_u16(a2, 82, -1000); /* TX power offset */
+ put_u16(a2, 96, 0x8100); /* raw temperature: -127 C */
+ put_u16(a2, 84, 0x0200); /* temperature slope = 2.0 */
+ put_u16(a2, 98, 100); /* raw voltage */
+ put_u16(a2, 90, -1000); /* voltage offset */
+ put_be_float(a2, 68, 0xbf800000); /* RX_PWR(1) = -1.0 */
+
+ TEST_ASSERT_SUCCESS(parse(RTE_ETH_MODULE_SFF_8472, data, sizeof(data)),
+ "Failed to parse externally calibrated SFF-8472 data");
+ CHECK_FIELD("Laser bias current", "0.000 mA");
+ CHECK_FIELD("Laser output power", "0.0000 mW / -inf dBm");
+ CHECK_FIELD("Module temperature", "-128.00 degrees C / -198.40 degrees F");
+ CHECK_FIELD("Module voltage", "0.0000 V");
+ CHECK_FIELD("Receiver signal average optical power", "0.0000 mW / -inf dBm");
+ return TEST_SUCCESS;
+}
+
+static int
+test_module_eeprom_sfp_8472_cal_round(void)
+{
+ uint8_t data[RTE_ETH_MODULE_SFF_8472_LEN];
+ uint8_t *a2 = data + RTE_ETH_MODULE_SFF_8079_LEN;
+
+ fill_sfp_ext_cal(data);
+ /* calibrated values must be rounded to the nearest, not truncated */
+ put_u16(a2, 100, 3); /* raw TX bias */
+ put_u16(a2, 76, 0x0180); /* TX bias slope = 1.5 */
+ put_u16(a2, 104, 1000); /* raw RX power */
+ put_be_float(a2, 68, 0x3f333333); /* RX_PWR(1) = 0.7, stored as 0.69999999 */
+
+ TEST_ASSERT_SUCCESS(parse(RTE_ETH_MODULE_SFF_8472, data, sizeof(data)),
+ "Failed to parse externally calibrated SFF-8472 data");
+ CHECK_FIELD("Laser bias current", "0.010 mA");
+ CHECK_FIELD("Receiver signal average optical power", "0.0700 mW / -11.55 dBm");
+ return TEST_SUCCESS;
+}
+
static int
test_module_eeprom_invalid(void)
{
@@ -355,6 +448,9 @@ static struct unit_test_suite module_eeprom_testsuite = {
TEST_CASE(test_module_eeprom_sfp_8472_short),
TEST_CASE(test_module_eeprom_sfp_8472_ext_cal_unaligned),
TEST_CASE(test_module_eeprom_sfp_8472_rx_power_polynomial),
+ TEST_CASE(test_module_eeprom_sfp_8472_cal_saturate_max),
+ TEST_CASE(test_module_eeprom_sfp_8472_cal_saturate_min),
+ TEST_CASE(test_module_eeprom_sfp_8472_cal_round),
TEST_CASE(test_module_eeprom_qsfp_8636),
TEST_CASE(test_module_eeprom_qsfp_8636_thresholds),
TEST_CASE(test_module_eeprom_invalid),
--
2.47.3
More information about the dev
mailing list