]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
nfp: devlink port split support for 1x100G CXP NIC
authorRyan C Goodfellow <rgoodfel@isi.edu>
Fri, 12 Oct 2018 18:09:01 +0000 (11:09 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 16 Oct 2018 05:29:55 +0000 (22:29 -0700)
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>
drivers/net/ethernet/netronome/nfp/nfp_devlink.c

index 107b048b33b4584d46a0dab1f0a5b452450270cd..808647ec35734e3275421d3fb29d1b2f0087f311 100644 (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_eth_table_port eth_port;
+       unsigned int lanes;
        int ret;
 
        if (count < 2)
@@ -84,8 +85,12 @@ nfp_devlink_port_split(struct devlink *devlink, unsigned int port_index,
                goto out;
        }
 
-       ret = nfp_devlink_set_lanes(pf, eth_port.index,
-                                   eth_port.port_lanes / count);
+       /* Special case the 100G CXP -> 2x40G split */
+       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:
        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_eth_table_port eth_port;
+       unsigned int lanes;
        int ret;
 
        mutex_lock(&pf->lock);
@@ -113,7 +119,12 @@ nfp_devlink_port_unsplit(struct devlink *devlink, unsigned int port_index,
                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:
        mutex_unlock(&pf->lock);