Message ID | 20210730133925.18851-5-vadym.kochan@plvision.eu (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Marvell Prestera add policer support | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for net-next |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | success | CCed 5 of 5 maintainers |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | fail | Errors and warnings before: 0 this patch: 4 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | warning | WARNING: line length of 81 exceeds 80 columns WARNING: line length of 82 exceeds 80 columns WARNING: line length of 86 exceeds 80 columns |
netdev/build_allmodconfig_warn | fail | Errors and warnings before: 0 this patch: 4 |
netdev/header_inline | success | Link |
On Fri, 30 Jul 2021 16:39:25 +0300 Vadym Kochan wrote: > -int prestera_hw_acl_rule_add(struct prestera_switch *sw, > - struct prestera_acl_rule *rule, > - u32 *rule_id) > +int __prestera_hw_acl_rule_add(struct prestera_switch *sw, > + struct prestera_acl_rule *rule, > + u32 *rule_id) > { > struct prestera_msg_acl_action *actions; > struct prestera_msg_acl_match *matches; > +int __prestera_hw_acl_rule_ext_add(struct prestera_switch *sw, > + struct prestera_acl_rule *rule, > + u32 *rule_id) both should be static
Hi Vadym, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on net-next/master] url: https://github.com/0day-ci/linux/commits/Vadym-Kochan/Marvell-Prestera-add-policer-support/20210730-214316 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 3e12361b6d23f793580a50a6008633501c56ea1d config: parisc-randconfig-p001-20210730 (attached as .config) compiler: hppa-linux-gcc (GCC) 10.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/57041b87fd209b43060824a451a3fbf0eee0ab89 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Vadym-Kochan/Marvell-Prestera-add-policer-support/20210730-214316 git checkout 57041b87fd209b43060824a451a3fbf0eee0ab89 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross ARCH=parisc If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/net/ethernet/marvell/prestera/prestera_hw.c:1020:5: warning: no previous prototype for '__prestera_hw_acl_rule_add' [-Wmissing-prototypes] 1020 | int __prestera_hw_acl_rule_add(struct prestera_switch *sw, | ^~~~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/marvell/prestera/prestera_hw.c:1074:5: warning: no previous prototype for '__prestera_hw_acl_rule_ext_add' [-Wmissing-prototypes] 1074 | int __prestera_hw_acl_rule_ext_add(struct prestera_switch *sw, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vim +/__prestera_hw_acl_rule_add +1020 drivers/net/ethernet/marvell/prestera/prestera_hw.c 1019 > 1020 int __prestera_hw_acl_rule_add(struct prestera_switch *sw, 1021 struct prestera_acl_rule *rule, 1022 u32 *rule_id) 1023 { 1024 struct prestera_msg_acl_action *actions; 1025 struct prestera_msg_acl_match *matches; 1026 struct prestera_msg_acl_rule_resp resp; 1027 struct prestera_msg_acl_rule_req *req; 1028 u8 n_actions; 1029 u8 n_matches; 1030 void *buff; 1031 u32 size; 1032 int err; 1033 1034 n_actions = prestera_acl_rule_action_len(rule); 1035 n_matches = prestera_acl_rule_match_len(rule); 1036 1037 size = sizeof(*req) + sizeof(*actions) * n_actions + 1038 sizeof(*matches) * n_matches; 1039 1040 buff = kzalloc(size, GFP_KERNEL); 1041 if (!buff) 1042 return -ENOMEM; 1043 1044 req = buff; 1045 actions = buff + sizeof(*req); 1046 matches = buff + sizeof(*req) + sizeof(*actions) * n_actions; 1047 1048 /* put acl actions into the message */ 1049 err = prestera_hw_acl_actions_put(actions, rule); 1050 if (err) 1051 goto free_buff; 1052 1053 /* put acl matches into the message */ 1054 err = prestera_hw_acl_matches_put(matches, rule); 1055 if (err) 1056 goto free_buff; 1057 1058 req->ruleset_id = prestera_acl_rule_ruleset_id_get(rule); 1059 req->priority = prestera_acl_rule_priority_get(rule); 1060 req->n_actions = prestera_acl_rule_action_len(rule); 1061 req->n_matches = prestera_acl_rule_match_len(rule); 1062 1063 err = prestera_cmd_ret(sw, PRESTERA_CMD_TYPE_ACL_RULE_ADD, 1064 &req->cmd, size, &resp.ret, sizeof(resp)); 1065 if (err) 1066 goto free_buff; 1067 1068 *rule_id = resp.id; 1069 free_buff: 1070 kfree(buff); 1071 return err; 1072 } 1073 > 1074 int __prestera_hw_acl_rule_ext_add(struct prestera_switch *sw, 1075 struct prestera_acl_rule *rule, 1076 u32 *rule_id) 1077 { 1078 struct prestera_msg_acl_action_ext *actions; 1079 struct prestera_msg_acl_rule_ext_req *req; 1080 struct prestera_msg_acl_match *matches; 1081 struct prestera_msg_acl_rule_resp resp; 1082 u8 n_actions; 1083 u8 n_matches; 1084 void *buff; 1085 u32 size; 1086 int err; 1087 1088 n_actions = prestera_acl_rule_action_len(rule); 1089 n_matches = prestera_acl_rule_match_len(rule); 1090 1091 size = sizeof(*req) + sizeof(*actions) * n_actions + 1092 sizeof(*matches) * n_matches; 1093 1094 buff = kzalloc(size, GFP_KERNEL); 1095 if (!buff) 1096 return -ENOMEM; 1097 1098 req = buff; 1099 actions = buff + sizeof(*req); 1100 matches = buff + sizeof(*req) + sizeof(*actions) * n_actions; 1101 1102 /* put acl actions into the message */ 1103 err = prestera_hw_acl_actions_ext_put(actions, rule); 1104 if (err) 1105 goto free_buff; 1106 1107 /* put acl matches into the message */ 1108 err = prestera_hw_acl_matches_put(matches, rule); 1109 if (err) 1110 goto free_buff; 1111 1112 req->ruleset_id = prestera_acl_rule_ruleset_id_get(rule); 1113 req->priority = prestera_acl_rule_priority_get(rule); 1114 req->n_actions = prestera_acl_rule_action_len(rule); 1115 req->n_matches = prestera_acl_rule_match_len(rule); 1116 req->hw_tc = prestera_acl_rule_hw_tc_get(rule); 1117 1118 err = prestera_cmd_ret(sw, PRESTERA_CMD_TYPE_ACL_RULE_ADD, 1119 &req->cmd, size, &resp.ret, sizeof(resp)); 1120 if (err) 1121 goto free_buff; 1122 1123 *rule_id = resp.id; 1124 free_buff: 1125 kfree(buff); 1126 return err; 1127 } 1128 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Vadym, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on net-next/master] url: https://github.com/0day-ci/linux/commits/Vadym-Kochan/Marvell-Prestera-add-policer-support/20210730-214316 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 3e12361b6d23f793580a50a6008633501c56ea1d config: s390-randconfig-r032-20210730 (attached as .config) compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 4f71f59bf3d9914188a11d0c41bedbb339d36ff5) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install s390 cross compiling tool for clang build # apt-get install binutils-s390x-linux-gnu # https://github.com/0day-ci/linux/commit/57041b87fd209b43060824a451a3fbf0eee0ab89 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Vadym-Kochan/Marvell-Prestera-add-policer-support/20210730-214316 git checkout 57041b87fd209b43060824a451a3fbf0eee0ab89 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=s390 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): In file included from drivers/net/ethernet/marvell/prestera/prestera_hw.c:4: In file included from include/linux/etherdevice.h:20: In file included from include/linux/if_ether.h:19: In file included from include/linux/skbuff.h:31: In file included from include/linux/dma-mapping.h:10: In file included from include/linux/scatterlist.h:9: In file included from arch/s390/include/asm/io.h:75: include/asm-generic/io.h:464:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __raw_readb(PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:477:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:36:59: note: expanded from macro '__le16_to_cpu' #define __le16_to_cpu(x) __swab16((__force __u16)(__le16)(x)) ^ include/uapi/linux/swab.h:102:54: note: expanded from macro '__swab16' #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x)) ^ In file included from drivers/net/ethernet/marvell/prestera/prestera_hw.c:4: In file included from include/linux/etherdevice.h:20: In file included from include/linux/if_ether.h:19: In file included from include/linux/skbuff.h:31: In file included from include/linux/dma-mapping.h:10: In file included from include/linux/scatterlist.h:9: In file included from arch/s390/include/asm/io.h:75: include/asm-generic/io.h:490:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:34:59: note: expanded from macro '__le32_to_cpu' #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) ^ include/uapi/linux/swab.h:115:54: note: expanded from macro '__swab32' #define __swab32(x) (__u32)__builtin_bswap32((__u32)(x)) ^ In file included from drivers/net/ethernet/marvell/prestera/prestera_hw.c:4: In file included from include/linux/etherdevice.h:20: In file included from include/linux/if_ether.h:19: In file included from include/linux/skbuff.h:31: In file included from include/linux/dma-mapping.h:10: In file included from include/linux/scatterlist.h:9: In file included from arch/s390/include/asm/io.h:75: include/asm-generic/io.h:501:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writeb(value, PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:511:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:521:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:609:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsb(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:617:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsw(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:625:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsl(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:634:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesb(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:643:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesw(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:652:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesl(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ >> drivers/net/ethernet/marvell/prestera/prestera_hw.c:1020:5: warning: no previous prototype for function '__prestera_hw_acl_rule_add' [-Wmissing-prototypes] int __prestera_hw_acl_rule_add(struct prestera_switch *sw, ^ drivers/net/ethernet/marvell/prestera/prestera_hw.c:1020:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int __prestera_hw_acl_rule_add(struct prestera_switch *sw, ^ static >> drivers/net/ethernet/marvell/prestera/prestera_hw.c:1074:5: warning: no previous prototype for function '__prestera_hw_acl_rule_ext_add' [-Wmissing-prototypes] int __prestera_hw_acl_rule_ext_add(struct prestera_switch *sw, ^ drivers/net/ethernet/marvell/prestera/prestera_hw.c:1074:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int __prestera_hw_acl_rule_ext_add(struct prestera_switch *sw, ^ static 14 warnings generated. vim +/__prestera_hw_acl_rule_add +1020 drivers/net/ethernet/marvell/prestera/prestera_hw.c 1019 > 1020 int __prestera_hw_acl_rule_add(struct prestera_switch *sw, 1021 struct prestera_acl_rule *rule, 1022 u32 *rule_id) 1023 { 1024 struct prestera_msg_acl_action *actions; 1025 struct prestera_msg_acl_match *matches; 1026 struct prestera_msg_acl_rule_resp resp; 1027 struct prestera_msg_acl_rule_req *req; 1028 u8 n_actions; 1029 u8 n_matches; 1030 void *buff; 1031 u32 size; 1032 int err; 1033 1034 n_actions = prestera_acl_rule_action_len(rule); 1035 n_matches = prestera_acl_rule_match_len(rule); 1036 1037 size = sizeof(*req) + sizeof(*actions) * n_actions + 1038 sizeof(*matches) * n_matches; 1039 1040 buff = kzalloc(size, GFP_KERNEL); 1041 if (!buff) 1042 return -ENOMEM; 1043 1044 req = buff; 1045 actions = buff + sizeof(*req); 1046 matches = buff + sizeof(*req) + sizeof(*actions) * n_actions; 1047 1048 /* put acl actions into the message */ 1049 err = prestera_hw_acl_actions_put(actions, rule); 1050 if (err) 1051 goto free_buff; 1052 1053 /* put acl matches into the message */ 1054 err = prestera_hw_acl_matches_put(matches, rule); 1055 if (err) 1056 goto free_buff; 1057 1058 req->ruleset_id = prestera_acl_rule_ruleset_id_get(rule); 1059 req->priority = prestera_acl_rule_priority_get(rule); 1060 req->n_actions = prestera_acl_rule_action_len(rule); 1061 req->n_matches = prestera_acl_rule_match_len(rule); 1062 1063 err = prestera_cmd_ret(sw, PRESTERA_CMD_TYPE_ACL_RULE_ADD, 1064 &req->cmd, size, &resp.ret, sizeof(resp)); 1065 if (err) 1066 goto free_buff; 1067 1068 *rule_id = resp.id; 1069 free_buff: 1070 kfree(buff); 1071 return err; 1072 } 1073 > 1074 int __prestera_hw_acl_rule_ext_add(struct prestera_switch *sw, 1075 struct prestera_acl_rule *rule, 1076 u32 *rule_id) 1077 { 1078 struct prestera_msg_acl_action_ext *actions; 1079 struct prestera_msg_acl_rule_ext_req *req; 1080 struct prestera_msg_acl_match *matches; 1081 struct prestera_msg_acl_rule_resp resp; 1082 u8 n_actions; 1083 u8 n_matches; 1084 void *buff; 1085 u32 size; 1086 int err; 1087 1088 n_actions = prestera_acl_rule_action_len(rule); 1089 n_matches = prestera_acl_rule_match_len(rule); 1090 1091 size = sizeof(*req) + sizeof(*actions) * n_actions + 1092 sizeof(*matches) * n_matches; 1093 1094 buff = kzalloc(size, GFP_KERNEL); 1095 if (!buff) 1096 return -ENOMEM; 1097 1098 req = buff; 1099 actions = buff + sizeof(*req); 1100 matches = buff + sizeof(*req) + sizeof(*actions) * n_actions; 1101 1102 /* put acl actions into the message */ 1103 err = prestera_hw_acl_actions_ext_put(actions, rule); 1104 if (err) 1105 goto free_buff; 1106 1107 /* put acl matches into the message */ 1108 err = prestera_hw_acl_matches_put(matches, rule); 1109 if (err) 1110 goto free_buff; 1111 1112 req->ruleset_id = prestera_acl_rule_ruleset_id_get(rule); 1113 req->priority = prestera_acl_rule_priority_get(rule); 1114 req->n_actions = prestera_acl_rule_action_len(rule); 1115 req->n_matches = prestera_acl_rule_match_len(rule); 1116 req->hw_tc = prestera_acl_rule_hw_tc_get(rule); 1117 1118 err = prestera_cmd_ret(sw, PRESTERA_CMD_TYPE_ACL_RULE_ADD, 1119 &req->cmd, size, &resp.ret, sizeof(resp)); 1120 if (err) 1121 goto free_buff; 1122 1123 *rule_id = resp.id; 1124 free_buff: 1125 kfree(buff); 1126 return err; 1127 } 1128 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_acl.c b/drivers/net/ethernet/marvell/prestera/prestera_acl.c index 83c75ffb1a1c..9a473f94fab0 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_acl.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_acl.c @@ -8,6 +8,8 @@ #include "prestera_acl.h" #include "prestera_span.h" +#define PRESTERA_ACL_DEF_HW_TC 3 + struct prestera_acl { struct prestera_switch *sw; struct list_head rules; @@ -29,6 +31,7 @@ struct prestera_acl_rule { u32 priority; u8 n_actions; u8 n_matches; + u8 hw_tc; u32 id; }; @@ -203,6 +206,7 @@ prestera_acl_rule_create(struct prestera_flow_block *block, INIT_LIST_HEAD(&rule->action_list); rule->cookie = cookie; rule->block = block; + rule->hw_tc = PRESTERA_ACL_DEF_HW_TC; return rule; } @@ -251,6 +255,16 @@ void prestera_acl_rule_priority_set(struct prestera_acl_rule *rule, rule->priority = priority; } +u8 prestera_acl_rule_hw_tc_get(struct prestera_acl_rule *rule) +{ + return rule->hw_tc; +} + +void prestera_acl_rule_hw_tc_set(struct prestera_acl_rule *rule, u8 hw_tc) +{ + rule->hw_tc = hw_tc; +} + int prestera_acl_rule_match_add(struct prestera_acl_rule *rule, struct prestera_acl_rule_match_entry *entry) { diff --git a/drivers/net/ethernet/marvell/prestera/prestera_acl.h b/drivers/net/ethernet/marvell/prestera/prestera_acl.h index 39b7869be659..2a2fbae1432a 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_acl.h +++ b/drivers/net/ethernet/marvell/prestera/prestera_acl.h @@ -25,7 +25,8 @@ enum prestera_acl_rule_match_entry_type { enum prestera_acl_rule_action { PRESTERA_ACL_RULE_ACTION_ACCEPT, PRESTERA_ACL_RULE_ACTION_DROP, - PRESTERA_ACL_RULE_ACTION_TRAP + PRESTERA_ACL_RULE_ACTION_TRAP, + PRESTERA_ACL_RULE_ACTION_POLICE, }; struct prestera_switch; @@ -50,6 +51,12 @@ struct prestera_flow_block { struct prestera_acl_rule_action_entry { struct list_head list; enum prestera_acl_rule_action id; + union { + struct { + u64 rate; + u64 burst; + } police; + }; }; struct prestera_acl_rule_match_entry { @@ -120,5 +127,7 @@ void prestera_acl_rule_del(struct prestera_switch *sw, int prestera_acl_rule_get_stats(struct prestera_switch *sw, struct prestera_acl_rule *rule, u64 *packets, u64 *bytes, u64 *last_use); +u8 prestera_acl_rule_hw_tc_get(struct prestera_acl_rule *rule); +void prestera_acl_rule_hw_tc_set(struct prestera_acl_rule *rule, u8 hw_tc); #endif /* _PRESTERA_ACL_H_ */ diff --git a/drivers/net/ethernet/marvell/prestera/prestera_flower.c b/drivers/net/ethernet/marvell/prestera/prestera_flower.c index e571ba09ec08..76f30856ac98 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_flower.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_flower.c @@ -5,6 +5,8 @@ #include "prestera_acl.h" #include "prestera_flower.h" +#define PRESTERA_HW_TC_NUM 8 + static int prestera_flower_parse_actions(struct prestera_flow_block *block, struct prestera_acl_rule *rule, struct flow_action *flow_action, @@ -30,6 +32,11 @@ static int prestera_flower_parse_actions(struct prestera_flow_block *block, case FLOW_ACTION_TRAP: a_entry.id = PRESTERA_ACL_RULE_ACTION_TRAP; break; + case FLOW_ACTION_POLICE: + a_entry.id = PRESTERA_ACL_RULE_ACTION_POLICE; + a_entry.police.rate = act->police.rate_bytes_ps; + a_entry.police.burst = act->police.burst; + break; default: NL_SET_ERR_MSG_MOD(extack, "Unsupported action"); pr_err("Unsupported action\n"); @@ -110,6 +117,17 @@ static int prestera_flower_parse(struct prestera_flow_block *block, return -EOPNOTSUPP; } + if (f->classid) { + int hw_tc = __tc_classid_to_hwtc(PRESTERA_HW_TC_NUM, f->classid); + + if (hw_tc < 0) { + NL_SET_ERR_MSG_MOD(f->common.extack, "Unsupported HW TC"); + return hw_tc; + } + + prestera_acl_rule_hw_tc_set(rule, hw_tc); + } + prestera_acl_rule_priority_set(rule, f->common.prio); if (flow_rule_match_key(f_rule, FLOW_DISSECTOR_KEY_META)) { diff --git a/drivers/net/ethernet/marvell/prestera/prestera_hw.c b/drivers/net/ethernet/marvell/prestera/prestera_hw.c index c1297859e471..2d1dfb52aca4 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_hw.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_hw.c @@ -91,6 +91,7 @@ enum { enum { PRESTERA_CMD_SWITCH_ATTR_MAC = 1, PRESTERA_CMD_SWITCH_ATTR_AGEING = 2, + PRESTERA_SWITCH_ATTR_TRAP_POLICER = 3, }; enum { @@ -319,6 +320,19 @@ struct prestera_msg_acl_action { u32 id; }; +struct prestera_msg_acl_action_ext { + u32 id; + union { + struct { + u64 rate; + u64 burst; + } police; + struct { + u64 res[3]; + } reserv; + } __packed; +}; + struct prestera_msg_acl_match { u32 type; union { @@ -354,6 +368,16 @@ struct prestera_msg_acl_rule_req { u8 n_matches; }; +struct prestera_msg_acl_rule_ext_req { + struct prestera_msg_cmd cmd; + u32 id; + u32 priority; + u16 ruleset_id; + u8 n_actions; + u8 n_matches; + u8 hw_tc; +}; + struct prestera_msg_acl_rule_resp { struct prestera_msg_ret ret; u32 id; @@ -908,6 +932,36 @@ static int prestera_hw_acl_actions_put(struct prestera_msg_acl_action *action, return 0; } +static int prestera_hw_acl_actions_ext_put(struct prestera_msg_acl_action_ext *action, + struct prestera_acl_rule *rule) +{ + struct list_head *a_list = prestera_acl_rule_action_list_get(rule); + struct prestera_acl_rule_action_entry *a_entry; + int i = 0; + + list_for_each_entry(a_entry, a_list, list) { + action[i].id = a_entry->id; + + switch (a_entry->id) { + case PRESTERA_ACL_RULE_ACTION_ACCEPT: + case PRESTERA_ACL_RULE_ACTION_DROP: + case PRESTERA_ACL_RULE_ACTION_TRAP: + /* just rule action id, no specific data */ + break; + case PRESTERA_ACL_RULE_ACTION_POLICE: + action[i].police.rate = a_entry->police.rate; + action[i].police.burst = a_entry->police.burst; + break; + default: + return -EINVAL; + } + + i++; + } + + return 0; +} + static int prestera_hw_acl_matches_put(struct prestera_msg_acl_match *match, struct prestera_acl_rule *rule) { @@ -963,9 +1017,9 @@ static int prestera_hw_acl_matches_put(struct prestera_msg_acl_match *match, return 0; } -int prestera_hw_acl_rule_add(struct prestera_switch *sw, - struct prestera_acl_rule *rule, - u32 *rule_id) +int __prestera_hw_acl_rule_add(struct prestera_switch *sw, + struct prestera_acl_rule *rule, + u32 *rule_id) { struct prestera_msg_acl_action *actions; struct prestera_msg_acl_match *matches; @@ -1017,6 +1071,71 @@ int prestera_hw_acl_rule_add(struct prestera_switch *sw, return err; } +int __prestera_hw_acl_rule_ext_add(struct prestera_switch *sw, + struct prestera_acl_rule *rule, + u32 *rule_id) +{ + struct prestera_msg_acl_action_ext *actions; + struct prestera_msg_acl_rule_ext_req *req; + struct prestera_msg_acl_match *matches; + struct prestera_msg_acl_rule_resp resp; + u8 n_actions; + u8 n_matches; + void *buff; + u32 size; + int err; + + n_actions = prestera_acl_rule_action_len(rule); + n_matches = prestera_acl_rule_match_len(rule); + + size = sizeof(*req) + sizeof(*actions) * n_actions + + sizeof(*matches) * n_matches; + + buff = kzalloc(size, GFP_KERNEL); + if (!buff) + return -ENOMEM; + + req = buff; + actions = buff + sizeof(*req); + matches = buff + sizeof(*req) + sizeof(*actions) * n_actions; + + /* put acl actions into the message */ + err = prestera_hw_acl_actions_ext_put(actions, rule); + if (err) + goto free_buff; + + /* put acl matches into the message */ + err = prestera_hw_acl_matches_put(matches, rule); + if (err) + goto free_buff; + + req->ruleset_id = prestera_acl_rule_ruleset_id_get(rule); + req->priority = prestera_acl_rule_priority_get(rule); + req->n_actions = prestera_acl_rule_action_len(rule); + req->n_matches = prestera_acl_rule_match_len(rule); + req->hw_tc = prestera_acl_rule_hw_tc_get(rule); + + err = prestera_cmd_ret(sw, PRESTERA_CMD_TYPE_ACL_RULE_ADD, + &req->cmd, size, &resp.ret, sizeof(resp)); + if (err) + goto free_buff; + + *rule_id = resp.id; +free_buff: + kfree(buff); + return err; +} + +int prestera_hw_acl_rule_add(struct prestera_switch *sw, + struct prestera_acl_rule *rule, + u32 *rule_id) +{ + if (sw->dev->fw_rev.maj == 3 && sw->dev->fw_rev.min == 0) + return __prestera_hw_acl_rule_add(sw, rule, rule_id); + + return __prestera_hw_acl_rule_ext_add(sw, rule, rule_id); +}; + int prestera_hw_acl_rule_del(struct prestera_switch *sw, u32 rule_id) { struct prestera_msg_acl_rule_req req = { diff --git a/drivers/net/ethernet/marvell/prestera/prestera_pci.c b/drivers/net/ethernet/marvell/prestera/prestera_pci.c index ce4cf51dba5a..f988603af1b6 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_pci.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_pci.c @@ -15,6 +15,7 @@ #define PRESTERA_MSG_MAX_SIZE 1500 static struct prestera_fw_rev prestera_fw_supp[] = { + { 3, 1 }, { 3, 0 }, { 2, 0 } };