1 /*- 2 * Copyright (C) 2008 MARVELL INTERNATIONAL LTD. 3 * All rights reserved. 4 * 5 * Developed by Semihalf. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of MARVELL nor the names of contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * 31 * $FreeBSD$ 32 */ 33 34 #ifndef __IF_MGE_H__ 35 #define __IF_MGE_H__ 36 37 #define MGE_INTR_COUNT 5 /* ETH controller occupies 5 IRQ lines */ 38 #define MGE_TX_DESC_NUM 256 39 #define MGE_RX_DESC_NUM 256 40 #define MGE_RX_QUEUE_NUM 8 41 #define MGE_RX_DEFAULT_QUEUE 0 42 43 #define MGE_CHECKSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP) 44 45 /* Interrupt Coalescing types */ 46 #define MGE_IC_RX 0 47 #define MGE_IC_TX 1 48 49 struct mge_desc { 50 uint32_t cmd_status; 51 uint16_t buff_size; 52 uint16_t byte_count; 53 bus_addr_t buffer; 54 bus_addr_t next_desc; 55 }; 56 57 struct mge_desc_wrapper { 58 bus_dmamap_t desc_dmap; 59 struct mge_desc* mge_desc; 60 bus_addr_t mge_desc_paddr; 61 bus_dmamap_t buffer_dmap; 62 struct mbuf* buffer; 63 }; 64 65 struct mge_softc { 66 struct ifnet *ifp; /* per-interface network data */ 67 68 phandle_t node; 69 70 device_t dev; 71 device_t miibus; 72 73 struct mii_data *mii; 74 struct resource *res[1 + MGE_INTR_COUNT]; /* resources */ 75 void *ih_cookie[MGE_INTR_COUNT]; /* interrupt handlers cookies */ 76 struct mtx transmit_lock; /* transmitter lock */ 77 struct mtx receive_lock; /* receiver lock */ 78 79 uint32_t mge_if_flags; 80 uint32_t mge_media_status; 81 82 struct callout wd_callout; 83 int wd_timer; 84 85 bus_dma_tag_t mge_desc_dtag; 86 bus_dma_tag_t mge_tx_dtag; 87 bus_dma_tag_t mge_rx_dtag; 88 bus_addr_t tx_desc_start; 89 bus_addr_t rx_desc_start; 90 uint32_t tx_desc_curr; 91 uint32_t rx_desc_curr; 92 uint32_t tx_desc_used_idx; 93 uint32_t tx_desc_used_count; 94 uint32_t rx_ic_time; 95 uint32_t tx_ic_time; 96 struct mge_desc_wrapper mge_tx_desc[MGE_TX_DESC_NUM]; 97 struct mge_desc_wrapper mge_rx_desc[MGE_RX_DESC_NUM]; 98 99 uint32_t mge_tfut_ipg_max; /* TX FIFO Urgent Threshold */ 100 uint32_t mge_rx_ipg_max; 101 uint32_t mge_tx_arb_cfg; 102 uint32_t mge_tx_tok_cfg; 103 uint32_t mge_tx_tok_cnt; 104 uint16_t mge_mtu; 105 int mge_ver; 106 }; 107 108 109 /* bus access macros */ 110 #define MGE_READ(sc,reg) bus_read_4((sc)->res[0], (reg)) 111 #define MGE_WRITE(sc,reg,val) bus_write_4((sc)->res[0], (reg), (val)) 112 113 /* Locking macros */ 114 #define MGE_TRANSMIT_LOCK(sc) do { \ 115 mtx_assert(&(sc)->receive_lock, MA_NOTOWNED); \ 116 mtx_lock(&(sc)->transmit_lock); \ 117 } while (0) 118 119 #define MGE_TRANSMIT_UNLOCK(sc) mtx_unlock(&(sc)->transmit_lock) 120 #define MGE_TRANSMIT_LOCK_ASSERT(sc) mtx_assert(&(sc)->transmit_lock, MA_OWNED) 121 122 #define MGE_RECEIVE_LOCK(sc) do { \ 123 mtx_assert(&(sc)->transmit_lock, MA_NOTOWNED); \ 124 mtx_lock(&(sc)->receive_lock); \ 125 } while (0) 126 127 #define MGE_RECEIVE_UNLOCK(sc) mtx_unlock(&(sc)->receive_lock) 128 #define MGE_RECEIVE_LOCK_ASSERT(sc) mtx_assert(&(sc)->receive_lock, MA_OWNED) 129 130 #define MGE_GLOBAL_LOCK(sc) do { \ 131 if ((mtx_owned(&(sc)->transmit_lock) ? 1 : 0) != \ 132 (mtx_owned(&(sc)->receive_lock) ? 1 : 0)) { \ 133 panic("mge deadlock possibility detection!"); \ 134 } \ 135 mtx_lock(&(sc)->transmit_lock); \ 136 mtx_lock(&(sc)->receive_lock); \ 137 } while (0) 138 139 #define MGE_GLOBAL_UNLOCK(sc) do { \ 140 MGE_RECEIVE_UNLOCK(sc); \ 141 MGE_TRANSMIT_UNLOCK(sc); \ 142 } while (0) 143 144 #define MGE_GLOBAL_LOCK_ASSERT(sc) do { \ 145 MGE_TRANSMIT_LOCK_ASSERT(sc); \ 146 MGE_RECEIVE_LOCK_ASSERT(sc); \ 147 } while (0) 148 149 /* SMI-related macros */ 150 #define MGE_REG_PHYDEV 0x000 151 #define MGE_REG_SMI 0x004 152 #define MGE_SMI_READ (1 << 26) 153 #define MGE_SMI_WRITE (0 << 26) 154 #define MGE_SMI_READVALID (1 << 27) 155 #define MGE_SMI_BUSY (1 << 28) 156 157 /* TODO verify the timings and retries count w/specs */ 158 #define MGE_SMI_READ_RETRIES 1000 159 #define MGE_SMI_READ_DELAY 100 160 #define MGE_SMI_WRITE_RETRIES 1000 161 #define MGE_SMI_WRITE_DELAY 100 162 163 /* MGE registers */ 164 #define MGE_INT_CAUSE 0x080 165 #define MGE_INT_MASK 0x084 166 167 #define MGE_PORT_CONFIG 0x400 168 #define PORT_CONFIG_UPM (1 << 0) /* promiscuous */ 169 #define PORT_CONFIG_DFLT_RXQ(val) (((val) & 7) << 1) /* default RX queue */ 170 #define PORT_CONFIG_ARO_RXQ(val) (((val) & 7) << 4) /* ARP RX queue */ 171 #define PORT_CONFIG_REJECT_BCAST (1 << 7) /* reject non-ip and non-arp bcast */ 172 #define PORT_CONFIG_REJECT_IP_BCAST (1 << 8) /* reject ip bcast */ 173 #define PORT_CONFIG_REJECT_ARP__BCAST (1 << 9) /* reject arp bcast */ 174 #define PORT_CONFIG_AMNoTxES (1 << 12) /* Automatic mode not updating Error Summary in Tx descriptor */ 175 #define PORT_CONFIG_TCP_CAP (1 << 14) /* capture tcp to a different queue */ 176 #define PORT_CONFIG_UDP_CAP (1 << 15) /* capture udp to a different queue */ 177 #define PORT_CONFIG_TCPQ (7 << 16) /* queue to capture tcp */ 178 #define PORT_CONFIG_UDPQ (7 << 19) /* queue to capture udp */ 179 #define PORT_CONFIG_BPDUQ (7 << 22) /* queue to capture bpdu */ 180 #define PORT_CONFIG_RXCS (1 << 25) /* calculation Rx TCP checksum include pseudo header */ 181 182 #define MGE_PORT_EXT_CONFIG 0x404 183 #define MGE_MAC_ADDR_L 0x414 184 #define MGE_MAC_ADDR_H 0x418 185 186 #define MGE_SDMA_CONFIG 0x41c 187 #define MGE_SDMA_INT_ON_FRAME_BOUND (1 << 0) 188 #define MGE_SDMA_RX_BURST_SIZE(val) (((val) & 7) << 1) 189 #define MGE_SDMA_TX_BURST_SIZE(val) (((val) & 7) << 22) 190 #define MGE_SDMA_BURST_1_WORD 0x0 191 #define MGE_SDMA_BURST_2_WORD 0x1 192 #define MGE_SDMA_BURST_4_WORD 0x2 193 #define MGE_SDMA_BURST_8_WORD 0x3 194 #define MGE_SDMA_BURST_16_WORD 0x4 195 #define MGE_SDMA_RX_BYTE_SWAP (1 << 4) 196 #define MGE_SDMA_TX_BYTE_SWAP (1 << 5) 197 #define MGE_SDMA_DESC_SWAP_MODE (1 << 6) 198 199 #define MGE_PORT_SERIAL_CTRL 0x43c 200 #define PORT_SERIAL_ENABLE (1 << 0) /* serial port enable */ 201 #define PORT_SERIAL_FORCE_LINKUP (1 << 1) /* force link status to up */ 202 #define PORT_SERIAL_AUTONEG (1 << 2) /* enable autoneg for duplex mode */ 203 #define PORT_SERIAL_AUTONEG_FC (1 << 3) /* enable autoneg for FC */ 204 #define PORT_SERIAL_PAUSE_ADV (1 << 4) /* advertise symmetric FC in autoneg */ 205 #define PORT_SERIAL_FORCE_FC(val) (((val) & 3) << 5) /* pause enable & disable frames conf */ 206 #define PORT_SERIAL_NO_PAUSE_DIS 0x00 207 #define PORT_SERIAL_PAUSE_DIS 0x01 208 #define PORT_SERIAL_FORCE_BP(val) (((val) & 3) << 7) /* transmitting JAM configuration */ 209 #define PORT_SERIAL_NO_JAM 0x00 210 #define PORT_SERIAL_JAM 0x01 211 #define PORT_SERIAL_RES_BIT9 (1 << 9) 212 #define PORT_SERIAL_FORCE_LINK_FAIL (1 << 10) 213 #define PORT_SERIAL_SPEED_AUTONEG (1 << 13) 214 #define PORT_SERIAL_FORCE_DTE_ADV (1 << 14) 215 #define PORT_SERIAL_MRU(val) (((val) & 7) << 17) 216 #define PORT_SERIAL_MRU_1518 0x0 217 #define PORT_SERIAL_MRU_1522 0x1 218 #define PORT_SERIAL_MRU_1552 0x2 219 #define PORT_SERIAL_MRU_9022 0x3 220 #define PORT_SERIAL_MRU_9192 0x4 221 #define PORT_SERIAL_MRU_9700 0x5 222 #define PORT_SERIAL_FULL_DUPLEX (1 << 21) 223 #define PORT_SERIAL_FULL_DUPLEX_FC (1 << 22) 224 #define PORT_SERIAL_GMII_SPEED_1000 (1 << 23) 225 #define PORT_SERIAL_MII_SPEED_100 (1 << 24) 226 227 #define MGE_PORT_STATUS 0x444 228 #define MGE_STATUS_LINKUP (1 << 1) 229 #define MGE_STATUS_FULL_DUPLEX (1 << 2) 230 #define MGE_STATUS_FLOW_CONTROL (1 << 3) 231 #define MGE_STATUS_1000MB (1 << 4) 232 #define MGE_STATUS_100MB (1 << 5) 233 #define MGE_STATUS_TX_IN_PROG (1 << 7) 234 #define MGE_STATUS_TX_FIFO_EMPTY (1 << 10) 235 236 #define MGE_TX_QUEUE_CMD 0x448 237 #define MGE_ENABLE_TXQ (1 << 0) 238 #define MGE_DISABLE_TXQ (1 << 8) 239 240 /* 88F6281 only */ 241 #define MGE_PORT_SERIAL_CTRL1 0x44c 242 #define MGE_PCS_LOOPBACK (1 << 1) 243 #define MGE_RGMII_EN (1 << 3) 244 #define MGE_PORT_RESET (1 << 4) 245 #define MGE_CLK125_BYPASS (1 << 5) 246 #define MGE_INBAND_AUTONEG (1 << 6) 247 #define MGE_INBAND_AUTONEG_BYPASS (1 << 6) 248 #define MGE_INBAND_AUTONEG_RESTART (1 << 7) 249 #define MGE_1000BASEX (1 << 11) 250 #define MGE_BP_COLLISION_COUNT (1 << 15) 251 #define MGE_COLLISION_LIMIT(val) (((val) & 0x3f) << 16) 252 #define MGE_DROP_ODD_PREAMBLE (1 << 22) 253 254 #define MGE_PORT_INT_CAUSE 0x460 255 #define MGE_PORT_INT_MASK 0x468 256 #define MGE_PORT_INT_RX (1 << 0) 257 #define MGE_PORT_INT_EXTEND (1 << 1) 258 #define MGE_PORT_INT_RXQ0 (1 << 2) 259 #define MGE_PORT_INT_RXERR (1 << 10) 260 #define MGE_PORT_INT_RXERRQ0 (1 << 11) 261 #define MGE_PORT_INT_SUM (1 << 31) 262 263 #define MGE_PORT_INT_CAUSE_EXT 0x464 264 #define MGE_PORT_INT_MASK_EXT 0x46C 265 #define MGE_PORT_INT_EXT_TXBUF0 (1 << 0) 266 #define MGE_PORT_INT_EXT_TXERR0 (1 << 8) 267 #define MGE_PORT_INT_EXT_PHYSC (1 << 16) 268 #define MGE_PORT_INT_EXT_RXOR (1 << 18) 269 #define MGE_PORT_INT_EXT_TXUR (1 << 19) 270 #define MGE_PORT_INT_EXT_LC (1 << 20) 271 #define MGE_PORT_INT_EXT_IAR (1 << 23) 272 #define MGE_PORT_INT_EXT_SUM (1 << 31) 273 274 #define MGE_RX_FIFO_URGENT_TRSH 0x470 275 #define MGE_TX_FIFO_URGENT_TRSH 0x474 276 277 #define MGE_FIXED_PRIO_CONF 0x4dc 278 #define MGE_FIXED_PRIO_EN(q) (1 << (q)) 279 280 #define MGE_RX_CUR_DESC_PTR(q) (0x60c + ((q)<<4)) 281 282 #define MGE_RX_QUEUE_CMD 0x680 283 #define MGE_ENABLE_RXQ(q) (1 << ((q) & 0x7)) 284 #define MGE_ENABLE_RXQ_ALL (0xff) 285 #define MGE_DISABLE_RXQ(q) (1 << (((q) & 0x7) + 8)) 286 #define MGE_DISABLE_RXQ_ALL (0xff00) 287 288 #define MGE_TX_CUR_DESC_PTR 0x6c0 289 290 #define MGE_TX_TOKEN_COUNT(q) (0x700 + ((q)<<4)) 291 #define MGE_TX_TOKEN_CONF(q) (0x704 + ((q)<<4)) 292 #define MGE_TX_ARBITER_CONF(q) (0x704 + ((q)<<4)) 293 294 #define MGE_MCAST_REG_NUMBER 64 295 #define MGE_DA_FILTER_SPEC_MCAST(i) (0x1400 + ((i) << 2)) 296 #define MGE_DA_FILTER_OTH_MCAST(i) (0x1500 + ((i) << 2)) 297 298 #define MGE_UCAST_REG_NUMBER 4 299 #define MGE_DA_FILTER_UCAST(i) (0x1600 + ((i) << 2)) 300 301 302 /* TX descriptor bits */ 303 #define MGE_TX_LLC_SNAP (1 << 9) 304 #define MGE_TX_NOT_FRAGMENT (1 << 10) 305 #define MGE_TX_VLAN_TAGGED (1 << 15) 306 #define MGE_TX_UDP (1 << 16) 307 #define MGE_TX_GEN_L4_CSUM (1 << 17) 308 #define MGE_TX_GEN_IP_CSUM (1 << 18) 309 #define MGE_TX_PADDING (1 << 19) 310 #define MGE_TX_LAST (1 << 20) 311 #define MGE_TX_FIRST (1 << 21) 312 #define MGE_TX_ETH_CRC (1 << 22) 313 #define MGE_TX_EN_INT (1 << 23) 314 315 #define MGE_TX_IP_HDR_SIZE(size) ((size << 11) & 0xFFFF) 316 317 /* RX descriptor bits */ 318 #define MGE_ERR_SUMMARY (1 << 0) 319 #define MGE_ERR_MASK (3 << 1) 320 #define MGE_RX_L4_PROTO_MASK (3 << 21) 321 #define MGE_RX_L4_PROTO_TCP (0 << 21) 322 #define MGE_RX_L4_PROTO_UDP (1 << 21) 323 #define MGE_RX_L3_IS_IP (1 << 24) 324 #define MGE_RX_IP_OK (1 << 25) 325 #define MGE_RX_DESC_LAST (1 << 26) 326 #define MGE_RX_DESC_FIRST (1 << 27) 327 #define MGE_RX_ENABLE_INT (1 << 29) 328 #define MGE_RX_L4_CSUM_OK (1 << 30) 329 #define MGE_DMA_OWNED (1 << 31) 330 331 #define MGE_RX_IP_FRAGMENT (1 << 2) 332 333 #define MGE_RX_L4_IS_TCP(status) ((status & MGE_RX_L4_PROTO_MASK) \ 334 == MGE_RX_L4_PROTO_TCP) 335 336 #define MGE_RX_L4_IS_UDP(status) ((status & MGE_RX_L4_PROTO_MASK) \ 337 == MGE_RX_L4_PROTO_UDP) 338 339 /* TX error codes */ 340 #define MGE_TX_ERROR_LC (0 << 1) /* Late collision */ 341 #define MGE_TX_ERROR_UR (1 << 1) /* Underrun error */ 342 #define MGE_TX_ERROR_RL (2 << 1) /* Excessive collision */ 343 344 /* RX error codes */ 345 #define MGE_RX_ERROR_CE (0 << 1) /* CRC error */ 346 #define MGE_RX_ERROR_OR (1 << 1) /* Overrun error */ 347 #define MGE_RX_ERROR_MF (2 << 1) /* Max frame lenght error */ 348 #define MGE_RX_ERROR_RE (3 << 1) /* Resource error */ 349 350 #endif /* __IF_MGE_H__ */ 351