get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 45675,
    "url": "http://patches.dpdk.org/api/patches/45675/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1691fabf67f002c8ad6a85fd5a23a3b854a8daf3.1538215990.git.igor.russkikh@aquantia.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": "<1691fabf67f002c8ad6a85fd5a23a3b854a8daf3.1538215990.git.igor.russkikh@aquantia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1691fabf67f002c8ad6a85fd5a23a3b854a8daf3.1538215990.git.igor.russkikh@aquantia.com",
    "date": "2018-09-29T10:30:25",
    "name": "[v3,11/22] net/atlantic: link status and interrupt management",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "13f3de758a562a472bd3e226a4f1c98ac6da31f2",
    "submitter": {
        "id": 1124,
        "url": "http://patches.dpdk.org/api/people/1124/?format=api",
        "name": "Igor Russkikh",
        "email": "igor.russkikh@aquantia.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1691fabf67f002c8ad6a85fd5a23a3b854a8daf3.1538215990.git.igor.russkikh@aquantia.com/mbox/",
    "series": [
        {
            "id": 1598,
            "url": "http://patches.dpdk.org/api/series/1598/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=1598",
            "date": "2018-09-29T10:30:14",
            "name": "net/atlantic: Aquantia aQtion 10G NIC Family DPDK PMD driver",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/1598/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/45675/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/45675/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 106DB1B3B5;\n\tSat, 29 Sep 2018 12:32:05 +0200 (CEST)",
            "from NAM05-DM3-obe.outbound.protection.outlook.com\n\t(mail-eopbgr730081.outbound.protection.outlook.com [40.107.73.81])\n\tby dpdk.org (Postfix) with ESMTP id C456D1B176\n\tfor <dev@dpdk.org>; Sat, 29 Sep 2018 12:32:00 +0200 (CEST)",
            "from ubuntubox.rdc.aquantia.com (95.79.108.179) by\n\tBLUPR0701MB1650.namprd07.prod.outlook.com (2a01:111:e400:58c6::20)\n\twith Microsoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1185.22;\n\tSat, 29 Sep 2018 10:31:52 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=AQUANTIA1COM.onmicrosoft.com; s=selector1-aquantia-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=m4VtXGSDDVFdHRfkWwehVCOBfmLuCDO98m0/LNhg9kU=;\n\tb=MYVveJsbYx0XVUemeVohPPAYboaT7+dcBRCHrjtZm7RNKxIepfVUld60vkEMc5BNs+qvPfldSMmOmjT1vW7QUYsF9nREHMcqL24ItH08u7AeSwcmn8uHBrDBX8JXTVl0Efk4pzAjDcOJ/51dWTNoupUraMMgJWEXArIdiky6xGo=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Igor.Russkikh@aquantia.com; ",
        "From": "Igor Russkikh <igor.russkikh@aquantia.com>",
        "To": "dev@dpdk.org",
        "Cc": "pavel.belous@aquantia.com, igor.russkikh@aquantia.com,\n\tPavel Belous <Pavel.Belous@aquantia.com>",
        "Date": "Sat, 29 Sep 2018 13:30:25 +0300",
        "Message-Id": "<1691fabf67f002c8ad6a85fd5a23a3b854a8daf3.1538215990.git.igor.russkikh@aquantia.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<cover.1538215990.git.igor.russkikh@aquantia.com>",
        "References": "<cover.1538215990.git.igor.russkikh@aquantia.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[95.79.108.179]",
        "X-ClientProxiedBy": "VI1P193CA0009.EURP193.PROD.OUTLOOK.COM\n\t(2603:10a6:800:bd::19) To BLUPR0701MB1650.namprd07.prod.outlook.com\n\t(2a01:111:e400:58c6::20)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "8d33b3ca-d164-4341-ad0a-08d625f6c972",
        "X-Microsoft-Antispam": "BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(2017052603328)(7153060)(7193020);\n\tSRVR:BLUPR0701MB1650; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; BLUPR0701MB1650;\n\t3:h/ES+3ArumZQS3CbDkulJNTWLnclDAhOuaOGobfJ13mrrSg9w8TlzT5j3tU+bT6JcPboPjfro5O66fwTcVR6KwPa/MUQ5ZCi6ypLBNA82h4aDphMRgSuG6aPfY9kQQqQkPt59nOEgG/ar8xzjovnH4udrRtZRSVtpJYuA9wmtN+nAk7XU15Nd3qmokFk0bTO0g3b4kDn+a+KrlyP92b9Yw0ZNjWjZLci7vKTJB/4nebraUKXixnr5xkouMUSAWLg;\n\t25:t3SHEquNxF2w2USNMaWBcUfmtHvilsRuD5axyYWEBlt1XUU8XHQGq244EupwSg7HDV3J/CwRgGojLUtGiFxk6rC5buf6OsbKUtOllgKeFNHyv3C9+GkutVjyrniz4EA7NAjhjrMZ9XXbbMK1mq6JZZIZMMYB6B6sC2kDgZIpHU9W1gGg6hDK4iQd3RsfwCC0J1xfDrxvP/oL3LGEpqWj0MadDytUUrRpvTL9iM+0CYBVmtw1eQ7bGpAl31wYd2nxlYd0UY/AQWugySWxNRRPvZwyE3vu2WvH2iLYtxQjWOLFgRVbGpjHFXSWvEiePdSMiS4nqUsSW/3V0tEIbfETlTQL2WOPLSnElXa7EDBrpFE=;\n\t31:D/8gLdVTPEA9So6VL6ZX83ruFp4RK5Jpwl5bGTnSqXgcccgNpxQnE2BAFGy2GCJIUj1zfyEnTe8izXWqMTSXOzMplQYyapHhuCir1jZ0wc3BWFuZQmtJkkgUstIstTMaRrmudOrROufuP3FYQnpFpPBOGZ/XlrzyxFc/PGb+ajHX3js391+fXD8DrAZWE9eJIAlXrUKCK+aGGLxUL3go4zte7UH9UzaPnVdgPy5lU9I=",
            "1; BLUPR0701MB1650;\n\t20:G72f9cQ3/3mdlAmcabzIn9nfV2wUyzAeqjnBKyGEUdGYtD0oXsbIyqettfK/B6C7TYICrRCdbVHPwsYKSIYXDswk4c76KGLyCzhL8EJFLMamDWrM1XspI2KwHmKxjI58vCy4zFpPF8Omj0CPxSqTaPwYQKERGXvlQWovBBPvXRiLKqWnHdvVavupztZzeNRmqt9QC57uSP1WGi4SGc772utz7FeiFmgN8JBh755kTnlDnPMn61Mh+wnyPbZ5Jxqyl2Q4PFFNKRoxBzV2exBoCAkARjP2Jh33iOk4nXQZRlK1aIsx2LEy+Rl7jEaludBbIsC9ilZBsE6BuS+OZMSKyfoSg1d/QpUELRi6+Y0LpABuc/oGME9z706QZVABS/iTFdhBS+/vu+w+HIBrup7Gm9PYrhUFmRBl2nuk7joMuFDkpC5sZkkUUq4lb0uS0rkILBvf0lJHcQxyEgj/NzImY6TBtKXfioPfgqeQgs8p3J24X2lvRefcX6kDTYC17xZA;\n\t4:Riy/MnERKc8KXzPtQTbbCVHg/B+wxKlpIRATASoH/agEfUazNi2YlKQrPPr1G0T3SeR0xS1+yYBc04KolWaKgNXceGSXkbJhDJLB0NFvTgHH6fba9PuSNfnwT9hUJMn7+Xar+/ZXvvRl02g0fBxLItUcNQcdb3FwnC5gXap0KKwY9ZkyxUq33UgLrXzPcxQa4josYOGhrspN1YhNvTk5GjzUOZCZyI3akLzKX1tTi24y3S4PHHpGhqx51RKXNs9I9/kCK2LGoy5+pgf9ESaQoKeF+d1AVj95Qj6FRs9Rk3QXY0iC33ta0JNKd9KGljWX",
            "=?us-ascii?Q?1; BLUPR0701MB1650;\n\t23:G5uG2XmNHTeKhyM25FimIK+oYl2FG91AHNP/4yn?=\n\t+S6tXLnCGHBKYe8ukYxIpsQ2/nuC4lqvf3LZLKFA70oZ48el0lLw4DZlPqqn5u+7jsBeGFoCHv8FdrrE/zPrDWxv8uUWCxLpwvLMSphTVxlkcTDytC/6lf3tzuQ6q0XazTw3mBT1UsLeGzvLSG4I67VxuWjawNsFZuLaolmBJAtP6a13vLG2WejunhFvY8qOKy+9MsHz6IbKZbBEOaInG7uwoOCos2KctZUt1kbJrH9wWYP9yMRauEoqdE0jU0ha1FMXTbRR5C4wN4UsQPibWUy8DQbh6XfGt59nzhw1l/dB2wQFBIRRxs7kSaHKOHn1BpupzD7YK6AqB1r20uoPPzmJLZFluuDJLXFkSQdP39hTZxD9QJePv/p3QTfVwg0gXzA0DtydLSirsA0O5ozxLK0pPN8kn1sxhRju5rdPf+TPi6PwYdx9DX0+ib2G+Im2FCsIAyqcY6b6RT7HYixlhwpiNvQ70GdNDiBPIGzcieyz9cTikGz7c4+i5jgmeUPLPrKiANXc4t5Z367IVB4IBNt5g4ySAICIPMPO6kFGZ/WXiXaOISSvA5GS4WYILPLpv7UbU+NHI69O2x49Ql1kTwul0rcwcl3qjLWA/SrvzOvqzQsdkV12ne6kGuY9v+Bz/TlJyFgtmhH67rztJEZbpH9S7J+hfG+6E+nDcCZSuIrXkfxY/lPW73pjGQ1DUiIRtDmkWovCV0VExXuwl/3gLR5I46tWtDQdAGBrmksfpr7TkhNAHfiv8W6tvQnLIYEfLT/DV5sSMonkCWpkSDzxw9Tgiz3/rH4TQOtQ67Goc+A7pTxJR0xQhnqBVlDY+jeu/FE8G3ju07a11miEOPCHsot1MHn7P/IyoDHroQrEeq1jsvny1IxBN2B44tMmaKDvNto+5mSzwrnMX3HZb1Gfe6bPFNWRN997oNBtGZOLP5J02rS3SHO6zmplurahEe+C/W4YjHvzo6kd277DrkAAIUIrgfl62D9DhKgHEthTVIUr5gKukr5GAYys50FsIjgykATXsVC1+p2TaPWWMEmZ+9Q/oaMIh5A8dj2v9KGMd389YHI/mPKMwXkHL8voNk1DLKA0eVyuhBSZtl9FUjZloJAw+9cLQuu2QvvhYYPGV5cF4gVfGh3gNUgWLqXqnkBzXv9x7vHDvr79AcSoWZ1zolAry0Sl0frPsSJ6t1h0qn2m0aKgTmYOD33NdJIIuf24NvbuLt6IXWDpenSby7UuFaHysnoJ8j5MkoX8FZYGLOd4cHmxCMYTo8UwNwlJ4+k9sg9edMzN7sWPLyJ2WPlm89sDN",
            "1; BLUPR0701MB1650;\n\t6:encTneyeTGHcbaCbwK19wqLyMAjBJ621PqO6W1+B8878tzhFMgm8UbABxUZUKHS2MKJxpNaCvFF31Q7TwmwI9xvZuS8OFVbVNfqZGNKJbhtRWaZGd5gvOLWsD+KZVUn78dQh+B9LVYX9pH0z3kDdbxmIAl/XbFIOrOhOUiwXqhdtdzk4tHTQgSsHv/tnJpupBllycsnLSKpNzuPSDrC7RTDuSz/2VhBz0ErmVY1l58MGr8Ql62u6mpDt79ofADQ7Ree9vrwON1w/IGs/CE+QrtE2Sbk5taUlFqq7MP6IQZFO6IcFPW//qB/LRJ0JhO/ty+vcCfSow25O1PMMKb0F88ygi8OmKrRpnugRiNaXnKWT77kcPkt8Lw2PV4s7GxBU9OV9CObFQxiPwtV2x/9RkjviVZI2CJp7vAyq/I97kAkpKpWiYHxQFePJA05AE3RKpkwUruXERf/IHYXWrIFptw==;\n\t5:3hPqFcqWKxuHd113KLPkTYv7drdE7aRd1wxp8gb5ENEVfFO4hx5ZdG/DuCjyARsFR/+Spqii7LvXBIey+oSc2yscbBVys/bc48+FA2sURkZdjZeRTjYVFOUOBnWI3zk02IyxJXx8NvkCzNbe/oaVk8C0cU7miKsMSm3JMRkua98=;\n\t7:VXwlqVHCZwttIom/aDvN1LIZcAPJttNiTwK51eGMyya+N20EKJ/eShJWl7RKsyXIcNhgPcrrdjR79j8lI7dPBcxFz5BoVHto8C/om0bkvSjfID2QdUIlFu91h4KnG/RPvYO7r/1ecyivxQRvKffjvVxjCGA4pELv8YSQgLfIlfUhQGs4BvxTZX1jQzs6WCigpLvktCXSxCCooEy7ITQRSb1l41YOc99KEpSfRLOMGSNM1hqzMRpepxuWzAwzmjzf"
        ],
        "X-MS-TrafficTypeDiagnostic": "BLUPR0701MB1650:",
        "X-Microsoft-Antispam-PRVS": "<BLUPR0701MB16504C2062355291134DE7A598ED0@BLUPR0701MB1650.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:(269456686620040);",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(6040522)(2401047)(8121501046)(5005006)(10201501046)(3002001)(93006095)(93001095)(3231355)(944501410)(52105095)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(201708071742011)(7699051);\n\tSRVR:BLUPR0701MB1650; BCL:0; PCL:0; RULEID:; SRVR:BLUPR0701MB1650; ",
        "X-Forefront-PRVS": "0810818DA0",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(346002)(136003)(396003)(376002)(39850400004)(366004)(189003)(199004)(16526019)(14444005)(446003)(76176011)(2906002)(6916009)(6666003)(97736004)(8676002)(81166006)(81156014)(36756003)(4326008)(316002)(8936002)(50226002)(34290500001)(575784001)(86362001)(5660300001)(68736007)(16586007)(118296001)(72206003)(3846002)(6116002)(53936002)(386003)(105586002)(6486002)(47776003)(66066001)(486006)(25786009)(305945005)(50466002)(44832011)(956004)(2616005)(26005)(107886003)(52116002)(51416003)(7696005)(186003)(476003)(478600001)(2361001)(7736002)(2351001)(48376002)(106356001)(11346002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR0701MB1650;\n\tH:ubuntubox.rdc.aquantia.com; \n\tFPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; ",
        "Received-SPF": "None (protection.outlook.com: aquantia.com does not designate\n\tpermitted sender hosts)",
        "X-Microsoft-Antispam-Message-Info": "mSgorJ6hxoTOmYKxXoLBtFT0GSxzJei6KG/rtLxq3UWDqkRcyDEzhiLP4ysPdExNruGkKOsPlzZqgd9mHkE/LBXX1sUSrph2eXJHLaEV4FYpTB3OrIGxs+DUIPTy7gdu3xtf6EqezciY2VviFAFADfldE5WBPQ5sI0wFwca0s04GQRCeOxMPtCcHdVxql/rXc5jmKpC79z9+CzGbbeP8kmRiq+3t2Nj01qe/Dxh3aCW7sxQPIxM4KO5gIteKfra3qIbk0dsziz0zq93A9jmmSew+qnXE3hSpLoatfVr+7PSIqBYPBu3AzITMkT6bvqmYvH7i415wTrcia11z/6FQWQ+39Mr8jNwvbJcfVHjcORM=",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "aquantia.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "29 Sep 2018 10:31:52.8762\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "8d33b3ca-d164-4341-ad0a-08d625f6c972",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "83e2e134-991c-4ede-8ced-34d47e38e6b1",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "BLUPR0701MB1650",
        "Subject": "[dpdk-dev] [PATCH v3 11/22] net/atlantic: link status and interrupt\n\tmanagement",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Pavel Belous <Pavel.Belous@aquantia.com>\n\nImplement link interrupt, link info, link polling.\n\nSigned-off-by: Igor Russkikh <igor.russkikh@aquantia.com>\nSigned-off-by: Pavel Belous <Pavel.Belous@aquantia.com>\n---\n drivers/net/atlantic/atl_ethdev.c | 461 +++++++++++++++++++++++++++++++++++++-\n drivers/net/atlantic/atl_ethdev.h |  16 ++\n drivers/net/atlantic/atl_rxtx.c   |  36 +++\n drivers/net/atlantic/atl_types.h  |   2 +\n 4 files changed, 514 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c\nindex 6a00277c3c8e..75c9fa169925 100644\n--- a/drivers/net/atlantic/atl_ethdev.c\n+++ b/drivers/net/atlantic/atl_ethdev.c\n@@ -18,8 +18,11 @@ static int eth_atl_dev_uninit(struct rte_eth_dev *eth_dev);\n static int  atl_dev_configure(struct rte_eth_dev *dev);\n static int  atl_dev_start(struct rte_eth_dev *dev);\n static void atl_dev_stop(struct rte_eth_dev *dev);\n+static int  atl_dev_set_link_up(struct rte_eth_dev *dev);\n+static int  atl_dev_set_link_down(struct rte_eth_dev *dev);\n static void atl_dev_close(struct rte_eth_dev *dev);\n static int  atl_dev_reset(struct rte_eth_dev *dev);\n+static int  atl_dev_link_update(struct rte_eth_dev *dev, int wait);\n \n static int atl_fw_version_get(struct rte_eth_dev *dev, char *fw_version,\n \t\t\t      size_t fw_size);\n@@ -29,6 +32,16 @@ static void atl_dev_info_get(struct rte_eth_dev *dev,\n \n static const uint32_t *atl_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n \n+static void atl_dev_link_status_print(struct rte_eth_dev *dev);\n+\n+/* Interrupts */\n+static int atl_dev_rxq_interrupt_setup(struct rte_eth_dev *dev);\n+static int atl_dev_lsc_interrupt_setup(struct rte_eth_dev *dev, uint8_t on);\n+static int atl_dev_interrupt_get_status(struct rte_eth_dev *dev);\n+static int atl_dev_interrupt_action(struct rte_eth_dev *dev,\n+\t\t\t\t    struct rte_intr_handle *handle);\n+static void atl_dev_interrupt_handler(void *param);\n+\n static int eth_atl_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,\n \tstruct rte_pci_device *pci_dev);\n static int eth_atl_pci_remove(struct rte_pci_device *pci_dev);\n@@ -104,9 +117,14 @@ static const struct eth_dev_ops atl_eth_dev_ops = {\n \t.dev_configure\t      = atl_dev_configure,\n \t.dev_start\t      = atl_dev_start,\n \t.dev_stop\t      = atl_dev_stop,\n+\t.dev_set_link_up      = atl_dev_set_link_up,\n+\t.dev_set_link_down    = atl_dev_set_link_down,\n \t.dev_close\t      = atl_dev_close,\n \t.dev_reset\t      = atl_dev_reset,\n \n+\t/* Link */\n+\t.link_update\t      = atl_dev_link_update,\n+\n \t.fw_version_get       = atl_fw_version_get,\n \t.dev_infos_get\t      = atl_dev_info_get,\n \t.dev_supported_ptypes_get = atl_dev_supported_ptypes_get,\n@@ -121,14 +139,85 @@ static const struct eth_dev_ops atl_eth_dev_ops = {\n \t.tx_queue_stop\t      = atl_tx_queue_stop,\n \t.tx_queue_setup       = atl_tx_queue_setup,\n \t.tx_queue_release     = atl_tx_queue_release,\n+\n+\t.rx_queue_intr_enable = atl_dev_rx_queue_intr_enable,\n+\t.rx_queue_intr_disable = atl_dev_rx_queue_intr_disable,\n };\n \n+\n+/**\n+ * Atomically reads the link status information from global\n+ * structure rte_eth_dev.\n+ *\n+ * @param dev\n+ *   - Pointer to the structure rte_eth_dev to read from.\n+ *   - Pointer to the buffer to be saved with the link status.\n+ *\n+ * @return\n+ *   - On success, zero.\n+ *   - On failure, negative value.\n+ */\n+static inline int\n+rte_atl_dev_atomic_read_link_status(struct rte_eth_dev *dev,\n+\t\t\t\tstruct rte_eth_link *link)\n+{\n+\tstruct rte_eth_link *dst = link;\n+\tstruct rte_eth_link *src = &dev->data->dev_link;\n+\n+\tif (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,\n+\t\t\t\t\t*(uint64_t *)src) == 0)\n+\t\treturn -1;\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * Atomically writes the link status information into global\n+ * structure rte_eth_dev.\n+ *\n+ * @param dev\n+ *   - Pointer to the structure rte_eth_dev to read from.\n+ *   - Pointer to the buffer to be saved with the link status.\n+ *\n+ * @return\n+ *   - On success, zero.\n+ *   - On failure, negative value.\n+ */\n+static inline int\n+rte_atl_dev_atomic_write_link_status(struct rte_eth_dev *dev,\n+\t\t\t\tstruct rte_eth_link *link)\n+{\n+\tstruct rte_eth_link *dst = &dev->data->dev_link;\n+\tstruct rte_eth_link *src = link;\n+\n+\tif (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,\n+\t\t\t\t\t*(uint64_t *)src) == 0)\n+\t\treturn -1;\n+\n+\treturn 0;\n+}\n+\n static inline int32_t\n atl_reset_hw(struct aq_hw_s *hw)\n {\n \treturn hw_atl_b0_hw_reset(hw);\n }\n \n+static inline void\n+atl_enable_intr(struct rte_eth_dev *dev)\n+{\n+\tstruct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\n+\thw_atl_itr_irq_msk_setlsw_set(hw, 0xffffffff);\n+}\n+\n+static void\n+atl_disable_intr(struct aq_hw_s *hw)\n+{\n+\tPMD_INIT_FUNC_TRACE();\n+\thw_atl_itr_irq_msk_clearlsw_set(hw, 0xffffffff);\n+}\n+\n static void\n atl_print_adapter_info(struct aq_hw_s *hw __rte_unused)\n {\n@@ -145,6 +234,7 @@ eth_atl_dev_init(struct rte_eth_dev *eth_dev)\n \tstruct atl_adapter *adapter =\n \t\t(struct atl_adapter *)eth_dev->data->dev_private;\n \tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);\n+\tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n \tstruct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);\n \tint err = 0;\n \n@@ -169,9 +259,17 @@ eth_atl_dev_init(struct rte_eth_dev *eth_dev)\n \t/* Hardware configuration - hardcode */\n \tadapter->hw_cfg.is_lro = false;\n \tadapter->hw_cfg.wol = false;\n+\tadapter->hw_cfg.link_speed_msk = AQ_NIC_RATE_10G |\n+\t\t\t  AQ_NIC_RATE_5G |\n+\t\t\t  AQ_NIC_RATE_2G5 |\n+\t\t\t  AQ_NIC_RATE_1G |\n+\t\t\t  AQ_NIC_RATE_100M;\n \n \thw->aq_nic_cfg = &adapter->hw_cfg;\n \n+\t/* disable interrupt */\n+\tatl_disable_intr(hw);\n+\n \t/* Allocate memory for storing MAC addresses */\n \teth_dev->data->mac_addrs = rte_zmalloc(\"atlantic\", ETHER_ADDR_LEN, 0);\n \tif (eth_dev->data->mac_addrs == NULL) {\n@@ -188,12 +286,23 @@ eth_atl_dev_init(struct rte_eth_dev *eth_dev)\n \t\t\t(u8 *)&eth_dev->data->mac_addrs[0]) != 0)\n \t\treturn -EINVAL;\n \n+\trte_intr_callback_register(intr_handle,\n+\t\t\t\t   atl_dev_interrupt_handler, eth_dev);\n+\n+\t/* enable uio/vfio intr/eventfd mapping */\n+\trte_intr_enable(intr_handle);\n+\n+\t/* enable support intr */\n+\tatl_enable_intr(eth_dev);\n+\n \treturn err;\n }\n \n static int\n eth_atl_dev_uninit(struct rte_eth_dev *eth_dev)\n {\n+\tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);\n+\tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n \tstruct aq_hw_s *hw;\n \n \tPMD_INIT_FUNC_TRACE();\n@@ -210,6 +319,11 @@ eth_atl_dev_uninit(struct rte_eth_dev *eth_dev)\n \teth_dev->rx_pkt_burst = NULL;\n \teth_dev->tx_pkt_burst = NULL;\n \n+\t/* disable uio intr before callback unregister */\n+\trte_intr_disable(intr_handle);\n+\trte_intr_callback_unregister(intr_handle,\n+\t\t\t\t     atl_dev_interrupt_handler, eth_dev);\n+\n \trte_free(eth_dev->data->mac_addrs);\n \teth_dev->data->mac_addrs = NULL;\n \n@@ -238,8 +352,16 @@ eth_atl_pci_remove(struct rte_pci_device *pci_dev)\n }\n \n static int\n-atl_dev_configure(struct rte_eth_dev *dev __rte_unused)\n+atl_dev_configure(struct rte_eth_dev *dev)\n {\n+\tstruct atl_interrupt *intr =\n+\t\tATL_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\t/* set flag to update link status after init */\n+\tintr->flags |= ATL_FLAG_NEED_LINK_UPDATE;\n+\n \treturn 0;\n }\n \n@@ -251,11 +373,26 @@ static int\n atl_dev_start(struct rte_eth_dev *dev)\n {\n \tstruct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n+\tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n+\tuint32_t intr_vector = 0;\n+\tuint32_t *link_speeds;\n+\tuint32_t speed = 0;\n \tint status;\n \tint err;\n \n \tPMD_INIT_FUNC_TRACE();\n \n+\tif (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) {\n+\t\tPMD_INIT_LOG(ERR,\n+\t\t\"Invalid link_speeds for port %u, fix speed not supported\",\n+\t\t\t\tdev->data->port_id);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* disable uio/vfio intr/eventfd mapping */\n+\trte_intr_disable(intr_handle);\n+\n \t/* stop adapter */\n \thw->adapter_stopped = 0;\n \n@@ -269,6 +406,32 @@ atl_dev_start(struct rte_eth_dev *dev)\n \terr = hw_atl_b0_hw_init(hw, (uint8_t *)dev->data->mac_addrs);\n \n \thw_atl_b0_hw_start(hw);\n+\t/* check and configure queue intr-vector mapping */\n+\tif ((rte_intr_cap_multiple(intr_handle) ||\n+\t    !RTE_ETH_DEV_SRIOV(dev).active) &&\n+\t    dev->data->dev_conf.intr_conf.rxq != 0) {\n+\t\tintr_vector = dev->data->nb_rx_queues;\n+\t\tif (intr_vector > ATL_MAX_INTR_QUEUE_NUM) {\n+\t\t\tPMD_INIT_LOG(ERR, \"At most %d intr queues supported\",\n+\t\t\t\t\tATL_MAX_INTR_QUEUE_NUM);\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n+\t\tif (rte_intr_efd_enable(intr_handle, intr_vector)) {\n+\t\t\tPMD_INIT_LOG(ERR, \"rte_intr_efd_enable failed\");\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\tif (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {\n+\t\tintr_handle->intr_vec = rte_zmalloc(\"intr_vec\",\n+\t\t\t\t    dev->data->nb_rx_queues * sizeof(int), 0);\n+\t\tif (intr_handle->intr_vec == NULL) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Failed to allocate %d rx_queues\"\n+\t\t\t\t     \" intr_vec\", dev->data->nb_rx_queues);\n+\t\t\treturn -ENOMEM;\n+\t\t}\n+\t}\n+\n \t/* initialize transmission unit */\n \tatl_tx_init(dev);\n \n@@ -285,6 +448,61 @@ atl_dev_start(struct rte_eth_dev *dev)\n \t\tgoto error;\n \t}\n \n+\terr = hw->aq_fw_ops->update_link_status(hw);\n+\n+\tif (err)\n+\t\tgoto error;\n+\n+\tdev->data->dev_link.link_status = hw->aq_link_status.mbps != 0;\n+\n+\tlink_speeds = &dev->data->dev_conf.link_speeds;\n+\n+\tspeed = 0x0;\n+\n+\tif (*link_speeds == ETH_LINK_SPEED_AUTONEG) {\n+\t\tspeed = hw->aq_nic_cfg->link_speed_msk;\n+\t} else {\n+\t\tif (*link_speeds & ETH_LINK_SPEED_10G)\n+\t\t\tspeed |= AQ_NIC_RATE_10G;\n+\t\tif (*link_speeds & ETH_LINK_SPEED_5G)\n+\t\t\tspeed |= AQ_NIC_RATE_5G;\n+\t\tif (*link_speeds & ETH_LINK_SPEED_1G)\n+\t\t\tspeed |= AQ_NIC_RATE_1G;\n+\t\tif (*link_speeds & ETH_LINK_SPEED_2_5G)\n+\t\t\tspeed |=  AQ_NIC_RATE_2G5;\n+\t\tif (*link_speeds & ETH_LINK_SPEED_100M)\n+\t\t\tspeed |= AQ_NIC_RATE_100M;\n+\t}\n+\n+\terr = hw->aq_fw_ops->set_link_speed(hw, speed);\n+\tif (err)\n+\t\tgoto error;\n+\n+\tif (rte_intr_allow_others(intr_handle)) {\n+\t\t/* check if lsc interrupt is enabled */\n+\t\tif (dev->data->dev_conf.intr_conf.lsc != 0)\n+\t\t\tatl_dev_lsc_interrupt_setup(dev, TRUE);\n+\t\telse\n+\t\t\tatl_dev_lsc_interrupt_setup(dev, FALSE);\n+\t} else {\n+\t\trte_intr_callback_unregister(intr_handle,\n+\t\t\t\t\t     atl_dev_interrupt_handler, dev);\n+\t\tif (dev->data->dev_conf.intr_conf.lsc != 0)\n+\t\t\tPMD_INIT_LOG(INFO, \"lsc won't enable because of\"\n+\t\t\t\t     \" no intr multiplex\");\n+\t}\n+\n+\t/* check if rxq interrupt is enabled */\n+\tif (dev->data->dev_conf.intr_conf.rxq != 0 &&\n+\t    rte_intr_dp_is_en(intr_handle))\n+\t\tatl_dev_rxq_interrupt_setup(dev);\n+\n+\t/* enable uio/vfio intr/eventfd mapping */\n+\trte_intr_enable(intr_handle);\n+\n+\t/* resume enabled intr since hw reset */\n+\tatl_enable_intr(dev);\n+\n \tatl_print_adapter_info(hw);\n \n \treturn 0;\n@@ -301,8 +519,16 @@ atl_dev_start(struct rte_eth_dev *dev)\n static void\n atl_dev_stop(struct rte_eth_dev *dev)\n {\n+\tstruct rte_eth_link link;\n \tstruct aq_hw_s *hw =\n \t\tATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n+\tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\t/* disable interrupts */\n+\tatl_disable_intr(hw);\n \n \t/* reset the NIC */\n \tatl_reset_hw(hw);\n@@ -314,6 +540,45 @@ atl_dev_stop(struct rte_eth_dev *dev)\n \tdev->data->scattered_rx = 0;\n \tdev->data->lro = 0;\n \n+\t/* Clear recorded link status */\n+\tmemset(&link, 0, sizeof(link));\n+\trte_atl_dev_atomic_write_link_status(dev, &link);\n+\n+\tif (!rte_intr_allow_others(intr_handle))\n+\t\t/* resume to the default handler */\n+\t\trte_intr_callback_register(intr_handle,\n+\t\t\t\t\t   atl_dev_interrupt_handler,\n+\t\t\t\t\t   (void *)dev);\n+\n+\t/* Clean datapath event and queue/vec mapping */\n+\trte_intr_efd_disable(intr_handle);\n+\tif (intr_handle->intr_vec != NULL) {\n+\t\trte_free(intr_handle->intr_vec);\n+\t\tintr_handle->intr_vec = NULL;\n+\t}\n+}\n+\n+/*\n+ * Set device link up: enable tx.\n+ */\n+static int\n+atl_dev_set_link_up(struct rte_eth_dev *dev)\n+{\n+\tstruct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\n+\treturn hw->aq_fw_ops->set_link_speed(hw,\n+\t\t\thw->aq_nic_cfg->link_speed_msk);\n+}\n+\n+/*\n+ * Set device link down: disable tx.\n+ */\n+static int\n+atl_dev_set_link_down(struct rte_eth_dev *dev)\n+{\n+\tstruct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\n+\treturn hw->aq_fw_ops->set_link_speed(hw, 0);\n }\n \n /*\n@@ -402,6 +667,11 @@ atl_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n \n \tdev_info->rx_desc_lim = rx_desc_lim;\n \tdev_info->tx_desc_lim = tx_desc_lim;\n+\n+\tdev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G;\n+\tdev_info->speed_capa |= ETH_LINK_SPEED_100M;\n+\tdev_info->speed_capa |= ETH_LINK_SPEED_2_5G;\n+\tdev_info->speed_capa |= ETH_LINK_SPEED_5G;\n }\n \n static const uint32_t *\n@@ -426,6 +696,195 @@ atl_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \treturn NULL;\n }\n \n+/* return 0 means link status changed, -1 means not changed */\n+static int\n+atl_dev_link_update(struct rte_eth_dev *dev, int wait __rte_unused)\n+{\n+\tstruct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tstruct atl_interrupt *intr =\n+\t\tATL_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n+\tstruct rte_eth_link link, old;\n+\tint err = 0;\n+\n+\tlink.link_status = ETH_LINK_DOWN;\n+\tlink.link_speed = 0;\n+\tlink.link_duplex = ETH_LINK_FULL_DUPLEX;\n+\tlink.link_autoneg = hw->is_autoneg ? ETH_LINK_AUTONEG : ETH_LINK_FIXED;\n+\tmemset(&old, 0, sizeof(old));\n+\n+\t/* load old link status */\n+\trte_atl_dev_atomic_read_link_status(dev, &old);\n+\n+\t/* read current link status */\n+\terr = hw->aq_fw_ops->update_link_status(hw);\n+\n+\tif (err)\n+\t\treturn 0;\n+\n+\tif (hw->aq_link_status.mbps == 0) {\n+\t\t/* write default (down) link status */\n+\t\trte_atl_dev_atomic_write_link_status(dev, &link);\n+\t\tif (link.link_status == old.link_status)\n+\t\t\treturn -1;\n+\t\treturn 0;\n+\t}\n+\n+\tintr->flags &= ~ATL_FLAG_NEED_LINK_CONFIG;\n+\n+\tlink.link_status = ETH_LINK_UP;\n+\tlink.link_duplex = ETH_LINK_FULL_DUPLEX;\n+\tlink.link_speed = hw->aq_link_status.mbps;\n+\n+\trte_atl_dev_atomic_write_link_status(dev, &link);\n+\n+\tif (link.link_status == old.link_status)\n+\t\treturn -1;\n+\n+\treturn 0;\n+}\n+\n+\n+/**\n+ * It clears the interrupt causes and enables the interrupt.\n+ * It will be called once only during nic initialized.\n+ *\n+ * @param dev\n+ *  Pointer to struct rte_eth_dev.\n+ * @param on\n+ *  Enable or Disable.\n+ *\n+ * @return\n+ *  - On success, zero.\n+ *  - On failure, a negative value.\n+ */\n+\n+static int\n+atl_dev_lsc_interrupt_setup(struct rte_eth_dev *dev, uint8_t on __rte_unused)\n+{\n+\tatl_dev_link_status_print(dev);\n+\treturn 0;\n+}\n+\n+static int\n+atl_dev_rxq_interrupt_setup(struct rte_eth_dev *dev __rte_unused)\n+{\n+\treturn 0;\n+}\n+\n+\n+static int\n+atl_dev_interrupt_get_status(struct rte_eth_dev *dev)\n+{\n+\tstruct atl_interrupt *intr =\n+\t\tATL_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n+\tstruct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tu64 cause = 0;\n+\n+\thw_atl_b0_hw_irq_read(hw, &cause);\n+\n+\tatl_disable_intr(hw);\n+\tintr->flags = cause & BIT(ATL_IRQ_CAUSE_LINK) ?\n+\t\t\tATL_FLAG_NEED_LINK_UPDATE : 0;\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * It gets and then prints the link status.\n+ *\n+ * @param dev\n+ *  Pointer to struct rte_eth_dev.\n+ *\n+ * @return\n+ *  - On success, zero.\n+ *  - On failure, a negative value.\n+ */\n+static void\n+atl_dev_link_status_print(struct rte_eth_dev *dev)\n+{\n+\tstruct rte_eth_link link;\n+\n+\tmemset(&link, 0, sizeof(link));\n+\trte_atl_dev_atomic_read_link_status(dev, &link);\n+\tif (link.link_status) {\n+\t\tPMD_DRV_LOG(INFO, \"Port %d: Link Up - speed %u Mbps - %s\",\n+\t\t\t\t\t(int)(dev->data->port_id),\n+\t\t\t\t\t(unsigned int)link.link_speed,\n+\t\t\tlink.link_duplex == ETH_LINK_FULL_DUPLEX ?\n+\t\t\t\t\t\"full-duplex\" : \"half-duplex\");\n+\t} else {\n+\t\tPMD_DRV_LOG(INFO, \" Port %d: Link Down\",\n+\t\t\t\t(int)(dev->data->port_id));\n+\t}\n+\n+\n+#ifdef DEBUG\n+{\n+\tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n+\n+\tPMD_DRV_LOG(DEBUG, \"PCI Address: \" PCI_PRI_FMT,\n+\t\t\t\tpci_dev->addr.domain,\n+\t\t\t\tpci_dev->addr.bus,\n+\t\t\t\tpci_dev->addr.devid,\n+\t\t\t\tpci_dev->addr.function);\n+}\n+#endif\n+\n+\tPMD_DRV_LOG(INFO, \"Link speed:%d\", link.link_speed);\n+}\n+\n+/*\n+ * It executes link_update after knowing an interrupt occurred.\n+ *\n+ * @param dev\n+ *  Pointer to struct rte_eth_dev.\n+ *\n+ * @return\n+ *  - On success, zero.\n+ *  - On failure, a negative value.\n+ */\n+static int\n+atl_dev_interrupt_action(struct rte_eth_dev *dev,\n+\t\t\t   struct rte_intr_handle *intr_handle)\n+{\n+\tstruct atl_interrupt *intr =\n+\t\tATL_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n+\n+\tif (intr->flags & ATL_FLAG_NEED_LINK_UPDATE) {\n+\t\tatl_dev_link_update(dev, 0);\n+\t\tintr->flags &= ~ATL_FLAG_NEED_LINK_UPDATE;\n+\t\tatl_dev_link_status_print(dev);\n+\t\t_rte_eth_dev_callback_process(dev,\n+\t\t\tRTE_ETH_EVENT_INTR_LSC, NULL);\n+\t}\n+\n+\tatl_enable_intr(dev);\n+\trte_intr_enable(intr_handle);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * Interrupt handler triggered by NIC  for handling\n+ * specific interrupt.\n+ *\n+ * @param handle\n+ *  Pointer to interrupt handle.\n+ * @param param\n+ *  The address of parameter (struct rte_eth_dev *) regsitered before.\n+ *\n+ * @return\n+ *  void\n+ */\n+static void\n+atl_dev_interrupt_handler(void *param)\n+{\n+\tstruct rte_eth_dev *dev = (struct rte_eth_dev *)param;\n+\n+\tatl_dev_interrupt_get_status(dev);\n+\tatl_dev_interrupt_action(dev, dev->intr_handle);\n+}\n+\n RTE_PMD_REGISTER_PCI(net_atlantic, rte_atl_pmd);\n RTE_PMD_REGISTER_PCI_TABLE(net_atlantic, pci_id_atl_map);\n RTE_PMD_REGISTER_KMOD_DEP(net_atlantic, \"* igb_uio | uio_pci_generic\");\ndiff --git a/drivers/net/atlantic/atl_ethdev.h b/drivers/net/atlantic/atl_ethdev.h\nindex cafe37cdf963..f75ed0fd1127 100644\n--- a/drivers/net/atlantic/atl_ethdev.h\n+++ b/drivers/net/atlantic/atl_ethdev.h\n@@ -15,6 +15,16 @@\n #define ATL_DEV_TO_ADAPTER(dev) \\\n \t((struct atl_adapter *)(dev)->data->dev_private)\n \n+#define ATL_DEV_PRIVATE_TO_INTR(adapter) \\\n+\t(&((struct atl_adapter *)adapter)->intr)\n+\n+#define ATL_FLAG_NEED_LINK_UPDATE (uint32_t)(1 << 0)\n+#define ATL_FLAG_NEED_LINK_CONFIG (uint32_t)(4 << 0)\n+\n+struct atl_interrupt {\n+\tuint32_t flags;\n+\tuint32_t mask;\n+};\n \n /*\n  * Structure to store private data for each driver instance (for each port).\n@@ -22,6 +32,7 @@\n struct atl_adapter {\n \tstruct aq_hw_s             hw;\n \tstruct aq_hw_cfg_s         hw_cfg;\n+\tstruct atl_interrupt       intr;\n };\n \n /*\n@@ -39,6 +50,11 @@ int atl_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,\n \t\tuint16_t nb_tx_desc, unsigned int socket_id,\n \t\tconst struct rte_eth_txconf *tx_conf);\n \n+int atl_dev_rx_queue_intr_enable(struct rte_eth_dev *eth_dev,\n+\t\t\t\t uint16_t queue_id);\n+int atl_dev_rx_queue_intr_disable(struct rte_eth_dev *eth_dev,\n+\t\t\t\t  uint16_t queue_id);\n+\n int atl_rx_init(struct rte_eth_dev *dev);\n int atl_tx_init(struct rte_eth_dev *dev);\n \ndiff --git a/drivers/net/atlantic/atl_rxtx.c b/drivers/net/atlantic/atl_rxtx.c\nindex 172d5fb232f2..9d82a0d74f22 100644\n--- a/drivers/net/atlantic/atl_rxtx.c\n+++ b/drivers/net/atlantic/atl_rxtx.c\n@@ -620,6 +620,42 @@ atl_stop_queues(struct rte_eth_dev *dev)\n \treturn 0;\n }\n \n+static int\n+atl_rx_enable_intr(struct rte_eth_dev *dev, uint16_t queue_id, bool enable)\n+{\n+\tstruct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tstruct atl_rx_queue *rxq;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tif (queue_id >= dev->data->nb_rx_queues) {\n+\t\tPMD_DRV_LOG(ERR, \"Invalid RX queue id=%d\", queue_id);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\trxq = dev->data->rx_queues[queue_id];\n+\n+\tif (rxq == NULL)\n+\t\treturn 0;\n+\n+\t/* Mapping interrupt vector */\n+\thw_atl_itr_irq_map_en_rx_set(hw, enable, queue_id);\n+\n+\treturn 0;\n+}\n+\n+int\n+atl_dev_rx_queue_intr_enable(struct rte_eth_dev *eth_dev, uint16_t queue_id)\n+{\n+\treturn atl_rx_enable_intr(eth_dev, queue_id, true);\n+}\n+\n+int\n+atl_dev_rx_queue_intr_disable(struct rte_eth_dev *eth_dev, uint16_t queue_id)\n+{\n+\treturn atl_rx_enable_intr(eth_dev, queue_id, false);\n+}\n+\n uint16_t\n atl_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,\n \t      uint16_t nb_pkts)\ndiff --git a/drivers/net/atlantic/atl_types.h b/drivers/net/atlantic/atl_types.h\nindex 85f768ce7d93..5f840cc8d63d 100644\n--- a/drivers/net/atlantic/atl_types.h\n+++ b/drivers/net/atlantic/atl_types.h\n@@ -93,11 +93,13 @@ struct aq_hw_s {\n \tvoid *mmio;\n \n \tstruct aq_hw_link_status_s aq_link_status;\n+\tbool is_autoneg;\n \n \tstruct hw_aq_atl_utils_mbox mbox;\n \tstruct hw_atl_stats_s last_stats;\n \tstruct aq_stats_s curr_stats;\n \n+\tu64 speed;\n \tunsigned int chip_features;\n \tu32 fw_ver_actual;\n \tu32 mbox_addr;\n",
    "prefixes": [
        "v3",
        "11/22"
    ]
}