nfp: add phys_switch_id support
authorSimon Horman <simon.horman@netronome.com>
Thu, 29 Jun 2017 20:08:12 +0000 (22:08 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 1 Jul 2017 15:51:32 +0000 (08:51 -0700)
Add phys_switch_id support by allowing lookup of
SWITCHDEV_ATTR_ID_PORT_PARENT_ID via the nfp_repr_port_attr_get
switchdev operation.

This is visible to user-space in the phys_switch_id attribute
of a netdev.

e.g.

cd /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0
find . -name phys_switch_id | xargs grep .
./net/eth3/phys_switch_id:00154d1300bd
./net/eth4/phys_switch_id:00154d1300bd
./net/eth2/phys_switch_id:00154d1300bd
grep: ./net/eth5/phys_switch_id: Operation not supported

In the above eth2 and eth3 and representor netdevs for the first and second
physical port. eth4 is the representor for the PF. And eth5 is the PF netdev.

Signed-off-by: Simon Horman <simon.horman@netronome.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfp_net_common.c
drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
drivers/net/ethernet/netronome/nfp/nfp_port.c
drivers/net/ethernet/netronome/nfp/nfp_port.h

index 2e728543e8402b46db04c4c614b08256a6f03e78..b5834525c5f0bfb283297b0d179e2d646878d0da 100644 (file)
@@ -64,6 +64,7 @@
 #include <linux/vmalloc.h>
 #include <linux/ktime.h>
 
+#include <net/switchdev.h>
 #include <net/vxlan.h>
 
 #include "nfpcore/nfp_nsp.h"
@@ -3703,6 +3704,8 @@ static void nfp_net_netdev_init(struct nfp_net *nn)
        netdev->netdev_ops = &nfp_net_netdev_ops;
        netdev->watchdog_timeo = msecs_to_jiffies(5 * 1000);
 
+       SWITCHDEV_SET_OPS(netdev, &nfp_port_switchdev_ops);
+
        /* MTU range: 68 - hw-specific max */
        netdev->min_mtu = ETH_MIN_MTU;
        netdev->max_mtu = nn->max_mtu;
index 046b89eb4cf2f396af65f1d56c936796f9b694e8..bc9108071e5b997fa29588abe58e4bc089af8a77 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/io-64-nonatomic-hi-lo.h>
 #include <linux/lockdep.h>
 #include <net/dst_metadata.h>
+#include <net/switchdev.h>
 
 #include "nfpcore/nfp_cpp.h"
 #include "nfpcore/nfp_nsp.h"
@@ -299,6 +300,7 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
        repr->dst->u.port_info.lower_dev = pf_netdev;
 
        netdev->netdev_ops = &nfp_repr_netdev_ops;
+       SWITCHDEV_SET_OPS(netdev, &nfp_port_switchdev_ops);
 
        err = register_netdev(netdev);
        if (err)
index 0b44952945d884128e9d0d9026796be671cb9be0..3aa834fb225040665314ba7c15284d495eec4427 100644 (file)
@@ -32,6 +32,7 @@
  */
 
 #include <linux/lockdep.h>
+#include <net/switchdev.h>
 
 #include "nfpcore/nfp_cpp.h"
 #include "nfpcore/nfp_nsp.h"
@@ -59,6 +60,34 @@ struct nfp_port *nfp_port_from_netdev(struct net_device *netdev)
        return NULL;
 }
 
+static int
+nfp_port_attr_get(struct net_device *netdev, struct switchdev_attr *attr)
+{
+       struct nfp_port *port;
+
+       port = nfp_port_from_netdev(netdev);
+       if (!port)
+               return -EOPNOTSUPP;
+
+       switch (attr->id) {
+       case SWITCHDEV_ATTR_ID_PORT_PARENT_ID: {
+               const u8 *serial;
+               /* N.B: attr->u.ppid.id is binary data */
+               attr->u.ppid.id_len = nfp_cpp_serial(port->app->cpp, &serial);
+               memcpy(&attr->u.ppid.id, serial, attr->u.ppid.id_len);
+               break;
+       }
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       return 0;
+}
+
+const struct switchdev_ops nfp_port_switchdev_ops = {
+       .switchdev_port_attr_get        = nfp_port_attr_get,
+};
+
 struct nfp_port *
 nfp_port_from_id(struct nfp_pf *pf, enum nfp_port_type type, unsigned int id)
 {
index 57d852a4ca59c826702a15f9b82f1614a62703a5..1ceef5d4a744a388c61e8c5359d65adb41e8d621 100644 (file)
@@ -106,6 +106,8 @@ struct nfp_port {
        struct list_head port_list;
 };
 
+extern const struct switchdev_ops nfp_port_switchdev_ops;
+
 struct nfp_port *nfp_port_from_netdev(struct net_device *netdev);
 struct nfp_port *
 nfp_port_from_id(struct nfp_pf *pf, enum nfp_port_type type, unsigned int id);