1*852ba100SJustin Hibbits /*
2*852ba100SJustin Hibbits * Copyright 2008-2012 Freescale Semiconductor Inc.
30aeed3e9SJustin Hibbits *
40aeed3e9SJustin Hibbits * Redistribution and use in source and binary forms, with or without
50aeed3e9SJustin Hibbits * modification, are permitted provided that the following conditions are met:
60aeed3e9SJustin Hibbits * * Redistributions of source code must retain the above copyright
70aeed3e9SJustin Hibbits * notice, this list of conditions and the following disclaimer.
80aeed3e9SJustin Hibbits * * Redistributions in binary form must reproduce the above copyright
90aeed3e9SJustin Hibbits * notice, this list of conditions and the following disclaimer in the
100aeed3e9SJustin Hibbits * documentation and/or other materials provided with the distribution.
110aeed3e9SJustin Hibbits * * Neither the name of Freescale Semiconductor nor the
120aeed3e9SJustin Hibbits * names of its contributors may be used to endorse or promote products
130aeed3e9SJustin Hibbits * derived from this software without specific prior written permission.
140aeed3e9SJustin Hibbits *
150aeed3e9SJustin Hibbits *
160aeed3e9SJustin Hibbits * ALTERNATIVELY, this software may be distributed under the terms of the
170aeed3e9SJustin Hibbits * GNU General Public License ("GPL") as published by the Free Software
180aeed3e9SJustin Hibbits * Foundation, either version 2 of that License or (at your option) any
190aeed3e9SJustin Hibbits * later version.
200aeed3e9SJustin Hibbits *
210aeed3e9SJustin Hibbits * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
220aeed3e9SJustin Hibbits * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
230aeed3e9SJustin Hibbits * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
240aeed3e9SJustin Hibbits * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
250aeed3e9SJustin Hibbits * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
260aeed3e9SJustin Hibbits * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
270aeed3e9SJustin Hibbits * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
280aeed3e9SJustin Hibbits * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
290aeed3e9SJustin Hibbits * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
300aeed3e9SJustin Hibbits * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
310aeed3e9SJustin Hibbits */
320aeed3e9SJustin Hibbits
33*852ba100SJustin Hibbits
340aeed3e9SJustin Hibbits /******************************************************************************
350aeed3e9SJustin Hibbits @File tgec.c
360aeed3e9SJustin Hibbits
370aeed3e9SJustin Hibbits @Description FM 10G MAC ...
380aeed3e9SJustin Hibbits *//***************************************************************************/
390aeed3e9SJustin Hibbits
400aeed3e9SJustin Hibbits #include "std_ext.h"
410aeed3e9SJustin Hibbits #include "string_ext.h"
420aeed3e9SJustin Hibbits #include "error_ext.h"
430aeed3e9SJustin Hibbits #include "xx_ext.h"
440aeed3e9SJustin Hibbits #include "endian_ext.h"
450aeed3e9SJustin Hibbits #include "debug_ext.h"
46*852ba100SJustin Hibbits #include "crc_mac_addr_ext.h"
470aeed3e9SJustin Hibbits
480aeed3e9SJustin Hibbits #include "fm_common.h"
49*852ba100SJustin Hibbits #include "fsl_fman_tgec.h"
500aeed3e9SJustin Hibbits #include "tgec.h"
510aeed3e9SJustin Hibbits
520aeed3e9SJustin Hibbits
530aeed3e9SJustin Hibbits /*****************************************************************************/
540aeed3e9SJustin Hibbits /* Internal routines */
550aeed3e9SJustin Hibbits /*****************************************************************************/
560aeed3e9SJustin Hibbits
CheckInitParameters(t_Tgec * p_Tgec)570aeed3e9SJustin Hibbits static t_Error CheckInitParameters(t_Tgec *p_Tgec)
580aeed3e9SJustin Hibbits {
590aeed3e9SJustin Hibbits if (ENET_SPEED_FROM_MODE(p_Tgec->enetMode) < e_ENET_SPEED_10000)
600aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Ethernet 10G MAC driver only support 10G speed"));
610aeed3e9SJustin Hibbits #if (FM_MAX_NUM_OF_10G_MACS > 0)
620aeed3e9SJustin Hibbits if (p_Tgec->macId >= FM_MAX_NUM_OF_10G_MACS)
630aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("macId of 10G can not be greater than 0"));
64*852ba100SJustin Hibbits #endif /* (FM_MAX_NUM_OF_10G_MACS > 0) */
65*852ba100SJustin Hibbits
660aeed3e9SJustin Hibbits if (p_Tgec->addr == 0)
670aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Ethernet 10G MAC Must have a valid MAC Address"));
680aeed3e9SJustin Hibbits if (!p_Tgec->f_Exception)
690aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("uninitialized f_Exception"));
700aeed3e9SJustin Hibbits if (!p_Tgec->f_Event)
710aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("uninitialized f_Event"));
72*852ba100SJustin Hibbits #ifdef FM_LEN_CHECK_ERRATA_FMAN_SW002
73*852ba100SJustin Hibbits if (!p_Tgec->p_TgecDriverParam->no_length_check_enable)
74*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("LengthCheck!"));
75*852ba100SJustin Hibbits #endif /* FM_LEN_CHECK_ERRATA_FMAN_SW002 */
760aeed3e9SJustin Hibbits return E_OK;
770aeed3e9SJustin Hibbits }
780aeed3e9SJustin Hibbits
79*852ba100SJustin Hibbits /* ......................................................................... */
800aeed3e9SJustin Hibbits
GetMacAddrHashCode(uint64_t ethAddr)81*852ba100SJustin Hibbits static uint32_t GetMacAddrHashCode(uint64_t ethAddr)
820aeed3e9SJustin Hibbits {
83*852ba100SJustin Hibbits uint32_t crc;
840aeed3e9SJustin Hibbits
85*852ba100SJustin Hibbits /* CRC calculation */
86*852ba100SJustin Hibbits GET_MAC_ADDR_CRC(ethAddr, crc);
870aeed3e9SJustin Hibbits
88*852ba100SJustin Hibbits crc = GetMirror32(crc);
890aeed3e9SJustin Hibbits
90*852ba100SJustin Hibbits return crc;
910aeed3e9SJustin Hibbits }
920aeed3e9SJustin Hibbits
93*852ba100SJustin Hibbits /* ......................................................................... */
940aeed3e9SJustin Hibbits
TgecErrException(t_Handle h_Tgec)950aeed3e9SJustin Hibbits static void TgecErrException(t_Handle h_Tgec)
960aeed3e9SJustin Hibbits {
970aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
980aeed3e9SJustin Hibbits uint32_t event;
99*852ba100SJustin Hibbits struct tgec_regs *p_TgecMemMap = p_Tgec->p_MemMap;
1000aeed3e9SJustin Hibbits
1010aeed3e9SJustin Hibbits /* do not handle MDIO events */
102*852ba100SJustin Hibbits event = fman_tgec_get_event(p_TgecMemMap, ~(TGEC_IMASK_MDIO_SCAN_EVENT | TGEC_IMASK_MDIO_CMD_CMPL));
103*852ba100SJustin Hibbits event &= fman_tgec_get_interrupt_mask(p_TgecMemMap);
1040aeed3e9SJustin Hibbits
105*852ba100SJustin Hibbits fman_tgec_ack_event(p_TgecMemMap, event);
1060aeed3e9SJustin Hibbits
107*852ba100SJustin Hibbits if (event & TGEC_IMASK_REM_FAULT)
1080aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_REM_FAULT);
109*852ba100SJustin Hibbits if (event & TGEC_IMASK_LOC_FAULT)
1100aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_LOC_FAULT);
111*852ba100SJustin Hibbits if (event & TGEC_IMASK_TX_ECC_ER)
1120aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_1TX_ECC_ER);
113*852ba100SJustin Hibbits if (event & TGEC_IMASK_TX_FIFO_UNFL)
1140aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_TX_FIFO_UNFL);
115*852ba100SJustin Hibbits if (event & TGEC_IMASK_TX_FIFO_OVFL)
1160aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_TX_FIFO_OVFL);
117*852ba100SJustin Hibbits if (event & TGEC_IMASK_TX_ER)
1180aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_TX_ER);
119*852ba100SJustin Hibbits if (event & TGEC_IMASK_RX_FIFO_OVFL)
1200aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_FIFO_OVFL);
121*852ba100SJustin Hibbits if (event & TGEC_IMASK_RX_ECC_ER)
1220aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_ECC_ER);
123*852ba100SJustin Hibbits if (event & TGEC_IMASK_RX_JAB_FRM)
1240aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_JAB_FRM);
125*852ba100SJustin Hibbits if (event & TGEC_IMASK_RX_OVRSZ_FRM)
1260aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_OVRSZ_FRM);
127*852ba100SJustin Hibbits if (event & TGEC_IMASK_RX_RUNT_FRM)
1280aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_RUNT_FRM);
129*852ba100SJustin Hibbits if (event & TGEC_IMASK_RX_FRAG_FRM)
1300aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_FRAG_FRM);
131*852ba100SJustin Hibbits if (event & TGEC_IMASK_RX_LEN_ER)
1320aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_LEN_ER);
133*852ba100SJustin Hibbits if (event & TGEC_IMASK_RX_CRC_ER)
1340aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_CRC_ER);
135*852ba100SJustin Hibbits if (event & TGEC_IMASK_RX_ALIGN_ER)
1360aeed3e9SJustin Hibbits p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_ALIGN_ER);
1370aeed3e9SJustin Hibbits }
1380aeed3e9SJustin Hibbits
139*852ba100SJustin Hibbits /* ......................................................................... */
140*852ba100SJustin Hibbits
TgecException(t_Handle h_Tgec)1410aeed3e9SJustin Hibbits static void TgecException(t_Handle h_Tgec)
1420aeed3e9SJustin Hibbits {
1430aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
1440aeed3e9SJustin Hibbits uint32_t event;
145*852ba100SJustin Hibbits struct tgec_regs *p_TgecMemMap = p_Tgec->p_MemMap;
1460aeed3e9SJustin Hibbits
1470aeed3e9SJustin Hibbits /* handle only MDIO events */
148*852ba100SJustin Hibbits event = fman_tgec_get_event(p_TgecMemMap, (TGEC_IMASK_MDIO_SCAN_EVENT | TGEC_IMASK_MDIO_CMD_CMPL));
149*852ba100SJustin Hibbits event &= fman_tgec_get_interrupt_mask(p_TgecMemMap);
1500aeed3e9SJustin Hibbits
151*852ba100SJustin Hibbits fman_tgec_ack_event(p_TgecMemMap, event);
1520aeed3e9SJustin Hibbits
153*852ba100SJustin Hibbits if (event & TGEC_IMASK_MDIO_SCAN_EVENT)
1540aeed3e9SJustin Hibbits p_Tgec->f_Event(p_Tgec->h_App, e_FM_MAC_EX_10G_MDIO_SCAN_EVENTMDIO);
155*852ba100SJustin Hibbits if (event & TGEC_IMASK_MDIO_CMD_CMPL)
1560aeed3e9SJustin Hibbits p_Tgec->f_Event(p_Tgec->h_App, e_FM_MAC_EX_10G_MDIO_CMD_CMPL);
1570aeed3e9SJustin Hibbits }
1580aeed3e9SJustin Hibbits
159*852ba100SJustin Hibbits /* ......................................................................... */
160*852ba100SJustin Hibbits
FreeInitResources(t_Tgec * p_Tgec)1610aeed3e9SJustin Hibbits static void FreeInitResources(t_Tgec *p_Tgec)
1620aeed3e9SJustin Hibbits {
163*852ba100SJustin Hibbits if (p_Tgec->mdioIrq != NO_IRQ)
1640aeed3e9SJustin Hibbits {
1650aeed3e9SJustin Hibbits XX_DisableIntr(p_Tgec->mdioIrq);
1660aeed3e9SJustin Hibbits XX_FreeIntr(p_Tgec->mdioIrq);
1670aeed3e9SJustin Hibbits }
168*852ba100SJustin Hibbits
1690aeed3e9SJustin Hibbits FmUnregisterIntr(p_Tgec->fmMacControllerDriver.h_Fm, e_FM_MOD_10G_MAC, p_Tgec->macId, e_FM_INTR_TYPE_ERR);
1700aeed3e9SJustin Hibbits
1710aeed3e9SJustin Hibbits /* release the driver's group hash table */
1720aeed3e9SJustin Hibbits FreeHashTable(p_Tgec->p_MulticastAddrHash);
1730aeed3e9SJustin Hibbits p_Tgec->p_MulticastAddrHash = NULL;
1740aeed3e9SJustin Hibbits
1750aeed3e9SJustin Hibbits /* release the driver's individual hash table */
1760aeed3e9SJustin Hibbits FreeHashTable(p_Tgec->p_UnicastAddrHash);
1770aeed3e9SJustin Hibbits p_Tgec->p_UnicastAddrHash = NULL;
1780aeed3e9SJustin Hibbits }
1790aeed3e9SJustin Hibbits
1800aeed3e9SJustin Hibbits
1810aeed3e9SJustin Hibbits /*****************************************************************************/
1820aeed3e9SJustin Hibbits /* 10G MAC API routines */
1830aeed3e9SJustin Hibbits /*****************************************************************************/
1840aeed3e9SJustin Hibbits
185*852ba100SJustin Hibbits /* ......................................................................... */
1860aeed3e9SJustin Hibbits
TgecEnable(t_Handle h_Tgec,e_CommMode mode)1870aeed3e9SJustin Hibbits static t_Error TgecEnable(t_Handle h_Tgec, e_CommMode mode)
1880aeed3e9SJustin Hibbits {
1890aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
1900aeed3e9SJustin Hibbits
1910aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
192*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
1930aeed3e9SJustin Hibbits
194*852ba100SJustin Hibbits fman_tgec_enable(p_Tgec->p_MemMap, (mode & e_COMM_MODE_RX), (mode & e_COMM_MODE_TX));
1950aeed3e9SJustin Hibbits
1960aeed3e9SJustin Hibbits return E_OK;
1970aeed3e9SJustin Hibbits }
1980aeed3e9SJustin Hibbits
199*852ba100SJustin Hibbits /* ......................................................................... */
2000aeed3e9SJustin Hibbits
TgecDisable(t_Handle h_Tgec,e_CommMode mode)2010aeed3e9SJustin Hibbits static t_Error TgecDisable (t_Handle h_Tgec, e_CommMode mode)
2020aeed3e9SJustin Hibbits {
2030aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
2040aeed3e9SJustin Hibbits
2050aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
206*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
2070aeed3e9SJustin Hibbits
208*852ba100SJustin Hibbits fman_tgec_disable(p_Tgec->p_MemMap, (mode & e_COMM_MODE_RX), (mode & e_COMM_MODE_TX));
2090aeed3e9SJustin Hibbits
2100aeed3e9SJustin Hibbits return E_OK;
2110aeed3e9SJustin Hibbits }
2120aeed3e9SJustin Hibbits
213*852ba100SJustin Hibbits /* ......................................................................... */
2140aeed3e9SJustin Hibbits
TgecSetPromiscuous(t_Handle h_Tgec,bool newVal)2150aeed3e9SJustin Hibbits static t_Error TgecSetPromiscuous(t_Handle h_Tgec, bool newVal)
2160aeed3e9SJustin Hibbits {
2170aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
2180aeed3e9SJustin Hibbits
2190aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
220*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
2210aeed3e9SJustin Hibbits
222*852ba100SJustin Hibbits fman_tgec_set_promiscuous(p_Tgec->p_MemMap, newVal);
2230aeed3e9SJustin Hibbits
2240aeed3e9SJustin Hibbits return E_OK;
2250aeed3e9SJustin Hibbits }
2260aeed3e9SJustin Hibbits
2270aeed3e9SJustin Hibbits
2280aeed3e9SJustin Hibbits /*****************************************************************************/
2290aeed3e9SJustin Hibbits /* Tgec Configs modification functions */
2300aeed3e9SJustin Hibbits /*****************************************************************************/
2310aeed3e9SJustin Hibbits
232*852ba100SJustin Hibbits /* ......................................................................... */
2330aeed3e9SJustin Hibbits
TgecConfigLoopback(t_Handle h_Tgec,bool newVal)2340aeed3e9SJustin Hibbits static t_Error TgecConfigLoopback(t_Handle h_Tgec, bool newVal)
2350aeed3e9SJustin Hibbits {
2360aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
2370aeed3e9SJustin Hibbits
2380aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
2390aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
2400aeed3e9SJustin Hibbits
241*852ba100SJustin Hibbits p_Tgec->p_TgecDriverParam->loopback_enable = newVal;
2420aeed3e9SJustin Hibbits
2430aeed3e9SJustin Hibbits return E_OK;
2440aeed3e9SJustin Hibbits }
2450aeed3e9SJustin Hibbits
246*852ba100SJustin Hibbits /* ......................................................................... */
2470aeed3e9SJustin Hibbits
TgecConfigWan(t_Handle h_Tgec,bool newVal)2480aeed3e9SJustin Hibbits static t_Error TgecConfigWan(t_Handle h_Tgec, bool newVal)
2490aeed3e9SJustin Hibbits {
2500aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
2510aeed3e9SJustin Hibbits
2520aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
2530aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
2540aeed3e9SJustin Hibbits
255*852ba100SJustin Hibbits p_Tgec->p_TgecDriverParam->wan_mode_enable = newVal;
2560aeed3e9SJustin Hibbits
2570aeed3e9SJustin Hibbits return E_OK;
2580aeed3e9SJustin Hibbits }
2590aeed3e9SJustin Hibbits
260*852ba100SJustin Hibbits /* ......................................................................... */
2610aeed3e9SJustin Hibbits
TgecConfigMaxFrameLength(t_Handle h_Tgec,uint16_t newVal)2620aeed3e9SJustin Hibbits static t_Error TgecConfigMaxFrameLength(t_Handle h_Tgec, uint16_t newVal)
2630aeed3e9SJustin Hibbits {
2640aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
2650aeed3e9SJustin Hibbits
2660aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
2670aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
2680aeed3e9SJustin Hibbits
269*852ba100SJustin Hibbits p_Tgec->p_TgecDriverParam->max_frame_length = newVal;
2700aeed3e9SJustin Hibbits
2710aeed3e9SJustin Hibbits return E_OK;
2720aeed3e9SJustin Hibbits }
2730aeed3e9SJustin Hibbits
274*852ba100SJustin Hibbits /* ......................................................................... */
2750aeed3e9SJustin Hibbits
TgecConfigLengthCheck(t_Handle h_Tgec,bool newVal)2760aeed3e9SJustin Hibbits static t_Error TgecConfigLengthCheck(t_Handle h_Tgec, bool newVal)
2770aeed3e9SJustin Hibbits {
2780aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
2790aeed3e9SJustin Hibbits
2800aeed3e9SJustin Hibbits UNUSED(newVal);
2810aeed3e9SJustin Hibbits
2820aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
2830aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
2840aeed3e9SJustin Hibbits
285*852ba100SJustin Hibbits p_Tgec->p_TgecDriverParam->no_length_check_enable = !newVal;
2860aeed3e9SJustin Hibbits
2870aeed3e9SJustin Hibbits return E_OK;
2880aeed3e9SJustin Hibbits }
2890aeed3e9SJustin Hibbits
290*852ba100SJustin Hibbits /* ......................................................................... */
2910aeed3e9SJustin Hibbits
TgecConfigException(t_Handle h_Tgec,e_FmMacExceptions exception,bool enable)2920aeed3e9SJustin Hibbits static t_Error TgecConfigException(t_Handle h_Tgec, e_FmMacExceptions exception, bool enable)
2930aeed3e9SJustin Hibbits {
2940aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
2950aeed3e9SJustin Hibbits uint32_t bitMask = 0;
2960aeed3e9SJustin Hibbits
2970aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
2980aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
2990aeed3e9SJustin Hibbits
3000aeed3e9SJustin Hibbits GET_EXCEPTION_FLAG(bitMask, exception);
3010aeed3e9SJustin Hibbits if (bitMask)
3020aeed3e9SJustin Hibbits {
3030aeed3e9SJustin Hibbits if (enable)
3040aeed3e9SJustin Hibbits p_Tgec->exceptions |= bitMask;
3050aeed3e9SJustin Hibbits else
3060aeed3e9SJustin Hibbits p_Tgec->exceptions &= ~bitMask;
3070aeed3e9SJustin Hibbits }
3080aeed3e9SJustin Hibbits else
3090aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
3100aeed3e9SJustin Hibbits
3110aeed3e9SJustin Hibbits return E_OK;
3120aeed3e9SJustin Hibbits }
3130aeed3e9SJustin Hibbits
3140aeed3e9SJustin Hibbits #ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
315*852ba100SJustin Hibbits /* ......................................................................... */
3160aeed3e9SJustin Hibbits
TgecConfigSkipFman11Workaround(t_Handle h_Tgec)3170aeed3e9SJustin Hibbits static t_Error TgecConfigSkipFman11Workaround(t_Handle h_Tgec)
3180aeed3e9SJustin Hibbits {
3190aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
3200aeed3e9SJustin Hibbits
3210aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
3220aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
3230aeed3e9SJustin Hibbits
324*852ba100SJustin Hibbits p_Tgec->p_TgecDriverParam->skip_fman11_workaround = TRUE;
3250aeed3e9SJustin Hibbits
3260aeed3e9SJustin Hibbits return E_OK;
3270aeed3e9SJustin Hibbits }
3280aeed3e9SJustin Hibbits #endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
3290aeed3e9SJustin Hibbits
3300aeed3e9SJustin Hibbits
3310aeed3e9SJustin Hibbits /*****************************************************************************/
3320aeed3e9SJustin Hibbits /* Tgec Run Time API functions */
3330aeed3e9SJustin Hibbits /*****************************************************************************/
3340aeed3e9SJustin Hibbits
335*852ba100SJustin Hibbits /* ......................................................................... */
336*852ba100SJustin Hibbits /* backward compatibility. will be removed in the future. */
TgecTxMacPause(t_Handle h_Tgec,uint16_t pauseTime)3370aeed3e9SJustin Hibbits static t_Error TgecTxMacPause(t_Handle h_Tgec, uint16_t pauseTime)
3380aeed3e9SJustin Hibbits {
3390aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
3400aeed3e9SJustin Hibbits
3410aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_STATE);
3420aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
343*852ba100SJustin Hibbits fman_tgec_set_tx_pause_frames(p_Tgec->p_MemMap, pauseTime);
3440aeed3e9SJustin Hibbits
3450aeed3e9SJustin Hibbits
3460aeed3e9SJustin Hibbits return E_OK;
3470aeed3e9SJustin Hibbits }
3480aeed3e9SJustin Hibbits
349*852ba100SJustin Hibbits /* ......................................................................... */
350*852ba100SJustin Hibbits
TgecSetTxPauseFrames(t_Handle h_Tgec,uint8_t priority,uint16_t pauseTime,uint16_t threshTime)351*852ba100SJustin Hibbits static t_Error TgecSetTxPauseFrames(t_Handle h_Tgec,
352*852ba100SJustin Hibbits uint8_t priority,
353*852ba100SJustin Hibbits uint16_t pauseTime,
354*852ba100SJustin Hibbits uint16_t threshTime)
355*852ba100SJustin Hibbits {
356*852ba100SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
357*852ba100SJustin Hibbits
358*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_STATE);
359*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
360*852ba100SJustin Hibbits
361*852ba100SJustin Hibbits UNUSED(priority); UNUSED(threshTime);
362*852ba100SJustin Hibbits
363*852ba100SJustin Hibbits fman_tgec_set_tx_pause_frames(p_Tgec->p_MemMap, pauseTime);
364*852ba100SJustin Hibbits
365*852ba100SJustin Hibbits return E_OK;
366*852ba100SJustin Hibbits }
367*852ba100SJustin Hibbits
368*852ba100SJustin Hibbits /* ......................................................................... */
3690aeed3e9SJustin Hibbits
TgecRxIgnoreMacPause(t_Handle h_Tgec,bool en)3700aeed3e9SJustin Hibbits static t_Error TgecRxIgnoreMacPause(t_Handle h_Tgec, bool en)
3710aeed3e9SJustin Hibbits {
3720aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
3730aeed3e9SJustin Hibbits
3740aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_STATE);
3750aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
3760aeed3e9SJustin Hibbits
377*852ba100SJustin Hibbits fman_tgec_set_rx_ignore_pause_frames(p_Tgec->p_MemMap, en);
3780aeed3e9SJustin Hibbits
3790aeed3e9SJustin Hibbits return E_OK;
3800aeed3e9SJustin Hibbits }
3810aeed3e9SJustin Hibbits
382*852ba100SJustin Hibbits /* ......................................................................... */
3830aeed3e9SJustin Hibbits
TgecGetStatistics(t_Handle h_Tgec,t_FmMacStatistics * p_Statistics)3840aeed3e9SJustin Hibbits static t_Error TgecGetStatistics(t_Handle h_Tgec, t_FmMacStatistics *p_Statistics)
3850aeed3e9SJustin Hibbits {
3860aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
387*852ba100SJustin Hibbits struct tgec_regs *p_TgecMemMap;
3880aeed3e9SJustin Hibbits
3890aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
390*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
3910aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Statistics, E_NULL_POINTER);
3920aeed3e9SJustin Hibbits
3930aeed3e9SJustin Hibbits p_TgecMemMap = p_Tgec->p_MemMap;
3940aeed3e9SJustin Hibbits
395*852ba100SJustin Hibbits p_Statistics->eStatPkts64 = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R64);
396*852ba100SJustin Hibbits p_Statistics->eStatPkts65to127 = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R127);
397*852ba100SJustin Hibbits p_Statistics->eStatPkts128to255 = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R255);
398*852ba100SJustin Hibbits p_Statistics->eStatPkts256to511 = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R511);
399*852ba100SJustin Hibbits p_Statistics->eStatPkts512to1023 = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R1023);
400*852ba100SJustin Hibbits p_Statistics->eStatPkts1024to1518 = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R1518);
401*852ba100SJustin Hibbits p_Statistics->eStatPkts1519to1522 = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R1519X);
4020aeed3e9SJustin Hibbits /* */
403*852ba100SJustin Hibbits p_Statistics->eStatFragments = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TRFRG);
404*852ba100SJustin Hibbits p_Statistics->eStatJabbers = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TRJBR);
4050aeed3e9SJustin Hibbits
406*852ba100SJustin Hibbits p_Statistics->eStatsDropEvents = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RDRP);
407*852ba100SJustin Hibbits p_Statistics->eStatCRCAlignErrors = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RALN);
4080aeed3e9SJustin Hibbits
409*852ba100SJustin Hibbits p_Statistics->eStatUndersizePkts = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TRUND);
410*852ba100SJustin Hibbits p_Statistics->eStatOversizePkts = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TROVR);
4110aeed3e9SJustin Hibbits /* Pause */
412*852ba100SJustin Hibbits p_Statistics->reStatPause = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RXPF);
413*852ba100SJustin Hibbits p_Statistics->teStatPause = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TXPF);
4140aeed3e9SJustin Hibbits
4150aeed3e9SJustin Hibbits /* MIB II */
416*852ba100SJustin Hibbits p_Statistics->ifInOctets = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_ROCT);
417*852ba100SJustin Hibbits p_Statistics->ifInUcastPkts = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RUCA);
418*852ba100SJustin Hibbits p_Statistics->ifInMcastPkts = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RMCA);
419*852ba100SJustin Hibbits p_Statistics->ifInBcastPkts = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RBCA);
420*852ba100SJustin Hibbits p_Statistics->ifInPkts = p_Statistics->ifInUcastPkts
4210aeed3e9SJustin Hibbits + p_Statistics->ifInMcastPkts
4220aeed3e9SJustin Hibbits + p_Statistics->ifInBcastPkts;
4230aeed3e9SJustin Hibbits p_Statistics->ifInDiscards = 0;
424*852ba100SJustin Hibbits p_Statistics->ifInErrors = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RERR);
4250aeed3e9SJustin Hibbits
426*852ba100SJustin Hibbits p_Statistics->ifOutOctets = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TOCT);
427*852ba100SJustin Hibbits p_Statistics->ifOutUcastPkts = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TUCA);
428*852ba100SJustin Hibbits p_Statistics->ifOutMcastPkts = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TMCA);
429*852ba100SJustin Hibbits p_Statistics->ifOutBcastPkts = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TBCA);
430*852ba100SJustin Hibbits p_Statistics->ifOutPkts = p_Statistics->ifOutUcastPkts
431*852ba100SJustin Hibbits + p_Statistics->ifOutMcastPkts
432*852ba100SJustin Hibbits + p_Statistics->ifOutBcastPkts;
4330aeed3e9SJustin Hibbits p_Statistics->ifOutDiscards = 0;
434*852ba100SJustin Hibbits p_Statistics->ifOutErrors = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TERR);
4350aeed3e9SJustin Hibbits
4360aeed3e9SJustin Hibbits return E_OK;
4370aeed3e9SJustin Hibbits }
4380aeed3e9SJustin Hibbits
439*852ba100SJustin Hibbits /* ......................................................................... */
4400aeed3e9SJustin Hibbits
TgecEnable1588TimeStamp(t_Handle h_Tgec)4410aeed3e9SJustin Hibbits static t_Error TgecEnable1588TimeStamp(t_Handle h_Tgec)
4420aeed3e9SJustin Hibbits {
4430aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
4440aeed3e9SJustin Hibbits
4450aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
4460aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
4470aeed3e9SJustin Hibbits
448*852ba100SJustin Hibbits fman_tgec_enable_1588_time_stamp(p_Tgec->p_MemMap, 1);
4490aeed3e9SJustin Hibbits
4500aeed3e9SJustin Hibbits return E_OK;
4510aeed3e9SJustin Hibbits }
4520aeed3e9SJustin Hibbits
453*852ba100SJustin Hibbits /* ......................................................................... */
4540aeed3e9SJustin Hibbits
TgecDisable1588TimeStamp(t_Handle h_Tgec)4550aeed3e9SJustin Hibbits static t_Error TgecDisable1588TimeStamp(t_Handle h_Tgec)
4560aeed3e9SJustin Hibbits {
4570aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
4580aeed3e9SJustin Hibbits
4590aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
4600aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
4610aeed3e9SJustin Hibbits
462*852ba100SJustin Hibbits fman_tgec_enable_1588_time_stamp(p_Tgec->p_MemMap, 0);
4630aeed3e9SJustin Hibbits
4640aeed3e9SJustin Hibbits return E_OK;
4650aeed3e9SJustin Hibbits }
4660aeed3e9SJustin Hibbits
467*852ba100SJustin Hibbits /* ......................................................................... */
4680aeed3e9SJustin Hibbits
TgecModifyMacAddress(t_Handle h_Tgec,t_EnetAddr * p_EnetAddr)4690aeed3e9SJustin Hibbits static t_Error TgecModifyMacAddress (t_Handle h_Tgec, t_EnetAddr *p_EnetAddr)
4700aeed3e9SJustin Hibbits {
4710aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
4720aeed3e9SJustin Hibbits
4730aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
474*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
4750aeed3e9SJustin Hibbits
476*852ba100SJustin Hibbits p_Tgec->addr = ENET_ADDR_TO_UINT64(*p_EnetAddr);
477*852ba100SJustin Hibbits fman_tgec_set_mac_address(p_Tgec->p_MemMap, (uint8_t *)(*p_EnetAddr));
4780aeed3e9SJustin Hibbits
4790aeed3e9SJustin Hibbits return E_OK;
4800aeed3e9SJustin Hibbits }
4810aeed3e9SJustin Hibbits
482*852ba100SJustin Hibbits /* ......................................................................... */
4830aeed3e9SJustin Hibbits
TgecResetCounters(t_Handle h_Tgec)4840aeed3e9SJustin Hibbits static t_Error TgecResetCounters (t_Handle h_Tgec)
4850aeed3e9SJustin Hibbits {
4860aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
4870aeed3e9SJustin Hibbits
4880aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
489*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
4900aeed3e9SJustin Hibbits
491*852ba100SJustin Hibbits fman_tgec_reset_stat(p_Tgec->p_MemMap);
4920aeed3e9SJustin Hibbits
4930aeed3e9SJustin Hibbits return E_OK;
4940aeed3e9SJustin Hibbits }
4950aeed3e9SJustin Hibbits
496*852ba100SJustin Hibbits /* ......................................................................... */
4970aeed3e9SJustin Hibbits
TgecAddExactMatchMacAddress(t_Handle h_Tgec,t_EnetAddr * p_EthAddr)4980aeed3e9SJustin Hibbits static t_Error TgecAddExactMatchMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
4990aeed3e9SJustin Hibbits {
5000aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *) h_Tgec;
5010aeed3e9SJustin Hibbits uint64_t ethAddr;
5020aeed3e9SJustin Hibbits uint8_t paddrNum;
5030aeed3e9SJustin Hibbits
5040aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
505*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
5060aeed3e9SJustin Hibbits
507*852ba100SJustin Hibbits ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
5080aeed3e9SJustin Hibbits
5090aeed3e9SJustin Hibbits if (ethAddr & GROUP_ADDRESS)
5100aeed3e9SJustin Hibbits /* Multicast address has no effect in PADDR */
5110aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Multicast address"));
5120aeed3e9SJustin Hibbits
5130aeed3e9SJustin Hibbits /* Make sure no PADDR contains this address */
5140aeed3e9SJustin Hibbits for (paddrNum = 0; paddrNum < TGEC_NUM_OF_PADDRS; paddrNum++)
5150aeed3e9SJustin Hibbits if (p_Tgec->indAddrRegUsed[paddrNum])
5160aeed3e9SJustin Hibbits if (p_Tgec->paddr[paddrNum] == ethAddr)
5170aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, NO_MSG);
5180aeed3e9SJustin Hibbits
5190aeed3e9SJustin Hibbits /* Find first unused PADDR */
5200aeed3e9SJustin Hibbits for (paddrNum = 0; paddrNum < TGEC_NUM_OF_PADDRS; paddrNum++)
5210aeed3e9SJustin Hibbits {
5220aeed3e9SJustin Hibbits if (!(p_Tgec->indAddrRegUsed[paddrNum]))
5230aeed3e9SJustin Hibbits {
5240aeed3e9SJustin Hibbits /* mark this PADDR as used */
5250aeed3e9SJustin Hibbits p_Tgec->indAddrRegUsed[paddrNum] = TRUE;
5260aeed3e9SJustin Hibbits /* store address */
5270aeed3e9SJustin Hibbits p_Tgec->paddr[paddrNum] = ethAddr;
5280aeed3e9SJustin Hibbits
5290aeed3e9SJustin Hibbits /* put in hardware */
530*852ba100SJustin Hibbits fman_tgec_add_addr_in_paddr(p_Tgec->p_MemMap, (uint8_t*)(*p_EthAddr)/* , paddrNum */);
5310aeed3e9SJustin Hibbits p_Tgec->numOfIndAddrInRegs++;
5320aeed3e9SJustin Hibbits
5330aeed3e9SJustin Hibbits return E_OK;
5340aeed3e9SJustin Hibbits }
5350aeed3e9SJustin Hibbits }
5360aeed3e9SJustin Hibbits
5370aeed3e9SJustin Hibbits /* No free PADDR */
5380aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_FULL, NO_MSG);
5390aeed3e9SJustin Hibbits }
5400aeed3e9SJustin Hibbits
541*852ba100SJustin Hibbits /* ......................................................................... */
5420aeed3e9SJustin Hibbits
TgecDelExactMatchMacAddress(t_Handle h_Tgec,t_EnetAddr * p_EthAddr)5430aeed3e9SJustin Hibbits static t_Error TgecDelExactMatchMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
5440aeed3e9SJustin Hibbits {
5450aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *) h_Tgec;
5460aeed3e9SJustin Hibbits uint64_t ethAddr;
5470aeed3e9SJustin Hibbits uint8_t paddrNum;
5480aeed3e9SJustin Hibbits
5490aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
550*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
5510aeed3e9SJustin Hibbits
552*852ba100SJustin Hibbits ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
5530aeed3e9SJustin Hibbits
5540aeed3e9SJustin Hibbits /* Find used PADDR containing this address */
5550aeed3e9SJustin Hibbits for (paddrNum = 0; paddrNum < TGEC_NUM_OF_PADDRS; paddrNum++)
5560aeed3e9SJustin Hibbits {
5570aeed3e9SJustin Hibbits if ((p_Tgec->indAddrRegUsed[paddrNum]) &&
5580aeed3e9SJustin Hibbits (p_Tgec->paddr[paddrNum] == ethAddr))
5590aeed3e9SJustin Hibbits {
5600aeed3e9SJustin Hibbits /* mark this PADDR as not used */
5610aeed3e9SJustin Hibbits p_Tgec->indAddrRegUsed[paddrNum] = FALSE;
5620aeed3e9SJustin Hibbits /* clear in hardware */
563*852ba100SJustin Hibbits fman_tgec_clear_addr_in_paddr(p_Tgec->p_MemMap /*, paddrNum */);
5640aeed3e9SJustin Hibbits p_Tgec->numOfIndAddrInRegs--;
5650aeed3e9SJustin Hibbits
5660aeed3e9SJustin Hibbits return E_OK;
5670aeed3e9SJustin Hibbits }
5680aeed3e9SJustin Hibbits }
5690aeed3e9SJustin Hibbits
5700aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_FOUND, NO_MSG);
5710aeed3e9SJustin Hibbits }
5720aeed3e9SJustin Hibbits
573*852ba100SJustin Hibbits /* ......................................................................... */
5740aeed3e9SJustin Hibbits
TgecAddHashMacAddress(t_Handle h_Tgec,t_EnetAddr * p_EthAddr)5750aeed3e9SJustin Hibbits static t_Error TgecAddHashMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
5760aeed3e9SJustin Hibbits {
5770aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
5780aeed3e9SJustin Hibbits t_EthHashEntry *p_HashEntry;
5790aeed3e9SJustin Hibbits uint32_t crc;
5800aeed3e9SJustin Hibbits uint32_t hash;
5810aeed3e9SJustin Hibbits uint64_t ethAddr;
5820aeed3e9SJustin Hibbits
5830aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
584*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
5850aeed3e9SJustin Hibbits
586*852ba100SJustin Hibbits ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
5870aeed3e9SJustin Hibbits
5880aeed3e9SJustin Hibbits if (!(ethAddr & GROUP_ADDRESS))
5890aeed3e9SJustin Hibbits /* Unicast addresses not supported in hash */
5900aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unicast Address"));
5910aeed3e9SJustin Hibbits
5920aeed3e9SJustin Hibbits /* CRC calculation */
593*852ba100SJustin Hibbits crc = GetMacAddrHashCode(ethAddr);
5940aeed3e9SJustin Hibbits
595*852ba100SJustin Hibbits hash = (crc >> TGEC_HASH_MCAST_SHIFT) & TGEC_HASH_ADR_MSK; /* Take 9 MSB bits */
5960aeed3e9SJustin Hibbits
5970aeed3e9SJustin Hibbits /* Create element to be added to the driver hash table */
5980aeed3e9SJustin Hibbits p_HashEntry = (t_EthHashEntry *)XX_Malloc(sizeof(t_EthHashEntry));
5990aeed3e9SJustin Hibbits p_HashEntry->addr = ethAddr;
6000aeed3e9SJustin Hibbits INIT_LIST(&p_HashEntry->node);
6010aeed3e9SJustin Hibbits
602*852ba100SJustin Hibbits NCSW_LIST_AddToTail(&(p_HashEntry->node), &(p_Tgec->p_MulticastAddrHash->p_Lsts[hash]));
603*852ba100SJustin Hibbits fman_tgec_set_hash_table(p_Tgec->p_MemMap, (hash | TGEC_HASH_MCAST_EN));
6040aeed3e9SJustin Hibbits
6050aeed3e9SJustin Hibbits return E_OK;
6060aeed3e9SJustin Hibbits }
6070aeed3e9SJustin Hibbits
608*852ba100SJustin Hibbits /* ......................................................................... */
6090aeed3e9SJustin Hibbits
TgecDelHashMacAddress(t_Handle h_Tgec,t_EnetAddr * p_EthAddr)6100aeed3e9SJustin Hibbits static t_Error TgecDelHashMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
6110aeed3e9SJustin Hibbits {
6120aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
6130aeed3e9SJustin Hibbits t_EthHashEntry *p_HashEntry = NULL;
6140aeed3e9SJustin Hibbits t_List *p_Pos;
6150aeed3e9SJustin Hibbits uint32_t crc;
6160aeed3e9SJustin Hibbits uint32_t hash;
6170aeed3e9SJustin Hibbits uint64_t ethAddr;
6180aeed3e9SJustin Hibbits
6190aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
620*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
6210aeed3e9SJustin Hibbits
6220aeed3e9SJustin Hibbits ethAddr = ((*(uint64_t *)p_EthAddr) >> 16);
6230aeed3e9SJustin Hibbits
6240aeed3e9SJustin Hibbits /* CRC calculation */
625*852ba100SJustin Hibbits crc = GetMacAddrHashCode(ethAddr);
6260aeed3e9SJustin Hibbits
627*852ba100SJustin Hibbits hash = (crc >> TGEC_HASH_MCAST_SHIFT) & TGEC_HASH_ADR_MSK; /* Take 9 MSB bits */
6280aeed3e9SJustin Hibbits
629*852ba100SJustin Hibbits NCSW_LIST_FOR_EACH(p_Pos, &(p_Tgec->p_MulticastAddrHash->p_Lsts[hash]))
6300aeed3e9SJustin Hibbits {
6310aeed3e9SJustin Hibbits p_HashEntry = ETH_HASH_ENTRY_OBJ(p_Pos);
6320aeed3e9SJustin Hibbits if (p_HashEntry->addr == ethAddr)
6330aeed3e9SJustin Hibbits {
634*852ba100SJustin Hibbits NCSW_LIST_DelAndInit(&p_HashEntry->node);
6350aeed3e9SJustin Hibbits XX_Free(p_HashEntry);
6360aeed3e9SJustin Hibbits break;
6370aeed3e9SJustin Hibbits }
6380aeed3e9SJustin Hibbits }
639*852ba100SJustin Hibbits if (NCSW_LIST_IsEmpty(&p_Tgec->p_MulticastAddrHash->p_Lsts[hash]))
640*852ba100SJustin Hibbits fman_tgec_set_hash_table(p_Tgec->p_MemMap, (hash & ~TGEC_HASH_MCAST_EN));
6410aeed3e9SJustin Hibbits
6420aeed3e9SJustin Hibbits return E_OK;
6430aeed3e9SJustin Hibbits }
6440aeed3e9SJustin Hibbits
645*852ba100SJustin Hibbits /* ......................................................................... */
6460aeed3e9SJustin Hibbits
TgecGetId(t_Handle h_Tgec,uint32_t * macId)6470aeed3e9SJustin Hibbits static t_Error TgecGetId(t_Handle h_Tgec, uint32_t *macId)
6480aeed3e9SJustin Hibbits {
6490aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
6500aeed3e9SJustin Hibbits
6510aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
652*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
6530aeed3e9SJustin Hibbits
6540aeed3e9SJustin Hibbits UNUSED(p_Tgec);
6550aeed3e9SJustin Hibbits UNUSED(macId);
6560aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("TgecGetId Not Supported"));
6570aeed3e9SJustin Hibbits }
6580aeed3e9SJustin Hibbits
659*852ba100SJustin Hibbits /* ......................................................................... */
6600aeed3e9SJustin Hibbits
TgecGetVersion(t_Handle h_Tgec,uint32_t * macVersion)6610aeed3e9SJustin Hibbits static t_Error TgecGetVersion(t_Handle h_Tgec, uint32_t *macVersion)
6620aeed3e9SJustin Hibbits {
6630aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
6640aeed3e9SJustin Hibbits
6650aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
666*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
6670aeed3e9SJustin Hibbits
668*852ba100SJustin Hibbits *macVersion = fman_tgec_get_revision(p_Tgec->p_MemMap);
6690aeed3e9SJustin Hibbits
6700aeed3e9SJustin Hibbits return E_OK;
6710aeed3e9SJustin Hibbits }
6720aeed3e9SJustin Hibbits
673*852ba100SJustin Hibbits /* ......................................................................... */
6740aeed3e9SJustin Hibbits
TgecSetExcpetion(t_Handle h_Tgec,e_FmMacExceptions exception,bool enable)6750aeed3e9SJustin Hibbits static t_Error TgecSetExcpetion(t_Handle h_Tgec, e_FmMacExceptions exception, bool enable)
6760aeed3e9SJustin Hibbits {
6770aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
678*852ba100SJustin Hibbits uint32_t bitMask = 0;
6790aeed3e9SJustin Hibbits
6800aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
681*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
6820aeed3e9SJustin Hibbits
6830aeed3e9SJustin Hibbits GET_EXCEPTION_FLAG(bitMask, exception);
6840aeed3e9SJustin Hibbits if (bitMask)
6850aeed3e9SJustin Hibbits {
6860aeed3e9SJustin Hibbits if (enable)
6870aeed3e9SJustin Hibbits p_Tgec->exceptions |= bitMask;
6880aeed3e9SJustin Hibbits else
6890aeed3e9SJustin Hibbits p_Tgec->exceptions &= ~bitMask;
6900aeed3e9SJustin Hibbits }
6910aeed3e9SJustin Hibbits else
6920aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
6930aeed3e9SJustin Hibbits
6940aeed3e9SJustin Hibbits if (enable)
695*852ba100SJustin Hibbits fman_tgec_enable_interrupt(p_Tgec->p_MemMap, bitMask);
6960aeed3e9SJustin Hibbits else
697*852ba100SJustin Hibbits fman_tgec_disable_interrupt(p_Tgec->p_MemMap, bitMask);
698*852ba100SJustin Hibbits
6990aeed3e9SJustin Hibbits return E_OK;
7000aeed3e9SJustin Hibbits }
7010aeed3e9SJustin Hibbits
702*852ba100SJustin Hibbits /* ......................................................................... */
7030aeed3e9SJustin Hibbits
TgecGetMaxFrameLength(t_Handle h_Tgec)7040aeed3e9SJustin Hibbits static uint16_t TgecGetMaxFrameLength(t_Handle h_Tgec)
7050aeed3e9SJustin Hibbits {
7060aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
7070aeed3e9SJustin Hibbits
7080aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_Tgec, E_INVALID_HANDLE, 0);
709*852ba100SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE, 0);
7100aeed3e9SJustin Hibbits
711*852ba100SJustin Hibbits return fman_tgec_get_max_frame_len(p_Tgec->p_MemMap);
7120aeed3e9SJustin Hibbits }
7130aeed3e9SJustin Hibbits
714*852ba100SJustin Hibbits /* ......................................................................... */
7150aeed3e9SJustin Hibbits
7160aeed3e9SJustin Hibbits #ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
TgecTxEccWorkaround(t_Tgec * p_Tgec)7170aeed3e9SJustin Hibbits static t_Error TgecTxEccWorkaround(t_Tgec *p_Tgec)
7180aeed3e9SJustin Hibbits {
7190aeed3e9SJustin Hibbits t_Error err;
7200aeed3e9SJustin Hibbits
721*852ba100SJustin Hibbits #if defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)
722*852ba100SJustin Hibbits XX_Print("Applying 10G TX ECC workaround (10GMAC-A004) ... ");
723*852ba100SJustin Hibbits #endif /* (DEBUG_ERRORS > 0) */
7240aeed3e9SJustin Hibbits /* enable and set promiscuous */
725*852ba100SJustin Hibbits fman_tgec_enable(p_Tgec->p_MemMap, TRUE, TRUE);
726*852ba100SJustin Hibbits fman_tgec_set_promiscuous(p_Tgec->p_MemMap, TRUE);
7270aeed3e9SJustin Hibbits err = Fm10GTxEccWorkaround(p_Tgec->fmMacControllerDriver.h_Fm, p_Tgec->macId);
7280aeed3e9SJustin Hibbits /* disable */
729*852ba100SJustin Hibbits fman_tgec_set_promiscuous(p_Tgec->p_MemMap, FALSE);
730*852ba100SJustin Hibbits fman_tgec_enable(p_Tgec->p_MemMap, FALSE, FALSE);
731*852ba100SJustin Hibbits fman_tgec_reset_stat(p_Tgec->p_MemMap);
732*852ba100SJustin Hibbits fman_tgec_ack_event(p_Tgec->p_MemMap, 0xffffffff);
733*852ba100SJustin Hibbits #if defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)
7340aeed3e9SJustin Hibbits if (err)
7350aeed3e9SJustin Hibbits XX_Print("FAILED!\n");
7360aeed3e9SJustin Hibbits else
7370aeed3e9SJustin Hibbits XX_Print("done.\n");
738*852ba100SJustin Hibbits #endif /* (DEBUG_ERRORS > 0) */
7390aeed3e9SJustin Hibbits
7400aeed3e9SJustin Hibbits return err;
7410aeed3e9SJustin Hibbits }
7420aeed3e9SJustin Hibbits #endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
7430aeed3e9SJustin Hibbits
7440aeed3e9SJustin Hibbits /*****************************************************************************/
7450aeed3e9SJustin Hibbits /* FM Init & Free API */
7460aeed3e9SJustin Hibbits /*****************************************************************************/
7470aeed3e9SJustin Hibbits
748*852ba100SJustin Hibbits /* ......................................................................... */
7490aeed3e9SJustin Hibbits
TgecInit(t_Handle h_Tgec)7500aeed3e9SJustin Hibbits static t_Error TgecInit(t_Handle h_Tgec)
7510aeed3e9SJustin Hibbits {
7520aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
753*852ba100SJustin Hibbits struct tgec_cfg *p_TgecDriverParam;
754*852ba100SJustin Hibbits t_EnetAddr ethAddr;
7550aeed3e9SJustin Hibbits t_Error err;
7560aeed3e9SJustin Hibbits
7570aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
7580aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
759*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec->fmMacControllerDriver.h_Fm, E_INVALID_HANDLE);
7600aeed3e9SJustin Hibbits
761*852ba100SJustin Hibbits FM_GetRevision(p_Tgec->fmMacControllerDriver.h_Fm, &p_Tgec->fmMacControllerDriver.fmRevInfo);
7620aeed3e9SJustin Hibbits CHECK_INIT_PARAMETERS(p_Tgec, CheckInitParameters);
7630aeed3e9SJustin Hibbits
7640aeed3e9SJustin Hibbits p_TgecDriverParam = p_Tgec->p_TgecDriverParam;
7650aeed3e9SJustin Hibbits
766*852ba100SJustin Hibbits MAKE_ENET_ADDR_FROM_UINT64(p_Tgec->addr, ethAddr);
767*852ba100SJustin Hibbits fman_tgec_set_mac_address(p_Tgec->p_MemMap, (uint8_t *)ethAddr);
7680aeed3e9SJustin Hibbits
769*852ba100SJustin Hibbits /* interrupts */
770*852ba100SJustin Hibbits #ifdef FM_10G_REM_N_LCL_FLT_EX_10GMAC_ERRATA_SW005
771*852ba100SJustin Hibbits {
772*852ba100SJustin Hibbits if (p_Tgec->fmMacControllerDriver.fmRevInfo.majorRev <=2)
773*852ba100SJustin Hibbits p_Tgec->exceptions &= ~(TGEC_IMASK_REM_FAULT | TGEC_IMASK_LOC_FAULT);
774*852ba100SJustin Hibbits }
775*852ba100SJustin Hibbits #endif /* FM_10G_REM_N_LCL_FLT_EX_10GMAC_ERRATA_SW005 */
7760aeed3e9SJustin Hibbits
777*852ba100SJustin Hibbits #ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
778*852ba100SJustin Hibbits if (!p_Tgec->p_TgecDriverParam->skip_fman11_workaround &&
779*852ba100SJustin Hibbits ((err = TgecTxEccWorkaround(p_Tgec)) != E_OK))
780*852ba100SJustin Hibbits {
781*852ba100SJustin Hibbits FreeInitResources(p_Tgec);
782*852ba100SJustin Hibbits REPORT_ERROR(MINOR, err, ("TgecTxEccWorkaround FAILED"));
783*852ba100SJustin Hibbits }
784*852ba100SJustin Hibbits #endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
7850aeed3e9SJustin Hibbits
786*852ba100SJustin Hibbits err = fman_tgec_init(p_Tgec->p_MemMap, p_TgecDriverParam, p_Tgec->exceptions);
7870aeed3e9SJustin Hibbits if (err)
7880aeed3e9SJustin Hibbits {
7890aeed3e9SJustin Hibbits FreeInitResources(p_Tgec);
790*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, ("This TGEC version does not support the required i/f mode"));
7910aeed3e9SJustin Hibbits }
7920aeed3e9SJustin Hibbits
793*852ba100SJustin Hibbits /* Max Frame Length */
794*852ba100SJustin Hibbits err = FmSetMacMaxFrame(p_Tgec->fmMacControllerDriver.h_Fm,
795*852ba100SJustin Hibbits e_FM_MAC_10G,
796*852ba100SJustin Hibbits p_Tgec->fmMacControllerDriver.macId,
797*852ba100SJustin Hibbits p_TgecDriverParam->max_frame_length);
798*852ba100SJustin Hibbits if (err != E_OK)
799*852ba100SJustin Hibbits {
800*852ba100SJustin Hibbits FreeInitResources(p_Tgec);
801*852ba100SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
802*852ba100SJustin Hibbits }
803*852ba100SJustin Hibbits /* we consider having no IPC a non crasher... */
8040aeed3e9SJustin Hibbits
8050aeed3e9SJustin Hibbits #ifdef FM_TX_FIFO_CORRUPTION_ERRATA_10GMAC_A007
806*852ba100SJustin Hibbits if (p_Tgec->fmMacControllerDriver.fmRevInfo.majorRev == 2)
807*852ba100SJustin Hibbits fman_tgec_set_erratum_tx_fifo_corruption_10gmac_a007(p_Tgec->p_MemMap);
8080aeed3e9SJustin Hibbits #endif /* FM_TX_FIFO_CORRUPTION_ERRATA_10GMAC_A007 */
8090aeed3e9SJustin Hibbits
8100aeed3e9SJustin Hibbits p_Tgec->p_MulticastAddrHash = AllocHashTable(HASH_TABLE_SIZE);
8110aeed3e9SJustin Hibbits if (!p_Tgec->p_MulticastAddrHash)
8120aeed3e9SJustin Hibbits {
8130aeed3e9SJustin Hibbits FreeInitResources(p_Tgec);
8140aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("allocation hash table is FAILED"));
8150aeed3e9SJustin Hibbits }
8160aeed3e9SJustin Hibbits
8170aeed3e9SJustin Hibbits p_Tgec->p_UnicastAddrHash = AllocHashTable(HASH_TABLE_SIZE);
8180aeed3e9SJustin Hibbits if (!p_Tgec->p_UnicastAddrHash)
8190aeed3e9SJustin Hibbits {
8200aeed3e9SJustin Hibbits FreeInitResources(p_Tgec);
8210aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("allocation hash table is FAILED"));
8220aeed3e9SJustin Hibbits }
8230aeed3e9SJustin Hibbits
824*852ba100SJustin Hibbits FmRegisterIntr(p_Tgec->fmMacControllerDriver.h_Fm,
825*852ba100SJustin Hibbits e_FM_MOD_10G_MAC,
826*852ba100SJustin Hibbits p_Tgec->macId,
827*852ba100SJustin Hibbits e_FM_INTR_TYPE_ERR,
828*852ba100SJustin Hibbits TgecErrException,
829*852ba100SJustin Hibbits p_Tgec);
830*852ba100SJustin Hibbits if (p_Tgec->mdioIrq != NO_IRQ)
8310aeed3e9SJustin Hibbits {
8320aeed3e9SJustin Hibbits XX_SetIntr(p_Tgec->mdioIrq, TgecException, p_Tgec);
8330aeed3e9SJustin Hibbits XX_EnableIntr(p_Tgec->mdioIrq);
8340aeed3e9SJustin Hibbits }
8350aeed3e9SJustin Hibbits
8360aeed3e9SJustin Hibbits XX_Free(p_TgecDriverParam);
8370aeed3e9SJustin Hibbits p_Tgec->p_TgecDriverParam = NULL;
8380aeed3e9SJustin Hibbits
8390aeed3e9SJustin Hibbits return E_OK;
8400aeed3e9SJustin Hibbits }
8410aeed3e9SJustin Hibbits
842*852ba100SJustin Hibbits /* ......................................................................... */
8430aeed3e9SJustin Hibbits
TgecFree(t_Handle h_Tgec)8440aeed3e9SJustin Hibbits static t_Error TgecFree(t_Handle h_Tgec)
8450aeed3e9SJustin Hibbits {
8460aeed3e9SJustin Hibbits t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
8470aeed3e9SJustin Hibbits
8480aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
8490aeed3e9SJustin Hibbits
8500aeed3e9SJustin Hibbits if (p_Tgec->p_TgecDriverParam)
8510aeed3e9SJustin Hibbits {
852*852ba100SJustin Hibbits /* Called after config */
8530aeed3e9SJustin Hibbits XX_Free(p_Tgec->p_TgecDriverParam);
8540aeed3e9SJustin Hibbits p_Tgec->p_TgecDriverParam = NULL;
8550aeed3e9SJustin Hibbits }
856*852ba100SJustin Hibbits else
857*852ba100SJustin Hibbits /* Called after init */
858*852ba100SJustin Hibbits FreeInitResources(p_Tgec);
859*852ba100SJustin Hibbits
8600aeed3e9SJustin Hibbits XX_Free(p_Tgec);
8610aeed3e9SJustin Hibbits
8620aeed3e9SJustin Hibbits return E_OK;
8630aeed3e9SJustin Hibbits }
8640aeed3e9SJustin Hibbits
865*852ba100SJustin Hibbits /* ......................................................................... */
8660aeed3e9SJustin Hibbits
InitFmMacControllerDriver(t_FmMacControllerDriver * p_FmMacControllerDriver)8670aeed3e9SJustin Hibbits static void InitFmMacControllerDriver(t_FmMacControllerDriver *p_FmMacControllerDriver)
8680aeed3e9SJustin Hibbits {
8690aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_Init = TgecInit;
8700aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_Free = TgecFree;
8710aeed3e9SJustin Hibbits
872*852ba100SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_SetStatistics = NULL;
8730aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ConfigLoopback = TgecConfigLoopback;
8740aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ConfigMaxFrameLength = TgecConfigMaxFrameLength;
8750aeed3e9SJustin Hibbits
8760aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ConfigWan = TgecConfigWan;
8770aeed3e9SJustin Hibbits
8780aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ConfigPadAndCrc = NULL; /* TGEC always works with pad+crc */
8790aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ConfigHalfDuplex = NULL; /* half-duplex is not supported in xgec */
8800aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ConfigLengthCheck = TgecConfigLengthCheck;
8810aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ConfigException = TgecConfigException;
882*852ba100SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit = NULL;
8830aeed3e9SJustin Hibbits
8840aeed3e9SJustin Hibbits #ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
8850aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ConfigSkipFman11Workaround= TgecConfigSkipFman11Workaround;
8860aeed3e9SJustin Hibbits #endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
8870aeed3e9SJustin Hibbits
8880aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_SetException = TgecSetExcpetion;
8890aeed3e9SJustin Hibbits
8900aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_Enable1588TimeStamp = TgecEnable1588TimeStamp;
8910aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_Disable1588TimeStamp = TgecDisable1588TimeStamp;
8920aeed3e9SJustin Hibbits
8930aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_SetPromiscuous = TgecSetPromiscuous;
8940aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_AdjustLink = NULL;
895*852ba100SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_SetWakeOnLan = NULL;
896*852ba100SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_RestartAutoneg = NULL;
8970aeed3e9SJustin Hibbits
8980aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_Enable = TgecEnable;
8990aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_Disable = TgecDisable;
900*852ba100SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_Resume = NULL;
9010aeed3e9SJustin Hibbits
9020aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames = TgecTxMacPause;
903*852ba100SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames = TgecSetTxPauseFrames;
9040aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_SetRxIgnorePauseFrames = TgecRxIgnoreMacPause;
9050aeed3e9SJustin Hibbits
9060aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ResetCounters = TgecResetCounters;
9070aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_GetStatistics = TgecGetStatistics;
9080aeed3e9SJustin Hibbits
9090aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_ModifyMacAddr = TgecModifyMacAddress;
9100aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_AddHashMacAddr = TgecAddHashMacAddress;
9110aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_RemoveHashMacAddr = TgecDelHashMacAddress;
9120aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_AddExactMatchMacAddr = TgecAddExactMatchMacAddress;
9130aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_RemovelExactMatchMacAddr = TgecDelExactMatchMacAddress;
9140aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_GetId = TgecGetId;
9150aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_GetVersion = TgecGetVersion;
9160aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_GetMaxFrameLength = TgecGetMaxFrameLength;
9170aeed3e9SJustin Hibbits
9180aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_MII_WritePhyReg = TGEC_MII_WritePhyReg;
9190aeed3e9SJustin Hibbits p_FmMacControllerDriver->f_FM_MAC_MII_ReadPhyReg = TGEC_MII_ReadPhyReg;
9200aeed3e9SJustin Hibbits }
9210aeed3e9SJustin Hibbits
9220aeed3e9SJustin Hibbits
9230aeed3e9SJustin Hibbits /*****************************************************************************/
9240aeed3e9SJustin Hibbits /* Tgec Config Main Entry */
9250aeed3e9SJustin Hibbits /*****************************************************************************/
9260aeed3e9SJustin Hibbits
927*852ba100SJustin Hibbits /* ......................................................................... */
9280aeed3e9SJustin Hibbits
TGEC_Config(t_FmMacParams * p_FmMacParam)9290aeed3e9SJustin Hibbits t_Handle TGEC_Config(t_FmMacParams *p_FmMacParam)
9300aeed3e9SJustin Hibbits {
9310aeed3e9SJustin Hibbits t_Tgec *p_Tgec;
932*852ba100SJustin Hibbits struct tgec_cfg *p_TgecDriverParam;
9330aeed3e9SJustin Hibbits uintptr_t baseAddr;
9340aeed3e9SJustin Hibbits
9350aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_FmMacParam, E_NULL_POINTER, NULL);
9360aeed3e9SJustin Hibbits
9370aeed3e9SJustin Hibbits baseAddr = p_FmMacParam->baseAddr;
9380aeed3e9SJustin Hibbits /* allocate memory for the UCC GETH data structure. */
9390aeed3e9SJustin Hibbits p_Tgec = (t_Tgec *)XX_Malloc(sizeof(t_Tgec));
9400aeed3e9SJustin Hibbits if (!p_Tgec)
9410aeed3e9SJustin Hibbits {
9420aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("10G MAC driver structure"));
9430aeed3e9SJustin Hibbits return NULL;
9440aeed3e9SJustin Hibbits }
9450aeed3e9SJustin Hibbits memset(p_Tgec, 0, sizeof(t_Tgec));
9460aeed3e9SJustin Hibbits InitFmMacControllerDriver(&p_Tgec->fmMacControllerDriver);
9470aeed3e9SJustin Hibbits
9480aeed3e9SJustin Hibbits /* allocate memory for the 10G MAC driver parameters data structure. */
949*852ba100SJustin Hibbits p_TgecDriverParam = (struct tgec_cfg *) XX_Malloc(sizeof(struct tgec_cfg));
9500aeed3e9SJustin Hibbits if (!p_TgecDriverParam)
9510aeed3e9SJustin Hibbits {
9520aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("10G MAC driver parameters"));
953*852ba100SJustin Hibbits XX_Free(p_Tgec);
9540aeed3e9SJustin Hibbits return NULL;
9550aeed3e9SJustin Hibbits }
956*852ba100SJustin Hibbits memset(p_TgecDriverParam, 0, sizeof(struct tgec_cfg));
9570aeed3e9SJustin Hibbits
9580aeed3e9SJustin Hibbits /* Plant parameter structure pointer */
9590aeed3e9SJustin Hibbits p_Tgec->p_TgecDriverParam = p_TgecDriverParam;
9600aeed3e9SJustin Hibbits
961*852ba100SJustin Hibbits fman_tgec_defconfig(p_TgecDriverParam);
9620aeed3e9SJustin Hibbits
963*852ba100SJustin Hibbits p_Tgec->p_MemMap = (struct tgec_regs *)UINT_TO_PTR(baseAddr);
9640aeed3e9SJustin Hibbits p_Tgec->p_MiiMemMap = (t_TgecMiiAccessMemMap *)UINT_TO_PTR(baseAddr + TGEC_TO_MII_OFFSET);
965*852ba100SJustin Hibbits p_Tgec->addr = ENET_ADDR_TO_UINT64(p_FmMacParam->addr);
9660aeed3e9SJustin Hibbits p_Tgec->enetMode = p_FmMacParam->enetMode;
9670aeed3e9SJustin Hibbits p_Tgec->macId = p_FmMacParam->macId;
9680aeed3e9SJustin Hibbits p_Tgec->exceptions = DEFAULT_exceptions;
9690aeed3e9SJustin Hibbits p_Tgec->mdioIrq = p_FmMacParam->mdioIrq;
9700aeed3e9SJustin Hibbits p_Tgec->f_Exception = p_FmMacParam->f_Exception;
9710aeed3e9SJustin Hibbits p_Tgec->f_Event = p_FmMacParam->f_Event;
9720aeed3e9SJustin Hibbits p_Tgec->h_App = p_FmMacParam->h_App;
9730aeed3e9SJustin Hibbits
9740aeed3e9SJustin Hibbits return p_Tgec;
9750aeed3e9SJustin Hibbits }
976