Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

/*
 * Copyright 2008-2013 Freescale Semiconductor Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of Freescale Semiconductor nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 *
 * ALTERNATIVELY, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") as published by the Free Software
 * Foundation, either version 2 of that License or (at your option) any
 * later version.
 *
 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/******************************************************************************
 @File          dtsec.h

 @Description   FM dTSEC ...
*//***************************************************************************/
#ifndef __DTSEC_H
#define __DTSEC_H

#include "std_ext.h"
#include "error_ext.h"
#include "list_ext.h"
#include "enet_ext.h"

#include "dtsec_mii_acc.h"
#include "fm_mac.h"


#define DEFAULT_exceptions            \
    ((uint32_t)(DTSEC_IMASK_BREN    | \
                DTSEC_IMASK_RXCEN   | \
                DTSEC_IMASK_BTEN    | \
                DTSEC_IMASK_TXCEN   | \
                DTSEC_IMASK_TXEEN   | \
                DTSEC_IMASK_ABRTEN  | \
                DTSEC_IMASK_LCEN    | \
                DTSEC_IMASK_CRLEN   | \
                DTSEC_IMASK_XFUNEN  | \
                DTSEC_IMASK_IFERREN | \
                DTSEC_IMASK_MAGEN   | \
                DTSEC_IMASK_TDPEEN  | \
                DTSEC_IMASK_RDPEEN))

#define GET_EXCEPTION_FLAG(bitMask, exception)  switch (exception){ \
    case e_FM_MAC_EX_1G_BAB_RX:                                     \
        bitMask = DTSEC_IMASK_BREN; break;                          \
    case e_FM_MAC_EX_1G_RX_CTL:                                     \
        bitMask = DTSEC_IMASK_RXCEN; break;                         \
    case e_FM_MAC_EX_1G_GRATEFUL_TX_STP_COMPLET:                    \
        bitMask = DTSEC_IMASK_GTSCEN ; break;                       \
    case e_FM_MAC_EX_1G_BAB_TX:                                     \
        bitMask = DTSEC_IMASK_BTEN   ; break;                       \
    case e_FM_MAC_EX_1G_TX_CTL:                                     \
        bitMask = DTSEC_IMASK_TXCEN  ; break;                       \
    case e_FM_MAC_EX_1G_TX_ERR:                                     \
        bitMask = DTSEC_IMASK_TXEEN  ; break;                       \
    case e_FM_MAC_EX_1G_LATE_COL:                                   \
        bitMask = DTSEC_IMASK_LCEN   ; break;                       \
    case e_FM_MAC_EX_1G_COL_RET_LMT:                                \
        bitMask = DTSEC_IMASK_CRLEN  ; break;                       \
    case e_FM_MAC_EX_1G_TX_FIFO_UNDRN:                              \
        bitMask = DTSEC_IMASK_XFUNEN ; break;                       \
    case e_FM_MAC_EX_1G_MAG_PCKT:                                   \
        bitMask = DTSEC_IMASK_MAGEN ; break;                        \
    case e_FM_MAC_EX_1G_MII_MNG_RD_COMPLET:                         \
        bitMask = DTSEC_IMASK_MMRDEN; break;                        \
    case e_FM_MAC_EX_1G_MII_MNG_WR_COMPLET:                         \
        bitMask = DTSEC_IMASK_MMWREN  ; break;                      \
    case e_FM_MAC_EX_1G_GRATEFUL_RX_STP_COMPLET:                    \
        bitMask = DTSEC_IMASK_GRSCEN; break;                        \
    case e_FM_MAC_EX_1G_TX_DATA_ERR:                                \
        bitMask = DTSEC_IMASK_TDPEEN; break;                        \
    case e_FM_MAC_EX_1G_RX_MIB_CNT_OVFL:                            \
        bitMask = DTSEC_IMASK_MSROEN ; break;                       \
    default: bitMask = 0;break;}


#define MAX_PACKET_ALIGNMENT        31
#define MAX_INTER_PACKET_GAP        0x7f
#define MAX_INTER_PALTERNATE_BEB    0x0f
#define MAX_RETRANSMISSION          0x0f
#define MAX_COLLISION_WINDOW        0x03ff


/********************* From mac ext ******************************************/
typedef  uint32_t t_ErrorDisable;

#define ERROR_DISABLE_TRANSMIT              0x00400000
#define ERROR_DISABLE_LATE_COLLISION        0x00040000
#define ERROR_DISABLE_COLLISION_RETRY_LIMIT 0x00020000
#define ERROR_DISABLE_TxFIFO_UNDERRUN       0x00010000
#define ERROR_DISABLE_TxABORT               0x00008000
#define ERROR_DISABLE_INTERFACE             0x00004000
#define ERROR_DISABLE_TxDATA_PARITY         0x00000002
#define ERROR_DISABLE_RxDATA_PARITY         0x00000001

/*****************************************************************************/
#define DTSEC_NUM_OF_PADDRS             15  /* number of pattern match registers (entries) */

#define GROUP_ADDRESS                   0x0000010000000000LL /* Group address bit indication */

#define HASH_TABLE_SIZE                 256 /* Hash table size (= 32 bits * 8 regs) */

#define HASH_TABLE_SIZE                 256 /* Hash table size (32 bits * 8 regs) */
#define EXTENDED_HASH_TABLE_SIZE        512 /* Extended Hash table size (32 bits * 16 regs) */

#define DTSEC_TO_MII_OFFSET             0x1000  /* number of pattern match registers (entries) */

#define MAX_PHYS                    32 /* maximum number of phys */

#define     VAL32BIT    0x100000000LL
#define     VAL22BIT    0x00400000
#define     VAL16BIT    0x00010000
#define     VAL12BIT    0x00001000

/* CAR1/2 bits */
#define CAR1_TR64   0x80000000
#define CAR1_TR127  0x40000000
#define CAR1_TR255  0x20000000
#define CAR1_TR511  0x10000000
#define CAR1_TRK1   0x08000000
#define CAR1_TRMAX  0x04000000
#define CAR1_TRMGV  0x02000000

#define CAR1_RBYT   0x00010000
#define CAR1_RPKT   0x00008000
#define CAR1_RMCA   0x00002000
#define CAR1_RBCA   0x00001000
#define CAR1_RXPF   0x00000400
#define CAR1_RALN   0x00000100
#define CAR1_RFLR   0x00000080
#define CAR1_RCDE   0x00000040
#define CAR1_RCSE   0x00000020
#define CAR1_RUND   0x00000010
#define CAR1_ROVR   0x00000008
#define CAR1_RFRG   0x00000004
#define CAR1_RJBR   0x00000002
#define CAR1_RDRP   0x00000001

#define CAR2_TFCS   0x00040000
#define CAR2_TBYT   0x00002000
#define CAR2_TPKT   0x00001000
#define CAR2_TMCA   0x00000800
#define CAR2_TBCA   0x00000400
#define CAR2_TXPF   0x00000200
#define CAR2_TDRP   0x00000001

typedef struct t_InternalStatistics
{
    uint64_t    tr64;
    uint64_t    tr127;
    uint64_t    tr255;
    uint64_t    tr511;
    uint64_t    tr1k;
    uint64_t    trmax;
    uint64_t    trmgv;
    uint64_t    rfrg;
    uint64_t    rjbr;
    uint64_t    rdrp;
    uint64_t    raln;
    uint64_t    rund;
    uint64_t    rovr;
    uint64_t    rxpf;
    uint64_t    txpf;
    uint64_t    rbyt;
    uint64_t    rpkt;
    uint64_t    rmca;
    uint64_t    rbca;
    uint64_t    rflr;
    uint64_t    rcde;
    uint64_t    rcse;
    uint64_t    tbyt;
    uint64_t    tpkt;
    uint64_t    tmca;
    uint64_t    tbca;
    uint64_t    tdrp;
    uint64_t    tfcs;
} t_InternalStatistics;

typedef struct {
    t_FmMacControllerDriver     fmMacControllerDriver;
    t_Handle                    h_App;            /**< Handle to the upper layer application              */
    struct dtsec_regs           *p_MemMap;        /**< pointer to dTSEC memory mapped registers.          */
    struct dtsec_mii_reg        *p_MiiMemMap;     /**< pointer to dTSEC MII memory mapped registers.          */
    uint64_t                    addr;             /**< MAC address of device;                             */
    e_EnetMode                  enetMode;         /**< Ethernet physical interface  */
    t_FmMacExceptionCallback    *f_Exception;
    int                         mdioIrq;
    t_FmMacExceptionCallback    *f_Event;
    bool                        indAddrRegUsed[DTSEC_NUM_OF_PADDRS]; /**< Whether a particular individual address recognition register is being used */
    uint64_t                    paddr[DTSEC_NUM_OF_PADDRS]; /**< MAC address for particular individual address recognition register */
    uint8_t                     numOfIndAddrInRegs; /**< Number of individual addresses in registers for this station. */
    bool                        halfDuplex;
    t_InternalStatistics        internalStatistics;
    t_EthHash                   *p_MulticastAddrHash;      /* pointer to driver's global address hash table  */
    t_EthHash                   *p_UnicastAddrHash;    /* pointer to driver's individual address hash table  */
    uint8_t                     macId;
    uint8_t                     tbi_phy_addr;
    uint32_t                    exceptions;
    bool                        ptpTsuEnabled;
    bool                        enTsuErrExeption;
    e_FmMacStatisticsLevel      statisticsLevel;
    struct dtsec_cfg            *p_DtsecDriverParam;
} t_Dtsec;


#endif /* __DTSEC_H */