aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/netronome/nfp/abm
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2018-05-21 22:12:53 -0700
committerDavid S. Miller <davem@davemloft.net>2018-05-23 14:26:19 -0400
commit1f70036723e10b165627bb11a7809eed80d43a16 (patch)
tree15f9353bb0daa937a09738465468ce97ab594327 /drivers/net/ethernet/netronome/nfp/abm
parentnfp: abm: spawn port netdevs (diff)
downloadlinux-dev-1f70036723e10b165627bb11a7809eed80d43a16.tar.xz
linux-dev-1f70036723e10b165627bb11a7809eed80d43a16.zip
nfp: abm: force Ethternet port up
Current control firmware does not cater too well to multi-host applications. There is no way to check which hosts are up or otherwise negotiate what the state of the external port (the Ethernet port) should be. Make sure the link is up when driver loads, and don't take it down when Ethernet port netdev is closed. 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>
Diffstat (limited to 'drivers/net/ethernet/netronome/nfp/abm')
-rw-r--r--drivers/net/ethernet/netronome/nfp/abm/main.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c
index d8f1bdac02b8..7afd24ce79a5 100644
--- a/drivers/net/ethernet/netronome/nfp/abm/main.c
+++ b/drivers/net/ethernet/netronome/nfp/abm/main.c
@@ -103,6 +103,7 @@ nfp_abm_spawn_repr(struct nfp_app *app, struct nfp_abm_link *alink,
}
if (ptype == NFP_PORT_PHYS_PORT) {
+ port->eth_forced = true;
err = nfp_port_init_phy_port(app->pf, app, port, alink->id);
if (err)
goto err_free_port;
@@ -276,8 +277,10 @@ nfp_abm_vnic_set_mac(struct nfp_pf *pf, struct nfp_abm *abm, struct nfp_net *nn,
static int
nfp_abm_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id)
{
+ struct nfp_eth_table_port *eth_port = &app->pf->eth_tbl->ports[id];
struct nfp_abm *abm = app->priv;
struct nfp_abm_link *alink;
+ int err;
alink = kzalloc(sizeof(*alink), GFP_KERNEL);
if (!alink)
@@ -287,12 +290,23 @@ nfp_abm_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id)
alink->vnic = nn;
alink->id = id;
+ /* This is a multi-host app, make sure MAC/PHY is up, but don't
+ * make the MAC/PHY state follow the state of any of the ports.
+ */
+ err = nfp_eth_set_configured(app->cpp, eth_port->index, true);
+ if (err < 0)
+ goto err_free_alink;
+
netif_keep_dst(nn->dp.netdev);
nfp_abm_vnic_set_mac(app->pf, abm, nn, id);
nfp_abm_ctrl_read_params(alink);
return 0;
+
+err_free_alink:
+ kfree(alink);
+ return err;
}
static void nfp_abm_vnic_free(struct nfp_app *app, struct nfp_net *nn)