Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/ncsw/inc/flib/fsl_fman_dtsec.h
48375 views
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
1098