Jiri Pirko | 007f790 | 2014-11-28 14:34:17 +0100 | [diff] [blame] | 1 | Switch (and switch-ish) device drivers HOWTO |
| 2 | =========================== |
| 3 | |
| 4 | Please note that the word "switch" is here used in very generic meaning. |
| 5 | This include devices supporting L2/L3 but also various flow offloading chips, |
| 6 | including switches embedded into SR-IOV NICs. |
| 7 | |
| 8 | Lets describe a topology a bit. Imagine the following example: |
| 9 | |
| 10 | +----------------------------+ +---------------+ |
| 11 | | SOME switch chip | | CPU | |
| 12 | +----------------------------+ +---------------+ |
| 13 | port1 port2 port3 port4 MNGMNT | PCI-E | |
| 14 | | | | | | +---------------+ |
| 15 | PHY PHY | | | | NIC0 NIC1 |
| 16 | | | | | | | |
| 17 | | | +- PCI-E -+ | | |
| 18 | | +------- MII -------+ | |
| 19 | +------------- MII ------------+ |
| 20 | |
| 21 | In this example, there are two independent lines between the switch silicon |
| 22 | and CPU. NIC0 and NIC1 drivers are not aware of a switch presence. They are |
| 23 | separate from the switch driver. SOME switch chip is by managed by a driver |
| 24 | via PCI-E device MNGMNT. Note that MNGMNT device, NIC0 and NIC1 may be |
| 25 | connected to some other type of bus. |
| 26 | |
| 27 | Now, for the previous example show the representation in kernel: |
| 28 | |
| 29 | +----------------------------+ +---------------+ |
| 30 | | SOME switch chip | | CPU | |
| 31 | +----------------------------+ +---------------+ |
| 32 | sw0p0 sw0p1 sw0p2 sw0p3 MNGMNT | PCI-E | |
| 33 | | | | | | +---------------+ |
| 34 | PHY PHY | | | | eth0 eth1 |
| 35 | | | | | | | |
| 36 | | | +- PCI-E -+ | | |
| 37 | | +------- MII -------+ | |
| 38 | +------------- MII ------------+ |
| 39 | |
| 40 | Lets call the example switch driver for SOME switch chip "SOMEswitch". This |
| 41 | driver takes care of PCI-E device MNGMNT. There is a netdevice instance sw0pX |
| 42 | created for each port of a switch. These netdevices are instances |
| 43 | of "SOMEswitch" driver. sw0pX netdevices serve as a "representation" |
| 44 | of the switch chip. eth0 and eth1 are instances of some other existing driver. |
| 45 | |
| 46 | The only difference of the switch-port netdevice from the ordinary netdevice |
| 47 | is that is implements couple more NDOs: |
| 48 | |
| 49 | ndo_switch_parent_id_get - This returns the same ID for two port netdevices |
| 50 | of the same physical switch chip. This is |
| 51 | mandatory to be implemented by all switch drivers |
| 52 | and serves the caller for recognition of a port |
| 53 | netdevice. |
| 54 | ndo_switch_parent_* - Functions that serve for a manipulation of the switch |
| 55 | chip itself (it can be though of as a "parent" of the |
| 56 | port, therefore the name). They are not port-specific. |
| 57 | Caller might use arbitrary port netdevice of the same |
| 58 | switch and it will make no difference. |
| 59 | ndo_switch_port_* - Functions that serve for a port-specific manipulation. |