Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 007f790c authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

net: introduce generic switch devices support



The goal of this is to provide a possibility to support various switch
chips. Drivers should implement relevant ndos to do so. Now there is
only one ndo defined:
- for getting physical switch id is in place.

Note that user can use random port netdevice to access the switch.

Signed-off-by: default avatarJiri Pirko <jiri@resnulli.us>
Reviewed-by: default avatarThomas Graf <tgraf@suug.ch>
Acked-by: default avatarAndy Gospodarek <gospo@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 02637fce
Loading
Loading
Loading
Loading
+59 −0
Original line number Diff line number Diff line
Switch (and switch-ish) device drivers HOWTO
===========================

Please note that the word "switch" is here used in very generic meaning.
This include devices supporting L2/L3 but also various flow offloading chips,
including switches embedded into SR-IOV NICs.

Lets describe a topology a bit. Imagine the following example:

       +----------------------------+    +---------------+
       |     SOME switch chip       |    |      CPU      |
       +----------------------------+    +---------------+
       port1 port2 port3 port4 MNGMNT    |     PCI-E     |
         |     |     |     |     |       +---------------+
        PHY   PHY    |     |     |         |  NIC0 NIC1
                     |     |     |         |   |    |
                     |     |     +- PCI-E -+   |    |
                     |     +------- MII -------+    |
                     +------------- MII ------------+

In this example, there are two independent lines between the switch silicon
and CPU. NIC0 and NIC1 drivers are not aware of a switch presence. They are
separate from the switch driver. SOME switch chip is by managed by a driver
via PCI-E device MNGMNT. Note that MNGMNT device, NIC0 and NIC1 may be
connected to some other type of bus.

Now, for the previous example show the representation in kernel:

       +----------------------------+    +---------------+
       |     SOME switch chip       |    |      CPU      |
       +----------------------------+    +---------------+
       sw0p0 sw0p1 sw0p2 sw0p3 MNGMNT    |     PCI-E     |
         |     |     |     |     |       +---------------+
        PHY   PHY    |     |     |         |  eth0 eth1
                     |     |     |         |   |    |
                     |     |     +- PCI-E -+   |    |
                     |     +------- MII -------+    |
                     +------------- MII ------------+

Lets call the example switch driver for SOME switch chip "SOMEswitch". This
driver takes care of PCI-E device MNGMNT. There is a netdevice instance sw0pX
created for each port of a switch. These netdevices are instances
of "SOMEswitch" driver. sw0pX netdevices serve as a "representation"
of the switch chip. eth0 and eth1 are instances of some other existing driver.

The only difference of the switch-port netdevice from the ordinary netdevice
is that is implements couple more NDOs:

  ndo_switch_parent_id_get - This returns the same ID for two port netdevices
			     of the same physical switch chip. This is
			     mandatory to be implemented by all switch drivers
			     and serves the caller for recognition of a port
			     netdevice.
  ndo_switch_parent_* - Functions that serve for a manipulation of the switch
			chip itself (it can be though of as a "parent" of the
			port, therefore the name). They are not port-specific.
			Caller might use arbitrary port netdevice of the same
			switch and it will make no difference.
  ndo_switch_port_* - Functions that serve for a port-specific manipulation.
+7 −0
Original line number Diff line number Diff line
@@ -9059,6 +9059,13 @@ F: lib/swiotlb.c
F:	arch/*/kernel/pci-swiotlb.c
F:	include/linux/swiotlb.h

SWITCHDEV
M:	Jiri Pirko <jiri@resnulli.us>
L:	netdev@vger.kernel.org
S:	Supported
F:	net/switchdev/
F:	include/net/switchdev.h

SYNOPSYS ARC ARCHITECTURE
M:	Vineet Gupta <vgupta@synopsys.com>
S:	Supported
+10 −0
Original line number Diff line number Diff line
@@ -1018,6 +1018,12 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev,
 *	performing GSO on a packet. The device returns true if it is
 *	able to GSO the packet, false otherwise. If the return value is
 *	false the stack will do software GSO.
 *
 * int (*ndo_switch_parent_id_get)(struct net_device *dev,
 *				   struct netdev_phys_item_id *psid);
 *	Called to get an ID of the switch chip this port is part of.
 *	If driver implements this, it indicates that it represents a port
 *	of a switch chip.
 */
struct net_device_ops {
	int			(*ndo_init)(struct net_device *dev);
@@ -1171,6 +1177,10 @@ struct net_device_ops {
	int			(*ndo_get_lock_subclass)(struct net_device *dev);
	bool			(*ndo_gso_check) (struct sk_buff *skb,
						  struct net_device *dev);
#ifdef CONFIG_NET_SWITCHDEV
	int			(*ndo_switch_parent_id_get)(struct net_device *dev,
							    struct netdev_phys_item_id *psid);
#endif
};

/**
+30 −0
Original line number Diff line number Diff line
/*
 * include/net/switchdev.h - Switch device API
 * Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */
#ifndef _LINUX_SWITCHDEV_H_
#define _LINUX_SWITCHDEV_H_

#include <linux/netdevice.h>

#ifdef CONFIG_NET_SWITCHDEV

int netdev_switch_parent_id_get(struct net_device *dev,
				struct netdev_phys_item_id *psid);

#else

static inline int netdev_switch_parent_id_get(struct net_device *dev,
					      struct netdev_phys_item_id *psid)
{
	return -EOPNOTSUPP;
}

#endif

#endif /* _LINUX_SWITCHDEV_H_ */
+1 −0
Original line number Diff line number Diff line
@@ -228,6 +228,7 @@ source "net/vmw_vsock/Kconfig"
source "net/netlink/Kconfig"
source "net/mpls/Kconfig"
source "net/hsr/Kconfig"
source "net/switchdev/Kconfig"

config RPS
	boolean
Loading