diff options
author | Jakub Kicinski <jakub.kicinski@netronome.com> | 2018-05-21 22:12:53 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-05-23 14:26:19 -0400 |
commit | 1f70036723e10b165627bb11a7809eed80d43a16 (patch) | |
tree | 15f9353bb0daa937a09738465468ce97ab594327 /drivers/net/ethernet/netronome/nfp/abm | |
parent | nfp: abm: spawn port netdevs (diff) | |
download | linux-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.c | 14 |
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) |