xref: /qemu/docs/specs/rocker.rst (revision 9ca6876dc0befcc07b1c609dd96fa719feb7a318)
1bbc53c7eSScott FeldmanRocker Network Switch Register Programming Guide
2*9ca6876dSPeter Maydell************************************************
3*9ca6876dSPeter Maydell
4*9ca6876dSPeter Maydell..
5bbc53c7eSScott Feldman   Copyright (c) Scott Feldman <sfeldma@gmail.com>
6bbc53c7eSScott Feldman   Copyright (c) Neil Horman <nhorman@tuxdriver.com>
7bbc53c7eSScott Feldman   Version 0.11, 12/29/2014
8bbc53c7eSScott Feldman
9bbc53c7eSScott Feldman   This program is free software; you can redistribute it and/or modify
10bbc53c7eSScott Feldman   it under the terms of the GNU General Public License as published by
11bbc53c7eSScott Feldman   the Free Software Foundation; either version 2 of the License, or
12bbc53c7eSScott Feldman   (at your option) any later version.
13bbc53c7eSScott Feldman
14bbc53c7eSScott Feldman   This program is distributed in the hope that it will be useful,
15bbc53c7eSScott Feldman   but WITHOUT ANY WARRANTY; without even the implied warranty of
16bbc53c7eSScott Feldman   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17bbc53c7eSScott Feldman   GNU General Public License for more details.
18bbc53c7eSScott Feldman
19*9ca6876dSPeter MaydellIntroduction
20*9ca6876dSPeter Maydell============
21bbc53c7eSScott Feldman
22bbc53c7eSScott FeldmanOverview
23bbc53c7eSScott Feldman--------
24bbc53c7eSScott Feldman
25bbc53c7eSScott FeldmanThis document describes the hardware/software interface for the Rocker switch
26bbc53c7eSScott Feldmandevice.  The intended audience is authors of OS drivers and device emulation
27bbc53c7eSScott Feldmansoftware.
28bbc53c7eSScott Feldman
29bbc53c7eSScott FeldmanNotations and Conventions
30bbc53c7eSScott Feldman-------------------------
31bbc53c7eSScott Feldman
32*9ca6876dSPeter Maydell* In register descriptions, [n:m] indicates a range from bit n to bit m,
33bbc53c7eSScott Feldman  inclusive.
34*9ca6876dSPeter Maydell* Use of leading 0x indicates a hexadecimal number.
35*9ca6876dSPeter Maydell* Use of leading 0b indicates a binary number.
36*9ca6876dSPeter Maydell* The use of RSVD or Reserved indicates that a bit or field is reserved for
37bbc53c7eSScott Feldman  future use.
38*9ca6876dSPeter Maydell* Field width is in bytes, unless otherwise noted.
39*9ca6876dSPeter Maydell* Register are (R) read-only, (R/W) read/write, (W) write-only, or (COR) clear
40bbc53c7eSScott Feldman  on read
41*9ca6876dSPeter Maydell* TLV values in network-byte-order are designated with (N).
42bbc53c7eSScott Feldman
43bbc53c7eSScott Feldman
44*9ca6876dSPeter MaydellPCI Configuration Registers
45*9ca6876dSPeter Maydell===========================
46bbc53c7eSScott Feldman
47bbc53c7eSScott FeldmanPCI Configuration Space
48bbc53c7eSScott Feldman-----------------------
49bbc53c7eSScott Feldman
50*9ca6876dSPeter MaydellEach switch instance registers as a PCI device with PCI configuration space::
51bbc53c7eSScott Feldman
52bbc53c7eSScott Feldman	offset	width	description		value
53bbc53c7eSScott Feldman	---------------------------------------------
54bbc53c7eSScott Feldman	0x0	2	Vendor ID		0x1b36
55bbc53c7eSScott Feldman	0x2	2	Device ID		0x0006
56bbc53c7eSScott Feldman	0x4	4	Command/Status
57bbc53c7eSScott Feldman	0x8	1	Revision ID		0x01
58bbc53c7eSScott Feldman	0x9	3	Class code		0x2800
59bbc53c7eSScott Feldman	0xC	1	Cache line size
60bbc53c7eSScott Feldman	0xD	1	Latency timer
61bbc53c7eSScott Feldman	0xE	1	Header type
62bbc53c7eSScott Feldman	0xF	1	Built-in self test
63bbc53c7eSScott Feldman	0x10	4	Base address low
64bbc53c7eSScott Feldman	0x14	4	Base address high
65bbc53c7eSScott Feldman	0x18-28		Reserved
66bbc53c7eSScott Feldman	0x2C	2	Subsystem vendor ID	*
67bbc53c7eSScott Feldman	0x2E	2	Subsystem ID		*
68bbc53c7eSScott Feldman	0x30-38		Reserved
69bbc53c7eSScott Feldman	0x3C	1	Interrupt line
70bbc53c7eSScott Feldman	0x3D	1	Interrupt pin		0x00
71bbc53c7eSScott Feldman	0x3E	1	Min grant		0x00
72bbc53c7eSScott Feldman	0x3D	1	Max latency		0x00
73bbc53c7eSScott Feldman	0x40	1	TRDY timeout
74bbc53c7eSScott Feldman	0x41	1	Retry count
75bbc53c7eSScott Feldman	0x42	2	Reserved
76bbc53c7eSScott Feldman
77bbc53c7eSScott Feldman        * Assigned by sub-system implementation
78bbc53c7eSScott Feldman
79*9ca6876dSPeter MaydellMemory-Mapped Register Space
80*9ca6876dSPeter Maydell============================
81bbc53c7eSScott Feldman
82bbc53c7eSScott FeldmanThere are two memory-mapped BARs.  BAR0 maps device register space and is
83bbc53c7eSScott Feldman0x2000 in size.  BAR1 maps MSI-X vector and PBA tables and is also 0x2000 in
84bbc53c7eSScott Feldmansize, allowing for 256 MSI-X vectors.
85bbc53c7eSScott Feldman
86bbc53c7eSScott FeldmanAll registers are 4 or 8 bytes long.  It is assumed host software will access 4
87bbc53c7eSScott Feldmanbyte registers with one 4-byte access, and 8 byte registers with either two
88bbc53c7eSScott Feldman4-byte accesses or a single 8-byte access.  In the case of two 4-byte accesses,
89bbc53c7eSScott Feldmanaccess must be lower and then upper 4-bytes, in that order.
90bbc53c7eSScott Feldman
91*9ca6876dSPeter MaydellBAR0 device register space is organized as follows::
92bbc53c7eSScott Feldman
93bbc53c7eSScott Feldman	offset		description
94bbc53c7eSScott Feldman	------------------------------------------------------
95bbc53c7eSScott Feldman	0x0000-0x000f	Bogus registers to catch misbehaving
96bbc53c7eSScott Feldman			drivers.  Writes do nothing.  Reads
97bbc53c7eSScott Feldman			back as 0xDEADBABE.
98bbc53c7eSScott Feldman	0x0010-0x00ff	Test registers
99bbc53c7eSScott Feldman	0x0300-0x03ff	General purpose registers
100bbc53c7eSScott Feldman	0x1000-0x1fff	Descriptor control
101bbc53c7eSScott Feldman
102bbc53c7eSScott FeldmanHoles in register space are reserved.  Writes to reserved registers do nothing.
103bbc53c7eSScott FeldmanReads to reserved registers read back as 0.
104bbc53c7eSScott Feldman
105bbc53c7eSScott FeldmanNo fancy stuff like write-combining is enabled on any of the registers.
106bbc53c7eSScott Feldman
107*9ca6876dSPeter MaydellBAR1 MSI-X register space is organized as follows::
108bbc53c7eSScott Feldman
109bbc53c7eSScott Feldman	offset		description
110bbc53c7eSScott Feldman	------------------------------------------------------
111bbc53c7eSScott Feldman	0x0000-0x0fff	MSI-X vector table (256 vectors total)
112bbc53c7eSScott Feldman	0x1000-0x1fff	MSI-X PBA table
113bbc53c7eSScott Feldman
114bbc53c7eSScott Feldman
115*9ca6876dSPeter MaydellInterrupts, DMA, and Endianness
116*9ca6876dSPeter Maydell===============================
117bbc53c7eSScott Feldman
118bbc53c7eSScott FeldmanPCI Interrupts
119bbc53c7eSScott Feldman--------------
120bbc53c7eSScott Feldman
121bbc53c7eSScott FeldmanThe device supports only MSI-X interrupts.  BAR1 memory-mapped region contains
122bbc53c7eSScott Feldmanthe MSI-X vector and PBA tables, with support for up to 256 MSI-X vectors.
123bbc53c7eSScott Feldman
124*9ca6876dSPeter MaydellThe vector assignment is::
125bbc53c7eSScott Feldman
126bbc53c7eSScott Feldman	vector		description
127bbc53c7eSScott Feldman	-----------------------------------------------------
128bbc53c7eSScott Feldman	0		Command descriptor ring completion
129bbc53c7eSScott Feldman	1		Event descriptor ring completion
130bbc53c7eSScott Feldman	2		Test operation completion
131bbc53c7eSScott Feldman	3		RSVD
132bbc53c7eSScott Feldman	4-255		Tx and Rx descriptor ring completion
133bbc53c7eSScott Feldman			  Tx vector is even
134bbc53c7eSScott Feldman			  Rx vector is odd
135bbc53c7eSScott Feldman
136*9ca6876dSPeter MaydellA MSI-X vector table entry is 16 bytes::
137bbc53c7eSScott Feldman
138bbc53c7eSScott Feldman	field		offset	width	description
139bbc53c7eSScott Feldman	-------------------------------------------------------------
140bbc53c7eSScott Feldman	lower_addr	0x0	4	[31:2] message address[31:2]
141bbc53c7eSScott Feldman					[1:0] Rsvd (4 byte alignment
142bbc53c7eSScott Feldman						    required)
143bbc53c7eSScott Feldman	upper_addr	0x4	4	[31:19] Rsvd
144bbc53c7eSScott Feldman					[14:0] message address[46:32]
145bbc53c7eSScott Feldman	data		0x8	4	message data[31:0]
146bbc53c7eSScott Feldman	control		0xc	4	[31:1] Rsvd
147bbc53c7eSScott Feldman					[0] mask (0 = enable,
148bbc53c7eSScott Feldman						  1 = masked)
149bbc53c7eSScott Feldman
150bbc53c7eSScott FeldmanSoftware should install the Interrupt Service Routine (ISR) before any ports
151bbc53c7eSScott Feldmanare enabled or any commands are issued on the command ring.
152bbc53c7eSScott Feldman
153bbc53c7eSScott FeldmanDMA Operations
154bbc53c7eSScott Feldman--------------
155bbc53c7eSScott Feldman
156bbc53c7eSScott FeldmanDMA operations are used for packet DMA to/from the CPU, command and event
157bbc53c7eSScott Feldmanprocessing.  Command processing includes statistical counters and table dumps,
158bbc53c7eSScott Feldmantable insertion/deletion, and more.  Event processing provides an async
159bbc53c7eSScott Feldmannotification method for device-originating events.  Each DMA operation has a
160bbc53c7eSScott Feldmanset of control registers to manage a descriptor ring.  The descriptor rings are
161bbc53c7eSScott Feldmanallocated from contiguous host DMA-able memory and registers specify the rings
162bbc53c7eSScott Feldmanbase address, size and current head and tail indices.  Software always writes
163bbc53c7eSScott Feldmanthe head, and hardware always writes the tail.
164bbc53c7eSScott Feldman
165bbc53c7eSScott FeldmanThe higher-order bit of DMA_DESC_COMP_ERR is used to mark hardware completion
166bbc53c7eSScott Feldmanof a descriptor.  Software will clear this bit when posting a descriptor to the
167bbc53c7eSScott Feldmanring, and hardware will set this bit when the descriptor is complete.
168bbc53c7eSScott Feldman
169bbc53c7eSScott FeldmanDescriptor ring sizes must be a power of 2 and range from 2 to 64K entries.
170bbc53c7eSScott FeldmanDescriptor rings' base address must be 8-byte aligned.  Descriptors must be
171bbc53c7eSScott Feldmanpacked within ring.  Each descriptor in each ring must also be aligned on an 8
172*9ca6876dSPeter Maydellbyte boundary.  Each descriptor ring will have these registers::
173bbc53c7eSScott Feldman
174bbc53c7eSScott Feldman	DMA_DESC_xxx_BASE_ADDR, offset 0x1000 + (x * 32), 64-bit, (R/W)
175bbc53c7eSScott Feldman	DMA_DESC_xxx_SIZE, offset 0x1008 + (x * 32), 32-bit, (R/W)
176bbc53c7eSScott Feldman	DMA_DESC_xxx_HEAD, offset 0x100c + (x * 32), 32-bit, (R/W)
177bbc53c7eSScott Feldman	DMA_DESC_xxx_TAIL, offset 0x1010 + (x * 32), 32-bit, (R)
178bbc53c7eSScott Feldman	DMA_DESC_xxx_CTRL, offset 0x1014 + (x * 32), 32-bit, (W)
179bbc53c7eSScott Feldman	DMA_DESC_xxx_CREDITS, offset 0x1018 + (x * 32), 32-bit, (R/W)
180bbc53c7eSScott Feldman	DMA_DESC_xxx_RSVD1, offset 0x101c + (x * 32), 32-bit, (R/W)
181bbc53c7eSScott Feldman
182*9ca6876dSPeter MaydellWhere x is descriptor ring index::
183bbc53c7eSScott Feldman
184bbc53c7eSScott Feldman	index		ring
185bbc53c7eSScott Feldman	--------------------
186bbc53c7eSScott Feldman	0		CMD
187bbc53c7eSScott Feldman	1		EVENT
188bbc53c7eSScott Feldman	2		TX (port 0)
189bbc53c7eSScott Feldman	3		RX (port 0)
190bbc53c7eSScott Feldman	4		TX (port 1)
191bbc53c7eSScott Feldman	5		RX (port 1)
192bbc53c7eSScott Feldman	.
193bbc53c7eSScott Feldman	.
194bbc53c7eSScott Feldman	.
195bbc53c7eSScott Feldman	124		TX (port 61)
196bbc53c7eSScott Feldman	125		RX (port 61)
197bbc53c7eSScott Feldman	126		Resv
198bbc53c7eSScott Feldman	127		Resv
199bbc53c7eSScott Feldman
200bbc53c7eSScott FeldmanWriting BASE_ADDR or SIZE will reset HEAD and TAIL to zero.  HEAD cannot be
201bbc53c7eSScott Feldmanwritten past TAIL.  To do so would wrap the ring.  An empty ring is when HEAD
202bbc53c7eSScott Feldman== TAIL.  A full ring is when HEAD is one position behind TAIL.  Both HEAD and
203bbc53c7eSScott FeldmanTAIL increment and modulo wrap at the ring size.
204bbc53c7eSScott Feldman
205*9ca6876dSPeter MaydellCTRL register bits::
206bbc53c7eSScott Feldman
207bbc53c7eSScott Feldman	bit	name		description
208bbc53c7eSScott Feldman	------------------------------------------------------------------------
209bbc53c7eSScott Feldman	[0]	CTRL_RESET	Reset the descriptor ring
210bbc53c7eSScott Feldman	[1:31]	Reserved
211bbc53c7eSScott Feldman
212*9ca6876dSPeter MaydellAll descriptor types share some common fields::
213bbc53c7eSScott Feldman
214bbc53c7eSScott Feldman	field			width	description
215bbc53c7eSScott Feldman	-------------------------------------------------------------------
216bbc53c7eSScott Feldman	DMA_DESC_BUF_ADDR	8	Phys addr of desc payload, 8-byte
217bbc53c7eSScott Feldman					aligned
218bbc53c7eSScott Feldman	DMA_DESC_COOKIE		8	Desc cookie for completion matching,
219bbc53c7eSScott Feldman					upper-most bit is reserved
220bbc53c7eSScott Feldman	DMA_DESC_BUF_SIZE	2	Desc payload size in bytes
221bbc53c7eSScott Feldman	DMA_DESC_TLV_SIZE	2	Desc payload total size in bytes
222bbc53c7eSScott Feldman					used for TLVs.  Must be <=
223bbc53c7eSScott Feldman					DMA_DESC_BUF_SIZE.
224bbc53c7eSScott Feldman	DMA_DESC_COMP_ERR	2	Completion status of associated
225bbc53c7eSScott Feldman					desc payload.  High order bit is
226bbc53c7eSScott Feldman					clear on new descs, toggled by
227bbc53c7eSScott Feldman					hw for completed items.
228bbc53c7eSScott Feldman
229bbc53c7eSScott FeldmanTo support forward- and backward-compatibility, descriptor and completion
230bbc53c7eSScott Feldmanpayloads are specified in TLV format.  Fields are packed with Type=field name,
231bbc53c7eSScott FeldmanLength=field length, and Value=field value.  Software will ignore unknown fields
232bbc53c7eSScott Feldmanfilled in by the switch.  Likewise, the switch will ignore unknown fields
233bbc53c7eSScott Feldmanfilled in by software.
234bbc53c7eSScott Feldman
235bbc53c7eSScott FeldmanDescriptor payload buffer is 8-byte aligned and TLVs are 8-byte aligned.  The
236*9ca6876dSPeter Maydellvalue within a TLV is also 8-byte aligned.  The (packed, 8 byte) TLV header is::
237bbc53c7eSScott Feldman
238bbc53c7eSScott Feldman	field	width	description
239bbc53c7eSScott Feldman	-----------------------------
240bbc53c7eSScott Feldman	type	4	TLV type
241bbc53c7eSScott Feldman	len	2	TLV value length
242bbc53c7eSScott Feldman	pad	2	Reserved
243bbc53c7eSScott Feldman
244bbc53c7eSScott FeldmanThe alignment requirements for descriptors and TLVs are to avoid unaligned
245bbc53c7eSScott Feldmanaccess exceptions in software.  Note that the payload for each TLV is also
246bbc53c7eSScott Feldman8 byte aligned.
247bbc53c7eSScott Feldman
248*9ca6876dSPeter MaydellFigure 1 shows an example descriptor buffer with two TLVs::
249bbc53c7eSScott Feldman
250bbc53c7eSScott Feldman                  <------- 8 bytes ------->
251bbc53c7eSScott Feldman
252bbc53c7eSScott Feldman  8-byte  +––––+  +–––––––––––+–––––+–––––+                     +–+
253bbc53c7eSScott Feldman  align           |   type    | len | pad |    TLV#1 hdr          |
254bbc53c7eSScott Feldman                  +–––––––––––+–––––+–––––+    (len=22)           |
255bbc53c7eSScott Feldman                  |                       |                       |
256bbc53c7eSScott Feldman                  |  value                |    TVL#1 value        |
257bbc53c7eSScott Feldman                  |                       |    (padded to 8-byte  |
258bbc53c7eSScott Feldman                  |                 +–––––+     alignment)        |
259bbc53c7eSScott Feldman                  |                 |/////|                       |
260bbc53c7eSScott Feldman   8-byte +––––+  +–––––––––––+–––––––––––+                       |
261bbc53c7eSScott Feldman   align          |   type    | len | pad |    TLV#2 hdr    DESC_BUF_SIZE
262bbc53c7eSScott Feldman                  +–––––+–––––+–––––+–––––+    (len=2)            |
263bbc53c7eSScott Feldman                  |value|/////////////////|    TLV#2 value        |
264bbc53c7eSScott Feldman                  +–––––+/////////////////|                       |
265bbc53c7eSScott Feldman                  |///////////////////////|                       |
266bbc53c7eSScott Feldman                  |///////////////////////|                       |
267bbc53c7eSScott Feldman                  |///////////////////////|                       |
268bbc53c7eSScott Feldman                  |////////unused/////////|                       |
269bbc53c7eSScott Feldman                  |////////space//////////|                       |
270bbc53c7eSScott Feldman                  |///////////////////////|                       |
271bbc53c7eSScott Feldman                  |///////////////////////|                       |
272bbc53c7eSScott Feldman                  |///////////////////////|                       |
273bbc53c7eSScott Feldman                  +–––––––––––––––––––––––+                     +–+
274bbc53c7eSScott Feldman
275bbc53c7eSScott Feldman				fig. 1
276bbc53c7eSScott Feldman
277bbc53c7eSScott FeldmanTLVs can be nested within the NEST TLV type.
278bbc53c7eSScott Feldman
279bbc53c7eSScott FeldmanInterrupt credits
280bbc53c7eSScott Feldman^^^^^^^^^^^^^^^^^
281bbc53c7eSScott Feldman
282bbc53c7eSScott FeldmanMSI-X vectors used for descriptor ring completions use a credit mechanism for
283bbc53c7eSScott Feldmanefficient device, PCIe bus, OS and driver operations.  Each descriptor ring has
284bbc53c7eSScott Feldmana credit count which represents the number of outstanding descriptors to be
285bbc53c7eSScott Feldmanprocessed by the driver.  As the device marks descriptors complete, the credit
286bbc53c7eSScott Feldmancount is incremented.  As the driver processes those outstanding descriptors,
287bbc53c7eSScott Feldmanit returns credits back to the device.  This way, the device knows the driver's
288bbc53c7eSScott Feldmanprogress and can make decisions about when to fire the next interrupt or not.
289bbc53c7eSScott FeldmanWhen the credit count is zero, and the first descriptors are posted for the
290bbc53c7eSScott Feldmandriver, a single interrupt is fired.  Once the interrupt is fired, the
291bbc53c7eSScott Feldmaninterrupt is disabled (auto-masked*).  In response to the interrupt, the driver
292bbc53c7eSScott Feldmanwill process descriptors and PIO write a returned credit value for that
293bbc53c7eSScott Feldmandescriptor ring.  If the driver returns all credits (the driver caught up with
294bbc53c7eSScott Feldmanthe device and there is no outstanding work), then the interrupt is unmasked,
295bbc53c7eSScott Feldmanbut not fired.  If only partial credits are returned, the interrupt remains
296bbc53c7eSScott Feldmanmasked but the device generates an interrupt, signaling the driver that more
297bbc53c7eSScott Feldmanoutstanding work is available.
298bbc53c7eSScott Feldman
299b6af0975SDaniel P. Berrange(* this masking is unrelated to the MSI-X interrupt mask register)
300bbc53c7eSScott Feldman
301bbc53c7eSScott FeldmanEndianness
302bbc53c7eSScott Feldman----------
303bbc53c7eSScott Feldman
304bbc53c7eSScott FeldmanDevice registers are hard-coded to little-endian (LE).  The driver should
305cb8d4c8fSStefan Weilconvert to/from host endianness to LE for device register accesses.
306bbc53c7eSScott Feldman
307bbc53c7eSScott FeldmanDescriptors are LE.  Descriptor buffer TLVs will have LE type and length
308bbc53c7eSScott Feldmanfields, but the value field can either be LE or network-byte-order, depending
309bbc53c7eSScott Feldmanon context.  TLV values containing network packet data will be in network-byte
310bbc53c7eSScott Feldmanorder.  A TLV value containing a field or mask used to compare against network
311bbc53c7eSScott Feldmanpacket data is network-byte order.  For example, flow match fields (and masks)
312bbc53c7eSScott Feldmanare network-byte-order since they're matched directly, byte-by-byte, against
313bbc53c7eSScott Feldmannetwork packet data.  All non-network-packet TLV multi-byte values will be LE.
314bbc53c7eSScott Feldman
315bbc53c7eSScott FeldmanTLV values in network-byte-order are designated with (N).
316bbc53c7eSScott Feldman
317bbc53c7eSScott Feldman
318*9ca6876dSPeter MaydellTest Registers
319*9ca6876dSPeter Maydell==============
320bbc53c7eSScott Feldman
321bbc53c7eSScott FeldmanRocker has several test registers to support troubleshooting register access,
322*9ca6876dSPeter Maydellinterrupt generation, and DMA operations::
323bbc53c7eSScott Feldman
324bbc53c7eSScott Feldman	TEST_REG, offset 0x0010, 32-bit (R/W)
325bbc53c7eSScott Feldman	TEST_REG64, offset 0x0018, 64-bit (R/W)
326bbc53c7eSScott Feldman	TEST_IRQ, offset 0x0020, 32-bit (R/W)
327bbc53c7eSScott Feldman	TEST_DMA_ADDR, offset 0x0028, 64-bit (R/W)
328bbc53c7eSScott Feldman	TEST_DMA_SIZE, offset 0x0030, 32-bit (R/W)
329bbc53c7eSScott Feldman	TEST_DMA_CTRL, offset 0x0034, 32-bit (R/W)
330bbc53c7eSScott Feldman
331bbc53c7eSScott FeldmanReads to TEST_REG and TEST_REG64 will read a value equal to twice the last
332bbc53c7eSScott Feldmanvalue written to the register.  The 32-bit and 64-bit versions are for testing
333bbc53c7eSScott Feldman32-bit and 64-bit host accesses.
334bbc53c7eSScott Feldman
335bbc53c7eSScott FeldmanA vector can be written to TEST_IRQ and the device will generate an interrupt
336bbc53c7eSScott Feldmanfor that vector.
337bbc53c7eSScott Feldman
338bbc53c7eSScott FeldmanTo test basic DMA operations, allocate a DMA-able host buffer and put the
339bbc53c7eSScott Feldmanbuffer address into TEST_DMA_ADDR and size into TEST_DMA_SIZE.  Then, write to
340*9ca6876dSPeter MaydellTEST_DMA_CTRL to manipulate the buffer contents.  TEST_DMA_CTRL operations are::
341bbc53c7eSScott Feldman
342bbc53c7eSScott Feldman	operation		value	description
343bbc53c7eSScott Feldman	-----------------------------------------------------------
344bbc53c7eSScott Feldman	TEST_DMA_CTRL_CLEAR	1	clear buffer
345bbc53c7eSScott Feldman	TEST_DMA_CTRL_FILL	2	fill buffer bytes with 0x96
346bbc53c7eSScott Feldman	TEST_DMA_CTRL_INVERT	4	invert bytes in buffer
347bbc53c7eSScott Feldman
348bbc53c7eSScott FeldmanVarious buffer address and sizes should be tested to verify no address boundary
349bbc53c7eSScott Feldmanissue exists.  In particular, buffers that start on odd-8-byte boundary and/or
350bbc53c7eSScott Feldmanspan multiple PAGE sizes should be tested.
351bbc53c7eSScott Feldman
352bbc53c7eSScott Feldman
353*9ca6876dSPeter MaydellPorts
354*9ca6876dSPeter Maydell=====
355bbc53c7eSScott Feldman
356bbc53c7eSScott FeldmanPhysical and Logical Ports
357bbc53c7eSScott Feldman------------------------------------
358bbc53c7eSScott Feldman
359bbc53c7eSScott FeldmanThe switch supports up to 62 physical (front-panel) ports.  Register
360*9ca6876dSPeter MaydellPORT_PHYS_COUNT returns the actual number of physical ports available::
361bbc53c7eSScott Feldman
362bbc53c7eSScott Feldman	PORT_PHYS_COUNT, offset 0x0304, 32-bit, (R)
363bbc53c7eSScott Feldman
364bbc53c7eSScott FeldmanIn addition to front-panel ports, the switch supports logical ports for
365bbc53c7eSScott Feldmantunnels.
366bbc53c7eSScott Feldman
367bbc53c7eSScott FeldmanFront-panel ports and logical tunnel ports are mapped into a single 32-bit port
368bbc53c7eSScott Feldmanspace.  A special CPU port is assigned port 0.  The front-panel ports are
369bbc53c7eSScott Feldmanmapped to ports 1-62.  A special loopback port is assigned port 63.  Logical
370bbc53c7eSScott Feldmantunnel ports are assigned ports 0x0001000-0x0001ffff.
371*9ca6876dSPeter MaydellTo summarize the port assignments::
372bbc53c7eSScott Feldman
373bbc53c7eSScott Feldman	port			mapping
374bbc53c7eSScott Feldman	-------------------------------------------------------
375bbc53c7eSScott Feldman	0			CPU port (for packets to/from host CPU)
376bbc53c7eSScott Feldman	1-62			front-panel physical ports
377bbc53c7eSScott Feldman	63			loopback port
378bbc53c7eSScott Feldman	64-0x0000ffff		RSVD
379bbc53c7eSScott Feldman	0x00010000-0x0001ffff	logical tunnel ports
380bbc53c7eSScott Feldman	0x00020000-0xffffffff	RSVD
381bbc53c7eSScott Feldman
382bbc53c7eSScott FeldmanPhysical Port Mode
383bbc53c7eSScott Feldman------------------
384bbc53c7eSScott Feldman
385bbc53c7eSScott FeldmanSwitch front-panel ports operate in a mode.  Currently, the only mode is
386bbc53c7eSScott FeldmanOF-DPA.  OF-DPA[1] mode is based on OpenFlow Data Plane Abstraction (OF-DPA)
387bbc53c7eSScott FeldmanAbstract Switch Specification, Version 1.0, from Broadcom Corporation.  To
388bbc53c7eSScott Feldmanset/get the mode for front-panel ports, see port settings, below.
389bbc53c7eSScott Feldman
390bbc53c7eSScott FeldmanPort Settings
391bbc53c7eSScott Feldman-------------
392bbc53c7eSScott Feldman
393*9ca6876dSPeter MaydellLink status for all front-panel ports is available via PORT_PHYS_LINK_STATUS::
394bbc53c7eSScott Feldman
395bbc53c7eSScott Feldman	PORT_PHYS_LINK_STATUS, offset 0x0310, 64-bit, (R)
396bbc53c7eSScott Feldman
397bbc53c7eSScott Feldman	Value is port bitmap.  Bits 0 and 63 always read 0.  Bits 1-62
398bbc53c7eSScott Feldman	read 1 for link UP and 0 for link DOWN for respective front-panel ports.
399bbc53c7eSScott Feldman
400*9ca6876dSPeter MaydellOther properties for front-panel ports are available via DMA CMD descriptors::
401bbc53c7eSScott Feldman
402bbc53c7eSScott Feldman	Get PORT_SETTINGS descriptor:
403bbc53c7eSScott Feldman
404bbc53c7eSScott Feldman		field		width	description
405bbc53c7eSScott Feldman		----------------------------------------------
406bbc53c7eSScott Feldman		PORT_SETTINGS	2	CMD_GET
407bbc53c7eSScott Feldman		PPORT		4	Physical port #
408bbc53c7eSScott Feldman
409bbc53c7eSScott Feldman	Get PORT_SETTINGS completion:
410bbc53c7eSScott Feldman
411bbc53c7eSScott Feldman		field		width	description
412bbc53c7eSScott Feldman		----------------------------------------------
413bbc53c7eSScott Feldman		PPORT		4	Physical port #
414bbc53c7eSScott Feldman		SPEED		4	Current port interface speed, in Mbps
415bbc53c7eSScott Feldman		DUPLEX		1	1 = Full, 0 = Half
416bbc53c7eSScott Feldman		AUTONEG		1	1 = enabled, 0 = disabled
417bbc53c7eSScott Feldman		MACADDR		6	Port MAC address
418bbc53c7eSScott Feldman		MODE		1	0 = OF-DPA
419bbc53c7eSScott Feldman		LEARNING	1	MAC address learning on port
420bbc53c7eSScott Feldman						1 = enabled
421bbc53c7eSScott Feldman						0 = disabled
42277349536SDavid Ahern		PHYS_NAME	<var>	Physical port name (string)
423bbc53c7eSScott Feldman
424bbc53c7eSScott Feldman	Set PORT_SETTINGS descriptor:
425bbc53c7eSScott Feldman
426bbc53c7eSScott Feldman		field		width	description
427bbc53c7eSScott Feldman		----------------------------------------------
428bbc53c7eSScott Feldman		PORT_SETTINGS	2	CMD_SET
429bbc53c7eSScott Feldman		PPORT		4	Physical port #
430bbc53c7eSScott Feldman		SPEED		4	Port interface speed, in Mbps
431bbc53c7eSScott Feldman		DUPLEX		1	1 = Full, 0 = Half
432bbc53c7eSScott Feldman		AUTONEG		1	1 = enabled, 0 = disabled
433bbc53c7eSScott Feldman		MACADDR		6	Port MAC address
434bbc53c7eSScott Feldman		MODE		1	0 = OF-DPA
435bbc53c7eSScott Feldman
436bbc53c7eSScott FeldmanPort Enable
437bbc53c7eSScott Feldman-----------
438bbc53c7eSScott Feldman
439bbc53c7eSScott FeldmanFront-panel ports are initially disabled, which means port ingress and egress
440*9ca6876dSPeter Maydellpackets will be dropped.  To enable or disable a port, use PORT_PHYS_ENABLE::
441bbc53c7eSScott Feldman
442bbc53c7eSScott Feldman	PORT_PHYS_ENABLE: offset 0x0318, 64-bit, (R/W)
443bbc53c7eSScott Feldman
444bbc53c7eSScott Feldman	Value is bitmap of first 64 ports.  Bits 0 and 63 are ignored
445bbc53c7eSScott Feldman	and always read as 0.  Write 1 to enable port; write 0 to disable it.
446bbc53c7eSScott Feldman	Default is 0.
447bbc53c7eSScott Feldman
448bbc53c7eSScott Feldman
449*9ca6876dSPeter MaydellSwitch Control
450*9ca6876dSPeter Maydell==============
451bbc53c7eSScott Feldman
452bbc53c7eSScott FeldmanThis section covers switch-wide register settings.
453bbc53c7eSScott Feldman
454bbc53c7eSScott FeldmanControl
455bbc53c7eSScott Feldman-------
456bbc53c7eSScott Feldman
457*9ca6876dSPeter MaydellThis register is used for low level control of the switch::
458bbc53c7eSScott Feldman
459bbc53c7eSScott Feldman	CONTROL: offset 0x0300, 32-bit, (W)
460bbc53c7eSScott Feldman
461bbc53c7eSScott Feldman	bit	name		description
462bbc53c7eSScott Feldman	------------------------------------------------------------------------
463bbc53c7eSScott Feldman	[0]	CONTROL_RESET	If set, device will perform reset
464bbc53c7eSScott Feldman	[1:31]	Reserved
465bbc53c7eSScott Feldman
466bbc53c7eSScott FeldmanSwitch ID
467bbc53c7eSScott Feldman---------
468bbc53c7eSScott Feldman
469bbc53c7eSScott FeldmanThe switch has a SWITCH_ID to be used by software to uniquely identify the
470*9ca6876dSPeter Maydellswitch::
471bbc53c7eSScott Feldman
472bbc53c7eSScott Feldman	SWITCH_ID: offset 0x0320, 64-bit, (R)
473bbc53c7eSScott Feldman
474bbc53c7eSScott Feldman	Value is opaque to switch software and no special encoding is implied.
475bbc53c7eSScott Feldman
476bbc53c7eSScott Feldman
477*9ca6876dSPeter MaydellEvents
478*9ca6876dSPeter Maydell======
479bbc53c7eSScott Feldman
480bbc53c7eSScott FeldmanNon-I/O asynchronous events from the device are notified to the host using the
481*9ca6876dSPeter Maydellevent ring.  The TLV structure for events is::
482bbc53c7eSScott Feldman
483bbc53c7eSScott Feldman	field		width	description
484bbc53c7eSScott Feldman	---------------------------------------------------
485bbc53c7eSScott Feldman	TYPE		4	Event type, one of:
486bbc53c7eSScott Feldman					1: LINK_CHANGED
487bbc53c7eSScott Feldman					2: MAC_VLAN_SEEN
488bbc53c7eSScott Feldman	INFO		<nest>	Event info (details below)
489bbc53c7eSScott Feldman
490bbc53c7eSScott FeldmanLink Changed Event
491bbc53c7eSScott Feldman------------------
492bbc53c7eSScott Feldman
493*9ca6876dSPeter MaydellWhen link status changes on a physical port, this event is generated::
494bbc53c7eSScott Feldman
495bbc53c7eSScott Feldman	field		width	description
496bbc53c7eSScott Feldman	---------------------------------------------------
497bbc53c7eSScott Feldman	INFO		<nest>
498bbc53c7eSScott Feldman	  PPORT		4	Physical port
499bbc53c7eSScott Feldman	  LINKUP	1	Link status:
500bbc53c7eSScott Feldman					0: down
501bbc53c7eSScott Feldman					1: up
502bbc53c7eSScott Feldman
503bbc53c7eSScott FeldmanMAC VLAN Seen Event
504bbc53c7eSScott Feldman-------------------
505bbc53c7eSScott Feldman
506bbc53c7eSScott FeldmanWhen a packet ingresses on a port and the source MAC/VLAN isn't known to the
507bbc53c7eSScott Feldmandevice, the device will generate this event.  In response to the event, the
508bbc53c7eSScott Feldmandriver should install to the device the MAC/VLAN on the port into the bridge
509bbc53c7eSScott Feldmantable.  Once installed, the MAC/VLAN is known on the port and this event will
510bbc53c7eSScott Feldmanno longer be generated.
511bbc53c7eSScott Feldman
512*9ca6876dSPeter Maydell::
513*9ca6876dSPeter Maydell
514bbc53c7eSScott Feldman	field		width	description
515bbc53c7eSScott Feldman	---------------------------------------------------
516bbc53c7eSScott Feldman	INFO		<nest>
517bbc53c7eSScott Feldman	  PPORT		4	Physical port
518bbc53c7eSScott Feldman	  MAC		6	MAC address
519bbc53c7eSScott Feldman	  VLAN		2	VLAN ID
520bbc53c7eSScott Feldman
521bbc53c7eSScott Feldman
522*9ca6876dSPeter MaydellCPU Packet Processing
523*9ca6876dSPeter Maydell=====================
524bbc53c7eSScott Feldman
525bbc53c7eSScott FeldmanIngress packets directed to the host CPU for further processing are delivered
526bbc53c7eSScott Feldmanin the DMA RX ring.  Likewise, host CPU originating packets destined to egress
527bbc53c7eSScott Feldmanon switch ports are scheduled by software using the DMA TX ring.
528bbc53c7eSScott Feldman
529bbc53c7eSScott FeldmanTx Packet Processing
530bbc53c7eSScott Feldman--------------------
531bbc53c7eSScott Feldman
532bbc53c7eSScott FeldmanSoftware schedules packets for egress on switch ports using the DMA TX ring.  A
533bbc53c7eSScott FeldmanTX descriptor buffer describes the packet location and size in host DMA-able
534bbc53c7eSScott Feldmanmemory, the destination port, and any hardware-offload functions (such as L3
535bbc53c7eSScott Feldmanpayload checksum offload).  Software then bumps the descriptor head to signal
536bbc53c7eSScott Feldmanhardware of new Tx work.  In response, hardware will DMA read Tx descriptors up
537bbc53c7eSScott Feldmanto head, DMA read descriptor buffer and packet data, perform offloading
538bbc53c7eSScott Feldmanfunctions, and finally frame packet on wire (network).  Once packet processing
539bbc53c7eSScott Feldmanis complete, hardware will writeback status to descriptor(s) to signal to
540bbc53c7eSScott Feldmansoftware that Tx is complete and software resources (e.g. skb) backing packet
541bbc53c7eSScott Feldmancan be released.
542bbc53c7eSScott Feldman
543bbc53c7eSScott FeldmanFigure 2 shows an example 3-fragment packet queued with one Tx descriptor.  A
544*9ca6876dSPeter MaydellTLV is used for each packet fragment::
545bbc53c7eSScott Feldman
546bbc53c7eSScott Feldman	                                           pkt frag 1
547bbc53c7eSScott Feldman	                                           +–––––––+  +–+
548bbc53c7eSScott Feldman	                                       +–––+       |    |
549bbc53c7eSScott Feldman	                         desc buf      |   |       |    |
550bbc53c7eSScott Feldman	                        +––––––––+     |   |       |    |
551bbc53c7eSScott Feldman	        Tx ring     +–––+        +–––––+   |       |    |
552bbc53c7eSScott Feldman	      +–––––––––+   |   |  TLVs  |         +–––––––+    |
553bbc53c7eSScott Feldman	      |         +–––+   +––––––––+         pkt frag 2   |
554bbc53c7eSScott Feldman	      | desc 0  |       |        +–––––+   +–––––––+    |
555bbc53c7eSScott Feldman	      +–––––––––+       |  TLVs  |     +–––+       |    |
556bbc53c7eSScott Feldman	head+–+         |       +––––––––+         |       |    |
557bbc53c7eSScott Feldman	      | desc 1  |       |        +–––––+   +–––––––+    |pkt
558bbc53c7eSScott Feldman	      +–––––––––+       |  TLVs  |     |                |
559bbc53c7eSScott Feldman	      |         |       +––––––––+     |   pkt frag 3   |
560bbc53c7eSScott Feldman	      |         |                      |   +–––––––+    |
561bbc53c7eSScott Feldman	      +–––––––––+                      +–––+       |    |
562bbc53c7eSScott Feldman	      |         |                          |       |    |
563bbc53c7eSScott Feldman	      |         |                          |       |    |
564bbc53c7eSScott Feldman	      +–––––––––+                          |       |    |
565bbc53c7eSScott Feldman	      |         |                          |       |    |
566bbc53c7eSScott Feldman	      |         |                          |       |    |
567bbc53c7eSScott Feldman	      +–––––––––+                          |       |    |
568bbc53c7eSScott Feldman	      |         |                          +–––––––+  +–+
569bbc53c7eSScott Feldman	      |         |
570bbc53c7eSScott Feldman	      +–––––––––+
571bbc53c7eSScott Feldman
572bbc53c7eSScott Feldman				fig 2.
573bbc53c7eSScott Feldman
574*9ca6876dSPeter MaydellThe TLVs for Tx descriptor buffer are::
575bbc53c7eSScott Feldman
576bbc53c7eSScott Feldman	field			width	description
577bbc53c7eSScott Feldman	---------------------------------------------------------------------
578bbc53c7eSScott Feldman	PPORT			4	Destination physical port #
579bbc53c7eSScott Feldman	TX_OFFLOAD		1	Hardware offload modes:
580bbc53c7eSScott Feldman					  0: no offload
581bbc53c7eSScott Feldman					  1: insert IP csum (ipv4 only)
582bbc53c7eSScott Feldman					  2: insert TCP/UDP csum
583bbc53c7eSScott Feldman					  3: L3 csum calc and insert
584bbc53c7eSScott Feldman                        	             into csum offset (TX_L3_CSUM_OFF)
585bbc53c7eSScott Feldman                 	                    16-bit 1's complement csum value.
586bbc53c7eSScott Feldman                                	     IPv4 pseudo-header and IP
587bbc53c7eSScott Feldman                        	             already calculated by OS
588bbc53c7eSScott Feldman                  	                   and inserted.
589bbc53c7eSScott Feldman					  4: TSO (TCP Segmentation Offload)
590bbc53c7eSScott Feldman	TX_L3_CSUM_OFF		2	For L3 csum offload mode, the offset,
591bbc53c7eSScott Feldman					from the beginning of the packet,
592bbc53c7eSScott Feldman					of the csum field in the L3 header
593bbc53c7eSScott Feldman	TX_TSO_MSS		2	For TSO offload mode, the
594bbc53c7eSScott Feldman					Maximum Segment Size in bytes
595bbc53c7eSScott Feldman        TX_TSO_HDR_LEN		2	For TSO offload mode, the
596bbc53c7eSScott Feldman					length of ethernet, IP, and
597bbc53c7eSScott Feldman					TCP/UDP headers, including IP
598bbc53c7eSScott Feldman					and TCP options.
599bbc53c7eSScott Feldman	TX_FRAGS		<array>	Packet fragments
600bbc53c7eSScott Feldman	  TX_FRAG		<nest>	Packet fragment
601bbc53c7eSScott Feldman	    TX_FRAG_ADDR	8	DMA address of packet fragment
602bbc53c7eSScott Feldman	    TX_FRAG_LEN		2	Packet fragment length
603bbc53c7eSScott Feldman
604*9ca6876dSPeter MaydellPossible status return codes in descriptor on completion are::
605bbc53c7eSScott Feldman
606bbc53c7eSScott Feldman	DESC_COMP_ERR	reason
607bbc53c7eSScott Feldman	--------------------------------------------------------------------
608bbc53c7eSScott Feldman	0		OK
609bbc53c7eSScott Feldman	-ROCKER_ENXIO	address or data read err on desc buf or packet
610bbc53c7eSScott Feldman			fragment
611bbc53c7eSScott Feldman	-ROCKER_EINVAL	bad pport or TSO or csum offloading error
612bbc53c7eSScott Feldman	-ROCKER_ENOMEM	no memory for internal staging tx fragment
613bbc53c7eSScott Feldman
614bbc53c7eSScott FeldmanRx Packet Processing
615bbc53c7eSScott Feldman--------------------
616bbc53c7eSScott Feldman
617bbc53c7eSScott FeldmanFor packets ingressing on switch ports that are not forwarded by the switch but
618bbc53c7eSScott Feldmanrather directed to the host CPU for further processing are delivered in the DMA
619bbc53c7eSScott FeldmanRX ring.  Rx descriptor buffers are allocated by software and placed on the
620bbc53c7eSScott Feldmanring.  Hardware will fill Rx descriptor buffers with packet data, write the
621bbc53c7eSScott Feldmancompletion, and signal to software that a new packet is ready.  Since Rx packet
622bbc53c7eSScott Feldmansize is not known a-priori, the Rx descriptor buffer must be allocated for
623bbc53c7eSScott Feldmanworst-case packet size.  A single Rx descriptor will contain the entire Rx
624bbc53c7eSScott Feldmanpacket data in one RX_FRAG.  Other Rx TLVs describe and hardware offloads
625bbc53c7eSScott Feldmanperformed on the packet, such as checksum validation.
626bbc53c7eSScott Feldman
627*9ca6876dSPeter MaydellThe TLVs for Rx descriptor buffer are::
628bbc53c7eSScott Feldman
629bbc53c7eSScott Feldman	field		width	description
630bbc53c7eSScott Feldman	---------------------------------------------------
631bbc53c7eSScott Feldman	PPORT		4	Source physical port #
632bbc53c7eSScott Feldman	RX_FLAGS	2	Packet parsing flags:
633bbc53c7eSScott Feldman				  (1 << 0): IPv4 packet
634bbc53c7eSScott Feldman				  (1 << 1): IPv6 packet
635bbc53c7eSScott Feldman				  (1 << 2): csum calculated
636bbc53c7eSScott Feldman				  (1 << 3): IPv4 csum good
637bbc53c7eSScott Feldman				  (1 << 4): IP fragment
638bbc53c7eSScott Feldman				  (1 << 5): TCP packet
639bbc53c7eSScott Feldman				  (1 << 6): UDP packet
640bbc53c7eSScott Feldman				  (1 << 7): TCP/UDP csum good
641d0d25558SScott Feldman				  (1 << 8): Offload forward
642bbc53c7eSScott Feldman	RX_CSUM		2	IP calculated checksum:
643bbc53c7eSScott Feldman				  IPv4: IP payload csum
644bbc53c7eSScott Feldman				  IPv6: header and payload csum
645bbc53c7eSScott Feldman				(Only valid is RX_FLAGS:csum calc is set)
646bbc53c7eSScott Feldman	RX_FRAG_ADDR	8	DMA address of packet fragment
647bbc53c7eSScott Feldman	RX_FRAG_MAX_LEN	2	Packet maximum fragment length
648bbc53c7eSScott Feldman	RX_FRAG_LEN	2	Actual packet fragment length after receive
649bbc53c7eSScott Feldman
650d0d25558SScott FeldmanOffload forward RX_FLAG indicates the device has already forwarded the packet
651d0d25558SScott Feldmanso the host CPU should not also forward the packet.
652d0d25558SScott Feldman
653*9ca6876dSPeter MaydellPossible status return codes in descriptor on completion are::
654bbc53c7eSScott Feldman
655bbc53c7eSScott Feldman	DESC_COMP_ERR	reason
656bbc53c7eSScott Feldman	--------------------------------------------------------------------
657bbc53c7eSScott Feldman	0		OK
658bbc53c7eSScott Feldman	-ROCKER_ENXIO	address or data read err on desc buf
659bbc53c7eSScott Feldman	-ROCKER_ENOMEM	no memory for internal staging desc buf
660bbc53c7eSScott Feldman	-ROCKER_EMSGSIZE Rx descriptor buffer wasn't big enough to contain
661bbc53c7eSScott Feldman			packet data TLV and other TLVs.
662bbc53c7eSScott Feldman
663bbc53c7eSScott Feldman
664*9ca6876dSPeter MaydellOF-DPA Mode
665*9ca6876dSPeter Maydell===========
666bbc53c7eSScott Feldman
667bbc53c7eSScott FeldmanOF-DPA mode allows the switch to offload flow packet processing functions to
668bbc53c7eSScott Feldmanhardware.  An OpenFlow controller would communicate with an OpenFlow agent
669bbc53c7eSScott Feldmaninstalled on the switch.  The OpenFlow agent would (directly or indirectly)
670bbc53c7eSScott Feldmancommunicate with the Rocker switch driver, which in turn would program switch
671*9ca6876dSPeter Maydellhardware with flow functionality, as defined in OF-DPA.  The block diagram is::
672bbc53c7eSScott Feldman
673bbc53c7eSScott Feldman		+–––––––––––––––----–––+
674bbc53c7eSScott Feldman		|        OF            |
675bbc53c7eSScott Feldman		|  Remote Controller   |
676bbc53c7eSScott Feldman		+––––––––+––----–––––––+
677bbc53c7eSScott Feldman		         |
678bbc53c7eSScott Feldman		         |
679bbc53c7eSScott Feldman		+––––––––+–––––––––+
680bbc53c7eSScott Feldman		|       OF         |
681bbc53c7eSScott Feldman		|   Local Agent    |
682bbc53c7eSScott Feldman		+––––––––––––––––––+
683bbc53c7eSScott Feldman		|                  |
684bbc53c7eSScott Feldman		|   Rocker Driver  |
685bbc53c7eSScott Feldman		+––––––––––––––––––+
686bbc53c7eSScott Feldman		    <this spec>
687bbc53c7eSScott Feldman		+––––––––––––––––––+
688bbc53c7eSScott Feldman		|                  |
689bbc53c7eSScott Feldman		|   Rocker Switch  |
690bbc53c7eSScott Feldman		+––––––––––––––––––+
691bbc53c7eSScott Feldman
692bbc53c7eSScott FeldmanTo participate in flow functions, ports must be configure for OF-DPA mode
693bbc53c7eSScott Feldmanduring switch initialization.
694bbc53c7eSScott Feldman
695bbc53c7eSScott FeldmanOF-DPA Flow Table Interface
696bbc53c7eSScott Feldman---------------------------
697bbc53c7eSScott Feldman
698bbc53c7eSScott FeldmanThere are commands to add, modify, delete, and get stats of flow table entries.
699bbc53c7eSScott FeldmanThe commands are issued using the DMA CMD descriptor ring.  The following
700*9ca6876dSPeter Maydellcommands are defined::
701bbc53c7eSScott Feldman
702bbc53c7eSScott Feldman	CMD_ADD:		add an entry to flow table
703bbc53c7eSScott Feldman	CMD_MOD:		modify an entry in flow table
704bbc53c7eSScott Feldman	CMD_DEL:		delete an entry from flow table
705bbc53c7eSScott Feldman	CMD_GET_STATS:		get stats for flow entry
706bbc53c7eSScott Feldman
707*9ca6876dSPeter MaydellTLVs for add and modify commands are::
708bbc53c7eSScott Feldman
709bbc53c7eSScott Feldman	field			width	description
710bbc53c7eSScott Feldman	----------------------------------------------------
711bbc53c7eSScott Feldman	OF_DPA_CMD		2	CMD_[ADD|MOD]
712bbc53c7eSScott Feldman	OF_DPA_TBL		2	Flow table ID
713bbc53c7eSScott Feldman					  0: ingress port
714bbc53c7eSScott Feldman					  10: vlan
715bbc53c7eSScott Feldman					  20: termination mac
716bbc53c7eSScott Feldman					  30: unicast routing
717bbc53c7eSScott Feldman					  40: multicast routing
718bbc53c7eSScott Feldman					  50: bridging
719bbc53c7eSScott Feldman					  60: ACL policy
720bbc53c7eSScott Feldman	OF_DPA_PRIORITY		4	Flow priority
721bbc53c7eSScott Feldman	OF_DPA_HARDTIME		4	Hard timeout for flow
722bbc53c7eSScott Feldman	OF_DPA_IDLETIME		4	Idle timeout for flow
723bbc53c7eSScott Feldman	OF_DPA_COOKIE		8	Cookie
724bbc53c7eSScott Feldman
725bbc53c7eSScott FeldmanAdditional TLVs based on flow table ID:
726bbc53c7eSScott Feldman
727*9ca6876dSPeter MaydellTable ID 0: ingress port::
728bbc53c7eSScott Feldman
729bbc53c7eSScott Feldman	field			width	description
730bbc53c7eSScott Feldman	----------------------------------------------------
731bbc53c7eSScott Feldman	OF_DPA_IN_PPORT		4	ingress physical port number
732bbc53c7eSScott Feldman	OF_DPA_GOTO_TBL		2	goto table ID; zero to drop
733bbc53c7eSScott Feldman
734*9ca6876dSPeter MaydellTable ID 10: vlan::
735bbc53c7eSScott Feldman
736bbc53c7eSScott Feldman	field			width	description
737bbc53c7eSScott Feldman	----------------------------------------------------
738bbc53c7eSScott Feldman	OF_DPA_IN_PPORT		4	ingress physical port number
739bbc53c7eSScott Feldman	OF_DPA_VLAN_ID		2 (N)	vlan ID
740bbc53c7eSScott Feldman	OF_DPA_VLAN_ID_MASK	2 (N)	vlan ID mask
741bbc53c7eSScott Feldman	OF_DPA_GOTO_TBL		2	goto table ID; zero to drop
742bbc53c7eSScott Feldman	OF_DPA_NEW_VLAN_ID	2 (N)	new vlan ID
743bbc53c7eSScott Feldman
744*9ca6876dSPeter MaydellTable ID 20: termination mac::
745bbc53c7eSScott Feldman
746bbc53c7eSScott Feldman	field			width	description
747bbc53c7eSScott Feldman	----------------------------------------------------
748bbc53c7eSScott Feldman	OF_DPA_IN_PPORT		4	ingress physical port number
749bbc53c7eSScott Feldman	OF_DPA_IN_PPORT_MASK	4	ingress physical port number mask
750bbc53c7eSScott Feldman	OF_DPA_ETHERTYPE	2 (N)	must be either 0x0800 or 0x86dd
751bbc53c7eSScott Feldman	OF_DPA_DST_MAC		6 (N)	destination MAC
752bbc53c7eSScott Feldman	OF_DPA_DST_MAC_MASK	6 (N)	destination MAC mask
753bbc53c7eSScott Feldman	OF_DPA_VLAN_ID		2 (N)	vlan ID
754bbc53c7eSScott Feldman	OF_DPA_VLAN_ID_MASK	2 (N)	vlan ID mask
755bbc53c7eSScott Feldman	OF_DPA_GOTO_TBL		2	only acceptable values are
756bbc53c7eSScott Feldman					unicast or multicast routing
757bbc53c7eSScott Feldman					table IDs
758bbc53c7eSScott Feldman	OF_DPA_OUT_PPORT	2	if specified, must be
759bbc53c7eSScott Feldman					controller, set zero otherwise
760bbc53c7eSScott Feldman
761*9ca6876dSPeter MaydellTable ID 30: unicast routing::
762bbc53c7eSScott Feldman
763bbc53c7eSScott Feldman	field			width	description
764bbc53c7eSScott Feldman	----------------------------------------------------
765bbc53c7eSScott Feldman	OF_DPA_ETHERTYPE	2 (N)	must be either 0x0800 or 0x86dd
766bbc53c7eSScott Feldman	OF_DPA_DST_IP		4 (N)	destination IPv4 address.
767bbc53c7eSScott Feldman					Must be unicast address
768bbc53c7eSScott Feldman	OF_DPA_DST_IP_MASK	4 (N)	IP mask.  Must be prefix mask
769bbc53c7eSScott Feldman	OF_DPA_DST_IPV6		16 (N)	destination IPv6 address.
770bbc53c7eSScott Feldman					Must be unicast address
771bbc53c7eSScott Feldman	OF_DPA_DST_IPV6_MASK	16 (N)	IPv6 mask. Must be prefix mask
772bbc53c7eSScott Feldman	OF_DPA_GOTO_TBL		2	goto table ID; zero to drop
773bbc53c7eSScott Feldman	OF_DPA_GROUP_ID		4	data for GROUP action must
774bbc53c7eSScott Feldman					be an L3 Unicast group entry
775bbc53c7eSScott Feldman
776*9ca6876dSPeter MaydellTable ID 40: multicast routing::
777bbc53c7eSScott Feldman
778bbc53c7eSScott Feldman	field			width	description
779bbc53c7eSScott Feldman	----------------------------------------------------
780bbc53c7eSScott Feldman	OF_DPA_ETHERTYPE	2 (N)	must be either 0x0800 or 0x86dd
781bbc53c7eSScott Feldman	OF_DPA_VLAN_ID		2 (N)	vlan ID
782bbc53c7eSScott Feldman	OF_DPA_SRC_IP		4 (N)	source IPv4. Optional,
783bbc53c7eSScott Feldman					can contain IPv4 address,
784bbc53c7eSScott Feldman					must be completely masked
785bbc53c7eSScott Feldman					if not used
786bbc53c7eSScott Feldman	OF_DPA_SRC_IP_MASK	4 (N)	IP Mask
787bbc53c7eSScott Feldman	OF_DPA_DST_IP		4 (N)	destination IPv4 address.
788bbc53c7eSScott Feldman					Must be multicast address
789bbc53c7eSScott Feldman	OF_DPA_SRC_IPV6		16 (N)	source IPv6 Address. Optional.
790bbc53c7eSScott Feldman					Can contain IPv6 address,
791bbc53c7eSScott Feldman					must be completely masked
792bbc53c7eSScott Feldman					if not used
793bbc53c7eSScott Feldman	OF_DPA_SRC_IPV6_MASK	16 (N)	IPv6 mask.
794bbc53c7eSScott Feldman	OF_DPA_DST_IPV6		16 (N)	destination IPv6 Address. Must
795bbc53c7eSScott Feldman					be multicast address
796bbc53c7eSScott Feldman					Must be multicast address
797bbc53c7eSScott Feldman	OF_DPA_GOTO_TBL		2	goto table ID; zero to drop
798bbc53c7eSScott Feldman	OF_DPA_GROUP_ID		4	data for GROUP action must
799bbc53c7eSScott Feldman					be an L3 multicast group entry
800bbc53c7eSScott Feldman
801*9ca6876dSPeter MaydellTable ID 50: bridging::
802bbc53c7eSScott Feldman
803bbc53c7eSScott Feldman	field			width	description
804bbc53c7eSScott Feldman	----------------------------------------------------
805bbc53c7eSScott Feldman	OF_DPA_VLAN_ID		2 (N)	vlan ID
806bbc53c7eSScott Feldman	OF_DPA_TUNNEL_ID	4	tunnel ID
807bbc53c7eSScott Feldman	OF_DPA_DST_MAC		6 (N)	destination MAC
808bbc53c7eSScott Feldman	OF_DPA_DST_MAC_MASK	6 (N)	destination MAC mask
809bbc53c7eSScott Feldman	OF_DPA_GOTO_TBL		2	goto table ID; zero to drop
810bbc53c7eSScott Feldman	OF_DPA_GROUP_ID		4	data for GROUP action must
811bbc53c7eSScott Feldman					be a L2 Interface, L2
812bbc53c7eSScott Feldman					Multicast, L2 Flood,
813bbc53c7eSScott Feldman					or L2 Overlay group entry
814bbc53c7eSScott Feldman					as appropriate
815bbc53c7eSScott Feldman	OF_DPA_TUNNEL_LPORT	4	unicast Tenant Bridging
816bbc53c7eSScott Feldman					flows specify a tunnel
817bbc53c7eSScott Feldman					logical port ID
818bbc53c7eSScott Feldman	OF_DPA_OUT_PPORT	2	data for OUTPUT action,
819bbc53c7eSScott Feldman					restricted to CONTROLLER,
820bbc53c7eSScott Feldman					set to 0 otherwise
821bbc53c7eSScott Feldman
822*9ca6876dSPeter MaydellTable ID 60: acl policy::
823bbc53c7eSScott Feldman
824bbc53c7eSScott Feldman	field			width	description
825bbc53c7eSScott Feldman	----------------------------------------------------
826bbc53c7eSScott Feldman	OF_DPA_IN_PPORT		4	ingress physical port number
827bbc53c7eSScott Feldman	OF_DPA_IN_PPORT_MASK	4	ingress physical port number mask
828bbc53c7eSScott Feldman	OF_DPA_ETHERTYPE	2 (N)	ethertype
829bbc53c7eSScott Feldman	OF_DPA_VLAN_ID		2 (N)	vlan ID
830bbc53c7eSScott Feldman	OF_DPA_VLAN_ID_MASK	2 (N)	vlan ID mask
831bbc53c7eSScott Feldman	OF_DPA_VLAN_PCP		2 (N)	vlan Priority Code Point
832bbc53c7eSScott Feldman	OF_DPA_VLAN_PCP_MASK	2 (N)	vlan Priority Code Point mask
833bbc53c7eSScott Feldman	OF_DPA_SRC_MAC		6 (N)	source MAC
834bbc53c7eSScott Feldman	OF_DPA_SRC_MAC_MASK	6 (N)	source MAC mask
835bbc53c7eSScott Feldman	OF_DPA_DST_MAC		6 (N)	destination MAC
836bbc53c7eSScott Feldman	OF_DPA_DST_MAC_MASK	6 (N)	destination MAC mask
837bbc53c7eSScott Feldman	OF_DPA_TUNNEL_ID	4	tunnel ID
838bbc53c7eSScott Feldman	OF_DPA_SRC_IP		4 (N)	source IPv4. Optional,
839bbc53c7eSScott Feldman					can contain IPv4 address,
840bbc53c7eSScott Feldman					must be completely masked
841bbc53c7eSScott Feldman					if not used
842bbc53c7eSScott Feldman	OF_DPA_SRC_IP_MASK	4 (N)	IP Mask
843bbc53c7eSScott Feldman	OF_DPA_DST_IP		4 (N)	destination IPv4 address.
844bbc53c7eSScott Feldman					Must be multicast address
845bbc53c7eSScott Feldman	OF_DPA_DST_IP_MASK	4 (N)	IP Mask
846bbc53c7eSScott Feldman	OF_DPA_SRC_IPV6		16 (N)	source IPv6 Address. Optional.
847bbc53c7eSScott Feldman					Can contain IPv6 address,
848bbc53c7eSScott Feldman					must be completely masked
849bbc53c7eSScott Feldman					if not used
850bbc53c7eSScott Feldman	OF_DPA_SRC_IPV6_MASK	16 (N)	IPv6 mask
851bbc53c7eSScott Feldman	OF_DPA_DST_IPV6		16 (N)	destination IPv6 Address. Must
852bbc53c7eSScott Feldman					be multicast address.
853bbc53c7eSScott Feldman	OF_DPA_DST_IPV6_MASK	16 (N)	IPv6 mask
854bbc53c7eSScott Feldman	OF_DPA_SRC_ARP_IP	4 (N)	source IPv4 address in the ARP
855bbc53c7eSScott Feldman					payload.  Only used if ethertype
856bbc53c7eSScott Feldman					== 0x0806.
857bbc53c7eSScott Feldman	OF_DPA_SRC_ARP_IP_MASK	4 (N)	IP Mask
858bbc53c7eSScott Feldman	OF_DPA_IP_PROTO		1	IP protocol
859bbc53c7eSScott Feldman	OF_DPA_IP_PROTO_MASK	1	IP protocol mask
860bbc53c7eSScott Feldman	OF_DPA_IP_DSCP		1	DSCP
861bbc53c7eSScott Feldman	OF_DPA_IP_DSCP_MASK	1	DSCP mask
862bbc53c7eSScott Feldman	OF_DPA_IP_ECN		1	ECN
863bbc53c7eSScott Feldman	OF_DPA_IP_ECN_MASK		1	ECN mask
864bbc53c7eSScott Feldman	OF_DPA_L4_SRC_PORT	2 (N)	L4 source port, only for
865bbc53c7eSScott Feldman					TCP, UDP, or SCTP
866bbc53c7eSScott Feldman	OF_DPA_L4_SRC_PORT_MASK	2 (N)	L4 source port mask
867bbc53c7eSScott Feldman	OF_DPA_L4_DST_PORT	2 (N)	L4 source port, only for
868bbc53c7eSScott Feldman					TCP, UDP, or SCTP
869bbc53c7eSScott Feldman	OF_DPA_L4_DST_PORT_MASK	2 (N)	L4 source port mask
870bbc53c7eSScott Feldman	OF_DPA_ICMP_TYPE	1	ICMP type, only if IP
871bbc53c7eSScott Feldman					protocol is 1
872bbc53c7eSScott Feldman	OF_DPA_ICMP_TYPE_MASK	1	ICMP type mask
873bbc53c7eSScott Feldman	OF_DPA_ICMP_CODE	1	ICMP code
874bbc53c7eSScott Feldman	OF_DPA_ICMP_CODE_MASK	1	ICMP code mask
875bbc53c7eSScott Feldman	OF_DPA_IPV6_LABEL	4 (N)	IPv6 flow label
876bbc53c7eSScott Feldman	OF_DPA_IPV6_LABEL_MASK	4 (N)	IPv6 flow label mask
877bbc53c7eSScott Feldman	OF_DPA_GROUP_ID		4	data for GROUP action
878bbc53c7eSScott Feldman	OF_DPA_QUEUE_ID_ACTION	1	write the queue ID
879bbc53c7eSScott Feldman	OF_DPA_NEW_QUEUE_ID	1	queue ID
880bbc53c7eSScott Feldman	OF_DPA_VLAN_PCP_ACTION	1	write the VLAN priority
881bbc53c7eSScott Feldman	OF_DPA_NEW_VLAN_PCP	1	VLAN priority
882bbc53c7eSScott Feldman	OF_DPA_IP_DSCP_ACTION	1	write the DSCP
883bbc53c7eSScott Feldman	OF_DPA_NEW_IP_DSCP	1	new DSCP
884bbc53c7eSScott Feldman	OF_DPA_TUNNEL_LPORT	4	restrct to valid tunnel
885bbc53c7eSScott Feldman					logical port, set to 0
886bbc53c7eSScott Feldman					otherwise.
887bbc53c7eSScott Feldman	OF_DPA_OUT_PPORT	2	data for OUTPUT action,
888bbc53c7eSScott Feldman					restricted to CONTROLLER,
889bbc53c7eSScott Feldman					set to 0 otherwise
890bbc53c7eSScott Feldman	OF_DPA_CLEAR_ACTIONS	4	if 1 packets matching flow are
891bbc53c7eSScott Feldman					dropped (all other instructions
892bbc53c7eSScott Feldman					ignored)
893bbc53c7eSScott Feldman
894*9ca6876dSPeter MaydellTLVs for flow delete and get stats command are::
895bbc53c7eSScott Feldman
896bbc53c7eSScott Feldman	field			width	description
897bbc53c7eSScott Feldman	---------------------------------------------------
898bbc53c7eSScott Feldman	OF_DPA_CMD		2	CMD_[DEL|GET_STATS]
899bbc53c7eSScott Feldman	OF_DPA_COOKIE		8	Cookie
900bbc53c7eSScott Feldman
901bbc53c7eSScott FeldmanOn completion of get stats command, the descriptor buffer is written back with
902*9ca6876dSPeter Maydellthe following TLVs::
903bbc53c7eSScott Feldman
904bbc53c7eSScott Feldman	field			width	description
905bbc53c7eSScott Feldman	---------------------------------------------------
906bbc53c7eSScott Feldman	OF_DPA_STAT_DURATION	4	Flow duration
907bbc53c7eSScott Feldman	OF_DPA_STAT_RX_PKTS	8	Received packets
908bbc53c7eSScott Feldman	OF_DPA_STAT_TX_PKTS	8	Transmit packets
909bbc53c7eSScott Feldman
910*9ca6876dSPeter MaydellPossible status return codes in descriptor on completion are::
911bbc53c7eSScott Feldman
912bbc53c7eSScott Feldman	DESC_COMP_ERR	command			reason
913bbc53c7eSScott Feldman	--------------------------------------------------------------------
914bbc53c7eSScott Feldman	0		all			OK
915bbc53c7eSScott Feldman	-ROCKER_EFAULT	all			head or tail index outside
916bbc53c7eSScott Feldman						of ring
917bbc53c7eSScott Feldman	-ROCKER_ENXIO	all			address or data read err on
918bbc53c7eSScott Feldman						desc buf
919bbc53c7eSScott Feldman	-ROCKER_EMSGSIZE GET_STATS		cmd descriptor buffer wasn't
920bbc53c7eSScott Feldman						big enough to contain write-back
921bbc53c7eSScott Feldman						TLVs
922bbc53c7eSScott Feldman	-ROCKER_EINVAL	all			invalid parameters passed in
923bbc53c7eSScott Feldman	-ROCKER_EEXIST	ADD			entry already exists
924bbc53c7eSScott Feldman	-ROCKER_ENOSPC	ADD			no space left in flow table
925bbc53c7eSScott Feldman	-ROCKER_ENOENT	MOD|DEL|GET_STATS	cookie invalid
926bbc53c7eSScott Feldman
927bbc53c7eSScott FeldmanGroup Table Interface
928bbc53c7eSScott Feldman---------------------
929bbc53c7eSScott Feldman
930bbc53c7eSScott FeldmanThere are commands to add, modify, delete, and get stats of group table
931bbc53c7eSScott Feldmanentries.  The commands are issued using the DMA CMD descriptor ring.  The
932*9ca6876dSPeter Maydellfollowing commands are defined::
933bbc53c7eSScott Feldman
934bbc53c7eSScott Feldman	CMD_ADD:		add an entry to group table
935bbc53c7eSScott Feldman	CMD_MOD:		modify an entry in group table
936bbc53c7eSScott Feldman	CMD_DEL:		delete an entry from group table
937bbc53c7eSScott Feldman	CMD_GET_STATS:		get stats for group entry
938bbc53c7eSScott Feldman
939*9ca6876dSPeter MaydellTLVs for add and modify commands are::
940bbc53c7eSScott Feldman
941bbc53c7eSScott Feldman	field			width	description
942bbc53c7eSScott Feldman	-----------------------------------------------------------
943bbc53c7eSScott Feldman	FLOW_GROUP_CMD		2	CMD_[ADD|MOD]
944bbc53c7eSScott Feldman	FLOW_GROUP_ID		2	Flow group ID
945bbc53c7eSScott Feldman	FLOW_GROUP_TYPE		1	Group type:
946bbc53c7eSScott Feldman					  0: L2 interface
947bbc53c7eSScott Feldman					  1: L2 rewrite
948bbc53c7eSScott Feldman					  2: L3 unicast
949bbc53c7eSScott Feldman					  3: L2 multicast
950bbc53c7eSScott Feldman					  4: L2 flood
951bbc53c7eSScott Feldman					  5: L3 interface
952bbc53c7eSScott Feldman					  6: L3 multicast
953bbc53c7eSScott Feldman					  7: L3 ECMP
954bbc53c7eSScott Feldman					  8: L2 overlay
955bbc53c7eSScott Feldman	FLOW_VLAN_ID		2	Vlan ID (types 0, 3, 4, 6)
956bbc53c7eSScott Feldman	FLOW_L2_PORT		2	Port (types 0)
957bbc53c7eSScott Feldman	FLOW_INDEX		4	Index (all types but 0)
958bbc53c7eSScott Feldman	FLOW_OVERLAY_TYPE	1	Overlay sub-type (type 8):
959bbc53c7eSScott Feldman					  0: Flood unicast tunnel
960bbc53c7eSScott Feldman					  1: Flood multicast tunnel
961bbc53c7eSScott Feldman					  2: Multicast unicast tunnel
962bbc53c7eSScott Feldman					  3: Multicast multicast tunnel
963bbc53c7eSScott Feldman	FLOW_GROUP_ACTION		nest
964bbc53c7eSScott Feldman	  FLOW_GROUP_ID		2	next group ID in chain (all
965bbc53c7eSScott Feldman					types except 0)
966bbc53c7eSScott Feldman	  FLOW_OUT_PORT		4	egress port (types 0, 8)
967bbc53c7eSScott Feldman	  FLOW_POP_VLAN_TAG	1	strip outer VLAN tag (type 1
968bbc53c7eSScott Feldman					only)
969bbc53c7eSScott Feldman	  FLOW_VLAN_ID		2	(types 1, 5)
970bbc53c7eSScott Feldman	  FLOW_SRC_MAC		6	(types 1, 2, 5)
971bbc53c7eSScott Feldman	  FLOW_DST_MAC		6	(types 1, 2)
972bbc53c7eSScott Feldman
973*9ca6876dSPeter MaydellTLVs for flow delete and get stats command are::
974bbc53c7eSScott Feldman
975bbc53c7eSScott Feldman	field			width	description
976bbc53c7eSScott Feldman	-----------------------------------------------------------
977bbc53c7eSScott Feldman	FLOW_GROUP_CMD		2	CMD_[DEL|GET_STATS]
978bbc53c7eSScott Feldman	FLOW_GROUP_ID		2	Flow group ID
979bbc53c7eSScott Feldman
980bbc53c7eSScott FeldmanOn completion of get stats command, the descriptor buffer is written back with
981*9ca6876dSPeter Maydellthe following TLVs::
982bbc53c7eSScott Feldman
983bbc53c7eSScott Feldman	field			width	description
984bbc53c7eSScott Feldman	---------------------------------------------------
985bbc53c7eSScott Feldman	FLOW_GROUP_ID		2	Flow group ID
986bbc53c7eSScott Feldman	FLOW_STAT_DURATION	4	Flow duration
987bbc53c7eSScott Feldman	FLOW_STAT_REF_COUNT	4	Flow reference count
988bbc53c7eSScott Feldman	FLOW_STAT_BUCKET_COUNT	4	Flow bucket count
989bbc53c7eSScott Feldman
990*9ca6876dSPeter MaydellPossible status return codes in descriptor on completion are::
991bbc53c7eSScott Feldman
992bbc53c7eSScott Feldman	DESC_COMP_ERR	command			reason
993bbc53c7eSScott Feldman	--------------------------------------------------------------------
994bbc53c7eSScott Feldman	0		all			OK
995bbc53c7eSScott Feldman	-ROCKER_EFAULT	all			head or tail index outside
996bbc53c7eSScott Feldman						of ring
997bbc53c7eSScott Feldman	-ROCKER_ENXIO	all			address or data read err on
998bbc53c7eSScott Feldman						desc buf
999bbc53c7eSScott Feldman	-ROCKER_ENOSPC	GET_STATS		cmd descriptor buffer wasn't
1000bbc53c7eSScott Feldman						big enough to contain write-back
1001bbc53c7eSScott Feldman						TLVs
1002bbc53c7eSScott Feldman	-ROCKER_EINVAL	ADD|MOD			invalid parameters passed in
1003bbc53c7eSScott Feldman	-ROCKER_EEXIST	ADD			entry already exists
1004bbc53c7eSScott Feldman	-ROCKER_ENOSPC	ADD			no space left in flow table
1005bbc53c7eSScott Feldman	-ROCKER_ENOENT	MOD|DEL|GET_STATS	group ID invalid
1006bbc53c7eSScott Feldman	-ROCKER_EBUSY	DEL			group reference count non-zero
1007bbc53c7eSScott Feldman	-ROCKER_ENODEV	ADD			next group ID doesn't exist
1008bbc53c7eSScott Feldman
1009bbc53c7eSScott Feldman
1010bbc53c7eSScott Feldman
1011bbc53c7eSScott FeldmanReferences
1012bbc53c7eSScott Feldman==========
1013bbc53c7eSScott Feldman
1014bbc53c7eSScott Feldman[1] OpenFlow Data Plane Abstraction (OF-DPA) Abstract Switch Specification,
1015bbc53c7eSScott FeldmanVersion 1.0, from Broadcom Corporation, February 21, 2014.
1016