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>
This commit is contained in:
commit
cd3ff99b93
@ -507,6 +507,11 @@ nfp_fl_calc_key_layers_sz(struct nfp_fl_key_ls in_key_ls, uint16_t *map)
|
||||
key_size += sizeof(struct nfp_flower_ipv6);
|
||||
}
|
||||
|
||||
if (in_key_ls.key_layer_two & NFP_FLOWER_LAYER2_QINQ) {
|
||||
map[FLOW_PAY_QINQ] = key_size;
|
||||
key_size += sizeof(struct nfp_flower_vlan);
|
||||
}
|
||||
|
||||
if (in_key_ls.key_layer_two & NFP_FLOWER_LAYER2_GRE) {
|
||||
map[FLOW_PAY_GRE] = key_size;
|
||||
if (in_key_ls.key_layer_two & NFP_FLOWER_LAYER2_TUN_IPV6)
|
||||
@ -515,11 +520,6 @@ nfp_fl_calc_key_layers_sz(struct nfp_fl_key_ls in_key_ls, uint16_t *map)
|
||||
key_size += sizeof(struct nfp_flower_ipv4_gre_tun);
|
||||
}
|
||||
|
||||
if (in_key_ls.key_layer_two & NFP_FLOWER_LAYER2_QINQ) {
|
||||
map[FLOW_PAY_QINQ] = key_size;
|
||||
key_size += sizeof(struct nfp_flower_vlan);
|
||||
}
|
||||
|
||||
if ((in_key_ls.key_layer & NFP_FLOWER_LAYER_VXLAN) ||
|
||||
(in_key_ls.key_layer_two & NFP_FLOWER_LAYER2_GENEVE)) {
|
||||
map[FLOW_PAY_UDP_TUN] = key_size;
|
||||
@ -758,6 +758,17 @@ static int nfp_fl_ct_add_offload(struct nfp_fl_nft_tc_merge *m_entry)
|
||||
}
|
||||
}
|
||||
|
||||
if (NFP_FLOWER_LAYER2_QINQ & key_layer.key_layer_two) {
|
||||
offset = key_map[FLOW_PAY_QINQ];
|
||||
key = kdata + offset;
|
||||
msk = mdata + offset;
|
||||
for (i = 0; i < _CT_TYPE_MAX; i++) {
|
||||
nfp_flower_compile_vlan((struct nfp_flower_vlan *)key,
|
||||
(struct nfp_flower_vlan *)msk,
|
||||
rules[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (key_layer.key_layer_two & NFP_FLOWER_LAYER2_GRE) {
|
||||
offset = key_map[FLOW_PAY_GRE];
|
||||
key = kdata + offset;
|
||||
@ -798,17 +809,6 @@ static int nfp_fl_ct_add_offload(struct nfp_fl_nft_tc_merge *m_entry)
|
||||
}
|
||||
}
|
||||
|
||||
if (NFP_FLOWER_LAYER2_QINQ & key_layer.key_layer_two) {
|
||||
offset = key_map[FLOW_PAY_QINQ];
|
||||
key = kdata + offset;
|
||||
msk = mdata + offset;
|
||||
for (i = 0; i < _CT_TYPE_MAX; i++) {
|
||||
nfp_flower_compile_vlan((struct nfp_flower_vlan *)key,
|
||||
(struct nfp_flower_vlan *)msk,
|
||||
rules[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (key_layer.key_layer & NFP_FLOWER_LAYER_VXLAN ||
|
||||
key_layer.key_layer_two & NFP_FLOWER_LAYER2_GENEVE) {
|
||||
offset = key_map[FLOW_PAY_UDP_TUN];
|
||||
|
@ -625,6 +625,14 @@ int nfp_flower_compile_flow_match(struct nfp_app *app,
|
||||
msk += sizeof(struct nfp_flower_ipv6);
|
||||
}
|
||||
|
||||
if (NFP_FLOWER_LAYER2_QINQ & key_ls->key_layer_two) {
|
||||
nfp_flower_compile_vlan((struct nfp_flower_vlan *)ext,
|
||||
(struct nfp_flower_vlan *)msk,
|
||||
rule);
|
||||
ext += sizeof(struct nfp_flower_vlan);
|
||||
msk += sizeof(struct nfp_flower_vlan);
|
||||
}
|
||||
|
||||
if (key_ls->key_layer_two & NFP_FLOWER_LAYER2_GRE) {
|
||||
if (key_ls->key_layer_two & NFP_FLOWER_LAYER2_TUN_IPV6) {
|
||||
struct nfp_flower_ipv6_gre_tun *gre_match;
|
||||
@ -660,14 +668,6 @@ int nfp_flower_compile_flow_match(struct nfp_app *app,
|
||||
}
|
||||
}
|
||||
|
||||
if (NFP_FLOWER_LAYER2_QINQ & key_ls->key_layer_two) {
|
||||
nfp_flower_compile_vlan((struct nfp_flower_vlan *)ext,
|
||||
(struct nfp_flower_vlan *)msk,
|
||||
rule);
|
||||
ext += sizeof(struct nfp_flower_vlan);
|
||||
msk += sizeof(struct nfp_flower_vlan);
|
||||
}
|
||||
|
||||
if (key_ls->key_layer & NFP_FLOWER_LAYER_VXLAN ||
|
||||
key_ls->key_layer_two & NFP_FLOWER_LAYER2_GENEVE) {
|
||||
if (key_ls->key_layer_two & NFP_FLOWER_LAYER2_TUN_IPV6) {
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include "nfp_net_sriov.h"
|
||||
|
||||
static int
|
||||
nfp_net_sriov_check(struct nfp_app *app, int vf, u16 cap, const char *msg)
|
||||
nfp_net_sriov_check(struct nfp_app *app, int vf, u16 cap, const char *msg, bool warn)
|
||||
{
|
||||
u16 cap_vf;
|
||||
|
||||
@ -24,12 +24,14 @@ nfp_net_sriov_check(struct nfp_app *app, int vf, u16 cap, const char *msg)
|
||||
|
||||
cap_vf = readw(app->pf->vfcfg_tbl2 + NFP_NET_VF_CFG_MB_CAP);
|
||||
if ((cap_vf & cap) != cap) {
|
||||
nfp_warn(app->pf->cpp, "ndo_set_vf_%s not supported\n", msg);
|
||||
if (warn)
|
||||
nfp_warn(app->pf->cpp, "ndo_set_vf_%s not supported\n", msg);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (vf < 0 || vf >= app->pf->num_vfs) {
|
||||
nfp_warn(app->pf->cpp, "invalid VF id %d\n", vf);
|
||||
if (warn)
|
||||
nfp_warn(app->pf->cpp, "invalid VF id %d\n", vf);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -65,7 +67,7 @@ int nfp_app_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
|
||||
unsigned int vf_offset;
|
||||
int err;
|
||||
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_MAC, "mac");
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_MAC, "mac", true);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -101,7 +103,7 @@ int nfp_app_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos,
|
||||
u32 vlan_tag;
|
||||
int err;
|
||||
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN, "vlan");
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN, "vlan", true);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -115,7 +117,7 @@ int nfp_app_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos,
|
||||
}
|
||||
|
||||
/* Check if fw supports or not */
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN_PROTO, "vlan_proto");
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN_PROTO, "vlan_proto", true);
|
||||
if (err)
|
||||
is_proto_sup = false;
|
||||
|
||||
@ -149,7 +151,7 @@ int nfp_app_set_vf_rate(struct net_device *netdev, int vf,
|
||||
u32 vf_offset, ratevalue;
|
||||
int err;
|
||||
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_RATE, "rate");
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_RATE, "rate", true);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -181,7 +183,7 @@ int nfp_app_set_vf_spoofchk(struct net_device *netdev, int vf, bool enable)
|
||||
int err;
|
||||
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_SPOOF,
|
||||
"spoofchk");
|
||||
"spoofchk", true);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -205,7 +207,7 @@ int nfp_app_set_vf_trust(struct net_device *netdev, int vf, bool enable)
|
||||
int err;
|
||||
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_TRUST,
|
||||
"trust");
|
||||
"trust", true);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -230,7 +232,7 @@ int nfp_app_set_vf_link_state(struct net_device *netdev, int vf,
|
||||
int err;
|
||||
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_LINK_STATE,
|
||||
"link_state");
|
||||
"link_state", true);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -265,7 +267,7 @@ int nfp_app_get_vf_config(struct net_device *netdev, int vf,
|
||||
u8 flags;
|
||||
int err;
|
||||
|
||||
err = nfp_net_sriov_check(app, vf, 0, "");
|
||||
err = nfp_net_sriov_check(app, vf, 0, "", true);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -285,13 +287,13 @@ int nfp_app_get_vf_config(struct net_device *netdev, int vf,
|
||||
|
||||
ivi->vlan = FIELD_GET(NFP_NET_VF_CFG_VLAN_VID, vlan_tag);
|
||||
ivi->qos = FIELD_GET(NFP_NET_VF_CFG_VLAN_QOS, vlan_tag);
|
||||
if (!nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN_PROTO, "vlan_proto"))
|
||||
if (!nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN_PROTO, "vlan_proto", false))
|
||||
ivi->vlan_proto = htons(FIELD_GET(NFP_NET_VF_CFG_VLAN_PROT, vlan_tag));
|
||||
ivi->spoofchk = FIELD_GET(NFP_NET_VF_CFG_CTRL_SPOOF, flags);
|
||||
ivi->trusted = FIELD_GET(NFP_NET_VF_CFG_CTRL_TRUST, flags);
|
||||
ivi->linkstate = FIELD_GET(NFP_NET_VF_CFG_CTRL_LINK_STATE, flags);
|
||||
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_RATE, "rate");
|
||||
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_RATE, "rate", false);
|
||||
if (!err) {
|
||||
rate = readl(app->pf->vfcfg_tbl2 + vf_offset +
|
||||
NFP_NET_VF_CFG_RATE);
|
||||
|
Loading…
Reference in New Issue
Block a user