1 /*- 2 * SPDX-License-Identifier: BSD-3-Clause 3 * 4 * Copyright (C) 2008 MARVELL INTERNATIONAL LTD. 5 * Copyright (C) 2009-2015 Semihalf 6 * Copyright (C) 2015 Stormshield 7 * All rights reserved. 8 * 9 * Developed by Semihalf. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. Neither the name of MARVELL nor the names of contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #ifdef HAVE_KERNEL_OPTION_HEADERS 37 #include "opt_device_polling.h" 38 #endif 39 40 #include <sys/cdefs.h> 41 __FBSDID("$FreeBSD$"); 42 43 #include <sys/param.h> 44 #include <sys/systm.h> 45 #include <sys/endian.h> 46 #include <sys/mbuf.h> 47 #include <sys/lock.h> 48 #include <sys/mutex.h> 49 #include <sys/kernel.h> 50 #include <sys/module.h> 51 #include <sys/socket.h> 52 #include <sys/sysctl.h> 53 54 #include <net/ethernet.h> 55 #include <net/bpf.h> 56 #include <net/if.h> 57 #include <net/if_arp.h> 58 #include <net/if_dl.h> 59 #include <net/if_media.h> 60 #include <net/if_types.h> 61 #include <net/if_vlan_var.h> 62 63 #include <netinet/in_systm.h> 64 #include <netinet/in.h> 65 #include <netinet/ip.h> 66 67 #include <sys/sockio.h> 68 #include <sys/bus.h> 69 #include <machine/bus.h> 70 #include <sys/rman.h> 71 #include <machine/resource.h> 72 73 #include <dev/mii/mii.h> 74 #include <dev/mii/miivar.h> 75 76 #include <dev/fdt/fdt_common.h> 77 #include <dev/ofw/ofw_bus.h> 78 #include <dev/ofw/ofw_bus_subr.h> 79 #include <dev/mdio/mdio.h> 80 81 #include <dev/mge/if_mgevar.h> 82 #include <arm/mv/mvreg.h> 83 #include <arm/mv/mvvar.h> 84 85 #include "miibus_if.h" 86 #include "mdio_if.h" 87 88 #define MGE_DELAY(x) pause("SMI access sleep", (x) / tick_sbt) 89 90 static int mge_probe(device_t dev); 91 static int mge_attach(device_t dev); 92 static int mge_detach(device_t dev); 93 static int mge_shutdown(device_t dev); 94 static int mge_suspend(device_t dev); 95 static int mge_resume(device_t dev); 96 97 static int mge_miibus_readreg(device_t dev, int phy, int reg); 98 static int mge_miibus_writereg(device_t dev, int phy, int reg, int value); 99 100 static int mge_mdio_readreg(device_t dev, int phy, int reg); 101 static int mge_mdio_writereg(device_t dev, int phy, int reg, int value); 102 103 static int mge_ifmedia_upd(struct ifnet *ifp); 104 static void mge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr); 105 106 static void mge_init(void *arg); 107 static void mge_init_locked(void *arg); 108 static void mge_start(struct ifnet *ifp); 109 static void mge_start_locked(struct ifnet *ifp); 110 static void mge_watchdog(struct mge_softc *sc); 111 static int mge_ioctl(struct ifnet *ifp, u_long command, caddr_t data); 112 113 static uint32_t mge_tfut_ipg(uint32_t val, int ver); 114 static uint32_t mge_rx_ipg(uint32_t val, int ver); 115 static void mge_ver_params(struct mge_softc *sc); 116 117 static void mge_intrs_ctrl(struct mge_softc *sc, int enable); 118 static void mge_intr_rxtx(void *arg); 119 static void mge_intr_rx(void *arg); 120 static void mge_intr_rx_check(struct mge_softc *sc, uint32_t int_cause, 121 uint32_t int_cause_ext); 122 static int mge_intr_rx_locked(struct mge_softc *sc, int count); 123 static void mge_intr_tx(void *arg); 124 static void mge_intr_tx_locked(struct mge_softc *sc); 125 static void mge_intr_misc(void *arg); 126 static void mge_intr_sum(void *arg); 127 static void mge_intr_err(void *arg); 128 static void mge_stop(struct mge_softc *sc); 129 static void mge_tick(void *msc); 130 static uint32_t mge_set_port_serial_control(uint32_t media); 131 static void mge_get_mac_address(struct mge_softc *sc, uint8_t *addr); 132 static void mge_set_mac_address(struct mge_softc *sc); 133 static void mge_set_ucast_address(struct mge_softc *sc, uint8_t last_byte, 134 uint8_t queue); 135 static void mge_set_prom_mode(struct mge_softc *sc, uint8_t queue); 136 static int mge_allocate_dma(struct mge_softc *sc); 137 static int mge_alloc_desc_dma(struct mge_softc *sc, 138 struct mge_desc_wrapper* desc_tab, uint32_t size, 139 bus_dma_tag_t *buffer_tag); 140 static int mge_new_rxbuf(bus_dma_tag_t tag, bus_dmamap_t map, 141 struct mbuf **mbufp, bus_addr_t *paddr); 142 static void mge_get_dma_addr(void *arg, bus_dma_segment_t *segs, int nseg, 143 int error); 144 static void mge_free_dma(struct mge_softc *sc); 145 static void mge_free_desc(struct mge_softc *sc, struct mge_desc_wrapper* tab, 146 uint32_t size, bus_dma_tag_t buffer_tag, uint8_t free_mbufs); 147 static void mge_offload_process_frame(struct ifnet *ifp, struct mbuf *frame, 148 uint32_t status, uint16_t bufsize); 149 static void mge_offload_setup_descriptor(struct mge_softc *sc, 150 struct mge_desc_wrapper *dw); 151 static uint8_t mge_crc8(uint8_t *data, int size); 152 static void mge_setup_multicast(struct mge_softc *sc); 153 static void mge_set_rxic(struct mge_softc *sc); 154 static void mge_set_txic(struct mge_softc *sc); 155 static void mge_add_sysctls(struct mge_softc *sc); 156 static int mge_sysctl_ic(SYSCTL_HANDLER_ARGS); 157 158 static device_method_t mge_methods[] = { 159 /* Device interface */ 160 DEVMETHOD(device_probe, mge_probe), 161 DEVMETHOD(device_attach, mge_attach), 162 DEVMETHOD(device_detach, mge_detach), 163 DEVMETHOD(device_shutdown, mge_shutdown), 164 DEVMETHOD(device_suspend, mge_suspend), 165 DEVMETHOD(device_resume, mge_resume), 166 /* MII interface */ 167 DEVMETHOD(miibus_readreg, mge_miibus_readreg), 168 DEVMETHOD(miibus_writereg, mge_miibus_writereg), 169 /* MDIO interface */ 170 DEVMETHOD(mdio_readreg, mge_mdio_readreg), 171 DEVMETHOD(mdio_writereg, mge_mdio_writereg), 172 { 0, 0 } 173 }; 174 175 DEFINE_CLASS_0(mge, mge_driver, mge_methods, sizeof(struct mge_softc)); 176 177 static devclass_t mge_devclass; 178 static int switch_attached = 0; 179 180 DRIVER_MODULE(mge, simplebus, mge_driver, mge_devclass, 0, 0); 181 DRIVER_MODULE(miibus, mge, miibus_driver, miibus_devclass, 0, 0); 182 DRIVER_MODULE(mdio, mge, mdio_driver, mdio_devclass, 0, 0); 183 MODULE_DEPEND(mge, ether, 1, 1, 1); 184 MODULE_DEPEND(mge, miibus, 1, 1, 1); 185 MODULE_DEPEND(mge, mdio, 1, 1, 1); 186 187 static struct resource_spec res_spec[] = { 188 { SYS_RES_MEMORY, 0, RF_ACTIVE }, 189 { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE }, 190 { SYS_RES_IRQ, 1, RF_ACTIVE | RF_SHAREABLE }, 191 { SYS_RES_IRQ, 2, RF_ACTIVE | RF_SHAREABLE }, 192 { -1, 0 } 193 }; 194 195 static struct { 196 driver_intr_t *handler; 197 char * description; 198 } mge_intrs[MGE_INTR_COUNT + 1] = { 199 { mge_intr_rxtx,"GbE aggregated interrupt" }, 200 { mge_intr_rx, "GbE receive interrupt" }, 201 { mge_intr_tx, "GbE transmit interrupt" }, 202 { mge_intr_misc,"GbE misc interrupt" }, 203 { mge_intr_sum, "GbE summary interrupt" }, 204 { mge_intr_err, "GbE error interrupt" }, 205 }; 206 207 /* SMI access interlock */ 208 static struct sx sx_smi; 209 210 static uint32_t 211 mv_read_ge_smi(device_t dev, int phy, int reg) 212 { 213 uint32_t timeout; 214 uint32_t ret; 215 struct mge_softc *sc; 216 217 sc = device_get_softc(dev); 218 KASSERT(sc != NULL, ("NULL softc ptr!")); 219 timeout = MGE_SMI_WRITE_RETRIES; 220 221 MGE_SMI_LOCK(); 222 while (--timeout && 223 (MGE_READ(sc, MGE_REG_SMI) & MGE_SMI_BUSY)) 224 MGE_DELAY(MGE_SMI_WRITE_DELAY); 225 226 if (timeout == 0) { 227 device_printf(dev, "SMI write timeout.\n"); 228 ret = ~0U; 229 goto out; 230 } 231 232 MGE_WRITE(sc, MGE_REG_SMI, MGE_SMI_MASK & 233 (MGE_SMI_READ | (reg << 21) | (phy << 16))); 234 235 /* Wait till finished. */ 236 timeout = MGE_SMI_WRITE_RETRIES; 237 while (--timeout && 238 !((MGE_READ(sc, MGE_REG_SMI) & MGE_SMI_READVALID))) 239 MGE_DELAY(MGE_SMI_WRITE_DELAY); 240 241 if (timeout == 0) { 242 device_printf(dev, "SMI write validation timeout.\n"); 243 ret = ~0U; 244 goto out; 245 } 246 247 /* Wait for the data to update in the SMI register */ 248 MGE_DELAY(MGE_SMI_DELAY); 249 ret = MGE_READ(sc, MGE_REG_SMI) & MGE_SMI_DATA_MASK; 250 251 out: 252 MGE_SMI_UNLOCK(); 253 return (ret); 254 255 } 256 257 static void 258 mv_write_ge_smi(device_t dev, int phy, int reg, uint32_t value) 259 { 260 uint32_t timeout; 261 struct mge_softc *sc; 262 263 sc = device_get_softc(dev); 264 KASSERT(sc != NULL, ("NULL softc ptr!")); 265 266 MGE_SMI_LOCK(); 267 timeout = MGE_SMI_READ_RETRIES; 268 while (--timeout && 269 (MGE_READ(sc, MGE_REG_SMI) & MGE_SMI_BUSY)) 270 MGE_DELAY(MGE_SMI_READ_DELAY); 271 272 if (timeout == 0) { 273 device_printf(dev, "SMI read timeout.\n"); 274 goto out; 275 } 276 277 MGE_WRITE(sc, MGE_REG_SMI, MGE_SMI_MASK & 278 (MGE_SMI_WRITE | (reg << 21) | (phy << 16) | 279 (value & MGE_SMI_DATA_MASK))); 280 281 out: 282 MGE_SMI_UNLOCK(); 283 } 284 285 static int 286 mv_read_ext_phy(device_t dev, int phy, int reg) 287 { 288 uint32_t retries; 289 struct mge_softc *sc; 290 uint32_t ret; 291 292 sc = device_get_softc(dev); 293 294 MGE_SMI_LOCK(); 295 MGE_WRITE(sc->phy_sc, MGE_REG_SMI, MGE_SMI_MASK & 296 (MGE_SMI_READ | (reg << 21) | (phy << 16))); 297 298 retries = MGE_SMI_READ_RETRIES; 299 while (--retries && 300 !(MGE_READ(sc->phy_sc, MGE_REG_SMI) & MGE_SMI_READVALID)) 301 DELAY(MGE_SMI_READ_DELAY); 302 303 if (retries == 0) 304 device_printf(dev, "Timeout while reading from PHY\n"); 305 306 ret = MGE_READ(sc->phy_sc, MGE_REG_SMI) & MGE_SMI_DATA_MASK; 307 MGE_SMI_UNLOCK(); 308 309 return (ret); 310 } 311 312 static void 313 mv_write_ext_phy(device_t dev, int phy, int reg, int value) 314 { 315 uint32_t retries; 316 struct mge_softc *sc; 317 318 sc = device_get_softc(dev); 319 320 MGE_SMI_LOCK(); 321 MGE_WRITE(sc->phy_sc, MGE_REG_SMI, MGE_SMI_MASK & 322 (MGE_SMI_WRITE | (reg << 21) | (phy << 16) | 323 (value & MGE_SMI_DATA_MASK))); 324 325 retries = MGE_SMI_WRITE_RETRIES; 326 while (--retries && MGE_READ(sc->phy_sc, MGE_REG_SMI) & MGE_SMI_BUSY) 327 DELAY(MGE_SMI_WRITE_DELAY); 328 329 if (retries == 0) 330 device_printf(dev, "Timeout while writing to PHY\n"); 331 MGE_SMI_UNLOCK(); 332 } 333 334 static void 335 mge_get_mac_address(struct mge_softc *sc, uint8_t *addr) 336 { 337 uint32_t mac_l, mac_h; 338 uint8_t lmac[6]; 339 int i, valid; 340 341 /* 342 * Retrieve hw address from the device tree. 343 */ 344 i = OF_getprop(sc->node, "local-mac-address", (void *)lmac, 6); 345 if (i == 6) { 346 valid = 0; 347 for (i = 0; i < 6; i++) 348 if (lmac[i] != 0) { 349 valid = 1; 350 break; 351 } 352 353 if (valid) { 354 bcopy(lmac, addr, 6); 355 return; 356 } 357 } 358 359 /* 360 * Fall back -- use the currently programmed address. 361 */ 362 mac_l = MGE_READ(sc, MGE_MAC_ADDR_L); 363 mac_h = MGE_READ(sc, MGE_MAC_ADDR_H); 364 365 addr[0] = (mac_h & 0xff000000) >> 24; 366 addr[1] = (mac_h & 0x00ff0000) >> 16; 367 addr[2] = (mac_h & 0x0000ff00) >> 8; 368 addr[3] = (mac_h & 0x000000ff); 369 addr[4] = (mac_l & 0x0000ff00) >> 8; 370 addr[5] = (mac_l & 0x000000ff); 371 } 372 373 static uint32_t 374 mge_tfut_ipg(uint32_t val, int ver) 375 { 376 377 switch (ver) { 378 case 1: 379 return ((val & 0x3fff) << 4); 380 case 2: 381 default: 382 return ((val & 0xffff) << 4); 383 } 384 } 385 386 static uint32_t 387 mge_rx_ipg(uint32_t val, int ver) 388 { 389 390 switch (ver) { 391 case 1: 392 return ((val & 0x3fff) << 8); 393 case 2: 394 default: 395 return (((val & 0x8000) << 10) | ((val & 0x7fff) << 7)); 396 } 397 } 398 399 static void 400 mge_ver_params(struct mge_softc *sc) 401 { 402 uint32_t d, r; 403 404 soc_id(&d, &r); 405 if (d == MV_DEV_88F6281 || d == MV_DEV_88F6781 || 406 d == MV_DEV_88F6282 || 407 d == MV_DEV_MV78100 || 408 d == MV_DEV_MV78100_Z0 || 409 (d & MV_DEV_FAMILY_MASK) == MV_DEV_DISCOVERY) { 410 sc->mge_ver = 2; 411 sc->mge_mtu = 0x4e8; 412 sc->mge_tfut_ipg_max = 0xFFFF; 413 sc->mge_rx_ipg_max = 0xFFFF; 414 sc->mge_tx_arb_cfg = 0xFC0000FF; 415 sc->mge_tx_tok_cfg = 0xFFFF7FFF; 416 sc->mge_tx_tok_cnt = 0x3FFFFFFF; 417 } else { 418 sc->mge_ver = 1; 419 sc->mge_mtu = 0x458; 420 sc->mge_tfut_ipg_max = 0x3FFF; 421 sc->mge_rx_ipg_max = 0x3FFF; 422 sc->mge_tx_arb_cfg = 0x000000FF; 423 sc->mge_tx_tok_cfg = 0x3FFFFFFF; 424 sc->mge_tx_tok_cnt = 0x3FFFFFFF; 425 } 426 if (d == MV_DEV_88RC8180) 427 sc->mge_intr_cnt = 1; 428 else 429 sc->mge_intr_cnt = 2; 430 431 if (d == MV_DEV_MV78160 || d == MV_DEV_MV78260 || d == MV_DEV_MV78460) 432 sc->mge_hw_csum = 0; 433 else 434 sc->mge_hw_csum = 1; 435 } 436 437 static void 438 mge_set_mac_address(struct mge_softc *sc) 439 { 440 char *if_mac; 441 uint32_t mac_l, mac_h; 442 443 MGE_GLOBAL_LOCK_ASSERT(sc); 444 445 if_mac = (char *)IF_LLADDR(sc->ifp); 446 447 mac_l = (if_mac[4] << 8) | (if_mac[5]); 448 mac_h = (if_mac[0] << 24)| (if_mac[1] << 16) | 449 (if_mac[2] << 8) | (if_mac[3] << 0); 450 451 MGE_WRITE(sc, MGE_MAC_ADDR_L, mac_l); 452 MGE_WRITE(sc, MGE_MAC_ADDR_H, mac_h); 453 454 mge_set_ucast_address(sc, if_mac[5], MGE_RX_DEFAULT_QUEUE); 455 } 456 457 static void 458 mge_set_ucast_address(struct mge_softc *sc, uint8_t last_byte, uint8_t queue) 459 { 460 uint32_t reg_idx, reg_off, reg_val, i; 461 462 last_byte &= 0xf; 463 reg_idx = last_byte / MGE_UCAST_REG_NUMBER; 464 reg_off = (last_byte % MGE_UCAST_REG_NUMBER) * 8; 465 reg_val = (1 | (queue << 1)) << reg_off; 466 467 for (i = 0; i < MGE_UCAST_REG_NUMBER; i++) { 468 if ( i == reg_idx) 469 MGE_WRITE(sc, MGE_DA_FILTER_UCAST(i), reg_val); 470 else 471 MGE_WRITE(sc, MGE_DA_FILTER_UCAST(i), 0); 472 } 473 } 474 475 static void 476 mge_set_prom_mode(struct mge_softc *sc, uint8_t queue) 477 { 478 uint32_t port_config; 479 uint32_t reg_val, i; 480 481 /* Enable or disable promiscuous mode as needed */ 482 if (sc->ifp->if_flags & IFF_PROMISC) { 483 port_config = MGE_READ(sc, MGE_PORT_CONFIG); 484 port_config |= PORT_CONFIG_UPM; 485 MGE_WRITE(sc, MGE_PORT_CONFIG, port_config); 486 487 reg_val = ((1 | (queue << 1)) | (1 | (queue << 1)) << 8 | 488 (1 | (queue << 1)) << 16 | (1 | (queue << 1)) << 24); 489 490 for (i = 0; i < MGE_MCAST_REG_NUMBER; i++) { 491 MGE_WRITE(sc, MGE_DA_FILTER_SPEC_MCAST(i), reg_val); 492 MGE_WRITE(sc, MGE_DA_FILTER_OTH_MCAST(i), reg_val); 493 } 494 495 for (i = 0; i < MGE_UCAST_REG_NUMBER; i++) 496 MGE_WRITE(sc, MGE_DA_FILTER_UCAST(i), reg_val); 497 498 } else { 499 port_config = MGE_READ(sc, MGE_PORT_CONFIG); 500 port_config &= ~PORT_CONFIG_UPM; 501 MGE_WRITE(sc, MGE_PORT_CONFIG, port_config); 502 503 for (i = 0; i < MGE_MCAST_REG_NUMBER; i++) { 504 MGE_WRITE(sc, MGE_DA_FILTER_SPEC_MCAST(i), 0); 505 MGE_WRITE(sc, MGE_DA_FILTER_OTH_MCAST(i), 0); 506 } 507 508 mge_set_mac_address(sc); 509 } 510 } 511 512 static void 513 mge_get_dma_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error) 514 { 515 u_int32_t *paddr; 516 517 KASSERT(nseg == 1, ("wrong number of segments, should be 1")); 518 paddr = arg; 519 520 *paddr = segs->ds_addr; 521 } 522 523 static int 524 mge_new_rxbuf(bus_dma_tag_t tag, bus_dmamap_t map, struct mbuf **mbufp, 525 bus_addr_t *paddr) 526 { 527 struct mbuf *new_mbuf; 528 bus_dma_segment_t seg[1]; 529 int error; 530 int nsegs; 531 532 KASSERT(mbufp != NULL, ("NULL mbuf pointer!")); 533 534 new_mbuf = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); 535 if (new_mbuf == NULL) 536 return (ENOBUFS); 537 new_mbuf->m_len = new_mbuf->m_pkthdr.len = new_mbuf->m_ext.ext_size; 538 539 if (*mbufp) { 540 bus_dmamap_sync(tag, map, BUS_DMASYNC_POSTREAD); 541 bus_dmamap_unload(tag, map); 542 } 543 544 error = bus_dmamap_load_mbuf_sg(tag, map, new_mbuf, seg, &nsegs, 545 BUS_DMA_NOWAIT); 546 KASSERT(nsegs == 1, ("Too many segments returned!")); 547 if (nsegs != 1 || error) 548 panic("mge_new_rxbuf(): nsegs(%d), error(%d)", nsegs, error); 549 550 bus_dmamap_sync(tag, map, BUS_DMASYNC_PREREAD); 551 552 (*mbufp) = new_mbuf; 553 (*paddr) = seg->ds_addr; 554 return (0); 555 } 556 557 static int 558 mge_alloc_desc_dma(struct mge_softc *sc, struct mge_desc_wrapper* tab, 559 uint32_t size, bus_dma_tag_t *buffer_tag) 560 { 561 struct mge_desc_wrapper *dw; 562 bus_addr_t desc_paddr; 563 int i, error; 564 565 desc_paddr = 0; 566 for (i = size - 1; i >= 0; i--) { 567 dw = &(tab[i]); 568 error = bus_dmamem_alloc(sc->mge_desc_dtag, 569 (void**)&(dw->mge_desc), 570 BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT, 571 &(dw->desc_dmap)); 572 573 if (error) { 574 if_printf(sc->ifp, "failed to allocate DMA memory\n"); 575 dw->mge_desc = NULL; 576 return (ENXIO); 577 } 578 579 error = bus_dmamap_load(sc->mge_desc_dtag, dw->desc_dmap, 580 dw->mge_desc, sizeof(struct mge_desc), mge_get_dma_addr, 581 &(dw->mge_desc_paddr), BUS_DMA_NOWAIT); 582 583 if (error) { 584 if_printf(sc->ifp, "can't load descriptor\n"); 585 bus_dmamem_free(sc->mge_desc_dtag, dw->mge_desc, 586 dw->desc_dmap); 587 dw->mge_desc = NULL; 588 return (ENXIO); 589 } 590 591 /* Chain descriptors */ 592 dw->mge_desc->next_desc = desc_paddr; 593 desc_paddr = dw->mge_desc_paddr; 594 } 595 tab[size - 1].mge_desc->next_desc = desc_paddr; 596 597 /* Allocate a busdma tag for mbufs. */ 598 error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), /* parent */ 599 1, 0, /* alignment, boundary */ 600 BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ 601 BUS_SPACE_MAXADDR, /* highaddr */ 602 NULL, NULL, /* filtfunc, filtfuncarg */ 603 MCLBYTES, 1, /* maxsize, nsegments */ 604 MCLBYTES, 0, /* maxsegsz, flags */ 605 NULL, NULL, /* lockfunc, lockfuncarg */ 606 buffer_tag); /* dmat */ 607 if (error) { 608 if_printf(sc->ifp, "failed to create busdma tag for mbufs\n"); 609 return (ENXIO); 610 } 611 612 /* Create TX busdma maps */ 613 for (i = 0; i < size; i++) { 614 dw = &(tab[i]); 615 error = bus_dmamap_create(*buffer_tag, 0, &dw->buffer_dmap); 616 if (error) { 617 if_printf(sc->ifp, "failed to create map for mbuf\n"); 618 return (ENXIO); 619 } 620 621 dw->buffer = (struct mbuf*)NULL; 622 dw->mge_desc->buffer = (bus_addr_t)NULL; 623 } 624 625 return (0); 626 } 627 628 static int 629 mge_allocate_dma(struct mge_softc *sc) 630 { 631 int error; 632 struct mge_desc_wrapper *dw; 633 int i; 634 635 /* Allocate a busdma tag and DMA safe memory for TX/RX descriptors. */ 636 error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), /* parent */ 637 16, 0, /* alignment, boundary */ 638 BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ 639 BUS_SPACE_MAXADDR, /* highaddr */ 640 NULL, NULL, /* filtfunc, filtfuncarg */ 641 sizeof(struct mge_desc), 1, /* maxsize, nsegments */ 642 sizeof(struct mge_desc), 0, /* maxsegsz, flags */ 643 NULL, NULL, /* lockfunc, lockfuncarg */ 644 &sc->mge_desc_dtag); /* dmat */ 645 646 647 mge_alloc_desc_dma(sc, sc->mge_tx_desc, MGE_TX_DESC_NUM, 648 &sc->mge_tx_dtag); 649 mge_alloc_desc_dma(sc, sc->mge_rx_desc, MGE_RX_DESC_NUM, 650 &sc->mge_rx_dtag); 651 652 for (i = 0; i < MGE_RX_DESC_NUM; i++) { 653 dw = &(sc->mge_rx_desc[i]); 654 mge_new_rxbuf(sc->mge_rx_dtag, dw->buffer_dmap, &dw->buffer, 655 &dw->mge_desc->buffer); 656 } 657 658 sc->tx_desc_start = sc->mge_tx_desc[0].mge_desc_paddr; 659 sc->rx_desc_start = sc->mge_rx_desc[0].mge_desc_paddr; 660 661 return (0); 662 } 663 664 static void 665 mge_free_desc(struct mge_softc *sc, struct mge_desc_wrapper* tab, 666 uint32_t size, bus_dma_tag_t buffer_tag, uint8_t free_mbufs) 667 { 668 struct mge_desc_wrapper *dw; 669 int i; 670 671 for (i = 0; i < size; i++) { 672 /* Free RX mbuf */ 673 dw = &(tab[i]); 674 675 if (dw->buffer_dmap) { 676 if (free_mbufs) { 677 bus_dmamap_sync(buffer_tag, dw->buffer_dmap, 678 BUS_DMASYNC_POSTREAD); 679 bus_dmamap_unload(buffer_tag, dw->buffer_dmap); 680 } 681 bus_dmamap_destroy(buffer_tag, dw->buffer_dmap); 682 if (free_mbufs) 683 m_freem(dw->buffer); 684 } 685 /* Free RX descriptors */ 686 if (dw->desc_dmap) { 687 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap, 688 BUS_DMASYNC_POSTREAD); 689 bus_dmamap_unload(sc->mge_desc_dtag, dw->desc_dmap); 690 bus_dmamem_free(sc->mge_desc_dtag, dw->mge_desc, 691 dw->desc_dmap); 692 } 693 } 694 } 695 696 static void 697 mge_free_dma(struct mge_softc *sc) 698 { 699 700 /* Free desciptors and mbufs */ 701 mge_free_desc(sc, sc->mge_rx_desc, MGE_RX_DESC_NUM, sc->mge_rx_dtag, 1); 702 mge_free_desc(sc, sc->mge_tx_desc, MGE_TX_DESC_NUM, sc->mge_tx_dtag, 0); 703 704 /* Destroy mbuf dma tag */ 705 bus_dma_tag_destroy(sc->mge_tx_dtag); 706 bus_dma_tag_destroy(sc->mge_rx_dtag); 707 /* Destroy descriptors tag */ 708 bus_dma_tag_destroy(sc->mge_desc_dtag); 709 } 710 711 static void 712 mge_reinit_rx(struct mge_softc *sc) 713 { 714 struct mge_desc_wrapper *dw; 715 int i; 716 717 MGE_RECEIVE_LOCK_ASSERT(sc); 718 719 mge_free_desc(sc, sc->mge_rx_desc, MGE_RX_DESC_NUM, sc->mge_rx_dtag, 1); 720 721 mge_alloc_desc_dma(sc, sc->mge_rx_desc, MGE_RX_DESC_NUM, 722 &sc->mge_rx_dtag); 723 724 for (i = 0; i < MGE_RX_DESC_NUM; i++) { 725 dw = &(sc->mge_rx_desc[i]); 726 mge_new_rxbuf(sc->mge_rx_dtag, dw->buffer_dmap, &dw->buffer, 727 &dw->mge_desc->buffer); 728 } 729 730 sc->rx_desc_start = sc->mge_rx_desc[0].mge_desc_paddr; 731 sc->rx_desc_curr = 0; 732 733 MGE_WRITE(sc, MGE_RX_CUR_DESC_PTR(MGE_RX_DEFAULT_QUEUE), 734 sc->rx_desc_start); 735 736 /* Enable RX queue */ 737 MGE_WRITE(sc, MGE_RX_QUEUE_CMD, MGE_ENABLE_RXQ(MGE_RX_DEFAULT_QUEUE)); 738 } 739 740 #ifdef DEVICE_POLLING 741 static poll_handler_t mge_poll; 742 743 static int 744 mge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) 745 { 746 struct mge_softc *sc = ifp->if_softc; 747 uint32_t int_cause, int_cause_ext; 748 int rx_npkts = 0; 749 750 MGE_RECEIVE_LOCK(sc); 751 752 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { 753 MGE_RECEIVE_UNLOCK(sc); 754 return (rx_npkts); 755 } 756 757 if (cmd == POLL_AND_CHECK_STATUS) { 758 int_cause = MGE_READ(sc, MGE_PORT_INT_CAUSE); 759 int_cause_ext = MGE_READ(sc, MGE_PORT_INT_CAUSE_EXT); 760 761 /* Check for resource error */ 762 if (int_cause & MGE_PORT_INT_RXERRQ0) 763 mge_reinit_rx(sc); 764 765 if (int_cause || int_cause_ext) { 766 MGE_WRITE(sc, MGE_PORT_INT_CAUSE, ~int_cause); 767 MGE_WRITE(sc, MGE_PORT_INT_CAUSE_EXT, ~int_cause_ext); 768 } 769 } 770 771 772 rx_npkts = mge_intr_rx_locked(sc, count); 773 774 MGE_RECEIVE_UNLOCK(sc); 775 MGE_TRANSMIT_LOCK(sc); 776 mge_intr_tx_locked(sc); 777 MGE_TRANSMIT_UNLOCK(sc); 778 return (rx_npkts); 779 } 780 #endif /* DEVICE_POLLING */ 781 782 static int 783 mge_attach(device_t dev) 784 { 785 struct mge_softc *sc; 786 struct mii_softc *miisc; 787 struct ifnet *ifp; 788 uint8_t hwaddr[ETHER_ADDR_LEN]; 789 int i, error, phy; 790 791 sc = device_get_softc(dev); 792 sc->dev = dev; 793 sc->node = ofw_bus_get_node(dev); 794 phy = 0; 795 796 if (fdt_get_phyaddr(sc->node, sc->dev, &phy, (void **)&sc->phy_sc) == 0) { 797 device_printf(dev, "PHY%i attached, phy_sc points to %s\n", phy, 798 device_get_nameunit(sc->phy_sc->dev)); 799 sc->phy_attached = 1; 800 } else { 801 device_printf(dev, "PHY not attached.\n"); 802 sc->phy_attached = 0; 803 sc->phy_sc = sc; 804 } 805 806 if (fdt_find_compatible(sc->node, "mrvl,sw", 1) != 0) { 807 device_printf(dev, "Switch attached.\n"); 808 sc->switch_attached = 1; 809 /* additional variable available across instances */ 810 switch_attached = 1; 811 } else { 812 sc->switch_attached = 0; 813 } 814 815 if (device_get_unit(dev) == 0) { 816 sx_init(&sx_smi, "mge_tick() SMI access threads interlock"); 817 } 818 819 /* Set chip version-dependent parameters */ 820 mge_ver_params(sc); 821 822 /* Initialize mutexes */ 823 mtx_init(&sc->transmit_lock, device_get_nameunit(dev), "mge TX lock", 824 MTX_DEF); 825 mtx_init(&sc->receive_lock, device_get_nameunit(dev), "mge RX lock", 826 MTX_DEF); 827 828 /* Allocate IO and IRQ resources */ 829 error = bus_alloc_resources(dev, res_spec, sc->res); 830 if (error) { 831 device_printf(dev, "could not allocate resources\n"); 832 mge_detach(dev); 833 return (ENXIO); 834 } 835 836 /* Allocate DMA, buffers, buffer descriptors */ 837 error = mge_allocate_dma(sc); 838 if (error) { 839 mge_detach(dev); 840 return (ENXIO); 841 } 842 843 sc->tx_desc_curr = 0; 844 sc->rx_desc_curr = 0; 845 sc->tx_desc_used_idx = 0; 846 sc->tx_desc_used_count = 0; 847 848 /* Configure defaults for interrupts coalescing */ 849 sc->rx_ic_time = 768; 850 sc->tx_ic_time = 768; 851 mge_add_sysctls(sc); 852 853 /* Allocate network interface */ 854 ifp = sc->ifp = if_alloc(IFT_ETHER); 855 if (ifp == NULL) { 856 device_printf(dev, "if_alloc() failed\n"); 857 mge_detach(dev); 858 return (ENOMEM); 859 } 860 861 if_initname(ifp, device_get_name(dev), device_get_unit(dev)); 862 ifp->if_softc = sc; 863 ifp->if_flags = IFF_SIMPLEX | IFF_MULTICAST | IFF_BROADCAST; 864 ifp->if_capabilities = IFCAP_VLAN_MTU; 865 if (sc->mge_hw_csum) { 866 ifp->if_capabilities |= IFCAP_HWCSUM; 867 ifp->if_hwassist = MGE_CHECKSUM_FEATURES; 868 } 869 ifp->if_capenable = ifp->if_capabilities; 870 871 #ifdef DEVICE_POLLING 872 /* Advertise that polling is supported */ 873 ifp->if_capabilities |= IFCAP_POLLING; 874 #endif 875 876 ifp->if_init = mge_init; 877 ifp->if_start = mge_start; 878 ifp->if_ioctl = mge_ioctl; 879 880 ifp->if_snd.ifq_drv_maxlen = MGE_TX_DESC_NUM - 1; 881 IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); 882 IFQ_SET_READY(&ifp->if_snd); 883 884 mge_get_mac_address(sc, hwaddr); 885 ether_ifattach(ifp, hwaddr); 886 callout_init(&sc->wd_callout, 0); 887 888 /* Attach PHY(s) */ 889 if (sc->phy_attached) { 890 error = mii_attach(dev, &sc->miibus, ifp, mge_ifmedia_upd, 891 mge_ifmedia_sts, BMSR_DEFCAPMASK, phy, MII_OFFSET_ANY, 0); 892 if (error) { 893 device_printf(dev, "MII failed to find PHY\n"); 894 if_free(ifp); 895 sc->ifp = NULL; 896 mge_detach(dev); 897 return (error); 898 } 899 sc->mii = device_get_softc(sc->miibus); 900 901 /* Tell the MAC where to find the PHY so autoneg works */ 902 miisc = LIST_FIRST(&sc->mii->mii_phys); 903 MGE_WRITE(sc, MGE_REG_PHYDEV, miisc->mii_phy); 904 } else { 905 /* no PHY, so use hard-coded values */ 906 ifmedia_init(&sc->mge_ifmedia, 0, 907 mge_ifmedia_upd, 908 mge_ifmedia_sts); 909 ifmedia_add(&sc->mge_ifmedia, 910 IFM_ETHER | IFM_1000_T | IFM_FDX, 911 0, NULL); 912 ifmedia_set(&sc->mge_ifmedia, 913 IFM_ETHER | IFM_1000_T | IFM_FDX); 914 } 915 916 /* Attach interrupt handlers */ 917 /* TODO: review flags, in part. mark RX as INTR_ENTROPY ? */ 918 for (i = 1; i <= sc->mge_intr_cnt; ++i) { 919 error = bus_setup_intr(dev, sc->res[i], 920 INTR_TYPE_NET | INTR_MPSAFE, 921 NULL, *mge_intrs[(sc->mge_intr_cnt == 1 ? 0 : i)].handler, 922 sc, &sc->ih_cookie[i - 1]); 923 if (error) { 924 device_printf(dev, "could not setup %s\n", 925 mge_intrs[(sc->mge_intr_cnt == 1 ? 0 : i)].description); 926 mge_detach(dev); 927 return (error); 928 } 929 } 930 931 if (sc->switch_attached) { 932 device_t child; 933 MGE_WRITE(sc, MGE_REG_PHYDEV, MGE_SWITCH_PHYDEV); 934 child = device_add_child(dev, "mdio", -1); 935 bus_generic_attach(dev); 936 } 937 938 return (0); 939 } 940 941 static int 942 mge_detach(device_t dev) 943 { 944 struct mge_softc *sc; 945 int error,i; 946 947 sc = device_get_softc(dev); 948 949 /* Stop controller and free TX queue */ 950 if (sc->ifp) 951 mge_shutdown(dev); 952 953 /* Wait for stopping ticks */ 954 callout_drain(&sc->wd_callout); 955 956 /* Stop and release all interrupts */ 957 for (i = 0; i < sc->mge_intr_cnt; ++i) { 958 if (!sc->ih_cookie[i]) 959 continue; 960 961 error = bus_teardown_intr(dev, sc->res[1 + i], 962 sc->ih_cookie[i]); 963 if (error) 964 device_printf(dev, "could not release %s\n", 965 mge_intrs[(sc->mge_intr_cnt == 1 ? 0 : i + 1)].description); 966 } 967 968 /* Detach network interface */ 969 if (sc->ifp) { 970 ether_ifdetach(sc->ifp); 971 if_free(sc->ifp); 972 } 973 974 /* Free DMA resources */ 975 mge_free_dma(sc); 976 977 /* Free IO memory handler */ 978 bus_release_resources(dev, res_spec, sc->res); 979 980 /* Destroy mutexes */ 981 mtx_destroy(&sc->receive_lock); 982 mtx_destroy(&sc->transmit_lock); 983 984 if (device_get_unit(dev) == 0) 985 sx_destroy(&sx_smi); 986 987 return (0); 988 } 989 990 static void 991 mge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) 992 { 993 struct mge_softc *sc; 994 struct mii_data *mii; 995 996 sc = ifp->if_softc; 997 MGE_GLOBAL_LOCK(sc); 998 999 if (!sc->phy_attached) { 1000 ifmr->ifm_active = IFM_1000_T | IFM_FDX | IFM_ETHER; 1001 ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE; 1002 goto out_unlock; 1003 } 1004 1005 mii = sc->mii; 1006 mii_pollstat(mii); 1007 1008 ifmr->ifm_active = mii->mii_media_active; 1009 ifmr->ifm_status = mii->mii_media_status; 1010 1011 out_unlock: 1012 MGE_GLOBAL_UNLOCK(sc); 1013 } 1014 1015 static uint32_t 1016 mge_set_port_serial_control(uint32_t media) 1017 { 1018 uint32_t port_config; 1019 1020 port_config = PORT_SERIAL_RES_BIT9 | PORT_SERIAL_FORCE_LINK_FAIL | 1021 PORT_SERIAL_MRU(PORT_SERIAL_MRU_1552); 1022 1023 if (IFM_TYPE(media) == IFM_ETHER) { 1024 switch(IFM_SUBTYPE(media)) { 1025 case IFM_AUTO: 1026 break; 1027 case IFM_1000_T: 1028 port_config |= (PORT_SERIAL_GMII_SPEED_1000 | 1029 PORT_SERIAL_AUTONEG | PORT_SERIAL_AUTONEG_FC 1030 | PORT_SERIAL_SPEED_AUTONEG); 1031 break; 1032 case IFM_100_TX: 1033 port_config |= (PORT_SERIAL_MII_SPEED_100 | 1034 PORT_SERIAL_AUTONEG | PORT_SERIAL_AUTONEG_FC 1035 | PORT_SERIAL_SPEED_AUTONEG); 1036 break; 1037 case IFM_10_T: 1038 port_config |= (PORT_SERIAL_AUTONEG | 1039 PORT_SERIAL_AUTONEG_FC | 1040 PORT_SERIAL_SPEED_AUTONEG); 1041 break; 1042 } 1043 if (media & IFM_FDX) 1044 port_config |= PORT_SERIAL_FULL_DUPLEX; 1045 } 1046 return (port_config); 1047 } 1048 1049 static int 1050 mge_ifmedia_upd(struct ifnet *ifp) 1051 { 1052 struct mge_softc *sc = ifp->if_softc; 1053 1054 /* 1055 * Do not do anything for switch here, as updating media between 1056 * MGE MAC and switch MAC is hardcoded in PCB. Changing it here would 1057 * break the link. 1058 */ 1059 if (sc->phy_attached) { 1060 MGE_GLOBAL_LOCK(sc); 1061 if (ifp->if_flags & IFF_UP) { 1062 sc->mge_media_status = sc->mii->mii_media.ifm_media; 1063 mii_mediachg(sc->mii); 1064 1065 /* MGE MAC needs to be reinitialized. */ 1066 mge_init_locked(sc); 1067 1068 } 1069 MGE_GLOBAL_UNLOCK(sc); 1070 } 1071 1072 return (0); 1073 } 1074 1075 static void 1076 mge_init(void *arg) 1077 { 1078 struct mge_softc *sc; 1079 1080 sc = arg; 1081 MGE_GLOBAL_LOCK(sc); 1082 1083 mge_init_locked(arg); 1084 1085 MGE_GLOBAL_UNLOCK(sc); 1086 } 1087 1088 static void 1089 mge_init_locked(void *arg) 1090 { 1091 struct mge_softc *sc = arg; 1092 struct mge_desc_wrapper *dw; 1093 volatile uint32_t reg_val; 1094 int i, count; 1095 uint32_t media_status; 1096 1097 1098 MGE_GLOBAL_LOCK_ASSERT(sc); 1099 1100 /* Stop interface */ 1101 mge_stop(sc); 1102 1103 /* Disable interrupts */ 1104 mge_intrs_ctrl(sc, 0); 1105 1106 /* Set MAC address */ 1107 mge_set_mac_address(sc); 1108 1109 /* Setup multicast filters */ 1110 mge_setup_multicast(sc); 1111 1112 if (sc->mge_ver == 2) { 1113 MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL1, MGE_RGMII_EN); 1114 MGE_WRITE(sc, MGE_FIXED_PRIO_CONF, MGE_FIXED_PRIO_EN(0)); 1115 } 1116 1117 /* Initialize TX queue configuration registers */ 1118 MGE_WRITE(sc, MGE_TX_TOKEN_COUNT(0), sc->mge_tx_tok_cnt); 1119 MGE_WRITE(sc, MGE_TX_TOKEN_CONF(0), sc->mge_tx_tok_cfg); 1120 MGE_WRITE(sc, MGE_TX_ARBITER_CONF(0), sc->mge_tx_arb_cfg); 1121 1122 /* Clear TX queue configuration registers for unused queues */ 1123 for (i = 1; i < 7; i++) { 1124 MGE_WRITE(sc, MGE_TX_TOKEN_COUNT(i), 0); 1125 MGE_WRITE(sc, MGE_TX_TOKEN_CONF(i), 0); 1126 MGE_WRITE(sc, MGE_TX_ARBITER_CONF(i), 0); 1127 } 1128 1129 /* Set default MTU */ 1130 MGE_WRITE(sc, sc->mge_mtu, 0); 1131 1132 /* Port configuration */ 1133 MGE_WRITE(sc, MGE_PORT_CONFIG, 1134 PORT_CONFIG_RXCS | PORT_CONFIG_DFLT_RXQ(0) | 1135 PORT_CONFIG_ARO_RXQ(0)); 1136 MGE_WRITE(sc, MGE_PORT_EXT_CONFIG , 0x0); 1137 1138 /* Configure promisc mode */ 1139 mge_set_prom_mode(sc, MGE_RX_DEFAULT_QUEUE); 1140 1141 media_status = sc->mge_media_status; 1142 if (sc->switch_attached) { 1143 media_status &= ~IFM_TMASK; 1144 media_status |= IFM_1000_T; 1145 } 1146 1147 /* Setup port configuration */ 1148 reg_val = mge_set_port_serial_control(media_status); 1149 MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL, reg_val); 1150 1151 /* Setup SDMA configuration */ 1152 MGE_WRITE(sc, MGE_SDMA_CONFIG , MGE_SDMA_RX_BYTE_SWAP | 1153 MGE_SDMA_TX_BYTE_SWAP | 1154 MGE_SDMA_RX_BURST_SIZE(MGE_SDMA_BURST_16_WORD) | 1155 MGE_SDMA_TX_BURST_SIZE(MGE_SDMA_BURST_16_WORD)); 1156 1157 MGE_WRITE(sc, MGE_TX_FIFO_URGENT_TRSH, 0x0); 1158 1159 MGE_WRITE(sc, MGE_TX_CUR_DESC_PTR, sc->tx_desc_start); 1160 MGE_WRITE(sc, MGE_RX_CUR_DESC_PTR(MGE_RX_DEFAULT_QUEUE), 1161 sc->rx_desc_start); 1162 1163 /* Reset descriptor indexes */ 1164 sc->tx_desc_curr = 0; 1165 sc->rx_desc_curr = 0; 1166 sc->tx_desc_used_idx = 0; 1167 sc->tx_desc_used_count = 0; 1168 1169 /* Enable RX descriptors */ 1170 for (i = 0; i < MGE_RX_DESC_NUM; i++) { 1171 dw = &sc->mge_rx_desc[i]; 1172 dw->mge_desc->cmd_status = MGE_RX_ENABLE_INT | MGE_DMA_OWNED; 1173 dw->mge_desc->buff_size = MCLBYTES; 1174 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap, 1175 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1176 } 1177 1178 /* Enable RX queue */ 1179 MGE_WRITE(sc, MGE_RX_QUEUE_CMD, MGE_ENABLE_RXQ(MGE_RX_DEFAULT_QUEUE)); 1180 1181 /* Enable port */ 1182 reg_val = MGE_READ(sc, MGE_PORT_SERIAL_CTRL); 1183 reg_val |= PORT_SERIAL_ENABLE; 1184 MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL, reg_val); 1185 count = 0x100000; 1186 for (;;) { 1187 reg_val = MGE_READ(sc, MGE_PORT_STATUS); 1188 if (reg_val & MGE_STATUS_LINKUP) 1189 break; 1190 DELAY(100); 1191 if (--count == 0) { 1192 if_printf(sc->ifp, "Timeout on link-up\n"); 1193 break; 1194 } 1195 } 1196 1197 /* Setup interrupts coalescing */ 1198 mge_set_rxic(sc); 1199 mge_set_txic(sc); 1200 1201 /* Enable interrupts */ 1202 #ifdef DEVICE_POLLING 1203 /* 1204 * * ...only if polling is not turned on. Disable interrupts explicitly 1205 * if polling is enabled. 1206 */ 1207 if (sc->ifp->if_capenable & IFCAP_POLLING) 1208 mge_intrs_ctrl(sc, 0); 1209 else 1210 #endif /* DEVICE_POLLING */ 1211 mge_intrs_ctrl(sc, 1); 1212 1213 /* Activate network interface */ 1214 sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; 1215 sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 1216 sc->wd_timer = 0; 1217 1218 /* Schedule watchdog timeout */ 1219 if (sc->phy_attached) 1220 callout_reset(&sc->wd_callout, hz, mge_tick, sc); 1221 } 1222 1223 static void 1224 mge_intr_rxtx(void *arg) 1225 { 1226 struct mge_softc *sc; 1227 uint32_t int_cause, int_cause_ext; 1228 1229 sc = arg; 1230 MGE_GLOBAL_LOCK(sc); 1231 1232 #ifdef DEVICE_POLLING 1233 if (sc->ifp->if_capenable & IFCAP_POLLING) { 1234 MGE_GLOBAL_UNLOCK(sc); 1235 return; 1236 } 1237 #endif 1238 1239 /* Get interrupt cause */ 1240 int_cause = MGE_READ(sc, MGE_PORT_INT_CAUSE); 1241 int_cause_ext = MGE_READ(sc, MGE_PORT_INT_CAUSE_EXT); 1242 1243 /* Check for Transmit interrupt */ 1244 if (int_cause_ext & (MGE_PORT_INT_EXT_TXBUF0 | 1245 MGE_PORT_INT_EXT_TXUR)) { 1246 MGE_WRITE(sc, MGE_PORT_INT_CAUSE_EXT, ~(int_cause_ext & 1247 (MGE_PORT_INT_EXT_TXBUF0 | MGE_PORT_INT_EXT_TXUR))); 1248 mge_intr_tx_locked(sc); 1249 } 1250 1251 MGE_TRANSMIT_UNLOCK(sc); 1252 1253 /* Check for Receive interrupt */ 1254 mge_intr_rx_check(sc, int_cause, int_cause_ext); 1255 1256 MGE_RECEIVE_UNLOCK(sc); 1257 } 1258 1259 static void 1260 mge_intr_err(void *arg) 1261 { 1262 struct mge_softc *sc; 1263 struct ifnet *ifp; 1264 1265 sc = arg; 1266 ifp = sc->ifp; 1267 if_printf(ifp, "%s\n", __FUNCTION__); 1268 } 1269 1270 static void 1271 mge_intr_misc(void *arg) 1272 { 1273 struct mge_softc *sc; 1274 struct ifnet *ifp; 1275 1276 sc = arg; 1277 ifp = sc->ifp; 1278 if_printf(ifp, "%s\n", __FUNCTION__); 1279 } 1280 1281 static void 1282 mge_intr_rx(void *arg) { 1283 struct mge_softc *sc; 1284 uint32_t int_cause, int_cause_ext; 1285 1286 sc = arg; 1287 MGE_RECEIVE_LOCK(sc); 1288 1289 #ifdef DEVICE_POLLING 1290 if (sc->ifp->if_capenable & IFCAP_POLLING) { 1291 MGE_RECEIVE_UNLOCK(sc); 1292 return; 1293 } 1294 #endif 1295 1296 /* Get interrupt cause */ 1297 int_cause = MGE_READ(sc, MGE_PORT_INT_CAUSE); 1298 int_cause_ext = MGE_READ(sc, MGE_PORT_INT_CAUSE_EXT); 1299 1300 mge_intr_rx_check(sc, int_cause, int_cause_ext); 1301 1302 MGE_RECEIVE_UNLOCK(sc); 1303 } 1304 1305 static void 1306 mge_intr_rx_check(struct mge_softc *sc, uint32_t int_cause, 1307 uint32_t int_cause_ext) 1308 { 1309 /* Check for resource error */ 1310 if (int_cause & MGE_PORT_INT_RXERRQ0) { 1311 mge_reinit_rx(sc); 1312 MGE_WRITE(sc, MGE_PORT_INT_CAUSE, 1313 ~(int_cause & MGE_PORT_INT_RXERRQ0)); 1314 } 1315 1316 int_cause &= MGE_PORT_INT_RXQ0; 1317 int_cause_ext &= MGE_PORT_INT_EXT_RXOR; 1318 1319 if (int_cause || int_cause_ext) { 1320 MGE_WRITE(sc, MGE_PORT_INT_CAUSE, ~int_cause); 1321 MGE_WRITE(sc, MGE_PORT_INT_CAUSE_EXT, ~int_cause_ext); 1322 mge_intr_rx_locked(sc, -1); 1323 } 1324 } 1325 1326 static int 1327 mge_intr_rx_locked(struct mge_softc *sc, int count) 1328 { 1329 struct ifnet *ifp = sc->ifp; 1330 uint32_t status; 1331 uint16_t bufsize; 1332 struct mge_desc_wrapper* dw; 1333 struct mbuf *mb; 1334 int rx_npkts = 0; 1335 1336 MGE_RECEIVE_LOCK_ASSERT(sc); 1337 1338 while (count != 0) { 1339 dw = &sc->mge_rx_desc[sc->rx_desc_curr]; 1340 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap, 1341 BUS_DMASYNC_POSTREAD); 1342 1343 /* Get status */ 1344 status = dw->mge_desc->cmd_status; 1345 bufsize = dw->mge_desc->buff_size; 1346 if ((status & MGE_DMA_OWNED) != 0) 1347 break; 1348 1349 if (dw->mge_desc->byte_count && 1350 ~(status & MGE_ERR_SUMMARY)) { 1351 1352 bus_dmamap_sync(sc->mge_rx_dtag, dw->buffer_dmap, 1353 BUS_DMASYNC_POSTREAD); 1354 1355 mb = m_devget(dw->buffer->m_data, 1356 dw->mge_desc->byte_count - ETHER_CRC_LEN, 1357 0, ifp, NULL); 1358 1359 if (mb == NULL) 1360 /* Give up if no mbufs */ 1361 break; 1362 1363 mb->m_len -= 2; 1364 mb->m_pkthdr.len -= 2; 1365 mb->m_data += 2; 1366 1367 mb->m_pkthdr.rcvif = ifp; 1368 1369 mge_offload_process_frame(ifp, mb, status, 1370 bufsize); 1371 1372 MGE_RECEIVE_UNLOCK(sc); 1373 (*ifp->if_input)(ifp, mb); 1374 MGE_RECEIVE_LOCK(sc); 1375 rx_npkts++; 1376 } 1377 1378 dw->mge_desc->byte_count = 0; 1379 dw->mge_desc->cmd_status = MGE_RX_ENABLE_INT | MGE_DMA_OWNED; 1380 sc->rx_desc_curr = (++sc->rx_desc_curr % MGE_RX_DESC_NUM); 1381 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap, 1382 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1383 1384 if (count > 0) 1385 count -= 1; 1386 } 1387 1388 if_inc_counter(ifp, IFCOUNTER_IPACKETS, rx_npkts); 1389 1390 return (rx_npkts); 1391 } 1392 1393 static void 1394 mge_intr_sum(void *arg) 1395 { 1396 struct mge_softc *sc = arg; 1397 struct ifnet *ifp; 1398 1399 ifp = sc->ifp; 1400 if_printf(ifp, "%s\n", __FUNCTION__); 1401 } 1402 1403 static void 1404 mge_intr_tx(void *arg) 1405 { 1406 struct mge_softc *sc = arg; 1407 uint32_t int_cause_ext; 1408 1409 MGE_TRANSMIT_LOCK(sc); 1410 1411 #ifdef DEVICE_POLLING 1412 if (sc->ifp->if_capenable & IFCAP_POLLING) { 1413 MGE_TRANSMIT_UNLOCK(sc); 1414 return; 1415 } 1416 #endif 1417 1418 /* Ack the interrupt */ 1419 int_cause_ext = MGE_READ(sc, MGE_PORT_INT_CAUSE_EXT); 1420 MGE_WRITE(sc, MGE_PORT_INT_CAUSE_EXT, ~(int_cause_ext & 1421 (MGE_PORT_INT_EXT_TXBUF0 | MGE_PORT_INT_EXT_TXUR))); 1422 1423 mge_intr_tx_locked(sc); 1424 1425 MGE_TRANSMIT_UNLOCK(sc); 1426 } 1427 1428 static void 1429 mge_intr_tx_locked(struct mge_softc *sc) 1430 { 1431 struct ifnet *ifp = sc->ifp; 1432 struct mge_desc_wrapper *dw; 1433 struct mge_desc *desc; 1434 uint32_t status; 1435 int send = 0; 1436 1437 MGE_TRANSMIT_LOCK_ASSERT(sc); 1438 1439 /* Disable watchdog */ 1440 sc->wd_timer = 0; 1441 1442 while (sc->tx_desc_used_count) { 1443 /* Get the descriptor */ 1444 dw = &sc->mge_tx_desc[sc->tx_desc_used_idx]; 1445 desc = dw->mge_desc; 1446 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap, 1447 BUS_DMASYNC_POSTREAD); 1448 1449 /* Get descriptor status */ 1450 status = desc->cmd_status; 1451 1452 if (status & MGE_DMA_OWNED) 1453 break; 1454 1455 sc->tx_desc_used_idx = 1456 (++sc->tx_desc_used_idx) % MGE_TX_DESC_NUM; 1457 sc->tx_desc_used_count--; 1458 1459 /* Update collision statistics */ 1460 if (status & MGE_ERR_SUMMARY) { 1461 if ((status & MGE_ERR_MASK) == MGE_TX_ERROR_LC) 1462 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 1); 1463 if ((status & MGE_ERR_MASK) == MGE_TX_ERROR_RL) 1464 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 16); 1465 } 1466 1467 bus_dmamap_sync(sc->mge_tx_dtag, dw->buffer_dmap, 1468 BUS_DMASYNC_POSTWRITE); 1469 bus_dmamap_unload(sc->mge_tx_dtag, dw->buffer_dmap); 1470 m_freem(dw->buffer); 1471 dw->buffer = (struct mbuf*)NULL; 1472 send++; 1473 1474 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1); 1475 } 1476 1477 if (send) { 1478 /* Now send anything that was pending */ 1479 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 1480 mge_start_locked(ifp); 1481 } 1482 } 1483 static int 1484 mge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) 1485 { 1486 struct mge_softc *sc = ifp->if_softc; 1487 struct ifreq *ifr = (struct ifreq *)data; 1488 int mask, error; 1489 uint32_t flags; 1490 1491 error = 0; 1492 1493 switch (command) { 1494 case SIOCSIFFLAGS: 1495 MGE_GLOBAL_LOCK(sc); 1496 1497 if (ifp->if_flags & IFF_UP) { 1498 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1499 flags = ifp->if_flags ^ sc->mge_if_flags; 1500 if (flags & IFF_PROMISC) 1501 mge_set_prom_mode(sc, 1502 MGE_RX_DEFAULT_QUEUE); 1503 1504 if (flags & IFF_ALLMULTI) 1505 mge_setup_multicast(sc); 1506 } else 1507 mge_init_locked(sc); 1508 } 1509 else if (ifp->if_drv_flags & IFF_DRV_RUNNING) 1510 mge_stop(sc); 1511 1512 sc->mge_if_flags = ifp->if_flags; 1513 MGE_GLOBAL_UNLOCK(sc); 1514 break; 1515 case SIOCADDMULTI: 1516 case SIOCDELMULTI: 1517 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1518 MGE_GLOBAL_LOCK(sc); 1519 mge_setup_multicast(sc); 1520 MGE_GLOBAL_UNLOCK(sc); 1521 } 1522 break; 1523 case SIOCSIFCAP: 1524 mask = ifp->if_capenable ^ ifr->ifr_reqcap; 1525 if (mask & IFCAP_HWCSUM) { 1526 ifp->if_capenable &= ~IFCAP_HWCSUM; 1527 ifp->if_capenable |= IFCAP_HWCSUM & ifr->ifr_reqcap; 1528 if (ifp->if_capenable & IFCAP_TXCSUM) 1529 ifp->if_hwassist = MGE_CHECKSUM_FEATURES; 1530 else 1531 ifp->if_hwassist = 0; 1532 } 1533 #ifdef DEVICE_POLLING 1534 if (mask & IFCAP_POLLING) { 1535 if (ifr->ifr_reqcap & IFCAP_POLLING) { 1536 error = ether_poll_register(mge_poll, ifp); 1537 if (error) 1538 return(error); 1539 1540 MGE_GLOBAL_LOCK(sc); 1541 mge_intrs_ctrl(sc, 0); 1542 ifp->if_capenable |= IFCAP_POLLING; 1543 MGE_GLOBAL_UNLOCK(sc); 1544 } else { 1545 error = ether_poll_deregister(ifp); 1546 MGE_GLOBAL_LOCK(sc); 1547 mge_intrs_ctrl(sc, 1); 1548 ifp->if_capenable &= ~IFCAP_POLLING; 1549 MGE_GLOBAL_UNLOCK(sc); 1550 } 1551 } 1552 #endif 1553 break; 1554 case SIOCGIFMEDIA: /* fall through */ 1555 case SIOCSIFMEDIA: 1556 /* 1557 * Setting up media type via ioctls is *not* supported for MAC 1558 * which is connected to switch. Use etherswitchcfg. 1559 */ 1560 if (!sc->phy_attached && (command == SIOCSIFMEDIA)) 1561 return (0); 1562 else if (!sc->phy_attached) { 1563 error = ifmedia_ioctl(ifp, ifr, &sc->mge_ifmedia, 1564 command); 1565 break; 1566 } 1567 1568 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_1000_T 1569 && !(ifr->ifr_media & IFM_FDX)) { 1570 device_printf(sc->dev, 1571 "1000baseTX half-duplex unsupported\n"); 1572 return 0; 1573 } 1574 error = ifmedia_ioctl(ifp, ifr, &sc->mii->mii_media, command); 1575 break; 1576 default: 1577 error = ether_ioctl(ifp, command, data); 1578 } 1579 return (error); 1580 } 1581 1582 static int 1583 mge_miibus_readreg(device_t dev, int phy, int reg) 1584 { 1585 struct mge_softc *sc; 1586 sc = device_get_softc(dev); 1587 1588 KASSERT(!switch_attached, ("miibus used with switch attached")); 1589 1590 return (mv_read_ext_phy(dev, phy, reg)); 1591 } 1592 1593 static int 1594 mge_miibus_writereg(device_t dev, int phy, int reg, int value) 1595 { 1596 struct mge_softc *sc; 1597 sc = device_get_softc(dev); 1598 1599 KASSERT(!switch_attached, ("miibus used with switch attached")); 1600 1601 mv_write_ext_phy(dev, phy, reg, value); 1602 1603 return (0); 1604 } 1605 1606 static int 1607 mge_probe(device_t dev) 1608 { 1609 1610 if (!ofw_bus_status_okay(dev)) 1611 return (ENXIO); 1612 1613 if (!ofw_bus_is_compatible(dev, "mrvl,ge")) 1614 return (ENXIO); 1615 1616 device_set_desc(dev, "Marvell Gigabit Ethernet controller"); 1617 return (BUS_PROBE_DEFAULT); 1618 } 1619 1620 static int 1621 mge_resume(device_t dev) 1622 { 1623 1624 device_printf(dev, "%s\n", __FUNCTION__); 1625 return (0); 1626 } 1627 1628 static int 1629 mge_shutdown(device_t dev) 1630 { 1631 struct mge_softc *sc = device_get_softc(dev); 1632 1633 MGE_GLOBAL_LOCK(sc); 1634 1635 #ifdef DEVICE_POLLING 1636 if (sc->ifp->if_capenable & IFCAP_POLLING) 1637 ether_poll_deregister(sc->ifp); 1638 #endif 1639 1640 mge_stop(sc); 1641 1642 MGE_GLOBAL_UNLOCK(sc); 1643 1644 return (0); 1645 } 1646 1647 static int 1648 mge_encap(struct mge_softc *sc, struct mbuf *m0) 1649 { 1650 struct mge_desc_wrapper *dw = NULL; 1651 struct ifnet *ifp; 1652 bus_dma_segment_t segs[MGE_TX_DESC_NUM]; 1653 bus_dmamap_t mapp; 1654 int error; 1655 int seg, nsegs; 1656 int desc_no; 1657 1658 ifp = sc->ifp; 1659 1660 /* Fetch unused map */ 1661 desc_no = sc->tx_desc_curr; 1662 dw = &sc->mge_tx_desc[desc_no]; 1663 mapp = dw->buffer_dmap; 1664 1665 /* Create mapping in DMA memory */ 1666 error = bus_dmamap_load_mbuf_sg(sc->mge_tx_dtag, mapp, m0, segs, &nsegs, 1667 BUS_DMA_NOWAIT); 1668 if (error != 0) { 1669 m_freem(m0); 1670 return (error); 1671 } 1672 1673 /* Only one segment is supported. */ 1674 if (nsegs != 1) { 1675 bus_dmamap_unload(sc->mge_tx_dtag, mapp); 1676 m_freem(m0); 1677 return (-1); 1678 } 1679 1680 bus_dmamap_sync(sc->mge_tx_dtag, mapp, BUS_DMASYNC_PREWRITE); 1681 1682 /* Everything is ok, now we can send buffers */ 1683 for (seg = 0; seg < nsegs; seg++) { 1684 dw->mge_desc->byte_count = segs[seg].ds_len; 1685 dw->mge_desc->buffer = segs[seg].ds_addr; 1686 dw->buffer = m0; 1687 dw->mge_desc->cmd_status = 0; 1688 if (seg == 0) 1689 mge_offload_setup_descriptor(sc, dw); 1690 dw->mge_desc->cmd_status |= MGE_TX_LAST | MGE_TX_FIRST | 1691 MGE_TX_ETH_CRC | MGE_TX_EN_INT | MGE_TX_PADDING | 1692 MGE_DMA_OWNED; 1693 } 1694 1695 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap, 1696 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1697 1698 sc->tx_desc_curr = (++sc->tx_desc_curr) % MGE_TX_DESC_NUM; 1699 sc->tx_desc_used_count++; 1700 return (0); 1701 } 1702 1703 static void 1704 mge_tick(void *msc) 1705 { 1706 struct mge_softc *sc = msc; 1707 1708 KASSERT(sc->phy_attached == 1, ("mge_tick while PHY not attached")); 1709 1710 MGE_GLOBAL_LOCK(sc); 1711 1712 /* Check for TX timeout */ 1713 mge_watchdog(sc); 1714 1715 mii_tick(sc->mii); 1716 1717 /* Check for media type change */ 1718 if(sc->mge_media_status != sc->mii->mii_media.ifm_media) 1719 mge_ifmedia_upd(sc->ifp); 1720 1721 MGE_GLOBAL_UNLOCK(sc); 1722 1723 /* Schedule another timeout one second from now */ 1724 callout_reset(&sc->wd_callout, hz, mge_tick, sc); 1725 1726 return; 1727 } 1728 1729 static void 1730 mge_watchdog(struct mge_softc *sc) 1731 { 1732 struct ifnet *ifp; 1733 1734 ifp = sc->ifp; 1735 1736 if (sc->wd_timer == 0 || --sc->wd_timer) { 1737 return; 1738 } 1739 1740 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); 1741 if_printf(ifp, "watchdog timeout\n"); 1742 1743 mge_stop(sc); 1744 mge_init_locked(sc); 1745 } 1746 1747 static void 1748 mge_start(struct ifnet *ifp) 1749 { 1750 struct mge_softc *sc = ifp->if_softc; 1751 1752 MGE_TRANSMIT_LOCK(sc); 1753 1754 mge_start_locked(ifp); 1755 1756 MGE_TRANSMIT_UNLOCK(sc); 1757 } 1758 1759 static void 1760 mge_start_locked(struct ifnet *ifp) 1761 { 1762 struct mge_softc *sc; 1763 struct mbuf *m0, *mtmp; 1764 uint32_t reg_val, queued = 0; 1765 1766 sc = ifp->if_softc; 1767 1768 MGE_TRANSMIT_LOCK_ASSERT(sc); 1769 1770 if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != 1771 IFF_DRV_RUNNING) 1772 return; 1773 1774 for (;;) { 1775 /* Get packet from the queue */ 1776 IF_DEQUEUE(&ifp->if_snd, m0); 1777 if (m0 == NULL) 1778 break; 1779 1780 if (m0->m_pkthdr.csum_flags & (CSUM_IP|CSUM_TCP|CSUM_UDP) || 1781 m0->m_flags & M_VLANTAG) { 1782 if (M_WRITABLE(m0) == 0) { 1783 mtmp = m_dup(m0, M_NOWAIT); 1784 m_freem(m0); 1785 if (mtmp == NULL) 1786 continue; 1787 m0 = mtmp; 1788 } 1789 } 1790 /* The driver support only one DMA fragment. */ 1791 if (m0->m_next != NULL) { 1792 mtmp = m_defrag(m0, M_NOWAIT); 1793 if (mtmp != NULL) 1794 m0 = mtmp; 1795 } 1796 1797 /* Check for free descriptors */ 1798 if (sc->tx_desc_used_count + 1 >= MGE_TX_DESC_NUM) { 1799 IF_PREPEND(&ifp->if_snd, m0); 1800 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1801 break; 1802 } 1803 1804 if (mge_encap(sc, m0) != 0) 1805 break; 1806 1807 queued++; 1808 BPF_MTAP(ifp, m0); 1809 } 1810 1811 if (queued) { 1812 /* Enable transmitter and watchdog timer */ 1813 reg_val = MGE_READ(sc, MGE_TX_QUEUE_CMD); 1814 MGE_WRITE(sc, MGE_TX_QUEUE_CMD, reg_val | MGE_ENABLE_TXQ); 1815 sc->wd_timer = 5; 1816 } 1817 } 1818 1819 static void 1820 mge_stop(struct mge_softc *sc) 1821 { 1822 struct ifnet *ifp; 1823 volatile uint32_t reg_val, status; 1824 struct mge_desc_wrapper *dw; 1825 struct mge_desc *desc; 1826 int count; 1827 1828 ifp = sc->ifp; 1829 1830 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) 1831 return; 1832 1833 /* Stop tick engine */ 1834 callout_stop(&sc->wd_callout); 1835 1836 /* Disable interface */ 1837 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 1838 sc->wd_timer = 0; 1839 1840 /* Disable interrupts */ 1841 mge_intrs_ctrl(sc, 0); 1842 1843 /* Disable Rx and Tx */ 1844 reg_val = MGE_READ(sc, MGE_TX_QUEUE_CMD); 1845 MGE_WRITE(sc, MGE_TX_QUEUE_CMD, reg_val | MGE_DISABLE_TXQ); 1846 MGE_WRITE(sc, MGE_RX_QUEUE_CMD, MGE_DISABLE_RXQ_ALL); 1847 1848 /* Remove pending data from TX queue */ 1849 while (sc->tx_desc_used_idx != sc->tx_desc_curr && 1850 sc->tx_desc_used_count) { 1851 /* Get the descriptor */ 1852 dw = &sc->mge_tx_desc[sc->tx_desc_used_idx]; 1853 desc = dw->mge_desc; 1854 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap, 1855 BUS_DMASYNC_POSTREAD); 1856 1857 /* Get descriptor status */ 1858 status = desc->cmd_status; 1859 1860 if (status & MGE_DMA_OWNED) 1861 break; 1862 1863 sc->tx_desc_used_idx = (++sc->tx_desc_used_idx) % 1864 MGE_TX_DESC_NUM; 1865 sc->tx_desc_used_count--; 1866 1867 bus_dmamap_sync(sc->mge_tx_dtag, dw->buffer_dmap, 1868 BUS_DMASYNC_POSTWRITE); 1869 bus_dmamap_unload(sc->mge_tx_dtag, dw->buffer_dmap); 1870 1871 m_freem(dw->buffer); 1872 dw->buffer = (struct mbuf*)NULL; 1873 } 1874 1875 /* Wait for end of transmission */ 1876 count = 0x100000; 1877 while (count--) { 1878 reg_val = MGE_READ(sc, MGE_PORT_STATUS); 1879 if ( !(reg_val & MGE_STATUS_TX_IN_PROG) && 1880 (reg_val & MGE_STATUS_TX_FIFO_EMPTY)) 1881 break; 1882 DELAY(100); 1883 } 1884 1885 if (count == 0) 1886 if_printf(ifp, 1887 "%s: timeout while waiting for end of transmission\n", 1888 __FUNCTION__); 1889 1890 reg_val = MGE_READ(sc, MGE_PORT_SERIAL_CTRL); 1891 reg_val &= ~(PORT_SERIAL_ENABLE); 1892 MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL ,reg_val); 1893 } 1894 1895 static int 1896 mge_suspend(device_t dev) 1897 { 1898 1899 device_printf(dev, "%s\n", __FUNCTION__); 1900 return (0); 1901 } 1902 1903 static void 1904 mge_offload_process_frame(struct ifnet *ifp, struct mbuf *frame, 1905 uint32_t status, uint16_t bufsize) 1906 { 1907 int csum_flags = 0; 1908 1909 if (ifp->if_capenable & IFCAP_RXCSUM) { 1910 if ((status & MGE_RX_L3_IS_IP) && (status & MGE_RX_IP_OK)) 1911 csum_flags |= CSUM_IP_CHECKED | CSUM_IP_VALID; 1912 1913 if ((bufsize & MGE_RX_IP_FRAGMENT) == 0 && 1914 (MGE_RX_L4_IS_TCP(status) || MGE_RX_L4_IS_UDP(status)) && 1915 (status & MGE_RX_L4_CSUM_OK)) { 1916 csum_flags |= CSUM_DATA_VALID | CSUM_PSEUDO_HDR; 1917 frame->m_pkthdr.csum_data = 0xFFFF; 1918 } 1919 1920 frame->m_pkthdr.csum_flags = csum_flags; 1921 } 1922 } 1923 1924 static void 1925 mge_offload_setup_descriptor(struct mge_softc *sc, struct mge_desc_wrapper *dw) 1926 { 1927 struct mbuf *m0 = dw->buffer; 1928 struct ether_vlan_header *eh = mtod(m0, struct ether_vlan_header *); 1929 int csum_flags = m0->m_pkthdr.csum_flags; 1930 int cmd_status = 0; 1931 struct ip *ip; 1932 int ehlen, etype; 1933 1934 if (csum_flags != 0) { 1935 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) { 1936 etype = ntohs(eh->evl_proto); 1937 ehlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 1938 csum_flags |= MGE_TX_VLAN_TAGGED; 1939 } else { 1940 etype = ntohs(eh->evl_encap_proto); 1941 ehlen = ETHER_HDR_LEN; 1942 } 1943 1944 if (etype != ETHERTYPE_IP) { 1945 if_printf(sc->ifp, 1946 "TCP/IP Offload enabled for unsupported " 1947 "protocol!\n"); 1948 return; 1949 } 1950 1951 ip = (struct ip *)(m0->m_data + ehlen); 1952 cmd_status |= MGE_TX_IP_HDR_SIZE(ip->ip_hl); 1953 cmd_status |= MGE_TX_NOT_FRAGMENT; 1954 } 1955 1956 if (csum_flags & CSUM_IP) 1957 cmd_status |= MGE_TX_GEN_IP_CSUM; 1958 1959 if (csum_flags & CSUM_TCP) 1960 cmd_status |= MGE_TX_GEN_L4_CSUM; 1961 1962 if (csum_flags & CSUM_UDP) 1963 cmd_status |= MGE_TX_GEN_L4_CSUM | MGE_TX_UDP; 1964 1965 dw->mge_desc->cmd_status |= cmd_status; 1966 } 1967 1968 static void 1969 mge_intrs_ctrl(struct mge_softc *sc, int enable) 1970 { 1971 1972 if (enable) { 1973 MGE_WRITE(sc, MGE_PORT_INT_MASK , MGE_PORT_INT_RXQ0 | 1974 MGE_PORT_INT_EXTEND | MGE_PORT_INT_RXERRQ0); 1975 MGE_WRITE(sc, MGE_PORT_INT_MASK_EXT , MGE_PORT_INT_EXT_TXERR0 | 1976 MGE_PORT_INT_EXT_RXOR | MGE_PORT_INT_EXT_TXUR | 1977 MGE_PORT_INT_EXT_TXBUF0); 1978 } else { 1979 MGE_WRITE(sc, MGE_INT_CAUSE, 0x0); 1980 MGE_WRITE(sc, MGE_INT_MASK, 0x0); 1981 1982 MGE_WRITE(sc, MGE_PORT_INT_CAUSE, 0x0); 1983 MGE_WRITE(sc, MGE_PORT_INT_CAUSE_EXT, 0x0); 1984 1985 MGE_WRITE(sc, MGE_PORT_INT_MASK, 0x0); 1986 MGE_WRITE(sc, MGE_PORT_INT_MASK_EXT, 0x0); 1987 } 1988 } 1989 1990 static uint8_t 1991 mge_crc8(uint8_t *data, int size) 1992 { 1993 uint8_t crc = 0; 1994 static const uint8_t ct[256] = { 1995 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 1996 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, 1997 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 1998 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, 1999 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 2000 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, 2001 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 2002 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, 2003 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 2004 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, 2005 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 2006 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, 2007 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 2008 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, 2009 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 2010 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, 2011 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 2012 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, 2013 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 2014 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, 2015 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 2016 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 2017 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 2018 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, 2019 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 2020 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, 2021 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 2022 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, 2023 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 2024 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, 2025 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 2026 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 2027 }; 2028 2029 while(size--) 2030 crc = ct[crc ^ *(data++)]; 2031 2032 return(crc); 2033 } 2034 2035 static void 2036 mge_setup_multicast(struct mge_softc *sc) 2037 { 2038 uint8_t special[5] = { 0x01, 0x00, 0x5E, 0x00, 0x00 }; 2039 uint8_t v = (MGE_RX_DEFAULT_QUEUE << 1) | 1; 2040 uint32_t smt[MGE_MCAST_REG_NUMBER]; 2041 uint32_t omt[MGE_MCAST_REG_NUMBER]; 2042 struct ifnet *ifp = sc->ifp; 2043 struct ifmultiaddr *ifma; 2044 uint8_t *mac; 2045 int i; 2046 2047 if (ifp->if_flags & IFF_ALLMULTI) { 2048 for (i = 0; i < MGE_MCAST_REG_NUMBER; i++) 2049 smt[i] = omt[i] = (v << 24) | (v << 16) | (v << 8) | v; 2050 } else { 2051 memset(smt, 0, sizeof(smt)); 2052 memset(omt, 0, sizeof(omt)); 2053 2054 if_maddr_rlock(ifp); 2055 CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 2056 if (ifma->ifma_addr->sa_family != AF_LINK) 2057 continue; 2058 2059 mac = LLADDR((struct sockaddr_dl *)ifma->ifma_addr); 2060 if (memcmp(mac, special, sizeof(special)) == 0) { 2061 i = mac[5]; 2062 smt[i >> 2] |= v << ((i & 0x03) << 3); 2063 } else { 2064 i = mge_crc8(mac, ETHER_ADDR_LEN); 2065 omt[i >> 2] |= v << ((i & 0x03) << 3); 2066 } 2067 } 2068 if_maddr_runlock(ifp); 2069 } 2070 2071 for (i = 0; i < MGE_MCAST_REG_NUMBER; i++) { 2072 MGE_WRITE(sc, MGE_DA_FILTER_SPEC_MCAST(i), smt[i]); 2073 MGE_WRITE(sc, MGE_DA_FILTER_OTH_MCAST(i), omt[i]); 2074 } 2075 } 2076 2077 static void 2078 mge_set_rxic(struct mge_softc *sc) 2079 { 2080 uint32_t reg; 2081 2082 if (sc->rx_ic_time > sc->mge_rx_ipg_max) 2083 sc->rx_ic_time = sc->mge_rx_ipg_max; 2084 2085 reg = MGE_READ(sc, MGE_SDMA_CONFIG); 2086 reg &= ~mge_rx_ipg(sc->mge_rx_ipg_max, sc->mge_ver); 2087 reg |= mge_rx_ipg(sc->rx_ic_time, sc->mge_ver); 2088 MGE_WRITE(sc, MGE_SDMA_CONFIG, reg); 2089 } 2090 2091 static void 2092 mge_set_txic(struct mge_softc *sc) 2093 { 2094 uint32_t reg; 2095 2096 if (sc->tx_ic_time > sc->mge_tfut_ipg_max) 2097 sc->tx_ic_time = sc->mge_tfut_ipg_max; 2098 2099 reg = MGE_READ(sc, MGE_TX_FIFO_URGENT_TRSH); 2100 reg &= ~mge_tfut_ipg(sc->mge_tfut_ipg_max, sc->mge_ver); 2101 reg |= mge_tfut_ipg(sc->tx_ic_time, sc->mge_ver); 2102 MGE_WRITE(sc, MGE_TX_FIFO_URGENT_TRSH, reg); 2103 } 2104 2105 static int 2106 mge_sysctl_ic(SYSCTL_HANDLER_ARGS) 2107 { 2108 struct mge_softc *sc = (struct mge_softc *)arg1; 2109 uint32_t time; 2110 int error; 2111 2112 time = (arg2 == MGE_IC_RX) ? sc->rx_ic_time : sc->tx_ic_time; 2113 error = sysctl_handle_int(oidp, &time, 0, req); 2114 if (error != 0) 2115 return(error); 2116 2117 MGE_GLOBAL_LOCK(sc); 2118 if (arg2 == MGE_IC_RX) { 2119 sc->rx_ic_time = time; 2120 mge_set_rxic(sc); 2121 } else { 2122 sc->tx_ic_time = time; 2123 mge_set_txic(sc); 2124 } 2125 MGE_GLOBAL_UNLOCK(sc); 2126 2127 return(0); 2128 } 2129 2130 static void 2131 mge_add_sysctls(struct mge_softc *sc) 2132 { 2133 struct sysctl_ctx_list *ctx; 2134 struct sysctl_oid_list *children; 2135 struct sysctl_oid *tree; 2136 2137 ctx = device_get_sysctl_ctx(sc->dev); 2138 children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)); 2139 tree = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, "int_coal", 2140 CTLFLAG_RD, 0, "MGE Interrupts coalescing"); 2141 children = SYSCTL_CHILDREN(tree); 2142 2143 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rx_time", 2144 CTLTYPE_UINT | CTLFLAG_RW, sc, MGE_IC_RX, mge_sysctl_ic, 2145 "I", "IC RX time threshold"); 2146 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tx_time", 2147 CTLTYPE_UINT | CTLFLAG_RW, sc, MGE_IC_TX, mge_sysctl_ic, 2148 "I", "IC TX time threshold"); 2149 } 2150 2151 static int 2152 mge_mdio_writereg(device_t dev, int phy, int reg, int value) 2153 { 2154 2155 mv_write_ge_smi(dev, phy, reg, value); 2156 2157 return (0); 2158 } 2159 2160 2161 static int 2162 mge_mdio_readreg(device_t dev, int phy, int reg) 2163 { 2164 int ret; 2165 2166 ret = mv_read_ge_smi(dev, phy, reg); 2167 2168 return (ret); 2169 } 2170