get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 18450,
    "url": "https://patches.dpdk.org/api/patches/18450/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1482454091-12819-2-git-send-email-harish.patil@qlogic.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": "<1482454091-12819-2-git-send-email-harish.patil@qlogic.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1482454091-12819-2-git-send-email-harish.patil@qlogic.com",
    "date": "2016-12-23T00:48:06",
    "name": "[dpdk-dev,v2,2/7] net/qede: fix filtering code",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "035dd343680f6240dad0cdab936d44cd6751fb79",
    "submitter": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/people/319/?format=api",
        "name": "Harish Patil",
        "email": "harish.patil@qlogic.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1482454091-12819-2-git-send-email-harish.patil@qlogic.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/18450/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/18450/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 [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 5605910DC9;\n\tFri, 23 Dec 2016 01:49:40 +0100 (CET)",
            "from mx0b-0016ce01.pphosted.com (mx0a-0016ce01.pphosted.com\n\t[67.231.148.157]) by dpdk.org (Postfix) with ESMTP id 7A63C10DBF;\n\tFri, 23 Dec 2016 01:49:00 +0100 (CET)",
            "from pps.filterd (m0095336.ppops.net [127.0.0.1])\n\tby mx0a-0016ce01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id\n\tuBN0jJ3m014118; Thu, 22 Dec 2016 16:48:57 -0800",
            "from avcashub1.qlogic.com ([198.186.0.116])\n\tby mx0a-0016ce01.pphosted.com with ESMTP id 27gs6480xp-1\n\t(version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT);\n\tThu, 22 Dec 2016 16:48:57 -0800",
            "from avluser01.qlc.com (10.1.113.203) by qlc.com (10.1.4.191) with\n\tMicrosoft SMTP Server id 14.3.235.1;\n\tThu, 22 Dec 2016 16:48:56 -0800",
            "(from hpatil@localhost)\tby avluser01.qlc.com (8.14.4/8.14.4/Submit)\n\tid uBN0mukG012926;\tThu, 22 Dec 2016 16:48:56 -0800"
        ],
        "From": "Harish Patil <harish.patil@qlogic.com>",
        "To": "<ferruh.yigit@intel.com>",
        "CC": "Harish Patil <harish.patil@qlogic.com>, <dev@dpdk.org>, <stable@dpdk.org>,\n\t<Dept-EngDPDKDev@cavium.com>",
        "Date": "Thu, 22 Dec 2016 16:48:06 -0800",
        "Message-ID": "<1482454091-12819-2-git-send-email-harish.patil@qlogic.com>",
        "X-Mailer": "git-send-email 1.7.10.3",
        "In-Reply-To": "<91ac9846-530c-2dd3-4bd6-2c3b9143405b@intel.com>",
        "References": "<91ac9846-530c-2dd3-4bd6-2c3b9143405b@intel.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "disclaimer": "bypass",
        "X-Proofpoint-Virus-Version": "vendor=nai engine=5800 definitions=8387\n\tsignatures=670789",
        "X-Proofpoint-Spam-Details": "rule=notspam policy=default score=0\n\tpriorityscore=1501 malwarescore=0\n\tsuspectscore=3 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011\n\tlowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam\n\tadjust=0\n\treason=mlx scancount=1 engine=8.0.1-1612050000\n\tdefinitions=main-1612230012",
        "Subject": "[dpdk-dev] [PATCH v2 2/7] net/qede: fix filtering code",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "In qede_mac_addr_add() a check is added to differentiate between\nunicast/multicast mac to prevent a multicast mac from being wrongly added\nto unicast filter table. Secondly, two separate lists will be used to keep\ntrack of unicast/multicast mac filters to prevent duplicate filter\nprogramming. The other change is to remove filter_config from struct\nqed_eth_ops_pass and invoke the base APIs directly. This avoids the need\nto have multiple structs and function calls.\n\nFixes: 2ea6f76aff40 (\"qede: add core driver\")\n\nSigned-off-by: Harish Patil <harish.patil@qlogic.com>\n---\n drivers/net/qede/qede_eth_if.c |  101 +-------------\n drivers/net/qede/qede_eth_if.h |   36 +----\n drivers/net/qede/qede_ethdev.c |  303 ++++++++++++++++++++++++++++------------\n drivers/net/qede/qede_ethdev.h |   15 ++\n 4 files changed, 230 insertions(+), 225 deletions(-)",
    "diff": "diff --git a/drivers/net/qede/qede_eth_if.c b/drivers/net/qede/qede_eth_if.c\nindex 1ae6127..30fded0 100644\n--- a/drivers/net/qede/qede_eth_if.c\n+++ b/drivers/net/qede/qede_eth_if.c\n@@ -310,86 +310,11 @@ qed_get_vport_stats(struct ecore_dev *edev, struct ecore_eth_stats *stats)\n \tecore_get_vport_stats(edev, stats);\n }\n \n-static int\n-qed_configure_filter_ucast(struct ecore_dev *edev,\n-\t\t\t   struct qed_filter_ucast_params *params)\n-{\n-\tstruct ecore_filter_ucast ucast;\n-\n-\tif (!params->vlan_valid && !params->mac_valid) {\n-\t\tDP_NOTICE(edev, true,\n-\t\t\t  \"Tried configuring a unicast filter,\"\n-\t\t\t  \"but both MAC and VLAN are not set\\n\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tmemset(&ucast, 0, sizeof(ucast));\n-\tswitch (params->type) {\n-\tcase QED_FILTER_XCAST_TYPE_ADD:\n-\t\tucast.opcode = ECORE_FILTER_ADD;\n-\t\tbreak;\n-\tcase QED_FILTER_XCAST_TYPE_DEL:\n-\t\tucast.opcode = ECORE_FILTER_REMOVE;\n-\t\tbreak;\n-\tcase QED_FILTER_XCAST_TYPE_REPLACE:\n-\t\tucast.opcode = ECORE_FILTER_REPLACE;\n-\t\tbreak;\n-\tdefault:\n-\t\tDP_NOTICE(edev, true, \"Unknown unicast filter type %d\\n\",\n-\t\t\t  params->type);\n-\t}\n-\n-\tif (params->vlan_valid && params->mac_valid) {\n-\t\tucast.type = ECORE_FILTER_MAC_VLAN;\n-\t\tether_addr_copy((struct ether_addr *)&params->mac,\n-\t\t\t\t(struct ether_addr *)&ucast.mac);\n-\t\tucast.vlan = params->vlan;\n-\t} else if (params->mac_valid) {\n-\t\tucast.type = ECORE_FILTER_MAC;\n-\t\tether_addr_copy((struct ether_addr *)&params->mac,\n-\t\t\t\t(struct ether_addr *)&ucast.mac);\n-\t} else {\n-\t\tucast.type = ECORE_FILTER_VLAN;\n-\t\tucast.vlan = params->vlan;\n-\t}\n-\n-\tucast.is_rx_filter = true;\n-\tucast.is_tx_filter = true;\n-\n-\treturn ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, NULL);\n-}\n-\n-static int\n-qed_configure_filter_mcast(struct ecore_dev *edev,\n-\t\t\t   struct qed_filter_mcast_params *params)\n-{\n-\tstruct ecore_filter_mcast mcast;\n-\tint i;\n-\n-\tmemset(&mcast, 0, sizeof(mcast));\n-\tswitch (params->type) {\n-\tcase QED_FILTER_XCAST_TYPE_ADD:\n-\t\tmcast.opcode = ECORE_FILTER_ADD;\n-\t\tbreak;\n-\tcase QED_FILTER_XCAST_TYPE_DEL:\n-\t\tmcast.opcode = ECORE_FILTER_REMOVE;\n-\t\tbreak;\n-\tdefault:\n-\t\tDP_NOTICE(edev, true, \"Unknown multicast filter type %d\\n\",\n-\t\t\t  params->type);\n-\t}\n-\n-\tmcast.num_mc_addrs = params->num;\n-\tfor (i = 0; i < mcast.num_mc_addrs; i++)\n-\t\tether_addr_copy((struct ether_addr *)&params->mac[i],\n-\t\t\t\t(struct ether_addr *)&mcast.mac[i]);\n-\n-\treturn ecore_filter_mcast_cmd(edev, &mcast, ECORE_SPQ_MODE_CB, NULL);\n-}\n-\n-int qed_configure_filter_rx_mode(struct ecore_dev *edev,\n+int qed_configure_filter_rx_mode(struct rte_eth_dev *eth_dev,\n \t\t\t\t enum qed_filter_rx_mode_type type)\n {\n+\tstruct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);\n+\tstruct ecore_dev *edev = QEDE_INIT_EDEV(qdev);\n \tstruct ecore_filter_accept_flags flags;\n \n \tmemset(&flags, 0, sizeof(flags));\n@@ -422,25 +347,6 @@ int qed_configure_filter_rx_mode(struct ecore_dev *edev,\n \t\t\t\t       ECORE_SPQ_MODE_CB, NULL);\n }\n \n-static int\n-qed_configure_filter(struct ecore_dev *edev, struct qed_filter_params *params)\n-{\n-\tswitch (params->type) {\n-\tcase QED_FILTER_TYPE_UCAST:\n-\t\treturn qed_configure_filter_ucast(edev, &params->filter.ucast);\n-\tcase QED_FILTER_TYPE_MCAST:\n-\t\treturn qed_configure_filter_mcast(edev, &params->filter.mcast);\n-\tcase QED_FILTER_TYPE_RX_MODE:\n-\t\treturn qed_configure_filter_rx_mode(edev,\n-\t\t\t\t\t\t    params->filter.\n-\t\t\t\t\t\t    accept_flags);\n-\tdefault:\n-\t\tDP_NOTICE(edev, true, \"Unknown filter type %d\\n\",\n-\t\t\t  (int)params->type);\n-\t\treturn -EINVAL;\n-\t}\n-}\n-\n static const struct qed_eth_ops qed_eth_ops_pass = {\n \tINIT_STRUCT_FIELD(common, &qed_common_ops_pass),\n \tINIT_STRUCT_FIELD(fill_dev_info, &qed_fill_eth_dev_info),\n@@ -455,7 +361,6 @@ static const struct qed_eth_ops qed_eth_ops_pass = {\n \tINIT_STRUCT_FIELD(fastpath_stop, &qed_fastpath_stop),\n \tINIT_STRUCT_FIELD(fastpath_start, &qed_fastpath_start),\n \tINIT_STRUCT_FIELD(get_vport_stats, &qed_get_vport_stats),\n-\tINIT_STRUCT_FIELD(filter_config, &qed_configure_filter),\n };\n \n const struct qed_eth_ops *qed_get_eth_ops(void)\ndiff --git a/drivers/net/qede/qede_eth_if.h b/drivers/net/qede/qede_eth_if.h\nindex 33655c3..9c0db87 100644\n--- a/drivers/net/qede/qede_eth_if.h\n+++ b/drivers/net/qede/qede_eth_if.h\n@@ -26,12 +26,6 @@ enum qed_filter_rx_mode_type {\n \tQED_FILTER_RX_MODE_TYPE_PROMISC,\n };\n \n-enum qed_filter_xcast_params_type {\n-\tQED_FILTER_XCAST_TYPE_ADD,\n-\tQED_FILTER_XCAST_TYPE_DEL,\n-\tQED_FILTER_XCAST_TYPE_REPLACE,\n-};\n-\n enum qed_filter_type {\n \tQED_FILTER_TYPE_UCAST,\n \tQED_FILTER_TYPE_MCAST,\n@@ -93,31 +87,6 @@ struct qed_stop_txq_params {\n \tuint8_t tx_queue_id;\n };\n \n-struct qed_filter_ucast_params {\n-\tenum qed_filter_xcast_params_type type;\n-\tuint8_t vlan_valid;\n-\tuint16_t vlan;\n-\tuint8_t mac_valid;\n-\tunsigned char mac[ETHER_ADDR_LEN];\n-};\n-\n-struct qed_filter_mcast_params {\n-\tenum qed_filter_xcast_params_type type;\n-\tuint8_t num;\n-\tunsigned char mac[QEDE_MAX_MCAST_FILTERS][ETHER_ADDR_LEN];\n-};\n-\n-union qed_filter_type_params {\n-\tenum qed_filter_rx_mode_type accept_flags;\n-\tstruct qed_filter_ucast_params ucast;\n-\tstruct qed_filter_mcast_params mcast;\n-};\n-\n-struct qed_filter_params {\n-\tenum qed_filter_type type;\n-\tunion qed_filter_type_params filter;\n-};\n-\n struct qed_eth_ops {\n \tconst struct qed_common_ops *common;\n \n@@ -162,9 +131,6 @@ struct qed_eth_ops {\n \n \tvoid (*get_vport_stats)(struct ecore_dev *edev,\n \t\t\t\tstruct ecore_eth_stats *stats);\n-\n-\tint (*filter_config)(struct ecore_dev *edev,\n-\t\t\t     struct qed_filter_params *params);\n };\n \n /* externs */\n@@ -173,7 +139,7 @@ extern const struct qed_common_ops qed_common_ops_pass;\n \n const struct qed_eth_ops *qed_get_eth_ops();\n \n-int qed_configure_filter_rx_mode(struct ecore_dev *edev,\n+int qed_configure_filter_rx_mode(struct rte_eth_dev *eth_dev,\n \t\t\t\t enum qed_filter_rx_mode_type type);\n \n #endif /* _QEDE_ETH_IF_H */\ndiff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c\nindex 4943358..73f1824 100644\n--- a/drivers/net/qede/qede_ethdev.c\n+++ b/drivers/net/qede/qede_ethdev.c\n@@ -222,47 +222,181 @@ static void qede_print_adapter_info(struct qede_dev *qdev)\n \tDP_INFO(edev, \"*********************************\\n\");\n }\n \n+static void qede_set_ucast_cmn_params(struct ecore_filter_ucast *ucast)\n+{\n+\tmemset(ucast, 0, sizeof(struct ecore_filter_ucast));\n+\tucast->is_rx_filter = true;\n+\tucast->is_tx_filter = true;\n+\t/* ucast->assert_on_error = true; - For debug */\n+}\n+\n static int\n-qede_set_ucast_rx_mac(struct qede_dev *qdev,\n-\t\t      enum qed_filter_xcast_params_type opcode,\n-\t\t      uint8_t mac[ETHER_ADDR_LEN])\n+qede_ucast_filter(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *ucast,\n+\t\t  bool add)\n {\n-\tstruct ecore_dev *edev = &qdev->edev;\n-\tstruct qed_filter_params filter_cmd;\n-\n-\tmemset(&filter_cmd, 0, sizeof(filter_cmd));\n-\tfilter_cmd.type = QED_FILTER_TYPE_UCAST;\n-\tfilter_cmd.filter.ucast.type = opcode;\n-\tfilter_cmd.filter.ucast.mac_valid = 1;\n-\trte_memcpy(&filter_cmd.filter.ucast.mac[0], &mac[0], ETHER_ADDR_LEN);\n-\treturn qdev->ops->filter_config(edev, &filter_cmd);\n+\tstruct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);\n+\tstruct ecore_dev *edev = QEDE_INIT_EDEV(qdev);\n+\tstruct qede_ucast_entry *tmp = NULL;\n+\tstruct qede_ucast_entry *u;\n+\tstruct ether_addr *mac_addr;\n+\n+\tmac_addr  = (struct ether_addr *)ucast->mac;\n+\tif (add) {\n+\t\tSLIST_FOREACH(tmp, &qdev->uc_list_head, list) {\n+\t\t\tif ((memcmp(mac_addr, &tmp->mac,\n+\t\t\t\t    ETHER_ADDR_LEN) == 0) &&\n+\t\t\t     ucast->vlan == tmp->vlan) {\n+\t\t\t\tDP_ERR(edev, \"Unicast MAC is already added\"\n+\t\t\t\t       \" with vlan = %u, vni = %u\\n\",\n+\t\t\t\t       ucast->vlan,  ucast->vni);\n+\t\t\t\t\treturn -EEXIST;\n+\t\t\t}\n+\t\t}\n+\t\tu = rte_malloc(NULL, sizeof(struct qede_ucast_entry),\n+\t\t\t       RTE_CACHE_LINE_SIZE);\n+\t\tif (!u) {\n+\t\t\tDP_ERR(edev, \"Did not allocate memory for ucast\\n\");\n+\t\t\treturn -ENOMEM;\n+\t\t}\n+\t\tether_addr_copy(mac_addr, &u->mac);\n+\t\tu->vlan = ucast->vlan;\n+\t\tSLIST_INSERT_HEAD(&qdev->uc_list_head, u, list);\n+\t\tqdev->num_uc_addr++;\n+\t} else {\n+\t\tSLIST_FOREACH(tmp, &qdev->uc_list_head, list) {\n+\t\t\tif ((memcmp(mac_addr, &tmp->mac,\n+\t\t\t\t    ETHER_ADDR_LEN) == 0) &&\n+\t\t\t    ucast->vlan == tmp->vlan)\n+\t\t\tbreak;\n+\t\t}\n+\t\tif (tmp == NULL) {\n+\t\t\tDP_INFO(edev, \"Unicast MAC is not found\\n\");\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t\tSLIST_REMOVE(&qdev->uc_list_head, tmp, qede_ucast_entry, list);\n+\t\tqdev->num_uc_addr--;\n+\t}\n+\n+\treturn 0;\n }\n \n-static void\n-qede_mac_addr_add(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr,\n-\t\t  uint32_t index, __rte_unused uint32_t pool)\n+static int\n+qede_mcast_filter(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *mcast,\n+\t\t  bool add)\n {\n-\tstruct qede_dev *qdev = eth_dev->data->dev_private;\n-\tstruct ecore_dev *edev = &qdev->edev;\n-\tint rc;\n+\tstruct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);\n+\tstruct ecore_dev *edev = QEDE_INIT_EDEV(qdev);\n+\tstruct ether_addr *mac_addr;\n+\tstruct qede_mcast_entry *tmp = NULL;\n+\tstruct qede_mcast_entry *m;\n+\n+\tmac_addr  = (struct ether_addr *)mcast->mac;\n+\tif (add) {\n+\t\tSLIST_FOREACH(tmp, &qdev->mc_list_head, list) {\n+\t\t\tif (memcmp(mac_addr, &tmp->mac, ETHER_ADDR_LEN) == 0) {\n+\t\t\t\tDP_ERR(edev,\n+\t\t\t\t\t\"Multicast MAC is already added\\n\");\n+\t\t\t\treturn -EEXIST;\n+\t\t\t}\n+\t\t}\n+\t\tm = rte_malloc(NULL, sizeof(struct qede_mcast_entry),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\t\tif (!m) {\n+\t\t\tDP_ERR(edev,\n+\t\t\t\t\"Did not allocate memory for mcast\\n\");\n+\t\t\treturn -ENOMEM;\n+\t\t}\n+\t\tether_addr_copy(mac_addr, &m->mac);\n+\t\tSLIST_INSERT_HEAD(&qdev->mc_list_head, m, list);\n+\t\tqdev->num_mc_addr++;\n+\t} else {\n+\t\tSLIST_FOREACH(tmp, &qdev->mc_list_head, list) {\n+\t\t\tif (memcmp(mac_addr, &tmp->mac, ETHER_ADDR_LEN) == 0)\n+\t\t\t\tbreak;\n+\t\t}\n+\t\tif (tmp == NULL) {\n+\t\t\tDP_INFO(edev, \"Multicast mac is not found\\n\");\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t\tSLIST_REMOVE(&qdev->mc_list_head, tmp,\n+\t\t\t     qede_mcast_entry, list);\n+\t\tqdev->num_mc_addr--;\n+\t}\n \n-\tPMD_INIT_FUNC_TRACE(edev);\n+\treturn 0;\n+}\n \n-\tif (index >= qdev->dev_info.num_mac_addrs) {\n-\t\tDP_ERR(edev, \"Index %u is above MAC filter limit %u\\n\",\n-\t\t       index, qdev->dev_info.num_mac_addrs);\n-\t\treturn;\n+static enum _ecore_status_t\n+qede_mac_int_ops(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *ucast,\n+\t\t bool add)\n+{\n+\tstruct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);\n+\tstruct ecore_dev *edev = QEDE_INIT_EDEV(qdev);\n+\tenum _ecore_status_t rc;\n+\tstruct ecore_filter_mcast mcast;\n+\tstruct qede_mcast_entry *tmp;\n+\tuint16_t j = 0;\n+\n+\t/* Multicast */\n+\tif (is_multicast_ether_addr((struct ether_addr *)ucast->mac)) {\n+\t\tif (add) {\n+\t\t\tif (qdev->num_mc_addr >= ECORE_MAX_MC_ADDRS) {\n+\t\t\t\tDP_ERR(edev,\n+\t\t\t\t       \"Mcast filter table limit exceeded, \"\n+\t\t\t\t       \"Please enable mcast promisc mode\\n\");\n+\t\t\t\treturn -ECORE_INVAL;\n+\t\t\t}\n+\t\t}\n+\t\trc = qede_mcast_filter(eth_dev, ucast, add);\n+\t\tif (rc == 0) {\n+\t\t\tDP_INFO(edev, \"num_mc_addrs = %u\\n\", qdev->num_mc_addr);\n+\t\t\tmemset(&mcast, 0, sizeof(mcast));\n+\t\t\tmcast.num_mc_addrs = qdev->num_mc_addr;\n+\t\t\tmcast.opcode = ECORE_FILTER_ADD;\n+\t\t\tSLIST_FOREACH(tmp, &qdev->mc_list_head, list) {\n+\t\t\t\tether_addr_copy(&tmp->mac,\n+\t\t\t\t\t(struct ether_addr *)&mcast.mac[j]);\n+\t\t\t\tj++;\n+\t\t\t}\n+\t\t\trc = ecore_filter_mcast_cmd(edev, &mcast,\n+\t\t\t\t\t\t    ECORE_SPQ_MODE_CB, NULL);\n+\t\t}\n+\t\tif (rc != ECORE_SUCCESS) {\n+\t\t\tDP_ERR(edev, \"Failed to add multicast filter\"\n+\t\t\t       \" rc = %d, op = %d\\n\", rc, add);\n+\t\t}\n+\t} else { /* Unicast */\n+\t\tif (add) {\n+\t\t\tif (qdev->num_uc_addr >= qdev->dev_info.num_mac_addrs) {\n+\t\t\t\tDP_ERR(edev,\n+\t\t\t\t       \"Ucast filter table limit exceeded,\"\n+\t\t\t\t       \" Please enable promisc mode\\n\");\n+\t\t\t\treturn -ECORE_INVAL;\n+\t\t\t}\n+\t\t}\n+\t\trc = qede_ucast_filter(eth_dev, ucast, add);\n+\t\tif (rc == 0)\n+\t\t\trc = ecore_filter_ucast_cmd(edev, ucast,\n+\t\t\t\t\t\t    ECORE_SPQ_MODE_CB, NULL);\n+\t\tif (rc != ECORE_SUCCESS) {\n+\t\t\tDP_ERR(edev, \"MAC filter failed, rc = %d, op = %d\\n\",\n+\t\t\t       rc, add);\n+\t\t}\n \t}\n \n-\t/* Adding macaddr even though promiscuous mode is set */\n-\tif (rte_eth_promiscuous_get(eth_dev->data->port_id) == 1)\n-\t\tDP_INFO(edev, \"Port is in promisc mode, yet adding it\\n\");\n+\treturn rc;\n+}\n \n-\t/* Add MAC filters according to the unicast secondary macs */\n-\trc = qede_set_ucast_rx_mac(qdev, QED_FILTER_XCAST_TYPE_ADD,\n-\t\t\t\t   mac_addr->addr_bytes);\n-\tif (rc)\n-\t\tDP_ERR(edev, \"Unable to add macaddr rc=%d\\n\", rc);\n+static void\n+qede_mac_addr_add(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr,\n+\t\t  uint32_t index, __rte_unused uint32_t pool)\n+{\n+\tstruct ecore_filter_ucast ucast;\n+\n+\tqede_set_ucast_cmn_params(&ucast);\n+\tucast.type = ECORE_FILTER_MAC;\n+\tether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac);\n+\t(void)qede_mac_int_ops(eth_dev, &ucast, 1);\n }\n \n static void\n@@ -271,6 +405,7 @@ qede_mac_addr_remove(struct rte_eth_dev *eth_dev, uint32_t index)\n \tstruct qede_dev *qdev = eth_dev->data->dev_private;\n \tstruct ecore_dev *edev = &qdev->edev;\n \tstruct ether_addr mac_addr;\n+\tstruct ecore_filter_ucast ucast;\n \tint rc;\n \n \tPMD_INIT_FUNC_TRACE(edev);\n@@ -281,12 +416,15 @@ qede_mac_addr_remove(struct rte_eth_dev *eth_dev, uint32_t index)\n \t\treturn;\n \t}\n \n+\tqede_set_ucast_cmn_params(&ucast);\n+\tucast.opcode = ECORE_FILTER_REMOVE;\n+\tucast.type = ECORE_FILTER_MAC;\n+\n \t/* Use the index maintained by rte */\n-\tether_addr_copy(&eth_dev->data->mac_addrs[index], &mac_addr);\n-\trc = qede_set_ucast_rx_mac(qdev, QED_FILTER_XCAST_TYPE_DEL,\n-\t\t\t\t   mac_addr.addr_bytes);\n-\tif (rc)\n-\t\tDP_ERR(edev, \"Unable to remove macaddr rc=%d\\n\", rc);\n+\tether_addr_copy(&eth_dev->data->mac_addrs[index],\n+\t\t\t(struct ether_addr *)&ucast.mac);\n+\n+\tecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, NULL);\n }\n \n static void\n@@ -294,6 +432,7 @@ qede_mac_addr_set(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr)\n {\n \tstruct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);\n \tstruct ecore_dev *edev = QEDE_INIT_EDEV(qdev);\n+\tstruct ecore_filter_ucast ucast;\n \tint rc;\n \n \tif (IS_VF(edev) && !ecore_vf_check_mac(ECORE_LEADING_HWFN(edev),\n@@ -305,10 +444,13 @@ qede_mac_addr_set(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr)\n \t}\n \n \t/* First remove the primary mac */\n-\trc = qede_set_ucast_rx_mac(qdev, QED_FILTER_XCAST_TYPE_DEL,\n-\t\t\t\t   qdev->primary_mac.addr_bytes);\n-\n-\tif (rc) {\n+\tqede_set_ucast_cmn_params(&ucast);\n+\tucast.opcode = ECORE_FILTER_REMOVE;\n+\tucast.type = ECORE_FILTER_MAC;\n+\tether_addr_copy(&qdev->primary_mac,\n+\t\t\t(struct ether_addr *)&ucast.mac);\n+\trc = ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, NULL);\n+\tif (rc != 0) {\n \t\tDP_ERR(edev, \"Unable to remove current macaddr\"\n \t\t\t     \" Reverting to previous default mac\\n\");\n \t\tether_addr_copy(&qdev->primary_mac,\n@@ -317,18 +459,15 @@ qede_mac_addr_set(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr)\n \t}\n \n \t/* Add new MAC */\n-\trc = qede_set_ucast_rx_mac(qdev, QED_FILTER_XCAST_TYPE_ADD,\n-\t\t\t\t   mac_addr->addr_bytes);\n-\n-\tif (rc)\n+\tucast.opcode = ECORE_FILTER_ADD;\n+\tether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac);\n+\trc = ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, NULL);\n+\tif (rc != 0)\n \t\tDP_ERR(edev, \"Unable to add new default mac\\n\");\n \telse\n \t\tether_addr_copy(mac_addr, &qdev->primary_mac);\n }\n \n-\n-\n-\n static void qede_config_accept_any_vlan(struct qede_dev *qdev, bool action)\n {\n \tstruct ecore_dev *edev = &qdev->edev;\n@@ -414,22 +553,6 @@ static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)\n \t\tmask, rxmode->hw_vlan_strip, rxmode->hw_vlan_filter);\n }\n \n-static int qede_set_ucast_rx_vlan(struct qede_dev *qdev,\n-\t\t\t\t  enum qed_filter_xcast_params_type opcode,\n-\t\t\t\t  uint16_t vid)\n-{\n-\tstruct qed_filter_params filter_cmd;\n-\tstruct ecore_dev *edev = QEDE_INIT_EDEV(qdev);\n-\n-\tmemset(&filter_cmd, 0, sizeof(filter_cmd));\n-\tfilter_cmd.type = QED_FILTER_TYPE_UCAST;\n-\tfilter_cmd.filter.ucast.type = opcode;\n-\tfilter_cmd.filter.ucast.vlan_valid = 1;\n-\tfilter_cmd.filter.ucast.vlan = vid;\n-\n-\treturn qdev->ops->filter_config(edev, &filter_cmd);\n-}\n-\n static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev,\n \t\t\t\tuint16_t vlan_id, int on)\n {\n@@ -438,6 +561,7 @@ static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev,\n \tstruct qed_dev_eth_info *dev_info = &qdev->dev_info;\n \tstruct qede_vlan_entry *tmp = NULL;\n \tstruct qede_vlan_entry *vlan;\n+\tstruct ecore_filter_ucast ucast;\n \tint rc;\n \n \tif (on) {\n@@ -464,9 +588,13 @@ static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev,\n \t\t\treturn -ENOMEM;\n \t\t}\n \n-\t\trc = qede_set_ucast_rx_vlan(qdev, QED_FILTER_XCAST_TYPE_ADD,\n-\t\t\t\t\t    vlan_id);\n-\t\tif (rc) {\n+\t\tqede_set_ucast_cmn_params(&ucast);\n+\t\tucast.opcode = ECORE_FILTER_ADD;\n+\t\tucast.type = ECORE_FILTER_VLAN;\n+\t\tucast.vlan = vlan_id;\n+\t\trc = ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB,\n+\t\t\t\t\t    NULL);\n+\t\tif (rc != 0) {\n \t\t\tDP_ERR(edev, \"Failed to add VLAN %u rc %d\\n\", vlan_id,\n \t\t\t       rc);\n \t\t\trte_free(vlan);\n@@ -496,9 +624,13 @@ static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev,\n \n \t\tSLIST_REMOVE(&qdev->vlan_list_head, tmp, qede_vlan_entry, list);\n \n-\t\trc = qede_set_ucast_rx_vlan(qdev, QED_FILTER_XCAST_TYPE_DEL,\n-\t\t\t\t\t    vlan_id);\n-\t\tif (rc) {\n+\t\tqede_set_ucast_cmn_params(&ucast);\n+\t\tucast.opcode = ECORE_FILTER_REMOVE;\n+\t\tucast.type = ECORE_FILTER_VLAN;\n+\t\tucast.vlan = vlan_id;\n+\t\trc = ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB,\n+\t\t\t\t\t    NULL);\n+\t\tif (rc != 0) {\n \t\t\tDP_ERR(edev, \"Failed to delete VLAN %u rc %d\\n\",\n \t\t\t       vlan_id, rc);\n \t\t} else {\n@@ -740,22 +872,6 @@ qede_link_update(struct rte_eth_dev *eth_dev, __rte_unused int wait_to_complete)\n \treturn ((curr->link_status == link.link_up) ? -1 : 0);\n }\n \n-static void\n-qede_rx_mode_setting(struct rte_eth_dev *eth_dev,\n-\t\t     enum qed_filter_rx_mode_type accept_flags)\n-{\n-\tstruct qede_dev *qdev = eth_dev->data->dev_private;\n-\tstruct ecore_dev *edev = &qdev->edev;\n-\tstruct qed_filter_params rx_mode;\n-\n-\tDP_INFO(edev, \"%s mode %u\\n\", __func__, accept_flags);\n-\n-\tmemset(&rx_mode, 0, sizeof(struct qed_filter_params));\n-\trx_mode.type = QED_FILTER_TYPE_RX_MODE;\n-\trx_mode.filter.accept_flags = accept_flags;\n-\tqdev->ops->filter_config(edev, &rx_mode);\n-}\n-\n static void qede_promiscuous_enable(struct rte_eth_dev *eth_dev)\n {\n \tstruct qede_dev *qdev = eth_dev->data->dev_private;\n@@ -768,7 +884,7 @@ static void qede_promiscuous_enable(struct rte_eth_dev *eth_dev)\n \tif (rte_eth_allmulticast_get(eth_dev->data->port_id) == 1)\n \t\ttype |= QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC;\n \n-\tqede_rx_mode_setting(eth_dev, type);\n+\tqed_configure_filter_rx_mode(eth_dev, type);\n }\n \n static void qede_promiscuous_disable(struct rte_eth_dev *eth_dev)\n@@ -779,10 +895,11 @@ static void qede_promiscuous_disable(struct rte_eth_dev *eth_dev)\n \tPMD_INIT_FUNC_TRACE(edev);\n \n \tif (rte_eth_allmulticast_get(eth_dev->data->port_id) == 1)\n-\t\tqede_rx_mode_setting(eth_dev,\n-\t\t\t\t     QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC);\n+\t\tqed_configure_filter_rx_mode(eth_dev,\n+\t\t\t\tQED_FILTER_RX_MODE_TYPE_MULTI_PROMISC);\n \telse\n-\t\tqede_rx_mode_setting(eth_dev, QED_FILTER_RX_MODE_TYPE_REGULAR);\n+\t\tqed_configure_filter_rx_mode(eth_dev,\n+\t\t\t\tQED_FILTER_RX_MODE_TYPE_REGULAR);\n }\n \n static void qede_poll_sp_sb_cb(void *param)\n@@ -1040,15 +1157,17 @@ static void qede_allmulticast_enable(struct rte_eth_dev *eth_dev)\n \tif (rte_eth_promiscuous_get(eth_dev->data->port_id) == 1)\n \t\ttype |= QED_FILTER_RX_MODE_TYPE_PROMISC;\n \n-\tqede_rx_mode_setting(eth_dev, type);\n+\tqed_configure_filter_rx_mode(eth_dev, type);\n }\n \n static void qede_allmulticast_disable(struct rte_eth_dev *eth_dev)\n {\n \tif (rte_eth_promiscuous_get(eth_dev->data->port_id) == 1)\n-\t\tqede_rx_mode_setting(eth_dev, QED_FILTER_RX_MODE_TYPE_PROMISC);\n+\t\tqed_configure_filter_rx_mode(eth_dev,\n+\t\t\t\tQED_FILTER_RX_MODE_TYPE_PROMISC);\n \telse\n-\t\tqede_rx_mode_setting(eth_dev, QED_FILTER_RX_MODE_TYPE_REGULAR);\n+\t\tqed_configure_filter_rx_mode(eth_dev,\n+\t\t\t\tQED_FILTER_RX_MODE_TYPE_REGULAR);\n }\n \n static int qede_flow_ctrl_set(struct rte_eth_dev *eth_dev,\ndiff --git a/drivers/net/qede/qede_ethdev.h b/drivers/net/qede/qede_ethdev.h\nindex a97e3d9..a35ea8b 100644\n--- a/drivers/net/qede/qede_ethdev.h\n+++ b/drivers/net/qede/qede_ethdev.h\n@@ -123,6 +123,17 @@ struct qede_vlan_entry {\n \tuint16_t vid;\n };\n \n+struct qede_mcast_entry {\n+\tstruct ether_addr mac;\n+\tSLIST_ENTRY(qede_mcast_entry) list;\n+};\n+\n+struct qede_ucast_entry {\n+\tstruct ether_addr mac;\n+\tuint16_t vlan;\n+\tSLIST_ENTRY(qede_ucast_entry) list;\n+};\n+\n /*\n  *  Structure to store private data for each port.\n  */\n@@ -147,6 +158,10 @@ struct qede_dev {\n \tuint16_t configured_vlans;\n \tbool accept_any_vlan;\n \tstruct ether_addr primary_mac;\n+\tSLIST_HEAD(mc_list_head, qede_mcast_entry) mc_list_head;\n+\tuint16_t num_mc_addr;\n+\tSLIST_HEAD(uc_list_head, qede_ucast_entry) uc_list_head;\n+\tuint16_t num_uc_addr;\n \tbool handle_hw_err;\n \tchar drv_ver[QEDE_PMD_DRV_VER_STR_SIZE];\n };\n",
    "prefixes": [
        "dpdk-dev",
        "v2",
        "2/7"
    ]
}