nfp: devlink port split support for 1x100G CXP NIC

This commit makes it possible to use devlink to split the 100G CXP
Netronome into two 40G interfaces. Currently when you ask for 2
interfaces, the math in src/nfp_devlink.c:nfp_devlink_port_split
calculates that you want 5 lanes per port because for some reason
eth_port.port_lanes=10 (shouldn't this be 12 for CXP?). What we really
want when asking for 2 breakout interfaces is 4 lanes per port. This
commit makes that happen by calculating based on 8 lanes if 10 are
present.

Signed-off-by: Ryan C Goodfellow <rgoodfel@isi.edu>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Greg Weeks <greg.weeks@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Ryan C Goodfellow 2018-10-12 11:09:01 -07:00 committed by David S. Miller
parent ca0f32d5d9
commit 5948185b97
1 changed files with 14 additions and 3 deletions

View File

@ -66,6 +66,7 @@ nfp_devlink_port_split(struct devlink *devlink, unsigned int port_index,
{ {
struct nfp_pf *pf = devlink_priv(devlink); struct nfp_pf *pf = devlink_priv(devlink);
struct nfp_eth_table_port eth_port; struct nfp_eth_table_port eth_port;
unsigned int lanes;
int ret; int ret;
if (count < 2) if (count < 2)
@ -84,8 +85,12 @@ nfp_devlink_port_split(struct devlink *devlink, unsigned int port_index,
goto out; goto out;
} }
ret = nfp_devlink_set_lanes(pf, eth_port.index, /* Special case the 100G CXP -> 2x40G split */
eth_port.port_lanes / count); lanes = eth_port.port_lanes / count;
if (eth_port.lanes == 10 && count == 2)
lanes = 8 / count;
ret = nfp_devlink_set_lanes(pf, eth_port.index, lanes);
out: out:
mutex_unlock(&pf->lock); mutex_unlock(&pf->lock);
@ -98,6 +103,7 @@ nfp_devlink_port_unsplit(struct devlink *devlink, unsigned int port_index,
{ {
struct nfp_pf *pf = devlink_priv(devlink); struct nfp_pf *pf = devlink_priv(devlink);
struct nfp_eth_table_port eth_port; struct nfp_eth_table_port eth_port;
unsigned int lanes;
int ret; int ret;
mutex_lock(&pf->lock); mutex_lock(&pf->lock);
@ -113,7 +119,12 @@ nfp_devlink_port_unsplit(struct devlink *devlink, unsigned int port_index,
goto out; goto out;
} }
ret = nfp_devlink_set_lanes(pf, eth_port.index, eth_port.port_lanes); /* Special case the 100G CXP -> 2x40G unsplit */
lanes = eth_port.port_lanes;
if (eth_port.port_lanes == 8)
lanes = 10;
ret = nfp_devlink_set_lanes(pf, eth_port.index, lanes);
out: out:
mutex_unlock(&pf->lock); mutex_unlock(&pf->lock);