The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/ncsw/inc/flib/fsl_fman_dtsec.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 */

Cache object: 93b1fdae5ba5808acc8406b2ad8bee51


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.