get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 66696,
    "url": "http://patches.dpdk.org/api/patches/66696/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1584351224-23500-6-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-6-git-send-email-hkalra@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1584351224-23500-6-git-send-email-hkalra@marvell.com",
    "date": "2020-03-16T09:33:41",
    "name": "[5/8] net/octeontx: add VLAN filter offload support",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "ac6daf7d566d3345664034db641ffa82a8acb8ee",
    "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-6-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/66696/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/66696/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 B6973A0559;\n\tMon, 16 Mar 2020 10:35:24 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 8D3DF1C0BE;\n\tMon, 16 Mar 2020 10:34:58 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 335B01C06D\n for <dev@dpdk.org>; Mon, 16 Mar 2020 10:34:55 +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 02G9UN1I015039; Mon, 16 Mar 2020 02:34:54 -0700",
            "from sc-exch02.marvell.com ([199.233.58.182])\n by mx0b-0016f401.pphosted.com with ESMTP id 2yrxsme52d-2\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Mon, 16 Mar 2020 02:34:54 -0700",
            "from SC-EXCH03.marvell.com (10.93.176.83) by SC-EXCH02.marvell.com\n (10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 16 Mar\n 2020 02:34:52 -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:52 -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:36 +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=V0HCLKT5hT9tTanNSE5re4VqfD7QNYu6ClOffaK5afE=;\n b=GPhCamNGFRihS+hKQhQwIYGff3P9z1OD8ivknLVgbN3h+xwB27S3H+yCEnok6EryX2vv\n gDaK8m6jdAVDovN/yQoxJmmp9TRIoJUN3iXFIML+nLAHQdBkHnOmLgfn4BBz9/KWhlyP\n WkOLIPNY3nHCM2HNGr5mZHUW8a1xvETFTlmIdvul7ecN9YgbaFqgJQNiLkh452DHc9kk\n 6tpJmfFQHTyPWsBl5mv34MlREDpB6o+hVNo6fWIEAVKs2psvkgyxkSsWXVLN4fXv+5+P\n wtyzMQ8Ntxat7egC94Ij/v+NG0yFdG3uwSfI4rSEFNWK90FZj0LxKGPl78RMIDMcKikY IQ==",
            "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=V0HCLKT5hT9tTanNSE5re4VqfD7QNYu6ClOffaK5afE=;\n b=O56DkY1Ny1/+An7oVdzG/eNzaAwhf8MMiVyvYn0yQhrd/efVg2czIF9wknsdV31u+c+820eujb37ISA0GbMy5a8UNhsMcfNawMiaDNOTXwWGDq3tI+dLlD4bXvnT56hc4TlGAHDqUveP6TjVslcJlP+rEfFo0SRUBRCRjpx7OCU="
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=FN/Mq4HFrvWPTz5sPykkOaJXzHTZ4epWLMxizOOirBw0Z5nxME2GHKZHI8cc+cD7w4rHl1EG8bsLnFO7uNjK6RmuUdCnuKD4uR4BZDKvDUSlIH0X8UXrzoEuhz9+qQa44ofnDY4i3eE0Is3OlLMaUgGGizOlj8gytuk2GjvmXIa4n2w3xfgcVbQ4NLCVORDkD1viO1o1lUShFmg6N1SR8m+/y6l0RSdnW0Xms/a4D9yalsrG4wRxh1B4Uu9vXGvD738kgc0Vz8I2pdJe0BguRvOGpZN/84M2JlZNBcoXnzMsIoScriJ/N9+MHKN8GdRFNRUuU4Dum+fE69XpdBHJKw==",
        "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=V0HCLKT5hT9tTanNSE5re4VqfD7QNYu6ClOffaK5afE=;\n b=amBqf6ZdpoR3S07ah04yc4J4l8O2C8cGbPOnsIGpw78ChNqwc7UZ7qaMaL2qXoiUuzGdmxpuRq3Ss8aP3t8Hqsq3kfbMI+DNiJIWQV/g/ZeeS/uk1AE7w+BX5TPTPuLpDavgmlIHTs91Dcmu0e/x2waGdMSs3HhUaFb2NM/RACh8RTNo9ot/1OauQh2cmrGmTpspuLvxGX+qyVRBZViaogkSSWTBE010SHlRgl3wa8HX/APAAg9VHzuJ7ncPlxe0o8HTt7AyRIefuitEc53YiNTSjirGxDK4pgkX4482NWZ7zeckkd1V0la5oFhZo/FXrjIxmHiqkfc8dDdFTSrdQQ==",
        "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:41 +0530",
        "Message-ID": "<1584351224-23500-6-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": "d36c4178-6c07-48ec-b7ef-08d7c98d3ecc",
        "X-MS-TrafficTypeDiagnostic": "MN2PR18MB3117:",
        "X-MS-Exchange-Transport-Forked": "True",
        "X-Microsoft-Antispam-PRVS": "\n <MN2PR18MB31171C7A77F50CE9F0078176C5F90@MN2PR18MB3117.namprd18.prod.outlook.com>",
        "X-MS-Oob-TLC-OOBClassifiers": "OLM:114;",
        "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)(6666004)(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 7d/2Nxz3/aY/86QRmxpaUFtHZt/wEI9YquP3VePLPmo0OytK2wtemyMGv10XG8lURWVNrwjaTVhSZjsNKdtKM8coiOm4Lo9Q5xtUlMffYVkek4YwpWX6zybKrf6JGhIrZ1NMsKELsdNXithLnC3CIsAOIB5WAbdcfWkzuOBKbBDaKrJBmrzHb8Z1f+n5o/BwFiIe/Wvm5EyeAprU5y0bW3Esq+8pHV3tj4kHU02jPkdU3voqQLed0/JQvlPIy93BaxxuYTNLse81u6E3OVj0eURKZZa20YnMmiobEOaV6MMd+/acTciuml+g9SJvb8AhzL2wesFoVcX8AAuj0Sc76rgQvUMFb10anzfvldDq67TnCjyb/wy/hlXjxsm8V6bzebxph/JmFHKNplj1A7nyFXbZvWfsv50qxdjXw1P+RUKb60r9/uSXmY2V1ONdhf1x",
        "X-MS-Exchange-AntiSpam-MessageData": "\n HfyEBKwDanqjtzjvszyS+t8nnXJ4s7rcJNeWyS13mPqm8NxhCOgqV123Fc7pPrdz7tWJlxdCnya1qXI/PN1sQGNe3/pQ7PM3J7agpVlbYc2+Exa5dvyM3lUVatfWvsxkM/FNL7zi0cG+eOyrq9LJNA==",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n d36c4178-6c07-48ec-b7ef-08d7c98d3ecc",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "16 Mar 2020 09:34:37.9029 (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 UorcgcAaEfY5VVoqlBvofYepUOi4xPJYbxrPHlSUmBq1ftx7pOTFKt2Qv+y0fTCAkTV2kYSF88mtHQzNiFhnvA==",
        "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 5/8] net/octeontx: add VLAN filter offload 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 support for vlan filter offload support.\nMBOX messages for vlan filter on/off and vlan filter\nentry add/rm are added to configure PCAM entries to\nfilter out the vlan traffic on a given port.\n\nPatch also defines rx_offload_flag for vlan filtering.\n\nSigned-off-by: Vamsi Attunuru <vattunuru@marvell.com>\n---\n doc/guides/nics/features/octeontx.ini      |   2 +\n doc/guides/nics/octeontx.rst               |   1 +\n drivers/net/octeontx/Makefile              |   1 +\n drivers/net/octeontx/base/octeontx_pkivf.c |  40 +++++\n drivers/net/octeontx/base/octeontx_pkivf.h |  20 +++\n drivers/net/octeontx/meson.build           |   3 +-\n drivers/net/octeontx/octeontx_ethdev.c     |  10 ++\n drivers/net/octeontx/octeontx_ethdev.h     |  24 ++-\n drivers/net/octeontx/octeontx_ethdev_ops.c | 184 +++++++++++++++++++++\n drivers/net/octeontx/octeontx_rxtx.h       |   1 +\n 10 files changed, 284 insertions(+), 2 deletions(-)\n create mode 100644 drivers/net/octeontx/octeontx_ethdev_ops.c",
    "diff": "diff --git a/doc/guides/nics/features/octeontx.ini b/doc/guides/nics/features/octeontx.ini\nindex e3ee79f0f..53c541f4b 100644\n--- a/doc/guides/nics/features/octeontx.ini\n+++ b/doc/guides/nics/features/octeontx.ini\n@@ -13,6 +13,8 @@ Jumbo frame          = Y\n Scattered Rx         = Y\n Promiscuous mode     = Y\n Unicast MAC filter   = Y\n+VLAN filter          = Y\n+VLAN offload         = P\n CRC offload          = Y\n Packet type parsing  = Y\n Basic stats          = Y\ndiff --git a/doc/guides/nics/octeontx.rst b/doc/guides/nics/octeontx.rst\nindex ddb626bc3..c8655bf37 100644\n--- a/doc/guides/nics/octeontx.rst\n+++ b/doc/guides/nics/octeontx.rst\n@@ -22,6 +22,7 @@ Features of the OCTEON TX Ethdev PMD are:\n - Jumbo frames\n - Scatter-Gather IO support\n - Link state information\n+- MAC/VLAN filtering\n - MTU update\n - SR-IOV VF\n - Multiple queues for TX\ndiff --git a/drivers/net/octeontx/Makefile b/drivers/net/octeontx/Makefile\nindex 8ddfc3089..694f403f1 100644\n--- a/drivers/net/octeontx/Makefile\n+++ b/drivers/net/octeontx/Makefile\n@@ -28,6 +28,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_OCTEONTX_PMD) += octeontx_pkovf.c\n SRCS-$(CONFIG_RTE_LIBRTE_OCTEONTX_PMD) += octeontx_pkivf.c\n SRCS-$(CONFIG_RTE_LIBRTE_OCTEONTX_PMD) += octeontx_bgx.c\n SRCS-$(CONFIG_RTE_LIBRTE_OCTEONTX_PMD) += octeontx_ethdev.c\n+SRCS-$(CONFIG_RTE_LIBRTE_OCTEONTX_PMD) += octeontx_ethdev_ops.c\n \n ifeq ($(CONFIG_RTE_TOOLCHAIN_GCC),y)\n CFLAGS_octeontx_rxtx.o += -fno-prefetch-loop-arrays\ndiff --git a/drivers/net/octeontx/base/octeontx_pkivf.c b/drivers/net/octeontx/base/octeontx_pkivf.c\nindex 8ce041955..0ddff5488 100644\n--- a/drivers/net/octeontx/base/octeontx_pkivf.c\n+++ b/drivers/net/octeontx/base/octeontx_pkivf.c\n@@ -136,6 +136,46 @@ octeontx_pki_port_errchk_config(int port, pki_errchk_cfg_t *cfg)\n \treturn res;\n }\n \n+int\n+octeontx_pki_port_vlan_fltr_config(int port,\n+\t\t\t\t   pki_port_vlan_filter_config_t *fltr_cfg)\n+{\n+\tstruct octeontx_mbox_hdr hdr;\n+\tint res;\n+\n+\tpki_port_vlan_filter_config_t cfg = *fltr_cfg;\n+\tint len = sizeof(pki_port_vlan_filter_config_t);\n+\n+\thdr.coproc = OCTEONTX_PKI_COPROC;\n+\thdr.msg = MBOX_PKI_PORT_VLAN_FILTER_CONFIG;\n+\thdr.vfid = port;\n+\n+\tres = octeontx_mbox_send(&hdr, &cfg, len, NULL, 0);\n+\tif (res < 0)\n+\t\treturn -EACCES;\n+\treturn res;\n+}\n+\n+int\n+octeontx_pki_port_vlan_fltr_entry_config(int port,\n+\t\t\t\t   pki_port_vlan_filter_entry_config_t *e_cfg)\n+{\n+\tstruct octeontx_mbox_hdr hdr;\n+\tint res;\n+\n+\tpki_port_vlan_filter_entry_config_t cfg = *e_cfg;\n+\tint len = sizeof(pki_port_vlan_filter_entry_config_t);\n+\n+\thdr.coproc = OCTEONTX_PKI_COPROC;\n+\thdr.msg = MBOX_PKI_PORT_VLAN_FILTER_ENTRY_CONFIG;\n+\thdr.vfid = port;\n+\n+\tres = octeontx_mbox_send(&hdr, &cfg, len, NULL, 0);\n+\tif (res < 0)\n+\t\treturn -EACCES;\n+\treturn res;\n+}\n+\n #define PCI_VENDOR_ID_CAVIUM               0x177D\n #define PCI_DEVICE_ID_OCTEONTX_PKI_VF      0xA0DD\n \ndiff --git a/drivers/net/octeontx/base/octeontx_pkivf.h b/drivers/net/octeontx/base/octeontx_pkivf.h\nindex d541dc3bd..d41eaa57e 100644\n--- a/drivers/net/octeontx/base/octeontx_pkivf.h\n+++ b/drivers/net/octeontx/base/octeontx_pkivf.h\n@@ -36,6 +36,8 @@\n #define MBOX_PKI_PORT_ALLOC_QPG\t\t\t21\n #define MBOX_PKI_PORT_FREE_QPG\t\t\t22\n #define MBOX_PKI_SET_PORT_CONFIG\t\t23\n+#define MBOX_PKI_PORT_VLAN_FILTER_CONFIG\t24\n+#define MBOX_PKI_PORT_VLAN_FILTER_ENTRY_CONFIG\t25\n \n #define MBOX_PKI_MAX_QOS_ENTRY 64\n \n@@ -236,6 +238,20 @@ typedef struct pki_port_modify_qos_entry {\n \tstruct pki_qos_entry qos_entry;\n } pki_mod_qos_t;\n \n+/* pki port VLAN filter config */\n+typedef struct pki_port_vlan_filter_config {\n+\tuint8_t port_type;  /* OCTTX_PORT_TYPE_[NET/INT/PCI] */\n+\tuint8_t fltr_conf; /* '1' to enable & '0' to disable */\n+} pki_port_vlan_filter_config_t;\n+\n+/* pki port VLAN filter entry config */\n+typedef struct pki_port_vlan_filter_entry_config {\n+\tuint8_t port_type;  /* OCTTX_PORT_TYPE_[NET/INT/PCI] */\n+\tuint8_t entry_conf; /* '1' to add & '0' to remove */\n+\tuint16_t vlan_tpid; /* in host byte-order */\n+\tuint16_t vlan_id;   /* in host byte-order */\n+} pki_port_vlan_filter_entry_config_t;\n+\n static inline int\n octeontx_pki_port_modify_qos(int port, pki_mod_qos_t *qos_cfg)\n {\n@@ -348,5 +364,9 @@ int octeontx_pki_port_pktbuf_config(int port, pki_pktbuf_cfg_t *buf_cfg);\n int octeontx_pki_port_create_qos(int port, pki_qos_cfg_t *qos_cfg);\n int octeontx_pki_port_close(int port);\n int octeontx_pki_port_errchk_config(int port, pki_errchk_cfg_t *cfg);\n+int octeontx_pki_port_vlan_fltr_config(int port,\n+\t\t\t\tpki_port_vlan_filter_config_t *fltr_cfg);\n+int octeontx_pki_port_vlan_fltr_entry_config(int port,\n+\t\t\t\tpki_port_vlan_filter_entry_config_t *entry_cfg);\n \n #endif /* __OCTEONTX_PKI_H__ */\ndiff --git a/drivers/net/octeontx/meson.build b/drivers/net/octeontx/meson.build\nindex 0e249eb98..f7ba6e68b 100644\n--- a/drivers/net/octeontx/meson.build\n+++ b/drivers/net/octeontx/meson.build\n@@ -5,7 +5,8 @@ subdir('base')\n objs = [base_objs]\n \n sources = files('octeontx_rxtx.c',\n-\t\t'octeontx_ethdev.c'\n+\t\t'octeontx_ethdev.c',\n+\t\t'octeontx_ethdev_ops.c'\n \t\t)\n \n allow_experimental_apis = true\ndiff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c\nindex 91b9ea645..5dd40bc04 100644\n--- a/drivers/net/octeontx/octeontx_ethdev.c\n+++ b/drivers/net/octeontx/octeontx_ethdev.c\n@@ -360,6 +360,12 @@ octeontx_dev_configure(struct rte_eth_dev *dev)\n \t\treturn -EFAULT;\n \t}\n \n+\tret = octeontx_dev_vlan_offload_init(dev);\n+\tif (ret) {\n+\t\tocteontx_log_err(\"failed to initialize vlan offload\");\n+\t\treturn -EFAULT;\n+\t}\n+\n \tnic->pki.classifier_enable = false;\n \tnic->pki.hash_enable = true;\n \tnic->pki.initialized = false;\n@@ -384,6 +390,8 @@ octeontx_dev_close(struct rte_eth_dev *dev)\n \n \trte_event_dev_close(nic->evdev);\n \n+\tocteontx_dev_vlan_offload_fini(dev);\n+\n \tret = octeontx_pko_channel_close(nic->base_ochan);\n \tif (ret < 0) {\n \t\tocteontx_log_err(\"failed to close channel %d VF%d %d %d\",\n@@ -1185,6 +1193,8 @@ static const struct eth_dev_ops octeontx_dev_ops = {\n \t.mac_addr_remove\t = octeontx_dev_mac_addr_del,\n \t.mac_addr_add\t\t = octeontx_dev_mac_addr_add,\n \t.mac_addr_set\t\t = octeontx_dev_default_mac_addr_set,\n+\t.vlan_offload_set\t = octeontx_dev_vlan_offload_set,\n+\t.vlan_filter_set\t = octeontx_dev_vlan_filter_set,\n \t.tx_queue_start\t\t = octeontx_dev_tx_queue_start,\n \t.tx_queue_stop\t\t = octeontx_dev_tx_queue_stop,\n \t.tx_queue_setup\t\t = octeontx_dev_tx_queue_setup,\ndiff --git a/drivers/net/octeontx/octeontx_ethdev.h b/drivers/net/octeontx/octeontx_ethdev.h\nindex 27f6556dd..e7e0d40c7 100644\n--- a/drivers/net/octeontx/octeontx_ethdev.h\n+++ b/drivers/net/octeontx/octeontx_ethdev.h\n@@ -55,7 +55,8 @@\n \n #define OCTEONTX_RX_OFFLOADS\t\t(DEV_RX_OFFLOAD_CHECKSUM     | \\\n \t\t\t\t\t DEV_RX_OFFLOAD_SCATTER\t     | \\\n-\t\t\t\t\t DEV_RX_OFFLOAD_JUMBO_FRAME)\n+\t\t\t\t\t DEV_RX_OFFLOAD_JUMBO_FRAME  | \\\n+\t\t\t\t\t DEV_RX_OFFLOAD_VLAN_FILTER)\n \n #define OCTEONTX_TX_OFFLOADS\t\t(DEV_TX_OFFLOAD_MT_LOCKFREE    |  \\\n \t\t\t\t\t DEV_TX_OFFLOAD_MBUF_FAST_FREE |  \\\n@@ -70,6 +71,18 @@ octeontx_pmd_priv(struct rte_eth_dev *dev)\n extern uint16_t\n rte_octeontx_pchan_map[OCTEONTX_MAX_BGX_PORTS][OCTEONTX_MAX_LMAC_PER_BGX];\n \n+struct vlan_entry {\n+\tTAILQ_ENTRY(vlan_entry) next;\n+\tuint16_t vlan_id;\n+};\n+\n+TAILQ_HEAD(octeontx_vlan_filter_tbl, vlan_entry);\n+\n+struct octeontx_vlan_info {\n+\tstruct octeontx_vlan_filter_tbl fltr_tbl;\n+\tuint8_t filter_on;\n+};\n+\n /* Octeontx ethdev nic */\n struct octeontx_nic {\n \tstruct rte_eth_dev *dev;\n@@ -107,6 +120,7 @@ struct octeontx_nic {\n \tuint16_t rx_offload_flags;\n \tuint64_t tx_offloads;\n \tuint16_t tx_offload_flags;\n+\tstruct octeontx_vlan_info vlan_info;\n } __rte_cache_aligned;\n \n struct octeontx_txq {\n@@ -127,4 +141,12 @@ struct octeontx_rxq {\n \n void\n octeontx_set_tx_function(struct rte_eth_dev *dev);\n+\n+/* VLAN */\n+int octeontx_dev_vlan_offload_init(struct rte_eth_dev *dev);\n+int octeontx_dev_vlan_offload_fini(struct rte_eth_dev *eth_dev);\n+int octeontx_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+int octeontx_dev_vlan_filter_set(struct rte_eth_dev *dev,\n+\t\t\t\t uint16_t vlan_id, int on);\n+\n #endif /* __OCTEONTX_ETHDEV_H__ */\ndiff --git a/drivers/net/octeontx/octeontx_ethdev_ops.c b/drivers/net/octeontx/octeontx_ethdev_ops.c\nnew file mode 100644\nindex 000000000..8c3065542\n--- /dev/null\n+++ b/drivers/net/octeontx/octeontx_ethdev_ops.c\n@@ -0,0 +1,184 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(C) 2020 Marvell International Ltd.\n+ */\n+\n+#include <rte_malloc.h>\n+\n+#include \"octeontx_ethdev.h\"\n+#include \"octeontx_logs.h\"\n+#include \"octeontx_rxtx.h\"\n+\n+static int\n+octeontx_vlan_hw_filter(struct octeontx_nic *nic, uint8_t flag)\n+{\n+\tstruct octeontx_vlan_info *vlan = &nic->vlan_info;\n+\tpki_port_vlan_filter_config_t fltr_conf;\n+\tint rc = 0;\n+\n+\tif (vlan->filter_on == flag)\n+\t\treturn rc;\n+\n+\tfltr_conf.port_type = OCTTX_PORT_TYPE_NET;\n+\tfltr_conf.fltr_conf = flag;\n+\n+\trc = octeontx_pki_port_vlan_fltr_config(nic->port_id, &fltr_conf);\n+\tif (rc != 0) {\n+\t\tocteontx_log_err(\"Fail to configure vlan hw filter for port %d\",\n+\t\t\t\t nic->port_id);\n+\t\tgoto done;\n+\t}\n+\n+\tvlan->filter_on = flag;\n+\n+done:\n+\treturn rc;\n+}\n+\n+int\n+octeontx_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n+{\n+\tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n+\tstruct rte_eth_rxmode *rxmode;\n+\tint rc = 0;\n+\n+\trxmode = &dev->data->dev_conf.rxmode;\n+\n+\tif (mask & ETH_VLAN_EXTEND_MASK) {\n+\t\tocteontx_log_err(\"Extend offload not supported\");\n+\t\treturn -ENOTSUP;\n+\t}\n+\n+\tif (mask & ETH_VLAN_STRIP_MASK) {\n+\t\tocteontx_log_err(\"VLAN strip offload not supported\");\n+\t\treturn -ENOTSUP;\n+\t}\n+\n+\tif (mask & ETH_VLAN_FILTER_MASK) {\n+\t\tif (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER) {\n+\t\t\trc = octeontx_vlan_hw_filter(nic, true);\n+\t\t\tif (rc)\n+\t\t\t\tgoto done;\n+\n+\t\t\tnic->rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;\n+\t\t\tnic->rx_offload_flags |= OCCTX_RX_VLAN_FLTR_F;\n+\t\t} else {\n+\t\t\trc = octeontx_vlan_hw_filter(nic, false);\n+\t\t\tif (rc)\n+\t\t\t\tgoto done;\n+\n+\t\t\tnic->rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;\n+\t\t\tnic->rx_offload_flags &= ~OCCTX_RX_VLAN_FLTR_F;\n+\t\t}\n+\t}\n+\n+done:\n+\treturn rc;\n+}\n+\n+int\n+octeontx_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)\n+{\n+\tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n+\tstruct octeontx_vlan_info *vlan = &nic->vlan_info;\n+\tpki_port_vlan_filter_entry_config_t fltr_entry;\n+\tstruct vlan_entry *entry = NULL;\n+\tint entry_count = 0;\n+\tint rc = -EINVAL;\n+\n+\tif (on) {\n+\t\tTAILQ_FOREACH(entry, &vlan->fltr_tbl, next)\n+\t\t\tif (entry->vlan_id == vlan_id) {\n+\t\t\t\tocteontx_log_dbg(\"Vlan Id is already set\");\n+\t\t\t\treturn 0;\n+\t\t\t}\n+\t} else {\n+\t\tTAILQ_FOREACH(entry, &vlan->fltr_tbl, next)\n+\t\t\tentry_count++;\n+\n+\t\tif (!entry_count)\n+\t\t\treturn 0;\n+\t}\n+\n+\tfltr_entry.port_type = OCTTX_PORT_TYPE_NET;\n+\tfltr_entry.vlan_tpid = RTE_ETHER_TYPE_VLAN;\n+\tfltr_entry.vlan_id = vlan_id;\n+\tfltr_entry.entry_conf = on;\n+\n+\tif (on) {\n+\t\tentry = rte_zmalloc(\"octeontx_nic_vlan_entry\",\n+\t\t\t\t    sizeof(struct vlan_entry), 0);\n+\t\tif (!entry) {\n+\t\t\tocteontx_log_err(\"Failed to allocate memory\");\n+\t\t\treturn -ENOMEM;\n+\t\t}\n+\t}\n+\n+\trc = octeontx_pki_port_vlan_fltr_entry_config(nic->port_id,\n+\t\t\t\t\t\t      &fltr_entry);\n+\tif (rc != 0) {\n+\t\tocteontx_log_err(\"Fail to configure vlan filter entry \"\n+\t\t\t\t \"for port %d\", nic->port_id);\n+\t\tif (entry)\n+\t\t\trte_free(entry);\n+\n+\t\tgoto done;\n+\t}\n+\n+\tif (on) {\n+\t\tentry->vlan_id  = vlan_id;\n+\t\tTAILQ_INSERT_HEAD(&vlan->fltr_tbl, entry, next);\n+\t} else {\n+\t\tTAILQ_FOREACH(entry, &vlan->fltr_tbl, next) {\n+\t\t\tif (entry->vlan_id == vlan_id) {\n+\t\t\t\tTAILQ_REMOVE(&vlan->fltr_tbl, entry, next);\n+\t\t\t\trte_free(entry);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+done:\n+\treturn rc;\n+}\n+\n+int\n+octeontx_dev_vlan_offload_init(struct rte_eth_dev *dev)\n+{\n+\tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n+\tint rc;\n+\n+\tTAILQ_INIT(&nic->vlan_info.fltr_tbl);\n+\n+\trc = octeontx_dev_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);\n+\tif (rc)\n+\t\tocteontx_log_err(\"Failed to set vlan offload rc=%d\", rc);\n+\n+\treturn rc;\n+}\n+\n+int\n+octeontx_dev_vlan_offload_fini(struct rte_eth_dev *dev)\n+{\n+\tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n+\tstruct octeontx_vlan_info *vlan = &nic->vlan_info;\n+\tpki_port_vlan_filter_entry_config_t fltr_entry;\n+\tstruct vlan_entry *entry;\n+\tint rc = 0;\n+\n+\tTAILQ_FOREACH(entry, &vlan->fltr_tbl, next) {\n+\t\tfltr_entry.port_type = OCTTX_PORT_TYPE_NET;\n+\t\tfltr_entry.vlan_tpid = RTE_ETHER_TYPE_VLAN;\n+\t\tfltr_entry.vlan_id = entry->vlan_id;\n+\t\tfltr_entry.entry_conf = 0;\n+\n+\t\trc = octeontx_pki_port_vlan_fltr_entry_config(nic->port_id,\n+\t\t\t\t\t\t\t      &fltr_entry);\n+\t\tif (rc != 0) {\n+\t\t\tocteontx_log_err(\"Fail to configure vlan filter entry \"\n+\t\t\t\t\t \"for port %d\", nic->port_id);\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\treturn rc;\n+}\ndiff --git a/drivers/net/octeontx/octeontx_rxtx.h b/drivers/net/octeontx/octeontx_rxtx.h\nindex 2383a8eb6..cc044dd79 100644\n--- a/drivers/net/octeontx/octeontx_rxtx.h\n+++ b/drivers/net/octeontx/octeontx_rxtx.h\n@@ -19,6 +19,7 @@\n \n #define OCCTX_RX_OFFLOAD_NONE\t\t(0)\n #define OCCTX_RX_OFFLOAD_RSS_F          BIT(0)\n+#define OCCTX_RX_VLAN_FLTR_F            BIT(1)\n #define OCCTX_RX_MULTI_SEG_F\t\tBIT(15)\n \n #define OCCTX_TX_OFFLOAD_NONE\t\t(0)\n",
    "prefixes": [
        "5/8"
    ]
}