| 1 | /***********************************************************************/ |
|---|
| 2 | /* */ |
|---|
| 3 | /* MODULE: bcmemac.h */ |
|---|
| 4 | /* DATE: 96/12/19 */ |
|---|
| 5 | /* PURPOSE: Define addresses of major hardware components of */ |
|---|
| 6 | /* BCM711X */ |
|---|
| 7 | /* */ |
|---|
| 8 | /***********************************************************************/ |
|---|
| 9 | #ifndef __BCMEMAC_H |
|---|
| 10 | #define __BCMEMAC_H |
|---|
| 11 | |
|---|
| 12 | #if __cplusplus |
|---|
| 13 | extern "C" { |
|---|
| 14 | #endif |
|---|
| 15 | |
|---|
| 16 | #define ENET_MAC_ADR_BASE 0xb0080000 |
|---|
| 17 | #define EMAC_DMA_BASE 0xb0082400 |
|---|
| 18 | #if BCHP_CHIP == 7401 |
|---|
| 19 | #if defined(BCHP_REV_C0) |
|---|
| 20 | #define EMAC_RX_DESC_BASE 0xb0082800 /* MAC DMA Rx Descriptor word (1024 bytes) */ |
|---|
| 21 | #define EMAC_TX_DESC_BASE 0xb0082C00 /* MAC DMA Tx Descriptor word (1024 bytes) (2048 total) */ |
|---|
| 22 | #define EMAC_DESC_SIZE 512 |
|---|
| 23 | #else |
|---|
| 24 | #define EMAC_RX_DESC_BASE 0xb0082000 /* MAC DMA Rx Descriptor word (512 bytes) */ |
|---|
| 25 | #define EMAC_TX_DESC_BASE 0xb0082200 /* MAC DMA Tx Descriptor word (512 bytes) (1024 total) */ |
|---|
| 26 | #define EMAC_DESC_SIZE 256 |
|---|
| 27 | #endif |
|---|
| 28 | #else |
|---|
| 29 | #define EMAC_RX_DESC_BASE 0xb0082800 /* MAC DMA Rx Descriptor word (1024 bytes) */ |
|---|
| 30 | #define EMAC_TX_DESC_BASE 0xb0082C00 /* MAC DMA Tx Descriptor word (1024 bytes) (2048 total) */ |
|---|
| 31 | #define EMAC_DESC_SIZE 512 |
|---|
| 32 | #endif |
|---|
| 33 | |
|---|
| 34 | |
|---|
| 35 | #define EMAC ((volatile EmacRegisters * const) ENET_MAC_ADR_BASE) |
|---|
| 36 | |
|---|
| 37 | |
|---|
| 38 | #ifndef _ASMLANGUAGE |
|---|
| 39 | |
|---|
| 40 | /* |
|---|
| 41 | ** DMA Channel Configuration |
|---|
| 42 | */ |
|---|
| 43 | typedef struct DmaChannelCfg { |
|---|
| 44 | unsigned long cfg; /* (00) assorted configuration */ |
|---|
| 45 | #define DMA_BURST_HALT 0x00000004 /* idle after finish current memory burst */ |
|---|
| 46 | #define DMA_PKT_HALT 0x00000002 /* idle after an EOP flag is detected */ |
|---|
| 47 | #define DMA_ENABLE 0x00000001 /* set to enable channel */ |
|---|
| 48 | unsigned long intStat; /* (04) interrupts control and status */ |
|---|
| 49 | unsigned long intMask; /* (08) interrupts mask */ |
|---|
| 50 | #define DMA_BUFF_DONE 0x00000001 /* buffer done */ |
|---|
| 51 | #define DMA_DONE 0x00000002 /* packet xfer complete */ |
|---|
| 52 | #define DMA_NO_DESC 0x00000004 /* no valid descriptors */ |
|---|
| 53 | unsigned long maxBurst; /* (0C) max burst length permitted */ |
|---|
| 54 | unsigned long descPtr; /* (10) iudma base descriptor pointer */ |
|---|
| 55 | |
|---|
| 56 | /* Unused words */ |
|---|
| 57 | unsigned long resv[27]; |
|---|
| 58 | } DmaChannelCfg; |
|---|
| 59 | |
|---|
| 60 | /* |
|---|
| 61 | ** DMA State RAM (1 .. 16) |
|---|
| 62 | */ |
|---|
| 63 | typedef struct DmaStateRam { |
|---|
| 64 | unsigned long baseDescPtr; /* (00) descriptor ring start address */ |
|---|
| 65 | unsigned long state_data; /* (04) state/bytes done/ring offset */ |
|---|
| 66 | unsigned long desc_len_status; /* (08) buffer descriptor status and len */ |
|---|
| 67 | unsigned long desc_base_bufptr; /* (0C) buffer descrpitor current processing */ |
|---|
| 68 | } DmaStateRam; |
|---|
| 69 | |
|---|
| 70 | /* |
|---|
| 71 | ** DMA Registers |
|---|
| 72 | */ |
|---|
| 73 | typedef struct DmaRegs { |
|---|
| 74 | #define DMA_MASTER_EN 0x00000001 |
|---|
| 75 | #define DMA_FLOWC_CH1_EN 0x00000002 |
|---|
| 76 | #define DMA_FLOWC_CH3_EN 0x00000004 |
|---|
| 77 | #define DMA_NUM_CHS_MASK 0x0f000000 |
|---|
| 78 | #define DMA_NUM_CHS_SHIFT 24 |
|---|
| 79 | #define DMA_FLOWCTL_MASK 0x30000000 |
|---|
| 80 | #define DMA_FLOWCTL_CH1 0x10000000 |
|---|
| 81 | #define DMA_FLOWCTL_CH3 0x20000000 |
|---|
| 82 | #define DMA_FLOWCTL_SHIFT 28 |
|---|
| 83 | unsigned long controller_cfg; /* (00) controller configuration */ |
|---|
| 84 | |
|---|
| 85 | /* Flow control */ |
|---|
| 86 | unsigned long flowctl_ch1_thresh_lo; /* (04) EMAC1 RX DMA channel */ |
|---|
| 87 | unsigned long flowctl_ch1_thresh_hi; /* (08) EMAC1 RX DMA channel */ |
|---|
| 88 | unsigned long flowctl_ch1_alloc; /* (0C) EMAC1 RX DMA channel */ |
|---|
| 89 | |
|---|
| 90 | unsigned long enet_iudma_rev; /* (10) Enet rev */ |
|---|
| 91 | unsigned long enet_iudma_tstctl; /* (14) Enet test control */ |
|---|
| 92 | |
|---|
| 93 | #define SCB_IRQ 0x01 |
|---|
| 94 | #define IUDMA_IRQ 0x02 |
|---|
| 95 | #define EMAC_IRQ 0x04 |
|---|
| 96 | #define EPHYS_IRQ 0x08 |
|---|
| 97 | #define GISB_IRQ 0x10 |
|---|
| 98 | unsigned long enet_iudma_pci_irq_sts; /* (18) Enet pci intr status */ |
|---|
| 99 | unsigned long enet_iudma_pci_irq_msk; /* (1C) Enet pci intr mask */ |
|---|
| 100 | unsigned long enet_iudma_r5k_irq_sts; /* (20) Enet r5k intr status */ |
|---|
| 101 | unsigned long enet_iudma_r5k_irq_msk; /* (24) Enet r5k intr mask */ |
|---|
| 102 | |
|---|
| 103 | unsigned long enet_iudma_diag_ctl; /* (28) Enet diag control */ |
|---|
| 104 | unsigned long enet_iudma_diag_rdbk; /* (2C) Enet diag readback */ |
|---|
| 105 | |
|---|
| 106 | #if 0 /* new to C0/C1; enable when ready to add support */ |
|---|
| 107 | unsigned long resv1[4]; /* (30-3F) Unused */ |
|---|
| 108 | |
|---|
| 109 | unsigned long enet_iudma_desc_alloc; /* (40) IUDMA RX Descriptor Allocation */ |
|---|
| 110 | unsigned long enet_iudma_desc_thres; /* (44) IUDMA RX Descriptor Timeout */ |
|---|
| 111 | unsigned long enet_iudma_diag_timeout; /* (48) IUDMA RX Descriptor IRQ timeout */ |
|---|
| 112 | unsigned long enet_iudma_desc_irq_sts; /* (4C) IUDMA RX Descriptor IRQ status */ |
|---|
| 113 | unsigned long enet_iudma_desc_irq_mask; /* (50) IUDMA RX Descriptor IRQ mask */ |
|---|
| 114 | |
|---|
| 115 | unsigned long resv2[43]; /* (54-FF) Unused */ |
|---|
| 116 | #else |
|---|
| 117 | unsigned long resv[52]; /* (30-FF) Unused */ |
|---|
| 118 | #endif |
|---|
| 119 | |
|---|
| 120 | /* Per channel registers/state ram */ |
|---|
| 121 | DmaChannelCfg chcfg[2]; /* (100) Channel configuration */ |
|---|
| 122 | } DmaRegs; |
|---|
| 123 | |
|---|
| 124 | /* |
|---|
| 125 | ** DMA Buffer |
|---|
| 126 | */ |
|---|
| 127 | typedef struct DmaDesc { |
|---|
| 128 | unsigned long length_status; /* We HAVE TO access them in 32 bit words */ |
|---|
| 129 | |
|---|
| 130 | #define DMA_DESC_USEFPM 0x80000000 |
|---|
| 131 | #define DMA_DESC_MULTICAST 0x40000000 |
|---|
| 132 | #define DMA_DESC_BUFLENGTH 0x0fff0000 |
|---|
| 133 | |
|---|
| 134 | #define DMA_OWN 0x8000 /* cleared by DMA, set by SW */ |
|---|
| 135 | #define DMA_EOP 0x4000 /* last buffer in packet */ |
|---|
| 136 | #define DMA_SOP 0x2000 /* first buffer in packet */ |
|---|
| 137 | #define DMA_WRAP 0x1000 /* */ |
|---|
| 138 | #define DMA_APPEND_CRC 0x0100 |
|---|
| 139 | |
|---|
| 140 | /* EMAC Descriptor Status definitions */ |
|---|
| 141 | #define EMAC_MISS 0x0080 /* framed address recognition failed (promiscuous) */ |
|---|
| 142 | #define EMAC_BRDCAST 0x0040 /* DA is Broadcast */ |
|---|
| 143 | #define EMAC_MULT 0x0020 /* DA is multicast */ |
|---|
| 144 | #define EMAC_LG 0x0010 /* frame length > RX_LENGTH register value */ |
|---|
| 145 | #define EMAC_NO 0x0008 /* Non-Octet aligned */ |
|---|
| 146 | #define EMAC_RXER 0x0004 /* RX_ERR on MII while RX_DV assereted */ |
|---|
| 147 | #define EMAC_CRC_ERROR 0x0002 /* CRC error */ |
|---|
| 148 | #define EMAC_OV 0x0001 /* Overflow */ |
|---|
| 149 | |
|---|
| 150 | /* HDLC Descriptor Status definitions */ |
|---|
| 151 | #define DMA_HDLC_TX_ABORT 0x0100 |
|---|
| 152 | #define DMA_HDLC_RX_OVERRUN 0x4000 |
|---|
| 153 | #define DMA_HDLC_RX_TOO_LONG 0x2000 |
|---|
| 154 | #define DMA_HDLC_RX_CRC_OK 0x1000 |
|---|
| 155 | #define DMA_HDLC_RX_ABORT 0x0100 |
|---|
| 156 | |
|---|
| 157 | unsigned long address; /* address of data */ |
|---|
| 158 | } DmaDesc; |
|---|
| 159 | |
|---|
| 160 | |
|---|
| 161 | /* |
|---|
| 162 | ** EMAC transmit MIB counters |
|---|
| 163 | */ |
|---|
| 164 | typedef struct EmacTxMib { |
|---|
| 165 | unsigned long tx_good_octets; /* (200) good byte count */ |
|---|
| 166 | unsigned long tx_good_pkts; /* (204) good pkt count */ |
|---|
| 167 | unsigned long tx_octets; /* (208) good and bad byte count */ |
|---|
| 168 | unsigned long tx_pkts; /* (20c) good and bad pkt count */ |
|---|
| 169 | unsigned long tx_broadcasts_pkts; /* (210) good broadcast packets */ |
|---|
| 170 | unsigned long tx_multicasts_pkts; /* (214) good mulitcast packets */ |
|---|
| 171 | unsigned long tx_len_64; /* (218) RMON tx pkt size buckets */ |
|---|
| 172 | unsigned long tx_len_65_to_127; /* (21c) */ |
|---|
| 173 | unsigned long tx_len_128_to_255; /* (220) */ |
|---|
| 174 | unsigned long tx_len_256_to_511; /* (224) */ |
|---|
| 175 | unsigned long tx_len_512_to_1023; /* (228) */ |
|---|
| 176 | unsigned long tx_len_1024_to_max; /* (22c) */ |
|---|
| 177 | unsigned long tx_jabber_pkts; /* (230) > 1518 with bad crc */ |
|---|
| 178 | unsigned long tx_oversize_pkts; /* (234) > 1518 with good crc */ |
|---|
| 179 | unsigned long tx_fragment_pkts; /* (238) < 63 with bad crc */ |
|---|
| 180 | unsigned long tx_underruns; /* (23c) fifo underrun */ |
|---|
| 181 | unsigned long tx_total_cols; /* (240) total collisions in all tx pkts */ |
|---|
| 182 | unsigned long tx_single_cols; /* (244) tx pkts with single collisions */ |
|---|
| 183 | unsigned long tx_multiple_cols; /* (248) tx pkts with multiple collisions */ |
|---|
| 184 | unsigned long tx_excessive_cols; /* (24c) tx pkts with excessive cols */ |
|---|
| 185 | unsigned long tx_late_cols; /* (250) tx pkts with late cols */ |
|---|
| 186 | unsigned long tx_defered; /* (254) tx pkts deferred */ |
|---|
| 187 | unsigned long tx_carrier_lost; /* (258) tx pkts with CRS lost */ |
|---|
| 188 | unsigned long tx_pause_pkts; /* (25c) tx pause pkts sent */ |
|---|
| 189 | #define NumEmacTxMibVars 24 |
|---|
| 190 | } EmacTxMib; |
|---|
| 191 | |
|---|
| 192 | /* |
|---|
| 193 | ** EMAC receive MIB counters |
|---|
| 194 | */ |
|---|
| 195 | typedef struct EmacRxMib { |
|---|
| 196 | unsigned long rx_good_octets; /* (280) good byte count */ |
|---|
| 197 | unsigned long rx_good_pkts; /* (284) good pkt count */ |
|---|
| 198 | unsigned long rx_octets; /* (288) good and bad byte count */ |
|---|
| 199 | unsigned long rx_pkts; /* (28c) good and bad pkt count */ |
|---|
| 200 | unsigned long rx_broadcasts_pkts; /* (290) good broadcast packets */ |
|---|
| 201 | unsigned long rx_multicasts_pkts; /* (294) good mulitcast packets */ |
|---|
| 202 | unsigned long rx_len_64; /* (298) RMON rx pkt size buckets */ |
|---|
| 203 | unsigned long rx_len_65_to_127; /* (29c) */ |
|---|
| 204 | unsigned long rx_len_128_to_255; /* (2a0) */ |
|---|
| 205 | unsigned long rx_len_256_to_511; /* (2a4) */ |
|---|
| 206 | unsigned long rx_len_512_to_1023; /* (2a8) */ |
|---|
| 207 | unsigned long rx_len_1024_to_max; /* (2ac) */ |
|---|
| 208 | unsigned long rx_jabber_pkts; /* (2b0) > 1518 with bad crc */ |
|---|
| 209 | unsigned long rx_oversize_pkts; /* (2b4) > 1518 with good crc */ |
|---|
| 210 | unsigned long rx_fragment_pkts; /* (2b8) < 63 with bad crc */ |
|---|
| 211 | unsigned long rx_missed_pkts; /* (2bc) missed packets */ |
|---|
| 212 | unsigned long rx_crc_align_errs; /* (2c0) both or either */ |
|---|
| 213 | unsigned long rx_undersize; /* (2c4) < 63 with good crc */ |
|---|
| 214 | unsigned long rx_crc_errs; /* (2c8) crc errors (only) */ |
|---|
| 215 | unsigned long rx_align_errs; /* (2cc) alignment errors (only) */ |
|---|
| 216 | unsigned long rx_symbol_errs; /* (2d0) pkts with RXERR assertions (symbol errs) */ |
|---|
| 217 | unsigned long rx_pause_pkts; /* (2d4) MAC control, PAUSE */ |
|---|
| 218 | unsigned long rx_nonpause_pkts; /* (2d8) MAC control, not PAUSE */ |
|---|
| 219 | #define NumEmacRxMibVars 23 |
|---|
| 220 | } EmacRxMib; |
|---|
| 221 | |
|---|
| 222 | typedef struct EmacRegisters { |
|---|
| 223 | unsigned long rxControl; /* (00) receive control */ |
|---|
| 224 | #define EMAC_PM_REJ 0x80 /* - reject DA match in PMx regs */ |
|---|
| 225 | #define EMAC_UNIFLOW 0x40 /* - accept cam match fc */ |
|---|
| 226 | #define EMAC_FC_EN 0x20 /* - enable flow control */ |
|---|
| 227 | #define EMAC_LOOPBACK 0x10 /* - loopback */ |
|---|
| 228 | #define EMAC_PROM 0x08 /* - promiscuous */ |
|---|
| 229 | #define EMAC_RDT 0x04 /* - ignore transmissions */ |
|---|
| 230 | #define EMAC_ALL_MCAST 0x02 /* - ignore transmissions */ |
|---|
| 231 | #define EMAC_NO_BCAST 0x01 /* - ignore transmissions */ |
|---|
| 232 | |
|---|
| 233 | |
|---|
| 234 | unsigned long rxMaxLength; /* (04) receive max length */ |
|---|
| 235 | unsigned long txMaxLength; /* (08) transmit max length */ |
|---|
| 236 | unsigned long unused1[1]; |
|---|
| 237 | unsigned long mdioFreq; /* (10) mdio frequency */ |
|---|
| 238 | #define EMAC_MII_PRE_EN 0x00000080 /* prepend preamble sequence */ |
|---|
| 239 | #define EMAC_MDIO_PRE 0x00000080 /* - enable MDIO preamble */ |
|---|
| 240 | #define EMAC_MDC_FREQ 0x0000007f /* - mdio frequency */ |
|---|
| 241 | |
|---|
| 242 | unsigned long mdioData; /* (14) mdio data */ |
|---|
| 243 | #define MDIO_WR 0x50020000 /* - write framing */ |
|---|
| 244 | #define MDIO_RD 0x60020000 /* - read framing */ |
|---|
| 245 | #define MDIO_PMD_SHIFT 23 |
|---|
| 246 | #define MDIO_REG_SHIFT 18 |
|---|
| 247 | |
|---|
| 248 | unsigned long intMask; /* (18) int mask */ |
|---|
| 249 | unsigned long intStatus; /* (1c) int status */ |
|---|
| 250 | #define EMAC_FLOW_INT 0x04 /* - flow control event */ |
|---|
| 251 | #define EMAC_MIB_INT 0x02 /* - mib event */ |
|---|
| 252 | #define EMAC_MDIO_INT 0x01 /* - mdio event */ |
|---|
| 253 | |
|---|
| 254 | unsigned long unused2[3]; |
|---|
| 255 | unsigned long config; /* (2c) config */ |
|---|
| 256 | #define EMAC_ENABLE 0x001 /* - enable emac */ |
|---|
| 257 | #define EMAC_DISABLE 0x002 /* - disable emac */ |
|---|
| 258 | #define EMAC_SOFT_RST 0x004 /* - soft reset */ |
|---|
| 259 | #define EMAC_SOFT_RESET 0x004 /* - emac soft reset */ |
|---|
| 260 | #define EMAC_EXT_PHY 0x008 /* - external PHY select */ |
|---|
| 261 | |
|---|
| 262 | unsigned long txControl; /* (30) transmit control */ |
|---|
| 263 | #define EMAC_FD 0x001 /* - full duplex */ |
|---|
| 264 | #define EMAC_FLOWMODE 0x002 /* - flow mode */ |
|---|
| 265 | #define EMAC_NOBKOFF 0x004 /* - no backoff in */ |
|---|
| 266 | #define EMAC_SMALLSLT 0x008 /* - small slot time */ |
|---|
| 267 | |
|---|
| 268 | unsigned long txThreshold; /* (34) transmit threshold */ |
|---|
| 269 | unsigned long mibControl; /* (38) mib control */ |
|---|
| 270 | #define EMAC_NO_CLEAR 0x001 /* don't clear on read */ |
|---|
| 271 | |
|---|
| 272 | unsigned long unused3[7]; /* (3c - 54) = 7 longs */ |
|---|
| 273 | |
|---|
| 274 | unsigned long pm0DataLo; /* (58) perfect match 0 data lo */ |
|---|
| 275 | unsigned long pm0DataHi; /* (5C) perfect match 0 data hi (15:0) */ |
|---|
| 276 | unsigned long pm1DataLo; /* (60) perfect match 1 data lo */ |
|---|
| 277 | unsigned long pm1DataHi; /* (64) perfect match 1 data hi (15:0) */ |
|---|
| 278 | unsigned long pm2DataLo; /* (68) perfect match 2 data lo */ |
|---|
| 279 | unsigned long pm2DataHi; /* (6C) perfect match 2 data hi (15:0) */ |
|---|
| 280 | unsigned long pm3DataLo; /* (70) perfect match 3 data lo */ |
|---|
| 281 | unsigned long pm3DataHi; /* (74) perfect match 3 data hi (15:0) */ |
|---|
| 282 | unsigned long pm4DataLo; /* (78) perfect match 4 data lo */ |
|---|
| 283 | unsigned long pm4DataHi; /* (7c) perfect match 4 data hi (15:0) */ |
|---|
| 284 | unsigned long pm5DataLo; /* (80) perfect match 5 data lo */ |
|---|
| 285 | unsigned long pm5DataHi; /* (84) perfect match 5 data hi (15:0) */ |
|---|
| 286 | unsigned long pm6DataLo; /* (88) perfect match 6 data lo */ |
|---|
| 287 | unsigned long pm6DataHi; /* (8c) perfect match 6 data hi (15:0) */ |
|---|
| 288 | unsigned long pm7DataLo; /* (90) perfect match 7 data lo */ |
|---|
| 289 | unsigned long pm7DataHi; /* (94) perfect match 7 data hi (15:0) */ |
|---|
| 290 | #define EMAC_CAM_V 0x10000 /* - cam index */ |
|---|
| 291 | #define EMAC_CAM_VALID 0x00010000 |
|---|
| 292 | |
|---|
| 293 | unsigned long unused4[90]; /* (98-1fc) */ |
|---|
| 294 | |
|---|
| 295 | EmacTxMib tx_mib; /* (200) emac tx mib */ |
|---|
| 296 | unsigned long unused5[8]; /* (260-27c) */ |
|---|
| 297 | |
|---|
| 298 | EmacRxMib rx_mib; /* (280) rx mib */ |
|---|
| 299 | |
|---|
| 300 | } EmacRegisters; |
|---|
| 301 | |
|---|
| 302 | /* register offsets for subrouting access */ |
|---|
| 303 | #define EMAC_RX_CONTROL 0x00 |
|---|
| 304 | #define EMAC_RX_MAX_LENGTH 0x04 |
|---|
| 305 | #define EMAC_TX_MAC_LENGTH 0x08 |
|---|
| 306 | #define EMAC_MDIO_FREQ 0x10 |
|---|
| 307 | #define EMAC_MDIO_DATA 0x14 |
|---|
| 308 | #define EMAC_INT_MASK 0x18 |
|---|
| 309 | #define EMAC_INT_STATUS 0x1C |
|---|
| 310 | #ifndef INCLUDE_DOCSIS_APP |
|---|
| 311 | /* Does not exist in the internal EMAC core int he bcm7110 */ |
|---|
| 312 | #define EMAC_CAM_DATA_LO 0x20 |
|---|
| 313 | #define EMAC_CAM_DATA_HI 0x24 |
|---|
| 314 | #define EMAC_CAM_CONTROL 0x28 |
|---|
| 315 | #endif |
|---|
| 316 | #define EMAC_CONTROL 0x2C |
|---|
| 317 | #define EMAC_TX_CONTROL 0x30 |
|---|
| 318 | #define EMAC_TX_THRESHOLD 0x34 |
|---|
| 319 | #define EMAC_MIB_CONTROL 0x38 |
|---|
| 320 | |
|---|
| 321 | |
|---|
| 322 | #endif /* _ASMLANGUAGE */ |
|---|
| 323 | |
|---|
| 324 | |
|---|
| 325 | #if __cplusplus |
|---|
| 326 | } |
|---|
| 327 | #endif |
|---|
| 328 | |
|---|
| 329 | #endif |
|---|