1*852ba100SJustin Hibbits /* Copyright (c) 2008-2012 Freescale Semiconductor, Inc 20aeed3e9SJustin Hibbits * All rights reserved. 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 enet_ext.h 360aeed3e9SJustin Hibbits 370aeed3e9SJustin Hibbits @Description Ethernet generic definitions and enums. 380aeed3e9SJustin Hibbits *//***************************************************************************/ 390aeed3e9SJustin Hibbits 400aeed3e9SJustin Hibbits #ifndef __ENET_EXT_H 410aeed3e9SJustin Hibbits #define __ENET_EXT_H 420aeed3e9SJustin Hibbits 43*852ba100SJustin Hibbits #include "fsl_enet.h" 440aeed3e9SJustin Hibbits 450aeed3e9SJustin Hibbits #define ENET_NUM_OCTETS_PER_ADDRESS 6 /**< Number of octets (8-bit bytes) in an ethernet address */ 460aeed3e9SJustin Hibbits #define ENET_GROUP_ADDR 0x01 /**< Group address mask for ethernet addresses */ 470aeed3e9SJustin Hibbits 480aeed3e9SJustin Hibbits 490aeed3e9SJustin Hibbits /**************************************************************************//** 500aeed3e9SJustin Hibbits @Description Ethernet Address 510aeed3e9SJustin Hibbits *//***************************************************************************/ 520aeed3e9SJustin Hibbits typedef uint8_t t_EnetAddr[ENET_NUM_OCTETS_PER_ADDRESS]; 530aeed3e9SJustin Hibbits 540aeed3e9SJustin Hibbits /**************************************************************************//** 550aeed3e9SJustin Hibbits @Description Ethernet Address Type. 560aeed3e9SJustin Hibbits *//***************************************************************************/ 570aeed3e9SJustin Hibbits typedef enum e_EnetAddrType 580aeed3e9SJustin Hibbits { 590aeed3e9SJustin Hibbits e_ENET_ADDR_TYPE_INDIVIDUAL, /**< Individual (unicast) address */ 600aeed3e9SJustin Hibbits e_ENET_ADDR_TYPE_GROUP, /**< Group (multicast) address */ 610aeed3e9SJustin Hibbits e_ENET_ADDR_TYPE_BROADCAST /**< Broadcast address */ 620aeed3e9SJustin Hibbits } e_EnetAddrType; 630aeed3e9SJustin Hibbits 640aeed3e9SJustin Hibbits /**************************************************************************//** 650aeed3e9SJustin Hibbits @Description Ethernet MAC-PHY Interface 660aeed3e9SJustin Hibbits *//***************************************************************************/ 670aeed3e9SJustin Hibbits typedef enum e_EnetInterface 680aeed3e9SJustin Hibbits { 69*852ba100SJustin Hibbits e_ENET_IF_MII = E_ENET_IF_MII, /**< MII interface */ 70*852ba100SJustin Hibbits e_ENET_IF_RMII = E_ENET_IF_RMII, /**< RMII interface */ 71*852ba100SJustin Hibbits e_ENET_IF_SMII = E_ENET_IF_SMII, /**< SMII interface */ 72*852ba100SJustin Hibbits e_ENET_IF_GMII = E_ENET_IF_GMII, /**< GMII interface */ 73*852ba100SJustin Hibbits e_ENET_IF_RGMII = E_ENET_IF_RGMII, /**< RGMII interface */ 74*852ba100SJustin Hibbits e_ENET_IF_TBI = E_ENET_IF_TBI, /**< TBI interface */ 75*852ba100SJustin Hibbits e_ENET_IF_RTBI = E_ENET_IF_RTBI, /**< RTBI interface */ 76*852ba100SJustin Hibbits e_ENET_IF_SGMII = E_ENET_IF_SGMII, /**< SGMII interface */ 77*852ba100SJustin Hibbits e_ENET_IF_XGMII = E_ENET_IF_XGMII, /**< XGMII interface */ 78*852ba100SJustin Hibbits e_ENET_IF_QSGMII= E_ENET_IF_QSGMII, /**< QSGMII interface */ 79*852ba100SJustin Hibbits e_ENET_IF_XFI = E_ENET_IF_XFI /**< XFI interface */ 800aeed3e9SJustin Hibbits } e_EnetInterface; 810aeed3e9SJustin Hibbits 82*852ba100SJustin Hibbits #define ENET_IF_SGMII_BASEX 0x80000000 /**< SGMII/QSGII interface with 1000BaseX 83*852ba100SJustin Hibbits auto-negotiation between MAC and phy 84*852ba100SJustin Hibbits or backplane; 85*852ba100SJustin Hibbits Note: 1000BaseX auto-negotiation relates 86*852ba100SJustin Hibbits only to interface between MAC and phy/backplane, 87*852ba100SJustin Hibbits SGMII phy can still synchronize with far-end phy 88*852ba100SJustin Hibbits at 10Mbps, 100Mbps or 1000Mbps */ 89*852ba100SJustin Hibbits 900aeed3e9SJustin Hibbits /**************************************************************************//** 910aeed3e9SJustin Hibbits @Description Ethernet Duplex Mode 920aeed3e9SJustin Hibbits *//***************************************************************************/ 930aeed3e9SJustin Hibbits typedef enum e_EnetDuplexMode 940aeed3e9SJustin Hibbits { 950aeed3e9SJustin Hibbits e_ENET_HALF_DUPLEX, /**< Half-Duplex mode */ 960aeed3e9SJustin Hibbits e_ENET_FULL_DUPLEX /**< Full-Duplex mode */ 970aeed3e9SJustin Hibbits } e_EnetDuplexMode; 980aeed3e9SJustin Hibbits 990aeed3e9SJustin Hibbits /**************************************************************************//** 1000aeed3e9SJustin Hibbits @Description Ethernet Speed (nominal data rate) 1010aeed3e9SJustin Hibbits *//***************************************************************************/ 1020aeed3e9SJustin Hibbits typedef enum e_EnetSpeed 1030aeed3e9SJustin Hibbits { 104*852ba100SJustin Hibbits e_ENET_SPEED_10 = E_ENET_SPEED_10, /**< 10 Mbps */ 105*852ba100SJustin Hibbits e_ENET_SPEED_100 = E_ENET_SPEED_100, /**< 100 Mbps */ 106*852ba100SJustin Hibbits e_ENET_SPEED_1000 = E_ENET_SPEED_1000, /**< 1000 Mbps = 1 Gbps */ 107*852ba100SJustin Hibbits e_ENET_SPEED_2500 = E_ENET_SPEED_2500, /**< 2500 Mbps = 2.5 Gbps */ 108*852ba100SJustin Hibbits e_ENET_SPEED_10000 = E_ENET_SPEED_10000 /**< 10000 Mbps = 10 Gbps */ 1090aeed3e9SJustin Hibbits } e_EnetSpeed; 1100aeed3e9SJustin Hibbits 1110aeed3e9SJustin Hibbits /**************************************************************************//** 1120aeed3e9SJustin Hibbits @Description Ethernet mode (combination of MAC-PHY interface and speed) 1130aeed3e9SJustin Hibbits *//***************************************************************************/ 1140aeed3e9SJustin Hibbits typedef enum e_EnetMode 1150aeed3e9SJustin Hibbits { 1160aeed3e9SJustin Hibbits e_ENET_MODE_INVALID = 0, /**< Invalid Ethernet mode */ 1170aeed3e9SJustin Hibbits e_ENET_MODE_MII_10 = (e_ENET_IF_MII | e_ENET_SPEED_10), /**< 10 Mbps MII */ 1180aeed3e9SJustin Hibbits e_ENET_MODE_MII_100 = (e_ENET_IF_MII | e_ENET_SPEED_100), /**< 100 Mbps MII */ 1190aeed3e9SJustin Hibbits e_ENET_MODE_RMII_10 = (e_ENET_IF_RMII | e_ENET_SPEED_10), /**< 10 Mbps RMII */ 1200aeed3e9SJustin Hibbits e_ENET_MODE_RMII_100 = (e_ENET_IF_RMII | e_ENET_SPEED_100), /**< 100 Mbps RMII */ 1210aeed3e9SJustin Hibbits e_ENET_MODE_SMII_10 = (e_ENET_IF_SMII | e_ENET_SPEED_10), /**< 10 Mbps SMII */ 1220aeed3e9SJustin Hibbits e_ENET_MODE_SMII_100 = (e_ENET_IF_SMII | e_ENET_SPEED_100), /**< 100 Mbps SMII */ 1230aeed3e9SJustin Hibbits e_ENET_MODE_GMII_1000 = (e_ENET_IF_GMII | e_ENET_SPEED_1000), /**< 1000 Mbps GMII */ 1240aeed3e9SJustin Hibbits e_ENET_MODE_RGMII_10 = (e_ENET_IF_RGMII | e_ENET_SPEED_10), /**< 10 Mbps RGMII */ 1250aeed3e9SJustin Hibbits e_ENET_MODE_RGMII_100 = (e_ENET_IF_RGMII | e_ENET_SPEED_100), /**< 100 Mbps RGMII */ 1260aeed3e9SJustin Hibbits e_ENET_MODE_RGMII_1000 = (e_ENET_IF_RGMII | e_ENET_SPEED_1000), /**< 1000 Mbps RGMII */ 1270aeed3e9SJustin Hibbits e_ENET_MODE_TBI_1000 = (e_ENET_IF_TBI | e_ENET_SPEED_1000), /**< 1000 Mbps TBI */ 1280aeed3e9SJustin Hibbits e_ENET_MODE_RTBI_1000 = (e_ENET_IF_RTBI | e_ENET_SPEED_1000), /**< 1000 Mbps RTBI */ 129*852ba100SJustin Hibbits e_ENET_MODE_SGMII_10 = (e_ENET_IF_SGMII | e_ENET_SPEED_10), 130*852ba100SJustin Hibbits /**< 10 Mbps SGMII with auto-negotiation between MAC and 131*852ba100SJustin Hibbits SGMII phy according to Cisco SGMII specification */ 132*852ba100SJustin Hibbits e_ENET_MODE_SGMII_100 = (e_ENET_IF_SGMII | e_ENET_SPEED_100), 133*852ba100SJustin Hibbits /**< 100 Mbps SGMII with auto-negotiation between MAC and 134*852ba100SJustin Hibbits SGMII phy according to Cisco SGMII specification */ 135*852ba100SJustin Hibbits e_ENET_MODE_SGMII_1000 = (e_ENET_IF_SGMII | e_ENET_SPEED_1000), 136*852ba100SJustin Hibbits /**< 1000 Mbps SGMII with auto-negotiation between MAC and 137*852ba100SJustin Hibbits SGMII phy according to Cisco SGMII specification */ 138*852ba100SJustin Hibbits e_ENET_MODE_SGMII_2500 = (e_ENET_IF_SGMII | e_ENET_SPEED_2500), 139*852ba100SJustin Hibbits e_ENET_MODE_SGMII_BASEX_10 = (ENET_IF_SGMII_BASEX | e_ENET_IF_SGMII | e_ENET_SPEED_10), 140*852ba100SJustin Hibbits /**< 10 Mbps SGMII with 1000BaseX auto-negotiation between 141*852ba100SJustin Hibbits MAC and SGMII phy or backplane */ 142*852ba100SJustin Hibbits e_ENET_MODE_SGMII_BASEX_100 = (ENET_IF_SGMII_BASEX | e_ENET_IF_SGMII | e_ENET_SPEED_100), 143*852ba100SJustin Hibbits /**< 100 Mbps SGMII with 1000BaseX auto-negotiation between 144*852ba100SJustin Hibbits MAC and SGMII phy or backplane */ 145*852ba100SJustin Hibbits e_ENET_MODE_SGMII_BASEX_1000 = (ENET_IF_SGMII_BASEX | e_ENET_IF_SGMII | e_ENET_SPEED_1000), 146*852ba100SJustin Hibbits /**< 1000 Mbps SGMII with 1000BaseX auto-negotiation between 147*852ba100SJustin Hibbits MAC and SGMII phy or backplane */ 148*852ba100SJustin Hibbits e_ENET_MODE_QSGMII_1000 = (e_ENET_IF_QSGMII| e_ENET_SPEED_1000), 149*852ba100SJustin Hibbits /**< 1000 Mbps QSGMII with auto-negotiation between MAC and 150*852ba100SJustin Hibbits QSGMII phy according to Cisco QSGMII specification */ 151*852ba100SJustin Hibbits e_ENET_MODE_QSGMII_BASEX_1000 = (ENET_IF_SGMII_BASEX | e_ENET_IF_QSGMII| e_ENET_SPEED_1000), 152*852ba100SJustin Hibbits /**< 1000 Mbps QSGMII with 1000BaseX auto-negotiation between 153*852ba100SJustin Hibbits MAC and QSGMII phy or backplane */ 1540aeed3e9SJustin Hibbits e_ENET_MODE_XGMII_10000 = (e_ENET_IF_XGMII | e_ENET_SPEED_10000), /**< 10000 Mbps XGMII */ 155*852ba100SJustin Hibbits e_ENET_MODE_XFI_10000 = (e_ENET_IF_XFI | e_ENET_SPEED_10000) /**< 10000 Mbps XFI */ 1560aeed3e9SJustin Hibbits } e_EnetMode; 1570aeed3e9SJustin Hibbits 1580aeed3e9SJustin Hibbits 1590aeed3e9SJustin Hibbits #define IS_ENET_MODE_VALID(mode) \ 1600aeed3e9SJustin Hibbits (((mode) == e_ENET_MODE_MII_10 ) || \ 1610aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_MII_100 ) || \ 1620aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_RMII_10 ) || \ 1630aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_RMII_100 ) || \ 1640aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_SMII_10 ) || \ 1650aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_SMII_100 ) || \ 1660aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_GMII_1000 ) || \ 1670aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_RGMII_10 ) || \ 1680aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_RGMII_100 ) || \ 1690aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_RGMII_1000 ) || \ 1700aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_TBI_1000 ) || \ 1710aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_RTBI_1000 ) || \ 1720aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_SGMII_10 ) || \ 1730aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_SGMII_100 ) || \ 1740aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_SGMII_1000 ) || \ 175*852ba100SJustin Hibbits ((mode) == e_ENET_MODE_SGMII_BASEX_10 ) || \ 176*852ba100SJustin Hibbits ((mode) == e_ENET_MODE_SGMII_BASEX_100 ) || \ 177*852ba100SJustin Hibbits ((mode) == e_ENET_MODE_SGMII_BASEX_1000 ) || \ 1780aeed3e9SJustin Hibbits ((mode) == e_ENET_MODE_XGMII_10000) || \ 179*852ba100SJustin Hibbits ((mode) == e_ENET_MODE_QSGMII_1000) || \ 180*852ba100SJustin Hibbits ((mode) == e_ENET_MODE_QSGMII_BASEX_1000) || \ 181*852ba100SJustin Hibbits ((mode) == e_ENET_MODE_XFI_10000)) 1820aeed3e9SJustin Hibbits 1830aeed3e9SJustin Hibbits 1840aeed3e9SJustin Hibbits #define MAKE_ENET_MODE(_interface, _speed) (e_EnetMode)((_interface) | (_speed)) 1850aeed3e9SJustin Hibbits 186*852ba100SJustin Hibbits #define ENET_INTERFACE_FROM_MODE(mode) (e_EnetInterface)((mode) & 0x0FFF0000) 1870aeed3e9SJustin Hibbits #define ENET_SPEED_FROM_MODE(mode) (e_EnetSpeed)((mode) & 0x0000FFFF) 1880aeed3e9SJustin Hibbits 189*852ba100SJustin Hibbits #define ENET_ADDR_TO_UINT64(_enetAddr) \ 190*852ba100SJustin Hibbits (uint64_t)(((uint64_t)(_enetAddr)[0] << 40) | \ 191*852ba100SJustin Hibbits ((uint64_t)(_enetAddr)[1] << 32) | \ 192*852ba100SJustin Hibbits ((uint64_t)(_enetAddr)[2] << 24) | \ 193*852ba100SJustin Hibbits ((uint64_t)(_enetAddr)[3] << 16) | \ 194*852ba100SJustin Hibbits ((uint64_t)(_enetAddr)[4] << 8) | \ 195*852ba100SJustin Hibbits ((uint64_t)(_enetAddr)[5])) 196*852ba100SJustin Hibbits 197*852ba100SJustin Hibbits #define MAKE_ENET_ADDR_FROM_UINT64(_addr64, _enetAddr) \ 198*852ba100SJustin Hibbits do { \ 199*852ba100SJustin Hibbits int i; \ 200*852ba100SJustin Hibbits for (i=0; i < ENET_NUM_OCTETS_PER_ADDRESS; i++) \ 201*852ba100SJustin Hibbits (_enetAddr)[i] = (uint8_t)((_addr64) >> ((5-i)*8)); \ 202*852ba100SJustin Hibbits } while (0) 2030aeed3e9SJustin Hibbits 2040aeed3e9SJustin Hibbits 2050aeed3e9SJustin Hibbits #endif /* __ENET_EXT_H */ 206