Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/111893/?format=api
https://patches.dpdk.org/api/patches/111893/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/patch/20220526073215.428410-5-robinx.zhang@intel.com/", "project": { "id": 1, "url": "https://patches.dpdk.org/api/projects/1/?format=api", "name": "DPDK", "link_name": "dpdk", "list_id": "dev.dpdk.org", "list_email": "dev@dpdk.org", "web_url": "http://core.dpdk.org", "scm_url": "git://dpdk.org/dpdk", "webscm_url": "http://git.dpdk.org/dpdk", "list_archive_url": "https://inbox.dpdk.org/dev", "list_archive_url_format": "https://inbox.dpdk.org/dev/{}", "commit_url_format": "" }, "msgid": "<20220526073215.428410-5-robinx.zhang@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20220526073215.428410-5-robinx.zhang@intel.com", "date": "2022-05-26T07:32:14", "name": "[v9,4/5] ethdev: support SFF-8472 module information telemetry", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "1d4e63357d06048880a549448347d84db80e2b1f", "submitter": { "id": 2004, "url": "https://patches.dpdk.org/api/people/2004/?format=api", "name": "Robin Zhang", "email": "robinx.zhang@intel.com" }, "delegate": { "id": 3961, "url": "https://patches.dpdk.org/api/users/3961/?format=api", "username": "arybchenko", "first_name": "Andrew", "last_name": "Rybchenko", "email": "andrew.rybchenko@oktetlabs.ru" }, "mbox": "https://patches.dpdk.org/project/dpdk/patch/20220526073215.428410-5-robinx.zhang@intel.com/mbox/", "series": [ { "id": 23180, "url": "https://patches.dpdk.org/api/series/23180/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=23180", "date": "2022-05-26T07:32:10", "name": "add telemetry command for show module EEPROM", "version": 9, "mbox": "https://patches.dpdk.org/series/23180/mbox/" } ], "comments": "https://patches.dpdk.org/api/patches/111893/comments/", "check": "success", "checks": "https://patches.dpdk.org/api/patches/111893/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dev-bounces@dpdk.org>", "X-Original-To": "patchwork@inbox.dpdk.org", "Delivered-To": "patchwork@inbox.dpdk.org", "Received": [ "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 2DE54A0557;\n\tThu, 26 May 2022 09:40:01 +0200 (CEST)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id EB0954281C;\n\tThu, 26 May 2022 09:39:39 +0200 (CEST)", "from mga04.intel.com (mga04.intel.com [192.55.52.120])\n by mails.dpdk.org (Postfix) with ESMTP id 842A3410DC\n for <dev@dpdk.org>; Thu, 26 May 2022 09:39:32 +0200 (CEST)", "from orsmga006.jf.intel.com ([10.7.209.51])\n by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 26 May 2022 00:39:30 -0700", "from intel-cd-odc-robin.cd.intel.com ([10.240.178.142])\n by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 26 May 2022 00:39:28 -0700" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1653550772; x=1685086772;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=7d3efdIexF0PA9fqjmCgzVfyIrxub5gzBi3nQiI62mU=;\n b=danYpU4YaM2GhwhblG75Ll/gMNfm9BFcquJHsI9PwAokIvvpwvUt1wo7\n +3WB0cg+vuS8a9ydWRCyitlNckXrj8C+sfr0F6PfoGsyf807ABZWKTSkw\n fR/EE5lAKugg+gTfMtD5vxc/UklJcJVSTnC8x7jt6J80AnXgKZSlgQipj\n skz8tndr2BjNanIbjSwMwKwoH3JKutEnjsIdBR2ClPHRDnTgryT0Ro/K1\n KIxl88oN14GFWgVIcBYNN+lvCzL9vnu8EuwhGPNDCNm4A77JAUxtFJjoV\n 2yARJN0b7Ni0dSFYdRy5pS6xZ0a5mwRf5/wO9yi+0wcNjiJF5EYJKkFnn w==;", "X-IronPort-AV": [ "E=McAfee;i=\"6400,9594,10358\"; a=\"272885337\"", "E=Sophos;i=\"5.91,252,1647327600\"; d=\"scan'208\";a=\"272885337\"", "E=Sophos;i=\"5.91,252,1647327600\"; d=\"scan'208\";a=\"549441867\"" ], "From": "Robin Zhang <robinx.zhang@intel.com>", "To": "dev@dpdk.org", "Cc": "thomas@monjalon.net, andrew.rybchenko@oktetlabs.ru, kevinx.liu@intel.com,\n Robin Zhang <robinx.zhang@intel.com>", "Subject": "[PATCH v9 4/5] ethdev: support SFF-8472 module information telemetry", "Date": "Thu, 26 May 2022 07:32:14 +0000", "Message-Id": "<20220526073215.428410-5-robinx.zhang@intel.com>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<20220526073215.428410-1-robinx.zhang@intel.com>", "References": "<20220525031446.72578-1-robinx.zhang@intel.com>\n <20220526073215.428410-1-robinx.zhang@intel.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "DPDK patches and discussions <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org" }, "content": "Add support for module EEPROM information format defined in\nSFF-8472 Rev 12.0\n\nSigned-off-by: Robin Zhang <robinx.zhang@intel.com>\nSigned-off-by: Kevin Liu <kevinx.liu@intel.com>\n---\n lib/ethdev/meson.build | 1 +\n lib/ethdev/sff_8472.c | 280 +++++++++++++++++++++++++++++++++++++\n lib/ethdev/sff_telemetry.c | 4 +\n 3 files changed, 285 insertions(+)\n create mode 100644 lib/ethdev/sff_8472.c", "diff": "diff --git a/lib/ethdev/meson.build b/lib/ethdev/meson.build\nindex 5823fa0375..6c24c0b715 100644\n--- a/lib/ethdev/meson.build\n+++ b/lib/ethdev/meson.build\n@@ -14,6 +14,7 @@ sources = files(\n 'sff_telemetry.c',\n 'sff_common.c',\n 'sff_8079.c',\n+ 'sff_8472.c',\n )\n \n headers = files(\ndiff --git a/lib/ethdev/sff_8472.c b/lib/ethdev/sff_8472.c\nnew file mode 100644\nindex 0000000000..97f231854c\n--- /dev/null\n+++ b/lib/ethdev/sff_8472.c\n@@ -0,0 +1,280 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2022 Intel Corporation\n+ * Implements SFF-8472 optics diagnostics.\n+ */\n+\n+#include <stdio.h>\n+\n+#include \"sff_common.h\"\n+\n+/* Offsets in decimal, for direct comparison with the SFF specs */\n+\n+/* A0-based EEPROM offsets for DOM support checks */\n+#define SFF_A0_DOM 92\n+#define SFF_A0_OPTIONS 93\n+#define SFF_A0_COMP 94\n+\n+/* EEPROM bit values for various registers */\n+#define SFF_A0_DOM_EXTCAL RTE_BIT32(4)\n+#define SFF_A0_DOM_INTCAL RTE_BIT32(5)\n+#define SFF_A0_DOM_IMPL RTE_BIT32(6)\n+#define SFF_A0_DOM_PWRT RTE_BIT32(3)\n+\n+#define SFF_A0_OPTIONS_AW RTE_BIT32(7)\n+\n+/*\n+ * This is the offset at which the A2 page is in the EEPROM\n+ * blob returned by the kernel.\n+ */\n+#define SFF_A2_BASE 0x100\n+\n+/* A2-based offsets for DOM */\n+#define SFF_A2_TEMP 96\n+#define SFF_A2_TEMP_HALRM 0\n+#define SFF_A2_TEMP_LALRM 2\n+#define SFF_A2_TEMP_HWARN 4\n+#define SFF_A2_TEMP_LWARN 6\n+\n+#define SFF_A2_VCC 98\n+#define SFF_A2_VCC_HALRM 8\n+#define SFF_A2_VCC_LALRM 10\n+#define SFF_A2_VCC_HWARN 12\n+#define SFF_A2_VCC_LWARN 14\n+\n+#define SFF_A2_BIAS 100\n+#define SFF_A2_BIAS_HALRM 16\n+#define SFF_A2_BIAS_LALRM 18\n+#define SFF_A2_BIAS_HWARN 20\n+#define SFF_A2_BIAS_LWARN 22\n+\n+#define SFF_A2_TX_PWR 102\n+#define SFF_A2_TX_PWR_HALRM 24\n+#define SFF_A2_TX_PWR_LALRM 26\n+#define SFF_A2_TX_PWR_HWARN 28\n+#define SFF_A2_TX_PWR_LWARN 30\n+\n+#define SFF_A2_RX_PWR 104\n+#define SFF_A2_RX_PWR_HALRM 32\n+#define SFF_A2_RX_PWR_LALRM 34\n+#define SFF_A2_RX_PWR_HWARN 36\n+#define SFF_A2_RX_PWR_LWARN 38\n+\n+#define SFF_A2_ALRM_FLG 112\n+#define SFF_A2_WARN_FLG 116\n+\n+/* 32-bit little-endian calibration constants */\n+#define SFF_A2_CAL_RXPWR4 56\n+#define SFF_A2_CAL_RXPWR3 60\n+#define SFF_A2_CAL_RXPWR2 64\n+#define SFF_A2_CAL_RXPWR1 68\n+#define SFF_A2_CAL_RXPWR0 72\n+\n+/* 16-bit little endian calibration constants */\n+#define SFF_A2_CAL_TXI_SLP 76\n+#define SFF_A2_CAL_TXI_OFF 78\n+#define SFF_A2_CAL_TXPWR_SLP 80\n+#define SFF_A2_CAL_TXPWR_OFF 82\n+#define SFF_A2_CAL_T_SLP 84\n+#define SFF_A2_CAL_T_OFF 86\n+#define SFF_A2_CAL_V_SLP 88\n+#define SFF_A2_CAL_V_OFF 90\n+\n+static struct sff_8472_aw_flags {\n+\tconst char *str; /* Human-readable string, null at the end */\n+\tint offset; /* A2-relative address offset */\n+\tuint8_t value; /* Alarm is on if (offset & value) != 0. */\n+} sff_8472_aw_flags[] = {\n+\t{ \"Laser bias current high alarm\", SFF_A2_ALRM_FLG, RTE_BIT32(3) },\n+\t{ \"Laser bias current low alarm\", SFF_A2_ALRM_FLG, RTE_BIT32(2) },\n+\t{ \"Laser bias current high warning\", SFF_A2_WARN_FLG, RTE_BIT32(3) },\n+\t{ \"Laser bias current low warning\", SFF_A2_WARN_FLG, RTE_BIT32(2) },\n+\n+\t{ \"Laser output power high alarm\", SFF_A2_ALRM_FLG, RTE_BIT32(1) },\n+\t{ \"Laser output power low alarm\", SFF_A2_ALRM_FLG, RTE_BIT32(0) },\n+\t{ \"Laser output power high warning\", SFF_A2_WARN_FLG, RTE_BIT32(1) },\n+\t{ \"Laser output power low warning\", SFF_A2_WARN_FLG, RTE_BIT32(0) },\n+\n+\t{ \"Module temperature high alarm\", SFF_A2_ALRM_FLG, RTE_BIT32(7) },\n+\t{ \"Module temperature low alarm\", SFF_A2_ALRM_FLG, RTE_BIT32(6) },\n+\t{ \"Module temperature high warning\", SFF_A2_WARN_FLG, RTE_BIT32(7) },\n+\t{ \"Module temperature low warning\", SFF_A2_WARN_FLG, RTE_BIT32(6) },\n+\n+\t{ \"Module voltage high alarm\", SFF_A2_ALRM_FLG, RTE_BIT32(5) },\n+\t{ \"Module voltage low alarm\", SFF_A2_ALRM_FLG, RTE_BIT32(4) },\n+\t{ \"Module voltage high warning\", SFF_A2_WARN_FLG, RTE_BIT32(5) },\n+\t{ \"Module voltage low warning\", SFF_A2_WARN_FLG, RTE_BIT32(4) },\n+\n+\t{ \"Laser rx power high alarm\", SFF_A2_ALRM_FLG + 1, RTE_BIT32(7) },\n+\t{ \"Laser rx power low alarm\", SFF_A2_ALRM_FLG + 1, RTE_BIT32(6) },\n+\t{ \"Laser rx power high warning\", SFF_A2_WARN_FLG + 1, RTE_BIT32(7) },\n+\t{ \"Laser rx power low warning\", SFF_A2_WARN_FLG + 1, RTE_BIT32(6) },\n+\n+\t{ NULL, 0, 0 },\n+};\n+\n+/* Most common case: 16-bit unsigned integer in a certain unit */\n+#define A2_OFFSET_TO_U16(offset) \\\n+\t(data[SFF_A2_BASE + (offset)] << 8 | data[SFF_A2_BASE + (offset) + 1])\n+\n+/* Calibration slope is a number between 0.0 included and 256.0 excluded. */\n+#define A2_OFFSET_TO_SLP(offset) \\\n+\t(data[SFF_A2_BASE + (offset)] + data[SFF_A2_BASE + (offset) + 1] / 256.)\n+\n+/* Calibration offset is an integer from -32768 to 32767 */\n+#define A2_OFFSET_TO_OFF(offset) \\\n+\t((int16_t)A2_OFFSET_TO_U16(offset))\n+\n+/* RXPWR(x) are IEEE-754 floating point numbers in big-endian format */\n+#define A2_OFFSET_TO_RXPWRx(offset) \\\n+\t(befloattoh((const uint32_t *)(data + SFF_A2_BASE + (offset))))\n+\n+/*\n+ * 2-byte internal temperature conversions:\n+ * First byte is a signed 8-bit integer, which is the temp decimal part\n+ * Second byte are 1/256th of degree, which are added to the dec part.\n+ */\n+#define A2_OFFSET_TO_TEMP(offset) ((int16_t)A2_OFFSET_TO_U16(offset))\n+\n+static void sff_8472_dom_parse(const uint8_t *data, struct sff_diags *sd)\n+{\n+\tsd->bias_cur[SFF_MCURR] = A2_OFFSET_TO_U16(SFF_A2_BIAS);\n+\tsd->bias_cur[SFF_HALRM] = A2_OFFSET_TO_U16(SFF_A2_BIAS_HALRM);\n+\tsd->bias_cur[SFF_LALRM] = A2_OFFSET_TO_U16(SFF_A2_BIAS_LALRM);\n+\tsd->bias_cur[SFF_HWARN] = A2_OFFSET_TO_U16(SFF_A2_BIAS_HWARN);\n+\tsd->bias_cur[SFF_LWARN] = A2_OFFSET_TO_U16(SFF_A2_BIAS_LWARN);\n+\n+\tsd->sfp_voltage[SFF_MCURR] = A2_OFFSET_TO_U16(SFF_A2_VCC);\n+\tsd->sfp_voltage[SFF_HALRM] = A2_OFFSET_TO_U16(SFF_A2_VCC_HALRM);\n+\tsd->sfp_voltage[SFF_LALRM] = A2_OFFSET_TO_U16(SFF_A2_VCC_LALRM);\n+\tsd->sfp_voltage[SFF_HWARN] = A2_OFFSET_TO_U16(SFF_A2_VCC_HWARN);\n+\tsd->sfp_voltage[SFF_LWARN] = A2_OFFSET_TO_U16(SFF_A2_VCC_LWARN);\n+\n+\tsd->tx_power[SFF_MCURR] = A2_OFFSET_TO_U16(SFF_A2_TX_PWR);\n+\tsd->tx_power[SFF_HALRM] = A2_OFFSET_TO_U16(SFF_A2_TX_PWR_HALRM);\n+\tsd->tx_power[SFF_LALRM] = A2_OFFSET_TO_U16(SFF_A2_TX_PWR_LALRM);\n+\tsd->tx_power[SFF_HWARN] = A2_OFFSET_TO_U16(SFF_A2_TX_PWR_HWARN);\n+\tsd->tx_power[SFF_LWARN] = A2_OFFSET_TO_U16(SFF_A2_TX_PWR_LWARN);\n+\n+\tsd->rx_power[SFF_MCURR] = A2_OFFSET_TO_U16(SFF_A2_RX_PWR);\n+\tsd->rx_power[SFF_HALRM] = A2_OFFSET_TO_U16(SFF_A2_RX_PWR_HALRM);\n+\tsd->rx_power[SFF_LALRM] = A2_OFFSET_TO_U16(SFF_A2_RX_PWR_LALRM);\n+\tsd->rx_power[SFF_HWARN] = A2_OFFSET_TO_U16(SFF_A2_RX_PWR_HWARN);\n+\tsd->rx_power[SFF_LWARN] = A2_OFFSET_TO_U16(SFF_A2_RX_PWR_LWARN);\n+\n+\tsd->sfp_temp[SFF_MCURR] = A2_OFFSET_TO_TEMP(SFF_A2_TEMP);\n+\tsd->sfp_temp[SFF_HALRM] = A2_OFFSET_TO_TEMP(SFF_A2_TEMP_HALRM);\n+\tsd->sfp_temp[SFF_LALRM] = A2_OFFSET_TO_TEMP(SFF_A2_TEMP_LALRM);\n+\tsd->sfp_temp[SFF_HWARN] = A2_OFFSET_TO_TEMP(SFF_A2_TEMP_HWARN);\n+\tsd->sfp_temp[SFF_LWARN] = A2_OFFSET_TO_TEMP(SFF_A2_TEMP_LWARN);\n+}\n+\n+/* Converts to a float from a big-endian 4-byte source buffer. */\n+static float befloattoh(const uint32_t *source)\n+{\n+\tunion {\n+\t\tuint32_t src;\n+\t\tfloat dst;\n+\t} converter;\n+\n+\tconverter.src = ntohl(*source);\n+\treturn converter.dst;\n+}\n+\n+static void sff_8472_calibration(const uint8_t *data, struct sff_diags *sd)\n+{\n+\tunsigned long i;\n+\tuint16_t rx_reading;\n+\n+\t/* Calibration should occur for all values (threshold and current) */\n+\tfor (i = 0; i < RTE_DIM(sd->bias_cur); ++i) {\n+\t\t/*\n+\t\t * Apply calibration formula 1 (Temp., Voltage, Bias, Tx Power)\n+\t\t */\n+\t\tsd->bias_cur[i] *= A2_OFFSET_TO_SLP(SFF_A2_CAL_TXI_SLP);\n+\t\tsd->tx_power[i] *= A2_OFFSET_TO_SLP(SFF_A2_CAL_TXPWR_SLP);\n+\t\tsd->sfp_voltage[i] *= A2_OFFSET_TO_SLP(SFF_A2_CAL_V_SLP);\n+\t\tsd->sfp_temp[i] *= A2_OFFSET_TO_SLP(SFF_A2_CAL_T_SLP);\n+\n+\t\tsd->bias_cur[i] += A2_OFFSET_TO_OFF(SFF_A2_CAL_TXI_OFF);\n+\t\tsd->tx_power[i] += A2_OFFSET_TO_OFF(SFF_A2_CAL_TXPWR_OFF);\n+\t\tsd->sfp_voltage[i] += A2_OFFSET_TO_OFF(SFF_A2_CAL_V_OFF);\n+\t\tsd->sfp_temp[i] += A2_OFFSET_TO_OFF(SFF_A2_CAL_T_OFF);\n+\n+\t\t/*\n+\t\t * Apply calibration formula 2 (Rx Power only)\n+\t\t */\n+\t\trx_reading = sd->rx_power[i];\n+\t\tsd->rx_power[i] = A2_OFFSET_TO_RXPWRx(SFF_A2_CAL_RXPWR0);\n+\t\tsd->rx_power[i] += rx_reading *\n+\t\t\tA2_OFFSET_TO_RXPWRx(SFF_A2_CAL_RXPWR1);\n+\t\tsd->rx_power[i] += rx_reading *\n+\t\t\tA2_OFFSET_TO_RXPWRx(SFF_A2_CAL_RXPWR2);\n+\t\tsd->rx_power[i] += rx_reading *\n+\t\t\tA2_OFFSET_TO_RXPWRx(SFF_A2_CAL_RXPWR3);\n+\t}\n+}\n+\n+static void sff_8472_parse_eeprom(const uint8_t *data, struct sff_diags *sd)\n+{\n+\tsd->supports_dom = data[SFF_A0_DOM] & SFF_A0_DOM_IMPL;\n+\tsd->supports_alarms = data[SFF_A0_OPTIONS] & SFF_A0_OPTIONS_AW;\n+\tsd->calibrated_ext = data[SFF_A0_DOM] & SFF_A0_DOM_EXTCAL;\n+\tsd->rx_power_type = data[SFF_A0_DOM] & SFF_A0_DOM_PWRT;\n+\n+\tsff_8472_dom_parse(data, sd);\n+\n+\t/*\n+\t * If the SFP is externally calibrated, we need to read calibration data\n+\t * and compensate the already stored readings.\n+\t */\n+\tif (sd->calibrated_ext)\n+\t\tsff_8472_calibration(data, sd);\n+}\n+\n+void sff_8472_show_all(const uint8_t *data, struct rte_tel_data *d)\n+{\n+\tstruct sff_diags sd = {0};\n+\tconst char *rx_power_string = NULL;\n+\tchar val_string[SFF_ITEM_VAL_COMPOSE_SIZE];\n+\tint i;\n+\n+\tsff_8472_parse_eeprom(data, &sd);\n+\n+\tif (!sd.supports_dom) {\n+\t\tssf_add_dict_string(d, \"Optical diagnostics support\", \"No\");\n+\t\treturn;\n+\t}\n+\tssf_add_dict_string(d, \"Optical diagnostics support\", \"Yes\");\n+\n+\tSFF_SPRINT_BIAS(val_string, sd.bias_cur[SFF_MCURR]);\n+\tssf_add_dict_string(d, \"Laser bias current\", val_string);\n+\n+\tSFF_SPRINT_xX_PWR(val_string, sd.tx_power[SFF_MCURR]);\n+\tssf_add_dict_string(d, \"Laser output power\", val_string);\n+\n+\tif (!sd.rx_power_type)\n+\t\trx_power_string = \"Receiver signal OMA\";\n+\telse\n+\t\trx_power_string = \"Receiver signal average optical power\";\n+\n+\tSFF_SPRINT_xX_PWR(val_string, sd.rx_power[SFF_MCURR]);\n+\tssf_add_dict_string(d, rx_power_string, val_string);\n+\n+\tSFF_SPRINT_TEMP(val_string, sd.sfp_temp[SFF_MCURR]);\n+\tssf_add_dict_string(d, \"Module temperature\", val_string);\n+\n+\tSFF_SPRINT_VCC(val_string, sd.sfp_voltage[SFF_MCURR]);\n+\tssf_add_dict_string(d, \"Module voltage\", val_string);\n+\n+\tssf_add_dict_string(d, \"Alarm/warning flags implemented\",\n+\t\t\t(sd.supports_alarms ? \"Yes\" : \"No\"));\n+\n+\tif (sd.supports_alarms) {\n+\t\tfor (i = 0; sff_8472_aw_flags[i].str; ++i) {\n+\t\t\tssf_add_dict_string(d, sff_8472_aw_flags[i].str,\n+\t\t\t\t\tdata[SFF_A2_BASE + sff_8472_aw_flags[i].offset]\n+\t\t\t\t\t& sff_8472_aw_flags[i].value ? \"On\" : \"Off\");\n+\t\t}\n+\t\tsff_show_thresholds(sd, d);\n+\t}\n+}\ndiff --git a/lib/ethdev/sff_telemetry.c b/lib/ethdev/sff_telemetry.c\nindex bc458af532..babb9418b2 100644\n--- a/lib/ethdev/sff_telemetry.c\n+++ b/lib/ethdev/sff_telemetry.c\n@@ -73,6 +73,10 @@ sff_port_module_eeprom_parse(uint16_t port_id, struct rte_tel_data *d)\n \tcase RTE_ETH_MODULE_SFF_8079:\n \t\tsff_8079_show_all(einfo.data, d);\n \t\tbreak;\n+\tcase RTE_ETH_MODULE_SFF_8472:\n+\t\tsff_8079_show_all(einfo.data, d);\n+\t\tsff_8472_show_all(einfo.data, d);\n+\t\tbreak;\n \tdefault:\n \t\tRTE_ETHDEV_LOG(NOTICE, \"Unsupported module type: %u\\n\", minfo.type);\n \t\tbreak;\n", "prefixes": [ "v9", "4/5" ] }{ "id": 111893, "url": "