Commit f6e71efd authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

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: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarDirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 34243f59
...@@ -540,8 +540,9 @@ nfp_abm_vnic_set_mac(struct nfp_pf *pf, struct nfp_abm *abm, struct nfp_net *nn, ...@@ -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, ...@@ -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);
return;
}
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); eth_hw_addr_random(nn->dp.netdev);
return; return;
} }
if (sscanf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", 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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment