get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/111891/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 111891,
    "url": "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"
    ]
}