get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139082,
    "url": "https://patches.dpdk.org/api/patches/139082/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20240403135953.7209-1-mpazdan@arista.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": "<20240403135953.7209-1-mpazdan@arista.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240403135953.7209-1-mpazdan@arista.com",
    "date": "2024-04-03T13:59:53",
    "name": "lib: add get/set link settings interface",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "9641a6a680db581c0f639feb9373036f58dbb6d0",
    "submitter": {
        "id": 3302,
        "url": "https://patches.dpdk.org/api/people/3302/?format=api",
        "name": "Marek Pazdan",
        "email": "mpazdan@arista.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20240403135953.7209-1-mpazdan@arista.com/mbox/",
    "series": [
        {
            "id": 31669,
            "url": "https://patches.dpdk.org/api/series/31669/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=31669",
            "date": "2024-04-03T13:59:53",
            "name": "lib: add get/set link settings interface",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/31669/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/139082/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/139082/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 4776F43DEE;\n\tWed,  3 Apr 2024 18:09:44 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 26320402E8;\n\tWed,  3 Apr 2024 18:09:39 +0200 (CEST)",
            "from mail-oo1-f97.google.com (mail-oo1-f97.google.com\n [209.85.161.97]) by mails.dpdk.org (Postfix) with ESMTP id 8A28E4025C\n for <dev@dpdk.org>; Wed,  3 Apr 2024 15:59:55 +0200 (CEST)",
            "by mail-oo1-f97.google.com with SMTP id\n 006d021491bc7-5a4f7a648dbso4003494eaf.3\n for <dev@dpdk.org>; Wed, 03 Apr 2024 06:59:55 -0700 (PDT)",
            "from smtp.aristanetworks.com ([74.123.28.25])\n by smtp-relay.gmail.com with ESMTPS id\n er10-20020a05622a5e8a00b004311ec03154sm1334233qtb.9.2024.04.03.06.59.54\n (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);\n Wed, 03 Apr 2024 06:59:54 -0700 (PDT)",
            "from mpazdan-autoneg-dpdk-0.sjc.aristanetworks.com\n (mpazdan-autoneg-dpdk-0-us184.sjc.aristanetworks.com [10.243.132.215])\n by smtp.aristanetworks.com (Postfix) with ESMTP id 9CDC1402054;\n Wed,  3 Apr 2024 06:59:53 -0700 (PDT)"
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1712152795; x=1712757595;\n h=content-transfer-encoding:references:in-reply-to:message-id:date\n :subject:cc:to:from:dkim-signature:x-gm-message-state:from:to:cc\n :subject:date:message-id:reply-to;\n bh=7ZBh5weVpChsH75Wef9UINqrt1A9b85T/5MeNtS11UA=;\n b=WnsN0CkwAN308FMmIrJX9albay/IbWMwJxxOVDgxX6iHLEn0inNezzaD5J/cL81+Pi\n id23YPc/D4tzsy0AQdAkHpa1/KfHR5/HyhtCJZG/Uvg03a8DGowXKNN97cTgn8Im+9JC\n 4STPy+BQ7ZHpDo1ON+BH4eDoE7Go4P3YcOT0W7ILO1yjKevzK5jwDrB04gjgAxv+6spM\n KiwL4vT+Yxoq8XewMotf+c1QIbQ254VPHb07l1f74Yvikfe6Evq4lUVbKisY+1MzACR+\n TBhywF0+xeRaAI/mVDP8zwwbvak6u6fkvc82e1v//8UalqP8IUwCWIqxlNLxBbTBU1jK\n /AMw==",
        "X-Gm-Message-State": "AOJu0YxdpUIvbSC7huDefx0Dnarz2WVHOhkz+pbjtQIShWoQGJwpPIoi\n 2zy3R/kpTOL9gWGdKJ22V4GC7KFW6sobp9rTT4n/5CaPg1+l2kOPZiS7MBYqhLg3LqFo7eUVLIR\n 3uMguzwyGx6n24fmOdPcanIGzjSBXmg==",
        "X-Google-Smtp-Source": "\n AGHT+IEEsdfZmlNjarIYopxwGTp9QfrP9etrzY8hjjVNFxRgCRAwMnuXMCcWZVvO+PAUSs7R16uGYVAEHrN1",
        "X-Received": "by 2002:a05:6820:2715:b0:5a5:21df:7eef with SMTP id\n db21-20020a056820271500b005a521df7eefmr14968141oob.2.1712152794816;\n Wed, 03 Apr 2024 06:59:54 -0700 (PDT)",
        "X-Relaying-Domain": "arista.com",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com;\n s=Arista-A; t=1712152793;\n bh=7ZBh5weVpChsH75Wef9UINqrt1A9b85T/5MeNtS11UA=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=Fj7t0B1M73uAj43FioVzhQINLcmK8gWkRqCBZAjRSB1IRsatpsKeM4Df5iVxZT1WP\n o3Doz91KGci04+2UqyYy8okwoa31Q4RXp6tbPB0hj25tm5fXFB2L+i4i244ZPAa8ZR\n 39mOIgMyxCEfNVMLgnqW0X5GvvdTYo6ksYpfCEm7x5g9rj9UMG+9aVfs57Ju+kqxdY\n Xf83wHqhdJp4NUG6c2fYgpgoPd5SDq4Z7q7FMnSGYY461QhafHLtkWoM8KoepEVZds\n z/+a183DeX0/Pn3kdZ488OqSgmcC4VoKCM7ZiTXQVV+CjuVxiqZq/3mmgZKgqmHUi/\n 1hC/SN0qY2BwA==",
        "X-SMTP-Authentication": [
            "Allow-List-permitted",
            "Allow-List-permitted"
        ],
        "From": "Marek Pazdan <mpazdan@arista.com>",
        "To": "Thomas Monjalon <thomas@monjalon.net>,\n Ferruh Yigit <ferruh.yigit@amd.com>,\n Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "Cc": "dev@dpdk.org,\n\tMarek Pazdan <mpazdan@arista.com>",
        "Subject": "[PATCH]  lib: add get/set link settings interface",
        "Date": "Wed,  3 Apr 2024 06:59:53 -0700",
        "Message-ID": "<20240403135953.7209-1-mpazdan@arista.com>",
        "In-Reply-To": "<20240326235909.25276-1-mpazdan@arista.com>",
        "References": "<20240326235909.25276-1-mpazdan@arista.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-Mailman-Approved-At": "Wed, 03 Apr 2024 18:09:36 +0200",
        "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": "There are link settings parameters available from PMD drivers level\n which are currently not exposed to the user via consistent interface.\n When interface is available for system level those information can\n be acquired with 'ethtool DEVNAME' (ioctl: ETHTOOL_SLINKSETTINGS/\n ETHTOOL_GLINKSETTINGS). There are use cases where\n physical interface is passthrough to dpdk driver and is not available\n from system level. Information provided by ioctl carries information\n useful for link auto negotiation settings among others.\n\nSigned-off-by: Marek Pazdan <mpazdan@arista.com>\n---\n .mailmap                   |   1 +\n lib/ethdev/ethdev_driver.h |  33 ++++++\n lib/ethdev/rte_ethdev.c    |  26 +++++\n lib/ethdev/rte_ethdev.h    | 215 +++++++++++++++++++++++++++++++++++--\n lib/ethdev/version.map     |   3 +\n 5 files changed, 270 insertions(+), 8 deletions(-)",
    "diff": "diff --git a/.mailmap b/.mailmap\nindex 3843868716..145ce726ba 100644\n--- a/.mailmap\n+++ b/.mailmap\n@@ -885,6 +885,7 @@ Marcin Wojtas <mw@semihalf.com>\n Marcin Zapolski <marcinx.a.zapolski@intel.com>\n Marco Varlese <mvarlese@suse.de>\n Marc Sune <marcdevel@gmail.com> <marc.sune@bisdn.de>\n+Marek Pazdan <mpazdan@arista.com>\n Maria Lingemark <maria.lingemark@ericsson.com>\n Mario Carrillo <mario.alfredo.c.arevalo@intel.com>\n Mário Kuka <kuka@cesnet.cz>\ndiff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h\nindex 0dbf2dd6a2..ee8f786b99 100644\n--- a/lib/ethdev/ethdev_driver.h\n+++ b/lib/ethdev/ethdev_driver.h\n@@ -1119,6 +1119,34 @@ typedef const uint32_t *(*eth_buffer_split_supported_hdr_ptypes_get_t)(struct rt\n  */\n typedef int (*eth_dev_priv_dump_t)(struct rte_eth_dev *dev, FILE *file);\n \n+/** @internal Retrieve physical link settings of a port.\n+ *\n+ * @param dev\n+ *   Port (ethdev) handle\n+ *\n+ * @param[out] settings\n+ *   Physical port link settings.\n+ *\n+ * @return\n+ *   Negative errno value on error, zero otherwise\n+ */\n+typedef int (*eth_get_link_settings_t)(struct rte_eth_dev *dev,\n+\t\t\t\t struct rte_link_settings *settings);\n+\n+/** @internal Configure physical link settings of a port.\n+ *\n+ * @param dev\n+ *   Port (ethdev) handle\n+ *\n+ * @param settings\n+ *   Physical port link settings.\n+ *\n+ * @return\n+ *   Negative errno value on error, zero otherwise\n+ */\n+typedef int (*eth_set_link_settings_t)(struct rte_eth_dev *dev,\n+\t\t\t\t const struct rte_link_settings *settings);\n+\n /**\n  * @internal Set Rx queue available descriptors threshold.\n  * @see rte_eth_rx_avail_thresh_set()\n@@ -1474,6 +1502,11 @@ struct eth_dev_ops {\n \teth_count_aggr_ports_t count_aggr_ports;\n \t/** Map a Tx queue with an aggregated port of the DPDK port */\n \teth_map_aggr_tx_affinity_t map_aggr_tx_affinity;\n+\n+\t/** Retrieve physical link settings */\n+\teth_get_link_settings_t get_link_settings;\n+\t/** Configure physical link settings */\n+\teth_set_link_settings_t set_link_settings;\n };\n \n /**\ndiff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c\nindex f1c658f49e..d2c52921ef 100644\n--- a/lib/ethdev/rte_ethdev.c\n+++ b/lib/ethdev/rte_ethdev.c\n@@ -6844,6 +6844,32 @@ rte_eth_dev_priv_dump(uint16_t port_id, FILE *file)\n \treturn eth_err(port_id, (*dev->dev_ops->eth_dev_priv_dump)(dev, file));\n }\n \n+int rte_eth_dev_get_link_settings(uint16_t port_id,\n+\t\t\t\t  struct rte_link_settings *settings)\n+{\n+\tstruct rte_eth_dev *dev;\n+\n+\tRTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);\n+\tdev = &rte_eth_devices[port_id];\n+\n+\tif (*dev->dev_ops->get_link_settings == NULL)\n+\t\treturn -ENOTSUP;\n+\treturn eth_err(port_id, (*dev->dev_ops->get_link_settings)(dev, settings));\n+}\n+\n+int rte_eth_dev_set_link_settings(uint16_t port_id,\n+\t\t\t\t  const struct rte_link_settings *settings)\n+{\n+\tstruct rte_eth_dev *dev;\n+\n+\tRTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);\n+\tdev = &rte_eth_devices[port_id];\n+\n+\tif (*dev->dev_ops->set_link_settings == NULL)\n+\t\treturn -ENOTSUP;\n+\treturn eth_err(port_id, (*dev->dev_ops->set_link_settings)(dev, settings));\n+}\n+\n int\n rte_eth_rx_descriptor_dump(uint16_t port_id, uint16_t queue_id,\n \t\t\t   uint16_t offset, uint16_t num, FILE *file)\ndiff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h\nindex 147257d6a2..66aad925d0 100644\n--- a/lib/ethdev/rte_ethdev.h\n+++ b/lib/ethdev/rte_ethdev.h\n@@ -335,7 +335,7 @@ struct rte_eth_stats {\n __extension__\n struct __rte_aligned(8) rte_eth_link { /**< aligned for atomic64 read/write */\n \tuint32_t link_speed;        /**< RTE_ETH_SPEED_NUM_ */\n-\tuint16_t link_duplex  : 1;  /**< RTE_ETH_LINK_[HALF/FULL]_DUPLEX */\n+\tuint16_t link_duplex  : 2;  /**< RTE_ETH_LINK_[HALF/FULL/UNKNOWN]_DUPLEX */\n \tuint16_t link_autoneg : 1;  /**< RTE_ETH_LINK_[AUTONEG/FIXED] */\n \tuint16_t link_status  : 1;  /**< RTE_ETH_LINK_[DOWN/UP] */\n };\n@@ -343,13 +343,27 @@ struct __rte_aligned(8) rte_eth_link { /**< aligned for atomic64 read/write */\n /**@{@name Link negotiation\n  * Constants used in link management.\n  */\n-#define RTE_ETH_LINK_HALF_DUPLEX 0 /**< Half-duplex connection (see link_duplex). */\n-#define RTE_ETH_LINK_FULL_DUPLEX 1 /**< Full-duplex connection (see link_duplex). */\n-#define RTE_ETH_LINK_DOWN        0 /**< Link is down (see link_status). */\n-#define RTE_ETH_LINK_UP          1 /**< Link is up (see link_status). */\n-#define RTE_ETH_LINK_FIXED       0 /**< No autonegotiation (see link_autoneg). */\n-#define RTE_ETH_LINK_AUTONEG     1 /**< Autonegotiated (see link_autoneg). */\n-#define RTE_ETH_LINK_MAX_STR_LEN 40 /**< Max length of default link string. */\n+#define RTE_ETH_LINK_HALF_DUPLEX\t0 /**< Half-duplex connection (see link_duplex). */\n+#define RTE_ETH_LINK_FULL_DUPLEX\t1 /**< Full-duplex connection (see link_duplex). */\n+#define RTE_ETH_LINK_UNKNOWN_DUPLEX\t2 /**</ Unknown-duplex (see link_duplex). */\n+#define RTE_ETH_LINK_DOWN\t\t0 /**< Link is down (see link_status). */\n+#define RTE_ETH_LINK_UP\t\t\t1 /**< Link is up (see link_status). */\n+#define RTE_ETH_LINK_FIXED\t\t0 /**< No autonegotiation (see link_autoneg). */\n+#define RTE_ETH_LINK_AUTONEG\t\t1 /**< Autonegotiated (see link_autoneg). */\n+#define RTE_ETH_LINK_MAX_STR_LEN\t40 /**< Max length of default link string. */\n+/**@}*/\n+\n+/**@{@name Link negotiation\n+ * Constants used in link management to specify connector port.\n+ */\n+#define RTE_PORT_TP             0x00\n+#define RTE_PORT_AUI            0x01\n+#define RTE_PORT_MII            0x02\n+#define RTE_PORT_FIBRE          0x03\n+#define RTE_PORT_BNC            0x04\n+#define RTE_PORT_DA             0x05\n+#define RTE_PORT_NONE           0xef\n+#define RTE_PORT_OTHER          0xff\n /**@}*/\n \n /**\n@@ -1433,6 +1447,147 @@ struct rte_eth_pfc_queue_conf {\n \t} tx_pause; /* Valid when (mode == FC_TX_PAUSE || mode == FC_FULL) */\n };\n \n+/* Enable or disable autonegotiation. */\n+#define RTE_AUTONEG_DISABLE         0x00\n+#define RTE_AUTONEG_ENABLE          0x01\n+\n+/* MDI or MDI-X status/control - if MDI/MDI_X/AUTO is set then\n+ * the driver is required to renegotiate link\n+ */\n+#define RTE_TP_MDI_INVALID      0x00 /* status: unknown; control: unsupported */\n+#define RTE_TP_MDI              0x01 /* status: MDI;     control: force MDI */\n+#define RTE_TP_MDI_X            0x02 /* status: MDI-X;   control: force MDI-X */\n+#define RTE_TP_MDI_AUTO         0x03 /*                  control: auto-select */\n+\n+/* Link mode bit indices */\n+enum rte_link_mode_bit_indices {\n+\tRTE_LINK_MODE_10baseT_Half_BIT\t= 0,\n+\tRTE_LINK_MODE_10baseT_Full_BIT\t= 1,\n+\tRTE_LINK_MODE_100baseT_Half_BIT\t= 2,\n+\tRTE_LINK_MODE_100baseT_Full_BIT\t= 3,\n+\tRTE_LINK_MODE_1000baseT_Half_BIT\t= 4,\n+\tRTE_LINK_MODE_1000baseT_Full_BIT\t= 5,\n+\tRTE_LINK_MODE_Autoneg_BIT\t\t= 6,\n+\tRTE_LINK_MODE_TP_BIT\t\t= 7,\n+\tRTE_LINK_MODE_AUI_BIT\t\t= 8,\n+\tRTE_LINK_MODE_MII_BIT\t\t= 9,\n+\tRTE_LINK_MODE_FIBRE_BIT\t\t= 10,\n+\tRTE_LINK_MODE_BNC_BIT\t\t= 11,\n+\tRTE_LINK_MODE_10000baseT_Full_BIT\t= 12,\n+\tRTE_LINK_MODE_Pause_BIT\t\t= 13,\n+\tRTE_LINK_MODE_Asym_Pause_BIT\t= 14,\n+\tRTE_LINK_MODE_2500baseX_Full_BIT\t= 15,\n+\tRTE_LINK_MODE_Backplane_BIT\t\t= 16,\n+\tRTE_LINK_MODE_1000baseKX_Full_BIT\t= 17,\n+\tRTE_LINK_MODE_10000baseKX4_Full_BIT\t= 18,\n+\tRTE_LINK_MODE_10000baseKR_Full_BIT\t= 19,\n+\tRTE_LINK_MODE_10000baseR_FEC_BIT\t= 20,\n+\tRTE_LINK_MODE_20000baseMLD2_Full_BIT = 21,\n+\tRTE_LINK_MODE_20000baseKR2_Full_BIT\t= 22,\n+\tRTE_LINK_MODE_40000baseKR4_Full_BIT\t= 23,\n+\tRTE_LINK_MODE_40000baseCR4_Full_BIT\t= 24,\n+\tRTE_LINK_MODE_40000baseSR4_Full_BIT\t= 25,\n+\tRTE_LINK_MODE_40000baseLR4_Full_BIT\t= 26,\n+\tRTE_LINK_MODE_56000baseKR4_Full_BIT\t= 27,\n+\tRTE_LINK_MODE_56000baseCR4_Full_BIT\t= 28,\n+\tRTE_LINK_MODE_56000baseSR4_Full_BIT\t= 29,\n+\tRTE_LINK_MODE_56000baseLR4_Full_BIT\t= 30,\n+\tRTE_LINK_MODE_25000baseCR_Full_BIT\t= 31,\n+\tRTE_LINK_MODE_25000baseKR_Full_BIT\t= 32,\n+\tRTE_LINK_MODE_25000baseSR_Full_BIT\t= 33,\n+\tRTE_LINK_MODE_50000baseCR2_Full_BIT\t= 34,\n+\tRTE_LINK_MODE_50000baseKR2_Full_BIT\t= 35,\n+\tRTE_LINK_MODE_100000baseKR4_Full_BIT\t= 36,\n+\tRTE_LINK_MODE_100000baseSR4_Full_BIT\t= 37,\n+\tRTE_LINK_MODE_100000baseCR4_Full_BIT\t= 38,\n+\tRTE_LINK_MODE_100000baseLR4_ER4_Full_BIT\t= 39,\n+\tRTE_LINK_MODE_50000baseSR2_Full_BIT\t\t= 40,\n+\tRTE_LINK_MODE_1000baseX_Full_BIT\t= 41,\n+\tRTE_LINK_MODE_10000baseCR_Full_BIT\t= 42,\n+\tRTE_LINK_MODE_10000baseSR_Full_BIT\t= 43,\n+\tRTE_LINK_MODE_10000baseLR_Full_BIT\t= 44,\n+\tRTE_LINK_MODE_10000baseLRM_Full_BIT\t= 45,\n+\tRTE_LINK_MODE_10000baseER_Full_BIT\t= 46,\n+\tRTE_LINK_MODE_2500baseT_Full_BIT\t= 47,\n+\tRTE_LINK_MODE_5000baseT_Full_BIT\t= 48,\n+\n+\tRTE_LINK_MODE_FEC_NONE_BIT\t= 49,\n+\tRTE_LINK_MODE_FEC_RS_BIT\t= 50,\n+\tRTE_LINK_MODE_FEC_BASER_BIT\t= 51,\n+\tRTE_LINK_MODE_50000baseKR_Full_BIT\t\t = 52,\n+\tRTE_LINK_MODE_50000baseSR_Full_BIT\t\t = 53,\n+\tRTE_LINK_MODE_50000baseCR_Full_BIT\t\t = 54,\n+\tRTE_LINK_MODE_50000baseLR_ER_FR_Full_BIT\t = 55,\n+\tRTE_LINK_MODE_50000baseDR_Full_BIT\t\t = 56,\n+\tRTE_LINK_MODE_100000baseKR2_Full_BIT\t = 57,\n+\tRTE_LINK_MODE_100000baseSR2_Full_BIT\t = 58,\n+\tRTE_LINK_MODE_100000baseCR2_Full_BIT\t = 59,\n+\tRTE_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = 60,\n+\tRTE_LINK_MODE_100000baseDR2_Full_BIT\t = 61,\n+\tRTE_LINK_MODE_200000baseKR4_Full_BIT\t = 62,\n+\tRTE_LINK_MODE_200000baseSR4_Full_BIT\t = 63,\n+\tRTE_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = 64,\n+\tRTE_LINK_MODE_200000baseDR4_Full_BIT\t = 65,\n+\tRTE_LINK_MODE_200000baseCR4_Full_BIT\t = 66,\n+\tRTE_LINK_MODE_100baseT1_Full_BIT\t\t = 67,\n+\tRTE_LINK_MODE_1000baseT1_Full_BIT\t\t = 68,\n+\tRTE_LINK_MODE_400000baseKR8_Full_BIT\t = 69,\n+\tRTE_LINK_MODE_400000baseSR8_Full_BIT\t = 70,\n+\tRTE_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = 71,\n+\tRTE_LINK_MODE_400000baseDR8_Full_BIT\t = 72,\n+\tRTE_LINK_MODE_400000baseCR8_Full_BIT\t = 73,\n+\tRTE_LINK_MODE_FEC_LLRS_BIT\t\t\t = 74,\n+\tRTE_LINK_MODE_100000baseKR_Full_BIT\t\t = 75,\n+\tRTE_LINK_MODE_100000baseSR_Full_BIT\t\t = 76,\n+\tRTE_LINK_MODE_100000baseLR_ER_FR_Full_BIT\t = 77,\n+\tRTE_LINK_MODE_100000baseCR_Full_BIT\t\t = 78,\n+\tRTE_LINK_MODE_100000baseDR_Full_BIT\t\t = 79,\n+\tRTE_LINK_MODE_200000baseKR2_Full_BIT\t = 80,\n+\tRTE_LINK_MODE_200000baseSR2_Full_BIT\t = 81,\n+\tRTE_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = 82,\n+\tRTE_LINK_MODE_200000baseDR2_Full_BIT\t = 83,\n+\tRTE_LINK_MODE_200000baseCR2_Full_BIT\t = 84,\n+\tRTE_LINK_MODE_400000baseKR4_Full_BIT\t = 85,\n+\tRTE_LINK_MODE_400000baseSR4_Full_BIT\t = 86,\n+\tRTE_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 87,\n+\tRTE_LINK_MODE_400000baseDR4_Full_BIT\t = 88,\n+\tRTE_LINK_MODE_400000baseCR4_Full_BIT\t = 89,\n+\tRTE_LINK_MODE_100baseFX_Half_BIT\t\t = 90,\n+\tRTE_LINK_MODE_100baseFX_Full_BIT\t\t = 91,\n+\t/* must be last entry */\n+\t__RTE_LINK_MODE_MASK_NBITS\n+};\n+\n+/* number of 32-bit words to store the user's link mode bitmaps */\n+#define RTE_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))\n+#define __RTE_LINK_MODE_MASK_NU32                   \\\n+\tRTE_DIV_ROUND_UP(__RTE_LINK_MODE_MASK_NBITS, 32)\n+\n+/**\n+ * Link control and status\n+ * @speed: Link speed (Mbps)\n+ * @duplex: Duplex mode; one of %DUPLEX_*\n+ * @port: Physical connector type; one of %PORT_*\n+ * @autoneg: Enable/disable autonegotiation and auto-detection;\n+ *\teither %AUTONEG_DISABLE or %AUTONEG_ENABLE\n+ */\n+struct rte_link_base_settings {\n+\tstruct rte_eth_link link;\n+\tuint8_t port;\n+\tuint8_t phy_address;\n+\tuint8_t eth_tp_mdix;\n+\tuint8_t eth_tp_mdix_ctrl;\n+};\n+\n+struct rte_link_settings {\n+\tstruct rte_link_base_settings base;\n+\tstruct {\n+\t\tuint32_t supported[__RTE_LINK_MODE_MASK_NU32];\n+\t\tuint32_t advertising[__RTE_LINK_MODE_MASK_NU32];\n+\t\tuint32_t lp_advertising[__RTE_LINK_MODE_MASK_NU32];\n+\t} link_modes;\n+};\n+\n /**\n  * Tunnel type for device-specific classifier configuration.\n  * @see rte_eth_udp_tunnel\n@@ -5936,6 +6091,50 @@ int rte_eth_cman_config_init(uint16_t port_id, struct rte_eth_cman_config *confi\n __rte_experimental\n int rte_eth_cman_config_set(uint16_t port_id, const struct rte_eth_cman_config *config);\n \n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice\n+ *\n+ * Retrieve link settings\n+ *\n+ * @param port_id\n+ *   The port identifier of the Ethernet device.\n+ * @param settings\n+ *   A pointer to a structure of type *rte_link_settings* to retrieve\n+ *   link settings parameters for the given port.\n+ *\n+ * @return\n+ *   - (0) if successful.\n+ *   - (-ENOTSUP) if support for cman_config_get does not exist.\n+ *   - (-ENODEV) if *port_id* invalid.\n+ *   - (-EINVAL) if bad parameter.\n+ */\n+__rte_experimental\n+int rte_eth_dev_get_link_settings(uint16_t port_id,\n+\t\t\t\t  struct rte_link_settings *settings);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice\n+ *\n+ * Configure link settings\n+ *\n+ * @param port_id\n+ *   The port identifier of the Ethernet device.\n+ * @param settings\n+ *   A pointer to a structure of type *rte_link_settings* to configure\n+ *   link settings parameters for the given port.\n+ *\n+ * @return\n+ *   - (0) if successful.\n+ *   - (-ENOTSUP) if support for cman_config_get does not exist.\n+ *   - (-ENODEV) if *port_id* invalid.\n+ *   - (-EINVAL) if bad parameter.\n+ */\n+__rte_experimental\n+int rte_eth_dev_set_link_settings(uint16_t port_id,\n+\t\t\t\t  const struct rte_link_settings *settings);\n+\n /**\n  * @warning\n  * @b EXPERIMENTAL: this API may change, or be removed, without prior notice\ndiff --git a/lib/ethdev/version.map b/lib/ethdev/version.map\nindex 79f6f5293b..5e138a3d10 100644\n--- a/lib/ethdev/version.map\n+++ b/lib/ethdev/version.map\n@@ -325,6 +325,9 @@ EXPERIMENTAL {\n \trte_flow_template_table_resizable;\n \trte_flow_template_table_resize;\n \trte_flow_template_table_resize_complete;\n+\trte_eth_dev_get_link_settings;\n+\trte_eth_dev_set_link_settings;\n+\n };\n \n INTERNAL {\n",
    "prefixes": []
}