Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _BGMAC_H
0003 #define _BGMAC_H
0004 
0005 #include <linux/netdevice.h>
0006 
0007 #include "unimac.h"
0008 
0009 #define BGMAC_DEV_CTL               0x000
0010 #define  BGMAC_DC_TSM               0x00000002
0011 #define  BGMAC_DC_CFCO              0x00000004
0012 #define  BGMAC_DC_RLSS              0x00000008
0013 #define  BGMAC_DC_MROR              0x00000010
0014 #define  BGMAC_DC_FCM_MASK          0x00000060
0015 #define  BGMAC_DC_FCM_SHIFT         5
0016 #define  BGMAC_DC_NAE               0x00000080
0017 #define  BGMAC_DC_TF                0x00000100
0018 #define  BGMAC_DC_RDS_MASK          0x00030000
0019 #define  BGMAC_DC_RDS_SHIFT         16
0020 #define  BGMAC_DC_TDS_MASK          0x000c0000
0021 #define  BGMAC_DC_TDS_SHIFT         18
0022 #define BGMAC_DEV_STATUS            0x004       /* Configuration of the interface */
0023 #define  BGMAC_DS_RBF               0x00000001
0024 #define  BGMAC_DS_RDF               0x00000002
0025 #define  BGMAC_DS_RIF               0x00000004
0026 #define  BGMAC_DS_TBF               0x00000008
0027 #define  BGMAC_DS_TDF               0x00000010
0028 #define  BGMAC_DS_TIF               0x00000020
0029 #define  BGMAC_DS_PO                0x00000040
0030 #define  BGMAC_DS_MM_MASK           0x00000300  /* Mode of the interface */
0031 #define  BGMAC_DS_MM_SHIFT          8
0032 #define BGMAC_BIST_STATUS           0x00c
0033 #define BGMAC_INT_STATUS            0x020       /* Interrupt status */
0034 #define  BGMAC_IS_MRO               0x00000001
0035 #define  BGMAC_IS_MTO               0x00000002
0036 #define  BGMAC_IS_TFD               0x00000004
0037 #define  BGMAC_IS_LS                0x00000008
0038 #define  BGMAC_IS_MDIO              0x00000010
0039 #define  BGMAC_IS_MR                0x00000020
0040 #define  BGMAC_IS_MT                0x00000040
0041 #define  BGMAC_IS_TO                0x00000080
0042 #define  BGMAC_IS_DESC_ERR          0x00000400  /* Descriptor error */
0043 #define  BGMAC_IS_DATA_ERR          0x00000800  /* Data error */
0044 #define  BGMAC_IS_DESC_PROT_ERR         0x00001000  /* Descriptor protocol error */
0045 #define  BGMAC_IS_RX_DESC_UNDERF        0x00002000  /* Receive descriptor underflow */
0046 #define  BGMAC_IS_RX_F_OVERF            0x00004000  /* Receive FIFO overflow */
0047 #define  BGMAC_IS_TX_F_UNDERF           0x00008000  /* Transmit FIFO underflow */
0048 #define  BGMAC_IS_RX                0x00010000  /* Interrupt for RX queue 0 */
0049 #define  BGMAC_IS_TX0               0x01000000  /* Interrupt for TX queue 0 */
0050 #define  BGMAC_IS_TX1               0x02000000  /* Interrupt for TX queue 1 */
0051 #define  BGMAC_IS_TX2               0x04000000  /* Interrupt for TX queue 2 */
0052 #define  BGMAC_IS_TX3               0x08000000  /* Interrupt for TX queue 3 */
0053 #define  BGMAC_IS_TX_MASK           0x0f000000
0054 #define  BGMAC_IS_INTMASK           0x0f01fcff
0055 #define  BGMAC_IS_ERRMASK           0x0000fc00
0056 #define BGMAC_INT_MASK              0x024       /* Interrupt mask */
0057 #define BGMAC_GP_TIMER              0x028
0058 #define BGMAC_INT_RECV_LAZY         0x100
0059 #define  BGMAC_IRL_TO_MASK          0x00ffffff
0060 #define  BGMAC_IRL_FC_MASK          0xff000000
0061 #define  BGMAC_IRL_FC_SHIFT         24      /* Shift the number of interrupts triggered per received frame */
0062 #define BGMAC_FLOW_CTL_THRESH           0x104       /* Flow control thresholds */
0063 #define BGMAC_WRRTHRESH             0x108
0064 #define BGMAC_GMAC_IDLE_CNT_THRESH      0x10c
0065 #define BGMAC_PHY_ACCESS            0x180       /* PHY access address */
0066 #define  BGMAC_PA_DATA_MASK         0x0000ffff
0067 #define  BGMAC_PA_ADDR_MASK         0x001f0000
0068 #define  BGMAC_PA_ADDR_SHIFT            16
0069 #define  BGMAC_PA_REG_MASK          0x1f000000
0070 #define  BGMAC_PA_REG_SHIFT         24
0071 #define  BGMAC_PA_WRITE             0x20000000
0072 #define  BGMAC_PA_START             0x40000000
0073 #define BGMAC_PHY_CNTL              0x188       /* PHY control address */
0074 #define  BGMAC_PC_EPA_MASK          0x0000001f
0075 #define  BGMAC_PC_MCT_MASK          0x007f0000
0076 #define  BGMAC_PC_MCT_SHIFT         16
0077 #define  BGMAC_PC_MTE               0x00800000
0078 #define BGMAC_TXQ_CTL               0x18c
0079 #define  BGMAC_TXQ_CTL_DBT_MASK         0x00000fff
0080 #define  BGMAC_TXQ_CTL_DBT_SHIFT        0
0081 #define BGMAC_RXQ_CTL               0x190
0082 #define  BGMAC_RXQ_CTL_DBT_MASK         0x00000fff
0083 #define  BGMAC_RXQ_CTL_DBT_SHIFT        0
0084 #define  BGMAC_RXQ_CTL_PTE          0x00001000
0085 #define  BGMAC_RXQ_CTL_MDP_MASK         0x3f000000
0086 #define  BGMAC_RXQ_CTL_MDP_SHIFT        24
0087 #define BGMAC_GPIO_SELECT           0x194
0088 #define BGMAC_GPIO_OUTPUT_EN            0x198
0089 
0090 /* For 0x1e0 see BCMA_CLKCTLST. Below are BGMAC specific bits */
0091 #define  BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ   0x00000100
0092 #define  BGMAC_BCMA_CLKCTLST_MISC_PLL_ST    0x01000000
0093 
0094 #define BGMAC_HW_WAR                0x1e4
0095 #define BGMAC_PWR_CTL               0x1e8
0096 #define BGMAC_DMA_BASE0             0x200       /* Tx and Rx controller */
0097 #define BGMAC_DMA_BASE1             0x240       /* Tx controller only */
0098 #define BGMAC_DMA_BASE2             0x280       /* Tx controller only */
0099 #define BGMAC_DMA_BASE3             0x2C0       /* Tx controller only */
0100 #define BGMAC_TX_GOOD_OCTETS            0x300
0101 #define BGMAC_TX_GOOD_OCTETS_HIGH       0x304
0102 #define BGMAC_TX_GOOD_PKTS          0x308
0103 #define BGMAC_TX_OCTETS             0x30c
0104 #define BGMAC_TX_OCTETS_HIGH            0x310
0105 #define BGMAC_TX_PKTS               0x314
0106 #define BGMAC_TX_BROADCAST_PKTS         0x318
0107 #define BGMAC_TX_MULTICAST_PKTS         0x31c
0108 #define BGMAC_TX_LEN_64             0x320
0109 #define BGMAC_TX_LEN_65_TO_127          0x324
0110 #define BGMAC_TX_LEN_128_TO_255         0x328
0111 #define BGMAC_TX_LEN_256_TO_511         0x32c
0112 #define BGMAC_TX_LEN_512_TO_1023        0x330
0113 #define BGMAC_TX_LEN_1024_TO_1522       0x334
0114 #define BGMAC_TX_LEN_1523_TO_2047       0x338
0115 #define BGMAC_TX_LEN_2048_TO_4095       0x33c
0116 #define BGMAC_TX_LEN_4096_TO_8191       0x340
0117 #define BGMAC_TX_LEN_8192_TO_MAX        0x344
0118 #define BGMAC_TX_JABBER_PKTS            0x348       /* Error */
0119 #define BGMAC_TX_OVERSIZE_PKTS          0x34c       /* Error */
0120 #define BGMAC_TX_FRAGMENT_PKTS          0x350
0121 #define BGMAC_TX_UNDERRUNS          0x354       /* Error */
0122 #define BGMAC_TX_TOTAL_COLS         0x358
0123 #define BGMAC_TX_SINGLE_COLS            0x35c
0124 #define BGMAC_TX_MULTIPLE_COLS          0x360
0125 #define BGMAC_TX_EXCESSIVE_COLS         0x364       /* Error */
0126 #define BGMAC_TX_LATE_COLS          0x368       /* Error */
0127 #define BGMAC_TX_DEFERED            0x36c
0128 #define BGMAC_TX_CARRIER_LOST           0x370
0129 #define BGMAC_TX_PAUSE_PKTS         0x374
0130 #define BGMAC_TX_UNI_PKTS           0x378
0131 #define BGMAC_TX_Q0_PKTS            0x37c
0132 #define BGMAC_TX_Q0_OCTETS          0x380
0133 #define BGMAC_TX_Q0_OCTETS_HIGH         0x384
0134 #define BGMAC_TX_Q1_PKTS            0x388
0135 #define BGMAC_TX_Q1_OCTETS          0x38c
0136 #define BGMAC_TX_Q1_OCTETS_HIGH         0x390
0137 #define BGMAC_TX_Q2_PKTS            0x394
0138 #define BGMAC_TX_Q2_OCTETS          0x398
0139 #define BGMAC_TX_Q2_OCTETS_HIGH         0x39c
0140 #define BGMAC_TX_Q3_PKTS            0x3a0
0141 #define BGMAC_TX_Q3_OCTETS          0x3a4
0142 #define BGMAC_TX_Q3_OCTETS_HIGH         0x3a8
0143 #define BGMAC_RX_GOOD_OCTETS            0x3b0
0144 #define BGMAC_RX_GOOD_OCTETS_HIGH       0x3b4
0145 #define BGMAC_RX_GOOD_PKTS          0x3b8
0146 #define BGMAC_RX_OCTETS             0x3bc
0147 #define BGMAC_RX_OCTETS_HIGH            0x3c0
0148 #define BGMAC_RX_PKTS               0x3c4
0149 #define BGMAC_RX_BROADCAST_PKTS         0x3c8
0150 #define BGMAC_RX_MULTICAST_PKTS         0x3cc
0151 #define BGMAC_RX_LEN_64             0x3d0
0152 #define BGMAC_RX_LEN_65_TO_127          0x3d4
0153 #define BGMAC_RX_LEN_128_TO_255         0x3d8
0154 #define BGMAC_RX_LEN_256_TO_511         0x3dc
0155 #define BGMAC_RX_LEN_512_TO_1023        0x3e0
0156 #define BGMAC_RX_LEN_1024_TO_1522       0x3e4
0157 #define BGMAC_RX_LEN_1523_TO_2047       0x3e8
0158 #define BGMAC_RX_LEN_2048_TO_4095       0x3ec
0159 #define BGMAC_RX_LEN_4096_TO_8191       0x3f0
0160 #define BGMAC_RX_LEN_8192_TO_MAX        0x3f4
0161 #define BGMAC_RX_JABBER_PKTS            0x3f8       /* Error */
0162 #define BGMAC_RX_OVERSIZE_PKTS          0x3fc       /* Error */
0163 #define BGMAC_RX_FRAGMENT_PKTS          0x400
0164 #define BGMAC_RX_MISSED_PKTS            0x404       /* Error */
0165 #define BGMAC_RX_CRC_ALIGN_ERRS         0x408       /* Error */
0166 #define BGMAC_RX_UNDERSIZE          0x40c       /* Error */
0167 #define BGMAC_RX_CRC_ERRS           0x410       /* Error */
0168 #define BGMAC_RX_ALIGN_ERRS         0x414       /* Error */
0169 #define BGMAC_RX_SYMBOL_ERRS            0x418       /* Error */
0170 #define BGMAC_RX_PAUSE_PKTS         0x41c
0171 #define BGMAC_RX_NONPAUSE_PKTS          0x420
0172 #define BGMAC_RX_SACHANGES          0x424
0173 #define BGMAC_RX_UNI_PKTS           0x428
0174 #define BGMAC_UNIMAC                0x800
0175 
0176 /* BCMA GMAC core specific IO Control (BCMA_IOCTL) flags */
0177 #define BGMAC_BCMA_IOCTL_SW_CLKEN       0x00000004  /* PHY Clock Enable */
0178 #define BGMAC_BCMA_IOCTL_SW_RESET       0x00000008  /* PHY Reset */
0179 /* The IOCTL values appear to be different in NS, NSP, and NS2, and do not match
0180  * the values directly above
0181  */
0182 #define BGMAC_CLK_EN                BIT(0)
0183 #define BGMAC_RESERVED_0            BIT(1)
0184 #define BGMAC_SOURCE_SYNC_MODE_EN       BIT(2)
0185 #define BGMAC_DEST_SYNC_MODE_EN         BIT(3)
0186 #define BGMAC_TX_CLK_OUT_INVERT_EN      BIT(4)
0187 #define BGMAC_DIRECT_GMII_MODE          BIT(5)
0188 #define BGMAC_CLK_250_SEL           BIT(6)
0189 #define BGMAC_AWCACHE               (0xf << 7)
0190 #define BGMAC_RESERVED_1            (0x1f << 11)
0191 #define BGMAC_ARCACHE               (0xf << 16)
0192 #define BGMAC_AWUSER                (0x3f << 20)
0193 #define BGMAC_ARUSER                (0x3f << 26)
0194 #define BGMAC_RESERVED              BIT(31)
0195 
0196 /* BCMA GMAC core specific IO status (BCMA_IOST) flags */
0197 #define BGMAC_BCMA_IOST_ATTACHED        0x00000800
0198 
0199 #define BGMAC_NUM_MIB_TX_REGS   \
0200         (((BGMAC_TX_Q3_OCTETS_HIGH - BGMAC_TX_GOOD_OCTETS) / 4) + 1)
0201 #define BGMAC_NUM_MIB_RX_REGS   \
0202         (((BGMAC_RX_UNI_PKTS - BGMAC_RX_GOOD_OCTETS) / 4) + 1)
0203 
0204 #define BGMAC_DMA_TX_CTL            0x00
0205 #define  BGMAC_DMA_TX_ENABLE            0x00000001
0206 #define  BGMAC_DMA_TX_SUSPEND           0x00000002
0207 #define  BGMAC_DMA_TX_LOOPBACK          0x00000004
0208 #define  BGMAC_DMA_TX_FLUSH         0x00000010
0209 #define  BGMAC_DMA_TX_MR_MASK           0x000000C0  /* Multiple outstanding reads */
0210 #define  BGMAC_DMA_TX_MR_SHIFT          6
0211 #define   BGMAC_DMA_TX_MR_1         0
0212 #define   BGMAC_DMA_TX_MR_2         1
0213 #define  BGMAC_DMA_TX_PARITY_DISABLE        0x00000800
0214 #define  BGMAC_DMA_TX_ADDREXT_MASK      0x00030000
0215 #define  BGMAC_DMA_TX_ADDREXT_SHIFT     16
0216 #define  BGMAC_DMA_TX_BL_MASK           0x001C0000  /* BurstLen bits */
0217 #define  BGMAC_DMA_TX_BL_SHIFT          18
0218 #define   BGMAC_DMA_TX_BL_16            0
0219 #define   BGMAC_DMA_TX_BL_32            1
0220 #define   BGMAC_DMA_TX_BL_64            2
0221 #define   BGMAC_DMA_TX_BL_128           3
0222 #define   BGMAC_DMA_TX_BL_256           4
0223 #define   BGMAC_DMA_TX_BL_512           5
0224 #define   BGMAC_DMA_TX_BL_1024          6
0225 #define  BGMAC_DMA_TX_PC_MASK           0x00E00000  /* Prefetch control */
0226 #define  BGMAC_DMA_TX_PC_SHIFT          21
0227 #define   BGMAC_DMA_TX_PC_0         0
0228 #define   BGMAC_DMA_TX_PC_4         1
0229 #define   BGMAC_DMA_TX_PC_8         2
0230 #define   BGMAC_DMA_TX_PC_16            3
0231 #define  BGMAC_DMA_TX_PT_MASK           0x03000000  /* Prefetch threshold */
0232 #define  BGMAC_DMA_TX_PT_SHIFT          24
0233 #define   BGMAC_DMA_TX_PT_1         0
0234 #define   BGMAC_DMA_TX_PT_2         1
0235 #define   BGMAC_DMA_TX_PT_4         2
0236 #define   BGMAC_DMA_TX_PT_8         3
0237 #define BGMAC_DMA_TX_INDEX          0x04
0238 #define BGMAC_DMA_TX_RINGLO         0x08
0239 #define BGMAC_DMA_TX_RINGHI         0x0C
0240 #define BGMAC_DMA_TX_STATUS         0x10
0241 #define  BGMAC_DMA_TX_STATDPTR          0x00001FFF
0242 #define  BGMAC_DMA_TX_STAT          0xF0000000
0243 #define   BGMAC_DMA_TX_STAT_DISABLED        0x00000000
0244 #define   BGMAC_DMA_TX_STAT_ACTIVE      0x10000000
0245 #define   BGMAC_DMA_TX_STAT_IDLEWAIT        0x20000000
0246 #define   BGMAC_DMA_TX_STAT_STOPPED     0x30000000
0247 #define   BGMAC_DMA_TX_STAT_SUSP        0x40000000
0248 #define BGMAC_DMA_TX_ERROR          0x14
0249 #define  BGMAC_DMA_TX_ERRDPTR           0x0001FFFF
0250 #define  BGMAC_DMA_TX_ERR           0xF0000000
0251 #define   BGMAC_DMA_TX_ERR_NOERR        0x00000000
0252 #define   BGMAC_DMA_TX_ERR_PROT         0x10000000
0253 #define   BGMAC_DMA_TX_ERR_UNDERRUN     0x20000000
0254 #define   BGMAC_DMA_TX_ERR_TRANSFER     0x30000000
0255 #define   BGMAC_DMA_TX_ERR_DESCREAD     0x40000000
0256 #define   BGMAC_DMA_TX_ERR_CORE         0x50000000
0257 #define BGMAC_DMA_RX_CTL            0x20
0258 #define  BGMAC_DMA_RX_ENABLE            0x00000001
0259 #define  BGMAC_DMA_RX_FRAME_OFFSET_MASK     0x000000FE
0260 #define  BGMAC_DMA_RX_FRAME_OFFSET_SHIFT    1
0261 #define  BGMAC_DMA_RX_DIRECT_FIFO       0x00000100
0262 #define  BGMAC_DMA_RX_OVERFLOW_CONT     0x00000400
0263 #define  BGMAC_DMA_RX_PARITY_DISABLE        0x00000800
0264 #define  BGMAC_DMA_RX_MR_MASK           0x000000C0  /* Multiple outstanding reads */
0265 #define  BGMAC_DMA_RX_MR_SHIFT          6
0266 #define   BGMAC_DMA_TX_MR_1         0
0267 #define   BGMAC_DMA_TX_MR_2         1
0268 #define  BGMAC_DMA_RX_ADDREXT_MASK      0x00030000
0269 #define  BGMAC_DMA_RX_ADDREXT_SHIFT     16
0270 #define  BGMAC_DMA_RX_BL_MASK           0x001C0000  /* BurstLen bits */
0271 #define  BGMAC_DMA_RX_BL_SHIFT          18
0272 #define   BGMAC_DMA_RX_BL_16            0
0273 #define   BGMAC_DMA_RX_BL_32            1
0274 #define   BGMAC_DMA_RX_BL_64            2
0275 #define   BGMAC_DMA_RX_BL_128           3
0276 #define   BGMAC_DMA_RX_BL_256           4
0277 #define   BGMAC_DMA_RX_BL_512           5
0278 #define   BGMAC_DMA_RX_BL_1024          6
0279 #define  BGMAC_DMA_RX_PC_MASK           0x00E00000  /* Prefetch control */
0280 #define  BGMAC_DMA_RX_PC_SHIFT          21
0281 #define   BGMAC_DMA_RX_PC_0         0
0282 #define   BGMAC_DMA_RX_PC_4         1
0283 #define   BGMAC_DMA_RX_PC_8         2
0284 #define   BGMAC_DMA_RX_PC_16            3
0285 #define  BGMAC_DMA_RX_PT_MASK           0x03000000  /* Prefetch threshold */
0286 #define  BGMAC_DMA_RX_PT_SHIFT          24
0287 #define   BGMAC_DMA_RX_PT_1         0
0288 #define   BGMAC_DMA_RX_PT_2         1
0289 #define   BGMAC_DMA_RX_PT_4         2
0290 #define   BGMAC_DMA_RX_PT_8         3
0291 #define BGMAC_DMA_RX_INDEX          0x24
0292 #define BGMAC_DMA_RX_RINGLO         0x28
0293 #define BGMAC_DMA_RX_RINGHI         0x2C
0294 #define BGMAC_DMA_RX_STATUS         0x30
0295 #define  BGMAC_DMA_RX_STATDPTR          0x00001FFF
0296 #define  BGMAC_DMA_RX_STAT          0xF0000000
0297 #define   BGMAC_DMA_RX_STAT_DISABLED        0x00000000
0298 #define   BGMAC_DMA_RX_STAT_ACTIVE      0x10000000
0299 #define   BGMAC_DMA_RX_STAT_IDLEWAIT        0x20000000
0300 #define   BGMAC_DMA_RX_STAT_STOPPED     0x30000000
0301 #define   BGMAC_DMA_RX_STAT_SUSP        0x40000000
0302 #define BGMAC_DMA_RX_ERROR          0x34
0303 #define  BGMAC_DMA_RX_ERRDPTR           0x0001FFFF
0304 #define  BGMAC_DMA_RX_ERR           0xF0000000
0305 #define   BGMAC_DMA_RX_ERR_NOERR        0x00000000
0306 #define   BGMAC_DMA_RX_ERR_PROT         0x10000000
0307 #define   BGMAC_DMA_RX_ERR_UNDERRUN     0x20000000
0308 #define   BGMAC_DMA_RX_ERR_TRANSFER     0x30000000
0309 #define   BGMAC_DMA_RX_ERR_DESCREAD     0x40000000
0310 #define   BGMAC_DMA_RX_ERR_CORE         0x50000000
0311 
0312 #define BGMAC_DESC_CTL0_EOT         0x10000000  /* End of ring */
0313 #define BGMAC_DESC_CTL0_IOC         0x20000000  /* IRQ on complete */
0314 #define BGMAC_DESC_CTL0_EOF         0x40000000  /* End of frame */
0315 #define BGMAC_DESC_CTL0_SOF         0x80000000  /* Start of frame */
0316 #define BGMAC_DESC_CTL1_LEN         0x00003FFF
0317 
0318 #define BGMAC_PHY_NOREGS            BRCM_PSEUDO_PHY_ADDR
0319 #define BGMAC_PHY_MASK              0x1F
0320 
0321 #define BGMAC_MAX_TX_RINGS          4
0322 #define BGMAC_MAX_RX_RINGS          1
0323 
0324 #define BGMAC_TX_RING_SLOTS         128
0325 #define BGMAC_RX_RING_SLOTS         512
0326 
0327 #define BGMAC_RX_HEADER_LEN         28      /* Last 24 bytes are unused. Well... */
0328 #define BGMAC_RX_FRAME_OFFSET           30      /* There are 2 unused bytes between header and real data */
0329 #define BGMAC_RX_BUF_OFFSET         (NET_SKB_PAD + NET_IP_ALIGN - \
0330                          BGMAC_RX_FRAME_OFFSET)
0331 /* Jumbo frame size with FCS */
0332 #define BGMAC_RX_MAX_FRAME_SIZE         9724
0333 #define BGMAC_RX_BUF_SIZE           (BGMAC_RX_FRAME_OFFSET + BGMAC_RX_MAX_FRAME_SIZE)
0334 #define BGMAC_RX_ALLOC_SIZE         (SKB_DATA_ALIGN(BGMAC_RX_BUF_SIZE + BGMAC_RX_BUF_OFFSET) + \
0335                          SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
0336 
0337 #define BGMAC_BFL_ENETROBO          0x0010      /* has ephy roboswitch spi */
0338 #define BGMAC_BFL_ENETADM           0x0080      /* has ADMtek switch */
0339 #define BGMAC_BFL_ENETVLAN          0x0100      /* can do vlan */
0340 
0341 #define BGMAC_CHIPCTL_1_IF_TYPE_MASK        0x00000030
0342 #define BGMAC_CHIPCTL_1_IF_TYPE_RMII        0x00000000
0343 #define BGMAC_CHIPCTL_1_IF_TYPE_MII     0x00000010
0344 #define BGMAC_CHIPCTL_1_IF_TYPE_RGMII       0x00000020
0345 #define BGMAC_CHIPCTL_1_SW_TYPE_MASK        0x000000C0
0346 #define BGMAC_CHIPCTL_1_SW_TYPE_EPHY        0x00000000
0347 #define BGMAC_CHIPCTL_1_SW_TYPE_EPHYMII     0x00000040
0348 #define BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII    0x00000080
0349 #define BGMAC_CHIPCTL_1_SW_TYPE_RGMII       0x000000C0
0350 #define BGMAC_CHIPCTL_1_RXC_DLL_BYPASS      0x00010000
0351 
0352 #define BGMAC_CHIPCTL_4_IF_TYPE_MASK        0x00003000
0353 #define BGMAC_CHIPCTL_4_IF_TYPE_RMII        0x00000000
0354 #define BGMAC_CHIPCTL_4_IF_TYPE_MII     0x00001000
0355 #define BGMAC_CHIPCTL_4_IF_TYPE_RGMII       0x00002000
0356 #define BGMAC_CHIPCTL_4_SW_TYPE_MASK        0x0000C000
0357 #define BGMAC_CHIPCTL_4_SW_TYPE_EPHY        0x00000000
0358 #define BGMAC_CHIPCTL_4_SW_TYPE_EPHYMII     0x00004000
0359 #define BGMAC_CHIPCTL_4_SW_TYPE_EPHYRMII    0x00008000
0360 #define BGMAC_CHIPCTL_4_SW_TYPE_RGMII       0x0000C000
0361 
0362 #define BGMAC_CHIPCTL_7_IF_TYPE_MASK        0x000000C0
0363 #define BGMAC_CHIPCTL_7_IF_TYPE_RMII        0x00000000
0364 #define BGMAC_CHIPCTL_7_IF_TYPE_MII     0x00000040
0365 #define BGMAC_CHIPCTL_7_IF_TYPE_RGMII       0x00000080
0366 
0367 #define ETHER_MAX_LEN   (ETH_FRAME_LEN + ETH_FCS_LEN)
0368 
0369 /* Feature Flags */
0370 #define BGMAC_FEAT_TX_MASK_SETUP    BIT(0)
0371 #define BGMAC_FEAT_RX_MASK_SETUP    BIT(1)
0372 #define BGMAC_FEAT_IOST_ATTACHED    BIT(2)
0373 #define BGMAC_FEAT_NO_RESET     BIT(3)
0374 #define BGMAC_FEAT_MISC_PLL_REQ     BIT(4)
0375 #define BGMAC_FEAT_SW_TYPE_PHY      BIT(5)
0376 #define BGMAC_FEAT_SW_TYPE_EPHYRMII BIT(6)
0377 #define BGMAC_FEAT_SW_TYPE_RGMII    BIT(7)
0378 #define BGMAC_FEAT_CMN_PHY_CTL      BIT(8)
0379 #define BGMAC_FEAT_FLW_CTRL1        BIT(9)
0380 #define BGMAC_FEAT_FLW_CTRL2        BIT(10)
0381 #define BGMAC_FEAT_SET_RXQ_CLK      BIT(11)
0382 #define BGMAC_FEAT_CLKCTLST     BIT(12)
0383 #define BGMAC_FEAT_NO_CLR_MIB       BIT(13)
0384 #define BGMAC_FEAT_FORCE_SPEED_2500 BIT(14)
0385 #define BGMAC_FEAT_CMDCFG_SR_REV4   BIT(15)
0386 #define BGMAC_FEAT_IRQ_ID_OOB_6     BIT(16)
0387 #define BGMAC_FEAT_CC4_IF_SW_TYPE   BIT(17)
0388 #define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII BIT(18)
0389 #define BGMAC_FEAT_CC7_IF_TYPE_RGMII    BIT(19)
0390 #define BGMAC_FEAT_IDM_MASK     BIT(20)
0391 
0392 struct bgmac_slot_info {
0393     union {
0394         struct sk_buff *skb;
0395         void *buf;
0396     };
0397     dma_addr_t dma_addr;
0398 };
0399 
0400 struct bgmac_dma_desc {
0401     __le32 ctl0;
0402     __le32 ctl1;
0403     __le32 addr_low;
0404     __le32 addr_high;
0405 } __packed;
0406 
0407 enum bgmac_dma_ring_type {
0408     BGMAC_DMA_RING_TX,
0409     BGMAC_DMA_RING_RX,
0410 };
0411 
0412 /**
0413  * bgmac_dma_ring - contains info about DMA ring (either TX or RX one)
0414  * @start: index of the first slot containing data
0415  * @end: index of a slot that can *not* be read (yet)
0416  *
0417  * Be really aware of the specific @end meaning. It's an index of a slot *after*
0418  * the one containing data that can be read. If @start equals @end the ring is
0419  * empty.
0420  */
0421 struct bgmac_dma_ring {
0422     u32 start;
0423     u32 end;
0424 
0425     struct bgmac_dma_desc *cpu_base;
0426     dma_addr_t dma_base;
0427     u32 index_base; /* Used for unaligned rings only, otherwise 0 */
0428     u16 mmio_base;
0429     bool unaligned;
0430 
0431     struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS];
0432 };
0433 
0434 struct bgmac_rx_header {
0435     __le16 len;
0436     __le16 flags;
0437     __le16 pad[12];
0438 };
0439 
0440 struct bgmac {
0441     union {
0442         struct {
0443             void __iomem *base;
0444             void __iomem *idm_base;
0445             void __iomem *nicpm_base;
0446         } plat;
0447         struct {
0448             struct bcma_device *core;
0449             /* Reference to CMN core for BCM4706 */
0450             struct bcma_device *cmn;
0451         } bcma;
0452     };
0453 
0454     struct device *dev;
0455     struct device *dma_dev;
0456     u32 feature_flags;
0457 
0458     struct net_device *net_dev;
0459     struct napi_struct napi;
0460     struct mii_bus *mii_bus;
0461 
0462     /* DMA */
0463     struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];
0464     struct bgmac_dma_ring rx_ring[BGMAC_MAX_RX_RINGS];
0465 
0466     /* Stats */
0467     bool stats_grabbed;
0468     u32 mib_tx_regs[BGMAC_NUM_MIB_TX_REGS];
0469     u32 mib_rx_regs[BGMAC_NUM_MIB_RX_REGS];
0470 
0471     /* Int */
0472     int irq;
0473     u32 int_mask;
0474 
0475     /* Current MAC state */
0476     int mac_speed;
0477     int mac_duplex;
0478 
0479     u8 phyaddr;
0480     bool has_robosw;
0481 
0482     bool loopback;
0483 
0484     u32 (*read)(struct bgmac *bgmac, u16 offset);
0485     void (*write)(struct bgmac *bgmac, u16 offset, u32 value);
0486     u32 (*idm_read)(struct bgmac *bgmac, u16 offset);
0487     void (*idm_write)(struct bgmac *bgmac, u16 offset, u32 value);
0488     bool (*clk_enabled)(struct bgmac *bgmac);
0489     void (*clk_enable)(struct bgmac *bgmac, u32 flags);
0490     void (*cco_ctl_maskset)(struct bgmac *bgmac, u32 offset, u32 mask,
0491                 u32 set);
0492     u32 (*get_bus_clock)(struct bgmac *bgmac);
0493     void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask,
0494                   u32 set);
0495     int (*phy_connect)(struct bgmac *bgmac);
0496 };
0497 
0498 struct bgmac *bgmac_alloc(struct device *dev);
0499 int bgmac_enet_probe(struct bgmac *bgmac);
0500 void bgmac_enet_remove(struct bgmac *bgmac);
0501 void bgmac_adjust_link(struct net_device *net_dev);
0502 int bgmac_phy_connect_direct(struct bgmac *bgmac);
0503 int bgmac_enet_suspend(struct bgmac *bgmac);
0504 int bgmac_enet_resume(struct bgmac *bgmac);
0505 
0506 struct mii_bus *bcma_mdio_mii_register(struct bgmac *bgmac);
0507 void bcma_mdio_mii_unregister(struct mii_bus *mii_bus);
0508 
0509 static inline u32 bgmac_read(struct bgmac *bgmac, u16 offset)
0510 {
0511     return bgmac->read(bgmac, offset);
0512 }
0513 
0514 static inline void bgmac_write(struct bgmac *bgmac, u16 offset, u32 value)
0515 {
0516     bgmac->write(bgmac, offset, value);
0517 }
0518 
0519 static inline u32 bgmac_umac_read(struct bgmac *bgmac, u16 offset)
0520 {
0521     return bgmac_read(bgmac, BGMAC_UNIMAC + offset);
0522 }
0523 
0524 static inline void bgmac_umac_write(struct bgmac *bgmac, u16 offset, u32 value)
0525 {
0526     bgmac_write(bgmac, BGMAC_UNIMAC + offset, value);
0527 }
0528 
0529 static inline u32 bgmac_idm_read(struct bgmac *bgmac, u16 offset)
0530 {
0531     return bgmac->idm_read(bgmac, offset);
0532 }
0533 
0534 static inline void bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
0535 {
0536     bgmac->idm_write(bgmac, offset, value);
0537 }
0538 
0539 static inline bool bgmac_clk_enabled(struct bgmac *bgmac)
0540 {
0541     return bgmac->clk_enabled(bgmac);
0542 }
0543 
0544 static inline void bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
0545 {
0546     bgmac->clk_enable(bgmac, flags);
0547 }
0548 
0549 static inline void bgmac_cco_ctl_maskset(struct bgmac *bgmac, u32 offset,
0550                      u32 mask, u32 set)
0551 {
0552     bgmac->cco_ctl_maskset(bgmac, offset, mask, set);
0553 }
0554 
0555 static inline u32 bgmac_get_bus_clock(struct bgmac *bgmac)
0556 {
0557     return bgmac->get_bus_clock(bgmac);
0558 }
0559 
0560 static inline void bgmac_cmn_maskset32(struct bgmac *bgmac, u16 offset,
0561                        u32 mask, u32 set)
0562 {
0563     bgmac->cmn_maskset32(bgmac, offset, mask, set);
0564 }
0565 
0566 static inline void bgmac_maskset(struct bgmac *bgmac, u16 offset, u32 mask,
0567                    u32 set)
0568 {
0569     bgmac_write(bgmac, offset, (bgmac_read(bgmac, offset) & mask) | set);
0570 }
0571 
0572 static inline void bgmac_mask(struct bgmac *bgmac, u16 offset, u32 mask)
0573 {
0574     bgmac_maskset(bgmac, offset, mask, 0);
0575 }
0576 
0577 static inline void bgmac_set(struct bgmac *bgmac, u16 offset, u32 set)
0578 {
0579     bgmac_maskset(bgmac, offset, ~0, set);
0580 }
0581 
0582 static inline void bgmac_umac_maskset(struct bgmac *bgmac, u16 offset, u32 mask, u32 set)
0583 {
0584     bgmac_maskset(bgmac, BGMAC_UNIMAC + offset, mask, set);
0585 }
0586 
0587 static inline int bgmac_phy_connect(struct bgmac *bgmac)
0588 {
0589     return bgmac->phy_connect(bgmac);
0590 }
0591 #endif /* _BGMAC_H */