Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'nfp-fixes-for-v5-19'

Simon Horman says:

====================
nfp: fixes for v5.19

this short series includes two fixes for the NFP driver.

1. Restructure GRE+VLAN flower offload to address a miss match
between the NIC firmware and driver implementation which
prevented these features from working in combination.

2. Prevent unnecessary warnings regarding rate limiting support.-
It is expected that this feature to not _always_ be present
but this was not taken into account when the code to check
for this feature was added.
====================

Link: https://lore.kernel.org/r/20220608092901.124780-1-simon.horman@corigine.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+39 -37
+16 -16
drivers/net/ethernet/netronome/nfp/flower/conntrack.c
··· 507 507 key_size += sizeof(struct nfp_flower_ipv6); 508 508 } 509 509 510 + if (in_key_ls.key_layer_two & NFP_FLOWER_LAYER2_QINQ) { 511 + map[FLOW_PAY_QINQ] = key_size; 512 + key_size += sizeof(struct nfp_flower_vlan); 513 + } 514 + 510 515 if (in_key_ls.key_layer_two & NFP_FLOWER_LAYER2_GRE) { 511 516 map[FLOW_PAY_GRE] = key_size; 512 517 if (in_key_ls.key_layer_two & NFP_FLOWER_LAYER2_TUN_IPV6) 513 518 key_size += sizeof(struct nfp_flower_ipv6_gre_tun); 514 519 else 515 520 key_size += sizeof(struct nfp_flower_ipv4_gre_tun); 516 - } 517 - 518 - if (in_key_ls.key_layer_two & NFP_FLOWER_LAYER2_QINQ) { 519 - map[FLOW_PAY_QINQ] = key_size; 520 - key_size += sizeof(struct nfp_flower_vlan); 521 521 } 522 522 523 523 if ((in_key_ls.key_layer & NFP_FLOWER_LAYER_VXLAN) || ··· 758 758 } 759 759 } 760 760 761 + if (NFP_FLOWER_LAYER2_QINQ & key_layer.key_layer_two) { 762 + offset = key_map[FLOW_PAY_QINQ]; 763 + key = kdata + offset; 764 + msk = mdata + offset; 765 + for (i = 0; i < _CT_TYPE_MAX; i++) { 766 + nfp_flower_compile_vlan((struct nfp_flower_vlan *)key, 767 + (struct nfp_flower_vlan *)msk, 768 + rules[i]); 769 + } 770 + } 771 + 761 772 if (key_layer.key_layer_two & NFP_FLOWER_LAYER2_GRE) { 762 773 offset = key_map[FLOW_PAY_GRE]; 763 774 key = kdata + offset; ··· 806 795 */ 807 796 flow_pay->nfp_tun_ipv4_addr = dst; 808 797 nfp_tunnel_add_ipv4_off(priv->app, dst); 809 - } 810 - } 811 - 812 - if (NFP_FLOWER_LAYER2_QINQ & key_layer.key_layer_two) { 813 - offset = key_map[FLOW_PAY_QINQ]; 814 - key = kdata + offset; 815 - msk = mdata + offset; 816 - for (i = 0; i < _CT_TYPE_MAX; i++) { 817 - nfp_flower_compile_vlan((struct nfp_flower_vlan *)key, 818 - (struct nfp_flower_vlan *)msk, 819 - rules[i]); 820 798 } 821 799 } 822 800
+8 -8
drivers/net/ethernet/netronome/nfp/flower/match.c
··· 625 625 msk += sizeof(struct nfp_flower_ipv6); 626 626 } 627 627 628 + if (NFP_FLOWER_LAYER2_QINQ & key_ls->key_layer_two) { 629 + nfp_flower_compile_vlan((struct nfp_flower_vlan *)ext, 630 + (struct nfp_flower_vlan *)msk, 631 + rule); 632 + ext += sizeof(struct nfp_flower_vlan); 633 + msk += sizeof(struct nfp_flower_vlan); 634 + } 635 + 628 636 if (key_ls->key_layer_two & NFP_FLOWER_LAYER2_GRE) { 629 637 if (key_ls->key_layer_two & NFP_FLOWER_LAYER2_TUN_IPV6) { 630 638 struct nfp_flower_ipv6_gre_tun *gre_match; ··· 666 658 nfp_flow->nfp_tun_ipv4_addr = dst; 667 659 nfp_tunnel_add_ipv4_off(app, dst); 668 660 } 669 - } 670 - 671 - if (NFP_FLOWER_LAYER2_QINQ & key_ls->key_layer_two) { 672 - nfp_flower_compile_vlan((struct nfp_flower_vlan *)ext, 673 - (struct nfp_flower_vlan *)msk, 674 - rule); 675 - ext += sizeof(struct nfp_flower_vlan); 676 - msk += sizeof(struct nfp_flower_vlan); 677 661 } 678 662 679 663 if (key_ls->key_layer & NFP_FLOWER_LAYER_VXLAN ||
+15 -13
drivers/net/ethernet/netronome/nfp/nfp_net_sriov.c
··· 15 15 #include "nfp_net_sriov.h" 16 16 17 17 static int 18 - nfp_net_sriov_check(struct nfp_app *app, int vf, u16 cap, const char *msg) 18 + nfp_net_sriov_check(struct nfp_app *app, int vf, u16 cap, const char *msg, bool warn) 19 19 { 20 20 u16 cap_vf; 21 21 ··· 24 24 25 25 cap_vf = readw(app->pf->vfcfg_tbl2 + NFP_NET_VF_CFG_MB_CAP); 26 26 if ((cap_vf & cap) != cap) { 27 - nfp_warn(app->pf->cpp, "ndo_set_vf_%s not supported\n", msg); 27 + if (warn) 28 + nfp_warn(app->pf->cpp, "ndo_set_vf_%s not supported\n", msg); 28 29 return -EOPNOTSUPP; 29 30 } 30 31 31 32 if (vf < 0 || vf >= app->pf->num_vfs) { 32 - nfp_warn(app->pf->cpp, "invalid VF id %d\n", vf); 33 + if (warn) 34 + nfp_warn(app->pf->cpp, "invalid VF id %d\n", vf); 33 35 return -EINVAL; 34 36 } 35 37 ··· 67 65 unsigned int vf_offset; 68 66 int err; 69 67 70 - err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_MAC, "mac"); 68 + err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_MAC, "mac", true); 71 69 if (err) 72 70 return err; 73 71 ··· 103 101 u32 vlan_tag; 104 102 int err; 105 103 106 - err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN, "vlan"); 104 + err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN, "vlan", true); 107 105 if (err) 108 106 return err; 109 107 ··· 117 115 } 118 116 119 117 /* Check if fw supports or not */ 120 - err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN_PROTO, "vlan_proto"); 118 + err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN_PROTO, "vlan_proto", true); 121 119 if (err) 122 120 is_proto_sup = false; 123 121 ··· 151 149 u32 vf_offset, ratevalue; 152 150 int err; 153 151 154 - err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_RATE, "rate"); 152 + err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_RATE, "rate", true); 155 153 if (err) 156 154 return err; 157 155 ··· 183 181 int err; 184 182 185 183 err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_SPOOF, 186 - "spoofchk"); 184 + "spoofchk", true); 187 185 if (err) 188 186 return err; 189 187 ··· 207 205 int err; 208 206 209 207 err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_TRUST, 210 - "trust"); 208 + "trust", true); 211 209 if (err) 212 210 return err; 213 211 ··· 232 230 int err; 233 231 234 232 err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_LINK_STATE, 235 - "link_state"); 233 + "link_state", true); 236 234 if (err) 237 235 return err; 238 236 ··· 267 265 u8 flags; 268 266 int err; 269 267 270 - err = nfp_net_sriov_check(app, vf, 0, ""); 268 + err = nfp_net_sriov_check(app, vf, 0, "", true); 271 269 if (err) 272 270 return err; 273 271 ··· 287 285 288 286 ivi->vlan = FIELD_GET(NFP_NET_VF_CFG_VLAN_VID, vlan_tag); 289 287 ivi->qos = FIELD_GET(NFP_NET_VF_CFG_VLAN_QOS, vlan_tag); 290 - if (!nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN_PROTO, "vlan_proto")) 288 + if (!nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN_PROTO, "vlan_proto", false)) 291 289 ivi->vlan_proto = htons(FIELD_GET(NFP_NET_VF_CFG_VLAN_PROT, vlan_tag)); 292 290 ivi->spoofchk = FIELD_GET(NFP_NET_VF_CFG_CTRL_SPOOF, flags); 293 291 ivi->trusted = FIELD_GET(NFP_NET_VF_CFG_CTRL_TRUST, flags); 294 292 ivi->linkstate = FIELD_GET(NFP_NET_VF_CFG_CTRL_LINK_STATE, flags); 295 293 296 - err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_RATE, "rate"); 294 + err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_RATE, "rate", false); 297 295 if (!err) { 298 296 rate = readl(app->pf->vfcfg_tbl2 + vf_offset + 299 297 NFP_NET_VF_CFG_RATE);