nfp: abm: look up MAC addresses via management FW
In multi-host scenarios Management FW may allocate MAC addresses at runtime, we have to use the indirect lookup to find them. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
34243f5909
commit
f6e71efdf9
@ -540,8 +540,9 @@ nfp_abm_vnic_set_mac(struct nfp_pf *pf, struct nfp_abm *abm, struct nfp_net *nn,
|
|||||||
{
|
{
|
||||||
struct nfp_eth_table_port *eth_port = &pf->eth_tbl->ports[id];
|
struct nfp_eth_table_port *eth_port = &pf->eth_tbl->ports[id];
|
||||||
u8 mac_addr[ETH_ALEN];
|
u8 mac_addr[ETH_ALEN];
|
||||||
const char *mac_str;
|
struct nfp_nsp *nsp;
|
||||||
char name[32];
|
char hwinfo[32];
|
||||||
|
int err;
|
||||||
|
|
||||||
if (id > pf->eth_tbl->count) {
|
if (id > pf->eth_tbl->count) {
|
||||||
nfp_warn(pf->cpp, "No entry for persistent MAC address\n");
|
nfp_warn(pf->cpp, "No entry for persistent MAC address\n");
|
||||||
@ -549,22 +550,37 @@ nfp_abm_vnic_set_mac(struct nfp_pf *pf, struct nfp_abm *abm, struct nfp_net *nn,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(name, sizeof(name), "eth%u.mac.pf%u",
|
snprintf(hwinfo, sizeof(hwinfo), "eth%u.mac.pf%u",
|
||||||
eth_port->eth_index, abm->pf_id);
|
eth_port->eth_index, abm->pf_id);
|
||||||
|
|
||||||
mac_str = nfp_hwinfo_lookup(pf->hwinfo, name);
|
nsp = nfp_nsp_open(pf->cpp);
|
||||||
if (!mac_str) {
|
if (IS_ERR(nsp)) {
|
||||||
nfp_warn(pf->cpp, "Can't lookup persistent MAC address (%s)\n",
|
nfp_warn(pf->cpp, "Failed to access the NSP for persistent MAC address: %ld\n",
|
||||||
name);
|
PTR_ERR(nsp));
|
||||||
eth_hw_addr_random(nn->dp.netdev);
|
eth_hw_addr_random(nn->dp.netdev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sscanf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
|
if (!nfp_nsp_has_hwinfo_lookup(nsp)) {
|
||||||
|
nfp_warn(pf->cpp, "NSP doesn't support PF MAC generation\n");
|
||||||
|
eth_hw_addr_random(nn->dp.netdev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = nfp_nsp_hwinfo_lookup(nsp, hwinfo, sizeof(hwinfo));
|
||||||
|
nfp_nsp_close(nsp);
|
||||||
|
if (err) {
|
||||||
|
nfp_warn(pf->cpp, "Reading persistent MAC address failed: %d\n",
|
||||||
|
err);
|
||||||
|
eth_hw_addr_random(nn->dp.netdev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sscanf(hwinfo, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
|
||||||
&mac_addr[0], &mac_addr[1], &mac_addr[2],
|
&mac_addr[0], &mac_addr[1], &mac_addr[2],
|
||||||
&mac_addr[3], &mac_addr[4], &mac_addr[5]) != 6) {
|
&mac_addr[3], &mac_addr[4], &mac_addr[5]) != 6) {
|
||||||
nfp_warn(pf->cpp, "Can't parse persistent MAC address (%s)\n",
|
nfp_warn(pf->cpp, "Can't parse persistent MAC address (%s)\n",
|
||||||
mac_str);
|
hwinfo);
|
||||||
eth_hw_addr_random(nn->dp.netdev);
|
eth_hw_addr_random(nn->dp.netdev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user