Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /****************************************************************************/
0003 
0004 /*
0005  *  fec.h  --  Fast Ethernet Controller for Motorola ColdFire SoC
0006  *         processors.
0007  *
0008  *  (C) Copyright 2000-2005, Greg Ungerer (gerg@snapgear.com)
0009  *  (C) Copyright 2000-2001, Lineo (www.lineo.com)
0010  */
0011 
0012 /****************************************************************************/
0013 #ifndef FEC_H
0014 #define FEC_H
0015 /****************************************************************************/
0016 
0017 #include <linux/clocksource.h>
0018 #include <linux/net_tstamp.h>
0019 #include <linux/pm_qos.h>
0020 #include <linux/ptp_clock_kernel.h>
0021 #include <linux/timecounter.h>
0022 
0023 #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
0024     defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARM) || \
0025     defined(CONFIG_ARM64) || defined(CONFIG_COMPILE_TEST)
0026 /*
0027  *  Just figures, Motorola would have to change the offsets for
0028  *  registers in the same peripheral device on different models
0029  *  of the ColdFire!
0030  */
0031 #define FEC_IEVENT      0x004 /* Interrupt event reg */
0032 #define FEC_IMASK       0x008 /* Interrupt mask reg */
0033 #define FEC_R_DES_ACTIVE_0  0x010 /* Receive descriptor reg */
0034 #define FEC_X_DES_ACTIVE_0  0x014 /* Transmit descriptor reg */
0035 #define FEC_ECNTRL      0x024 /* Ethernet control reg */
0036 #define FEC_MII_DATA        0x040 /* MII manage frame reg */
0037 #define FEC_MII_SPEED       0x044 /* MII speed control reg */
0038 #define FEC_MIB_CTRLSTAT    0x064 /* MIB control/status reg */
0039 #define FEC_R_CNTRL     0x084 /* Receive control reg */
0040 #define FEC_X_CNTRL     0x0c4 /* Transmit Control reg */
0041 #define FEC_ADDR_LOW        0x0e4 /* Low 32bits MAC address */
0042 #define FEC_ADDR_HIGH       0x0e8 /* High 16bits MAC address */
0043 #define FEC_OPD         0x0ec /* Opcode + Pause duration */
0044 #define FEC_TXIC0       0x0f0 /* Tx Interrupt Coalescing for ring 0 */
0045 #define FEC_TXIC1       0x0f4 /* Tx Interrupt Coalescing for ring 1 */
0046 #define FEC_TXIC2       0x0f8 /* Tx Interrupt Coalescing for ring 2 */
0047 #define FEC_RXIC0       0x100 /* Rx Interrupt Coalescing for ring 0 */
0048 #define FEC_RXIC1       0x104 /* Rx Interrupt Coalescing for ring 1 */
0049 #define FEC_RXIC2       0x108 /* Rx Interrupt Coalescing for ring 2 */
0050 #define FEC_HASH_TABLE_HIGH 0x118 /* High 32bits hash table */
0051 #define FEC_HASH_TABLE_LOW  0x11c /* Low 32bits hash table */
0052 #define FEC_GRP_HASH_TABLE_HIGH 0x120 /* High 32bits hash table */
0053 #define FEC_GRP_HASH_TABLE_LOW  0x124 /* Low 32bits hash table */
0054 #define FEC_X_WMRK      0x144 /* FIFO transmit water mark */
0055 #define FEC_R_BOUND     0x14c /* FIFO receive bound reg */
0056 #define FEC_R_FSTART        0x150 /* FIFO receive start reg */
0057 #define FEC_R_DES_START_1   0x160 /* Receive descriptor ring 1 */
0058 #define FEC_X_DES_START_1   0x164 /* Transmit descriptor ring 1 */
0059 #define FEC_R_BUFF_SIZE_1   0x168 /* Maximum receive buff ring1 size */
0060 #define FEC_R_DES_START_2   0x16c /* Receive descriptor ring 2 */
0061 #define FEC_X_DES_START_2   0x170 /* Transmit descriptor ring 2 */
0062 #define FEC_R_BUFF_SIZE_2   0x174 /* Maximum receive buff ring2 size */
0063 #define FEC_R_DES_START_0   0x180 /* Receive descriptor ring */
0064 #define FEC_X_DES_START_0   0x184 /* Transmit descriptor ring */
0065 #define FEC_R_BUFF_SIZE_0   0x188 /* Maximum receive buff size */
0066 #define FEC_R_FIFO_RSFL     0x190 /* Receive FIFO section full threshold */
0067 #define FEC_R_FIFO_RSEM     0x194 /* Receive FIFO section empty threshold */
0068 #define FEC_R_FIFO_RAEM     0x198 /* Receive FIFO almost empty threshold */
0069 #define FEC_R_FIFO_RAFL     0x19c /* Receive FIFO almost full threshold */
0070 #define FEC_FTRL        0x1b0 /* Frame truncation receive length*/
0071 #define FEC_RACC        0x1c4 /* Receive Accelerator function */
0072 #define FEC_RCMR_1      0x1c8 /* Receive classification match ring 1 */
0073 #define FEC_RCMR_2      0x1cc /* Receive classification match ring 2 */
0074 #define FEC_DMA_CFG_1       0x1d8 /* DMA class configuration for ring 1 */
0075 #define FEC_DMA_CFG_2       0x1dc /* DMA class Configuration for ring 2 */
0076 #define FEC_R_DES_ACTIVE_1  0x1e0 /* Rx descriptor active for ring 1 */
0077 #define FEC_X_DES_ACTIVE_1  0x1e4 /* Tx descriptor active for ring 1 */
0078 #define FEC_R_DES_ACTIVE_2  0x1e8 /* Rx descriptor active for ring 2 */
0079 #define FEC_X_DES_ACTIVE_2  0x1ec /* Tx descriptor active for ring 2 */
0080 #define FEC_QOS_SCHEME      0x1f0 /* Set multi queues Qos scheme */
0081 #define FEC_LPI_SLEEP       0x1f4 /* Set IEEE802.3az LPI Sleep Ts time */
0082 #define FEC_LPI_WAKE        0x1f8 /* Set IEEE802.3az LPI Wake Tw time */
0083 #define FEC_MIIGSK_CFGR     0x300 /* MIIGSK Configuration reg */
0084 #define FEC_MIIGSK_ENR      0x308 /* MIIGSK Enable reg */
0085 
0086 #define BM_MIIGSK_CFGR_MII      0x00
0087 #define BM_MIIGSK_CFGR_RMII     0x01
0088 #define BM_MIIGSK_CFGR_FRCONT_10M   0x40
0089 
0090 #define RMON_T_DROP     0x200 /* Count of frames not cntd correctly */
0091 #define RMON_T_PACKETS      0x204 /* RMON TX packet count */
0092 #define RMON_T_BC_PKT       0x208 /* RMON TX broadcast pkts */
0093 #define RMON_T_MC_PKT       0x20c /* RMON TX multicast pkts */
0094 #define RMON_T_CRC_ALIGN    0x210 /* RMON TX pkts with CRC align err */
0095 #define RMON_T_UNDERSIZE    0x214 /* RMON TX pkts < 64 bytes, good CRC */
0096 #define RMON_T_OVERSIZE     0x218 /* RMON TX pkts > MAX_FL bytes good CRC */
0097 #define RMON_T_FRAG     0x21c /* RMON TX pkts < 64 bytes, bad CRC */
0098 #define RMON_T_JAB      0x220 /* RMON TX pkts > MAX_FL bytes, bad CRC */
0099 #define RMON_T_COL      0x224 /* RMON TX collision count */
0100 #define RMON_T_P64      0x228 /* RMON TX 64 byte pkts */
0101 #define RMON_T_P65TO127     0x22c /* RMON TX 65 to 127 byte pkts */
0102 #define RMON_T_P128TO255    0x230 /* RMON TX 128 to 255 byte pkts */
0103 #define RMON_T_P256TO511    0x234 /* RMON TX 256 to 511 byte pkts */
0104 #define RMON_T_P512TO1023   0x238 /* RMON TX 512 to 1023 byte pkts */
0105 #define RMON_T_P1024TO2047  0x23c /* RMON TX 1024 to 2047 byte pkts */
0106 #define RMON_T_P_GTE2048    0x240 /* RMON TX pkts > 2048 bytes */
0107 #define RMON_T_OCTETS       0x244 /* RMON TX octets */
0108 #define IEEE_T_DROP     0x248 /* Count of frames not counted crtly */
0109 #define IEEE_T_FRAME_OK     0x24c /* Frames tx'd OK */
0110 #define IEEE_T_1COL     0x250 /* Frames tx'd with single collision */
0111 #define IEEE_T_MCOL     0x254 /* Frames tx'd with multiple collision */
0112 #define IEEE_T_DEF      0x258 /* Frames tx'd after deferral delay */
0113 #define IEEE_T_LCOL     0x25c /* Frames tx'd with late collision */
0114 #define IEEE_T_EXCOL        0x260 /* Frames tx'd with excesv collisions */
0115 #define IEEE_T_MACERR       0x264 /* Frames tx'd with TX FIFO underrun */
0116 #define IEEE_T_CSERR        0x268 /* Frames tx'd with carrier sense err */
0117 #define IEEE_T_SQE      0x26c /* Frames tx'd with SQE err */
0118 #define IEEE_T_FDXFC        0x270 /* Flow control pause frames tx'd */
0119 #define IEEE_T_OCTETS_OK    0x274 /* Octet count for frames tx'd w/o err */
0120 #define RMON_R_PACKETS      0x284 /* RMON RX packet count */
0121 #define RMON_R_BC_PKT       0x288 /* RMON RX broadcast pkts */
0122 #define RMON_R_MC_PKT       0x28c /* RMON RX multicast pkts */
0123 #define RMON_R_CRC_ALIGN    0x290 /* RMON RX pkts with CRC alignment err */
0124 #define RMON_R_UNDERSIZE    0x294 /* RMON RX pkts < 64 bytes, good CRC */
0125 #define RMON_R_OVERSIZE     0x298 /* RMON RX pkts > MAX_FL bytes good CRC */
0126 #define RMON_R_FRAG     0x29c /* RMON RX pkts < 64 bytes, bad CRC */
0127 #define RMON_R_JAB      0x2a0 /* RMON RX pkts > MAX_FL bytes, bad CRC */
0128 #define RMON_R_RESVD_O      0x2a4 /* Reserved */
0129 #define RMON_R_P64      0x2a8 /* RMON RX 64 byte pkts */
0130 #define RMON_R_P65TO127     0x2ac /* RMON RX 65 to 127 byte pkts */
0131 #define RMON_R_P128TO255    0x2b0 /* RMON RX 128 to 255 byte pkts */
0132 #define RMON_R_P256TO511    0x2b4 /* RMON RX 256 to 511 byte pkts */
0133 #define RMON_R_P512TO1023   0x2b8 /* RMON RX 512 to 1023 byte pkts */
0134 #define RMON_R_P1024TO2047  0x2bc /* RMON RX 1024 to 2047 byte pkts */
0135 #define RMON_R_P_GTE2048    0x2c0 /* RMON RX pkts > 2048 bytes */
0136 #define RMON_R_OCTETS       0x2c4 /* RMON RX octets */
0137 #define IEEE_R_DROP     0x2c8 /* Count frames not counted correctly */
0138 #define IEEE_R_FRAME_OK     0x2cc /* Frames rx'd OK */
0139 #define IEEE_R_CRC      0x2d0 /* Frames rx'd with CRC err */
0140 #define IEEE_R_ALIGN        0x2d4 /* Frames rx'd with alignment err */
0141 #define IEEE_R_MACERR       0x2d8 /* Receive FIFO overflow count */
0142 #define IEEE_R_FDXFC        0x2dc /* Flow control pause frames rx'd */
0143 #define IEEE_R_OCTETS_OK    0x2e0 /* Octet cnt for frames rx'd w/o err */
0144 
0145 #else
0146 
0147 #define FEC_ECNTRL      0x000 /* Ethernet control reg */
0148 #define FEC_IEVENT      0x004 /* Interrupt even reg */
0149 #define FEC_IMASK       0x008 /* Interrupt mask reg */
0150 #define FEC_IVEC        0x00c /* Interrupt vec status reg */
0151 #define FEC_R_DES_ACTIVE_0  0x010 /* Receive descriptor reg */
0152 #define FEC_R_DES_ACTIVE_1  FEC_R_DES_ACTIVE_0
0153 #define FEC_R_DES_ACTIVE_2  FEC_R_DES_ACTIVE_0
0154 #define FEC_X_DES_ACTIVE_0  0x014 /* Transmit descriptor reg */
0155 #define FEC_X_DES_ACTIVE_1  FEC_X_DES_ACTIVE_0
0156 #define FEC_X_DES_ACTIVE_2  FEC_X_DES_ACTIVE_0
0157 #define FEC_MII_DATA        0x040 /* MII manage frame reg */
0158 #define FEC_MII_SPEED       0x044 /* MII speed control reg */
0159 #define FEC_R_BOUND     0x08c /* FIFO receive bound reg */
0160 #define FEC_R_FSTART        0x090 /* FIFO receive start reg */
0161 #define FEC_X_WMRK      0x0a4 /* FIFO transmit water mark */
0162 #define FEC_X_FSTART        0x0ac /* FIFO transmit start reg */
0163 #define FEC_R_CNTRL     0x104 /* Receive control reg */
0164 #define FEC_MAX_FRM_LEN     0x108 /* Maximum frame length reg */
0165 #define FEC_X_CNTRL     0x144 /* Transmit Control reg */
0166 #define FEC_ADDR_LOW        0x3c0 /* Low 32bits MAC address */
0167 #define FEC_ADDR_HIGH       0x3c4 /* High 16bits MAC address */
0168 #define FEC_GRP_HASH_TABLE_HIGH 0x3c8 /* High 32bits hash table */
0169 #define FEC_GRP_HASH_TABLE_LOW  0x3cc /* Low 32bits hash table */
0170 #define FEC_R_DES_START_0   0x3d0 /* Receive descriptor ring */
0171 #define FEC_R_DES_START_1   FEC_R_DES_START_0
0172 #define FEC_R_DES_START_2   FEC_R_DES_START_0
0173 #define FEC_X_DES_START_0   0x3d4 /* Transmit descriptor ring */
0174 #define FEC_X_DES_START_1   FEC_X_DES_START_0
0175 #define FEC_X_DES_START_2   FEC_X_DES_START_0
0176 #define FEC_R_BUFF_SIZE_0   0x3d8 /* Maximum receive buff size */
0177 #define FEC_R_BUFF_SIZE_1   FEC_R_BUFF_SIZE_0
0178 #define FEC_R_BUFF_SIZE_2   FEC_R_BUFF_SIZE_0
0179 #define FEC_FIFO_RAM        0x400 /* FIFO RAM buffer */
0180 /* Not existed in real chip
0181  * Just for pass build.
0182  */
0183 #define FEC_RCMR_1      0xfff
0184 #define FEC_RCMR_2      0xfff
0185 #define FEC_DMA_CFG_1       0xfff
0186 #define FEC_DMA_CFG_2       0xfff
0187 #define FEC_TXIC0       0xfff
0188 #define FEC_TXIC1       0xfff
0189 #define FEC_TXIC2       0xfff
0190 #define FEC_RXIC0       0xfff
0191 #define FEC_RXIC1       0xfff
0192 #define FEC_RXIC2       0xfff
0193 #define FEC_LPI_SLEEP       0xfff
0194 #define FEC_LPI_WAKE        0xfff
0195 #endif /* CONFIG_M5272 */
0196 
0197 
0198 /*
0199  *  Define the buffer descriptor structure.
0200  *
0201  *  Evidently, ARM SoCs have the FEC block generated in a
0202  *  little endian mode so adjust endianness accordingly.
0203  */
0204 #if defined(CONFIG_ARM) || defined(CONFIG_ARM64)
0205 #define fec32_to_cpu le32_to_cpu
0206 #define fec16_to_cpu le16_to_cpu
0207 #define cpu_to_fec32 cpu_to_le32
0208 #define cpu_to_fec16 cpu_to_le16
0209 #define __fec32 __le32
0210 #define __fec16 __le16
0211 
0212 struct bufdesc {
0213     __fec16 cbd_datlen; /* Data length */
0214     __fec16 cbd_sc;     /* Control and status info */
0215     __fec32 cbd_bufaddr;    /* Buffer address */
0216 };
0217 #else
0218 #define fec32_to_cpu be32_to_cpu
0219 #define fec16_to_cpu be16_to_cpu
0220 #define cpu_to_fec32 cpu_to_be32
0221 #define cpu_to_fec16 cpu_to_be16
0222 #define __fec32 __be32
0223 #define __fec16 __be16
0224 
0225 struct bufdesc {
0226     __fec16 cbd_sc;     /* Control and status info */
0227     __fec16 cbd_datlen; /* Data length */
0228     __fec32 cbd_bufaddr;    /* Buffer address */
0229 };
0230 #endif
0231 
0232 struct bufdesc_ex {
0233     struct bufdesc desc;
0234     __fec32 cbd_esc;
0235     __fec32 cbd_prot;
0236     __fec32 cbd_bdu;
0237     __fec32 ts;
0238     __fec16 res0[4];
0239 };
0240 
0241 /*
0242  *  The following definitions courtesy of commproc.h, which where
0243  *  Copyright (c) 1997 Dan Malek (dmalek@jlc.net).
0244  */
0245 #define BD_SC_EMPTY ((ushort)0x8000)    /* Receive is empty */
0246 #define BD_SC_READY ((ushort)0x8000)    /* Transmit is ready */
0247 #define BD_SC_WRAP  ((ushort)0x2000)    /* Last buffer descriptor */
0248 #define BD_SC_INTRPT    ((ushort)0x1000)    /* Interrupt on change */
0249 #define BD_SC_CM    ((ushort)0x0200)    /* Continuous mode */
0250 #define BD_SC_ID    ((ushort)0x0100)    /* Rec'd too many idles */
0251 #define BD_SC_P     ((ushort)0x0100)    /* xmt preamble */
0252 #define BD_SC_BR    ((ushort)0x0020)    /* Break received */
0253 #define BD_SC_FR    ((ushort)0x0010)    /* Framing error */
0254 #define BD_SC_PR    ((ushort)0x0008)    /* Parity error */
0255 #define BD_SC_OV    ((ushort)0x0002)    /* Overrun */
0256 #define BD_SC_CD    ((ushort)0x0001)    /* ?? */
0257 
0258 /* Buffer descriptor control/status used by Ethernet receive.
0259  */
0260 #define BD_ENET_RX_EMPTY    ((ushort)0x8000)
0261 #define BD_ENET_RX_WRAP     ((ushort)0x2000)
0262 #define BD_ENET_RX_INTR     ((ushort)0x1000)
0263 #define BD_ENET_RX_LAST     ((ushort)0x0800)
0264 #define BD_ENET_RX_FIRST    ((ushort)0x0400)
0265 #define BD_ENET_RX_MISS     ((ushort)0x0100)
0266 #define BD_ENET_RX_LG       ((ushort)0x0020)
0267 #define BD_ENET_RX_NO       ((ushort)0x0010)
0268 #define BD_ENET_RX_SH       ((ushort)0x0008)
0269 #define BD_ENET_RX_CR       ((ushort)0x0004)
0270 #define BD_ENET_RX_OV       ((ushort)0x0002)
0271 #define BD_ENET_RX_CL       ((ushort)0x0001)
0272 #define BD_ENET_RX_STATS    ((ushort)0x013f)    /* All status bits */
0273 
0274 /* Enhanced buffer descriptor control/status used by Ethernet receive */
0275 #define BD_ENET_RX_VLAN     0x00000004
0276 
0277 /* Buffer descriptor control/status used by Ethernet transmit.
0278  */
0279 #define BD_ENET_TX_READY    ((ushort)0x8000)
0280 #define BD_ENET_TX_PAD      ((ushort)0x4000)
0281 #define BD_ENET_TX_WRAP     ((ushort)0x2000)
0282 #define BD_ENET_TX_INTR     ((ushort)0x1000)
0283 #define BD_ENET_TX_LAST     ((ushort)0x0800)
0284 #define BD_ENET_TX_TC       ((ushort)0x0400)
0285 #define BD_ENET_TX_DEF      ((ushort)0x0200)
0286 #define BD_ENET_TX_HB       ((ushort)0x0100)
0287 #define BD_ENET_TX_LC       ((ushort)0x0080)
0288 #define BD_ENET_TX_RL       ((ushort)0x0040)
0289 #define BD_ENET_TX_RCMASK   ((ushort)0x003c)
0290 #define BD_ENET_TX_UN       ((ushort)0x0002)
0291 #define BD_ENET_TX_CSL      ((ushort)0x0001)
0292 #define BD_ENET_TX_STATS    ((ushort)0x0fff)    /* All status bits */
0293 
0294 /* enhanced buffer descriptor control/status used by Ethernet transmit */
0295 #define BD_ENET_TX_INT      0x40000000
0296 #define BD_ENET_TX_TS       0x20000000
0297 #define BD_ENET_TX_PINS     0x10000000
0298 #define BD_ENET_TX_IINS     0x08000000
0299 
0300 
0301 /* This device has up to three irqs on some platforms */
0302 #define FEC_IRQ_NUM     3
0303 
0304 /* Maximum number of queues supported
0305  * ENET with AVB IP can support up to 3 independent tx queues and rx queues.
0306  * User can point the queue number that is less than or equal to 3.
0307  */
0308 #define FEC_ENET_MAX_TX_QS  3
0309 #define FEC_ENET_MAX_RX_QS  3
0310 
0311 #define FEC_R_DES_START(X)  (((X) == 1) ? FEC_R_DES_START_1 : \
0312                 (((X) == 2) ? \
0313                     FEC_R_DES_START_2 : FEC_R_DES_START_0))
0314 #define FEC_X_DES_START(X)  (((X) == 1) ? FEC_X_DES_START_1 : \
0315                 (((X) == 2) ? \
0316                     FEC_X_DES_START_2 : FEC_X_DES_START_0))
0317 #define FEC_R_BUFF_SIZE(X)  (((X) == 1) ? FEC_R_BUFF_SIZE_1 : \
0318                 (((X) == 2) ? \
0319                     FEC_R_BUFF_SIZE_2 : FEC_R_BUFF_SIZE_0))
0320 
0321 #define FEC_DMA_CFG(X)      (((X) == 2) ? FEC_DMA_CFG_2 : FEC_DMA_CFG_1)
0322 
0323 #define DMA_CLASS_EN        (1 << 16)
0324 #define FEC_RCMR(X)     (((X) == 2) ? FEC_RCMR_2 : FEC_RCMR_1)
0325 #define IDLE_SLOPE_MASK     0xffff
0326 #define IDLE_SLOPE_1        0x200 /* BW fraction: 0.5 */
0327 #define IDLE_SLOPE_2        0x200 /* BW fraction: 0.5 */
0328 #define IDLE_SLOPE(X)       (((X) == 1) ?               \
0329                 (IDLE_SLOPE_1 & IDLE_SLOPE_MASK) :  \
0330                 (IDLE_SLOPE_2 & IDLE_SLOPE_MASK))
0331 #define RCMR_MATCHEN        (0x1 << 16)
0332 #define RCMR_CMP_CFG(v, n)  (((v) & 0x7) <<  (n << 2))
0333 #define RCMR_CMP_1      (RCMR_CMP_CFG(0, 0) | RCMR_CMP_CFG(1, 1) | \
0334                 RCMR_CMP_CFG(2, 2) | RCMR_CMP_CFG(3, 3))
0335 #define RCMR_CMP_2      (RCMR_CMP_CFG(4, 0) | RCMR_CMP_CFG(5, 1) | \
0336                 RCMR_CMP_CFG(6, 2) | RCMR_CMP_CFG(7, 3))
0337 #define RCMR_CMP(X)     (((X) == 1) ? RCMR_CMP_1 : RCMR_CMP_2)
0338 #define FEC_TX_BD_FTYPE(X)  (((X) & 0xf) << 20)
0339 
0340 /* The number of Tx and Rx buffers.  These are allocated from the page
0341  * pool.  The code may assume these are power of two, so it it best
0342  * to keep them that size.
0343  * We don't need to allocate pages for the transmitter.  We just use
0344  * the skbuffer directly.
0345  */
0346 
0347 #define FEC_ENET_RX_PAGES   256
0348 #define FEC_ENET_RX_FRSIZE  2048
0349 #define FEC_ENET_RX_FRPPG   (PAGE_SIZE / FEC_ENET_RX_FRSIZE)
0350 #define RX_RING_SIZE        (FEC_ENET_RX_FRPPG * FEC_ENET_RX_PAGES)
0351 #define FEC_ENET_TX_FRSIZE  2048
0352 #define FEC_ENET_TX_FRPPG   (PAGE_SIZE / FEC_ENET_TX_FRSIZE)
0353 #define TX_RING_SIZE        512 /* Must be power of two */
0354 #define TX_RING_MOD_MASK    511 /*   for this to work */
0355 
0356 #define BD_ENET_RX_INT      0x00800000
0357 #define BD_ENET_RX_PTP      ((ushort)0x0400)
0358 #define BD_ENET_RX_ICE      0x00000020
0359 #define BD_ENET_RX_PCR      0x00000010
0360 #define FLAG_RX_CSUM_ENABLED    (BD_ENET_RX_ICE | BD_ENET_RX_PCR)
0361 #define FLAG_RX_CSUM_ERROR  (BD_ENET_RX_ICE | BD_ENET_RX_PCR)
0362 
0363 /* Interrupt events/masks. */
0364 #define FEC_ENET_HBERR  ((uint)0x80000000)      /* Heartbeat error */
0365 #define FEC_ENET_BABR   ((uint)0x40000000)      /* Babbling receiver */
0366 #define FEC_ENET_BABT   ((uint)0x20000000)      /* Babbling transmitter */
0367 #define FEC_ENET_GRA    ((uint)0x10000000)      /* Graceful stop complete */
0368 #define FEC_ENET_TXF_0  ((uint)0x08000000)  /* Full frame transmitted */
0369 #define FEC_ENET_TXF_1  ((uint)0x00000008)  /* Full frame transmitted */
0370 #define FEC_ENET_TXF_2  ((uint)0x00000080)  /* Full frame transmitted */
0371 #define FEC_ENET_TXB    ((uint)0x04000000)      /* A buffer was transmitted */
0372 #define FEC_ENET_RXF_0  ((uint)0x02000000)  /* Full frame received */
0373 #define FEC_ENET_RXF_1  ((uint)0x00000002)  /* Full frame received */
0374 #define FEC_ENET_RXF_2  ((uint)0x00000020)  /* Full frame received */
0375 #define FEC_ENET_RXB    ((uint)0x01000000)      /* A buffer was received */
0376 #define FEC_ENET_MII    ((uint)0x00800000)      /* MII interrupt */
0377 #define FEC_ENET_EBERR  ((uint)0x00400000)      /* SDMA bus error */
0378 #define FEC_ENET_WAKEUP ((uint)0x00020000)  /* Wakeup request */
0379 #define FEC_ENET_TXF    (FEC_ENET_TXF_0 | FEC_ENET_TXF_1 | FEC_ENET_TXF_2)
0380 #define FEC_ENET_RXF    (FEC_ENET_RXF_0 | FEC_ENET_RXF_1 | FEC_ENET_RXF_2)
0381 #define FEC_ENET_RXF_GET(X) (((X) == 0) ? FEC_ENET_RXF_0 :  \
0382                 (((X) == 1) ? FEC_ENET_RXF_1 :  \
0383                 FEC_ENET_RXF_2))
0384 #define FEC_ENET_TS_AVAIL       ((uint)0x00010000)
0385 #define FEC_ENET_TS_TIMER       ((uint)0x00008000)
0386 
0387 #define FEC_DEFAULT_IMASK (FEC_ENET_TXF | FEC_ENET_RXF)
0388 #define FEC_RX_DISABLED_IMASK (FEC_DEFAULT_IMASK & (~FEC_ENET_RXF))
0389 
0390 #define FEC_ENET_TXC_DLY    ((uint)0x00010000)
0391 #define FEC_ENET_RXC_DLY    ((uint)0x00020000)
0392 
0393 /* ENET interrupt coalescing macro define */
0394 #define FEC_ITR_CLK_SEL     (0x1 << 30)
0395 #define FEC_ITR_EN      (0x1 << 31)
0396 #define FEC_ITR_ICFT(X)     (((X) & 0xff) << 20)
0397 #define FEC_ITR_ICTT(X)     ((X) & 0xffff)
0398 #define FEC_ITR_ICFT_DEFAULT    200  /* Set 200 frame count threshold */
0399 #define FEC_ITR_ICTT_DEFAULT    1000 /* Set 1000us timer threshold */
0400 
0401 #define FEC_VLAN_TAG_LEN    0x04
0402 #define FEC_ETHTYPE_LEN     0x02
0403 
0404 /* Controller is ENET-MAC */
0405 #define FEC_QUIRK_ENET_MAC      (1 << 0)
0406 /* Controller needs driver to swap frame */
0407 #define FEC_QUIRK_SWAP_FRAME        (1 << 1)
0408 /* Controller uses gasket */
0409 #define FEC_QUIRK_USE_GASKET        (1 << 2)
0410 /* Controller has GBIT support */
0411 #define FEC_QUIRK_HAS_GBIT      (1 << 3)
0412 /* Controller has extend desc buffer */
0413 #define FEC_QUIRK_HAS_BUFDESC_EX    (1 << 4)
0414 /* Controller has hardware checksum support */
0415 #define FEC_QUIRK_HAS_CSUM      (1 << 5)
0416 /* Controller has hardware vlan support */
0417 #define FEC_QUIRK_HAS_VLAN      (1 << 6)
0418 /* ENET IP errata ERR006358
0419  *
0420  * If the ready bit in the transmit buffer descriptor (TxBD[R]) is previously
0421  * detected as not set during a prior frame transmission, then the
0422  * ENET_TDAR[TDAR] bit is cleared at a later time, even if additional TxBDs
0423  * were added to the ring and the ENET_TDAR[TDAR] bit is set. This results in
0424  * frames not being transmitted until there is a 0-to-1 transition on
0425  * ENET_TDAR[TDAR].
0426  */
0427 #define FEC_QUIRK_ERR006358     (1 << 7)
0428 /* ENET IP hw AVB
0429  *
0430  * i.MX6SX ENET IP add Audio Video Bridging (AVB) feature support.
0431  * - Two class indicators on receive with configurable priority
0432  * - Two class indicators and line speed timer on transmit allowing
0433  *   implementation class credit based shapers externally
0434  * - Additional DMA registers provisioned to allow managing up to 3
0435  *   independent rings
0436  */
0437 #define FEC_QUIRK_HAS_AVB       (1 << 8)
0438 /* There is a TDAR race condition for mutliQ when the software sets TDAR
0439  * and the UDMA clears TDAR simultaneously or in a small window (2-4 cycles).
0440  * This will cause the udma_tx and udma_tx_arbiter state machines to hang.
0441  * The issue exist at i.MX6SX enet IP.
0442  */
0443 #define FEC_QUIRK_ERR007885     (1 << 9)
0444 /* ENET Block Guide/ Chapter for the iMX6SX (PELE) address one issue:
0445  * After set ENET_ATCR[Capture], there need some time cycles before the counter
0446  * value is capture in the register clock domain.
0447  * The wait-time-cycles is at least 6 clock cycles of the slower clock between
0448  * the register clock and the 1588 clock. The 1588 ts_clk is fixed to 25Mhz,
0449  * register clock is 66Mhz, so the wait-time-cycles must be greater than 240ns
0450  * (40ns * 6).
0451  */
0452 #define FEC_QUIRK_BUG_CAPTURE       (1 << 10)
0453 /* Controller has only one MDIO bus */
0454 #define FEC_QUIRK_SINGLE_MDIO       (1 << 11)
0455 /* Controller supports RACC register */
0456 #define FEC_QUIRK_HAS_RACC      (1 << 12)
0457 /* Controller supports interrupt coalesc */
0458 #define FEC_QUIRK_HAS_COALESCE      (1 << 13)
0459 /* Interrupt doesn't wake CPU from deep idle */
0460 #define FEC_QUIRK_ERR006687     (1 << 14)
0461 /* The MIB counters should be cleared and enabled during
0462  * initialisation.
0463  */
0464 #define FEC_QUIRK_MIB_CLEAR     (1 << 15)
0465 /* Only i.MX25/i.MX27/i.MX28 controller supports FRBR,FRSR registers,
0466  * those FIFO receive registers are resolved in other platforms.
0467  */
0468 #define FEC_QUIRK_HAS_FRREG     (1 << 16)
0469 
0470 /* Some FEC hardware blocks need the MMFR cleared at setup time to avoid
0471  * the generation of an MII event. This must be avoided in the older
0472  * FEC blocks where it will stop MII events being generated.
0473  */
0474 #define FEC_QUIRK_CLEAR_SETUP_MII   (1 << 17)
0475 
0476 /* Some link partners do not tolerate the momentary reset of the REF_CLK
0477  * frequency when the RNCTL register is cleared by hardware reset.
0478  */
0479 #define FEC_QUIRK_NO_HARD_RESET     (1 << 18)
0480 
0481 /* i.MX6SX ENET IP supports multiple queues (3 queues), use this quirk to
0482  * represents this ENET IP.
0483  */
0484 #define FEC_QUIRK_HAS_MULTI_QUEUES  (1 << 19)
0485 
0486 /* i.MX8MQ ENET IP version add new feature to support IEEE 802.3az EEE
0487  * standard. For the transmission, MAC supply two user registers to set
0488  * Sleep (TS) and Wake (TW) time.
0489  */
0490 #define FEC_QUIRK_HAS_EEE       (1 << 20)
0491 
0492 /* i.MX8QM ENET IP version add new feture to generate delayed TXC/RXC
0493  * as an alternative option to make sure it works well with various PHYs.
0494  * For the implementation of delayed clock, ENET takes synchronized 250MHz
0495  * clocks to generate 2ns delay.
0496  */
0497 #define FEC_QUIRK_DELAYED_CLKS_SUPPORT  (1 << 21)
0498 
0499 /* i.MX8MQ SoC integration mix wakeup interrupt signal into "int2" interrupt line. */
0500 #define FEC_QUIRK_WAKEUP_FROM_INT2  (1 << 22)
0501 
0502 /* i.MX6Q adds pm_qos support */
0503 #define FEC_QUIRK_HAS_PMQOS         BIT(23)
0504 
0505 struct bufdesc_prop {
0506     int qid;
0507     /* Address of Rx and Tx buffers */
0508     struct bufdesc  *base;
0509     struct bufdesc  *last;
0510     struct bufdesc  *cur;
0511     void __iomem    *reg_desc_active;
0512     dma_addr_t  dma;
0513     unsigned short ring_size;
0514     unsigned char dsize;
0515     unsigned char dsize_log2;
0516 };
0517 
0518 struct fec_enet_priv_tx_q {
0519     struct bufdesc_prop bd;
0520     unsigned char *tx_bounce[TX_RING_SIZE];
0521     struct  sk_buff *tx_skbuff[TX_RING_SIZE];
0522 
0523     unsigned short tx_stop_threshold;
0524     unsigned short tx_wake_threshold;
0525 
0526     struct bufdesc  *dirty_tx;
0527     char *tso_hdrs;
0528     dma_addr_t tso_hdrs_dma;
0529 };
0530 
0531 struct fec_enet_priv_rx_q {
0532     struct bufdesc_prop bd;
0533     struct  sk_buff *rx_skbuff[RX_RING_SIZE];
0534 };
0535 
0536 struct fec_stop_mode_gpr {
0537     struct regmap *gpr;
0538     u8 reg;
0539     u8 bit;
0540 };
0541 
0542 /* The FEC buffer descriptors track the ring buffers.  The rx_bd_base and
0543  * tx_bd_base always point to the base of the buffer descriptors.  The
0544  * cur_rx and cur_tx point to the currently available buffer.
0545  * The dirty_tx tracks the current buffer that is being sent by the
0546  * controller.  The cur_tx and dirty_tx are equal under both completely
0547  * empty and completely full conditions.  The empty/ready indicator in
0548  * the buffer descriptor determines the actual condition.
0549  */
0550 struct fec_enet_private {
0551     /* Hardware registers of the FEC device */
0552     void __iomem *hwp;
0553 
0554     struct net_device *netdev;
0555 
0556     struct clk *clk_ipg;
0557     struct clk *clk_ahb;
0558     struct clk *clk_ref;
0559     struct clk *clk_enet_out;
0560     struct clk *clk_ptp;
0561     struct clk *clk_2x_txclk;
0562 
0563     bool ptp_clk_on;
0564     struct mutex ptp_clk_mutex;
0565     unsigned int num_tx_queues;
0566     unsigned int num_rx_queues;
0567 
0568     /* The saved address of a sent-in-place packet/buffer, for skfree(). */
0569     struct fec_enet_priv_tx_q *tx_queue[FEC_ENET_MAX_TX_QS];
0570     struct fec_enet_priv_rx_q *rx_queue[FEC_ENET_MAX_RX_QS];
0571 
0572     unsigned int total_tx_ring_size;
0573     unsigned int total_rx_ring_size;
0574 
0575     struct  platform_device *pdev;
0576 
0577     int dev_id;
0578 
0579     /* Phylib and MDIO interface */
0580     struct  mii_bus *mii_bus;
0581     uint    phy_speed;
0582     phy_interface_t phy_interface;
0583     struct device_node *phy_node;
0584     bool    rgmii_txc_dly;
0585     bool    rgmii_rxc_dly;
0586     int link;
0587     int full_duplex;
0588     int speed;
0589     int irq[FEC_IRQ_NUM];
0590     bool    bufdesc_ex;
0591     int pause_flag;
0592     int wol_flag;
0593     int wake_irq;
0594     u32 quirks;
0595 
0596     struct  napi_struct napi;
0597     int csum_flags;
0598 
0599     struct work_struct tx_timeout_work;
0600 
0601     struct ptp_clock *ptp_clock;
0602     struct ptp_clock_info ptp_caps;
0603     unsigned long last_overflow_check;
0604     spinlock_t tmreg_lock;
0605     struct cyclecounter cc;
0606     struct timecounter tc;
0607     int rx_hwtstamp_filter;
0608     u32 base_incval;
0609     u32 cycle_speed;
0610     int hwts_rx_en;
0611     int hwts_tx_en;
0612     struct delayed_work time_keep;
0613     struct regulator *reg_phy;
0614     struct fec_stop_mode_gpr stop_gpr;
0615     struct pm_qos_request pm_qos_req;
0616 
0617     unsigned int tx_align;
0618     unsigned int rx_align;
0619 
0620     /* hw interrupt coalesce */
0621     unsigned int rx_pkts_itr;
0622     unsigned int rx_time_itr;
0623     unsigned int tx_pkts_itr;
0624     unsigned int tx_time_itr;
0625     unsigned int itr_clk_rate;
0626 
0627     /* tx lpi eee mode */
0628     struct ethtool_eee eee;
0629     unsigned int clk_ref_rate;
0630 
0631     u32 rx_copybreak;
0632 
0633     /* ptp clock period in ns*/
0634     unsigned int ptp_inc;
0635 
0636     /* pps  */
0637     int pps_channel;
0638     unsigned int reload_period;
0639     int pps_enable;
0640     unsigned int next_counter;
0641 
0642     u64 ethtool_stats[];
0643 };
0644 
0645 void fec_ptp_init(struct platform_device *pdev, int irq_idx);
0646 void fec_ptp_stop(struct platform_device *pdev);
0647 void fec_ptp_start_cyclecounter(struct net_device *ndev);
0648 void fec_ptp_disable_hwts(struct net_device *ndev);
0649 int fec_ptp_set(struct net_device *ndev, struct ifreq *ifr);
0650 int fec_ptp_get(struct net_device *ndev, struct ifreq *ifr);
0651 
0652 /****************************************************************************/
0653 #endif /* FEC_H */