• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/net/enic/
1/*
2 * Copyright 2008-2010 Cisco Systems, Inc.  All rights reserved.
3 * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
4 *
5 * This program is free software; you may redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; version 2 of the License.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
10 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
11 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
12 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
13 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
14 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
15 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
16 * SOFTWARE.
17 *
18 */
19
20#ifndef _VNIC_DEVCMD_H_
21#define _VNIC_DEVCMD_H_
22
23#define _CMD_NBITS      14
24#define _CMD_VTYPEBITS	10
25#define _CMD_FLAGSBITS  6
26#define _CMD_DIRBITS	2
27
28#define _CMD_NMASK      ((1 << _CMD_NBITS)-1)
29#define _CMD_VTYPEMASK  ((1 << _CMD_VTYPEBITS)-1)
30#define _CMD_FLAGSMASK  ((1 << _CMD_FLAGSBITS)-1)
31#define _CMD_DIRMASK    ((1 << _CMD_DIRBITS)-1)
32
33#define _CMD_NSHIFT     0
34#define _CMD_VTYPESHIFT (_CMD_NSHIFT+_CMD_NBITS)
35#define _CMD_FLAGSSHIFT (_CMD_VTYPESHIFT+_CMD_VTYPEBITS)
36#define _CMD_DIRSHIFT   (_CMD_FLAGSSHIFT+_CMD_FLAGSBITS)
37
38/*
39 * Direction bits (from host perspective).
40 */
41#define _CMD_DIR_NONE   0U
42#define _CMD_DIR_WRITE  1U
43#define _CMD_DIR_READ   2U
44#define _CMD_DIR_RW     (_CMD_DIR_WRITE | _CMD_DIR_READ)
45
46/*
47 * Flag bits.
48 */
49#define _CMD_FLAGS_NONE 0U
50#define _CMD_FLAGS_NOWAIT 1U
51
52/*
53 * vNIC type bits.
54 */
55#define _CMD_VTYPE_NONE  0U
56#define _CMD_VTYPE_ENET  1U
57#define _CMD_VTYPE_FC    2U
58#define _CMD_VTYPE_SCSI  4U
59#define _CMD_VTYPE_ALL   (_CMD_VTYPE_ENET | _CMD_VTYPE_FC | _CMD_VTYPE_SCSI)
60
61/*
62 * Used to create cmds..
63*/
64#define _CMDCF(dir, flags, vtype, nr)  \
65	(((dir)   << _CMD_DIRSHIFT) | \
66	((flags) << _CMD_FLAGSSHIFT) | \
67	((vtype) << _CMD_VTYPESHIFT) | \
68	((nr)    << _CMD_NSHIFT))
69#define _CMDC(dir, vtype, nr)    _CMDCF(dir, 0, vtype, nr)
70#define _CMDCNW(dir, vtype, nr)  _CMDCF(dir, _CMD_FLAGS_NOWAIT, vtype, nr)
71
72/*
73 * Used to decode cmds..
74*/
75#define _CMD_DIR(cmd)            (((cmd) >> _CMD_DIRSHIFT) & _CMD_DIRMASK)
76#define _CMD_FLAGS(cmd)          (((cmd) >> _CMD_FLAGSSHIFT) & _CMD_FLAGSMASK)
77#define _CMD_VTYPE(cmd)          (((cmd) >> _CMD_VTYPESHIFT) & _CMD_VTYPEMASK)
78#define _CMD_N(cmd)              (((cmd) >> _CMD_NSHIFT) & _CMD_NMASK)
79
80enum vnic_devcmd_cmd {
81	CMD_NONE                = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_NONE, 0),
82
83	/* mcpu fw info in mem: (u64)a0=paddr to struct vnic_devcmd_fw_info */
84	CMD_MCPU_FW_INFO        = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 1),
85
86	/* dev-specific block member:
87	 *    in: (u16)a0=offset,(u8)a1=size
88	 *    out: a0=value */
89	CMD_DEV_SPEC            = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 2),
90
91	/* stats clear */
92	CMD_STATS_CLEAR         = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 3),
93
94	/* stats dump in mem: (u64)a0=paddr to stats area,
95	 *                    (u16)a1=sizeof stats area */
96	CMD_STATS_DUMP          = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 4),
97
98	/* set Rx packet filter: (u32)a0=filters (see CMD_PFILTER_*) */
99	CMD_PACKET_FILTER	= _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 7),
100
101	/* set Rx packet filter for all: (u32)a0=filters (see CMD_PFILTER_*) */
102	CMD_PACKET_FILTER_ALL   = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 7),
103
104	/* hang detection notification */
105	CMD_HANG_NOTIFY         = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 8),
106
107	/* MAC address in (u48)a0 */
108	CMD_MAC_ADDR            = _CMDC(_CMD_DIR_READ,
109					_CMD_VTYPE_ENET | _CMD_VTYPE_FC, 9),
110
111	/* add addr from (u48)a0 */
112	CMD_ADDR_ADD            = _CMDCNW(_CMD_DIR_WRITE,
113					_CMD_VTYPE_ENET | _CMD_VTYPE_FC, 12),
114
115	/* del addr from (u48)a0 */
116	CMD_ADDR_DEL            = _CMDCNW(_CMD_DIR_WRITE,
117					_CMD_VTYPE_ENET | _CMD_VTYPE_FC, 13),
118
119	/* add VLAN id in (u16)a0 */
120	CMD_VLAN_ADD            = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 14),
121
122	/* del VLAN id in (u16)a0 */
123	CMD_VLAN_DEL            = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 15),
124
125	/* nic_cfg in (u32)a0 */
126	CMD_NIC_CFG             = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16),
127
128	/* union vnic_rss_key in mem: (u64)a0=paddr, (u16)a1=len */
129	CMD_RSS_KEY             = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 17),
130
131	/* union vnic_rss_cpu in mem: (u64)a0=paddr, (u16)a1=len */
132	CMD_RSS_CPU             = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 18),
133
134	/* initiate softreset */
135	CMD_SOFT_RESET          = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 19),
136
137	/* softreset status:
138	 *    out: a0=0 reset complete, a0=1 reset in progress */
139	CMD_SOFT_RESET_STATUS   = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 20),
140
141	/* set struct vnic_devcmd_notify buffer in mem:
142	 * in:
143	 *   (u64)a0=paddr to notify (set paddr=0 to unset)
144	 *   (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify)
145	 *   (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr)
146	 * out:
147	 *   (u32)a1 = effective size
148	 */
149	CMD_NOTIFY              = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 21),
150
151	/* UNDI API: (u64)a0=paddr to s_PXENV_UNDI_ struct,
152	 *           (u8)a1=PXENV_UNDI_xxx */
153	CMD_UNDI                = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 22),
154
155	/* initiate open sequence (u32)a0=flags (see CMD_OPENF_*) */
156	CMD_OPEN		= _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 23),
157
158	/* open status:
159	 *    out: a0=0 open complete, a0=1 open in progress */
160	CMD_OPEN_STATUS		= _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 24),
161
162	/* close vnic */
163	CMD_CLOSE		= _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 25),
164
165	/* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */
166/***** Replaced by CMD_INIT *****/
167	CMD_INIT_v1		= _CMDCNW(_CMD_DIR_READ, _CMD_VTYPE_ALL, 26),
168
169	/* variant of CMD_INIT, with provisioning info
170	 *     (u64)a0=paddr of vnic_devcmd_provinfo
171	 *     (u32)a1=sizeof provision info */
172	CMD_INIT_PROV_INFO	= _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 27),
173
174	/* enable virtual link */
175	CMD_ENABLE		= _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),
176
177	/* enable virtual link, waiting variant. */
178	CMD_ENABLE_WAIT		= _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),
179
180	/* disable virtual link */
181	CMD_DISABLE		= _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 29),
182
183	/* stats dump sum of all vnic stats on same uplink in mem:
184	 *     (u64)a0=paddr
185	 *     (u16)a1=sizeof stats area */
186	CMD_STATS_DUMP_ALL	= _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 30),
187
188	/* init status:
189	 *    out: a0=0 init complete, a0=1 init in progress
190	 *         if a0=0, a1=errno */
191	CMD_INIT_STATUS		= _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31),
192
193	/* INT13 API: (u64)a0=paddr to vnic_int13_params struct
194	 *            (u32)a1=INT13_CMD_xxx */
195	CMD_INT13               = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_FC, 32),
196
197	/* logical uplink enable/disable: (u64)a0: 0/1=disable/enable */
198	CMD_LOGICAL_UPLINK      = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 33),
199
200	/* undo initialize of virtual link */
201	CMD_DEINIT		= _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 34),
202
203	/* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */
204	CMD_INIT		= _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 35),
205
206	/* check fw capability of a cmd:
207	 * in:  (u32)a0=cmd
208	 * out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */
209	CMD_CAPABILITY		= _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 36),
210
211	/* persistent binding info
212	 * in:  (u64)a0=paddr of arg
213	 *      (u32)a1=CMD_PERBI_XXX */
214	CMD_PERBI		= _CMDC(_CMD_DIR_RW, _CMD_VTYPE_FC, 37),
215
216	/* Interrupt Assert Register functionality
217	 * in: (u16)a0=interrupt number to assert
218	 */
219	CMD_IAR			= _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 38),
220
221	/* initiate hangreset, like softreset after hang detected */
222	CMD_HANG_RESET		= _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 39),
223
224	/* hangreset status:
225	 *    out: a0=0 reset complete, a0=1 reset in progress */
226	CMD_HANG_RESET_STATUS   = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 40),
227
228	/*
229	 * Set hw ingress packet vlan rewrite mode:
230	 * in:  (u32)a0=new vlan rewrite mode
231	 * out: (u32)a0=old vlan rewrite mode */
232	CMD_IG_VLAN_REWRITE_MODE = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 41),
233
234	/*
235	 * in:  (u16)a0=bdf of target vnic
236	 *      (u32)a1=cmd to proxy
237	 *      a2-a15=args to cmd in a1
238	 * out: (u32)a0=status of proxied cmd
239	 *      a1-a15=out args of proxied cmd */
240	CMD_PROXY_BY_BDF =	_CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 42),
241};
242
243/* flags for CMD_OPEN */
244#define CMD_OPENF_OPROM		0x1	/* open coming from option rom */
245
246/* flags for CMD_INIT */
247#define CMD_INITF_DEFAULT_MAC	0x1	/* init with default mac addr */
248
249/* flags for CMD_PACKET_FILTER */
250#define CMD_PFILTER_DIRECTED		0x01
251#define CMD_PFILTER_MULTICAST		0x02
252#define CMD_PFILTER_BROADCAST		0x04
253#define CMD_PFILTER_PROMISCUOUS		0x08
254#define CMD_PFILTER_ALL_MULTICAST	0x10
255
256/* rewrite modes for CMD_IG_VLAN_REWRITE_MODE */
257#define IG_VLAN_REWRITE_MODE_DEFAULT_TRUNK              0
258#define IG_VLAN_REWRITE_MODE_UNTAG_DEFAULT_VLAN         1
259#define IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN  2
260#define IG_VLAN_REWRITE_MODE_PASS_THRU                  3
261
262enum vnic_devcmd_status {
263	STAT_NONE = 0,
264	STAT_BUSY = 1 << 0,	/* cmd in progress */
265	STAT_ERROR = 1 << 1,	/* last cmd caused error (code in a0) */
266};
267
268enum vnic_devcmd_error {
269	ERR_SUCCESS = 0,
270	ERR_EINVAL = 1,
271	ERR_EFAULT = 2,
272	ERR_EPERM = 3,
273	ERR_EBUSY = 4,
274	ERR_ECMDUNKNOWN = 5,
275	ERR_EBADSTATE = 6,
276	ERR_ENOMEM = 7,
277	ERR_ETIMEDOUT = 8,
278	ERR_ELINKDOWN = 9,
279	ERR_EMAXRES = 10,
280};
281
282struct vnic_devcmd_fw_info {
283	char fw_version[32];
284	char fw_build[32];
285	char hw_version[32];
286	char hw_serial_number[32];
287};
288
289struct vnic_devcmd_notify {
290	u32 csum;		/* checksum over following words */
291
292	u32 link_state;		/* link up == 1 */
293	u32 port_speed;		/* effective port speed (rate limit) */
294	u32 mtu;		/* MTU */
295	u32 msglvl;		/* requested driver msg lvl */
296	u32 uif;		/* uplink interface */
297	u32 status;		/* status bits (see VNIC_STF_*) */
298	u32 error;		/* error code (see ERR_*) for first ERR */
299	u32 link_down_cnt;	/* running count of link down transitions */
300	u32 perbi_rebuild_cnt;	/* running count of perbi rebuilds */
301};
302#define VNIC_STF_FATAL_ERR	0x0001	/* fatal fw error */
303#define VNIC_STF_STD_PAUSE	0x0002	/* standard link-level pause on */
304#define VNIC_STF_PFC_PAUSE	0x0004	/* priority flow control pause on */
305/* all supported status flags */
306#define VNIC_STF_ALL		(VNIC_STF_FATAL_ERR |\
307				 VNIC_STF_STD_PAUSE |\
308				 VNIC_STF_PFC_PAUSE |\
309				 0)
310
311struct vnic_devcmd_provinfo {
312	u8 oui[3];
313	u8 type;
314	u8 data[0];
315};
316
317/*
318 * Writing cmd register causes STAT_BUSY to get set in status register.
319 * When cmd completes, STAT_BUSY will be cleared.
320 *
321 * If cmd completed successfully STAT_ERROR will be clear
322 * and args registers contain cmd-specific results.
323 *
324 * If cmd error, STAT_ERROR will be set and args[0] contains error code.
325 *
326 * status register is read-only.  While STAT_BUSY is set,
327 * all other register contents are read-only.
328 */
329
330/* Make sizeof(vnic_devcmd) a power-of-2 for I/O BAR. */
331#define VNIC_DEVCMD_NARGS 15
332struct vnic_devcmd {
333	u32 status;			/* RO */
334	u32 cmd;			/* RW */
335	u64 args[VNIC_DEVCMD_NARGS];	/* RW cmd args (little-endian) */
336};
337
338#endif /* _VNIC_DEVCMD_H_ */
339