get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 100791,
    "url": "https://patches.dpdk.org/api/patches/100791/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20211007184350.73858-24-srikanth.k@oneconvergence.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": "<20211007184350.73858-24-srikanth.k@oneconvergence.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211007184350.73858-24-srikanth.k@oneconvergence.com",
    "date": "2021-10-07T18:43:32",
    "name": "[v2,23/41] net/mlx5: add link update callback",
    "commit_ref": null,
    "pull_url": null,
    "state": "deferred",
    "archived": false,
    "hash": "d42e34b27e95ab0b360262cb36c3347fbd38d8cc",
    "submitter": {
        "id": 2368,
        "url": "https://patches.dpdk.org/api/people/2368/?format=api",
        "name": "Srikanth Kaka",
        "email": "srikanth.k@oneconvergence.com"
    },
    "delegate": {
        "id": 3268,
        "url": "https://patches.dpdk.org/api/users/3268/?format=api",
        "username": "rasland",
        "first_name": "Raslan",
        "last_name": "Darawsheh",
        "email": "rasland@nvidia.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20211007184350.73858-24-srikanth.k@oneconvergence.com/mbox/",
    "series": [
        {
            "id": 19455,
            "url": "https://patches.dpdk.org/api/series/19455/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=19455",
            "date": "2021-10-07T18:43:09",
            "name": "add MLX5 FreeBSD support",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/19455/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/100791/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/100791/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 6C001A034F;\n\tFri,  8 Oct 2021 12:58:06 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 2EBD4411BA;\n\tFri,  8 Oct 2021 12:56:24 +0200 (CEST)",
            "from mail-pj1-f51.google.com (mail-pj1-f51.google.com\n [209.85.216.51]) by mails.dpdk.org (Postfix) with ESMTP id CC9DF411E0\n for <dev@dpdk.org>; Thu,  7 Oct 2021 20:45:16 +0200 (CEST)",
            "by mail-pj1-f51.google.com with SMTP id oa4so4874715pjb.2\n for <dev@dpdk.org>; Thu, 07 Oct 2021 11:45:16 -0700 (PDT)",
            "from srikanth-ThinkPad-T450.domain.name ([136.185.113.102])\n by smtp.gmail.com with ESMTPSA id c11sm3311586pji.38.2021.10.07.11.45.13\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 07 Oct 2021 11:45:15 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oneconvergence.com; s=google;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=DoysULAK+dKrjpiOk2yon28mzbgl6kIlwmgPfsgJlCw=;\n b=SmA0/PFCPsS5T1OJDtkxs6q/BvlziPiAtBPcKQIyC3fHgI6lIOYiJoHWW98HwzSZjb\n mw59rP1B0uJDOfARfdw+zxDiaadqG2GYJyMiQ1gdoO2isde0tKRNQ/DmAgQy6KYyL4Jm\n p91lmZ6VnTRoKSUkt1I9kbuSmU4LKDyFxzHDg=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20210112;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=DoysULAK+dKrjpiOk2yon28mzbgl6kIlwmgPfsgJlCw=;\n b=l2nDpLBnkhMckf7/BZjnVd/amQfwDJLozo29puf+dmYzEgLj4pUJ8hKstv9lUw0p0N\n Wv11Cg88z6wHUlm0TGEexz2qUbp/HrXfFJBtLkrBhDzGfbF8xerpw8hCAgUBCRoF5JD5\n 3G8y8GS3Jk6yN+LwrCT3zaWAnbfS7QEPzqWOASXyPryqcoZpVgiz1Zt/H3I59D/cVgD9\n 3r+PlyKu2aLE8t7mW8mhsly+jveRD5/Vy0vvFLg5KZmXjPWa0g/NDzY7jtEAuHfMrlxR\n OZxsh3SzkhNEynaYSHzsT6Kwt3Sz6wIfXeWWz5MiIChGutAidPOfGWE7eLU71aQ47CKP\n ElfA==",
        "X-Gm-Message-State": "AOAM532VtGh/5zYL9jNWAKVOynre/REEoMgxHCF3PiE1TPEq+61S4QXp\n IAhYpdnlBYTd2NaUPu8OrEXdbg==",
        "X-Google-Smtp-Source": "\n ABdhPJzf8ns6/8XB/unAdqyKxnTqqbg5CPNjoD2QrY8HqtPARWK0JWvC3ETGtLo42T6Gfza2Dl3IBA==",
        "X-Received": "by 2002:a17:90b:3901:: with SMTP id\n ob1mr7334329pjb.12.1633632316068;\n Thu, 07 Oct 2021 11:45:16 -0700 (PDT)",
        "From": "Srikanth Kaka <srikanth.k@oneconvergence.com>",
        "To": "Matan Azrad <matan@nvidia.com>,\n Viacheslav Ovsiienko <viacheslavo@nvidia.com>",
        "Cc": "dev@dpdk.org, Vag Singh <vag.singh@oneconvergence.com>,\n Anand Thulasiram <avelu@juniper.net>,\n Srikanth Kaka <srikanth.k@oneconvergence.com>",
        "Date": "Fri,  8 Oct 2021 00:13:32 +0530",
        "Message-Id": "<20211007184350.73858-24-srikanth.k@oneconvergence.com>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20211007184350.73858-1-srikanth.k@oneconvergence.com>",
        "References": "<20211007184350.73858-1-srikanth.k@oneconvergence.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Mailman-Approved-At": "Fri, 08 Oct 2021 12:55:54 +0200",
        "Subject": "[dpdk-dev] [PATCH v2 23/41] net/mlx5: add link update callback",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "callback to retrieve physical link information\n\nSigned-off-by: Srikanth Kaka <srikanth.k@oneconvergence.com>\nSigned-off-by: Vag Singh <vag.singh@oneconvergence.com>\nSigned-off-by: Anand Thulasiram <avelu@juniper.net>\n---\n drivers/net/mlx5/freebsd/mlx5_ethdev_os.c | 175 ++++++++++++++++++++++\n 1 file changed, 175 insertions(+)",
    "diff": "diff --git a/drivers/net/mlx5/freebsd/mlx5_ethdev_os.c b/drivers/net/mlx5/freebsd/mlx5_ethdev_os.c\nindex 8b2ea1c594..d100addd51 100644\n--- a/drivers/net/mlx5/freebsd/mlx5_ethdev_os.c\n+++ b/drivers/net/mlx5/freebsd/mlx5_ethdev_os.c\n@@ -7,6 +7,7 @@\n #include <stdint.h>\n #include <net/if_media.h>\n #include <sys/ioctl.h>\n+#include <time.h>\n \n #include <ethdev_driver.h>\n \n@@ -164,6 +165,180 @@ mlx5_set_flags(struct rte_eth_dev *dev, unsigned int keep, unsigned int flags)\n \treturn mlx5_ifreq(dev, SIOCSIFFLAGS, &request);\n }\n \n+static const struct ifmedia_baudrate ifmedia_baudrate_desc[] =\n+\tIFM_BAUDRATE_DESCRIPTIONS;\n+\n+static uint64_t\n+mlx5_ifmedia_baudrate(int mword)\n+{\n+\tint i;\n+\n+\tfor (i = 0; ifmedia_baudrate_desc[i].ifmb_word != 0; i++) {\n+\t\tif (IFM_TYPE_MATCH(mword, ifmedia_baudrate_desc[i].ifmb_word))\n+\t\t\treturn (ifmedia_baudrate_desc[i].ifmb_baudrate);\n+\t}\n+\n+\treturn (0);\n+}\n+\n+static int\n+mlx5_link_update_bsd(struct rte_eth_dev *dev,\n+\t\t     struct rte_eth_link *link)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct rte_eth_link dev_link;\n+\tint link_speed = 0, sock;\n+\tstruct ifmediareq ifmr;\n+\tchar ifname[IF_NAMESIZE];\n+\tint *media_list;\n+\n+\tsock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);\n+\tif (sock == -1) {\n+\t\tDRV_LOG(ERR,\n+\t\t\t\"port %u failed to open socket for link update: %s\",\n+\t\t\tdev->data->port_id, strerror(rte_errno));\n+\t\treturn sock;\n+\t}\n+\n+\tmlx5_get_ifname(dev, &ifname);\n+\tmemset(&ifmr, 0, sizeof(struct ifmediareq));\n+\tstrlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name));\n+\n+\tif (ioctl(sock, SIOCGIFXMEDIA, (caddr_t)&ifmr) < 0) {\n+\t\tDRV_LOG(ERR,\n+\t\t\t\"ioctl(SIOCGIFMEDIA) on %s: %s\",\n+\t\t\tifname, strerror(errno));\n+\t\tclose(sock);\n+\t\treturn errno;\n+\t}\n+\n+\tmedia_list = (int *)malloc(ifmr.ifm_count * sizeof(int));\n+\tifmr.ifm_ulist = media_list;\n+\n+\tif (ioctl(sock, SIOCGIFXMEDIA, (caddr_t)&ifmr) < 0) {\n+\t\tDRV_LOG(ERR,\n+\t\t\t\"ioctl(SIOCGIFMEDIA) on %s: %s\",\n+\t\t\tifname, strerror(errno));\n+\t\tclose(sock);\n+\t\treturn errno;\n+\t}\n+\n+\tif (ifmr.ifm_status == (IFM_AVALID | IFM_ACTIVE))\n+\t\tdev_link.link_status = ETH_LINK_UP;\n+\telse\n+\t\tdev_link.link_status = ETH_LINK_DOWN;\n+\n+\tlink_speed = ifmr.ifm_status & IFM_AVALID ?\n+\t\t   mlx5_ifmedia_baudrate(ifmr.ifm_active)/(1000*1000) : 0;\n+\n+\tif (link_speed == 0)\n+\t\tdev_link.link_speed = ETH_SPEED_NUM_NONE;\n+\telse\n+\t\tdev_link.link_speed = link_speed;\n+\n+\tpriv->link_speed_capa = 0;\n+\t/* Add support for duplex types */\n+\tdev_link.link_duplex = ETH_LINK_FULL_DUPLEX;\n+\t/* FreeBSD automatically negotiates speed,\n+\t * so it is displayed in its capabilities.\n+\t */\n+\tpriv->link_speed_capa |= ETH_LINK_SPEED_AUTONEG;\n+\n+\tfor (int i = 1; i < ifmr.ifm_count; i += 2) {\n+\t\tswitch (mlx5_ifmedia_baudrate(media_list[i]) / (1000 * 1000)) {\n+\t\tcase 100000:\n+\t\t\tpriv->link_speed_capa |= ETH_LINK_SPEED_100G;\n+\t\t\tbreak;\n+\t\tcase 56000:\n+\t\t\tpriv->link_speed_capa |= ETH_LINK_SPEED_56G;\n+\t\t\tbreak;\n+\t\tcase 50000:\n+\t\t\tpriv->link_speed_capa |= ETH_LINK_SPEED_50G;\n+\t\t\tbreak;\n+\t\tcase 40000:\n+\t\t\tpriv->link_speed_capa |= ETH_LINK_SPEED_40G;\n+\t\t\tbreak;\n+\t\tcase 25000:\n+\t\t\tpriv->link_speed_capa |= ETH_LINK_SPEED_25G;\n+\t\t\tbreak;\n+\t\tcase 10000:\n+\t\t\tpriv->link_speed_capa |= ETH_LINK_SPEED_10G;\n+\t\t\tbreak;\n+\t\tcase 2500:\n+\t\t\tpriv->link_speed_capa |= ETH_LINK_SPEED_2_5G;\n+\t\t\tbreak;\n+\t\tcase 1000:\n+\t\t\tpriv->link_speed_capa |= ETH_LINK_SPEED_1G;\n+\t\t\tbreak;\n+\t\tcase 100:\n+\t\t\tpriv->link_speed_capa |= (dev_link.link_duplex ==\n+\t\t\t\t\t\tETH_LINK_FULL_DUPLEX) ?\n+\t\t\t\t\t\tETH_LINK_SPEED_100M :\n+\t\t\t\t\t\tETH_LINK_SPEED_100M_HD;\n+\t\t\tbreak;\n+\t\tcase 10:\n+\t\t\tpriv->link_speed_capa |= (dev_link.link_duplex ==\n+\t\t\t\t\t\tETH_LINK_FULL_DUPLEX) ?\n+\t\t\t\t\t\tETH_LINK_SPEED_10M :\n+\t\t\t\t\t\tETH_LINK_SPEED_10M_HD;\n+\t\t\tbreak;\n+\t\tcase 0:\n+\t\tdefault:\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\tdev_link.link_autoneg = !(dev->data->dev_conf.link_speeds &\n+\t\t\t\tETH_LINK_SPEED_FIXED);\n+\tfree(media_list);\n+\t*link = dev_link;\n+\tclose(sock);\n+\treturn 0;\n+}\n+\n+/**\n+ * DPDK callback to retrieve physical link information.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device structure.\n+ * @param wait_to_complete\n+ *   Wait for request completion.\n+ *\n+ * @return\n+ *   0 if link status was not updated, positive if it was, a negative errno\n+ *   value otherwise and rte_errno is set.\n+ */\n+int\n+mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete)\n+{\n+\tint ret;\n+\tstruct rte_eth_link dev_link;\n+\ttime_t start_time = time(NULL);\n+\tint retry = MLX5_GET_LINK_STATUS_RETRY_COUNT;\n+\n+\tdo {\n+\t\tret = mlx5_link_update_bsd(dev, &dev_link);\n+\t\tif (ret == 0)\n+\t\t\tbreak;\n+\t\t/* Handle wait to complete situation. */\n+\t\tif ((wait_to_complete || retry) && ret == -EAGAIN) {\n+\t\t\tif (abs((int)difftime(time(NULL), start_time)) <\n+\t\t\t    MLX5_LINK_STATUS_TIMEOUT) {\n+\t\t\t\tusleep(0);\n+\t\t\t\tcontinue;\n+\t\t\t} else {\n+\t\t\t\trte_errno = EBUSY;\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n+\t\t} else if (ret < 0) {\n+\t\t\treturn ret;\n+\t\t}\n+\t} while (wait_to_complete || retry-- > 0);\n+\tret = !!memcmp(&dev->data->dev_link, &dev_link,\n+\t\t       sizeof(struct rte_eth_link));\n+\tdev->data->dev_link = dev_link;\n+\treturn ret;\n+}\n+\n /**\n  * DPDK callback to bring the link DOWN.\n  *\n",
    "prefixes": [
        "v2",
        "23/41"
    ]
}