mirror of https://gitee.com/openkylin/linux.git
60 lines
2.9 KiB
Plaintext
60 lines
2.9 KiB
Plaintext
|
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.
|