1 /*
2  * Copyright 2008-2012 Freescale Semiconductor Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of Freescale Semiconductor nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  *
16  * ALTERNATIVELY, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") as published by the Free Software
18  * Foundation, either version 2 of that License or (at your option) any
19  * later version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef __FSL_FMAN_DTSEC_H
34 #define __FSL_FMAN_DTSEC_H
35 
36 #include "common/general.h"
37 #include "fsl_enet.h"
38 
39 /**
40  * DOC: dTSEC Init sequence
41  *
42  * To prepare dTSEC block for transfer use the following call sequence:
43  *
44  * - fman_dtsec_defconfig() - This step is optional and yet recommended. Its
45  * use is to obtain the default dTSEC configuration parameters.
46  *
47  * - Change dtsec configuration in &dtsec_cfg. This structure will be used
48  * to customize the dTSEC behavior.
49  *
50  * - fman_dtsec_init() - Applies the configuration on dTSEC hardware.  Note that
51  * dTSEC is initialized while both Tx and Rx are disabled.
52  *
53  * - fman_dtsec_set_mac_address() - Set the station address (mac address).
54  * This is used by dTSEC to match against received packets.
55  *
56  * - fman_dtsec_adjust_link() - Set the link speed and duplex parameters
57  * after the PHY establishes the link.
58  *
59  * - dtsec_enable_tx() and dtsec_enable_rx() to enable transmission and
60  * reception.
61  */
62 
63 /**
64  * DOC: dTSEC Graceful stop
65  *
66  * To temporary stop dTSEC activity use fman_dtsec_stop_tx() and
67  * fman_dtsec_stop_rx(). Note that these functions request dTSEC graceful stop
68  * but return before this stop is complete.  To query for graceful stop
69  * completion use fman_dtsec_get_event() and check DTSEC_IEVENT_GTSC and
70  * DTSEC_IEVENT_GRSC bits. Alternatively the dTSEC interrupt mask can be set to
71  * enable graceful stop interrupts.
72  *
73  * To resume operation after graceful stop use fman_dtsec_start_tx() and
74  * fman_dtsec_start_rx().
75  */
76 
77 /**
78  * DOC: dTSEC interrupt handling
79  *
80  * This code does not provide an interrupt handler for dTSEC.  Instead this
81  * handler should be implemented and registered to the operating system by the
82  * caller.  Some primitives for accessing the event status and mask registers
83  * are provided.
84  *
85  * See "dTSEC Events" section for a list of events that dTSEC can generate.
86  */
87 
88 /**
89  * DOC: dTSEC Events
90  *
91  * Interrupt events cause dTSEC event bits to be set.  Software may poll the
92  * event register at any time to check for pending interrupts.  If an event
93  * occurs and its corresponding enable bit is set in the interrupt mask
94  * register, the event also causes a hardware interrupt at the PIC.
95  *
96  * To poll for event status use the fman_dtsec_get_event() function.
97  * To configure the interrupt mask use fman_dtsec_enable_interrupt() and
98  * fman_dtsec_disable_interrupt() functions.
99  * After servicing a dTSEC interrupt use fman_dtsec_ack_event to reset the
100  * serviced event bit.
101  *
102  * The following events may be signaled by dTSEC hardware:
103  *
104  * %DTSEC_IEVENT_BABR - Babbling receive error.  This bit indicates that
105  * a frame was received with length in excess of the MAC's maximum frame length
106  * register.
107  *
108  * %DTSEC_IEVENT_RXC - Receive control (pause frame) interrupt.  A pause
109  * control frame was received while Rx pause frame handling is enabled.
110  * Also see fman_dtsec_handle_rx_pause().
111  *
112  * %DTSEC_IEVENT_MSRO - MIB counter overflow.  The count for one of the MIB
113  * counters has exceeded the size of its register.
114  *
115  * %DTSEC_IEVENT_GTSC - Graceful transmit stop complete.  Graceful stop is now
116  * complete. The transmitter is in a stopped state, in which only pause frames
117  * can be transmitted.
118  * Also see fman_dtsec_stop_tx().
119  *
120  * %DTSEC_IEVENT_BABT - Babbling transmit error.  The transmitted frame length
121  * has exceeded the value in the MAC's Maximum Frame Length register.
122  *
123  * %DTSEC_IEVENT_TXC - Transmit control (pause frame) interrupt.  his bit
124  * indicates that a control frame was transmitted.
125  *
126  * %DTSEC_IEVENT_TXE - Transmit error.  This bit indicates that an error
127  * occurred on the transmitted channel.  This bit is set whenever any transmit
128  * error occurs which causes the dTSEC to discard all or part of a frame
129  * (LC, CRL, XFUN).
130  *
131  * %DTSEC_IEVENT_LC - Late collision.  This bit indicates that a collision
132  * occurred beyond the collision window (slot time) in half-duplex mode.
133  * The frame is truncated with a bad CRC and the remainder of the frame
134  * is discarded.
135  *
136  * %DTSEC_IEVENT_CRL - Collision retry limit.  is bit indicates that the number
137  * of successive transmission collisions has exceeded the MAC's half-duplex
138  * register's retransmission maximum count.  The frame is discarded without
139  * being transmitted and transmission of the next frame commences.  This only
140  * occurs while in half-duplex mode.
141  * The number of retransmit attempts can be set in
142  * &dtsec_halfdup_cfg.@retransmit before calling fman_dtsec_init().
143  *
144  * %DTSEC_IEVENT_XFUN - Transmit FIFO underrun.  This bit indicates that the
145  * transmit FIFO became empty before the complete frame was transmitted.
146  * The frame is truncated with a bad CRC and the remainder of the frame is
147  * discarded.
148  *
149  * %DTSEC_IEVENT_MAG - TBD
150  *
151  * %DTSEC_IEVENT_MMRD - MII management read completion.
152  *
153  * %DTSEC_IEVENT_MMWR - MII management write completion.
154  *
155  * %DTSEC_IEVENT_GRSC - Graceful receive stop complete.  It allows the user to
156  * know if the system has completed the stop and it is safe to write to receive
157  * registers (status, control or configuration registers) that are used by the
158  * system during normal operation.
159  *
160  * %DTSEC_IEVENT_TDPE - Internal data error on transmit.  This bit indicates
161  * that the dTSEC has detected a parity error on its stored transmit data, which
162  * is likely to compromise the validity of recently transferred frames.
163  *
164  * %DTSEC_IEVENT_RDPE - Internal data error on receive.  This bit indicates that
165  * the dTSEC has detected a parity error on its stored receive data, which is
166  * likely to compromise the validity of recently transferred frames.
167  */
168 /* Interrupt Mask Register (IMASK) */
169 #define DTSEC_IMASK_BREN	0x80000000
170 #define DTSEC_IMASK_RXCEN	0x40000000
171 #define DTSEC_IMASK_MSROEN	0x04000000
172 #define DTSEC_IMASK_GTSCEN	0x02000000
173 #define DTSEC_IMASK_BTEN	0x01000000
174 #define DTSEC_IMASK_TXCEN	0x00800000
175 #define DTSEC_IMASK_TXEEN	0x00400000
176 #define DTSEC_IMASK_LCEN	0x00040000
177 #define DTSEC_IMASK_CRLEN	0x00020000
178 #define DTSEC_IMASK_XFUNEN	0x00010000
179 #define DTSEC_IMASK_ABRTEN	0x00008000
180 #define DTSEC_IMASK_IFERREN	0x00004000
181 #define DTSEC_IMASK_MAGEN	0x00000800
182 #define DTSEC_IMASK_MMRDEN	0x00000400
183 #define DTSEC_IMASK_MMWREN	0x00000200
184 #define DTSEC_IMASK_GRSCEN	0x00000100
185 #define DTSEC_IMASK_TDPEEN	0x00000002
186 #define DTSEC_IMASK_RDPEEN	0x00000001
187 
188 #define DTSEC_EVENTS_MASK					\
189 	((uint32_t)(DTSEC_IMASK_BREN    | \
190 				DTSEC_IMASK_RXCEN   | \
191 				DTSEC_IMASK_BTEN    | \
192 				DTSEC_IMASK_TXCEN   | \
193 				DTSEC_IMASK_TXEEN   | \
194 				DTSEC_IMASK_ABRTEN  | \
195 				DTSEC_IMASK_LCEN    | \
196 				DTSEC_IMASK_CRLEN   | \
197 				DTSEC_IMASK_XFUNEN  | \
198 				DTSEC_IMASK_IFERREN | \
199 				DTSEC_IMASK_MAGEN   | \
200 				DTSEC_IMASK_TDPEEN  | \
201 				DTSEC_IMASK_RDPEEN))
202 
203 /* dtsec timestamp event bits */
204 #define TMR_PEMASK_TSREEN	0x00010000
205 #define TMR_PEVENT_TSRE		0x00010000
206 
207 /* Group address bit indication */
208 #define MAC_GROUP_ADDRESS	0x0000010000000000ULL
209 /* size in bytes of L2 address */
210 #define MAC_ADDRLEN		6
211 
212 #define DEFAULT_HALFDUP_ON		FALSE
213 #define DEFAULT_HALFDUP_RETRANSMIT	0xf
214 #define DEFAULT_HALFDUP_COLL_WINDOW	0x37
215 #define DEFAULT_HALFDUP_EXCESS_DEFER	TRUE
216 #define DEFAULT_HALFDUP_NO_BACKOFF	FALSE
217 #define DEFAULT_HALFDUP_BP_NO_BACKOFF	FALSE
218 #define DEFAULT_HALFDUP_ALT_BACKOFF_VAL	0x0A
219 #define DEFAULT_HALFDUP_ALT_BACKOFF_EN	FALSE
220 #define DEFAULT_RX_DROP_BCAST		FALSE
221 #define DEFAULT_RX_SHORT_FRM		TRUE
222 #define DEFAULT_RX_LEN_CHECK		FALSE
223 #define DEFAULT_TX_PAD_CRC		TRUE
224 #define DEFAULT_TX_CRC			FALSE
225 #define DEFAULT_RX_CTRL_ACC		FALSE
226 #define DEFAULT_TX_PAUSE_TIME		0xf000
227 #define DEFAULT_TBIPA			5
228 #define DEFAULT_RX_PREPEND		0
229 #define DEFAULT_PTP_TSU_EN		TRUE
230 #define DEFAULT_PTP_EXCEPTION_EN	TRUE
231 #define DEFAULT_PREAMBLE_LEN		7
232 #define DEFAULT_RX_PREAMBLE		FALSE
233 #define DEFAULT_TX_PREAMBLE		FALSE
234 #define DEFAULT_LOOPBACK		FALSE
235 #define DEFAULT_RX_TIME_STAMP_EN	FALSE
236 #define DEFAULT_TX_TIME_STAMP_EN	FALSE
237 #define DEFAULT_RX_FLOW			TRUE
238 #define DEFAULT_TX_FLOW			TRUE
239 #define DEFAULT_RX_GROUP_HASH_EXD	FALSE
240 #define DEFAULT_TX_PAUSE_TIME_EXTD	0
241 #define DEFAULT_RX_PROMISC		FALSE
242 #define DEFAULT_NON_BACK_TO_BACK_IPG1	0x40
243 #define DEFAULT_NON_BACK_TO_BACK_IPG2	0x60
244 #define DEFAULT_MIN_IFG_ENFORCEMENT	0x50
245 #define DEFAULT_BACK_TO_BACK_IPG	0x60
246 #define DEFAULT_MAXIMUM_FRAME		0x600
247 #define DEFAULT_TBI_PHY_ADDR		5
248 #define DEFAULT_WAKE_ON_LAN			FALSE
249 
250 /* register related defines (bits, field offsets..) */
251 #define DTSEC_ID1_ID			0xffff0000
252 #define DTSEC_ID1_REV_MJ		0x0000FF00
253 #define DTSEC_ID1_REV_MN		0x000000ff
254 
255 #define DTSEC_ID2_INT_REDUCED_OFF	0x00010000
256 #define DTSEC_ID2_INT_NORMAL_OFF	0x00020000
257 
258 #define DTSEC_ECNTRL_CLRCNT		0x00004000
259 #define DTSEC_ECNTRL_AUTOZ		0x00002000
260 #define DTSEC_ECNTRL_STEN		0x00001000
261 #define DTSEC_ECNTRL_CFG_RO		0x80000000
262 #define DTSEC_ECNTRL_GMIIM		0x00000040
263 #define DTSEC_ECNTRL_TBIM		0x00000020
264 #define DTSEC_ECNTRL_SGMIIM		0x00000002
265 #define DTSEC_ECNTRL_RPM		0x00000010
266 #define DTSEC_ECNTRL_R100M		0x00000008
267 #define DTSEC_ECNTRL_RMM		0x00000004
268 #define DTSEC_ECNTRL_QSGMIIM		0x00000001
269 
270 #define DTSEC_TCTRL_THDF		0x00000800
271 #define DTSEC_TCTRL_TTSE		0x00000040
272 #define DTSEC_TCTRL_GTS			0x00000020
273 #define DTSEC_TCTRL_TFC_PAUSE		0x00000010
274 
275 /* PTV offsets */
276 #define PTV_PTE_OFST		16
277 
278 #define RCTRL_CFA		0x00008000
279 #define RCTRL_GHTX		0x00000400
280 #define RCTRL_RTSE		0x00000040
281 #define RCTRL_GRS		0x00000020
282 #define RCTRL_BC_REJ		0x00000010
283 #define RCTRL_MPROM		0x00000008
284 #define RCTRL_RSF		0x00000004
285 #define RCTRL_UPROM		0x00000001
286 #define RCTRL_PROM		(RCTRL_UPROM | RCTRL_MPROM)
287 
288 #define TMR_CTL_ESFDP		0x00000800
289 #define TMR_CTL_ESFDE		0x00000400
290 
291 #define MACCFG1_SOFT_RESET	0x80000000
292 #define MACCFG1_LOOPBACK	0x00000100
293 #define MACCFG1_RX_FLOW		0x00000020
294 #define MACCFG1_TX_FLOW		0x00000010
295 #define MACCFG1_TX_EN		0x00000001
296 #define MACCFG1_RX_EN		0x00000004
297 #define MACCFG1_RESET_RxMC	0x00080000
298 #define MACCFG1_RESET_TxMC	0x00040000
299 #define MACCFG1_RESET_RxFUN	0x00020000
300 #define MACCFG1_RESET_TxFUN	0x00010000
301 
302 #define MACCFG2_NIBBLE_MODE	0x00000100
303 #define MACCFG2_BYTE_MODE	0x00000200
304 #define MACCFG2_PRE_AM_Rx_EN	0x00000080
305 #define MACCFG2_PRE_AM_Tx_EN	0x00000040
306 #define MACCFG2_LENGTH_CHECK	0x00000010
307 #define MACCFG2_MAGIC_PACKET_EN	0x00000008
308 #define MACCFG2_PAD_CRC_EN	0x00000004
309 #define MACCFG2_CRC_EN		0x00000002
310 #define MACCFG2_FULL_DUPLEX	0x00000001
311 
312 #define PREAMBLE_LENGTH_SHIFT	12
313 
314 #define IPGIFG_NON_BACK_TO_BACK_IPG_1_SHIFT	24
315 #define IPGIFG_NON_BACK_TO_BACK_IPG_2_SHIFT	16
316 #define IPGIFG_MIN_IFG_ENFORCEMENT_SHIFT	8
317 
318 #define IPGIFG_NON_BACK_TO_BACK_IPG_1	0x7F000000
319 #define IPGIFG_NON_BACK_TO_BACK_IPG_2	0x007F0000
320 #define IPGIFG_MIN_IFG_ENFORCEMENT	0x0000FF00
321 #define IPGIFG_BACK_TO_BACK_IPG		0x0000007F
322 
323 #define HAFDUP_ALT_BEB			0x00080000
324 #define HAFDUP_BP_NO_BACKOFF		0x00040000
325 #define HAFDUP_NO_BACKOFF		0x00020000
326 #define HAFDUP_EXCESS_DEFER		0x00010000
327 #define HAFDUP_COLLISION_WINDOW		0x000003ff
328 
329 #define HAFDUP_ALTERNATE_BEB_TRUNCATION_SHIFT	20
330 #define HAFDUP_RETRANSMISSION_MAX_SHIFT		12
331 #define HAFDUP_RETRANSMISSION_MAX		0x0000f000
332 
333 #define NUM_OF_HASH_REGS	8 /* Number of hash table registers */
334 
335 /* CAR1/2 bits */
336 #define DTSEC_CAR1_TR64		0x80000000
337 #define DTSEC_CAR1_TR127	0x40000000
338 #define DTSEC_CAR1_TR255	0x20000000
339 #define DTSEC_CAR1_TR511	0x10000000
340 #define DTSEC_CAR1_TRK1		0x08000000
341 #define DTSEC_CAR1_TRMAX	0x04000000
342 #define DTSEC_CAR1_TRMGV	0x02000000
343 
344 #define DTSEC_CAR1_RBYT		0x00010000
345 #define DTSEC_CAR1_RPKT		0x00008000
346 #define DTSEC_CAR1_RFCS		0x00004000
347 #define DTSEC_CAR1_RMCA		0x00002000
348 #define DTSEC_CAR1_RBCA		0x00001000
349 #define DTSEC_CAR1_RXCF		0x00000800
350 #define DTSEC_CAR1_RXPF		0x00000400
351 #define DTSEC_CAR1_RXUO		0x00000200
352 #define DTSEC_CAR1_RALN		0x00000100
353 #define DTSEC_CAR1_RFLR		0x00000080
354 #define DTSEC_CAR1_RCDE		0x00000040
355 #define DTSEC_CAR1_RCSE		0x00000020
356 #define DTSEC_CAR1_RUND		0x00000010
357 #define DTSEC_CAR1_ROVR		0x00000008
358 #define DTSEC_CAR1_RFRG		0x00000004
359 #define DTSEC_CAR1_RJBR		0x00000002
360 #define DTSEC_CAR1_RDRP		0x00000001
361 
362 #define DTSEC_CAR2_TJBR		0x00080000
363 #define DTSEC_CAR2_TFCS		0x00040000
364 #define DTSEC_CAR2_TXCF		0x00020000
365 #define DTSEC_CAR2_TOVR		0x00010000
366 #define DTSEC_CAR2_TUND		0x00008000
367 #define DTSEC_CAR2_TFRG		0x00004000
368 #define DTSEC_CAR2_TBYT		0x00002000
369 #define DTSEC_CAR2_TPKT		0x00001000
370 #define DTSEC_CAR2_TMCA		0x00000800
371 #define DTSEC_CAR2_TBCA		0x00000400
372 #define DTSEC_CAR2_TXPF		0x00000200
373 #define DTSEC_CAR2_TDFR		0x00000100
374 #define DTSEC_CAR2_TEDF		0x00000080
375 #define DTSEC_CAR2_TSCL		0x00000040
376 #define DTSEC_CAR2_TMCL		0x00000020
377 #define DTSEC_CAR2_TLCL		0x00000010
378 #define DTSEC_CAR2_TXCL		0x00000008
379 #define DTSEC_CAR2_TNCL		0x00000004
380 #define DTSEC_CAR2_TDRP		0x00000001
381 
382 #define CAM1_ERRORS_ONLY \
383 	(DTSEC_CAR1_RXPF | DTSEC_CAR1_RALN | DTSEC_CAR1_RFLR \
384 	| DTSEC_CAR1_RCDE | DTSEC_CAR1_RCSE | DTSEC_CAR1_RUND \
385 	| DTSEC_CAR1_ROVR | DTSEC_CAR1_RFRG | DTSEC_CAR1_RJBR \
386 	| DTSEC_CAR1_RDRP)
387 
388 #define CAM2_ERRORS_ONLY (DTSEC_CAR2_TFCS | DTSEC_CAR2_TXPF | DTSEC_CAR2_TDRP)
389 
390 /*
391  * Group of dTSEC specific counters relating to the standard RMON MIB Group 1
392  * (or Ethernet) statistics.
393  */
394 #define CAM1_MIB_GRP_1 \
395 	(DTSEC_CAR1_RDRP | DTSEC_CAR1_RBYT | DTSEC_CAR1_RPKT | DTSEC_CAR1_RMCA\
396 	| DTSEC_CAR1_RBCA | DTSEC_CAR1_RALN | DTSEC_CAR1_RUND | DTSEC_CAR1_ROVR\
397 	| DTSEC_CAR1_RFRG | DTSEC_CAR1_RJBR \
398 	| DTSEC_CAR1_TR64 | DTSEC_CAR1_TR127 | DTSEC_CAR1_TR255 \
399 	| DTSEC_CAR1_TR511 | DTSEC_CAR1_TRMAX)
400 
401 #define CAM2_MIB_GRP_1 (DTSEC_CAR2_TNCL | DTSEC_CAR2_TDRP)
402 
403 /* memory map */
404 
405 struct dtsec_regs {
406 	/* dTSEC General Control and Status Registers */
407 	uint32_t tsec_id;	/* 0x000 ETSEC_ID register */
408 	uint32_t tsec_id2;	/* 0x004 ETSEC_ID2 register */
409 	uint32_t ievent;	/* 0x008 Interrupt event register */
410 	uint32_t imask;		/* 0x00C Interrupt mask register */
411 	uint32_t reserved0010[1];
412 	uint32_t ecntrl;	/* 0x014 E control register */
413 	uint32_t ptv;		/* 0x018 Pause time value register */
414 	uint32_t tbipa;		/* 0x01C TBI PHY address register */
415 	uint32_t tmr_ctrl;	/* 0x020 Time-stamp Control register */
416 	uint32_t tmr_pevent;	/* 0x024 Time-stamp event register */
417 	uint32_t tmr_pemask;	/* 0x028 Timer event mask register */
418 	uint32_t reserved002c[5];
419 	uint32_t tctrl;		/* 0x040 Transmit control register */
420 	uint32_t reserved0044[3];
421 	uint32_t rctrl;		/* 0x050 Receive control register */
422 	uint32_t reserved0054[11];
423 	uint32_t igaddr[8]; 	/* 0x080-0x09C Individual/group address */
424 	uint32_t gaddr[8];	/* 0x0A0-0x0BC Group address registers 0-7 */
425 	uint32_t reserved00c0[16];
426 	uint32_t maccfg1;		/* 0x100 MAC configuration #1 */
427 	uint32_t maccfg2;		/* 0x104 MAC configuration #2 */
428 	uint32_t ipgifg;		/* 0x108 IPG/IFG */
429 	uint32_t hafdup;		/* 0x10C Half-duplex */
430 	uint32_t maxfrm;		/* 0x110 Maximum frame */
431 	uint32_t reserved0114[10];
432 	uint32_t ifstat;		/* 0x13C Interface status */
433 	uint32_t macstnaddr1;		/* 0x140 Station Address,part 1 */
434 	uint32_t macstnaddr2;		/* 0x144 Station Address,part 2  */
435 	struct {
436 	    uint32_t exact_match1; /* octets 1-4 */
437 	    uint32_t exact_match2; /* octets 5-6 */
438 	} macaddr[15];	/* 0x148-0x1BC mac exact match addresses 1-15 */
439 	uint32_t reserved01c0[16];
440 	uint32_t tr64;	/* 0x200 transmit and receive 64 byte frame counter */
441 	uint32_t tr127;	/* 0x204 transmit and receive 65 to 127 byte frame
442 			 * counter */
443 	uint32_t tr255;	/* 0x208 transmit and receive 128 to 255 byte frame
444 			 * counter */
445 	uint32_t tr511;	/* 0x20C transmit and receive 256 to 511 byte frame
446 			 * counter */
447 	uint32_t tr1k;	/* 0x210 transmit and receive 512 to 1023 byte frame
448 			 * counter */
449 	uint32_t trmax;	/* 0x214 transmit and receive 1024 to 1518 byte frame
450 			 * counter */
451 	uint32_t trmgv;	/* 0x218 transmit and receive 1519 to 1522 byte good
452 			 * VLAN frame count */
453 	uint32_t rbyt;	/* 0x21C receive byte counter */
454 	uint32_t rpkt;	/* 0x220 receive packet counter */
455 	uint32_t rfcs;	/* 0x224 receive FCS error counter */
456 	uint32_t rmca;	/* 0x228 RMCA receive multicast packet counter */
457 	uint32_t rbca;	/* 0x22C receive broadcast packet counter */
458 	uint32_t rxcf;	/* 0x230 receive control frame packet counter */
459 	uint32_t rxpf;	/* 0x234 receive pause frame packet counter */
460 	uint32_t rxuo;	/* 0x238 receive unknown OP code counter */
461 	uint32_t raln;	/* 0x23C receive alignment error counter */
462 	uint32_t rflr;	/* 0x240 receive frame length error counter */
463 	uint32_t rcde;	/* 0x244 receive code error counter */
464 	uint32_t rcse;	/* 0x248 receive carrier sense error counter */
465 	uint32_t rund;	/* 0x24C receive undersize packet counter */
466 	uint32_t rovr;	/* 0x250 receive oversize packet counter */
467 	uint32_t rfrg;	/* 0x254 receive fragments counter */
468 	uint32_t rjbr;	/* 0x258 receive jabber counter */
469 	uint32_t rdrp;	/* 0x25C receive drop */
470 	uint32_t tbyt;	/* 0x260 transmit byte counter */
471 	uint32_t tpkt;	/* 0x264 transmit packet counter */
472 	uint32_t tmca;	/* 0x268 transmit multicast packet counter */
473 	uint32_t tbca;	/* 0x26C transmit broadcast packet counter */
474 	uint32_t txpf;	/* 0x270 transmit pause control frame counter */
475 	uint32_t tdfr;	/* 0x274 transmit deferral packet counter */
476 	uint32_t tedf;	/* 0x278 transmit excessive deferral packet counter */
477 	uint32_t tscl;	/* 0x27C transmit single collision packet counter */
478 	uint32_t tmcl;	/* 0x280 transmit multiple collision packet counter */
479 	uint32_t tlcl;	/* 0x284 transmit late collision packet counter */
480 	uint32_t txcl;	/* 0x288 transmit excessive collision packet counter */
481 	uint32_t tncl;	/* 0x28C transmit total collision counter */
482 	uint32_t reserved0290[1];
483 	uint32_t tdrp;	/* 0x294 transmit drop frame counter */
484 	uint32_t tjbr;	/* 0x298 transmit jabber frame counter */
485 	uint32_t tfcs;	/* 0x29C transmit FCS error counter */
486 	uint32_t txcf;	/* 0x2A0 transmit control frame counter */
487 	uint32_t tovr;	/* 0x2A4 transmit oversize frame counter */
488 	uint32_t tund;	/* 0x2A8 transmit undersize frame counter */
489 	uint32_t tfrg;	/* 0x2AC transmit fragments frame counter */
490 	uint32_t car1;	/* 0x2B0 carry register one register* */
491 	uint32_t car2;	/* 0x2B4 carry register two register* */
492 	uint32_t cam1;	/* 0x2B8 carry register one mask register */
493 	uint32_t cam2;	/* 0x2BC carry register two mask register */
494 	uint32_t reserved02c0[848];
495 };
496 
497 /**
498  * struct dtsec_mib_grp_1_counters - MIB counter overflows
499  *
500  * @tr64:	Transmit and Receive 64 byte frame count.  Increment for each
501  *		good or bad frame, of any type, transmitted or received, which
502  *		is 64 bytes in length.
503  * @tr127:	Transmit and Receive 65 to 127 byte frame count.  Increments for
504  *		each good or bad frame of any type, transmitted or received,
505  *		which is 65-127 bytes in length.
506  * @tr255:	Transmit and Receive 128 to 255 byte frame count.  Increments
507  *		for each good or bad frame, of any type, transmitted or
508  *		received, which is 128-255 bytes in length.
509  * @tr511:	Transmit and Receive 256 to 511 byte frame count.  Increments
510  *		for each good or bad frame, of any type, transmitted or
511  *		received, which is 256-511 bytes in length.
512  * @tr1k:	Transmit and Receive 512 to 1023 byte frame count.  Increments
513  *		for each good or bad frame, of any type, transmitted or
514  *		received, which is 512-1023 bytes in length.
515  * @trmax:	Transmit and Receive 1024 to 1518 byte frame count.  Increments
516  *		for each good or bad frame, of any type, transmitted or
517  *		received, which is 1024-1518 bytes in length.
518  * @rfrg:	Receive fragments count.  Increments for each received frame
519  *		which is less than 64 bytes in length and contains an invalid
520  *		FCS.  This includes integral and non-integral lengths.
521  * @rjbr:	Receive jabber count.  Increments for received frames which
522  *		exceed 1518 (non VLAN) or 1522 (VLAN) bytes and contain an
523  *		invalid FCS.  This includes alignment errors.
524  * @rdrp:	Receive dropped packets count.  Increments for received frames
525  *		which are streamed to system but are later dropped due to lack
526  *		of system resources.  Does not increment for frames rejected due
527  *		to address filtering.
528  * @raln:	Receive alignment error count.  Increments for each received
529  *		frame from 64 to 1518 (non VLAN) or 1522 (VLAN) which contains
530  *		an invalid FCS and is not an integral number of bytes.
531  * @rund:	Receive undersize packet count.  Increments each time a frame is
532  *		received which is less than 64 bytes in length and contains a
533  *		valid FCS and is otherwise well formed.  This count does not
534  *		include range length errors.
535  * @rovr:	Receive oversize packet count.  Increments each time a frame is
536  *		received which exceeded 1518 (non VLAN) or 1522 (VLAN) and
537  *		contains a valid FCS and is otherwise well formed.
538  * @rbyt:	Receive byte count.  Increments by the byte count of frames
539  *		received, including those in bad packets, excluding preamble and
540  *		SFD but including FCS bytes.
541  * @rpkt:	Receive packet count.  Increments for each received frame
542  *		(including bad packets, all unicast, broadcast, and multicast
543  *		packets).
544  * @rmca:	Receive multicast packet count.  Increments for each multicast
545  *		frame with valid CRC and of lengths 64 to 1518 (non VLAN) or
546  *		1522 (VLAN), excluding broadcast frames. This count does not
547  *		include range/length errors.
548  * @rbca:	Receive broadcast packet count.  Increments for each broadcast
549  *		frame with valid CRC and of lengths 64 to 1518 (non VLAN) or
550  *		1522 (VLAN), excluding multicast frames. Does not include
551  *		range/length errors.
552  * @tdrp:	Transmit drop frame count.  Increments each time a memory error
553  *		or an underrun has occurred.
554  * @tncl:	Transmit total collision counter. Increments by the number of
555  *		collisions experienced during the transmission of a frame. Does
556  *		not increment for aborted frames.
557  *
558  * The structure contains a group of dTSEC HW specific counters relating to the
559  * standard RMON MIB Group 1 (or Ethernet statistics) counters.  This structure
560  * is counting only the carry events of the corresponding HW counters.
561  *
562  * tr64 to trmax notes: Frame sizes specified are considered excluding preamble
563  * and SFD but including FCS bytes.
564  */
565 struct dtsec_mib_grp_1_counters {
566 	uint64_t	rdrp;
567 	uint64_t	tdrp;
568 	uint64_t	rbyt;
569 	uint64_t	rpkt;
570 	uint64_t	rbca;
571 	uint64_t	rmca;
572 	uint64_t	raln;
573 	uint64_t	rund;
574 	uint64_t	rovr;
575 	uint64_t	rfrg;
576 	uint64_t	rjbr;
577 	uint64_t	tncl;
578 	uint64_t	tr64;
579 	uint64_t	tr127;
580 	uint64_t	tr255;
581 	uint64_t	tr511;
582 	uint64_t	tr1k;
583 	uint64_t	trmax;
584 };
585 
586 enum dtsec_stat_counters {
587 	E_DTSEC_STAT_TR64,
588 	E_DTSEC_STAT_TR127,
589 	E_DTSEC_STAT_TR255,
590 	E_DTSEC_STAT_TR511,
591 	E_DTSEC_STAT_TR1K,
592 	E_DTSEC_STAT_TRMAX,
593 	E_DTSEC_STAT_TRMGV,
594 	E_DTSEC_STAT_RBYT,
595 	E_DTSEC_STAT_RPKT,
596 	E_DTSEC_STAT_RMCA,
597 	E_DTSEC_STAT_RBCA,
598 	E_DTSEC_STAT_RXPF,
599 	E_DTSEC_STAT_RALN,
600 	E_DTSEC_STAT_RFLR,
601 	E_DTSEC_STAT_RCDE,
602 	E_DTSEC_STAT_RCSE,
603 	E_DTSEC_STAT_RUND,
604 	E_DTSEC_STAT_ROVR,
605 	E_DTSEC_STAT_RFRG,
606 	E_DTSEC_STAT_RJBR,
607 	E_DTSEC_STAT_RDRP,
608 	E_DTSEC_STAT_TFCS,
609 	E_DTSEC_STAT_TBYT,
610 	E_DTSEC_STAT_TPKT,
611 	E_DTSEC_STAT_TMCA,
612 	E_DTSEC_STAT_TBCA,
613 	E_DTSEC_STAT_TXPF,
614 	E_DTSEC_STAT_TNCL,
615 	E_DTSEC_STAT_TDRP
616 };
617 
618 enum dtsec_stat_level {
619 	/* No statistics */
620 	E_MAC_STAT_NONE = 0,
621 	/* Only RMON MIB group 1 (ether stats). Optimized for performance */
622 	E_MAC_STAT_MIB_GRP1,
623 	/* Only error counters are available. Optimized for performance */
624 	E_MAC_STAT_PARTIAL,
625 	/* All counters available. Not optimized for performance */
626 	E_MAC_STAT_FULL
627 };
628 
629 
630 /**
631  * struct dtsec_cfg - dTSEC configuration
632  *
633  * @halfdup_on:		Transmit half-duplex flow control, under software
634  *			control for 10/100-Mbps half-duplex media. If set,
635  *			back pressure is applied to media by raising carrier.
636  * @halfdup_retransmit:	Number of retransmission attempts following a collision.
637  *			If this is exceeded dTSEC aborts transmission due to
638  *			excessive collisions. The standard specifies the
639  *			attempt limit to be 15.
640  * @halfdup_coll_window:The number of bytes of the frame during which
641  *			collisions may occur. The default value of 55
642  *			corresponds to the frame byte at the end of the
643  *			standard 512-bit slot time window. If collisions are
644  *			detected after this byte, the late collision event is
645  *			asserted and transmission of current frame is aborted.
646  * @rx_drop_bcast:	Discard broadcast frames.  If set, all broadcast frames
647  *			will be discarded by dTSEC.
648  * @rx_short_frm:	Accept short frames.  If set, dTSEC will accept frames
649  *			of length 14..63 bytes.
650  * @rx_len_check:	Length check for received frames.  If set, the MAC
651  *			checks the frame's length field on receive to ensure it
652  *			matches the actual data field length. This only works
653  *			for received frames with length field less than 1500.
654  *			No check is performed for larger frames.
655  * @tx_pad_crc:		Pad and append CRC.  If set, the MAC pads all
656  *			transmitted short frames and appends a CRC to every
657  *			frame regardless of padding requirement.
658  * @tx_crc:		Transmission CRC enable.  If set, the MAC appends a CRC
659  *			to all frames.  If frames presented to the MAC have a
660  *			valid length and contain a valid CRC, @tx_crc should be
661  *			reset.
662  *			This field is ignored if @tx_pad_crc is set.
663  * @rx_ctrl_acc:	Control frame accept.  If set, this overrides 802.3
664  *			standard control frame behavior, and all Ethernet frames
665  *			that have an ethertype of 0x8808 are treated as normal
666  *			Ethernet frames and passed up to the packet interface on
667  *			a DA match.  Received pause control frames are passed to
668  *			the packet interface only if Rx flow control is also
669  *			disabled.  See fman_dtsec_handle_rx_pause() function.
670  * @tx_pause_time:	Transmit pause time value.  This pause value is used as
671  *			part of the pause frame to be sent when a transmit pause
672  *			frame is initiated.  If set to 0 this disables
673  *			transmission of pause frames.
674  * @rx_preamble:	Receive preamble enable.  If set, the MAC recovers the
675  *			received Ethernet 7-byte preamble and passes it to the
676  *			packet interface at the start of each received frame.
677  *			This field should be reset for internal MAC loop-back
678  *			mode.
679  * @tx_preamble:	User defined preamble enable for transmitted frames.
680  *			If set, a user-defined preamble must passed to the MAC
681  *			and it is transmitted instead of the standard preamble.
682  * @preamble_len:	Length, in bytes, of the preamble field preceding each
683  *			Ethernet start-of-frame delimiter byte.  The default
684  *			value of 0x7 should be used in order to guarantee
685  *			reliable operation with IEEE 802.3 compliant hardware.
686  * @rx_prepend:		Packet alignment padding length.  The specified number
687  *			of bytes (1-31) of zero padding are inserted before the
688  *			start of each received frame.  For Ethernet, where
689  *			optional preamble extraction is enabled, the padding
690  *			appears before the preamble, otherwise the padding
691  *			precedes the layer 2 header.
692  *
693  * This structure contains basic dTSEC configuration and must be passed to
694  * fman_dtsec_init() function.  A default set of configuration values can be
695  * obtained by calling fman_dtsec_defconfig().
696  */
697 struct dtsec_cfg {
698 	bool		halfdup_on;
699 	bool		halfdup_alt_backoff_en;
700 	bool		halfdup_excess_defer;
701 	bool		halfdup_no_backoff;
702 	bool		halfdup_bp_no_backoff;
703 	uint8_t		halfdup_alt_backoff_val;
704 	uint16_t	halfdup_retransmit;
705 	uint16_t	halfdup_coll_window;
706 	bool		rx_drop_bcast;
707 	bool		rx_short_frm;
708 	bool		rx_len_check;
709 	bool		tx_pad_crc;
710 	bool		tx_crc;
711 	bool		rx_ctrl_acc;
712 	unsigned short	tx_pause_time;
713 	unsigned short	tbipa;
714 	bool		ptp_tsu_en;
715 	bool		ptp_exception_en;
716 	bool		rx_preamble;
717 	bool		tx_preamble;
718 	unsigned char	preamble_len;
719 	unsigned char	rx_prepend;
720 	bool		loopback;
721 	bool		rx_time_stamp_en;
722 	bool		tx_time_stamp_en;
723 	bool		rx_flow;
724 	bool		tx_flow;
725 	bool		rx_group_hash_exd;
726 	bool		rx_promisc;
727 	uint8_t		tbi_phy_addr;
728 	uint16_t	tx_pause_time_extd;
729 	uint16_t	maximum_frame;
730 	uint32_t	non_back_to_back_ipg1;
731 	uint32_t	non_back_to_back_ipg2;
732 	uint32_t	min_ifg_enforcement;
733 	uint32_t	back_to_back_ipg;
734 	bool		wake_on_lan;
735 };
736 
737 
738 /**
739  * fman_dtsec_defconfig() - Get default dTSEC configuration
740  * @cfg:	pointer to configuration structure.
741  *
742  * Call this function to obtain a default set of configuration values for
743  * initializing dTSEC.  The user can overwrite any of the values before calling
744  * fman_dtsec_init(), if specific configuration needs to be applied.
745  */
746 void fman_dtsec_defconfig(struct dtsec_cfg *cfg);
747 
748 /**
749  * fman_dtsec_init() - Init dTSEC hardware block
750  * @regs:		Pointer to dTSEC register block
751  * @cfg:		dTSEC configuration data
752  * @iface_mode:		dTSEC interface mode, the type of MAC - PHY interface.
753  * @iface_speed:	1G or 10G
754  * @macaddr:		MAC station address to be assigned to the device
755  * @fm_rev_maj:		major rev number
756  * @fm_rev_min:		minor rev number
757  * @exceptions_mask:	initial exceptions mask
758  *
759  * This function initializes dTSEC and applies basic configuration.
760  *
761  * dTSEC initialization sequence:
762  * Before enabling Rx/Tx call dtsec_set_address() to set MAC address,
763  * fman_dtsec_adjust_link() to configure interface speed and duplex and finally
764  * dtsec_enable_tx()/dtsec_enable_rx() to start transmission and reception.
765  *
766  * Returns: 0 if successful, an error code otherwise.
767  */
768 int fman_dtsec_init(struct dtsec_regs *regs, struct dtsec_cfg *cfg,
769 	enum enet_interface iface_mode,
770 	enum enet_speed iface_speed,
771 	uint8_t *macaddr, uint8_t fm_rev_maj,
772 	uint8_t fm_rev_min,
773 	uint32_t exception_mask);
774 
775 /**
776  * fman_dtsec_enable() - Enable dTSEC Tx and Tx
777  * @regs:	Pointer to dTSEC register block
778  * @apply_rx:	enable rx side
779  * @apply_tx:	enable tx side
780  *
781  * This function resets Tx and Rx graceful stop bit and enables dTSEC Tx and Rx.
782  */
783 void fman_dtsec_enable(struct dtsec_regs *regs, bool apply_rx, bool apply_tx);
784 
785 /**
786  * fman_dtsec_disable() - Disable dTSEC Tx and Rx
787  * @regs:	Pointer to dTSEC register block
788  * @apply_rx:	disable rx side
789  * @apply_tx:	disable tx side
790  *
791  * This function disables Tx and Rx in dTSEC.
792  */
793 void fman_dtsec_disable(struct dtsec_regs *regs, bool apply_rx, bool apply_tx);
794 
795 /**
796  * fman_dtsec_get_revision() - Get dTSEC hardware revision
797  * @regs:   Pointer to dTSEC register block
798  *
799  * Returns dtsec_id content
800  *
801  * Call this function to obtain the dTSEC hardware version.
802  */
803 uint32_t fman_dtsec_get_revision(struct dtsec_regs *regs);
804 
805 /**
806  * fman_dtsec_set_mac_address() - Set MAC station address
807  * @regs:   Pointer to dTSEC register block
808  * @macaddr:    MAC address array
809  *
810  * This function sets MAC station address.  To enable unicast reception call
811  * this after fman_dtsec_init().  While promiscuous mode is disabled dTSEC will
812  * match the destination address of received unicast frames against this
813  * address.
814  */
815 void fman_dtsec_set_mac_address(struct dtsec_regs *regs, uint8_t *macaddr);
816 
817 /**
818  * fman_dtsec_get_mac_address() - Query MAC station address
819  * @regs:   Pointer to dTSEC register block
820  * @macaddr:    MAC address array
821  */
822 void fman_dtsec_get_mac_address(struct dtsec_regs *regs, uint8_t *macaddr);
823 
824 /**
825  * fman_dtsec_set_uc_promisc() - Sets unicast promiscuous mode
826  * @regs:	Pointer to dTSEC register block
827  * @enable:	Enable unicast promiscuous mode
828  *
829  * Use this function to enable/disable dTSEC L2 address filtering.  If the
830  * address filtering is disabled all unicast packets are accepted.
831  * To set dTSEC in promiscuous mode call both fman_dtsec_set_uc_promisc() and
832  * fman_dtsec_set_mc_promisc() to disable filtering for both unicast and
833  * multicast addresses.
834  */
835 void fman_dtsec_set_uc_promisc(struct dtsec_regs *regs, bool enable);
836 
837 /**
838  * fman_dtsec_set_wol() - Enable/Disable wake on lan
839  *                        (magic packet support)
840  * @regs:   Pointer to dTSEC register block
841  * @en:     Enable Wake On Lan support in dTSEC
842  *
843  */
844 void fman_dtsec_set_wol(struct dtsec_regs *regs, bool en);
845 
846 /**
847  * fman_dtsec_adjust_link() - Adjust dTSEC speed/duplex settings
848  * @regs:	Pointer to dTSEC register block
849  * @iface_mode: dTSEC interface mode
850  * @speed:	Link speed
851  * @full_dx:	True for full-duplex, false for half-duplex.
852  *
853  * This function configures the MAC to function and the desired rates.  Use it
854  * to configure dTSEC after fman_dtsec_init() and whenever the link speed
855  * changes (for instance following PHY auto-negociation).
856  *
857  * Returns: 0 if successful, an error code otherwise.
858  */
859 int fman_dtsec_adjust_link(struct dtsec_regs *regs,
860 	enum enet_interface iface_mode,
861 	enum enet_speed speed, bool full_dx);
862 
863 /**
864  * fman_dtsec_set_tbi_phy_addr() - Updates TBI address field
865  * @regs:	Pointer to dTSEC register block
866  * @address:	Valid PHY address in the range of 1 to 31. 0 is reserved.
867  *
868  * In SGMII mode, the dTSEC's TBIPA field must contain a valid TBI PHY address
869  * so that the associated TBI PHY (i.e. the link) may be initialized.
870  *
871  * Returns: 0 if successful, an error code otherwise.
872  */
873 int fman_dtsec_set_tbi_phy_addr(struct dtsec_regs *regs,
874 	uint8_t addr);
875 
876 /**
877  * fman_dtsec_set_max_frame_len() - Set max frame length
878  * @regs:	Pointer to dTSEC register block
879  * @length:	Max frame length.
880  *
881  * Sets maximum frame length for received and transmitted frames.  Frames that
882  * exceeds this length are truncated.
883  */
884 void fman_dtsec_set_max_frame_len(struct dtsec_regs *regs, uint16_t length);
885 
886 /**
887  * fman_dtsec_get_max_frame_len() - Query max frame length
888  * @regs:	Pointer to dTSEC register block
889  *
890  * Returns: the current value of the maximum frame length.
891  */
892 uint16_t fman_dtsec_get_max_frame_len(struct dtsec_regs *regs);
893 
894 /**
895  * fman_dtsec_handle_rx_pause() - Configure pause frame handling
896  * @regs:	Pointer to dTSEC register block
897  * @en:		Enable pause frame handling in dTSEC
898  *
899  * If enabled, dTSEC will handle pause frames internally.  This must be disabled
900  * if dTSEC is set in half-duplex mode.
901  * If pause frame handling is disabled and &dtsec_cfg.rx_ctrl_acc is set, pause
902  * frames will be transferred to the packet interface just like regular Ethernet
903  * frames.
904  */
905 void fman_dtsec_handle_rx_pause(struct dtsec_regs *regs, bool en);
906 
907 /**
908  * fman_dtsec_set_tx_pause_frames() - Configure Tx pause time
909  * @regs:	Pointer to dTSEC register block
910  * @time:	Time value included in pause frames
911  *
912  * Call this function to set the time value used in transmitted pause frames.
913  * If time is 0, transmission of pause frames is disabled
914  */
915 void fman_dtsec_set_tx_pause_frames(struct dtsec_regs *regs, uint16_t time);
916 
917 /**
918  * fman_dtsec_ack_event() - Acknowledge handled events
919  * @regs:	Pointer to dTSEC register block
920  * @ev_mask:	Events to acknowledge
921  *
922  * After handling events signaled by dTSEC in either polling or interrupt mode,
923  * call this function to reset the associated status bits in dTSEC event
924  * register.
925  */
926 void fman_dtsec_ack_event(struct dtsec_regs *regs, uint32_t ev_mask);
927 
928 /**
929  * fman_dtsec_get_event() - Returns currently asserted events
930  * @regs:	Pointer to dTSEC register block
931  * @ev_mask:	Mask of relevant events
932  *
933  * Call this function to obtain a bit-mask of events that are currently asserted
934  * in dTSEC, taken from IEVENT register.
935  *
936  * Returns: a bit-mask of events asserted in dTSEC.
937  */
938 uint32_t fman_dtsec_get_event(struct dtsec_regs *regs, uint32_t ev_mask);
939 
940 /**
941  * fman_dtsec_get_interrupt_mask() - Returns a bit-mask of enabled interrupts
942  * @regs:   Pointer to dTSEC register block
943  *
944  * Call this function to obtain a bit-mask of enabled interrupts
945  * in dTSEC, taken from IMASK register.
946  *
947  * Returns: a bit-mask of enabled interrupts in dTSEC.
948  */
949 uint32_t fman_dtsec_get_interrupt_mask(struct dtsec_regs *regs);
950 
951 void fman_dtsec_clear_addr_in_paddr(struct dtsec_regs *regs,
952 	uint8_t paddr_num);
953 
954 void fman_dtsec_add_addr_in_paddr(struct dtsec_regs *regs,
955 	uint64_t addr,
956 	uint8_t paddr_num);
957 
958 void fman_dtsec_enable_tmr_interrupt (struct dtsec_regs *regs);
959 
960 void fman_dtsec_disable_tmr_interrupt(struct dtsec_regs *regs);
961 
962 /**
963  * fman_dtsec_disable_interrupt() - Disables interrupts for the specified events
964  * @regs:	Pointer to dTSEC register block
965  * @ev_mask:	Mask of relevant events
966  *
967  * Call this function to disable interrupts in dTSEC for the specified events.
968  * To enable interrupts use fman_dtsec_enable_interrupt().
969  */
970 void fman_dtsec_disable_interrupt(struct dtsec_regs *regs, uint32_t ev_mask);
971 
972 /**
973  * fman_dtsec_enable_interrupt() - Enable interrupts for the specified events
974  * @regs:	Pointer to dTSEC register block
975  * @ev_mask:	Mask of relevant events
976  *
977  * Call this function to enable interrupts in dTSEC for the specified events.
978  * To disable interrupts use fman_dtsec_disable_interrupt().
979  */
980 void fman_dtsec_enable_interrupt(struct dtsec_regs *regs, uint32_t ev_mask);
981 
982 /**
983  * fman_dtsec_set_ts() - Enables dTSEC timestamps
984  * @regs:	Pointer to dTSEC register block
985  * @en:		true to enable timestamps, false to disable them
986  *
987  * Call this function to enable/disable dTSEC timestamps.  This affects both
988  * Tx and Rx.
989  */
990 void fman_dtsec_set_ts(struct dtsec_regs *regs, bool en);
991 
992 /**
993  * fman_dtsec_set_bucket() - Enables/disables a filter bucket
994  * @regs:   Pointer to dTSEC register block
995  * @bucket: Bucket index
996  * @enable: true/false to enable/disable this bucket
997  *
998  * This function enables or disables the specified bucket.  Enabling a bucket
999  * associated with an address configures dTSEC to accept received packets
1000  * with that destination address.
1001  * Multiple addresses may be associated with the same bucket.  Disabling a
1002  * bucket will affect all addresses associated with that bucket. A bucket that
1003  * is enabled requires further filtering and verification in the upper layers
1004  *
1005  */
1006 void fman_dtsec_set_bucket(struct dtsec_regs *regs, int bucket, bool enable);
1007 
1008 /**
1009  * dtsec_set_hash_table() - insert a crc code into thr filter table
1010  * @regs:	Pointer to dTSEC register block
1011  * @crc:	crc to insert
1012  * @mcast:	true is this is a multicast address
1013  * @ghtx:	true if we are in ghtx mode
1014  *
1015  * This function inserts a crc code into the filter table.
1016  */
1017 void fman_dtsec_set_hash_table(struct dtsec_regs *regs, uint32_t crc,
1018 	bool mcast, bool ghtx);
1019 
1020 /**
1021  * fman_dtsec_reset_filter_table() - Resets the address filtering table
1022  * @regs:	Pointer to dTSEC register block
1023  * @mcast:	Reset multicast entries
1024  * @ucast:	Reset unicast entries
1025  *
1026  * Resets all entries in L2 address filter table.  After calling this function
1027  * all buckets enabled using fman_dtsec_set_bucket() will be disabled.
1028  * If dtsec_init_filter_table() was called with @unicast_hash set to false,
1029  * @ucast argument is ignored.
1030  * This does not affect the primary nor the 15 additional addresses configured
1031  * using dtsec_set_address() or dtsec_set_match_address().
1032  */
1033 void fman_dtsec_reset_filter_table(struct dtsec_regs *regs, bool mcast,
1034 	bool ucast);
1035 
1036 /**
1037  * fman_dtsec_set_mc_promisc() - Set multicast promiscuous mode
1038  * @regs:	Pointer to dTSEC register block
1039  * @enable:	Enable multicast promiscuous mode
1040  *
1041  * Call this to enable/disable L2 address filtering for multicast packets.
1042  */
1043 void fman_dtsec_set_mc_promisc(struct dtsec_regs *regs, bool enable);
1044 
1045 /* statistics APIs */
1046 
1047 /**
1048  * fman_dtsec_set_stat_level() - Enable a group of MIB statistics counters
1049  * @regs:	Pointer to dTSEC register block
1050  * @level:	Specifies a certain group of dTSEC MIB HW counters or _all_,
1051  *		to specify all the existing counters.
1052  *		If set to _none_, it disables all the counters.
1053  *
1054  * Enables the MIB statistics hw counters and sets up the carry interrupt
1055  * masks for the counters corresponding to the @level input parameter.
1056  *
1057  * Returns: error if invalid @level value given.
1058  */
1059 int fman_dtsec_set_stat_level(struct dtsec_regs *regs,
1060 	enum dtsec_stat_level level);
1061 
1062 /**
1063  * fman_dtsec_reset_stat() - Completely resets all dTSEC HW counters
1064  * @regs:	Pointer to dTSEC register block
1065  */
1066 void fman_dtsec_reset_stat(struct dtsec_regs *regs);
1067 
1068 /**
1069  * fman_dtsec_get_clear_carry_regs() - Read and clear carry bits (CAR1-2 registers)
1070  * @regs:	Pointer to dTSEC register block
1071  * @car1:	car1 register value
1072  * @car2:	car2 register value
1073  *
1074  * When set, the carry bits signal that an overflow occurred on the
1075  * corresponding counters.
1076  * Note that the carry bits (CAR1-2 registers) will assert the
1077  * %DTSEC_IEVENT_MSRO interrupt if unmasked (via CAM1-2 regs).
1078  *
1079  * Returns: true if overflow occurred, otherwise - false
1080  */
1081 bool fman_dtsec_get_clear_carry_regs(struct dtsec_regs *regs,
1082 	uint32_t *car1, uint32_t *car2);
1083 
1084 uint32_t fman_dtsec_check_and_clear_tmr_event(struct dtsec_regs *regs);
1085 
1086 uint32_t fman_dtsec_get_stat_counter(struct dtsec_regs *regs,
1087 	enum dtsec_stat_counters reg_name);
1088 
1089 void fman_dtsec_start_tx(struct dtsec_regs *regs);
1090 void fman_dtsec_start_rx(struct dtsec_regs *regs);
1091 void fman_dtsec_stop_tx(struct dtsec_regs *regs);
1092 void fman_dtsec_stop_rx(struct dtsec_regs *regs);
1093 uint32_t fman_dtsec_get_rctrl(struct dtsec_regs *regs);
1094 
1095 
1096 #endif /* __FSL_FMAN_DTSEC_H */
1097