get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 66698,
    "url": "http://patches.dpdk.org/api/patches/66698/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1584351224-23500-8-git-send-email-hkalra@marvell.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": "<1584351224-23500-8-git-send-email-hkalra@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1584351224-23500-8-git-send-email-hkalra@marvell.com",
    "date": "2020-03-16T09:33:43",
    "name": "[7/8] net/octeontx: add flow control support",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "555bb8fbf4bee310f6460473a4cf2c56a249a13c",
    "submitter": {
        "id": 1182,
        "url": "http://patches.dpdk.org/api/people/1182/?format=api",
        "name": "Harman Kalra",
        "email": "hkalra@marvell.com"
    },
    "delegate": {
        "id": 310,
        "url": "http://patches.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1584351224-23500-8-git-send-email-hkalra@marvell.com/mbox/",
    "series": [
        {
            "id": 8923,
            "url": "http://patches.dpdk.org/api/series/8923/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=8923",
            "date": "2020-03-16T09:33:36",
            "name": "add new features to octeontx PMD",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/8923/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/66698/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/66698/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 69AE9A0559;\n\tMon, 16 Mar 2020 10:36:01 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 746E41C0D4;\n\tMon, 16 Mar 2020 10:35:03 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 83F011C0B7\n for <dev@dpdk.org>; Mon, 16 Mar 2020 10:34:57 +0100 (CET)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id\n 02G9UM5p015013; Mon, 16 Mar 2020 02:34:57 -0700",
            "from sc-exch03.marvell.com ([199.233.58.183])\n by mx0b-0016f401.pphosted.com with ESMTP id 2yrxsme52k-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Mon, 16 Mar 2020 02:34:56 -0700",
            "from SC-EXCH03.marvell.com (10.93.176.83) by SC-EXCH03.marvell.com\n (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 16 Mar\n 2020 02:34:54 -0700",
            "from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.169)\n by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id\n 15.0.1497.2 via Frontend Transport; Mon, 16 Mar 2020 02:34:54 -0700",
            "from MN2PR18MB2848.namprd18.prod.outlook.com (2603:10b6:208:38::19)\n by MN2PR18MB3117.namprd18.prod.outlook.com (2603:10b6:208:162::16)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2814.14; Mon, 16 Mar\n 2020 09:34:50 +0000",
            "from MN2PR18MB2848.namprd18.prod.outlook.com\n ([fe80::f829:3e55:94f6:4efb]) by MN2PR18MB2848.namprd18.prod.outlook.com\n ([fe80::f829:3e55:94f6:4efb%5]) with mapi id 15.20.2814.021; Mon, 16 Mar 2020\n 09:34:50 +0000",
            "from hkarlara-OptiPlex-3046.marvell.com (115.113.156.2) by\n BMXPR01CA0006.INDPRD01.PROD.OUTLOOK.COM (2603:1096:b00:d::16) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id\n 15.20.2814.13 via Frontend Transport; Mon, 16 Mar 2020 09:34:42 +0000"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : content-type :\n mime-version; s=pfpt0818; bh=4Fcv5N7zfkBWXFdTLetPomLoImbyGJRGDHwKUpj+6k4=;\n b=Xji1uJnFPOBqXRToj9COflT+qAtB9oGXZm/F+K1+P6x5Tcr8c4HoExjq2ote+Rqsn7H3\n /Vi1nUNHN2Wefk8iabMq1PnIEecEbr5EXd8kAFCSVSK0eMVHppZHTQEfKWlo7RCeEmkv\n 7tY2/Of3qPG5x/XN8CLcBQQCBy0U//R5ULhwBkk2eGzFpmekuLFg+fXyhWOjW4uBWnk4\n 8j9UNPkXON0peMCLME4OKla/06TPEsaeZnfY4vRjBYCjdMwrLFk/MafoSXy31/EXhCI0\n c3q03bdaXA8/9aeTgQddAY3MRGV8jX1A1v2Arn8acSYLoo3tZ0KYFZgq7wSp93BBRgDZ MA==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=marvell.onmicrosoft.com; s=selector1-marvell-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=4Fcv5N7zfkBWXFdTLetPomLoImbyGJRGDHwKUpj+6k4=;\n b=g4AkzOUtB6cMnM069yc3CPMh+8OaehcznDg88zQwzjyyaMgIDLOz21F+shr2ge7+iXbjHYZsSn4RkKM6I5JEYsZs19EywP7cR+YAGQZlPu58KC66YuYQsCHtK82LNqcNlTAsV1MtH76dRH0pAF5OLeTu7Y/Or0x3uAVc4Uy6cag="
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=WN70HYf9cn8z/D0BmsoQckxR+lMuqo7QZtGTSbvshsllw2XW/1BbahBVyWN7FPrW7p1yrg9JMIshOU2aqwww2SIrPEKD8J6ee80rRHuDg7l7DrGFfnWjbzPW8op0I6ofku1PyygTDRDc5aZgzfutuFMnqOc571nKj6Hb4YSf8+lGdagtLtPMRQGWOqobiTGH2WZBpH1ntjXyHMwBvBaPhflYP9ELpVWDrlt8njXUigczpxRMlibxtEd7l7nKrcmabwMNa8EhyhgDdIoiW9ZUUOkJ+4QsUtlxMEnuPZ+kSyzJPpSqM9tIW0rsPkR+4HLAbWOCPDaCiQYZS3R8oslrVw==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=4Fcv5N7zfkBWXFdTLetPomLoImbyGJRGDHwKUpj+6k4=;\n b=KAroWTDn5NdzFdxRbkT36oW79MXw+q/uWzNcS0lyzgPj1HylGRBcRCwmyVYei0L86oTPNoFd483k9U8+FDbiP0FrJKCcuB1NBNeQP/LpA9twz5o8q+YSRUNixDTVjLe4LGQx/PLjIb5rl8DUzj/6ZRdq9LQ1A2gx/0Jmcca8zmwIPYWLRloPvPNK4G3DaXLrKxClqx9DbfBnOUenzxWeCnlEUysbVt7tilTJm93z0F8aGMRUhGLBEfT4PBNI2G79zeT44Xvj9tev0Qcf/CnIndj+GWy/ZCcL4YngNUaN6CjAu4ogiExYmJ03zjTd4fW6YLf/TnMyXvAZJtbEqbIc7A==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=marvell.com; dmarc=pass action=none header.from=marvell.com;\n dkim=pass header.d=marvell.com; arc=none",
        "From": "Harman Kalra <hkalra@marvell.com>",
        "To": "<jerinj@marvell.com>, <john.mcnamara@intel.com>,\n <marko.kovacevic@intel.com>",
        "CC": "<dev@dpdk.org>, <vattunuru@marvell.com>",
        "Date": "Mon, 16 Mar 2020 15:03:43 +0530",
        "Message-ID": "<1584351224-23500-8-git-send-email-hkalra@marvell.com>",
        "X-Mailer": [
            "git-send-email 2.7.4",
            "git-send-email 2.7.4"
        ],
        "In-Reply-To": "<1584351224-23500-1-git-send-email-hkalra@marvell.com>",
        "References": "<1584351224-23500-1-git-send-email-hkalra@marvell.com>",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BMXPR01CA0006.INDPRD01.PROD.OUTLOOK.COM\n (2603:1096:b00:d::16) To MN2PR18MB2848.namprd18.prod.outlook.com\n (2603:10b6:208:38::19)",
        "MIME-Version": "1.0",
        "X-MS-Exchange-MessageSentRepresentingType": "1",
        "X-Originating-IP": "[115.113.156.2]",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "abfcf5ad-ac55-4872-fce5-08d7c98d4275",
        "X-MS-TrafficTypeDiagnostic": "MN2PR18MB3117:",
        "X-MS-Exchange-Transport-Forked": "True",
        "X-Microsoft-Antispam-PRVS": "\n <MN2PR18MB311777E56F72E0051CFFBE6DC5F90@MN2PR18MB3117.namprd18.prod.outlook.com>",
        "X-MS-Oob-TLC-OOBClassifiers": "OLM:3826;",
        "X-Forefront-PRVS": "03449D5DD1",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n SFS:(10009020)(4636009)(366004)(136003)(376002)(39860400002)(346002)(396003)(199004)(52116002)(7696005)(478600001)(4326008)(8676002)(8936002)(107886003)(26005)(66556008)(30864003)(2906002)(86362001)(5660300002)(36756003)(55236004)(16526019)(2616005)(956004)(66946007)(6486002)(66476007)(81156014)(81166006)(186003)(316002);\n DIR:OUT; SFP:1101; SCL:1; SRVR:MN2PR18MB3117;\n H:MN2PR18MB2848.namprd18.prod.outlook.com; FPR:; SPF:None; LANG:en;\n PTR:InfoNoRecords; A:1;",
        "Received-SPF": "None (protection.outlook.com: marvell.com does not designate\n permitted sender hosts)",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n iVNbsynzroWVciQhzux24bdzp+INSDg3ZiRl372wrKQyHuxdfznJqGnT9fxaqGaQA+DH/Qqf0ka7fiCip/I9tYLGunKgeT60wiCYpMFqtY+yCcF+hNvkgUgd7gfaqDB8Cn2QHbRGwWcRQ4pedKSH/y0mHdy0vQW6H1gxCxqGe0zTtV7Zns2Tpg8E6Xb6dwG9Uns0cR63OB+Iy3Fmro41vvDsi3+I0+Le9xdbdEM20Wobb5r9Pp7oPxvvBabRbh+E2pS+XHAAlsNjw4oU7f31wZW9xNExUMykO2GuqLyvvmUaPDcD8zmETVwyECVUXJfJxXNDBM95Tad06jW6V+mMyNzrUJcp2yNdmp+UA7u7iZ+9pr3qwpSGQIzMwf6Pg16npqOvUGKEKjyOC9kjy09LTSVJlRe1daEmupUuobaCd16vbbxlgWLi83qZVGpr8Ol1",
        "X-MS-Exchange-AntiSpam-MessageData": "\n rEFjQ445fkXY1GsoJ33sy7UKayWpTsbzokIXZBGqgjbU/+A21PbjsqGul8gD7F845lzr44cUbBf/dT3RvD6YDjknOILe/bdwja8uq+y7ThWPhC0qv7swEq4fUtZ1zX61O8MNJLg3mXBbBcfP7AfxYA==",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n abfcf5ad-ac55-4872-fce5-08d7c98d4275",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "16 Mar 2020 09:34:44.0424 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "70e1fb47-1155-421d-87fc-2e58f638b6e0",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n 3FP7KP2ootXW7ggfgVgajOdvamOu3DyhcLvnu8DxA6Djqkt+5tfK7gmuE2YupM2MfCZA+AiAjR3q6sPCl2Cvqg==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MN2PR18MB3117",
        "X-OriginatorOrg": "marvell.com",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:6.0.138, 18.0.572\n definitions=2020-03-16_02:2020-03-12,\n 2020-03-16 signatures=0",
        "Subject": "[dpdk-dev] [PATCH 7/8] net/octeontx: add flow control support",
        "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 <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": "From: Vamsi Attunuru <vattunuru@marvell.com>\n\nPatch adds ethdev flow control set/get callback ops,\npmd enables modifying flow control attributes like\nrx_pause, tx_pause, high & low water mark.\n\nSigned-off-by: Vamsi Attunuru <vattunuru@marvell.com>\n---\n doc/guides/nics/features/octeontx.ini      |   1 +\n drivers/net/octeontx/base/octeontx_bgx.c   |  50 ++++++++\n drivers/net/octeontx/base/octeontx_bgx.h   |  28 +++++\n drivers/net/octeontx/octeontx_ethdev.c     |  20 ++++\n drivers/net/octeontx/octeontx_ethdev.h     |  19 +++\n drivers/net/octeontx/octeontx_ethdev_ops.c | 128 +++++++++++++++++++++\n 6 files changed, 246 insertions(+)",
    "diff": "diff --git a/doc/guides/nics/features/octeontx.ini b/doc/guides/nics/features/octeontx.ini\nindex 377bb4d30..6049c1c43 100644\n--- a/doc/guides/nics/features/octeontx.ini\n+++ b/doc/guides/nics/features/octeontx.ini\n@@ -18,6 +18,7 @@ VLAN filter          = Y\n VLAN offload         = P\n CRC offload          = Y\n Packet type parsing  = Y\n+Flow control         = Y\n Basic stats          = Y\n Linux VFIO           = Y\n ARMv8                = Y\ndiff --git a/drivers/net/octeontx/base/octeontx_bgx.c b/drivers/net/octeontx/base/octeontx_bgx.c\nindex d8611cb77..ac856ff86 100644\n--- a/drivers/net/octeontx/base/octeontx_bgx.c\n+++ b/drivers/net/octeontx/base/octeontx_bgx.c\n@@ -326,3 +326,53 @@ octeontx_bgx_port_mac_entries_get(int port)\n \n \treturn resp;\n }\n+\n+int octeontx_bgx_port_get_fifo_cfg(int port,\n+\t\t\t\t   octeontx_mbox_bgx_port_fifo_cfg_t *cfg)\n+{\n+\tint len = sizeof(octeontx_mbox_bgx_port_fifo_cfg_t);\n+\tocteontx_mbox_bgx_port_fifo_cfg_t conf;\n+\tstruct octeontx_mbox_hdr hdr;\n+\n+\thdr.coproc = OCTEONTX_BGX_COPROC;\n+\thdr.msg = MBOX_BGX_PORT_GET_FIFO_CFG;\n+\thdr.vfid = port;\n+\n+\tif (octeontx_mbox_send(&hdr, NULL, 0, &conf, len) < 0)\n+\t\treturn -EACCES;\n+\n+\tcfg->rx_fifosz = conf.rx_fifosz;\n+\n+\treturn 0;\n+}\n+\n+int octeontx_bgx_port_flow_ctrl_cfg(int port,\n+\t\t\t\t    octeontx_mbox_bgx_port_fc_cfg_t *cfg)\n+{\n+\tint len = sizeof(octeontx_mbox_bgx_port_fc_cfg_t);\n+\tocteontx_mbox_bgx_port_fc_cfg_t conf;\n+\tstruct octeontx_mbox_hdr hdr;\n+\n+\thdr.coproc = OCTEONTX_BGX_COPROC;\n+\thdr.msg = MBOX_BGX_PORT_FLOW_CTRL_CFG;\n+\thdr.vfid = port;\n+\n+\tif (cfg->fc_cfg == BGX_PORT_FC_CFG_SET)\n+\t\tmemcpy(&conf, cfg, len);\n+\telse\n+\t\tmemset(&conf, 0, len);\n+\n+\tif (octeontx_mbox_send(&hdr, &conf, len, &conf, len) < 0)\n+\t\treturn -EACCES;\n+\n+\tif (cfg->fc_cfg == BGX_PORT_FC_CFG_SET)\n+\t\tgoto done;\n+\n+\tcfg->rx_pause = conf.rx_pause;\n+\tcfg->tx_pause = conf.tx_pause;\n+\tcfg->low_water = conf.low_water;\n+\tcfg->high_water = conf.high_water;\n+\n+done:\n+\treturn 0;\n+}\ndiff --git a/drivers/net/octeontx/base/octeontx_bgx.h b/drivers/net/octeontx/base/octeontx_bgx.h\nindex 6b7476510..d126a0b7f 100644\n--- a/drivers/net/octeontx/base/octeontx_bgx.h\n+++ b/drivers/net/octeontx/base/octeontx_bgx.h\n@@ -11,6 +11,8 @@\n \n #include <octeontx_mbox.h>\n \n+#define OCTEONTX_BGX_RSVD_RX_FIFOBYTES\t0x40\n+\n #define OCTEONTX_BGX_COPROC\t        6\n \n /* BGX messages */\n@@ -32,6 +34,8 @@\n #define MBOX_BGX_PORT_ADD_MACADDR\t15\n #define MBOX_BGX_PORT_DEL_MACADDR\t16\n #define MBOX_BGX_PORT_GET_MACADDR_ENTRIES 17\n+#define MBOX_BGX_PORT_GET_FIFO_CFG\t18\n+#define MBOX_BGX_PORT_FLOW_CTRL_CFG\t19\n #define MBOX_BGX_PORT_SET_LINK_STATE\t20\n \n /* BGX port configuration parameters: */\n@@ -119,6 +123,26 @@ struct octeontx_mbox_bgx_port_mac_filter {\n \tint index;\n };\n \n+/* BGX port fifo config: */\n+typedef struct octeontx_mbox_bgx_port_fifo_cfg {\n+\tuint32_t rx_fifosz; /* in Bytes */\n+} octeontx_mbox_bgx_port_fifo_cfg_t;\n+\n+typedef enum {\n+\tBGX_PORT_FC_CFG_GET = 0,\n+\tBGX_PORT_FC_CFG_SET = 1\n+} bgx_port_fc_t;\n+\n+/* BGX port flow control config: */\n+typedef struct octeontx_mbox_bgx_port_fc_cfg {\n+\t/* BP on/off threshold levels in Bytes, must be a multiple of 16 */\n+\tuint16_t high_water;\n+\tuint16_t low_water;\n+\tuint8_t rx_pause; /* rx_pause = 1/0 to enable/disable fc on Tx */\n+\tuint8_t tx_pause; /* tx_pause = 1/0 to enable/disable fc on Rx */\n+\tbgx_port_fc_t fc_cfg;\n+} octeontx_mbox_bgx_port_fc_cfg_t;\n+\n int octeontx_bgx_port_open(int port, octeontx_mbox_bgx_port_conf_t *conf);\n int octeontx_bgx_port_close(int port);\n int octeontx_bgx_port_start(int port);\n@@ -135,6 +159,10 @@ int octeontx_bgx_port_mac_del(int port, uint32_t index);\n int octeontx_bgx_port_mac_entries_get(int port);\n int octeontx_bgx_port_mtu_set(int port, int mtu);\n int octeontx_bgx_port_set_link_state(int port, bool en);\n+int octeontx_bgx_port_get_fifo_cfg(int port,\n+\t\t\t\t   octeontx_mbox_bgx_port_fifo_cfg_t *cfg);\n+int octeontx_bgx_port_flow_ctrl_cfg(int port,\n+\t\t\t\t    octeontx_mbox_bgx_port_fc_cfg_t *cfg);\n \n #endif\t/* __OCTEONTX_BGX_H__ */\n \ndiff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c\nindex 08c621b4b..191869683 100644\n--- a/drivers/net/octeontx/octeontx_ethdev.c\n+++ b/drivers/net/octeontx/octeontx_ethdev.c\n@@ -122,6 +122,7 @@ static int\n octeontx_port_open(struct octeontx_nic *nic)\n {\n \tocteontx_mbox_bgx_port_conf_t bgx_port_conf;\n+\tocteontx_mbox_bgx_port_fifo_cfg_t fifo_cfg;\n \tint res;\n \n \tres = 0;\n@@ -147,6 +148,16 @@ octeontx_port_open(struct octeontx_nic *nic)\n \tnic->mcast_mode = bgx_port_conf.mcast_mode;\n \tnic->speed\t= bgx_port_conf.mode;\n \n+\tmemset(&fifo_cfg, 0x0, sizeof(fifo_cfg));\n+\n+\tres = octeontx_bgx_port_get_fifo_cfg(nic->port_id, &fifo_cfg);\n+\tif (res < 0) {\n+\t\tocteontx_log_err(\"failed to get port %d fifo cfg\", res);\n+\t\treturn res;\n+\t}\n+\n+\tnic->fc.rx_fifosz = fifo_cfg.rx_fifosz;\n+\n \tmemcpy(&nic->mac_addr[0], &bgx_port_conf.macaddr[0],\n \t\tRTE_ETHER_ADDR_LEN);\n \n@@ -482,6 +493,8 @@ octeontx_dev_close(struct rte_eth_dev *dev)\n \n \trte_event_dev_close(nic->evdev);\n \n+\tocteontx_dev_flow_ctrl_fini(dev);\n+\n \tocteontx_dev_vlan_offload_fini(dev);\n \n \tret = octeontx_pko_channel_close(nic->base_ochan);\n@@ -1208,6 +1221,7 @@ octeontx_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx,\n \tocteontx_recheck_rx_offloads(rxq);\n \tdev->data->rx_queues[qidx] = rxq;\n \tdev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;\n+\n \treturn 0;\n }\n \n@@ -1276,6 +1290,8 @@ static const struct eth_dev_ops octeontx_dev_ops = {\n \t.dev_supported_ptypes_get = octeontx_dev_supported_ptypes_get,\n \t.mtu_set                 = octeontx_dev_mtu_set,\n \t.pool_ops_supported      = octeontx_pool_ops,\n+\t.flow_ctrl_get           = octeontx_dev_flow_ctrl_get,\n+\t.flow_ctrl_set           = octeontx_dev_flow_ctrl_set,\n };\n \n /* Create Ethdev interface per BGX LMAC ports */\n@@ -1407,6 +1423,10 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev,\n \t/* Update same mac address to BGX CAM table at index 0 */\n \tocteontx_bgx_port_mac_add(nic->port_id, nic->mac_addr, 0);\n \n+\tres = octeontx_dev_flow_ctrl_init(eth_dev);\n+\tif (res < 0)\n+\t\tgoto err;\n+\n \tPMD_INIT_LOG(DEBUG, \"ethdev info: \");\n \tPMD_INIT_LOG(DEBUG, \"port %d, port_ena %d ochan %d num_ochan %d tx_q %d\",\n \t\t\t\tnic->port_id, nic->port_ena,\ndiff --git a/drivers/net/octeontx/octeontx_ethdev.h b/drivers/net/octeontx/octeontx_ethdev.h\nindex 186a044f7..dc53b53be 100644\n--- a/drivers/net/octeontx/octeontx_ethdev.h\n+++ b/drivers/net/octeontx/octeontx_ethdev.h\n@@ -83,6 +83,16 @@ struct octeontx_vlan_info {\n \tuint8_t filter_on;\n };\n \n+struct octeontx_fc_info {\n+\tenum rte_eth_fc_mode mode;  /**< Link flow control mode */\n+\tenum rte_eth_fc_mode def_mode;\n+\tuint16_t high_water;\n+\tuint16_t low_water;\n+\tuint16_t def_highmark;\n+\tuint16_t def_lowmark;\n+\tuint32_t rx_fifosz;\n+};\n+\n /* Octeontx ethdev nic */\n struct octeontx_nic {\n \tstruct rte_eth_dev *dev;\n@@ -122,6 +132,7 @@ struct octeontx_nic {\n \tuint16_t tx_offload_flags;\n \tstruct octeontx_vlan_info vlan_info;\n \tint print_flag;\n+\tstruct octeontx_fc_info fc;\n } __rte_cache_aligned;\n \n struct octeontx_txq {\n@@ -154,4 +165,12 @@ int octeontx_dev_vlan_filter_set(struct rte_eth_dev *dev,\n int octeontx_dev_set_link_up(struct rte_eth_dev *eth_dev);\n int octeontx_dev_set_link_down(struct rte_eth_dev *eth_dev);\n \n+/* Flow control */\n+int octeontx_dev_flow_ctrl_init(struct rte_eth_dev *dev);\n+int octeontx_dev_flow_ctrl_fini(struct rte_eth_dev *dev);\n+int octeontx_dev_flow_ctrl_get(struct rte_eth_dev *dev,\n+\t\t\t       struct rte_eth_fc_conf *fc_conf);\n+int octeontx_dev_flow_ctrl_set(struct rte_eth_dev *dev,\n+\t\t\t       struct rte_eth_fc_conf *fc_conf);\n+\n #endif /* __OCTEONTX_ETHDEV_H__ */\ndiff --git a/drivers/net/octeontx/octeontx_ethdev_ops.c b/drivers/net/octeontx/octeontx_ethdev_ops.c\nindex b5f0bfe8a..ff627a68e 100644\n--- a/drivers/net/octeontx/octeontx_ethdev_ops.c\n+++ b/drivers/net/octeontx/octeontx_ethdev_ops.c\n@@ -213,3 +213,131 @@ octeontx_dev_set_link_down(struct rte_eth_dev *eth_dev)\n \n \treturn octeontx_bgx_port_set_link_state(nic->port_id, false);\n }\n+\n+int\n+octeontx_dev_flow_ctrl_get(struct rte_eth_dev *dev,\n+\t\t\t   struct rte_eth_fc_conf *fc_conf)\n+{\n+\tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n+\tocteontx_mbox_bgx_port_fc_cfg_t conf;\n+\tint rc;\n+\n+\tmemset(&conf, 0, sizeof(octeontx_mbox_bgx_port_fc_cfg_t));\n+\n+\trc = octeontx_bgx_port_flow_ctrl_cfg(nic->port_id, &conf);\n+\tif (rc)\n+\t\treturn rc;\n+\n+\tif (conf.rx_pause && conf.tx_pause)\n+\t\tfc_conf->mode = RTE_FC_FULL;\n+\telse if (conf.rx_pause)\n+\t\tfc_conf->mode = RTE_FC_RX_PAUSE;\n+\telse if (conf.tx_pause)\n+\t\tfc_conf->mode = RTE_FC_TX_PAUSE;\n+\telse\n+\t\tfc_conf->mode = RTE_FC_NONE;\n+\n+\t/* low_water & high_water values are in Bytes */\n+\tfc_conf->low_water = conf.low_water;\n+\tfc_conf->high_water = conf.high_water;\n+\n+\treturn rc;\n+}\n+\n+int\n+octeontx_dev_flow_ctrl_set(struct rte_eth_dev *dev,\n+\t\t\t   struct rte_eth_fc_conf *fc_conf)\n+{\n+\tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n+\tstruct octeontx_fc_info *fc = &nic->fc;\n+\tocteontx_mbox_bgx_port_fc_cfg_t conf;\n+\tuint8_t tx_pause, rx_pause;\n+\tuint16_t max_high_water;\n+\tint rc;\n+\n+\tif (fc_conf->pause_time || fc_conf->mac_ctrl_frame_fwd ||\n+\t    fc_conf->autoneg) {\n+\t\tocteontx_log_err(\"Below flowctrl parameters are not supported \"\n+\t\t\t\t \"pause_time, mac_ctrl_frame_fwd and autoneg\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (fc_conf->high_water == fc->high_water &&\n+\t    fc_conf->low_water == fc->low_water &&\n+\t    fc_conf->mode == fc->mode)\n+\t\treturn 0;\n+\n+\tmax_high_water = fc->rx_fifosz - OCTEONTX_BGX_RSVD_RX_FIFOBYTES;\n+\n+\tif (fc_conf->high_water > max_high_water ||\n+\t    fc_conf->high_water < fc_conf->low_water) {\n+\t\tocteontx_log_err(\"Invalid high/low water values \"\n+\t\t\t\t \"High_water(in Bytes) must <= 0x%x \",\n+\t\t\t\t max_high_water);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (fc_conf->high_water % BIT(4) || fc_conf->low_water % BIT(4)) {\n+\t\tocteontx_log_err(\"High/low water value must be multiple of 16\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\trx_pause = (fc_conf->mode == RTE_FC_FULL) ||\n+\t\t\t(fc_conf->mode == RTE_FC_RX_PAUSE);\n+\ttx_pause = (fc_conf->mode == RTE_FC_FULL) ||\n+\t\t\t(fc_conf->mode == RTE_FC_TX_PAUSE);\n+\n+\tconf.high_water = fc_conf->high_water;\n+\tconf.low_water = fc_conf->low_water;\n+\tconf.fc_cfg = BGX_PORT_FC_CFG_SET;\n+\tconf.rx_pause = rx_pause;\n+\tconf.tx_pause = tx_pause;\n+\n+\trc = octeontx_bgx_port_flow_ctrl_cfg(nic->port_id, &conf);\n+\tif (rc)\n+\t\treturn rc;\n+\n+\tfc->high_water = fc_conf->high_water;\n+\tfc->low_water = fc_conf->low_water;\n+\tfc->mode = fc_conf->mode;\n+\n+\treturn rc;\n+}\n+\n+int\n+octeontx_dev_flow_ctrl_init(struct rte_eth_dev *dev)\n+{\n+\tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n+\tstruct octeontx_fc_info *fc = &nic->fc;\n+\tstruct rte_eth_fc_conf fc_conf;\n+\tint rc;\n+\n+\trc = octeontx_dev_flow_ctrl_get(dev, &fc_conf);\n+\tif (rc) {\n+\t\tocteontx_log_err(\"Failed to get flow control info\");\n+\t\treturn rc;\n+\t}\n+\n+\tfc->def_highmark = fc_conf.high_water;\n+\tfc->def_lowmark = fc_conf.low_water;\n+\tfc->def_mode = fc_conf.mode;\n+\n+\treturn rc;\n+}\n+\n+int\n+octeontx_dev_flow_ctrl_fini(struct rte_eth_dev *dev)\n+{\n+\tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n+\tstruct octeontx_fc_info *fc = &nic->fc;\n+\tstruct rte_eth_fc_conf fc_conf;\n+\n+\tmemset(&fc_conf, 0, sizeof(struct rte_eth_fc_conf));\n+\n+\t/* Restore flow control parameters with default values */\n+\tfc_conf.high_water = fc->def_highmark;\n+\tfc_conf.low_water = fc->def_lowmark;\n+\tfc_conf.mode = fc->def_mode;\n+\n+\treturn octeontx_dev_flow_ctrl_set(dev, &fc_conf);\n+}\n",
    "prefixes": [
        "7/8"
    ]
}