Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/111891/?format=api
http://patches.dpdk.org/api/patches/111891/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20220526073215.428410-3-robinx.zhang@intel.com/", "project": { "id": 1, "url": "http://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-3-robinx.zhang@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20220526073215.428410-3-robinx.zhang@intel.com", "date": "2022-05-26T07:32:12", "name": "[v9,2/5] ethdev: add common code for different SFF specs", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "a660b8f8239b414d8881afdef92b2c584eb0e563", "submitter": { "id": 2004, "url": "http://patches.dpdk.org/api/people/2004/?format=api", "name": "Robin Zhang", "email": "robinx.zhang@intel.com" }, "delegate": { "id": 3961, "url": "http://patches.dpdk.org/api/users/3961/?format=api", "username": "arybchenko", "first_name": "Andrew", "last_name": "Rybchenko", "email": "andrew.rybchenko@oktetlabs.ru" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20220526073215.428410-3-robinx.zhang@intel.com/mbox/", "series": [ { "id": 23180, "url": "http://patches.dpdk.org/api/series/23180/?format=api", "web_url": "http://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": "http://patches.dpdk.org/series/23180/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/111891/comments/", "check": "success", "checks": "http://patches.dpdk.org/api/patches/111891/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 83575A0557;\n\tThu, 26 May 2022 09:39:45 +0200 (CEST)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 333CC427F5;\n\tThu, 26 May 2022 09:39:38 +0200 (CEST)", "from mga04.intel.com (mga04.intel.com [192.55.52.120])\n by mails.dpdk.org (Postfix) with ESMTP id 69FA640E64\n for <dev@dpdk.org>; Thu, 26 May 2022 09:39:31 +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:26 -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:23 -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=1653550771; x=1685086771;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=2GTAcsyWeiHAfPM4cD1qhT0PswTkxlO55SsL9ccYq50=;\n b=feVQ6Mrpj073HiznEr3s+EDgURbsztVRUrJqcPExLb+DpPM8uNfPu9iy\n dliKDw6vQv3JB78CHKxkK3EzJFvs/LNBQ0DfbOYKk69w+IoJDwdO9yBRe\n s0Psf0DwlTThBuWxs2sbVAFVGnoDnft6sZscI5UYVWlGG6kVLOX7Nqons\n QhyVx/FDXQDetrEz9wrmtKYUf2vWPN1hvcyx+GXErGGbiu0sY1P42a0Dj\n /xYvjBHpNXe90BwVbyhz0X/xQjQxvkaSKbaII5YZSJme3B+B2VGaMWqHP\n /cEbTzaKBn3IPSdcd2Ly1XYa+Q3CW0kWybJfiuuWi9CZUKNr6HUW0xoiX Q==;", "X-IronPort-AV": [ "E=McAfee;i=\"6400,9594,10358\"; a=\"272885325\"", "E=Sophos;i=\"5.91,252,1647327600\"; d=\"scan'208\";a=\"272885325\"", "E=Sophos;i=\"5.91,252,1647327600\"; d=\"scan'208\";a=\"549441836\"" ], "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 2/5] ethdev: add common code for different SFF specs", "Date": "Thu, 26 May 2022 07:32:12 +0000", "Message-Id": "<20220526073215.428410-3-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 SFF-8024 Rev 4.0 of pluggable I/O configuration\nand some common utilities for SFF-8436/8636 and SFF-8472/8079.\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_common.c | 319 ++++++++++++++++++++++++++++++++++++++++\n lib/ethdev/sff_common.h | 173 ++++++++++++++++++++++\n 3 files changed, 493 insertions(+)\n create mode 100644 lib/ethdev/sff_common.c\n create mode 100644 lib/ethdev/sff_common.h", "diff": "diff --git a/lib/ethdev/meson.build b/lib/ethdev/meson.build\nindex 6a14d0b402..4ec21789f5 100644\n--- a/lib/ethdev/meson.build\n+++ b/lib/ethdev/meson.build\n@@ -12,6 +12,7 @@ sources = files(\n 'rte_mtr.c',\n 'rte_tm.c',\n 'sff_telemetry.c',\n+ 'sff_common.c',\n )\n \n headers = files(\ndiff --git a/lib/ethdev/sff_common.c b/lib/ethdev/sff_common.c\nnew file mode 100644\nindex 0000000000..bd425274e3\n--- /dev/null\n+++ b/lib/ethdev/sff_common.c\n@@ -0,0 +1,319 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2022 Intel Corporation\n+ * Implements SFF-8024 Rev 4.0 of pluggable I/O configuration and some\n+ * common utilities for SFF-8436/8636 and SFF-8472/8079\n+ */\n+\n+#include <math.h>\n+\n+#include \"sff_common.h\"\n+\n+double sff_convert_mw_to_dbm(double mw)\n+{\n+\treturn (10. * log10(mw / 1000.)) + 30.;\n+}\n+\n+void sff_show_value_with_unit(const uint8_t *data, unsigned int reg,\n+\t\t\t const char *name, unsigned int mult,\n+\t\t\t const char *unit, struct rte_tel_data *d)\n+{\n+\tunsigned int val = data[reg];\n+\tchar val_string[SFF_ITEM_VAL_COMPOSE_SIZE];\n+\n+\tsnprintf(val_string, sizeof(val_string), \"%u%s\", val * mult, unit);\n+\tssf_add_dict_string(d, name, val_string);\n+}\n+\n+void sff_show_ascii(const uint8_t *data, unsigned int first_reg,\n+\t\t unsigned int last_reg, const char *name, struct rte_tel_data *d)\n+{\n+\tunsigned int reg, val;\n+\tchar tmp[3];\n+\tchar val_string[SFF_ITEM_VAL_COMPOSE_SIZE];\n+\n+\tmemset(val_string, 0, sizeof(val_string));\n+\n+\twhile (first_reg <= last_reg && data[last_reg] == ' ')\n+\t\tlast_reg--;\n+\tfor (reg = first_reg; reg <= last_reg; reg++) {\n+\t\tval = data[reg];\n+\t\tif ((val >= 32) && (val <= 126)) {\n+\t\t\tsnprintf(tmp, sizeof(tmp), \"%c\", val);\n+\t\t\tstrlcat(val_string, tmp, sizeof(val_string));\n+\t\t} else {\n+\t\t\tstrlcat(val_string, \"_\", sizeof(val_string));\n+\t\t}\n+\t}\n+\tssf_add_dict_string(d, name, val_string);\n+}\n+\n+void sff_8024_show_oui(const uint8_t *data, int id_offset, struct rte_tel_data *d)\n+{\n+\tchar val_string[SFF_ITEM_VAL_COMPOSE_SIZE];\n+\n+\tsnprintf(val_string, sizeof(val_string), \"%02x:%02x:%02x\",\n+\t\tdata[id_offset], data[(id_offset) + 1], data[(id_offset) + 2]);\n+\tssf_add_dict_string(d, \"Vendor OUI\", val_string);\n+}\n+\n+void sff_8024_show_identifier(const uint8_t *data, int id_offset, struct rte_tel_data *d)\n+{\n+\tchar val_string[SFF_ITEM_VAL_COMPOSE_SIZE];\n+\n+\tsnprintf(val_string, sizeof(val_string), \"0x%02x\", data[id_offset]);\n+\n+\tswitch (data[id_offset]) {\n+\tcase SFF_8024_ID_UNKNOWN:\n+\t\tstrlcat(val_string, \" (no module present, unknown, or unspecified)\",\n+\t\t\tsizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_GBIC:\n+\t\tstrlcat(val_string, \" (GBIC)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_SOLDERED_MODULE:\n+\t\tstrlcat(val_string, \" (module soldered to motherboard)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_SFP:\n+\t\tstrlcat(val_string, \" (SFP)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_300_PIN_XBI:\n+\t\tstrlcat(val_string, \" (300 pin XBI)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_XENPAK:\n+\t\tstrlcat(val_string, \" (XENPAK)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_XFP:\n+\t\tstrlcat(val_string, \" (XFP)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_XFF:\n+\t\tstrlcat(val_string, \" (XFF)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_XFP_E:\n+\t\tstrlcat(val_string, \" (XFP-E)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_XPAK:\n+\t\tstrlcat(val_string, \" (XPAK)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_X2:\n+\t\tstrlcat(val_string, \" (X2)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_DWDM_SFP:\n+\t\tstrlcat(val_string, \" (DWDM-SFP)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_QSFP:\n+\t\tstrlcat(val_string, \" (QSFP)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_QSFP_PLUS:\n+\t\tstrlcat(val_string, \" (QSFP+)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_CXP:\n+\t\tstrlcat(val_string, \" (CXP)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_HD4X:\n+\t\tstrlcat(val_string, \" (Shielded Mini Multilane HD 4X)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_HD8X:\n+\t\tstrlcat(val_string, \" (Shielded Mini Multilane HD 8X)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_QSFP28:\n+\t\tstrlcat(val_string, \" (QSFP28)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_CXP2:\n+\t\tstrlcat(val_string, \" (CXP2/CXP28)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_CDFP:\n+\t\tstrlcat(val_string, \" (CDFP Style 1/Style 2)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_HD4X_FANOUT:\n+\t\tstrlcat(val_string, \" (Shielded Mini Multilane HD 4X Fanout Cable)\",\n+\t\t\tsizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_HD8X_FANOUT:\n+\t\tstrlcat(val_string, \" (Shielded Mini Multilane HD 8X Fanout Cable)\",\n+\t\t\tsizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_CDFP_S3:\n+\t\tstrlcat(val_string, \" (CDFP Style 3)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ID_MICRO_QSFP:\n+\t\tstrlcat(val_string, \" (microQSFP)\", sizeof(val_string));\n+\t\tbreak;\n+\tdefault:\n+\t\tstrlcat(val_string, \" (reserved or unknown)\", sizeof(val_string));\n+\t\tbreak;\n+\t}\n+\tssf_add_dict_string(d, \"Identifier\", val_string);\n+}\n+\n+void sff_8024_show_connector(const uint8_t *data, int ctor_offset, struct rte_tel_data *d)\n+{\n+\tchar val_string[SFF_ITEM_VAL_COMPOSE_SIZE];\n+\n+\tsnprintf(val_string, sizeof(val_string), \"0x%02x\", data[ctor_offset]);\n+\n+\tswitch (data[ctor_offset]) {\n+\tcase SFF_8024_CTOR_UNKNOWN:\n+\t\tstrlcat(val_string, \" (unknown or unspecified)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_SC:\n+\t\tstrlcat(val_string, \" (SC)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_FC_STYLE_1:\n+\t\tstrlcat(val_string, \" (Fibre Channel Style 1 copper)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_FC_STYLE_2:\n+\t\tstrlcat(val_string, \" (Fibre Channel Style 2 copper)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_BNC_TNC:\n+\t\tstrlcat(val_string, \" (BNC/TNC)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_FC_COAX:\n+\t\tstrlcat(val_string, \" (Fibre Channel coaxial headers)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_FIBER_JACK:\n+\t\tstrlcat(val_string, \" (FibreJack)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_LC:\n+\t\tstrlcat(val_string, \" (LC)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_MT_RJ:\n+\t\tstrlcat(val_string, \" (MT-RJ)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_MU:\n+\t\tstrlcat(val_string, \" (MU)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_SG:\n+\t\tstrlcat(val_string, \" (SG)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_OPT_PT:\n+\t\tstrlcat(val_string, \" (Optical pigtail)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_MPO:\n+\t\tstrlcat(val_string, \" (MPO Parallel Optic)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_MPO_2:\n+\t\tstrlcat(val_string, \" (MPO Parallel Optic - 2x16)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_HSDC_II:\n+\t\tstrlcat(val_string, \" (HSSDC II)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_COPPER_PT:\n+\t\tstrlcat(val_string, \" (Copper pigtail)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_RJ45:\n+\t\tstrlcat(val_string, \" (RJ45)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_NO_SEPARABLE:\n+\t\tstrlcat(val_string, \" (No separable connector)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_CTOR_MXC_2x16:\n+\t\tstrlcat(val_string, \" (MXC 2x16)\", sizeof(val_string));\n+\t\tbreak;\n+\tdefault:\n+\t\tstrlcat(val_string, \" (reserved or unknown)\", sizeof(val_string));\n+\t\tbreak;\n+\t}\n+\tssf_add_dict_string(d, \"Connector\", val_string);\n+}\n+\n+void sff_8024_show_encoding(const uint8_t *data, int encoding_offset,\n+\t\t\t int sff_type, struct rte_tel_data *d)\n+{\n+\tchar val_string[SFF_ITEM_VAL_COMPOSE_SIZE];\n+\n+\tsnprintf(val_string, sizeof(val_string), \"0x%02x\", data[encoding_offset]);\n+\n+\tswitch (data[encoding_offset]) {\n+\tcase SFF_8024_ENCODING_UNSPEC:\n+\t\tstrlcat(val_string, \" (unspecified)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ENCODING_8B10B:\n+\t\tstrlcat(val_string, \" (8B/10B)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ENCODING_4B5B:\n+\t\tstrlcat(val_string, \" (4B/5B)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ENCODING_NRZ:\n+\t\tstrlcat(val_string, \" (NRZ)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ENCODING_4h:\n+\t\tif (sff_type == RTE_ETH_MODULE_SFF_8472)\n+\t\t\tstrlcat(val_string, \" (Manchester)\", sizeof(val_string));\n+\t\telse if (sff_type == RTE_ETH_MODULE_SFF_8636)\n+\t\t\tstrlcat(val_string, \" (SONET Scrambled)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ENCODING_5h:\n+\t\tif (sff_type == RTE_ETH_MODULE_SFF_8472)\n+\t\t\tstrlcat(val_string, \" (SONET Scrambled)\", sizeof(val_string));\n+\t\telse if (sff_type == RTE_ETH_MODULE_SFF_8636)\n+\t\t\tstrlcat(val_string, \" (64B/66B)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ENCODING_6h:\n+\t\tif (sff_type == RTE_ETH_MODULE_SFF_8472)\n+\t\t\tstrlcat(val_string, \" (64B/66B)\", sizeof(val_string));\n+\t\telse if (sff_type == RTE_ETH_MODULE_SFF_8636)\n+\t\t\tstrlcat(val_string, \" (Manchester)\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ENCODING_256B:\n+\t\tstrlcat(val_string,\n+\t\t \" ((256B/257B (transcoded FEC-enabled data))\", sizeof(val_string));\n+\t\tbreak;\n+\tcase SFF_8024_ENCODING_PAM4:\n+\t\tstrlcat(val_string, \" (PAM4)\", sizeof(val_string));\n+\t\tbreak;\n+\tdefault:\n+\t\tstrlcat(val_string, \" (reserved or unknown)\", sizeof(val_string));\n+\t\tbreak;\n+\t}\n+\tssf_add_dict_string(d, \"Encoding\", val_string);\n+}\n+\n+void sff_show_thresholds(struct sff_diags sd, struct rte_tel_data *d)\n+{\n+\tchar val_string[SFF_ITEM_VAL_COMPOSE_SIZE];\n+\n+\tSFF_SPRINT_BIAS(val_string, sd.bias_cur[SFF_HALRM]);\n+\tssf_add_dict_string(d, \"Laser bias current high alarm threshold\", val_string);\n+\tSFF_SPRINT_BIAS(val_string, sd.bias_cur[SFF_LALRM]);\n+\tssf_add_dict_string(d, \"Laser bias current low alarm threshold\", val_string);\n+\tSFF_SPRINT_BIAS(val_string, sd.bias_cur[SFF_HWARN]);\n+\tssf_add_dict_string(d, \"Laser bias current high warning threshold\", val_string);\n+\tSFF_SPRINT_BIAS(val_string, sd.bias_cur[SFF_LWARN]);\n+\tssf_add_dict_string(d, \"Laser bias current low warning threshold\", val_string);\n+\n+\tSFF_SPRINT_xX_PWR(val_string, sd.tx_power[SFF_HALRM]);\n+\tssf_add_dict_string(d, \"Laser output power high alarm threshold\", val_string);\n+\tSFF_SPRINT_xX_PWR(val_string, sd.tx_power[SFF_LALRM]);\n+\tssf_add_dict_string(d, \"Laser output power low alarm threshold\", val_string);\n+\tSFF_SPRINT_xX_PWR(val_string, sd.tx_power[SFF_HWARN]);\n+\tssf_add_dict_string(d, \"Laser output power high warning threshold\", val_string);\n+\tSFF_SPRINT_xX_PWR(val_string, sd.tx_power[SFF_LWARN]);\n+\tssf_add_dict_string(d, \"Laser output power low warning threshold\", val_string);\n+\n+\tSFF_SPRINT_TEMP(val_string, sd.sfp_temp[SFF_HALRM]);\n+\tssf_add_dict_string(d, \"Module temperature high alarm threshold\", val_string);\n+\tSFF_SPRINT_TEMP(val_string, sd.sfp_temp[SFF_LALRM]);\n+\tssf_add_dict_string(d, \"Module temperature low alarm threshold\", val_string);\n+\tSFF_SPRINT_TEMP(val_string, sd.sfp_temp[SFF_HWARN]);\n+\tssf_add_dict_string(d, \"Module temperature high warning threshold\", val_string);\n+\tSFF_SPRINT_TEMP(val_string, sd.sfp_temp[SFF_LWARN]);\n+\tssf_add_dict_string(d, \"Module temperature low warning threshold\", val_string);\n+\n+\tSFF_SPRINT_VCC(val_string, sd.sfp_voltage[SFF_HALRM]);\n+\tssf_add_dict_string(d, \"Module voltage high alarm threshold\", val_string);\n+\tSFF_SPRINT_VCC(val_string, sd.sfp_voltage[SFF_LALRM]);\n+\tssf_add_dict_string(d, \"Module voltage low alarm threshold\", val_string);\n+\tSFF_SPRINT_VCC(val_string, sd.sfp_voltage[SFF_HWARN]);\n+\tssf_add_dict_string(d, \"Module voltage high warning threshold\", val_string);\n+\tSFF_SPRINT_VCC(val_string, sd.sfp_voltage[SFF_LWARN]);\n+\tssf_add_dict_string(d, \"Module voltage low alarm threshold\", val_string);\n+\n+\tSFF_SPRINT_xX_PWR(val_string, sd.rx_power[SFF_HALRM]);\n+\tssf_add_dict_string(d, \"Laser rx power high alarm threshold\", val_string);\n+\tSFF_SPRINT_xX_PWR(val_string, sd.rx_power[SFF_LALRM]);\n+\tssf_add_dict_string(d, \"Laser rx power low alarm threshold\", val_string);\n+\tSFF_SPRINT_xX_PWR(val_string, sd.rx_power[SFF_HWARN]);\n+\tssf_add_dict_string(d, \"Laser rx power high warning threshold\", val_string);\n+\tSFF_SPRINT_xX_PWR(val_string, sd.rx_power[SFF_LWARN]);\n+\tssf_add_dict_string(d, \"Laser rx power low warning threshold\", val_string);\n+}\ndiff --git a/lib/ethdev/sff_common.h b/lib/ethdev/sff_common.h\nnew file mode 100644\nindex 0000000000..e44f3c7bf3\n--- /dev/null\n+++ b/lib/ethdev/sff_common.h\n@@ -0,0 +1,173 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2022 Intel Corporation\n+ *\n+ * Implements SFF-8024 Rev 4.0 of pluggable I/O configuration and some\n+ * common utilities for SFF-8436/8636 and SFF-8472/8079\n+ *\n+ */\n+\n+#ifndef _SFF_COMMON_H_\n+#define _SFF_COMMON_H_\n+\n+#include <stdio.h>\n+\n+#include \"rte_ethdev.h\"\n+#include \"sff_telemetry.h\"\n+\n+#define SFF_8024_ID_OFFSET\t\t\t0x00\n+#define SFF_8024_ID_UNKNOWN\t\t\t0x00\n+#define SFF_8024_ID_GBIC\t\t\t0x01\n+#define SFF_8024_ID_SOLDERED_MODULE\t\t0x02\n+#define SFF_8024_ID_SFP\t\t\t\t0x03\n+#define SFF_8024_ID_300_PIN_XBI\t\t\t0x04\n+#define SFF_8024_ID_XENPAK\t\t\t0x05\n+#define SFF_8024_ID_XFP\t\t\t\t0x06\n+#define SFF_8024_ID_XFF\t\t\t\t0x07\n+#define SFF_8024_ID_XFP_E\t\t\t0x08\n+#define SFF_8024_ID_XPAK\t\t\t0x09\n+#define SFF_8024_ID_X2\t\t\t\t0x0A\n+#define SFF_8024_ID_DWDM_SFP\t\t\t0x0B\n+#define SFF_8024_ID_QSFP\t\t\t0x0C\n+#define SFF_8024_ID_QSFP_PLUS\t\t\t0x0D\n+#define SFF_8024_ID_CXP\t\t\t\t0x0E\n+#define SFF_8024_ID_HD4X\t\t\t0x0F\n+#define SFF_8024_ID_HD8X\t\t\t0x10\n+#define SFF_8024_ID_QSFP28\t\t\t0x11\n+#define SFF_8024_ID_CXP2\t\t\t0x12\n+#define SFF_8024_ID_CDFP\t\t\t0x13\n+#define SFF_8024_ID_HD4X_FANOUT\t\t\t0x14\n+#define SFF_8024_ID_HD8X_FANOUT\t\t\t0x15\n+#define SFF_8024_ID_CDFP_S3\t\t\t0x16\n+#define SFF_8024_ID_MICRO_QSFP\t\t\t0x17\n+#define SFF_8024_ID_LAST\t\t\tSFF_8024_ID_MICRO_QSFP\n+#define SFF_8024_ID_UNALLOCATED_LAST\t\t0x7F\n+#define SFF_8024_ID_VENDOR_START\t\t0x80\n+#define SFF_8024_ID_VENDOR_LAST\t\t\t0xFF\n+\n+#define SFF_8024_CTOR_UNKNOWN\t\t\t0x00\n+#define SFF_8024_CTOR_SC\t\t\t0x01\n+#define SFF_8024_CTOR_FC_STYLE_1\t\t0x02\n+#define SFF_8024_CTOR_FC_STYLE_2\t\t0x03\n+#define SFF_8024_CTOR_BNC_TNC\t\t\t0x04\n+#define SFF_8024_CTOR_FC_COAX\t\t\t0x05\n+#define SFF_8024_CTOR_FIBER_JACK\t\t0x06\n+#define SFF_8024_CTOR_LC\t\t\t0x07\n+#define SFF_8024_CTOR_MT_RJ\t\t\t0x08\n+#define SFF_8024_CTOR_MU\t\t\t0x09\n+#define SFF_8024_CTOR_SG\t\t\t0x0A\n+#define SFF_8024_CTOR_OPT_PT\t\t\t0x0B\n+#define SFF_8024_CTOR_MPO\t\t\t0x0C\n+#define SFF_8024_CTOR_MPO_2\t\t\t0x0D\n+/* 0E-1Fh --- Reserved */\n+#define SFF_8024_CTOR_HSDC_II\t\t\t0x20\n+#define SFF_8024_CTOR_COPPER_PT\t\t\t0x21\n+#define SFF_8024_CTOR_RJ45\t\t\t0x22\n+#define SFF_8024_CTOR_NO_SEPARABLE\t\t0x23\n+#define SFF_8024_CTOR_MXC_2x16\t\t\t0x24\n+#define SFF_8024_CTOR_LAST\t\t\tSFF_8024_CTOR_MXC_2x16\n+#define SFF_8024_CTOR_UNALLOCATED_LAST\t\t0x7F\n+#define SFF_8024_CTOR_VENDOR_START\t\t0x80\n+#define SFF_8024_CTOR_VENDOR_LAST\t\t0xFF\n+\n+/* ENCODING Values */\n+#define SFF_8024_ENCODING_UNSPEC\t\t0x00\n+#define SFF_8024_ENCODING_8B10B\t\t\t0x01\n+#define SFF_8024_ENCODING_4B5B\t\t\t0x02\n+#define SFF_8024_ENCODING_NRZ\t\t\t0x03\n+/*\n+ * Value: 04h\n+ * SFF-8472 - Manchester\n+ * SFF-8436/8636 - SONET Scrambled\n+ */\n+#define SFF_8024_ENCODING_4h\t\t\t0x04\n+/*\n+ * Value: 05h\n+ * SFF-8472 - SONET Scrambled\n+ * SFF-8436/8636 - 64B/66B\n+ */\n+#define SFF_8024_ENCODING_5h\t\t\t0x05\n+/*\n+ * Value: 06h\n+ * SFF-8472 - 64B/66B\n+ * SFF-8436/8636 - Manchester\n+ */\n+#define SFF_8024_ENCODING_6h\t\t\t0x06\n+#define SFF_8024_ENCODING_256B\t\t\t0x07\n+#define SFF_8024_ENCODING_PAM4\t\t\t0x08\n+\n+/* Most common case: 16-bit unsigned integer in a certain unit */\n+#define SFF_OFFSET_TO_U16(offset) \\\n+\t\t(data[offset] << 8 | data[(offset) + 1])\n+\n+#define SFF_SPRINT_xX_PWR(str, var) \\\n+\t\tsnprintf(str, sizeof(str), \"%.4f mW / %.2f dBm\", \\\n+\t\t\t(double)((var) / 10000.), \\\n+\t\t\tsff_convert_mw_to_dbm((double)((var) / 10000.)))\n+\n+#define SFF_SPRINT_BIAS(str, bias_cur) \\\n+\t\tsnprintf(str, sizeof(str), \"%.3f mA\", (double)(bias_cur / 500.))\n+\n+#define SFF_SPRINT_TEMP(str, temp) \\\n+\t\tsnprintf(str, sizeof(str), \"%.2f degrees C / %.2f degrees F\", \\\n+\t\t\t(double)(temp / 256.), \\\n+\t\t\t(double)(temp / 256. * 1.8 + 32.))\n+\n+#define SFF_SPRINT_VCC(str, sfp_voltage) \\\n+\t\tsnprintf(str, sizeof(str), \"%.4f V\", (double)(sfp_voltage / 10000.))\n+\n+/* Channel Monitoring Fields */\n+struct sff_channel_diags {\n+\tuint16_t bias_cur; /* Measured bias current in 2uA units */\n+\tuint16_t rx_power; /* Measured RX Power */\n+\tuint16_t tx_power; /* Measured TX Power */\n+};\n+\n+/* Module Monitoring Fields */\n+struct sff_diags {\n+\n+#define SFF_MAX_CHANNEL_NUM 4\n+#define SFF_LWARN 0\n+#define SFF_HWARN 1\n+#define SFF_LALRM 2\n+#define SFF_HALRM 3\n+#define SFF_MCURR 4\n+\n+\t/* Supports DOM */\n+\tuint8_t supports_dom;\n+\t/* Supports alarm/warning thold */\n+\tuint8_t supports_alarms;\n+\t/* RX Power: 0 = OMA, 1 = Average power */\n+\tuint8_t rx_power_type;\n+\t/* TX Power: 0 = Not supported, 1 = Average power */\n+\tuint8_t tx_power_type;\n+\n+\tuint8_t calibrated_ext; /* Is externally calibrated */\n+\t/* [5] tables are low/high warn, low/high alarm, current */\n+\t/* SFP voltage in 0.1mV units */\n+\tuint16_t sfp_voltage[5];\n+\t/* SFP Temp in 16-bit signed 1/256 Celsius */\n+\tint16_t sfp_temp[5];\n+\t/* Measured bias current in 2uA units */\n+\tuint16_t bias_cur[5];\n+\t/* Measured TX Power */\n+\tuint16_t tx_power[5];\n+\t/* Measured RX Power */\n+\tuint16_t rx_power[5];\n+\tstruct sff_channel_diags scd[SFF_MAX_CHANNEL_NUM];\n+};\n+\n+double sff_convert_mw_to_dbm(double mw);\n+void sff_show_value_with_unit(const uint8_t *data, unsigned int reg,\n+\t\t\t const char *name, unsigned int mult,\n+\t\t\t const char *unit, struct rte_tel_data *d);\n+void sff_show_ascii(const uint8_t *data, unsigned int first_reg,\n+\t\t unsigned int last_reg, const char *name, struct rte_tel_data *d);\n+void sff_show_thresholds(struct sff_diags sd, struct rte_tel_data *d);\n+\n+void sff_8024_show_oui(const uint8_t *data, int id_offset, struct rte_tel_data *d);\n+void sff_8024_show_identifier(const uint8_t *data, int id_offset, struct rte_tel_data *d);\n+void sff_8024_show_connector(const uint8_t *data, int ctor_offset, struct rte_tel_data *d);\n+void sff_8024_show_encoding(const uint8_t *data, int encoding_offset,\n+\t\t\t int sff_type, struct rte_tel_data *d);\n+\n+#endif /* _SFF_COMMON_H_ */\n", "prefixes": [ "v9", "2/5" ] }{ "id": 111891, "url": "