1132db935SJakub Kicinski.. SPDX-License-Identifier: GPL-2.0
2132db935SJakub Kicinski
3132db935SJakub Kicinski======================================================
4132db935SJakub KicinskiTexas Instruments CPSW switchdev based ethernet driver
5132db935SJakub Kicinski======================================================
6132db935SJakub Kicinski
7132db935SJakub Kicinski:Version: 2.0
8132db935SJakub Kicinski
9132db935SJakub KicinskiPort renaming
10132db935SJakub Kicinski=============
11132db935SJakub Kicinski
12132db935SJakub KicinskiOn older udev versions renaming of ethX to swXpY will not be automatically
13132db935SJakub Kicinskisupported
14132db935SJakub Kicinski
15132db935SJakub KicinskiIn order to rename via udev::
16132db935SJakub Kicinski
17132db935SJakub Kicinski    ip -d link show dev sw0p1 | grep switchid
18132db935SJakub Kicinski
19132db935SJakub Kicinski    SUBSYSTEM=="net", ACTION=="add", ATTR{phys_switch_id}==<switchid>, \
20132db935SJakub Kicinski	    ATTR{phys_port_name}!="", NAME="sw0$attr{phys_port_name}"
21132db935SJakub Kicinski
22132db935SJakub Kicinski
23132db935SJakub KicinskiDual mac mode
24132db935SJakub Kicinski=============
25132db935SJakub Kicinski
26132db935SJakub Kicinski- The new (cpsw_new.c) driver is operating in dual-emac mode by default, thus
27132db935SJakub Kicinski  working as 2 individual network interfaces. Main differences from legacy CPSW
28132db935SJakub Kicinski  driver are:
29132db935SJakub Kicinski
30132db935SJakub Kicinski - optimized promiscuous mode: The P0_UNI_FLOOD (both ports) is enabled in
31132db935SJakub Kicinski   addition to ALLMULTI (current port) instead of ALE_BYPASS.
32132db935SJakub Kicinski   So, Ports in promiscuous mode will keep possibility of mcast and vlan
33132db935SJakub Kicinski   filtering, which is provides significant benefits when ports are joined
34132db935SJakub Kicinski   to the same bridge, but without enabling "switch" mode, or to different
35132db935SJakub Kicinski   bridges.
36132db935SJakub Kicinski - learning disabled on ports as it make not too much sense for
37132db935SJakub Kicinski   segregated ports - no forwarding in HW.
38132db935SJakub Kicinski - enabled basic support for devlink.
39132db935SJakub Kicinski
40132db935SJakub Kicinski   ::
41132db935SJakub Kicinski
42132db935SJakub Kicinski	devlink dev show
43132db935SJakub Kicinski		platform/48484000.switch
44132db935SJakub Kicinski
45132db935SJakub Kicinski	devlink dev param show
46132db935SJakub Kicinski	platform/48484000.switch:
47132db935SJakub Kicinski	name switch_mode type driver-specific
48132db935SJakub Kicinski	values:
49132db935SJakub Kicinski		cmode runtime value false
50132db935SJakub Kicinski	name ale_bypass type driver-specific
51132db935SJakub Kicinski	values:
52132db935SJakub Kicinski		cmode runtime value false
53132db935SJakub Kicinski
54132db935SJakub KicinskiDevlink configuration parameters
55132db935SJakub Kicinski================================
56132db935SJakub Kicinski
57132db935SJakub KicinskiSee Documentation/networking/devlink/ti-cpsw-switch.rst
58132db935SJakub Kicinski
59132db935SJakub KicinskiBridging in dual mac mode
60132db935SJakub Kicinski=========================
61132db935SJakub Kicinski
62132db935SJakub KicinskiThe dual_mac mode requires two vids to be reserved for internal purposes,
63132db935SJakub Kicinskiwhich, by default, equal CPSW Port numbers. As result, bridge has to be
64132db935SJakub Kicinskiconfigured in vlan unaware mode or default_pvid has to be adjusted::
65132db935SJakub Kicinski
66132db935SJakub Kicinski	ip link add name br0 type bridge
67132db935SJakub Kicinski	ip link set dev br0 type bridge vlan_filtering 0
68132db935SJakub Kicinski	echo 0 > /sys/class/net/br0/bridge/default_pvid
69132db935SJakub Kicinski	ip link set dev sw0p1 master br0
70132db935SJakub Kicinski	ip link set dev sw0p2 master br0
71132db935SJakub Kicinski
72132db935SJakub Kicinskior::
73132db935SJakub Kicinski
74132db935SJakub Kicinski	ip link add name br0 type bridge
75132db935SJakub Kicinski	ip link set dev br0 type bridge vlan_filtering 0
76132db935SJakub Kicinski	echo 100 > /sys/class/net/br0/bridge/default_pvid
77132db935SJakub Kicinski	ip link set dev br0 type bridge vlan_filtering 1
78132db935SJakub Kicinski	ip link set dev sw0p1 master br0
79132db935SJakub Kicinski	ip link set dev sw0p2 master br0
80132db935SJakub Kicinski
81132db935SJakub KicinskiEnabling "switch"
82132db935SJakub Kicinski=================
83132db935SJakub Kicinski
84132db935SJakub KicinskiThe Switch mode can be enabled by configuring devlink driver parameter
85132db935SJakub Kicinski"switch_mode" to 1/true::
86132db935SJakub Kicinski
87132db935SJakub Kicinski	devlink dev param set platform/48484000.switch \
88132db935SJakub Kicinski	name switch_mode value 1 cmode runtime
89132db935SJakub Kicinski
90132db935SJakub KicinskiThis can be done regardless of the state of Port's netdev devices - UP/DOWN, but
91132db935SJakub KicinskiPort's netdev devices have to be in UP before joining to the bridge to avoid
92132db935SJakub Kicinskioverwriting of bridge configuration as CPSW switch driver copletly reloads its
93132db935SJakub Kicinskiconfiguration when first Port changes its state to UP.
94132db935SJakub Kicinski
95132db935SJakub KicinskiWhen the both interfaces joined the bridge - CPSW switch driver will enable
96132db935SJakub Kicinskimarking packets with offload_fwd_mark flag unless "ale_bypass=0"
97132db935SJakub Kicinski
98132db935SJakub KicinskiAll configuration is implemented via switchdev API.
99132db935SJakub Kicinski
100132db935SJakub KicinskiBridge setup
101132db935SJakub Kicinski============
102132db935SJakub Kicinski
103132db935SJakub Kicinski::
104132db935SJakub Kicinski
105132db935SJakub Kicinski	devlink dev param set platform/48484000.switch \
106132db935SJakub Kicinski	name switch_mode value 1 cmode runtime
107132db935SJakub Kicinski
108132db935SJakub Kicinski	ip link add name br0 type bridge
109132db935SJakub Kicinski	ip link set dev br0 type bridge ageing_time 1000
110132db935SJakub Kicinski	ip link set dev sw0p1 up
111132db935SJakub Kicinski	ip link set dev sw0p2 up
112132db935SJakub Kicinski	ip link set dev sw0p1 master br0
113132db935SJakub Kicinski	ip link set dev sw0p2 master br0
114132db935SJakub Kicinski
115132db935SJakub Kicinski	[*] bridge vlan add dev br0 vid 1 pvid untagged self
116132db935SJakub Kicinski
117132db935SJakub Kicinski	[*] if vlan_filtering=1. where default_pvid=1
118132db935SJakub Kicinski
119132db935SJakub Kicinski	Note. Steps [*] are mandatory.
120132db935SJakub Kicinski
121132db935SJakub Kicinski
122132db935SJakub KicinskiOn/off STP
123132db935SJakub Kicinski==========
124132db935SJakub Kicinski
125132db935SJakub Kicinski::
126132db935SJakub Kicinski
127132db935SJakub Kicinski	ip link set dev BRDEV type bridge stp_state 1/0
128132db935SJakub Kicinski
129132db935SJakub KicinskiVLAN configuration
130132db935SJakub Kicinski==================
131132db935SJakub Kicinski
132132db935SJakub Kicinski::
133132db935SJakub Kicinski
134132db935SJakub Kicinski  bridge vlan add dev br0 vid 1 pvid untagged self <---- add cpu port to VLAN 1
135132db935SJakub Kicinski
136132db935SJakub KicinskiNote. This step is mandatory for bridge/default_pvid.
137132db935SJakub Kicinski
138132db935SJakub KicinskiAdd extra VLANs
139132db935SJakub Kicinski===============
140132db935SJakub Kicinski
141132db935SJakub Kicinski 1. untagged::
142132db935SJakub Kicinski
143132db935SJakub Kicinski	bridge vlan add dev sw0p1 vid 100 pvid untagged master
144132db935SJakub Kicinski	bridge vlan add dev sw0p2 vid 100 pvid untagged master
145132db935SJakub Kicinski	bridge vlan add dev br0 vid 100 pvid untagged self <---- Add cpu port to VLAN100
146132db935SJakub Kicinski
147132db935SJakub Kicinski 2. tagged::
148132db935SJakub Kicinski
149132db935SJakub Kicinski	bridge vlan add dev sw0p1 vid 100 master
150132db935SJakub Kicinski	bridge vlan add dev sw0p2 vid 100 master
151132db935SJakub Kicinski	bridge vlan add dev br0 vid 100 pvid tagged self <---- Add cpu port to VLAN100
152132db935SJakub Kicinski
153132db935SJakub KicinskiFDBs
154132db935SJakub Kicinski----
155132db935SJakub Kicinski
156132db935SJakub KicinskiFDBs are automatically added on the appropriate switch port upon detection
157132db935SJakub Kicinski
158132db935SJakub KicinskiManually adding FDBs::
159132db935SJakub Kicinski
160132db935SJakub Kicinski    bridge fdb add aa:bb:cc:dd:ee:ff dev sw0p1 master vlan 100
161132db935SJakub Kicinski    bridge fdb add aa:bb:cc:dd:ee:fe dev sw0p2 master <---- Add on all VLANs
162132db935SJakub Kicinski
163132db935SJakub KicinskiMDBs
164132db935SJakub Kicinski----
165132db935SJakub Kicinski
166132db935SJakub KicinskiMDBs are automatically added on the appropriate switch port upon detection
167132db935SJakub Kicinski
168132db935SJakub KicinskiManually adding MDBs::
169132db935SJakub Kicinski
170132db935SJakub Kicinski  bridge mdb add dev br0 port sw0p1 grp 239.1.1.1 permanent vid 100
171132db935SJakub Kicinski  bridge mdb add dev br0 port sw0p1 grp 239.1.1.1 permanent <---- Add on all VLANs
172132db935SJakub Kicinski
173132db935SJakub KicinskiMulticast flooding
174132db935SJakub Kicinski==================
175132db935SJakub KicinskiCPU port mcast_flooding is always on
176132db935SJakub Kicinski
177*a266ef69SRandy DunlapTurning flooding on/off on switch ports:
178132db935SJakub Kicinskibridge link set dev sw0p1 mcast_flood on/off
179132db935SJakub Kicinski
180132db935SJakub KicinskiAccess and Trunk port
181132db935SJakub Kicinski=====================
182132db935SJakub Kicinski
183132db935SJakub Kicinski::
184132db935SJakub Kicinski
185132db935SJakub Kicinski bridge vlan add dev sw0p1 vid 100 pvid untagged master
186132db935SJakub Kicinski bridge vlan add dev sw0p2 vid 100 master
187132db935SJakub Kicinski
188132db935SJakub Kicinski
189132db935SJakub Kicinski bridge vlan add dev br0 vid 100 self
190132db935SJakub Kicinski ip link add link br0 name br0.100 type vlan id 100
191132db935SJakub Kicinski
192132db935SJakub KicinskiNote. Setting PVID on Bridge device itself working only for
193132db935SJakub Kicinskidefault VLAN (default_pvid).
194132db935SJakub Kicinski
195132db935SJakub KicinskiNFS
196132db935SJakub Kicinski===
197132db935SJakub Kicinski
198132db935SJakub KicinskiThe only way for NFS to work is by chrooting to a minimal environment when
199132db935SJakub Kicinskiswitch configuration that will affect connectivity is needed.
200132db935SJakub KicinskiAssuming you are booting NFS with eth1 interface(the script is hacky and
201132db935SJakub Kicinskiit's just there to prove NFS is doable).
202132db935SJakub Kicinski
203132db935SJakub Kicinskisetup.sh::
204132db935SJakub Kicinski
205132db935SJakub Kicinski	#!/bin/sh
206132db935SJakub Kicinski	mkdir proc
207132db935SJakub Kicinski	mount -t proc none /proc
208132db935SJakub Kicinski	ifconfig br0  > /dev/null
209132db935SJakub Kicinski	if [ $? -ne 0 ]; then
210132db935SJakub Kicinski		echo "Setting up bridge"
211132db935SJakub Kicinski		ip link add name br0 type bridge
212132db935SJakub Kicinski		ip link set dev br0 type bridge ageing_time 1000
213132db935SJakub Kicinski		ip link set dev br0 type bridge vlan_filtering 1
214132db935SJakub Kicinski
215132db935SJakub Kicinski		ip link set eth1 down
216132db935SJakub Kicinski		ip link set eth1 name sw0p1
217132db935SJakub Kicinski		ip link set dev sw0p1 up
218132db935SJakub Kicinski		ip link set dev sw0p2 up
219132db935SJakub Kicinski		ip link set dev sw0p2 master br0
220132db935SJakub Kicinski		ip link set dev sw0p1 master br0
221132db935SJakub Kicinski		bridge vlan add dev br0 vid 1 pvid untagged self
222132db935SJakub Kicinski		ifconfig sw0p1 0.0.0.0
223132db935SJakub Kicinski		udhchc -i br0
224132db935SJakub Kicinski	fi
225132db935SJakub Kicinski	umount /proc
226132db935SJakub Kicinski
227132db935SJakub Kicinskirun_nfs.sh:::
228132db935SJakub Kicinski
229132db935SJakub Kicinski	#!/bin/sh
230132db935SJakub Kicinski	mkdir /tmp/root/bin -p
231132db935SJakub Kicinski	mkdir /tmp/root/lib -p
232132db935SJakub Kicinski
233132db935SJakub Kicinski	cp -r /lib/ /tmp/root/
234132db935SJakub Kicinski	cp -r /bin/ /tmp/root/
235132db935SJakub Kicinski	cp /sbin/ip /tmp/root/bin
236132db935SJakub Kicinski	cp /sbin/bridge /tmp/root/bin
237132db935SJakub Kicinski	cp /sbin/ifconfig /tmp/root/bin
238132db935SJakub Kicinski	cp /sbin/udhcpc /tmp/root/bin
239132db935SJakub Kicinski	cp /path/to/setup.sh /tmp/root/bin
240132db935SJakub Kicinski	chroot /tmp/root/ busybox sh /bin/setup.sh
241132db935SJakub Kicinski
242132db935SJakub Kicinski	run ./run_nfs.sh
243