Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/815343/?format=api
{ "id": 815343, "url": "http://patchwork.ozlabs.org/api/patches/815343/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170919080020.5870-3-jiri@resnulli.us/", "project": { "id": 7, "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api", "name": "Linux network development", "link_name": "netdev", "list_id": "netdev.vger.kernel.org", "list_email": "netdev@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170919080020.5870-3-jiri@resnulli.us>", "list_archive_url": null, "date": "2017-09-19T08:00:09", "name": "[net-next,02/13] mlxsw: spectrum: Move ACL flexible actions instance to spectrum", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "67dc11a4cd81e1744f7e032962aeb264712b005a", "submitter": { "id": 15321, "url": "http://patchwork.ozlabs.org/api/people/15321/?format=api", "name": "Jiri Pirko", "email": "jiri@resnulli.us" }, "delegate": { "id": 34, "url": "http://patchwork.ozlabs.org/api/users/34/?format=api", "username": "davem", "first_name": "David", "last_name": "Miller", "email": "davem@davemloft.net" }, "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/20170919080020.5870-3-jiri@resnulli.us/mbox/", "series": [ { "id": 3798, "url": "http://patchwork.ozlabs.org/api/series/3798/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=3798", "date": "2017-09-19T08:00:07", "name": "mlxsw: Prepare for multicast router offload", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/3798/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/815343/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/815343/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<netdev-owner@vger.kernel.org>", "X-Original-To": "patchwork-incoming@ozlabs.org", "Delivered-To": "patchwork-incoming@ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (2048-bit key;\n\tunprotected) header.d=resnulli-us.20150623.gappssmtp.com\n\theader.i=@resnulli-us.20150623.gappssmtp.com\n\theader.b=\"SpKb76Q6\"; dkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xxFgV55sSz9rxm\n\tfor <patchwork-incoming@ozlabs.org>;\n\tTue, 19 Sep 2017 18:01:10 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751599AbdISIA2 (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tTue, 19 Sep 2017 04:00:28 -0400", "from mail-wr0-f196.google.com ([209.85.128.196]:38205 \"EHLO\n\tmail-wr0-f196.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751227AbdISIAZ (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Tue, 19 Sep 2017 04:00:25 -0400", "by mail-wr0-f196.google.com with SMTP id p37so1700887wrb.5\n\tfor <netdev@vger.kernel.org>; Tue, 19 Sep 2017 01:00:24 -0700 (PDT)", "from localhost (ip-89-177-125-82.net.upcbroadband.cz.\n\t[89.177.125.82]) by smtp.gmail.com with ESMTPSA id\n\tw82sm2402010wme.5.2017.09.19.01.00.23\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tTue, 19 Sep 2017 01:00:23 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=resnulli-us.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=A5qmaBbNgrZd0YBqSC4tMHkuG7hhDyum68B+5ykPVb4=;\n\tb=SpKb76Q6e0QOM+hjW54yU7hkGHB8EBSkO0Av+7s5shk92h/k2iVmLJrDK+Xy+EvkNz\n\txfguvWc7EmJvC5wVP2s865eUqeI22DNlXSMRhtTUqGVMmmY5BMkhf1Za/ZDPohAjCu8O\n\tAZCRToPBAD08mG8FtZy9rwN9kib/+RzU5KFwlOrx53nS1WLfHNTN4jIcVuIBBfn5BI2l\n\tIYikEittTLyTDzUkJqfpSst54+QwLHHQSH/mupp5nBKNthZqIP7lQvbK1MYu5KBDXekY\n\t+ibnyA4B4U8ExD4uM6TNNuL9rMTcYBqaRoH1wrmbBDpPsQkM6rhH++/s9EdRDARLtiLO\n\t3ctg==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=A5qmaBbNgrZd0YBqSC4tMHkuG7hhDyum68B+5ykPVb4=;\n\tb=WJi90OaAfVCHJYXe9I4CmmSxyb/vuYyv9wh2e3oR2bPluBvpUpDtGvX9cksISXDPsy\n\tzLBEGJeAN4joKtWr4X80lsXiuTZeaGUKrAl8sO5zTCPfw3+KD57e0ElAX9U6FHdp19kk\n\tfJjtzCA9+74zeeD7/Oa46/yQ3/eTqnSbHU4Bm2fKvPOzc67zVJ7f3ZYKosgielsLqqwq\n\tNQTrK+Y2JZzmvQERfmLz1e4J6KgQvUunfCgtX/067lkJYvlHl3AnFuPtx31ysBk39UHf\n\tTdm/edgeACuN2NSCfFTIVI5o0mLN1zhKnN8YPGtT87JwbzXIy+UMbVa7wDv38gT5H65Y\n\tgdpA==", "X-Gm-Message-State": "AHPjjUjaXtnletrHhbTHX+Lmv9T6IwLtFxVd7+n5Lw7mBs4vdsPIKZrx\n\tzEBGDcILeOoFZBxe8bMqUimXWG0o", "X-Google-Smtp-Source": "AOwi7QA/6nXa5bV2RS1IAcPRa+WXTb6Eukf6m9Sj7Np92P24SvxF1+fueBuKaimKLwLd4xvZjANB5Q==", "X-Received": "by 10.223.195.37 with SMTP id n34mr534881wrf.219.1505808024069; \n\tTue, 19 Sep 2017 01:00:24 -0700 (PDT)", "From": "Jiri Pirko <jiri@resnulli.us>", "To": "netdev@vger.kernel.org", "Cc": "davem@davemloft.net, yotamg@mellanox.com, idosch@mellanox.com,\n\tmlxsw@mellanox.com", "Subject": "[patch net-next 02/13] mlxsw: spectrum: Move ACL flexible actions\n\tinstance to spectrum", "Date": "Tue, 19 Sep 2017 10:00:09 +0200", "Message-Id": "<20170919080020.5870-3-jiri@resnulli.us>", "X-Mailer": "git-send-email 2.9.5", "In-Reply-To": "<20170919080020.5870-1-jiri@resnulli.us>", "References": "<20170919080020.5870-1-jiri@resnulli.us>", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.org" }, "content": "From: Yotam Gigi <yotamg@mellanox.com>\n\nA flexible action instance allows, given a set of ops, creating, committing\nand sharing a set of ACL action blocks. The flexible action instance in\nquestion is using the spectrum KVD linear space to store the flexible\naction sets.\n\nMove this flexible action instance to the common spectrum struct to allow\nother users (such as multicast router) to get that functionality.\n\nSigned-off-by: Yotam Gigi <yotamg@mellanox.com>\nReviewed-by: Ido Schimmel <idosch@mellanox.com>\nSigned-off-by: Jiri Pirko <jiri@mellanox.com>\n---\n drivers/net/ethernet/mellanox/mlxsw/Makefile | 2 +-\n drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 10 ++\n drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 1 +\n drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c | 93 +--------------\n .../mellanox/mlxsw/spectrum_acl_flex_actions.c | 129 +++++++++++++++++++++\n .../mellanox/mlxsw/spectrum_acl_flex_actions.h | 44 +++++++\n 6 files changed, 186 insertions(+), 93 deletions(-)\n create mode 100644 drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.c\n create mode 100644 drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.h", "diff": "diff --git a/drivers/net/ethernet/mellanox/mlxsw/Makefile b/drivers/net/ethernet/mellanox/mlxsw/Makefile\nindex 891ff41..4b88158 100644\n--- a/drivers/net/ethernet/mellanox/mlxsw/Makefile\n+++ b/drivers/net/ethernet/mellanox/mlxsw/Makefile\n@@ -17,7 +17,7 @@ mlxsw_spectrum-objs\t\t:= spectrum.o spectrum_buffers.o \\\n \t\t\t\t spectrum_kvdl.o spectrum_acl_tcam.o \\\n \t\t\t\t spectrum_acl.o spectrum_flower.o \\\n \t\t\t\t spectrum_cnt.o spectrum_fid.o \\\n-\t\t\t\t spectrum_ipip.o\n+\t\t\t\t spectrum_ipip.o spectrum_acl_flex_actions.o\n mlxsw_spectrum-$(CONFIG_MLXSW_SPECTRUM_DCB)\t+= spectrum_dcb.o\n mlxsw_spectrum-$(CONFIG_NET_DEVLINK) += spectrum_dpipe.o\n obj-$(CONFIG_MLXSW_MINIMAL)\t+= mlxsw_minimal.o\ndiff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c\nindex 9728416..6ba6ff2 100644\n--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c\n+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c\n@@ -69,6 +69,7 @@\n #include \"txheader.h\"\n #include \"spectrum_cnt.h\"\n #include \"spectrum_dpipe.h\"\n+#include \"spectrum_acl_flex_actions.h\"\n #include \"../mlxfw/mlxfw.h\"\n \n #define MLXSW_FWREV_MAJOR 13\n@@ -3699,6 +3700,12 @@ static int mlxsw_sp_init(struct mlxsw_core *mlxsw_core,\n \t\tgoto err_counter_pool_init;\n \t}\n \n+\terr = mlxsw_sp_afa_init(mlxsw_sp);\n+\tif (err) {\n+\t\tdev_err(mlxsw_sp->bus_info->dev, \"Failed to initialize ACL actions\\n\");\n+\t\tgoto err_afa_init;\n+\t}\n+\n \terr = mlxsw_sp_router_init(mlxsw_sp);\n \tif (err) {\n \t\tdev_err(mlxsw_sp->bus_info->dev, \"Failed to initialize router\\n\");\n@@ -3740,6 +3747,8 @@ static int mlxsw_sp_init(struct mlxsw_core *mlxsw_core,\n err_span_init:\n \tmlxsw_sp_router_fini(mlxsw_sp);\n err_router_init:\n+\tmlxsw_sp_afa_fini(mlxsw_sp);\n+err_afa_init:\n \tmlxsw_sp_counter_pool_fini(mlxsw_sp);\n err_counter_pool_init:\n \tmlxsw_sp_switchdev_fini(mlxsw_sp);\n@@ -3763,6 +3772,7 @@ static void mlxsw_sp_fini(struct mlxsw_core *mlxsw_core)\n \tmlxsw_sp_acl_fini(mlxsw_sp);\n \tmlxsw_sp_span_fini(mlxsw_sp);\n \tmlxsw_sp_router_fini(mlxsw_sp);\n+\tmlxsw_sp_afa_fini(mlxsw_sp);\n \tmlxsw_sp_counter_pool_fini(mlxsw_sp);\n \tmlxsw_sp_switchdev_fini(mlxsw_sp);\n \tmlxsw_sp_lag_fini(mlxsw_sp);\ndiff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h\nindex 84ce83a..7180d8f 100644\n--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h\n+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h\n@@ -152,6 +152,7 @@ struct mlxsw_sp {\n \tstruct mlxsw_sp_sb *sb;\n \tstruct mlxsw_sp_bridge *bridge;\n \tstruct mlxsw_sp_router *router;\n+\tstruct mlxsw_afa *afa;\n \tstruct mlxsw_sp_acl *acl;\n \tstruct mlxsw_sp_fid_core *fid_core;\n \tstruct {\ndiff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c\nindex 4b2455e..2523785 100644\n--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c\n+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c\n@@ -52,7 +52,6 @@\n struct mlxsw_sp_acl {\n \tstruct mlxsw_sp *mlxsw_sp;\n \tstruct mlxsw_afk *afk;\n-\tstruct mlxsw_afa *afa;\n \tstruct mlxsw_sp_fid *dummy_fid;\n \tconst struct mlxsw_sp_acl_ops *ops;\n \tstruct rhashtable ruleset_ht;\n@@ -333,7 +332,7 @@ mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl)\n \trulei = kzalloc(sizeof(*rulei), GFP_KERNEL);\n \tif (!rulei)\n \t\treturn NULL;\n-\trulei->act_block = mlxsw_afa_block_create(acl->afa);\n+\trulei->act_block = mlxsw_afa_block_create(acl->mlxsw_sp->afa);\n \tif (IS_ERR(rulei->act_block)) {\n \t\terr = PTR_ERR(rulei->act_block);\n \t\tgoto err_afa_block_create;\n@@ -653,85 +652,6 @@ int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp,\n \treturn 0;\n }\n \n-#define MLXSW_SP_KDVL_ACT_EXT_SIZE 1\n-\n-static int mlxsw_sp_act_kvdl_set_add(void *priv, u32 *p_kvdl_index,\n-\t\t\t\t char *enc_actions, bool is_first)\n-{\n-\tstruct mlxsw_sp *mlxsw_sp = priv;\n-\tchar pefa_pl[MLXSW_REG_PEFA_LEN];\n-\tu32 kvdl_index;\n-\tint err;\n-\n-\t/* The first action set of a TCAM entry is stored directly in TCAM,\n-\t * not KVD linear area.\n-\t */\n-\tif (is_first)\n-\t\treturn 0;\n-\n-\terr = mlxsw_sp_kvdl_alloc(mlxsw_sp, MLXSW_SP_KDVL_ACT_EXT_SIZE,\n-\t\t\t\t &kvdl_index);\n-\tif (err)\n-\t\treturn err;\n-\tmlxsw_reg_pefa_pack(pefa_pl, kvdl_index, enc_actions);\n-\terr = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(pefa), pefa_pl);\n-\tif (err)\n-\t\tgoto err_pefa_write;\n-\t*p_kvdl_index = kvdl_index;\n-\treturn 0;\n-\n-err_pefa_write:\n-\tmlxsw_sp_kvdl_free(mlxsw_sp, kvdl_index);\n-\treturn err;\n-}\n-\n-static void mlxsw_sp_act_kvdl_set_del(void *priv, u32 kvdl_index,\n-\t\t\t\t bool is_first)\n-{\n-\tstruct mlxsw_sp *mlxsw_sp = priv;\n-\n-\tif (is_first)\n-\t\treturn;\n-\tmlxsw_sp_kvdl_free(mlxsw_sp, kvdl_index);\n-}\n-\n-static int mlxsw_sp_act_kvdl_fwd_entry_add(void *priv, u32 *p_kvdl_index,\n-\t\t\t\t\t u8 local_port)\n-{\n-\tstruct mlxsw_sp *mlxsw_sp = priv;\n-\tchar ppbs_pl[MLXSW_REG_PPBS_LEN];\n-\tu32 kvdl_index;\n-\tint err;\n-\n-\terr = mlxsw_sp_kvdl_alloc(mlxsw_sp, 1, &kvdl_index);\n-\tif (err)\n-\t\treturn err;\n-\tmlxsw_reg_ppbs_pack(ppbs_pl, kvdl_index, local_port);\n-\terr = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ppbs), ppbs_pl);\n-\tif (err)\n-\t\tgoto err_ppbs_write;\n-\t*p_kvdl_index = kvdl_index;\n-\treturn 0;\n-\n-err_ppbs_write:\n-\tmlxsw_sp_kvdl_free(mlxsw_sp, kvdl_index);\n-\treturn err;\n-}\n-\n-static void mlxsw_sp_act_kvdl_fwd_entry_del(void *priv, u32 kvdl_index)\n-{\n-\tstruct mlxsw_sp *mlxsw_sp = priv;\n-\n-\tmlxsw_sp_kvdl_free(mlxsw_sp, kvdl_index);\n-}\n-\n-static const struct mlxsw_afa_ops mlxsw_sp_act_afa_ops = {\n-\t.kvdl_set_add\t\t= mlxsw_sp_act_kvdl_set_add,\n-\t.kvdl_set_del\t\t= mlxsw_sp_act_kvdl_set_del,\n-\t.kvdl_fwd_entry_add\t= mlxsw_sp_act_kvdl_fwd_entry_add,\n-\t.kvdl_fwd_entry_del\t= mlxsw_sp_act_kvdl_fwd_entry_del,\n-};\n-\n int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp)\n {\n \tconst struct mlxsw_sp_acl_ops *acl_ops = &mlxsw_sp_acl_tcam_ops;\n@@ -753,14 +673,6 @@ int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp)\n \t\tgoto err_afk_create;\n \t}\n \n-\tacl->afa = mlxsw_afa_create(MLXSW_CORE_RES_GET(mlxsw_sp->core,\n-\t\t\t\t\t\t ACL_ACTIONS_PER_SET),\n-\t\t\t\t &mlxsw_sp_act_afa_ops, mlxsw_sp);\n-\tif (IS_ERR(acl->afa)) {\n-\t\terr = PTR_ERR(acl->afa);\n-\t\tgoto err_afa_create;\n-\t}\n-\n \terr = rhashtable_init(&acl->ruleset_ht,\n \t\t\t &mlxsw_sp_acl_ruleset_ht_params);\n \tif (err)\n@@ -792,8 +704,6 @@ int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp)\n err_fid_get:\n \trhashtable_destroy(&acl->ruleset_ht);\n err_rhashtable_init:\n-\tmlxsw_afa_destroy(acl->afa);\n-err_afa_create:\n \tmlxsw_afk_destroy(acl->afk);\n err_afk_create:\n \tkfree(acl);\n@@ -810,7 +720,6 @@ void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp)\n \tWARN_ON(!list_empty(&acl->rules));\n \tmlxsw_sp_fid_put(acl->dummy_fid);\n \trhashtable_destroy(&acl->ruleset_ht);\n-\tmlxsw_afa_destroy(acl->afa);\n \tmlxsw_afk_destroy(acl->afk);\n \tkfree(acl);\n }\ndiff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.c\nnew file mode 100644\nindex 0000000..4d3340e\n--- /dev/null\n+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.c\n@@ -0,0 +1,129 @@\n+/*\n+ * drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.c\n+ * Copyright (c) 2017 Mellanox Technologies. All rights reserved.\n+ * Copyright (c) 2017 Jiri Pirko <jiri@mellanox.com>\n+ * Copyright (c) 2017 Yotam Gigi <yotamg@mellanox.com>\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *\n+ * 1. Redistributions of source code must retain the above copyright\n+ * notice, this list of conditions and the following disclaimer.\n+ * 2. Redistributions in binary form must reproduce the above copyright\n+ * notice, this list of conditions and the following disclaimer in the\n+ * documentation and/or other materials provided with the distribution.\n+ * 3. Neither the names of the copyright holders nor the names of its\n+ * contributors may be used to endorse or promote products derived from\n+ * this software without specific prior written permission.\n+ *\n+ * Alternatively, this software may be distributed under the terms of the\n+ * GNU General Public License (\"GPL\") version 2 as published by the Free\n+ * Software Foundation.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#include \"spectrum_acl_flex_actions.h\"\n+#include \"core_acl_flex_actions.h\"\n+\n+#define MLXSW_SP_KVDL_ACT_EXT_SIZE 1\n+\n+static int mlxsw_sp_act_kvdl_set_add(void *priv, u32 *p_kvdl_index,\n+\t\t\t\t char *enc_actions, bool is_first)\n+{\n+\tstruct mlxsw_sp *mlxsw_sp = priv;\n+\tchar pefa_pl[MLXSW_REG_PEFA_LEN];\n+\tu32 kvdl_index;\n+\tint err;\n+\n+\t/* The first action set of a TCAM entry is stored directly in TCAM,\n+\t * not KVD linear area.\n+\t */\n+\tif (is_first)\n+\t\treturn 0;\n+\n+\terr = mlxsw_sp_kvdl_alloc(mlxsw_sp, MLXSW_SP_KVDL_ACT_EXT_SIZE,\n+\t\t\t\t &kvdl_index);\n+\tif (err)\n+\t\treturn err;\n+\tmlxsw_reg_pefa_pack(pefa_pl, kvdl_index, enc_actions);\n+\terr = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(pefa), pefa_pl);\n+\tif (err)\n+\t\tgoto err_pefa_write;\n+\t*p_kvdl_index = kvdl_index;\n+\treturn 0;\n+\n+err_pefa_write:\n+\tmlxsw_sp_kvdl_free(mlxsw_sp, kvdl_index);\n+\treturn err;\n+}\n+\n+static void mlxsw_sp_act_kvdl_set_del(void *priv, u32 kvdl_index,\n+\t\t\t\t bool is_first)\n+{\n+\tstruct mlxsw_sp *mlxsw_sp = priv;\n+\n+\tif (is_first)\n+\t\treturn;\n+\tmlxsw_sp_kvdl_free(mlxsw_sp, kvdl_index);\n+}\n+\n+static int mlxsw_sp_act_kvdl_fwd_entry_add(void *priv, u32 *p_kvdl_index,\n+\t\t\t\t\t u8 local_port)\n+{\n+\tstruct mlxsw_sp *mlxsw_sp = priv;\n+\tchar ppbs_pl[MLXSW_REG_PPBS_LEN];\n+\tu32 kvdl_index;\n+\tint err;\n+\n+\terr = mlxsw_sp_kvdl_alloc(mlxsw_sp, 1, &kvdl_index);\n+\tif (err)\n+\t\treturn err;\n+\tmlxsw_reg_ppbs_pack(ppbs_pl, kvdl_index, local_port);\n+\terr = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ppbs), ppbs_pl);\n+\tif (err)\n+\t\tgoto err_ppbs_write;\n+\t*p_kvdl_index = kvdl_index;\n+\treturn 0;\n+\n+err_ppbs_write:\n+\tmlxsw_sp_kvdl_free(mlxsw_sp, kvdl_index);\n+\treturn err;\n+}\n+\n+static void mlxsw_sp_act_kvdl_fwd_entry_del(void *priv, u32 kvdl_index)\n+{\n+\tstruct mlxsw_sp *mlxsw_sp = priv;\n+\n+\tmlxsw_sp_kvdl_free(mlxsw_sp, kvdl_index);\n+}\n+\n+static const struct mlxsw_afa_ops mlxsw_sp_act_afa_ops = {\n+\t.kvdl_set_add\t\t= mlxsw_sp_act_kvdl_set_add,\n+\t.kvdl_set_del\t\t= mlxsw_sp_act_kvdl_set_del,\n+\t.kvdl_fwd_entry_add\t= mlxsw_sp_act_kvdl_fwd_entry_add,\n+\t.kvdl_fwd_entry_del\t= mlxsw_sp_act_kvdl_fwd_entry_del,\n+};\n+\n+int mlxsw_sp_afa_init(struct mlxsw_sp *mlxsw_sp)\n+{\n+\tmlxsw_sp->afa = mlxsw_afa_create(MLXSW_CORE_RES_GET(mlxsw_sp->core,\n+\t\t\t\t\t\t\t ACL_ACTIONS_PER_SET),\n+\t\t\t\t\t &mlxsw_sp_act_afa_ops, mlxsw_sp);\n+\treturn PTR_ERR_OR_ZERO(mlxsw_sp->afa);\n+}\n+\n+void mlxsw_sp_afa_fini(struct mlxsw_sp *mlxsw_sp)\n+{\n+\tmlxsw_afa_destroy(mlxsw_sp->afa);\n+}\ndiff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.h\nnew file mode 100644\nindex 0000000..2726192\n--- /dev/null\n+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.h\n@@ -0,0 +1,44 @@\n+/*\n+ * drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.h\n+ * Copyright (c) 2017 Mellanox Technologies. All rights reserved.\n+ * Copyright (c) 2017 Jiri Pirko <jiri@mellanox.com>\n+ * Copyright (c) 2017 Yotam Gigi <yotamg@mellanox.com>\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *\n+ * 1. Redistributions of source code must retain the above copyright\n+ * notice, this list of conditions and the following disclaimer.\n+ * 2. Redistributions in binary form must reproduce the above copyright\n+ * notice, this list of conditions and the following disclaimer in the\n+ * documentation and/or other materials provided with the distribution.\n+ * 3. Neither the names of the copyright holders nor the names of its\n+ * contributors may be used to endorse or promote products derived from\n+ * this software without specific prior written permission.\n+ *\n+ * Alternatively, this software may be distributed under the terms of the\n+ * GNU General Public License (\"GPL\") version 2 as published by the Free\n+ * Software Foundation.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#ifndef _MLXSW_SPECTRUM_ACL_FLEX_KEYS_H\n+#define _MLXSW_SPECTRUM_ACL_FLEX_KEYS_H\n+\n+#include \"spectrum.h\"\n+\n+int mlxsw_sp_afa_init(struct mlxsw_sp *mlxsw_sp);\n+void mlxsw_sp_afa_fini(struct mlxsw_sp *mlxsw_sp);\n+\n+#endif\n", "prefixes": [ "net-next", "02/13" ] }