if (!app || !app->pf->vfcfg_tbl2) return -EOPNOTSUPP;
cap_vf = readw(app->pf->vfcfg_tbl2 + NFP_NET_VF_CFG_MB_CAP); if ((cap_vf & cap) != cap) { 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) { if (warn)
nfp_warn(app->pf->cpp, "invalid VF id %d\n", vf); return -EINVAL;
}
return 0;
}
staticint
nfp_net_sriov_update(struct nfp_app *app, int vf, u16 update, constchar *msg)
{ struct nfp_net *nn; int ret;
/* Write update info to mailbox in VF config symbol */
writeb(vf, app->pf->vfcfg_tbl2 + NFP_NET_VF_CFG_MB_VF_NUM);
writew(update, app->pf->vfcfg_tbl2 + NFP_NET_VF_CFG_MB_UPD);
nn = list_first_entry(&app->pf->vnics, struct nfp_net, vnic_list); /* Signal VF reconfiguration */
ret = nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_VF); if (ret) return ret;
ret = readw(app->pf->vfcfg_tbl2 + NFP_NET_VF_CFG_MB_RET); if (ret)
nfp_warn(app->pf->cpp, "FW refused VF %s update with errno: %d\n", msg, ret); return -ret;
}
int nfp_app_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
{ struct nfp_app *app = nfp_app_from_netdev(netdev); unsignedint vf_offset; int err;
if (is_multicast_ether_addr(mac)) {
nfp_warn(app->pf->cpp, "invalid Ethernet address %pM for VF id %d\n",
mac, vf); return -EINVAL;
}
/* Write MAC to VF entry in VF config symbol */
vf_offset = NFP_NET_VF_CFG_MB_SZ + vf * NFP_NET_VF_CFG_SZ;
writel(get_unaligned_be32(mac), app->pf->vfcfg_tbl2 + vf_offset);
writew(get_unaligned_be16(mac + 4),
app->pf->vfcfg_tbl2 + vf_offset + NFP_NET_VF_CFG_MAC_LO);
err = nfp_net_sriov_update(app, vf, NFP_NET_VF_CFG_MB_UPD_MAC, "MAC"); if (!err)
nfp_info(app->pf->cpp, "MAC %pM set on VF %d, reload the VF driver to make this change effective.\n",
mac, vf);
if (!eth_type_vlan(vlan_proto)) return -EOPNOTSUPP;
if (vlan > 4095 || qos > 7) {
nfp_warn(app->pf->cpp, "invalid vlan id or qos for VF id %d\n", vf); return -EINVAL;
}
/* Check if fw supports or not */
err = nfp_net_sriov_check(app, vf, NFP_NET_VF_CFG_MB_CAP_VLAN_PROTO, "vlan_proto", true); if (err)
is_proto_sup = false;
if (vlan_proto != htons(ETH_P_8021Q)) { if (!is_proto_sup) return -EOPNOTSUPP;
update |= NFP_NET_VF_CFG_MB_UPD_VLAN_PROTO;
}
/* Write VLAN tag to VF entry in VF config symbol */
vlan_tag = FIELD_PREP(NFP_NET_VF_CFG_VLAN_VID, vlan) |
FIELD_PREP(NFP_NET_VF_CFG_VLAN_QOS, qos);
/* vlan_tag of 0 means that the configuration should be cleared and in * such circumstances setting the TPID has no meaning when * configuring firmware.
*/ if (vlan_tag && is_proto_sup)
vlan_tag |= FIELD_PREP(NFP_NET_VF_CFG_VLAN_PROT, ntohs(vlan_proto));
int nfp_app_set_vf_rate(struct net_device *netdev, int vf, int min_tx_rate, int max_tx_rate)
{ struct nfp_app *app = nfp_app_from_netdev(netdev);
u32 vf_offset, ratevalue; int err;
int nfp_app_set_vf_link_state(struct net_device *netdev, int vf, int link_state)
{ struct nfp_app *app = nfp_app_from_netdev(netdev); unsignedint vf_offset;
u8 vf_ctrl; int err;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.