xref: /freebsd-src/sys/contrib/ncsw/inc/enet_ext.h (revision c2c014f24c10f90d85126ac5fbd4d8524de32b1c)
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