Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Broadcom BCM7xxx System Port Ethernet MAC driver
0004  *
0005  * Copyright (C) 2014 Broadcom Corporation
0006  */
0007 
0008 #ifndef __BCM_SYSPORT_H
0009 #define __BCM_SYSPORT_H
0010 
0011 #include <linux/bitmap.h>
0012 #include <linux/ethtool.h>
0013 #include <linux/if_vlan.h>
0014 #include <linux/dim.h>
0015 
0016 #include "unimac.h"
0017 
0018 /* Receive/transmit descriptor format */
0019 #define DESC_ADDR_HI_STATUS_LEN 0x00
0020 #define  DESC_ADDR_HI_SHIFT 0
0021 #define  DESC_ADDR_HI_MASK  0xff
0022 #define  DESC_STATUS_SHIFT  8
0023 #define  DESC_STATUS_MASK   0x3ff
0024 #define  DESC_LEN_SHIFT     18
0025 #define  DESC_LEN_MASK      0x7fff
0026 #define DESC_ADDR_LO        0x04
0027 
0028 /* HW supports 40-bit addressing hence the */
0029 #define DESC_SIZE       (WORDS_PER_DESC * sizeof(u32))
0030 
0031 /* Default RX buffer allocation size */
0032 #define RX_BUF_LENGTH       2048
0033 
0034 /* Body(1500) + EH_SIZE(14) + VLANTAG(4) + BRCMTAG(4) + FCS(4) = 1526.
0035  * 1536 is multiple of 256 bytes
0036  */
0037 #define ENET_BRCM_TAG_LEN   4
0038 #define ENET_PAD        10
0039 #define UMAC_MAX_MTU_SIZE   (ETH_DATA_LEN + ETH_HLEN + VLAN_HLEN + \
0040                  ENET_BRCM_TAG_LEN + ETH_FCS_LEN + ENET_PAD)
0041 
0042 /* Transmit status block */
0043 struct bcm_tsb {
0044     u32 pcp_dei_vid;
0045 #define PCP_DEI_MASK        0xf
0046 #define VID_SHIFT       4
0047 #define VID_MASK        0xfff
0048     u32 l4_ptr_dest_map;
0049 #define L4_CSUM_PTR_MASK    0x1ff
0050 #define L4_PTR_SHIFT        9
0051 #define L4_PTR_MASK     0x1ff
0052 #define L4_UDP          (1 << 18)
0053 #define L4_LENGTH_VALID     (1 << 19)
0054 #define DEST_MAP_SHIFT      20
0055 #define DEST_MAP_MASK       0x1ff
0056 };
0057 
0058 /* Receive status block uses the same
0059  * definitions as the DMA descriptor
0060  */
0061 struct bcm_rsb {
0062     u32 rx_status_len;
0063     u32 brcm_egress_tag;
0064 };
0065 
0066 /* Common Receive/Transmit status bits */
0067 #define DESC_L4_CSUM        (1 << 7)
0068 #define DESC_SOP        (1 << 8)
0069 #define DESC_EOP        (1 << 9)
0070 
0071 /* Receive Status bits */
0072 #define RX_STATUS_UCAST         0
0073 #define RX_STATUS_BCAST         0x04
0074 #define RX_STATUS_MCAST         0x08
0075 #define RX_STATUS_L2_MCAST      0x0c
0076 #define RX_STATUS_ERR           (1 << 4)
0077 #define RX_STATUS_OVFLOW        (1 << 5)
0078 #define RX_STATUS_PARSE_FAIL        (1 << 6)
0079 
0080 /* Transmit Status bits */
0081 #define TX_STATUS_VLAN_NO_ACT       0x00
0082 #define TX_STATUS_VLAN_PCP_TSB      0x01
0083 #define TX_STATUS_VLAN_QUEUE        0x02
0084 #define TX_STATUS_VLAN_VID_TSB      0x03
0085 #define TX_STATUS_OWR_CRC       (1 << 2)
0086 #define TX_STATUS_APP_CRC       (1 << 3)
0087 #define TX_STATUS_BRCM_TAG_NO_ACT   0
0088 #define TX_STATUS_BRCM_TAG_ZERO     0x10
0089 #define TX_STATUS_BRCM_TAG_ONE_QUEUE    0x20
0090 #define TX_STATUS_BRCM_TAG_ONE_TSB  0x30
0091 #define TX_STATUS_SKIP_BYTES        (1 << 6)
0092 
0093 /* Specific register definitions */
0094 #define SYS_PORT_TOPCTRL_OFFSET     0
0095 #define REV_CNTL            0x00
0096 #define  REV_MASK           0xffff
0097 
0098 #define RX_FLUSH_CNTL           0x04
0099 #define  RX_FLUSH           (1 << 0)
0100 
0101 #define TX_FLUSH_CNTL           0x08
0102 #define  TX_FLUSH           (1 << 0)
0103 
0104 #define MISC_CNTL           0x0c
0105 #define  SYS_CLK_SEL            (1 << 0)
0106 #define  TDMA_EOP_SEL           (1 << 1)
0107 
0108 /* Level-2 Interrupt controller offsets and defines */
0109 #define SYS_PORT_INTRL2_0_OFFSET    0x200
0110 #define SYS_PORT_INTRL2_1_OFFSET    0x240
0111 #define INTRL2_CPU_STATUS       0x00
0112 #define INTRL2_CPU_SET          0x04
0113 #define INTRL2_CPU_CLEAR        0x08
0114 #define INTRL2_CPU_MASK_STATUS      0x0c
0115 #define INTRL2_CPU_MASK_SET     0x10
0116 #define INTRL2_CPU_MASK_CLEAR       0x14
0117 
0118 /* Level-2 instance 0 interrupt bits */
0119 #define INTRL2_0_GISB_ERR       (1 << 0)
0120 #define INTRL2_0_RBUF_OVFLOW        (1 << 1)
0121 #define INTRL2_0_TBUF_UNDFLOW       (1 << 2)
0122 #define INTRL2_0_MPD            (1 << 3)
0123 #define INTRL2_0_BRCM_MATCH_TAG     (1 << 4)
0124 #define INTRL2_0_RDMA_MBDONE        (1 << 5)
0125 #define INTRL2_0_OVER_MAX_THRESH    (1 << 6)
0126 #define INTRL2_0_BELOW_HYST_THRESH  (1 << 7)
0127 #define INTRL2_0_FREE_LIST_EMPTY    (1 << 8)
0128 #define INTRL2_0_TX_RING_FULL       (1 << 9)
0129 #define INTRL2_0_DESC_ALLOC_ERR     (1 << 10)
0130 #define INTRL2_0_UNEXP_PKTSIZE_ACK  (1 << 11)
0131 
0132 /* SYSTEMPORT Lite groups the TX queues interrupts on instance 0 */
0133 #define INTRL2_0_TDMA_MBDONE_SHIFT  12
0134 #define INTRL2_0_TDMA_MBDONE_MASK   (0xffff << INTRL2_0_TDMA_MBDONE_SHIFT)
0135 
0136 /* RXCHK offset and defines */
0137 #define SYS_PORT_RXCHK_OFFSET       0x300
0138 
0139 #define RXCHK_CONTROL           0x00
0140 #define  RXCHK_EN           (1 << 0)
0141 #define  RXCHK_SKIP_FCS         (1 << 1)
0142 #define  RXCHK_BAD_CSUM_DIS     (1 << 2)
0143 #define  RXCHK_BRCM_TAG_EN      (1 << 3)
0144 #define  RXCHK_BRCM_TAG_MATCH_SHIFT 4
0145 #define  RXCHK_BRCM_TAG_MATCH_MASK  0xff
0146 #define  RXCHK_PARSE_TNL        (1 << 12)
0147 #define  RXCHK_VIOL_EN          (1 << 13)
0148 #define  RXCHK_VIOL_DIS         (1 << 14)
0149 #define  RXCHK_INCOM_PKT        (1 << 15)
0150 #define  RXCHK_V6_DUPEXT_EN     (1 << 16)
0151 #define  RXCHK_V6_DUPEXT_DIS        (1 << 17)
0152 #define  RXCHK_ETHERTYPE_DIS        (1 << 18)
0153 #define  RXCHK_L2_HDR_DIS       (1 << 19)
0154 #define  RXCHK_L3_HDR_DIS       (1 << 20)
0155 #define  RXCHK_MAC_RX_ERR_DIS       (1 << 21)
0156 #define  RXCHK_PARSE_AUTH       (1 << 22)
0157 
0158 #define RXCHK_BRCM_TAG0         0x04
0159 #define RXCHK_BRCM_TAG(i)       ((i) * 0x4 + RXCHK_BRCM_TAG0)
0160 #define RXCHK_BRCM_TAG0_MASK        0x24
0161 #define RXCHK_BRCM_TAG_MASK(i)      ((i) * 0x4 + RXCHK_BRCM_TAG0_MASK)
0162 #define RXCHK_BRCM_TAG_MATCH_STATUS 0x44
0163 #define RXCHK_ETHERTYPE         0x48
0164 #define RXCHK_BAD_CSUM_CNTR     0x4C
0165 #define RXCHK_OTHER_DISC_CNTR       0x50
0166 
0167 #define RXCHK_BRCM_TAG_MAX      8
0168 #define RXCHK_BRCM_TAG_CID_SHIFT    16
0169 #define RXCHK_BRCM_TAG_CID_MASK     0xff
0170 
0171 /* TXCHCK offsets and defines */
0172 #define SYS_PORT_TXCHK_OFFSET       0x380
0173 #define TXCHK_PKT_RDY_THRESH        0x00
0174 
0175 /* Receive buffer offset and defines */
0176 #define SYS_PORT_RBUF_OFFSET        0x400
0177 
0178 #define RBUF_CONTROL            0x00
0179 #define  RBUF_RSB_EN            (1 << 0)
0180 #define  RBUF_4B_ALGN           (1 << 1)
0181 #define  RBUF_BRCM_TAG_STRIP        (1 << 2)
0182 #define  RBUF_BAD_PKT_DISC      (1 << 3)
0183 #define  RBUF_RESUME_THRESH_SHIFT   4
0184 #define  RBUF_RESUME_THRESH_MASK    0xff
0185 #define  RBUF_OK_TO_SEND_SHIFT      12
0186 #define  RBUF_OK_TO_SEND_MASK       0xff
0187 #define  RBUF_CRC_REPLACE       (1 << 20)
0188 #define  RBUF_OK_TO_SEND_MODE       (1 << 21)
0189 /* SYSTEMPORT Lite uses two bits here */
0190 #define  RBUF_RSB_SWAP0         (1 << 22)
0191 #define  RBUF_RSB_SWAP1         (1 << 23)
0192 #define  RBUF_ACPI_EN           (1 << 23)
0193 #define  RBUF_ACPI_EN_LITE      (1 << 24)
0194 
0195 #define RBUF_PKT_RDY_THRESH     0x04
0196 
0197 #define RBUF_STATUS         0x08
0198 #define  RBUF_WOL_MODE          (1 << 0)
0199 #define  RBUF_MPD           (1 << 1)
0200 #define  RBUF_ACPI          (1 << 2)
0201 
0202 #define RBUF_OVFL_DISC_CNTR     0x0c
0203 #define RBUF_ERR_PKT_CNTR       0x10
0204 
0205 /* Transmit buffer offset and defines */
0206 #define SYS_PORT_TBUF_OFFSET        0x600
0207 
0208 #define TBUF_CONTROL            0x00
0209 #define  TBUF_BP_EN         (1 << 0)
0210 #define  TBUF_MAX_PKT_THRESH_SHIFT  1
0211 #define  TBUF_MAX_PKT_THRESH_MASK   0x1f
0212 #define  TBUF_FULL_THRESH_SHIFT     8
0213 #define  TBUF_FULL_THRESH_MASK      0x1f
0214 
0215 /* UniMAC offset and defines */
0216 #define SYS_PORT_UMAC_OFFSET        0x800
0217 
0218 #define UMAC_MIB_START          0x400
0219 
0220 /* There is a 0xC gap between the end of RX and beginning of TX stats and then
0221  * between the end of TX stats and the beginning of the RX RUNT
0222  */
0223 #define UMAC_MIB_STAT_OFFSET        0xc
0224 
0225 #define UMAC_MIB_CTRL           0x580
0226 #define  MIB_RX_CNT_RST         (1 << 0)
0227 #define  MIB_RUNT_CNT_RST       (1 << 1)
0228 #define  MIB_TX_CNT_RST         (1 << 2)
0229 
0230 /* These offsets are valid for SYSTEMPORT and SYSTEMPORT Lite */
0231 #define UMAC_MPD_CTRL           0x620
0232 #define  MPD_EN             (1 << 0)
0233 #define  MSEQ_LEN_SHIFT         16
0234 #define  MSEQ_LEN_MASK          0xff
0235 #define  PSW_EN             (1 << 27)
0236 
0237 #define UMAC_PSW_MS         0x624
0238 #define UMAC_PSW_LS         0x628
0239 #define UMAC_MDF_CTRL           0x650
0240 #define UMAC_MDF_ADDR           0x654
0241 
0242 /* Only valid on SYSTEMPORT Lite */
0243 #define SYS_PORT_GIB_OFFSET     0x1000
0244 
0245 #define GIB_CONTROL         0x00
0246 #define  GIB_TX_EN          (1 << 0)
0247 #define  GIB_RX_EN          (1 << 1)
0248 #define  GIB_TX_FLUSH           (1 << 2)
0249 #define  GIB_RX_FLUSH           (1 << 3)
0250 #define  GIB_GTX_CLK_SEL_SHIFT      4
0251 #define  GIB_GTX_CLK_EXT_CLK        (0 << GIB_GTX_CLK_SEL_SHIFT)
0252 #define  GIB_GTX_CLK_125MHZ     (1 << GIB_GTX_CLK_SEL_SHIFT)
0253 #define  GIB_GTX_CLK_250MHZ     (2 << GIB_GTX_CLK_SEL_SHIFT)
0254 #define  GIB_FCS_STRIP_SHIFT        6
0255 #define  GIB_FCS_STRIP          (1 << GIB_FCS_STRIP_SHIFT)
0256 #define  GIB_LCL_LOOP_EN        (1 << 7)
0257 #define  GIB_LCL_LOOP_TXEN      (1 << 8)
0258 #define  GIB_RMT_LOOP_EN        (1 << 9)
0259 #define  GIB_RMT_LOOP_RXEN      (1 << 10)
0260 #define  GIB_RX_PAUSE_EN        (1 << 11)
0261 #define  GIB_PREAMBLE_LEN_SHIFT     12
0262 #define  GIB_PREAMBLE_LEN_MASK      0xf
0263 #define  GIB_IPG_LEN_SHIFT      16
0264 #define  GIB_IPG_LEN_MASK       0x3f
0265 #define  GIB_PAD_EXTENSION_SHIFT    22
0266 #define  GIB_PAD_EXTENSION_MASK     0x3f
0267 
0268 #define GIB_MAC1            0x08
0269 #define GIB_MAC0            0x0c
0270 
0271 /* Receive DMA offset and defines */
0272 #define SYS_PORT_RDMA_OFFSET        0x2000
0273 
0274 #define RDMA_CONTROL            0x1000
0275 #define  RDMA_EN            (1 << 0)
0276 #define  RDMA_RING_CFG          (1 << 1)
0277 #define  RDMA_DISC_EN           (1 << 2)
0278 #define  RDMA_BUF_DATA_OFFSET_SHIFT 4
0279 #define  RDMA_BUF_DATA_OFFSET_MASK  0x3ff
0280 
0281 #define RDMA_STATUS         0x1004
0282 #define  RDMA_DISABLED          (1 << 0)
0283 #define  RDMA_DESC_RAM_INIT_BUSY    (1 << 1)
0284 #define  RDMA_BP_STATUS         (1 << 2)
0285 
0286 #define RDMA_SCB_BURST_SIZE     0x1008
0287 
0288 #define RDMA_RING_BUF_SIZE      0x100c
0289 #define  RDMA_RING_SIZE_SHIFT       16
0290 
0291 #define RDMA_WRITE_PTR_HI       0x1010
0292 #define RDMA_WRITE_PTR_LO       0x1014
0293 #define RDMA_PROD_INDEX         0x1018
0294 #define  RDMA_PROD_INDEX_MASK       0xffff
0295 
0296 #define RDMA_CONS_INDEX         0x101c
0297 #define  RDMA_CONS_INDEX_MASK       0xffff
0298 
0299 #define RDMA_START_ADDR_HI      0x1020
0300 #define RDMA_START_ADDR_LO      0x1024
0301 #define RDMA_END_ADDR_HI        0x1028
0302 #define RDMA_END_ADDR_LO        0x102c
0303 
0304 #define RDMA_MBDONE_INTR        0x1030
0305 #define  RDMA_INTR_THRESH_MASK      0x1ff
0306 #define  RDMA_TIMEOUT_SHIFT     16
0307 #define  RDMA_TIMEOUT_MASK      0xffff
0308 
0309 #define RDMA_XON_XOFF_THRESH        0x1034
0310 #define  RDMA_XON_XOFF_THRESH_MASK  0xffff
0311 #define  RDMA_XOFF_THRESH_SHIFT     16
0312 
0313 #define RDMA_READ_PTR_HI        0x1038
0314 #define RDMA_READ_PTR_LO        0x103c
0315 
0316 #define RDMA_OVERRIDE           0x1040
0317 #define  RDMA_LE_MODE           (1 << 0)
0318 #define  RDMA_REG_MODE          (1 << 1)
0319 
0320 #define RDMA_TEST           0x1044
0321 #define  RDMA_TP_OUT_SEL        (1 << 0)
0322 #define  RDMA_MEM_SEL           (1 << 1)
0323 
0324 #define RDMA_DEBUG          0x1048
0325 
0326 /* Transmit DMA offset and defines */
0327 #define TDMA_NUM_RINGS          32  /* rings = queues */
0328 #define TDMA_PORT_SIZE          DESC_SIZE /* two 32-bits words */
0329 
0330 #define SYS_PORT_TDMA_OFFSET        0x4000
0331 #define TDMA_WRITE_PORT_OFFSET      0x0000
0332 #define TDMA_WRITE_PORT_HI(i)       (TDMA_WRITE_PORT_OFFSET + \
0333                     (i) * TDMA_PORT_SIZE)
0334 #define TDMA_WRITE_PORT_LO(i)       (TDMA_WRITE_PORT_OFFSET + \
0335                     sizeof(u32) + (i) * TDMA_PORT_SIZE)
0336 
0337 #define TDMA_READ_PORT_OFFSET       (TDMA_WRITE_PORT_OFFSET + \
0338                     (TDMA_NUM_RINGS * TDMA_PORT_SIZE))
0339 #define TDMA_READ_PORT_HI(i)        (TDMA_READ_PORT_OFFSET + \
0340                     (i) * TDMA_PORT_SIZE)
0341 #define TDMA_READ_PORT_LO(i)        (TDMA_READ_PORT_OFFSET + \
0342                     sizeof(u32) + (i) * TDMA_PORT_SIZE)
0343 
0344 #define TDMA_READ_PORT_CMD_OFFSET   (TDMA_READ_PORT_OFFSET + \
0345                     (TDMA_NUM_RINGS * TDMA_PORT_SIZE))
0346 #define TDMA_READ_PORT_CMD(i)       (TDMA_READ_PORT_CMD_OFFSET + \
0347                     (i) * sizeof(u32))
0348 
0349 #define TDMA_DESC_RING_00_BASE      (TDMA_READ_PORT_CMD_OFFSET + \
0350                     (TDMA_NUM_RINGS * sizeof(u32)))
0351 
0352 /* Register offsets and defines relatives to a specific ring number */
0353 #define RING_HEAD_TAIL_PTR      0x00
0354 #define  RING_HEAD_MASK         0x7ff
0355 #define  RING_TAIL_SHIFT        11
0356 #define  RING_TAIL_MASK         0x7ff
0357 #define  RING_FLUSH         (1 << 24)
0358 #define  RING_EN            (1 << 25)
0359 
0360 #define RING_COUNT          0x04
0361 #define  RING_COUNT_MASK        0x7ff
0362 #define  RING_BUFF_DONE_SHIFT       11
0363 #define  RING_BUFF_DONE_MASK        0x7ff
0364 
0365 #define RING_MAX_HYST           0x08
0366 #define  RING_MAX_THRESH_MASK       0x7ff
0367 #define  RING_HYST_THRESH_SHIFT     11
0368 #define  RING_HYST_THRESH_MASK      0x7ff
0369 
0370 #define RING_INTR_CONTROL       0x0c
0371 #define  RING_INTR_THRESH_MASK      0x7ff
0372 #define  RING_EMPTY_INTR_EN     (1 << 15)
0373 #define  RING_TIMEOUT_SHIFT     16
0374 #define  RING_TIMEOUT_MASK      0xffff
0375 
0376 #define RING_PROD_CONS_INDEX        0x10
0377 #define  RING_PROD_INDEX_MASK       0xffff
0378 #define  RING_CONS_INDEX_SHIFT      16
0379 #define  RING_CONS_INDEX_MASK       0xffff
0380 
0381 #define RING_MAPPING            0x14
0382 #define  RING_QID_MASK          0x7
0383 #define  RING_PORT_ID_SHIFT     3
0384 #define  RING_PORT_ID_MASK      0x7
0385 #define  RING_IGNORE_STATUS     (1 << 6)
0386 #define  RING_FAILOVER_EN       (1 << 7)
0387 #define  RING_CREDIT_SHIFT      8
0388 #define  RING_CREDIT_MASK       0xffff
0389 
0390 #define RING_PCP_DEI_VID        0x18
0391 #define  RING_VID_MASK          0x7ff
0392 #define  RING_DEI           (1 << 12)
0393 #define  RING_PCP_SHIFT         13
0394 #define  RING_PCP_MASK          0x7
0395 #define  RING_PKT_SIZE_ADJ_SHIFT    16
0396 #define  RING_PKT_SIZE_ADJ_MASK     0xf
0397 
0398 #define TDMA_DESC_RING_SIZE     28
0399 
0400 /* Defininition for a given TX ring base address */
0401 #define TDMA_DESC_RING_BASE(i)      (TDMA_DESC_RING_00_BASE + \
0402                     ((i) * TDMA_DESC_RING_SIZE))
0403 
0404 /* Ring indexed register addreses */
0405 #define TDMA_DESC_RING_HEAD_TAIL_PTR(i) (TDMA_DESC_RING_BASE(i) + \
0406                     RING_HEAD_TAIL_PTR)
0407 #define TDMA_DESC_RING_COUNT(i)     (TDMA_DESC_RING_BASE(i) + \
0408                     RING_COUNT)
0409 #define TDMA_DESC_RING_MAX_HYST(i)  (TDMA_DESC_RING_BASE(i) + \
0410                     RING_MAX_HYST)
0411 #define TDMA_DESC_RING_INTR_CONTROL(i)  (TDMA_DESC_RING_BASE(i) + \
0412                     RING_INTR_CONTROL)
0413 #define TDMA_DESC_RING_PROD_CONS_INDEX(i) \
0414                     (TDMA_DESC_RING_BASE(i) + \
0415                     RING_PROD_CONS_INDEX)
0416 #define TDMA_DESC_RING_MAPPING(i)   (TDMA_DESC_RING_BASE(i) + \
0417                     RING_MAPPING)
0418 #define TDMA_DESC_RING_PCP_DEI_VID(i)   (TDMA_DESC_RING_BASE(i) + \
0419                     RING_PCP_DEI_VID)
0420 
0421 #define TDMA_CONTROL            0x600
0422 #define  TDMA_EN            0
0423 #define  TSB_EN             1
0424 /* Uses 2 bits on SYSTEMPORT Lite and shifts everything by 1 bit, we
0425  * keep the SYSTEMPORT layout here and adjust with tdma_control_bit()
0426  */
0427 #define  TSB_SWAP0          2
0428 #define  TSB_SWAP1          3
0429 #define  ACB_ALGO           3
0430 #define  BUF_DATA_OFFSET_SHIFT      4
0431 #define  BUF_DATA_OFFSET_MASK       0x3ff
0432 #define  VLAN_EN            14
0433 #define  SW_BRCM_TAG            15
0434 #define  WNC_KPT_SIZE_UPDATE        16
0435 #define  SYNC_PKT_SIZE          17
0436 #define  ACH_TXDONE_DELAY_SHIFT     18
0437 #define  ACH_TXDONE_DELAY_MASK      0xff
0438 
0439 #define TDMA_STATUS         0x604
0440 #define  TDMA_DISABLED          (1 << 0)
0441 #define  TDMA_LL_RAM_INIT_BUSY      (1 << 1)
0442 
0443 #define TDMA_SCB_BURST_SIZE     0x608
0444 #define TDMA_OVER_MAX_THRESH_STATUS 0x60c
0445 #define TDMA_OVER_HYST_THRESH_STATUS    0x610
0446 #define TDMA_TPID           0x614
0447 
0448 #define TDMA_FREE_LIST_HEAD_TAIL_PTR    0x618
0449 #define  TDMA_FREE_HEAD_MASK        0x7ff
0450 #define  TDMA_FREE_TAIL_SHIFT       11
0451 #define  TDMA_FREE_TAIL_MASK        0x7ff
0452 
0453 #define TDMA_FREE_LIST_COUNT        0x61c
0454 #define  TDMA_FREE_LIST_COUNT_MASK  0x7ff
0455 
0456 #define TDMA_TIER2_ARB_CTRL     0x620
0457 #define  TDMA_ARB_MODE_RR       0
0458 #define  TDMA_ARB_MODE_WEIGHT_RR    0x1
0459 #define  TDMA_ARB_MODE_STRICT       0x2
0460 #define  TDMA_ARB_MODE_DEFICIT_RR   0x3
0461 #define  TDMA_CREDIT_SHIFT      4
0462 #define  TDMA_CREDIT_MASK       0xffff
0463 
0464 #define TDMA_TIER1_ARB_0_CTRL       0x624
0465 #define  TDMA_ARB_EN            (1 << 0)
0466 
0467 #define TDMA_TIER1_ARB_0_QUEUE_EN   0x628
0468 #define TDMA_TIER1_ARB_1_CTRL       0x62c
0469 #define TDMA_TIER1_ARB_1_QUEUE_EN   0x630
0470 #define TDMA_TIER1_ARB_2_CTRL       0x634
0471 #define TDMA_TIER1_ARB_2_QUEUE_EN   0x638
0472 #define TDMA_TIER1_ARB_3_CTRL       0x63c
0473 #define TDMA_TIER1_ARB_3_QUEUE_EN   0x640
0474 
0475 #define TDMA_SCB_ENDIAN_OVERRIDE    0x644
0476 #define  TDMA_LE_MODE           (1 << 0)
0477 #define  TDMA_REG_MODE          (1 << 1)
0478 
0479 #define TDMA_TEST           0x648
0480 #define  TDMA_TP_OUT_SEL        (1 << 0)
0481 #define  TDMA_MEM_TM            (1 << 1)
0482 
0483 #define TDMA_DEBUG          0x64c
0484 
0485 /* Number of Receive hardware descriptor words */
0486 #define SP_NUM_HW_RX_DESC_WORDS     1024
0487 #define SP_LT_NUM_HW_RX_DESC_WORDS  256
0488 
0489 /* Internal linked-list RAM size */
0490 #define SP_NUM_TX_DESC          1536
0491 #define SP_LT_NUM_TX_DESC       256
0492 
0493 #define WORDS_PER_DESC          2
0494 
0495 /* Rx/Tx common counter group.*/
0496 struct bcm_sysport_pkt_counters {
0497     u32 cnt_64;     /* RO Received/Transmited 64 bytes packet */
0498     u32 cnt_127;    /* RO Rx/Tx 127 bytes packet */
0499     u32 cnt_255;    /* RO Rx/Tx 65-255 bytes packet */
0500     u32 cnt_511;    /* RO Rx/Tx 256-511 bytes packet */
0501     u32 cnt_1023;   /* RO Rx/Tx 512-1023 bytes packet */
0502     u32 cnt_1518;   /* RO Rx/Tx 1024-1518 bytes packet */
0503     u32 cnt_mgv;    /* RO Rx/Tx 1519-1522 good VLAN packet */
0504     u32 cnt_2047;   /* RO Rx/Tx 1522-2047 bytes packet*/
0505     u32 cnt_4095;   /* RO Rx/Tx 2048-4095 bytes packet*/
0506     u32 cnt_9216;   /* RO Rx/Tx 4096-9216 bytes packet*/
0507 };
0508 
0509 /* RSV, Receive Status Vector */
0510 struct bcm_sysport_rx_counters {
0511     struct  bcm_sysport_pkt_counters pkt_cnt;
0512     u32 pkt;        /* RO (0x428) Received pkt count*/
0513     u32 bytes;      /* RO Received byte count */
0514     u32 mca;        /* RO # of Received multicast pkt */
0515     u32 bca;        /* RO # of Receive broadcast pkt */
0516     u32 fcs;        /* RO # of Received FCS error  */
0517     u32 cf;     /* RO # of Received control frame pkt*/
0518     u32 pf;     /* RO # of Received pause frame pkt */
0519     u32 uo;     /* RO # of unknown op code pkt */
0520     u32 aln;        /* RO # of alignment error count */
0521     u32 flr;        /* RO # of frame length out of range count */
0522     u32 cde;        /* RO # of code error pkt */
0523     u32 fcr;        /* RO # of carrier sense error pkt */
0524     u32 ovr;        /* RO # of oversize pkt*/
0525     u32 jbr;        /* RO # of jabber count */
0526     u32 mtue;       /* RO # of MTU error pkt*/
0527     u32 pok;        /* RO # of Received good pkt */
0528     u32 uc;     /* RO # of unicast pkt */
0529     u32 ppp;        /* RO # of PPP pkt */
0530     u32 rcrc;       /* RO (0x470),# of CRC match pkt */
0531 };
0532 
0533 /* TSV, Transmit Status Vector */
0534 struct bcm_sysport_tx_counters {
0535     struct bcm_sysport_pkt_counters pkt_cnt;
0536     u32 pkts;       /* RO (0x4a8) Transmited pkt */
0537     u32 mca;        /* RO # of xmited multicast pkt */
0538     u32 bca;        /* RO # of xmited broadcast pkt */
0539     u32 pf;     /* RO # of xmited pause frame count */
0540     u32 cf;     /* RO # of xmited control frame count */
0541     u32 fcs;        /* RO # of xmited FCS error count */
0542     u32 ovr;        /* RO # of xmited oversize pkt */
0543     u32 drf;        /* RO # of xmited deferral pkt */
0544     u32 edf;        /* RO # of xmited Excessive deferral pkt*/
0545     u32 scl;        /* RO # of xmited single collision pkt */
0546     u32 mcl;        /* RO # of xmited multiple collision pkt*/
0547     u32 lcl;        /* RO # of xmited late collision pkt */
0548     u32 ecl;        /* RO # of xmited excessive collision pkt*/
0549     u32 frg;        /* RO # of xmited fragments pkt*/
0550     u32 ncl;        /* RO # of xmited total collision count */
0551     u32 jbr;        /* RO # of xmited jabber count*/
0552     u32 bytes;      /* RO # of xmited byte count */
0553     u32 pok;        /* RO # of xmited good pkt */
0554     u32 uc;     /* RO (0x4f0) # of xmited unicast pkt */
0555 };
0556 
0557 struct bcm_sysport_mib {
0558     struct bcm_sysport_rx_counters rx;
0559     struct bcm_sysport_tx_counters tx;
0560     u32 rx_runt_cnt;
0561     u32 rx_runt_fcs;
0562     u32 rx_runt_fcs_align;
0563     u32 rx_runt_bytes;
0564     u32 rxchk_bad_csum;
0565     u32 rxchk_other_pkt_disc;
0566     u32 rbuf_ovflow_cnt;
0567     u32 rbuf_err_cnt;
0568     u32 alloc_rx_buff_failed;
0569     u32 rx_dma_failed;
0570     u32 tx_dma_failed;
0571     u32 tx_realloc_tsb;
0572     u32 tx_realloc_tsb_failed;
0573 };
0574 
0575 /* HW maintains a large list of counters */
0576 enum bcm_sysport_stat_type {
0577     BCM_SYSPORT_STAT_NETDEV = -1,
0578     BCM_SYSPORT_STAT_NETDEV64,
0579     BCM_SYSPORT_STAT_MIB_RX,
0580     BCM_SYSPORT_STAT_MIB_TX,
0581     BCM_SYSPORT_STAT_RUNT,
0582     BCM_SYSPORT_STAT_RXCHK,
0583     BCM_SYSPORT_STAT_RBUF,
0584     BCM_SYSPORT_STAT_SOFT,
0585 };
0586 
0587 /* Macros to help define ethtool statistics */
0588 #define STAT_NETDEV(m) { \
0589     .stat_string = __stringify(m), \
0590     .stat_sizeof = sizeof(((struct net_device_stats *)0)->m), \
0591     .stat_offset = offsetof(struct net_device_stats, m), \
0592     .type = BCM_SYSPORT_STAT_NETDEV, \
0593 }
0594 
0595 #define STAT_NETDEV64(m) { \
0596     .stat_string = __stringify(m), \
0597     .stat_sizeof = sizeof(((struct bcm_sysport_stats64 *)0)->m), \
0598     .stat_offset = offsetof(struct bcm_sysport_stats64, m), \
0599     .type = BCM_SYSPORT_STAT_NETDEV64, \
0600 }
0601 
0602 #define STAT_MIB(str, m, _type) { \
0603     .stat_string = str, \
0604     .stat_sizeof = sizeof(((struct bcm_sysport_priv *)0)->m), \
0605     .stat_offset = offsetof(struct bcm_sysport_priv, m), \
0606     .type = _type, \
0607 }
0608 
0609 #define STAT_MIB_RX(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_MIB_RX)
0610 #define STAT_MIB_TX(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_MIB_TX)
0611 #define STAT_RUNT(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_RUNT)
0612 #define STAT_MIB_SOFT(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_SOFT)
0613 
0614 #define STAT_RXCHK(str, m, ofs) { \
0615     .stat_string = str, \
0616     .stat_sizeof = sizeof(((struct bcm_sysport_priv *)0)->m), \
0617     .stat_offset = offsetof(struct bcm_sysport_priv, m), \
0618     .type = BCM_SYSPORT_STAT_RXCHK, \
0619     .reg_offset = ofs, \
0620 }
0621 
0622 #define STAT_RBUF(str, m, ofs) { \
0623     .stat_string = str, \
0624     .stat_sizeof = sizeof(((struct bcm_sysport_priv *)0)->m), \
0625     .stat_offset = offsetof(struct bcm_sysport_priv, m), \
0626     .type = BCM_SYSPORT_STAT_RBUF, \
0627     .reg_offset = ofs, \
0628 }
0629 
0630 /* TX bytes and packets */
0631 #define NUM_SYSPORT_TXQ_STAT    2
0632 
0633 struct bcm_sysport_stats {
0634     char stat_string[ETH_GSTRING_LEN];
0635     int stat_sizeof;
0636     int stat_offset;
0637     enum bcm_sysport_stat_type type;
0638     /* reg offset from UMAC base for misc counters */
0639     u16 reg_offset;
0640 };
0641 
0642 struct bcm_sysport_stats64 {
0643     /* 64bit stats on 32bit/64bit Machine */
0644     u64 rx_packets;
0645     u64 rx_bytes;
0646     u64 tx_packets;
0647     u64 tx_bytes;
0648 };
0649 
0650 /* Software house keeping helper structure */
0651 struct bcm_sysport_cb {
0652     struct sk_buff  *skb;       /* SKB for RX packets */
0653     void __iomem    *bd_addr;   /* Buffer descriptor PHYS addr */
0654 
0655     DEFINE_DMA_UNMAP_ADDR(dma_addr);
0656     DEFINE_DMA_UNMAP_LEN(dma_len);
0657 };
0658 
0659 enum bcm_sysport_type {
0660     SYSTEMPORT = 0,
0661     SYSTEMPORT_LITE,
0662 };
0663 
0664 struct bcm_sysport_hw_params {
0665     bool        is_lite;
0666     unsigned int    num_rx_desc_words;
0667 };
0668 
0669 struct bcm_sysport_net_dim {
0670     u16         use_dim;
0671     u16         event_ctr;
0672     unsigned long       packets;
0673     unsigned long       bytes;
0674     struct dim      dim;
0675 };
0676 
0677 /* Software view of the TX ring */
0678 struct bcm_sysport_tx_ring {
0679     spinlock_t  lock;       /* Ring lock for tx reclaim/xmit */
0680     struct napi_struct napi;    /* NAPI per tx queue */
0681     unsigned int    index;      /* Ring index */
0682     unsigned int    size;       /* Ring current size */
0683     unsigned int    alloc_size; /* Ring one-time allocated size */
0684     unsigned int    desc_count; /* Number of descriptors */
0685     unsigned int    curr_desc;  /* Current descriptor */
0686     unsigned int    c_index;    /* Last consumer index */
0687     unsigned int    clean_index;    /* Current clean index */
0688     struct bcm_sysport_cb *cbs; /* Transmit control blocks */
0689     struct bcm_sysport_priv *priv;  /* private context backpointer */
0690     unsigned long   packets;    /* packets statistics */
0691     unsigned long   bytes;      /* bytes statistics */
0692     unsigned int    switch_queue;   /* switch port queue number */
0693     unsigned int    switch_port;    /* switch port queue number */
0694     bool        inspect;    /* inspect switch port and queue */
0695 };
0696 
0697 /* Driver private structure */
0698 struct bcm_sysport_priv {
0699     void __iomem        *base;
0700     u32         irq0_stat;
0701     u32         irq0_mask;
0702     u32         irq1_stat;
0703     u32         irq1_mask;
0704     bool            is_lite;
0705     unsigned int        num_rx_desc_words;
0706     struct napi_struct  napi ____cacheline_aligned;
0707     struct net_device   *netdev;
0708     struct platform_device  *pdev;
0709     int         irq0;
0710     int         irq1;
0711     int         wol_irq;
0712 
0713     /* Transmit rings */
0714     spinlock_t      desc_lock;
0715     struct bcm_sysport_tx_ring *tx_rings;
0716 
0717     /* Receive queue */
0718     void __iomem        *rx_bds;
0719     struct bcm_sysport_cb   *rx_cbs;
0720     unsigned int        num_rx_bds;
0721     unsigned int        rx_read_ptr;
0722     unsigned int        rx_c_index;
0723 
0724     struct bcm_sysport_net_dim  dim;
0725     u32         rx_max_coalesced_frames;
0726     u32         rx_coalesce_usecs;
0727 
0728     /* PHY device */
0729     struct device_node  *phy_dn;
0730     phy_interface_t     phy_interface;
0731     int         old_pause;
0732     int         old_link;
0733     int         old_duplex;
0734 
0735     /* Misc fields */
0736     unsigned int        rx_chk_en:1;
0737     unsigned int        tsb_en:1;
0738     unsigned int        crc_fwd:1;
0739     u16         rev;
0740     u32         wolopts;
0741     u8          sopass[SOPASS_MAX];
0742     unsigned int        wol_irq_disabled:1;
0743     struct clk      *clk;
0744     struct clk      *wol_clk;
0745 
0746     /* MIB related fields */
0747     struct bcm_sysport_mib  mib;
0748 
0749     /* Ethtool */
0750     u32         msg_enable;
0751     DECLARE_BITMAP(filters, RXCHK_BRCM_TAG_MAX);
0752     u32         filters_loc[RXCHK_BRCM_TAG_MAX];
0753 
0754     struct bcm_sysport_stats64  stats64;
0755 
0756     /* For atomic update generic 64bit value on 32bit Machine */
0757     struct u64_stats_sync   syncp;
0758 
0759     /* map information between switch port queues and local queues */
0760     struct notifier_block   netdev_notifier;
0761     unsigned int        per_port_num_tx_queues;
0762     struct bcm_sysport_tx_ring *ring_map[DSA_MAX_PORTS * 8];
0763 
0764 };
0765 #endif /* __BCM_SYSPORT_H */