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