summaryrefslogtreecommitdiffstats
path: root/target/linux/generic/files/Documentation/networking/adm6996.txt
blob: ab59f1df0337132580aeb1c48aea5afb2722f88f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
------- 

ADM6996FC / ADM6996M switch chip driver


1. General information

  This driver supports the FC and M models only. The ADM6996F and L are
  completely different chips.
  
  Support for the FC model is extremely limited at the moment. There is no VLAN
  support as of yet. The driver will not offer an swconfig interface for the FC
  chip.
 
1.1 VLAN IDs

  It is possible to define 16 different VLANs. Every VLAN has an identifier, its
  VLAN ID. It is easiest if you use at most VLAN IDs 0-15. In that case, the
  swconfig based configuration is very straightforward. To define two VLANs with
  IDs 4 and 5, you can invoke, for example:
  
      # swconfig dev ethX vlan 4 set ports '0 1t 2 5t' 
      # swconfig dev ethX vlan 5 set ports '0t 1t 5t'
  
  The swconfig framework will automatically invoke 'port Y set pvid Z' for every
  port that is an untagged member of VLAN Y, setting its Primary VLAN ID. In
  this example, ports 0 and 2 would get "pvid 4". The Primary VLAN ID of a port
  is the VLAN ID associated with untagged packets coming in on that port.
  
  But if you wish to use VLAN IDs outside the range 0-15, this automatic
  behaviour of the swconfig framework becomes a problem. The 16 VLANs that
  swconfig can configure on the ADM6996 also have a "vid" setting. By default,
  this is the same as the number of the VLAN entry, to make the simple behaviour
  above possible. To still support a VLAN with a VLAN ID higher than 15
  (presumably because you are in a network where such VLAN IDs are already in
  use), you can change the "vid" setting of the VLAN to anything in the range
  0-1023. But suppose you did the following:
  
      # swconfig dev ethX vlan 0 set vid 998 
      # swconfig dev ethX vlan 0 set ports '0 2 5t'
 
  Now the swconfig framework will issue 'port 0 set pvid 0' and 'port 2 set pvid
  0'. But the "pvid" should be set to 998, so you are responsible for manually
  fixing this!

1.2 VLAN filtering

  The switch is configured to apply source port filtering. This means that
  packets are only accepted when the port the packets came in on is a member of
  the VLAN the packet should go to.

  Only membership of a VLAN is tested, it does not matter whether it is a tagged
  or untagged membership.

  For untagged packets, the destination VLAN is the Primary VLAN ID of the
  incoming port. So if the PVID of a port is 0, but that port is not a member of
  the VLAN with ID 0, this means that untagged packets on that port are dropped.
  This can be used as a roundabout way of dropping untagged packets from a port,
  a mode often referred to as "Admit only tagged packets".

1.3 Reset

  The two supported chip models do not have a sofware-initiated reset. When the
  driver is initialised, as well as when the 'reset' swconfig option is invoked,
  the driver will set those registers it knows about and supports to the correct
  default value. But there are a lot of registers in the chip that the driver
  does not support. If something changed those registers, invoking 'reset' or
  performing a warm reboot might still leave the chip in a "broken" state. Only
  a hardware reset will bring it back in the default state.

2. Technical details on PHYs and the ADM6996

  From the viewpoint of the Linux kernel, it is common that an Ethernet adapter
  can be seen as a separate MAC entity and a separate PHY entity. The PHY entity
  can be queried and set through registers accessible via an MDIO bus. A PHY
  normally has a single address on that bus, in the range 0 through 31.

  The ADM6996 has special-purpose registers in the range of PHYs 0 through 10.
  Even though all these registers control a single ADM6996 chip, the Linux
  kernel treats this as 11 separate PHYs.  The driver will bind to these
  addresses to prevent a different PHY driver from binding and corrupting these
  registers.

  What Linux sees as the PHY on address 0 is meant for the Ethernet MAC
  connected to the CPU port of the ADM6996 switch chip (port 5). This is the
  Ethernet MAC you will use to send and receive data through the switch.

  The PHYs at addresses 16 through 20 map to the PHYs on ports 0 through 4 of
  the switch chip. These can be accessed with the Generic PHY driver, as the
  registers have the common layout.

  If a second Ethernet MAC on your board is wired to the port 4 PHY, that MAC
  needs to bind to PHY address 20 for the port to work correctly.

  The ADM6996 switch driver will reset the ports 0 through 3 on startup and when
  'reset' is invoked. This could clash with a different PHY driver if the kernel
  binds a PHY driver to address 16 through 19.

  If Linux binds a PHY on addresses 1 through 10 to an Ethernet MAC, the ADM6996
  driver will simply always report a connected 100 Mbit/s full-duplex link for
  that PHY, and provide no other functionality. This is most likely not what you
  want. So if you see a message in your log

  	ethX: PHY overlaps ADM6996, providing fixed PHY yy.

  This is most likely an indication that ethX will not work properly, and your
  kernel needs to be configured to attach a different PHY to that Ethernet MAC.

  Controlling the mapping between MACs and PHYs is usually done in platform- or
  board-specific fixup code. The ADM6996 driver has no influence over this.