NOTICE: The Processors Wiki will End-of-Life on January 15, 2021. It is recommended to download any files or other content you may need that are hosted on processors.wiki.ti.com. The site is now set to read only.
DM814x AM387x Ethernet Switch User Guide
DM816x refers to DM816x/AM389x devices unless specified.
DM814x refers to DM814x/AM387x devices unless specified.
DM81xx refers to both DM816x, DM814x and DM813x.
Contents
- 1 Introduction
- 2 Switch Mode of Operation
- 2.1 Introduction
- 2.2 Configuring Kernel with VLAN Support
- 2.3 Switch Config Commands
- 2.3.1 CONFIG_SWITCH_ADD_MULTICAST
- 2.3.2 CONFIG_SWITCH_ADD_UNICAST
- 2.3.3 CONFIG_SWITCH_ADD_OUI
- 2.3.4 CONFIG_SWITCH_FIND_ADDR
- 2.3.5 CONFIG_SWITCH_DEL_MULTICAST
- 2.3.6 CONFIG_SWITCH_DEL_UNICAST
- 2.3.7 CONFIG_SWITCH_ADD_VLAN
- 2.3.8 CONFIG_SWITCH_FIND_VLAN
- 2.3.9 CONFIG_SWITCH_DEL_VLAN
- 2.3.10 CONFIG_SWITCH_SET_PORT_VLAN_CONFIG
- 2.3.11 CONFIG_SWITCH_TIMEOUT
- 2.3.12 CONFIG_SWITCH_DUMP
- 2.3.13 CONFIG_SWITCH_SET_FLOW_CONTROL
- 2.3.14 CONFIG_SWITCH_SET_PRIORITY_MAPPING
- 2.3.15 CONFIG_SWITCH_PORT_STATISTICS_ENABLE
- 2.3.16 CONFIG_SWITCH_CONFIG_DUMP
- 2.3.17 CONFIG_SWITCH_RATELIMIT
- 2.3.18 CONFIG_SWITCH_VID_INGRESS_CHECK
- 2.3.19 CONFIG_SWITCH_ADD_UNKNOWN_VLAN_INFO
- 2.3.20 CONFIG_SWITCH_802_1
- 2.3.21 CONFIG_SWITCH_MACAUTH
- 2.3.22 CONFIG_SWITCH_SET_PORT_CONFIG
- 2.3.23 CONFIG_SWITCH_GET_PORT_CONFIG
- 2.3.24 CONFIG_SWITCH_PORT_STATE
- 2.3.25 CONFIG_SWITCH_RESET
- 3 Dual Standalone EMAC mode
Introduction[edit]
This user guide provides an overview of the Common Platform SWitch (CPSW) driver for the TI814x, AM387x devices (also AM335x?). The CPSW or Ethernet Switch driver follows the standard Linux network interface architecture.
The driver supports the following features:
- 10/100/1000 Mbps mode of operation.
- Auto negotiation.
- Support for multicast and broadcast frames.
- Linux NAPI support
- Second switch port (from DEV_TI814XPSP_04.01.00.06 release)
- IEEE 1588/802.1AS PTP Support - http://processors.wiki.ti.com/index.php/DM814x_AM387x_IEEE_1588_Application_Notes (Supported from DEV_TI814XPSP_04.01.00.06 release)
- VLAN (Subscription common for all ports) (Supported from DEV_TI814XPSP_04.01.00.06 release)
- Ethertool (Supports only Slave 0) (Supported from DEV_TI814XPSP_04.01.00.06 release)
- Switch mode of operation (Supported from DEV_TI814XPSP_04.01.00.07 release)
- Dual Standalone EMAC mode (Not part of any release, available in arago git users on TI814XPSP_04.01.00.07 heads)
Switch Mode of Operation[edit]
Introduction[edit]
The DM814x Ethernet Switch can be configured in various different combination of Ethernet Packet forwarding and blocking. There is no such standard interface in Linux to configure a switch. This user guide provides an interface to configure the switch using Socket IOCTL through SIOCDEVPRIVATE command.
Configuring Kernel with VLAN Support[edit]
Userspace binary formats --->
Power management options --->
[*] Networking support --->
Device Drivers --->
File systems --->
Kernel hacking --->
--- Networking support
Networking options --->
[ ] Amateur Radio support --->
<*> CAN bus subsystem support --->
< > IrDA (infrared) subsystem support --->
< > Bluetooth subsystem support --->
< > RxRPC session sockets
< > The RDS Protocol (EXPERIMENTAL) < > The TIPC Protocol (EXPERIMENTAL) ---> < > Asynchronous Transfer Mode (ATM) < > Layer Two Tunneling Protocol (L2TP) ---> < > 802.1d Ethernet Bridging [ ] Distributed Switch Architecture support ---> <*> 802.1Q VLAN Support [*] GVRP (GARP VLAN Registration Protocol) support < > DECnet Support < > ANSI/IEEE 802.2 LLC type 2 Support < > The IPX protocol
Switch Config Commands[edit]
Following is sample code for configuring the switch.
<syntaxhighlight lang="c">
- include <stdio.h>
...
- include <linux/net_switch_config.h>
int main(void) { struct net_switch_config cmd_struct; struct ifreq ifr; int sockfd; strncpy(ifr.ifr_name, "eth0", IFNAMSIZ); ifr.ifr_data = (char*)&cmd_struct; if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { printf("Can't open the socket\n"); return -1; } memset(&cmd_struct, 0, sizeof(struct net_switch_config));
...//initialise cmd_struct with switch commands
if (ioctl(sockfd, SIOCDEVPRIVATE, &ifr) < 0) { printf("Command failed\n"); close(sockfd); return -1; } printf("command success\n"); close(sockfd); return 0; } </syntaxhighlight>
CONFIG_SWITCH_ADD_MULTICAST[edit]
CONFIG_SWITCH_ADD_MULTICAST is used to add a LLDP Multicast address and forward the multicast packet to the subscribed ports. If VLAN ID is greater than zero then VLAN LLDP/Multicast is added.
cmd_struct.cmd = CONFIG_SWITCH_ADD_MULTICAST
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.addr | LLDP/Multicast Address | MAC Address |
cmd_struct.cmd_data.switchcmd.mem_port | Member port Bit 0 – Host port/Port 0 |
0 – 7 |
cmd_struct.cmd_data.switchcmd.vid | VLAN ID | 0 – 4095 |
cmd_struct.cmd_data.switchcmd.flag | Super | 0/1 |
cmd_struct.cmd_data.switchcmd.untag_port | Multicast forward state | 0 – 3 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_ADD_UNICAST[edit]
CONFIG_SWITCH_ADD_UNICAST is used to add a Unicast address and forward the unicast packet to that port. If VLAN ID is greater than zero then VLAN Unicast is added.
cmd_struct.cmd = CONFIG_SWITCH_ADD_UNICAST
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.addr | Unicast Address | MAC Address |
cmd_struct.cmd_data.switchcmd.mem_port | Port Number | 0 – 2 |
cmd_struct.cmd_data.switchcmd.vid | VLAN ID | 0 – 4095 |
cmd_struct.cmd_data.switchcmd.blocked | Blocked | 0/1 |
cmd_struct.cmd_data.switchcmd.secure | Secure Bit | 0/1 |
cmd_struct.cmd_data.switchcmd.ageable | Ageable | 0/1 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_ADD_OUI[edit]
CONFIG_SWITCH_ADD_OUI is used to add a OUI address.
cmd_struct.cmd = CONFIG_SWITCH_ADD_OUI
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.addr | Unicast Address | MAC Address |
cmd_struct.cmd_data.switchcmd.mem_port | Member port Bit 0 – Host port/Port 0 |
0 – 7 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_FIND_ADDR[edit]
CONFIG_SWITCH_FIND_ADDR is used to find a address with or without VLAN ID.
cmd_struct.cmd = CONFIG_SWITCH_FIND_ADDR
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.addr | Unicast Address | MAC Address |
cmd_struct.cmd_data.switchcmd.vid | VLAN ID | 0 – 4095 |
Result
ioctl call returns success or failure.
On success cmd_struct.ret_type will hold the ALE table index
CONFIG_SWITCH_DEL_MULTICAST[edit]
CONFIG_SWITCH_DEL_MULTICAST is used to Delete a LLDP/Multicast address with or without VLAN ID.
cmd_struct.cmd = CONFIG_SWITCH_DEL_MULTICAST
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.addr | Unicast Address | MAC Address |
cmd_struct.cmd_data.switchcmd.vid | VLAN ID | 0 – 4095 |
cmd_struct.cmd_data.switchcmd.mem_port | Member port Bit 0 – Host port/Port 0 |
0 – 7 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_DEL_UNICAST[edit]
CONFIG_SWITCH_DEL_UNICAST is used to Delete a Unicast address with or without VLAN ID.
cmd_struct.cmd = CONFIG_SWITCH_DEL_UNICAST
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.addr | Unicast Address | MAC Address |
cmd_struct.cmd_data.switchcmd.vid | VLAN ID | 0 – 4095 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_ADD_VLAN[edit]
CONFIG_SWITCH_ADD_VLAN is used to add VLAN ID.
cmd_struct.cmd = CONFIG_SWITCH_ADD_VLAN
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.vid | VLAN ID | 0 – 4095 |
cmd_struct.cmd_data.switchcmd.mem_port | Member port Bit 0 – Host port/Port 0 |
0 – 7 |
cmd_struct.cmd_data.switchcmd.untag_port | Untagged Egress port mask Bit 0 – Host port/Port 0 |
0 – 7 |
cmd_struct.cmd_data.switchcmd.reg_multi | Registered Multicast flood port mask Bit 0 – Host port/Port 0 |
0 – 7 |
cmd_struct.cmd_data.switchcmd.unreg_multi | Unknown Multicast flood port mask Bit 0 – Host port/Port 0 |
0 – 7 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_FIND_VLAN[edit]
CONFIG_SWITCH_ADD_VLAN is used to add VLAN ID.
cmd_struct.cmd = CONFIG_SWITCH_ADD_VLAN
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.vid | VLAN ID | 0 – 4095 |
Result
ioctl call returns success or failure.
On success cmd_struct.ret_type will hold the ALE table index
CONFIG_SWITCH_DEL_VLAN[edit]
CONFIG_SWITCH_DEL_VLAN is used to delete VLAN ID.
cmd_struct.cmd = CONFIG_SWITCH_DEL_VLAN
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.vid | VLAN ID | 0 – 4095 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_SET_PORT_VLAN_CONFIG[edit]
CONFIG_SWITCH_SET_PORT_VLAN_CONFIG is used to set port VLAN ID.
cmd_struct.cmd = CONFIG_SWITCH_SET_PORT_VLAN_CONFIG
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.port | Port number | 0 - 2 |
cmd_struct.cmd_data.switchcmd.vid | VLAN ID | 0 – 4095 |
cmd_struct.cmd_data.switchcmd.prio_port | VLAN Priority | 0 – 7 |
cmd_struct.cmd_data.switchcmd.CFI_port | VLAN CFI | 0/1 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_TIMEOUT[edit]
CONFIG_SWITCH_TIMEOUT is used to set ALE aging timeout.
cmd_struct.cmd = CONFIG_SWITCH_TIMEOUT
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.ale_timeout | ALE age out time | Timeout in Milli second |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_DUMP[edit]
CONFIG_SWITCH_DUMP is used to dump ALE table.
cmd_struct.cmd = CONFIG_SWITCH_DUMP
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.switchcmd.aledump | ALE index | 0 - 1023 |
Result
ioctl call returns success or failure.
On success "cmd_struct.cmd_data.buf" holds ALE dump text.
CONFIG_SWITCH_SET_FLOW_CONTROL[edit]
CONFIG_SWITCH_SET_FLOW_CONTROL is used to set flow control of the ports.
cmd_struct.cmd = CONFIG_SWITCH_SET_FLOW_CONTROL
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.portcmd.port | Port Mask Bit 0 – Host port/Port 0 |
0 - 7 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_SET_PRIORITY_MAPPING[edit]
CONFIG_SWITCH_SET_PRIORITY_MAPPING is used to set priority mapping of the ports.
cmd_struct.cmd = CONFIG_SWITCH_SET_PRIORITY_MAPPING
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.portcmd.port | Port Numnber | 0 - 2 |
cmd_struct.cmd_data.priocmd.prio_rx | Receive priority | 0 - 7 |
cmd_struct.cmd_data.priocmd.prio_tx | Transmit priority | 0 - 7 |
cmd_struct.cmd_data.priocmd.prio_switch | Switch priority | 0 - 3 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_PORT_STATISTICS_ENABLE[edit]
CONFIG_SWITCH_PORT_STATISTICS_ENABLE is used to enable hardware statics of the ports.
cmd_struct.cmd = CONFIG_SWITCH_PORT_STATISTICS_ENABLE
Parameter | Description | Range |
---|---|---|
switch_config.cmd_data.switchcmd.mem_port | Port Mask Bit 0 – Host port/Port 0 |
0 - 7 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_CONFIG_DUMP[edit]
CONFIG_SWITCH_CONFIG_DUMP is used to dump the switch configuration.
cmd_struct.cmd = CONFIG_SWITCH_CONFIG_DUMP
Parameter | Description | Range |
---|---|---|
None | - | - |
Result
ioctl call returns success or failure.
On success "cmd_struct.cmd_data.buf" holds Switch dump text.
CONFIG_SWITCH_RATELIMIT[edit]
CONFIG_SWITCH_RATELIMIT is used to enable/disable rate limit of the ports.
cmd_struct.cmd = CONFIG_SWITCH_RATELIMIT
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.portcmd.enable | Enable/Disable | Enable - 1 Disable - 0 |
cmd_struct.cmd_data.portcmd.direction | Transmit/Receive | Transmit - 0 Receive - 1 |
cmd_struct.cmd_data.portcmd.port | Port number | 0 - 2 |
cmd_struct.cmd_data.portcmd.addr_type | Broadcast/Multicast | ADDR_TYPE_BROADCAST / ADDR_TYPE_MULTICAST |
cmd_struct.cmd_data.portcmd.limit | No of Packet | 0 - 255 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_VID_INGRESS_CHECK[edit]
CONFIG_SWITCH_VID_INGRESS_CHECK is used to set VLAN Ingress Check.
cmd_struct.cmd = CONFIG_SWITCH_VID_INGRESS_CHECK
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.portcmd.port | Port number | 0 - 2 |
cmd_struct.cmd_data.portcmd.vlan_ingress_check | Ingress enable/disable | Enable - 1 Disable - 0 |
cmd_struct.cmd_data.portcmd.drop_untagged | Drop untagged enable/disabe | Enable - 1 Disable - 0 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_ADD_UNKNOWN_VLAN_INFO[edit]
CONFIG_SWITCH_ADD_UNKNOWN_VLAN_INFO is used to set unknown VLAN Info.
cmd_struct.cmd = CONFIG_SWITCH_ADD_UNKNOWN_VLAN_INFO
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.portcmd.port | Port mask Bit 0 – Host port/Port 0 |
0 - 7 |
cmd_struct.cmd_data.portcmd.reg_multi_port_mask | Registered Multicast flood port mask Bit 0 – Host port/Port 0 |
0 - 7 |
cmd_struct.cmd_data.portcmd.unknown_reg_multi_port_mask | Unknown Multicast flood port mask Bit 0 – Host port/Port 0 |
0 - 7 |
cmd_struct.cmd_data.portcmd.unknown_vlan_member | Unknown Vlan Member port mask Bit 0 – Host port/Port 0 |
0 - 7 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_802_1[edit]
CONFIG_SWITCH_802_1 is used to enable 802.1 packet forwarding.
cmd_struct.cmd = CONFIG_SWITCH_802_1
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.portcmd.enable | Drop untagged enable/disabe | Enable - 1 Disable - 0 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_MACAUTH[edit]
CONFIG_SWITCH_MACAUTH is used to enable 802.1 packet forwarding.
cmd_struct.cmd = CONFIG_SWITCH_MACAUTH
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.portcmd.enable | Drop untagged enable/disabe | Enable - 1 Disable - 0 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_SET_PORT_CONFIG[edit]
CONFIG_SWITCH_SET_PORT_CONFIG is used to set Phy Config.
cmd_struct.cmd = CONFIG_SWITCH_SET_PORT_CONFIG
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.portcmd.port | Port number | 0 - 2 |
cmd_struct.cmd_data.portcmd.limit | Speed | 0 - Auto/ 10/100/1000 |
cmd_struct.cmd_data.portcmd.direction | Duplexity | Full - 1 Half - 0 |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_GET_PORT_CONFIG[edit]
CONFIG_SWITCH_GET_PORT_CONFIG is used to get Phy Config.
cmd_struct.cmd = CONFIG_SWITCH_GET_PORT_CONFIG
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.portcmd.port | Port number | 0 - 2 |
Result
ioctl call returns success or failure.
On success "cmd_struct.cmd_data.portcmd.limit" holds port speed (0 - auto/10/100/1000) and "cmd_struct.cmd_data.portcmd.direction" holds duplexity (1 - Full Duplex / 0 - Half Duplex)
CONFIG_SWITCH_PORT_STATE[edit]
CONFIG_SWITCH_PORT_STATE is used to set port status.
cmd_struct.cmd = CONFIG_SWITCH_PORT_STATE
Parameter | Description | Range |
---|---|---|
cmd_struct.cmd_data.portcmd.port | Port number | 0 - 2 |
cmd_struct.cmd_data.portcmd.port_state | Port state | PORT_STATE_DISABLED/ PORT_STATE_BLOCKED/ PORT_STATE_LEARN/ PORT_STATE_FORWARD |
Result
ioctl call returns success or failure.
CONFIG_SWITCH_RESET[edit]
CONFIG_SWITCH_RESET is used to reset the switch.
cmd_struct.cmd = CONFIG_SWITCH_RESET
Parameter | Description | Range |
---|---|---|
None | - | - |
Result
ioctl call returns success or failure.
Dual Standalone EMAC mode[edit]
Introduction[edit]
This section provides the user guide for Dual Emac mode implementation. Following are the assumptions made for Dual Emac mode implementation
Assumptions[edit]
- Interrupt source is common for both eth interfaces
- CPDMA and skb buffers are common for both eth interfaces
- If eth0 is up, then eth0 napi is used. eth1 napi is used when eth0 interface is down
- CPSW and ALE will be in VLAN aware mode irrespective of enabling of 802.1Q module in Linux network stack for adding port VLAN.
- Interrupt pacing is common for both interfaces
- Hardware statistics is common for all the ports
- Switch config will not be available in dual emac interface mode
Constrains[edit]
The following are the constrains for Dual Emac mode implementation
- VLAN id 2 and 3 are reserved for EMAC 0 and 1 respectively for port segregation
- While adding VLAN id to the eth interfaces, same VLAN id should not be added in both interfaces which will lead to VLAN forwarding and act as switch
- While adding Multicast MAC ids to the eth interfaces, same Multicast MAC should not be added in both interfaces which will lead to Multicast forwarding and act as switch
- Sysfs ALE table and control interfaces are available in eth0 interface only
- Manual ip for eth1 is not supported from Linux kernel arguments
Compiling kernel[edit]
Userspace binary formats --->
Power management options --->
[*] Networking support --->
Device Drivers --->
File systems --->
Kernel hacking --->
Generic Driver Options --->
< > Connector - unified userspace <-> kernelspace linker --->
<*> Memory Technology Device (MTD) support --->
< > Parallel port support --->
[*] Block devices --->
[*] Misc devices --->
< > ATA/ATAPI/MFM/RLL support (DEPRECATED) --->
SCSI device support --->
<*> Serial ATA and Parallel ATA drivers --->
[ ] Multiple devices driver support (RAID and LVM) --->
[ ] Fusion MPT device support --->
IEEE 1394 (FireWire) support --->
< > I2O device support --->
[*] Network device support --->
[ ] ISDN support --->
< > Telephony support --->
Input device support --->
--- Network device support
< > Dummy net driver support
< > Bonding driver support
< > MAC-VLAN support (EXPERIMENTAL)
< > EQL (serial line load balancing) support
< > Universal TUN/TAP device driver support
< > Virtual ethernet pair device
< > ARCnet support --->
-*- Generic Media Independent Interface device support
-*- PHY Device support and infrastructure --->
[ ] Ethernet (10 or 100Mbit) --->
[*] Ethernet (1000 Mbit) --->
[ ] Ethernet (10000 Mbit) --->
< > Token Ring driver support --->
[ ] Wireless LAN --->
--- Ethernet (1000 Mbit)
< > Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support
< > DL2000/TC902x-based Gigabit Ethernet support
-*- TI DaVinci MDIO Support
-*- TI DaVinci CPDMA Support
<*> TI CPSW Switch Support
[*] TI CPSW Switch as Dual EMAC
< > Intel(R) PRO/1000 Gigabit Ethernet support
< > Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support
< > IP1000 Gigabit Ethernet support
Bringing Up interfaces[edit]
Eth0 will be up by-default. Eth1 interface has to be brought up manually using either of the folloing command or through init scripts
DHCP[edit]
ifup eth1
Manual IP[edit]
ifconfig eth1 <ip> netmask <mask> up