get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 1285696,
    "url": "http://patchwork.ozlabs.org/api/patches/1285696/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20200508004113.39725-10-anthony.l.nguyen@intel.com/",
    "project": {
        "id": 46,
        "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api",
        "name": "Intel Wired Ethernet development",
        "link_name": "intel-wired-lan",
        "list_id": "intel-wired-lan.osuosl.org",
        "list_email": "intel-wired-lan@osuosl.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20200508004113.39725-10-anthony.l.nguyen@intel.com>",
    "list_archive_url": null,
    "date": "2020-05-08T00:41:08",
    "name": "[S41,10/15] ice: refactor filter functions",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "e20a0dce77a95c45d303ed8dd83ebb27ff741b64",
    "submitter": {
        "id": 68875,
        "url": "http://patchwork.ozlabs.org/api/people/68875/?format=api",
        "name": "Tony Nguyen",
        "email": "anthony.l.nguyen@intel.com"
    },
    "delegate": {
        "id": 68,
        "url": "http://patchwork.ozlabs.org/api/users/68/?format=api",
        "username": "jtkirshe",
        "first_name": "Jeff",
        "last_name": "Kirsher",
        "email": "jeffrey.t.kirsher@intel.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20200508004113.39725-10-anthony.l.nguyen@intel.com/mbox/",
    "series": [
        {
            "id": 175527,
            "url": "http://patchwork.ozlabs.org/api/series/175527/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=175527",
            "date": "2020-05-08T00:41:10",
            "name": "[S41,01/15] ice: Add VF promiscuous support",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/175527/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/1285696/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/1285696/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<intel-wired-lan-bounces@osuosl.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Authentication-Results": [
            "ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=osuosl.org\n (client-ip=140.211.166.133; helo=hemlock.osuosl.org;\n envelope-from=intel-wired-lan-bounces@osuosl.org; receiver=<UNKNOWN>)",
            "ozlabs.org;\n dmarc=fail (p=none dis=none) header.from=intel.com"
        ],
        "Received": [
            "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 49JBQz62wGz9sSG\n\tfor <incoming@patchwork.ozlabs.org>; Fri,  8 May 2020 10:43:55 +1000 (AEST)",
            "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 5ECE6896BA;\n\tFri,  8 May 2020 00:43:54 +0000 (UTC)",
            "from hemlock.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id 52zzA7V+Q0V8; Fri,  8 May 2020 00:43:50 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 8CBED897B4;\n\tFri,  8 May 2020 00:43:48 +0000 (UTC)",
            "from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n by ash.osuosl.org (Postfix) with ESMTP id 0F2B61BF2C4\n for <intel-wired-lan@lists.osuosl.org>; Fri,  8 May 2020 00:43:44 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n by whitealder.osuosl.org (Postfix) with ESMTP id 0BE64878A6\n for <intel-wired-lan@lists.osuosl.org>; Fri,  8 May 2020 00:43:44 +0000 (UTC)",
            "from whitealder.osuosl.org ([127.0.0.1])\n by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n with ESMTP id 5y0HxtjeFiGp for <intel-wired-lan@lists.osuosl.org>;\n Fri,  8 May 2020 00:43:36 +0000 (UTC)",
            "from mga04.intel.com (mga04.intel.com [192.55.52.120])\n by whitealder.osuosl.org (Postfix) with ESMTPS id 395C087A87\n for <intel-wired-lan@lists.osuosl.org>; Fri,  8 May 2020 00:43:35 +0000 (UTC)",
            "from orsmga007.jf.intel.com ([10.7.209.58])\n by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 07 May 2020 17:43:34 -0700",
            "from unknown (HELO localhost.jf.intel.com) ([10.166.241.65])\n by orsmga007.jf.intel.com with ESMTP; 07 May 2020 17:43:33 -0700"
        ],
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6",
        "IronPort-SDR": [
            "\n g8ofsStqB9RcMI2NXAttgIOIg+/rPyCdEOiuTXifb23pvIBntLhd/kqBJFfG5vxsLws+fere8D\n zh6e6Lc5UOXQ==",
            "\n bspC2ZA0BhLl1t5ZcWSyVoOyW4BfO+ec2f5ImY6DMfe5eJaPfNw83mB12q1aMha36MnndGHqhU\n 0Zvzl+fOdOBQ=="
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.73,365,1583222400\"; d=\"scan'208\";a=\"249468775\"",
        "From": "Tony Nguyen <anthony.l.nguyen@intel.com>",
        "To": "intel-wired-lan@lists.osuosl.org",
        "Date": "Thu,  7 May 2020 17:41:08 -0700",
        "Message-Id": "<20200508004113.39725-10-anthony.l.nguyen@intel.com>",
        "X-Mailer": "git-send-email 2.20.1",
        "In-Reply-To": "<20200508004113.39725-1-anthony.l.nguyen@intel.com>",
        "References": "<20200508004113.39725-1-anthony.l.nguyen@intel.com>",
        "MIME-Version": "1.0",
        "Subject": "[Intel-wired-lan] [PATCH S41 10/15] ice: refactor filter functions",
        "X-BeenThere": "intel-wired-lan@osuosl.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n <intel-wired-lan.osuosl.org>",
        "List-Unsubscribe": "<https://lists.osuosl.org/mailman/options/intel-wired-lan>,\n <mailto:intel-wired-lan-request@osuosl.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>",
        "List-Post": "<mailto:intel-wired-lan@osuosl.org>",
        "List-Help": "<mailto:intel-wired-lan-request@osuosl.org?subject=help>",
        "List-Subscribe": "<https://lists.osuosl.org/mailman/listinfo/intel-wired-lan>,\n <mailto:intel-wired-lan-request@osuosl.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "intel-wired-lan-bounces@osuosl.org",
        "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@osuosl.org>"
    },
    "content": "From: Michal Swiatkowski <michal.swiatkowski@intel.com>\n\nMove filter functions to separate file.\n\nAdd functions that prepare suitable ice_fltr_info struct\ndepending on the filter type and add this struct to earlier created\nlist:\n- ice_fltr_add_mac_to_list\n- ice_fltr_add_vlan_to_list\n- ice_fltr_add_eth_to_list\nThis functions are used in adding and removing filters.\n\nCreate wrappers for functions mentioned above that alloc list,\nadd suitable ice_fltr_info to it and call add or remove function.\n- ice_fltr_prepare_mac\n- ice_fltr_prepare_mac_and_broadcast\n- ice_fltr_prepare_vlan\n- ice_fltr_prepare_eth\n\nSigned-off-by: Michal Swiatkowski <michal.swiatkowski@intel.com>\nSigned-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>\n---\n drivers/net/ethernet/intel/ice/Makefile       |   1 +\n drivers/net/ethernet/intel/ice/ice_ethtool.c  |  13 +-\n drivers/net/ethernet/intel/ice/ice_fltr.c     | 397 ++++++++++++++++++\n drivers/net/ethernet/intel/ice/ice_fltr.h     |  39 ++\n drivers/net/ethernet/intel/ice/ice_lib.c      | 212 +---------\n drivers/net/ethernet/intel/ice/ice_lib.h      |   9 +-\n drivers/net/ethernet/intel/ice/ice_main.c     |  53 +--\n .../net/ethernet/intel/ice/ice_virtchnl_pf.c  |  34 +-\n 8 files changed, 494 insertions(+), 264 deletions(-)\n create mode 100644 drivers/net/ethernet/intel/ice/ice_fltr.c\n create mode 100644 drivers/net/ethernet/intel/ice/ice_fltr.h",
    "diff": "diff --git a/drivers/net/ethernet/intel/ice/Makefile b/drivers/net/ethernet/intel/ice/Makefile\nindex 73909045da1c..0d9741cf000c 100644\n--- a/drivers/net/ethernet/intel/ice/Makefile\n+++ b/drivers/net/ethernet/intel/ice/Makefile\n@@ -17,6 +17,7 @@ ice-y := ice_main.o\t\\\n \t ice_lib.o\t\\\n \t ice_txrx_lib.o\t\\\n \t ice_txrx.o\t\\\n+\t ice_fltr.o\t\\\n \t ice_flex_pipe.o \\\n \t ice_flow.o\t\\\n \t ice_devlink.o\t\\\ndiff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c\nindex 41a6aa4ebb02..9fb82c993df9 100644\n--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c\n+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c\n@@ -5,6 +5,7 @@\n \n #include \"ice.h\"\n #include \"ice_flow.h\"\n+#include \"ice_fltr.h\"\n #include \"ice_lib.h\"\n #include \"ice_dcb_lib.h\"\n \n@@ -676,7 +677,6 @@ static u64 ice_loopback_test(struct net_device *netdev)\n \tstruct ice_ring *tx_ring, *rx_ring;\n \tu8 broadcast[ETH_ALEN], ret = 0;\n \tint num_frames, valid_frames;\n-\tLIST_HEAD(tmp_list);\n \tstruct device *dev;\n \tu8 *tx_frame;\n \tint i;\n@@ -712,16 +712,11 @@ static u64 ice_loopback_test(struct net_device *netdev)\n \n \t/* Test VSI needs to receive broadcast packets */\n \teth_broadcast_addr(broadcast);\n-\tif (ice_add_mac_to_list(test_vsi, &tmp_list, broadcast)) {\n+\tif (ice_fltr_add_mac(test_vsi, broadcast, ICE_FWD_TO_VSI)) {\n \t\tret = 5;\n \t\tgoto lbtest_mac_dis;\n \t}\n \n-\tif (ice_add_mac(&pf->hw, &tmp_list)) {\n-\t\tret = 6;\n-\t\tgoto free_mac_list;\n-\t}\n-\n \tif (ice_lbtest_create_frame(pf, &tx_frame, ICE_LB_FRAME_SIZE)) {\n \t\tret = 7;\n \t\tgoto remove_mac_filters;\n@@ -744,10 +739,8 @@ static u64 ice_loopback_test(struct net_device *netdev)\n lbtest_free_frame:\n \tdevm_kfree(dev, tx_frame);\n remove_mac_filters:\n-\tif (ice_remove_mac(&pf->hw, &tmp_list))\n+\tif (ice_fltr_remove_mac(test_vsi, broadcast, ICE_FWD_TO_VSI))\n \t\tnetdev_err(netdev, \"Could not remove MAC filter for the test VSI\\n\");\n-free_mac_list:\n-\tice_free_fltr_list(dev, &tmp_list);\n lbtest_mac_dis:\n \t/* Disable MAC loopback after the test is completed. */\n \tif (ice_aq_set_mac_loopback(&pf->hw, false, NULL))\ndiff --git a/drivers/net/ethernet/intel/ice/ice_fltr.c b/drivers/net/ethernet/intel/ice/ice_fltr.c\nnew file mode 100644\nindex 000000000000..7f0942602b42\n--- /dev/null\n+++ b/drivers/net/ethernet/intel/ice/ice_fltr.c\n@@ -0,0 +1,397 @@\n+// SPDX-License-Identifier: GPL-2.0\n+/* Copyright (C) 2018-2019, Intel Corporation. */\n+\n+#include \"ice.h\"\n+#include \"ice_fltr.h\"\n+\n+/**\n+ * ice_fltr_free_list - free filter lists helper\n+ * @dev: pointer to the device struct\n+ * @h: pointer to the list head to be freed\n+ *\n+ * Helper function to free filter lists previously created using\n+ * ice_fltr_add_mac_to_list\n+ */\n+void ice_fltr_free_list(struct device *dev, struct list_head *h)\n+{\n+\tstruct ice_fltr_list_entry *e, *tmp;\n+\n+\tlist_for_each_entry_safe(e, tmp, h, list_entry) {\n+\t\tlist_del(&e->list_entry);\n+\t\tdevm_kfree(dev, e);\n+\t}\n+}\n+\n+/**\n+ * ice_fltr_add_entry_to_list - allocate and add filter entry to list\n+ * @dev: pointer to device needed by alloc function\n+ * @info: filter info struct that gets added to the passed in list\n+ * @list: pointer to the list which contains MAC filters entry\n+ */\n+static int\n+ice_fltr_add_entry_to_list(struct device *dev, struct ice_fltr_info *info,\n+\t\t\t   struct list_head *list)\n+{\n+\tstruct ice_fltr_list_entry *entry;\n+\n+\tentry = devm_kzalloc(dev, sizeof(*entry), GFP_ATOMIC);\n+\tif (!entry)\n+\t\treturn -ENOMEM;\n+\n+\tentry->fltr_info = *info;\n+\n+\tINIT_LIST_HEAD(&entry->list_entry);\n+\tlist_add(&entry->list_entry, list);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * ice_fltr_add_mac_list - add list of MAC filters\n+ * @vsi: pointer to VSI struct\n+ * @list: list of filters\n+ */\n+enum ice_status\n+ice_fltr_add_mac_list(struct ice_vsi *vsi, struct list_head *list)\n+{\n+\treturn ice_add_mac(&vsi->back->hw, list);\n+}\n+\n+/**\n+ * ice_fltr_remove_mac_list - remove list of MAC filters\n+ * @vsi: pointer to VSI struct\n+ * @list: list of filters\n+ */\n+enum ice_status\n+ice_fltr_remove_mac_list(struct ice_vsi *vsi, struct list_head *list)\n+{\n+\treturn ice_remove_mac(&vsi->back->hw, list);\n+}\n+\n+/**\n+ * ice_fltr_add_vlan_list - add list of VLAN filters\n+ * @vsi: pointer to VSI struct\n+ * @list: list of filters\n+ */\n+static enum ice_status\n+ice_fltr_add_vlan_list(struct ice_vsi *vsi, struct list_head *list)\n+{\n+\treturn ice_add_vlan(&vsi->back->hw, list);\n+}\n+\n+/**\n+ * ice_fltr_remove_vlan_list - remove list of VLAN filters\n+ * @vsi: pointer to VSI struct\n+ * @list: list of filters\n+ */\n+static enum ice_status\n+ice_fltr_remove_vlan_list(struct ice_vsi *vsi, struct list_head *list)\n+{\n+\treturn ice_remove_vlan(&vsi->back->hw, list);\n+}\n+\n+/**\n+ * ice_fltr_add_eth_list - add list of ethertype filters\n+ * @vsi: pointer to VSI struct\n+ * @list: list of filters\n+ */\n+static enum ice_status\n+ice_fltr_add_eth_list(struct ice_vsi *vsi, struct list_head *list)\n+{\n+\treturn ice_add_eth_mac(&vsi->back->hw, list);\n+}\n+\n+/**\n+ * ice_fltr_remove_eth_list - remove list of ethertype filters\n+ * @vsi: pointer to VSI struct\n+ * @list: list of filters\n+ */\n+static enum ice_status\n+ice_fltr_remove_eth_list(struct ice_vsi *vsi, struct list_head *list)\n+{\n+\treturn ice_remove_eth_mac(&vsi->back->hw, list);\n+}\n+\n+/**\n+ * ice_fltr_remove_all - remove all filters associated with VSI\n+ * @vsi: pointer to VSI struct\n+ */\n+void ice_fltr_remove_all(struct ice_vsi *vsi)\n+{\n+\tice_remove_vsi_fltr(&vsi->back->hw, vsi->idx);\n+}\n+\n+/**\n+ * ice_fltr_add_mac_to_list - add MAC filter info to exsisting list\n+ * @vsi: pointer to VSI struct\n+ * @list: list to add filter info to\n+ * @mac: MAC address to add\n+ * @action: filter action\n+ */\n+int\n+ice_fltr_add_mac_to_list(struct ice_vsi *vsi, struct list_head *list,\n+\t\t\t const u8 *mac, enum ice_sw_fwd_act_type action)\n+{\n+\tstruct ice_fltr_info info = { 0 };\n+\n+\tinfo.flag = ICE_FLTR_TX;\n+\tinfo.src_id = ICE_SRC_ID_VSI;\n+\tinfo.lkup_type = ICE_SW_LKUP_MAC;\n+\tinfo.fltr_act = action;\n+\tinfo.vsi_handle = vsi->idx;\n+\n+\tether_addr_copy(info.l_data.mac.mac_addr, mac);\n+\n+\treturn ice_fltr_add_entry_to_list(ice_pf_to_dev(vsi->back), &info,\n+\t\t\t\t\t  list);\n+}\n+\n+/**\n+ * ice_fltr_add_vlan_to_list - add VLAN filter info to exsisting list\n+ * @vsi: pointer to VSI struct\n+ * @list: list to add filter info to\n+ * @vlan_id: VLAN ID to add\n+ * @action: filter action\n+ */\n+static int\n+ice_fltr_add_vlan_to_list(struct ice_vsi *vsi, struct list_head *list,\n+\t\t\t  u16 vlan_id, enum ice_sw_fwd_act_type action)\n+{\n+\tstruct ice_fltr_info info = { 0 };\n+\n+\tinfo.flag = ICE_FLTR_TX;\n+\tinfo.src_id = ICE_SRC_ID_VSI;\n+\tinfo.lkup_type = ICE_SW_LKUP_VLAN;\n+\tinfo.fltr_act = action;\n+\tinfo.vsi_handle = vsi->idx;\n+\tinfo.l_data.vlan.vlan_id = vlan_id;\n+\n+\treturn ice_fltr_add_entry_to_list(ice_pf_to_dev(vsi->back), &info,\n+\t\t\t\t\t  list);\n+}\n+\n+/**\n+ * ice_fltr_add_eth_to_list - add ethertype filter info to exsisting list\n+ * @vsi: pointer to VSI struct\n+ * @list: list to add filter info to\n+ * @ethertype: ethertype of packet that matches filter\n+ * @flag: filter direction, Tx or Rx\n+ * @action: filter action\n+ */\n+static int\n+ice_fltr_add_eth_to_list(struct ice_vsi *vsi, struct list_head *list,\n+\t\t\t u16 ethertype, u16 flag,\n+\t\t\t enum ice_sw_fwd_act_type action)\n+{\n+\tstruct ice_fltr_info info = { 0 };\n+\n+\tinfo.flag = flag;\n+\tinfo.lkup_type = ICE_SW_LKUP_ETHERTYPE;\n+\tinfo.fltr_act = action;\n+\tinfo.vsi_handle = vsi->idx;\n+\tinfo.l_data.ethertype_mac.ethertype = ethertype;\n+\n+\tif (flag == ICE_FLTR_TX)\n+\t\tinfo.src_id = ICE_SRC_ID_VSI;\n+\telse\n+\t\tinfo.src_id = ICE_SRC_ID_LPORT;\n+\n+\treturn ice_fltr_add_entry_to_list(ice_pf_to_dev(vsi->back), &info,\n+\t\t\t\t\t  list);\n+}\n+\n+/**\n+ * ice_fltr_prepare_mac - add or remove MAC rule\n+ * @vsi: pointer to VSI struct\n+ * @mac: MAC address to add\n+ * @action: action to be performed on filter match\n+ * @mac_action: pointer to add or remove MAC function\n+ */\n+static enum ice_status\n+ice_fltr_prepare_mac(struct ice_vsi *vsi, const u8 *mac,\n+\t\t     enum ice_sw_fwd_act_type action,\n+\t\t     enum ice_status (*mac_action)(struct ice_vsi *,\n+\t\t\t\t\t\t   struct list_head *))\n+{\n+\tenum ice_status result;\n+\tLIST_HEAD(tmp_list);\n+\n+\tif (ice_fltr_add_mac_to_list(vsi, &tmp_list, mac, action)) {\n+\t\tice_fltr_free_list(ice_pf_to_dev(vsi->back), &tmp_list);\n+\t\treturn ICE_ERR_NO_MEMORY;\n+\t}\n+\n+\tresult = mac_action(vsi, &tmp_list);\n+\tice_fltr_free_list(ice_pf_to_dev(vsi->back), &tmp_list);\n+\treturn result;\n+}\n+\n+/**\n+ * ice_fltr_prepare_mac_and_broadcast - add or remove MAC and broadcast filter\n+ * @vsi: pointer to VSI struct\n+ * @mac: MAC address to add\n+ * @action: action to be performed on filter match\n+ * @mac_action: pointer to add or remove MAC function\n+ */\n+static enum ice_status\n+ice_fltr_prepare_mac_and_broadcast(struct ice_vsi *vsi, const u8 *mac,\n+\t\t\t\t   enum ice_sw_fwd_act_type action,\n+\t\t\t\t   enum ice_status(*mac_action)\n+\t\t\t\t   (struct ice_vsi *, struct list_head *))\n+{\n+\tu8 broadcast[ETH_ALEN];\n+\tenum ice_status result;\n+\tLIST_HEAD(tmp_list);\n+\n+\teth_broadcast_addr(broadcast);\n+\tif (ice_fltr_add_mac_to_list(vsi, &tmp_list, mac, action) ||\n+\t    ice_fltr_add_mac_to_list(vsi, &tmp_list, broadcast, action)) {\n+\t\tice_fltr_free_list(ice_pf_to_dev(vsi->back), &tmp_list);\n+\t\treturn ICE_ERR_NO_MEMORY;\n+\t}\n+\n+\tresult = mac_action(vsi, &tmp_list);\n+\tice_fltr_free_list(ice_pf_to_dev(vsi->back), &tmp_list);\n+\treturn result;\n+}\n+\n+/**\n+ * ice_fltr_prepare_vlan - add or remove VLAN filter\n+ * @vsi: pointer to VSI struct\n+ * @vlan_id: VLAN ID to add\n+ * @action: action to be performed on filter match\n+ * @vlan_action: pointer to add or remove VLAN function\n+ */\n+static enum ice_status\n+ice_fltr_prepare_vlan(struct ice_vsi *vsi, u16 vlan_id,\n+\t\t      enum ice_sw_fwd_act_type action,\n+\t\t      enum ice_status (*vlan_action)(struct ice_vsi *,\n+\t\t\t\t\t\t     struct list_head *))\n+{\n+\tenum ice_status result;\n+\tLIST_HEAD(tmp_list);\n+\n+\tif (ice_fltr_add_vlan_to_list(vsi, &tmp_list, vlan_id, action))\n+\t\treturn ICE_ERR_NO_MEMORY;\n+\n+\tresult = vlan_action(vsi, &tmp_list);\n+\tice_fltr_free_list(ice_pf_to_dev(vsi->back), &tmp_list);\n+\treturn result;\n+}\n+\n+/**\n+ * ice_fltr_prepare_eth - add or remove ethertype filter\n+ * @vsi: pointer to VSI struct\n+ * @ethertype: ethertype of packet to be filtered\n+ * @flag: direction of packet, Tx or Rx\n+ * @action: action to be performed on filter match\n+ * @eth_action: pointer to add or remove ethertype function\n+ */\n+static enum ice_status\n+ice_fltr_prepare_eth(struct ice_vsi *vsi, u16 ethertype, u16 flag,\n+\t\t     enum ice_sw_fwd_act_type action,\n+\t\t     enum ice_status (*eth_action)(struct ice_vsi *,\n+\t\t\t\t\t\t   struct list_head *))\n+{\n+\tenum ice_status result;\n+\tLIST_HEAD(tmp_list);\n+\n+\tif (ice_fltr_add_eth_to_list(vsi, &tmp_list, ethertype, flag, action))\n+\t\treturn ICE_ERR_NO_MEMORY;\n+\n+\tresult = eth_action(vsi, &tmp_list);\n+\tice_fltr_free_list(ice_pf_to_dev(vsi->back), &tmp_list);\n+\treturn result;\n+}\n+\n+/**\n+ * ice_fltr_add_mac - add single MAC filter\n+ * @vsi: pointer to VSI struct\n+ * @mac: MAC to add\n+ * @action: action to be performed on filter match\n+ */\n+enum ice_status ice_fltr_add_mac(struct ice_vsi *vsi, const u8 *mac,\n+\t\t\t\t enum ice_sw_fwd_act_type action)\n+{\n+\treturn ice_fltr_prepare_mac(vsi, mac, action, ice_fltr_add_mac_list);\n+}\n+\n+/**\n+ * ice_fltr_add_mac_and_broadcast - add single MAC and broadcast\n+ * @vsi: pointer to VSI struct\n+ * @mac: MAC to add\n+ * @action: action to be performed on filter match\n+ */\n+enum ice_status\n+ice_fltr_add_mac_and_broadcast(struct ice_vsi *vsi, const u8 *mac,\n+\t\t\t       enum ice_sw_fwd_act_type action)\n+{\n+\treturn ice_fltr_prepare_mac_and_broadcast(vsi, mac, action,\n+\t\t\t\t\t\t  ice_fltr_add_mac_list);\n+}\n+\n+/**\n+ * ice_fltr_remove_mac - remove MAC filter\n+ * @vsi: pointer to VSI struct\n+ * @mac: filter MAC to remove\n+ * @action: action to remove\n+ */\n+enum ice_status ice_fltr_remove_mac(struct ice_vsi *vsi, const u8 *mac,\n+\t\t\t\t    enum ice_sw_fwd_act_type action)\n+{\n+\treturn ice_fltr_prepare_mac(vsi, mac, action, ice_fltr_remove_mac_list);\n+}\n+\n+/**\n+ * ice_fltr_add_vlan - add single VLAN filter\n+ * @vsi: pointer to VSI struct\n+ * @vlan_id: VLAN ID to add\n+ * @action: action to be performed on filter match\n+ */\n+enum ice_status ice_fltr_add_vlan(struct ice_vsi *vsi, u16 vlan_id,\n+\t\t\t\t  enum ice_sw_fwd_act_type action)\n+{\n+\treturn ice_fltr_prepare_vlan(vsi, vlan_id, action,\n+\t\t\t\t     ice_fltr_add_vlan_list);\n+}\n+\n+/**\n+ * ice_fltr_remove_vlan - remove VLAN filter\n+ * @vsi: pointer to VSI struct\n+ * @vlan_id: filter VLAN to remove\n+ * @action: action to remove\n+ */\n+enum ice_status ice_fltr_remove_vlan(struct ice_vsi *vsi, u16 vlan_id,\n+\t\t\t\t     enum ice_sw_fwd_act_type action)\n+{\n+\treturn ice_fltr_prepare_vlan(vsi, vlan_id, action,\n+\t\t\t\t     ice_fltr_remove_vlan_list);\n+}\n+\n+/**\n+ * ice_fltr_add_eth - add specyfic ethertype filter\n+ * @vsi: pointer to VSI struct\n+ * @ethertype: ethertype of filter\n+ * @flag: direction of packet to be filtered, Tx or Rx\n+ * @action: action to be performed on filter match\n+ */\n+enum ice_status ice_fltr_add_eth(struct ice_vsi *vsi, u16 ethertype, u16 flag,\n+\t\t\t\t enum ice_sw_fwd_act_type action)\n+{\n+\treturn ice_fltr_prepare_eth(vsi, ethertype, flag, action,\n+\t\t\t\t    ice_fltr_add_eth_list);\n+}\n+\n+/**\n+ * ice_fltr_remove_eth - remove ethertype filter\n+ * @vsi: pointer to VSI struct\n+ * @ethertype: ethertype of filter\n+ * @flag: direction of filter\n+ * @action: action to remove\n+ */\n+enum ice_status ice_fltr_remove_eth(struct ice_vsi *vsi, u16 ethertype,\n+\t\t\t\t    u16 flag, enum ice_sw_fwd_act_type action)\n+{\n+\treturn ice_fltr_prepare_eth(vsi, ethertype, flag, action,\n+\t\t\t\t    ice_fltr_remove_eth_list);\n+}\ndiff --git a/drivers/net/ethernet/intel/ice/ice_fltr.h b/drivers/net/ethernet/intel/ice/ice_fltr.h\nnew file mode 100644\nindex 000000000000..ca8f97c39a02\n--- /dev/null\n+++ b/drivers/net/ethernet/intel/ice/ice_fltr.h\n@@ -0,0 +1,39 @@\n+/* SPDX-License-Identifier: GPL-2.0 */\n+/* Copyright (C) 2018-2019, Intel Corporation. */\n+\n+#ifndef _ICE_FLTR_H_\n+#define _ICE_FLTR_H_\n+\n+void ice_fltr_free_list(struct device *dev, struct list_head *h);\n+enum ice_status\n+ice_fltr_add_mac_to_list(struct ice_vsi *vsi, struct list_head *list,\n+\t\t\t const u8 *mac, enum ice_sw_fwd_act_type action);\n+enum ice_status\n+ice_fltr_add_mac(struct ice_vsi *vsi, const u8 *mac,\n+\t\t enum ice_sw_fwd_act_type action);\n+enum ice_status\n+ice_fltr_add_mac_and_broadcast(struct ice_vsi *vsi, const u8 *mac,\n+\t\t\t       enum ice_sw_fwd_act_type action);\n+enum ice_status\n+ice_fltr_add_mac_list(struct ice_vsi *vsi, struct list_head *list);\n+enum ice_status\n+ice_fltr_remove_mac(struct ice_vsi *vsi, const u8 *mac,\n+\t\t    enum ice_sw_fwd_act_type action);\n+enum ice_status\n+ice_fltr_remove_mac_list(struct ice_vsi *vsi, struct list_head *list);\n+\n+enum ice_status\n+ice_fltr_add_vlan(struct ice_vsi *vsi, u16 vid,\n+\t\t  enum ice_sw_fwd_act_type action);\n+enum ice_status\n+ice_fltr_remove_vlan(struct ice_vsi *vsi, u16 vid,\n+\t\t     enum ice_sw_fwd_act_type action);\n+\n+enum ice_status\n+ice_fltr_add_eth(struct ice_vsi *vsi, u16 ethertype, u16 flag,\n+\t\t enum ice_sw_fwd_act_type action);\n+enum ice_status\n+ice_fltr_remove_eth(struct ice_vsi *vsi, u16 ethertype, u16 flag,\n+\t\t    enum ice_sw_fwd_act_type action);\n+void ice_fltr_remove_all(struct ice_vsi *vsi);\n+#endif\ndiff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c\nindex fa029cda750f..6e23a87b75ed 100644\n--- a/drivers/net/ethernet/intel/ice/ice_lib.c\n+++ b/drivers/net/ethernet/intel/ice/ice_lib.c\n@@ -5,6 +5,7 @@\n #include \"ice_base.h\"\n #include \"ice_flow.h\"\n #include \"ice_lib.h\"\n+#include \"ice_fltr.h\"\n #include \"ice_dcb_lib.h\"\n \n /**\n@@ -1350,40 +1351,6 @@ static void ice_vsi_set_rss_flow_fld(struct ice_vsi *vsi)\n \t\t\tvsi_num, ice_stat_str(status));\n }\n \n-/**\n- * ice_add_mac_to_list - Add a MAC address filter entry to the list\n- * @vsi: the VSI to be forwarded to\n- * @add_list: pointer to the list which contains MAC filter entries\n- * @macaddr: the MAC address to be added.\n- *\n- * Adds MAC address filter entry to the temp list\n- *\n- * Returns 0 on success or ENOMEM on failure.\n- */\n-int\n-ice_add_mac_to_list(struct ice_vsi *vsi, struct list_head *add_list,\n-\t\t    const u8 *macaddr)\n-{\n-\tstruct ice_fltr_list_entry *tmp;\n-\tstruct ice_pf *pf = vsi->back;\n-\n-\ttmp = devm_kzalloc(ice_pf_to_dev(pf), sizeof(*tmp), GFP_ATOMIC);\n-\tif (!tmp)\n-\t\treturn -ENOMEM;\n-\n-\ttmp->fltr_info.flag = ICE_FLTR_TX;\n-\ttmp->fltr_info.src_id = ICE_SRC_ID_VSI;\n-\ttmp->fltr_info.lkup_type = ICE_SW_LKUP_MAC;\n-\ttmp->fltr_info.fltr_act = ICE_FWD_TO_VSI;\n-\ttmp->fltr_info.vsi_handle = vsi->idx;\n-\tether_addr_copy(tmp->fltr_info.l_data.mac.mac_addr, macaddr);\n-\n-\tINIT_LIST_HEAD(&tmp->list_entry);\n-\tlist_add(&tmp->list_entry, add_list);\n-\n-\treturn 0;\n-}\n-\n /**\n  * ice_pf_state_is_nominal - checks the PF for nominal state\n  * @pf: pointer to PF to check\n@@ -1454,55 +1421,22 @@ void ice_update_eth_stats(struct ice_vsi *vsi)\n \tvsi->stat_offsets_loaded = true;\n }\n \n-/**\n- * ice_free_fltr_list - free filter lists helper\n- * @dev: pointer to the device struct\n- * @h: pointer to the list head to be freed\n- *\n- * Helper function to free filter lists previously created using\n- * ice_add_mac_to_list\n- */\n-void ice_free_fltr_list(struct device *dev, struct list_head *h)\n-{\n-\tstruct ice_fltr_list_entry *e, *tmp;\n-\n-\tlist_for_each_entry_safe(e, tmp, h, list_entry) {\n-\t\tlist_del(&e->list_entry);\n-\t\tdevm_kfree(dev, e);\n-\t}\n-}\n-\n /**\n  * ice_vsi_add_vlan - Add VSI membership for given VLAN\n  * @vsi: the VSI being configured\n  * @vid: VLAN ID to be added\n+ * @action: filter action to be performed on match\n  */\n-int ice_vsi_add_vlan(struct ice_vsi *vsi, u16 vid)\n+int\n+ice_vsi_add_vlan(struct ice_vsi *vsi, u16 vid, enum ice_sw_fwd_act_type action)\n {\n-\tstruct ice_fltr_list_entry *tmp;\n \tstruct ice_pf *pf = vsi->back;\n-\tLIST_HEAD(tmp_add_list);\n-\tenum ice_status status;\n \tstruct device *dev;\n \tint err = 0;\n \n \tdev = ice_pf_to_dev(pf);\n-\ttmp = devm_kzalloc(dev, sizeof(*tmp), GFP_KERNEL);\n-\tif (!tmp)\n-\t\treturn -ENOMEM;\n-\n-\ttmp->fltr_info.lkup_type = ICE_SW_LKUP_VLAN;\n-\ttmp->fltr_info.fltr_act = ICE_FWD_TO_VSI;\n-\ttmp->fltr_info.flag = ICE_FLTR_TX;\n-\ttmp->fltr_info.src_id = ICE_SRC_ID_VSI;\n-\ttmp->fltr_info.vsi_handle = vsi->idx;\n-\ttmp->fltr_info.l_data.vlan.vlan_id = vid;\n-\n-\tINIT_LIST_HEAD(&tmp->list_entry);\n-\tlist_add(&tmp->list_entry, &tmp_add_list);\n \n-\tstatus = ice_add_vlan(&pf->hw, &tmp_add_list);\n-\tif (!status) {\n+\tif (!ice_fltr_add_vlan(vsi, vid, action)) {\n \t\tvsi->num_vlan++;\n \t} else {\n \t\terr = -ENODEV;\n@@ -1510,7 +1444,6 @@ int ice_vsi_add_vlan(struct ice_vsi *vsi, u16 vid)\n \t\t\tvsi->vsi_num);\n \t}\n \n-\tice_free_fltr_list(dev, &tmp_add_list);\n \treturn err;\n }\n \n@@ -1523,29 +1456,14 @@ int ice_vsi_add_vlan(struct ice_vsi *vsi, u16 vid)\n  */\n int ice_vsi_kill_vlan(struct ice_vsi *vsi, u16 vid)\n {\n-\tstruct ice_fltr_list_entry *list;\n \tstruct ice_pf *pf = vsi->back;\n-\tLIST_HEAD(tmp_add_list);\n \tenum ice_status status;\n \tstruct device *dev;\n \tint err = 0;\n \n \tdev = ice_pf_to_dev(pf);\n-\tlist = devm_kzalloc(dev, sizeof(*list), GFP_KERNEL);\n-\tif (!list)\n-\t\treturn -ENOMEM;\n-\n-\tlist->fltr_info.lkup_type = ICE_SW_LKUP_VLAN;\n-\tlist->fltr_info.vsi_handle = vsi->idx;\n-\tlist->fltr_info.fltr_act = ICE_FWD_TO_VSI;\n-\tlist->fltr_info.l_data.vlan.vlan_id = vid;\n-\tlist->fltr_info.flag = ICE_FLTR_TX;\n-\tlist->fltr_info.src_id = ICE_SRC_ID_VSI;\n \n-\tINIT_LIST_HEAD(&list->list_entry);\n-\tlist_add(&list->list_entry, &tmp_add_list);\n-\n-\tstatus = ice_remove_vlan(&pf->hw, &tmp_add_list);\n+\tstatus = ice_fltr_remove_vlan(vsi, vid, ICE_FWD_TO_VSI);\n \tif (!status) {\n \t\tvsi->num_vlan--;\n \t} else if (status == ICE_ERR_DOES_NOT_EXIST) {\n@@ -1557,7 +1475,6 @@ int ice_vsi_kill_vlan(struct ice_vsi *vsi, u16 vid)\n \t\terr = -EIO;\n \t}\n \n-\tice_free_fltr_list(dev, &tmp_add_list);\n \treturn err;\n }\n \n@@ -2033,47 +1950,6 @@ ice_vsi_set_q_vectors_reg_idx(struct ice_vsi *vsi)\n \treturn -EINVAL;\n }\n \n-/**\n- * ice_vsi_add_rem_eth_mac - Program VSI ethertype based filter with rule\n- * @vsi: the VSI being configured\n- * @add_rule: boolean value to add or remove ethertype filter rule\n- */\n-static void\n-ice_vsi_add_rem_eth_mac(struct ice_vsi *vsi, bool add_rule)\n-{\n-\tstruct ice_fltr_list_entry *list;\n-\tstruct ice_pf *pf = vsi->back;\n-\tLIST_HEAD(tmp_add_list);\n-\tenum ice_status status;\n-\tstruct device *dev;\n-\n-\tdev = ice_pf_to_dev(pf);\n-\tlist = devm_kzalloc(dev, sizeof(*list), GFP_KERNEL);\n-\tif (!list)\n-\t\treturn;\n-\n-\tlist->fltr_info.lkup_type = ICE_SW_LKUP_ETHERTYPE;\n-\tlist->fltr_info.fltr_act = ICE_DROP_PACKET;\n-\tlist->fltr_info.flag = ICE_FLTR_TX;\n-\tlist->fltr_info.src_id = ICE_SRC_ID_VSI;\n-\tlist->fltr_info.vsi_handle = vsi->idx;\n-\tlist->fltr_info.l_data.ethertype_mac.ethertype = vsi->ethtype;\n-\n-\tINIT_LIST_HEAD(&list->list_entry);\n-\tlist_add(&list->list_entry, &tmp_add_list);\n-\n-\tif (add_rule)\n-\t\tstatus = ice_add_eth_mac(&pf->hw, &tmp_add_list);\n-\telse\n-\t\tstatus = ice_remove_eth_mac(&pf->hw, &tmp_add_list);\n-\n-\tif (status)\n-\t\tdev_err(dev, \"Failure Adding or Removing Ethertype on VSI %i error: %s\\n\",\n-\t\t\tvsi->vsi_num, ice_stat_str(status));\n-\n-\tice_free_fltr_list(dev, &tmp_add_list);\n-}\n-\n /**\n  * ice_cfg_sw_lldp - Config switch rules for LLDP packet handling\n  * @vsi: the VSI being configured\n@@ -2082,45 +1958,25 @@ ice_vsi_add_rem_eth_mac(struct ice_vsi *vsi, bool add_rule)\n  */\n void ice_cfg_sw_lldp(struct ice_vsi *vsi, bool tx, bool create)\n {\n-\tstruct ice_fltr_list_entry *list;\n+\tenum ice_status (*eth_fltr)(struct ice_vsi *v, u16 type, u16 flag,\n+\t\t\t\t    enum ice_sw_fwd_act_type act);\n \tstruct ice_pf *pf = vsi->back;\n-\tLIST_HEAD(tmp_add_list);\n \tenum ice_status status;\n \tstruct device *dev;\n \n \tdev = ice_pf_to_dev(pf);\n-\tlist = devm_kzalloc(dev, sizeof(*list), GFP_KERNEL);\n-\tif (!list)\n-\t\treturn;\n-\n-\tlist->fltr_info.lkup_type = ICE_SW_LKUP_ETHERTYPE;\n-\tlist->fltr_info.vsi_handle = vsi->idx;\n-\tlist->fltr_info.l_data.ethertype_mac.ethertype = ETH_P_LLDP;\n+\teth_fltr = create ? ice_fltr_add_eth : ice_fltr_remove_eth;\n \n-\tif (tx) {\n-\t\tlist->fltr_info.fltr_act = ICE_DROP_PACKET;\n-\t\tlist->fltr_info.flag = ICE_FLTR_TX;\n-\t\tlist->fltr_info.src_id = ICE_SRC_ID_VSI;\n-\t} else {\n-\t\tlist->fltr_info.fltr_act = ICE_FWD_TO_VSI;\n-\t\tlist->fltr_info.flag = ICE_FLTR_RX;\n-\t\tlist->fltr_info.src_id = ICE_SRC_ID_LPORT;\n-\t}\n-\n-\tINIT_LIST_HEAD(&list->list_entry);\n-\tlist_add(&list->list_entry, &tmp_add_list);\n-\n-\tif (create)\n-\t\tstatus = ice_add_eth_mac(&pf->hw, &tmp_add_list);\n+\tif (tx)\n+\t\tstatus = eth_fltr(vsi, ETH_P_LLDP, ICE_FLTR_TX,\n+\t\t\t\t  ICE_DROP_PACKET);\n \telse\n-\t\tstatus = ice_remove_eth_mac(&pf->hw, &tmp_add_list);\n+\t\tstatus = eth_fltr(vsi, ETH_P_LLDP, ICE_FLTR_RX, ICE_FWD_TO_VSI);\n \n \tif (status)\n \t\tdev_err(dev, \"Fail %s %s LLDP rule on VSI %i error: %s\\n\",\n \t\t\tcreate ? \"adding\" : \"removing\", tx ? \"TX\" : \"RX\",\n \t\t\tvsi->vsi_num, ice_stat_str(status));\n-\n-\tice_free_fltr_list(dev, &tmp_add_list);\n }\n \n /**\n@@ -2207,7 +2063,7 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi,\n \t\t * so this handles those cases (i.e. adding the PF to a bridge\n \t\t * without the 8021q module loaded).\n \t\t */\n-\t\tret = ice_vsi_add_vlan(vsi, 0);\n+\t\tret = ice_vsi_add_vlan(vsi, 0, ICE_FWD_TO_VSI);\n \t\tif (ret)\n \t\t\tgoto unroll_clear_rings;\n \n@@ -2282,9 +2138,8 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi,\n \t */\n \tif (!ice_is_safe_mode(pf))\n \t\tif (vsi->type == ICE_VSI_PF) {\n-\t\t\tice_vsi_add_rem_eth_mac(vsi, true);\n-\n-\t\t\t/* Tx LLDP packets */\n+\t\t\tice_fltr_add_eth(vsi, ETH_P_PAUSE, ICE_FLTR_TX,\n+\t\t\t\t\t ICE_DROP_PACKET);\n \t\t\tice_cfg_sw_lldp(vsi, true, true);\n \t\t}\n \n@@ -2616,7 +2471,8 @@ int ice_vsi_release(struct ice_vsi *vsi)\n \n \tif (!ice_is_safe_mode(pf)) {\n \t\tif (vsi->type == ICE_VSI_PF) {\n-\t\t\tice_vsi_add_rem_eth_mac(vsi, false);\n+\t\t\tice_fltr_remove_eth(vsi, ETH_P_PAUSE, ICE_FLTR_TX,\n+\t\t\t\t\t    ICE_DROP_PACKET);\n \t\t\tice_cfg_sw_lldp(vsi, true, false);\n \t\t\t/* The Rx rule will only exist to remove if the LLDP FW\n \t\t\t * engine is currently stopped\n@@ -2626,7 +2482,7 @@ int ice_vsi_release(struct ice_vsi *vsi)\n \t\t}\n \t}\n \n-\tice_remove_vsi_fltr(&pf->hw, vsi->idx);\n+\tice_fltr_remove_all(vsi);\n \tice_rm_vsi_lan_cfg(vsi->port_info, vsi->idx);\n \tice_vsi_delete(vsi);\n \tice_vsi_free_q_vectors(vsi);\n@@ -3042,36 +2898,6 @@ void ice_update_rx_ring_stats(struct ice_ring *rx_ring, u64 pkts, u64 bytes)\n \tu64_stats_update_end(&rx_ring->syncp);\n }\n \n-/**\n- * ice_vsi_cfg_mac_fltr - Add or remove a MAC address filter for a VSI\n- * @vsi: the VSI being configured MAC filter\n- * @macaddr: the MAC address to be added.\n- * @set: Add or delete a MAC filter\n- *\n- * Adds or removes MAC address filter entry for VF VSI\n- */\n-enum ice_status\n-ice_vsi_cfg_mac_fltr(struct ice_vsi *vsi, const u8 *macaddr, bool set)\n-{\n-\tLIST_HEAD(tmp_add_list);\n-\tenum ice_status status;\n-\n-\t /* Update MAC filter list to be added or removed for a VSI */\n-\tif (ice_add_mac_to_list(vsi, &tmp_add_list, macaddr)) {\n-\t\tstatus = ICE_ERR_NO_MEMORY;\n-\t\tgoto cfg_mac_fltr_exit;\n-\t}\n-\n-\tif (set)\n-\t\tstatus = ice_add_mac(&vsi->back->hw, &tmp_add_list);\n-\telse\n-\t\tstatus = ice_remove_mac(&vsi->back->hw, &tmp_add_list);\n-\n-cfg_mac_fltr_exit:\n-\tice_free_fltr_list(ice_pf_to_dev(vsi->back), &tmp_add_list);\n-\treturn status;\n-}\n-\n /**\n  * ice_is_dflt_vsi_in_use - check if the default forwarding VSI is being used\n  * @sw: switch to check if its default forwarding VSI is free\ndiff --git a/drivers/net/ethernet/intel/ice/ice_lib.h b/drivers/net/ethernet/intel/ice/ice_lib.h\nindex f77ddd6883c3..c9e1aaea55f7 100644\n--- a/drivers/net/ethernet/intel/ice/ice_lib.h\n+++ b/drivers/net/ethernet/intel/ice/ice_lib.h\n@@ -8,12 +8,6 @@\n \n const char *ice_vsi_type_str(enum ice_vsi_type vsi_type);\n \n-int\n-ice_add_mac_to_list(struct ice_vsi *vsi, struct list_head *add_list,\n-\t\t    const u8 *macaddr);\n-\n-void ice_free_fltr_list(struct device *dev, struct list_head *h);\n-\n bool ice_pf_state_is_nominal(struct ice_pf *pf);\n \n void ice_update_eth_stats(struct ice_vsi *vsi);\n@@ -24,7 +18,8 @@ int ice_vsi_cfg_lan_txqs(struct ice_vsi *vsi);\n \n void ice_vsi_cfg_msix(struct ice_vsi *vsi);\n \n-int ice_vsi_add_vlan(struct ice_vsi *vsi, u16 vid);\n+int\n+ice_vsi_add_vlan(struct ice_vsi *vsi, u16 vid, enum ice_sw_fwd_act_type action);\n \n int ice_vsi_kill_vlan(struct ice_vsi *vsi, u16 vid);\n \ndiff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c\nindex 0216f295c7ca..99fa36f35a4f 100644\n--- a/drivers/net/ethernet/intel/ice/ice_main.c\n+++ b/drivers/net/ethernet/intel/ice/ice_main.c\n@@ -9,6 +9,7 @@\n #include \"ice.h\"\n #include \"ice_base.h\"\n #include \"ice_lib.h\"\n+#include \"ice_fltr.h\"\n #include \"ice_dcb_lib.h\"\n #include \"ice_dcb_nl.h\"\n #include \"ice_devlink.h\"\n@@ -134,32 +135,18 @@ static void ice_check_for_hang_subtask(struct ice_pf *pf)\n static int ice_init_mac_fltr(struct ice_pf *pf)\n {\n \tenum ice_status status;\n-\tu8 broadcast[ETH_ALEN];\n \tstruct ice_vsi *vsi;\n+\tu8 *perm_addr;\n \n \tvsi = ice_get_main_vsi(pf);\n \tif (!vsi)\n \t\treturn -EINVAL;\n \n-\t/* To add a MAC filter, first add the MAC to a list and then\n-\t * pass the list to ice_add_mac.\n-\t */\n-\n-\t /* Add a unicast MAC filter so the VSI can get its packets */\n-\tstatus = ice_vsi_cfg_mac_fltr(vsi, vsi->port_info->mac.perm_addr, true);\n-\tif (status)\n-\t\tgoto unregister;\n-\n-\t/* VSI needs to receive broadcast traffic, so add the broadcast\n-\t * MAC address to the list as well.\n-\t */\n-\teth_broadcast_addr(broadcast);\n-\tstatus = ice_vsi_cfg_mac_fltr(vsi, broadcast, true);\n-\tif (status)\n-\t\tgoto unregister;\n+\tperm_addr = vsi->port_info->mac.perm_addr;\n+\tstatus = ice_fltr_add_mac_and_broadcast(vsi, perm_addr, ICE_FWD_TO_VSI);\n+\tif (!status)\n+\t\treturn 0;\n \n-\treturn 0;\n-unregister:\n \t/* We aren't useful with no MAC filters, so unregister if we\n \t * had an error\n \t */\n@@ -189,7 +176,8 @@ static int ice_add_mac_to_sync_list(struct net_device *netdev, const u8 *addr)\n \tstruct ice_netdev_priv *np = netdev_priv(netdev);\n \tstruct ice_vsi *vsi = np->vsi;\n \n-\tif (ice_add_mac_to_list(vsi, &vsi->tmp_sync_list, addr))\n+\tif (ice_fltr_add_mac_to_list(vsi, &vsi->tmp_sync_list, addr,\n+\t\t\t\t     ICE_FWD_TO_VSI))\n \t\treturn -EINVAL;\n \n \treturn 0;\n@@ -210,7 +198,8 @@ static int ice_add_mac_to_unsync_list(struct net_device *netdev, const u8 *addr)\n \tstruct ice_netdev_priv *np = netdev_priv(netdev);\n \tstruct ice_vsi *vsi = np->vsi;\n \n-\tif (ice_add_mac_to_list(vsi, &vsi->tmp_unsync_list, addr))\n+\tif (ice_fltr_add_mac_to_list(vsi, &vsi->tmp_unsync_list, addr,\n+\t\t\t\t     ICE_FWD_TO_VSI))\n \t\treturn -EINVAL;\n \n \treturn 0;\n@@ -308,8 +297,8 @@ static int ice_vsi_sync_fltr(struct ice_vsi *vsi)\n \t}\n \n \t/* Remove MAC addresses in the unsync list */\n-\tstatus = ice_remove_mac(hw, &vsi->tmp_unsync_list);\n-\tice_free_fltr_list(dev, &vsi->tmp_unsync_list);\n+\tstatus = ice_fltr_remove_mac_list(vsi, &vsi->tmp_unsync_list);\n+\tice_fltr_free_list(dev, &vsi->tmp_unsync_list);\n \tif (status) {\n \t\tnetdev_err(netdev, \"Failed to delete MAC filters\\n\");\n \t\t/* if we failed because of alloc failures, just bail */\n@@ -320,8 +309,8 @@ static int ice_vsi_sync_fltr(struct ice_vsi *vsi)\n \t}\n \n \t/* Add MAC addresses in the sync list */\n-\tstatus = ice_add_mac(hw, &vsi->tmp_sync_list);\n-\tice_free_fltr_list(dev, &vsi->tmp_sync_list);\n+\tstatus = ice_fltr_add_mac_list(vsi, &vsi->tmp_sync_list);\n+\tice_fltr_free_list(dev, &vsi->tmp_sync_list);\n \t/* If filter is added successfully or already exists, do not go into\n \t * 'if' condition and report it as error. Instead continue processing\n \t * rest of the function.\n@@ -2528,7 +2517,7 @@ ice_vlan_rx_add_vid(struct net_device *netdev, __always_unused __be16 proto,\n \t/* Add a switch rule for this VLAN ID so its corresponding VLAN tagged\n \t * packets aren't pruned by the device's internal switch on Rx\n \t */\n-\tret = ice_vsi_add_vlan(vsi, vid);\n+\tret = ice_vsi_add_vlan(vsi, vid, ICE_FWD_TO_VSI);\n \tif (!ret) {\n \t\tvsi->vlan_ena = true;\n \t\tset_bit(ICE_VSI_FLAG_VLAN_FLTR_CHANGED, vsi->flags);\n@@ -3782,20 +3771,14 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)\n \t\treturn -EBUSY;\n \t}\n \n-\t/* When we change the MAC address we also have to change the MAC address\n-\t * based filter rules that were created previously for the old MAC\n-\t * address. So first, we remove the old filter rule using ice_remove_mac\n-\t * and then create a new filter rule using ice_add_mac via\n-\t * ice_vsi_cfg_mac_fltr function call for both add and/or remove\n-\t * filters.\n-\t */\n-\tstatus = ice_vsi_cfg_mac_fltr(vsi, netdev->dev_addr, false);\n+\t/* Clean up old MAC filter before changing the MAC address */\n+\tstatus = ice_fltr_remove_mac(vsi, netdev->dev_addr, ICE_FWD_TO_VSI);\n \tif (status) {\n \t\terr = -EADDRNOTAVAIL;\n \t\tgoto err_update_filters;\n \t}\n \n-\tstatus = ice_vsi_cfg_mac_fltr(vsi, mac, true);\n+\tstatus = ice_fltr_add_mac(vsi, mac, ICE_FWD_TO_VSI);\n \tif (status) {\n \t\terr = -EADDRNOTAVAIL;\n \t\tgoto err_update_filters;\ndiff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c\nindex 9aa02f74e88c..a046bd3431c6 100644\n--- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c\n+++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c\n@@ -4,6 +4,7 @@\n #include \"ice.h\"\n #include \"ice_base.h\"\n #include \"ice_lib.h\"\n+#include \"ice_fltr.h\"\n \n /**\n  * ice_validate_vf_id - helper to check if VF ID is valid\n@@ -548,7 +549,6 @@ static int ice_calc_vf_first_vector_idx(struct ice_pf *pf, struct ice_vf *vf)\n static int ice_alloc_vsi_res(struct ice_vf *vf)\n {\n \tstruct ice_pf *pf = vf->pf;\n-\tLIST_HEAD(tmp_add_list);\n \tu8 broadcast[ETH_ALEN];\n \tstruct ice_vsi *vsi;\n \tstruct device *dev;\n@@ -570,7 +570,8 @@ static int ice_alloc_vsi_res(struct ice_vf *vf)\n \t/* Check if port VLAN exist before, and restore it accordingly */\n \tif (vf->port_vlan_info) {\n \t\tice_vsi_manage_pvid(vsi, vf->port_vlan_info, true);\n-\t\tif (ice_vsi_add_vlan(vsi, vf->port_vlan_info & VLAN_VID_MASK))\n+\t\tif (ice_vsi_add_vlan(vsi, vf->port_vlan_info & VLAN_VID_MASK,\n+\t\t\t\t     ICE_FWD_TO_VSI))\n \t\t\tdev_warn(ice_pf_to_dev(pf), \"Failed to add Port VLAN %d filter for VF %d\\n\",\n \t\t\t\t vf->port_vlan_info & VLAN_VID_MASK, vf->vf_id);\n \t} else {\n@@ -579,27 +580,23 @@ static int ice_alloc_vsi_res(struct ice_vf *vf)\n \t\t * untagged broadcast/multicast traffic seen on the VF\n \t\t * interface.\n \t\t */\n-\t\tif (ice_vsi_add_vlan(vsi, 0))\n+\t\tif (ice_vsi_add_vlan(vsi, 0, ICE_FWD_TO_VSI))\n \t\t\tdev_warn(ice_pf_to_dev(pf), \"Failed to add VLAN 0 filter for VF %d, MDD events will trigger. Reset the VF, disable spoofchk, or enable 8021q module on the guest\\n\",\n \t\t\t\t vf->vf_id);\n \t}\n \n-\teth_broadcast_addr(broadcast);\n-\n-\tstatus = ice_add_mac_to_list(vsi, &tmp_add_list, broadcast);\n-\tif (status)\n-\t\tgoto ice_alloc_vsi_res_exit;\n-\n \tif (is_valid_ether_addr(vf->dflt_lan_addr.addr)) {\n-\t\tstatus = ice_add_mac_to_list(vsi, &tmp_add_list,\n-\t\t\t\t\t     vf->dflt_lan_addr.addr);\n+\t\tstatus = ice_fltr_add_mac(vsi, vf->dflt_lan_addr.addr,\n+\t\t\t\t\t  ICE_FWD_TO_VSI);\n \t\tif (status)\n \t\t\tgoto ice_alloc_vsi_res_exit;\n \t}\n \n-\tstatus = ice_add_mac(&pf->hw, &tmp_add_list);\n+\teth_broadcast_addr(broadcast);\n+\tstatus = ice_fltr_add_mac(vsi, broadcast, ICE_FWD_TO_VSI);\n \tif (status)\n-\t\tdev_err(dev, \"could not add mac filters error %d\\n\", status);\n+\t\tdev_err(dev, \"could not add mac filters error %d\\n\",\n+\t\t\tstatus);\n \telse\n \t\tvf->num_mac = 1;\n \n@@ -610,7 +607,6 @@ static int ice_alloc_vsi_res(struct ice_vf *vf)\n \t * more vectors.\n \t */\n ice_alloc_vsi_res_exit:\n-\tice_free_fltr_list(dev, &tmp_add_list);\n \treturn status;\n }\n \n@@ -2781,7 +2777,7 @@ ice_vc_add_mac_addr(struct ice_vf *vf, struct ice_vsi *vsi, u8 *mac_addr)\n \t\treturn -EPERM;\n \t}\n \n-\tstatus = ice_vsi_cfg_mac_fltr(vsi, mac_addr, true);\n+\tstatus = ice_fltr_add_mac(vsi, mac_addr, ICE_FWD_TO_VSI);\n \tif (status == ICE_ERR_ALREADY_EXISTS) {\n \t\tdev_err(dev, \"MAC %pM already exists for VF %d\\n\", mac_addr,\n \t\t\tvf->vf_id);\n@@ -2818,7 +2814,7 @@ ice_vc_del_mac_addr(struct ice_vf *vf, struct ice_vsi *vsi, u8 *mac_addr)\n \t    ether_addr_equal(mac_addr, vf->dflt_lan_addr.addr))\n \t\treturn 0;\n \n-\tstatus = ice_vsi_cfg_mac_fltr(vsi, mac_addr, false);\n+\tstatus = ice_fltr_remove_mac(vsi, mac_addr, ICE_FWD_TO_VSI);\n \tif (status == ICE_ERR_DOES_NOT_EXIST) {\n \t\tdev_err(dev, \"MAC %pM does not exist for VF %d\\n\", mac_addr,\n \t\t\tvf->vf_id);\n@@ -3062,7 +3058,7 @@ ice_set_vf_port_vlan(struct net_device *netdev, int vf_id, u16 vlan_id, u8 qos,\n \t\t/* add VLAN 0 filter back when transitioning from port VLAN to\n \t\t * no port VLAN. No change to old port VLAN on failure.\n \t\t */\n-\t\tret = ice_vsi_add_vlan(vsi, 0);\n+\t\tret = ice_vsi_add_vlan(vsi, 0, ICE_FWD_TO_VSI);\n \t\tif (ret)\n \t\t\treturn ret;\n \t\tret = ice_vsi_manage_pvid(vsi, 0, false);\n@@ -3075,7 +3071,7 @@ ice_set_vf_port_vlan(struct net_device *netdev, int vf_id, u16 vlan_id, u8 qos,\n \t\t\t vlan_id, qos, vf_id);\n \n \t\t/* add VLAN filter for the port VLAN */\n-\t\tret = ice_vsi_add_vlan(vsi, vlan_id);\n+\t\tret = ice_vsi_add_vlan(vsi, vlan_id, ICE_FWD_TO_VSI);\n \t\tif (ret)\n \t\t\treturn ret;\n \t}\n@@ -3196,7 +3192,7 @@ static int ice_vc_process_vlan_msg(struct ice_vf *vf, u8 *msg, bool add_v)\n \t\t\tif (!vid)\n \t\t\t\tcontinue;\n \n-\t\t\tstatus = ice_vsi_add_vlan(vsi, vid);\n+\t\t\tstatus = ice_vsi_add_vlan(vsi, vid, ICE_FWD_TO_VSI);\n \t\t\tif (status) {\n \t\t\t\tv_ret = VIRTCHNL_STATUS_ERR_PARAM;\n \t\t\t\tgoto error_param;\n",
    "prefixes": [
        "S41",
        "10/15"
    ]
}