1/*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 1999 The NetBSD Foundation, Inc. 5 * Copyright (c) 2001-2003 Thomas Moestl <tmm@FreeBSD.org>. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to The NetBSD Foundation 9 * by Paul Kranenburg. 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. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 * 39 * from: NetBSD: hme.c,v 1.45 2005/02/18 00:22:11 heas Exp 40 */ 41 42#include <sys/cdefs.h> 43__FBSDID("$FreeBSD$"); 44 45/* 46 * HME Ethernet module driver. 47 * 48 * The HME is e.g. part of the PCIO PCI multi function device. 49 * It supports TX gathering and TX and RX checksum offloading. 50 * RX buffers must be aligned at a programmable offset modulo 16. We choose 2 51 * for this offset: mbuf clusters are usually on about 2^11 boundaries, 2 bytes 52 * are skipped to make sure the header after the ethernet header is aligned on a 53 * natural boundary, so this ensures minimal wastage in the most common case. 54 * 55 * Also, apparently, the buffers must extend to a DMA burst boundary beyond the 56 * maximum packet size (this is not verified). Buffers starting on odd 57 * boundaries must be mapped so that the burst can start on a natural boundary. 58 * 59 * STP2002QFP-UG says that Ethernet hardware supports TCP checksum offloading. 60 * In reality, we can do the same technique for UDP datagram too. However, 61 * the hardware doesn't compensate the checksum for UDP datagram which can yield 62 * to 0x0. As a safe guard, UDP checksum offload is disabled by default. It 63 * can be reactivated by setting special link option link0 with ifconfig(8). 64 */ 65#define HME_CSUM_FEATURES (CSUM_TCP) 66#if 0 67#define HMEDEBUG 68#endif 69#define KTR_HME KTR_SPARE2 /* XXX */ 70 71#include <sys/param.h> 72#include <sys/systm.h> 73#include <sys/bus.h> 74#include <sys/endian.h> 75#include <sys/kernel.h> 76#include <sys/module.h> 77#include <sys/ktr.h> 78#include <sys/mbuf.h> 79#include <sys/malloc.h> 80#include <sys/socket.h> 81#include <sys/sockio.h> 82 83#include <net/bpf.h> 84#include <net/ethernet.h> 85#include <net/if.h> 86#include <net/if_var.h> 87#include <net/if_arp.h> 88#include <net/if_dl.h> 89#include <net/if_media.h> 90#include <net/if_types.h> 91#include <net/if_vlan_var.h> 92 93#include <netinet/in.h> 94#include <netinet/in_systm.h> 95#include <netinet/ip.h> 96#include <netinet/tcp.h> 97#include <netinet/udp.h> 98 99#include <dev/mii/mii.h> 100#include <dev/mii/miivar.h> 101 102#include <machine/bus.h> 103 104#include <dev/hme/if_hmereg.h> 105#include <dev/hme/if_hmevar.h> 106 107CTASSERT(powerof2(HME_NRXDESC) && HME_NRXDESC >= 32 && HME_NRXDESC <= 256); 108CTASSERT(HME_NTXDESC % 16 == 0 && HME_NTXDESC >= 16 && HME_NTXDESC <= 256); 109 110static void hme_start(struct ifnet *); 111static void hme_start_locked(struct ifnet *); 112static void hme_stop(struct hme_softc *); 113static int hme_ioctl(struct ifnet *, u_long, caddr_t); 114static void hme_tick(void *); 115static int hme_watchdog(struct hme_softc *); 116static void hme_init(void *); 117static void hme_init_locked(struct hme_softc *); 118static int hme_add_rxbuf(struct hme_softc *, unsigned int, int); 119static int hme_meminit(struct hme_softc *); 120static int hme_mac_bitflip(struct hme_softc *, u_int32_t, u_int32_t, 121 u_int32_t, u_int32_t); 122static void hme_mifinit(struct hme_softc *); 123static void hme_setladrf(struct hme_softc *, int); 124 125static int hme_mediachange(struct ifnet *); 126static int hme_mediachange_locked(struct hme_softc *); 127static void hme_mediastatus(struct ifnet *, struct ifmediareq *); 128 129static int hme_load_txmbuf(struct hme_softc *, struct mbuf **); 130static void hme_read(struct hme_softc *, int, int, u_int32_t); 131static void hme_eint(struct hme_softc *, u_int); 132static void hme_rint(struct hme_softc *); 133static void hme_tint(struct hme_softc *); 134static void hme_rxcksum(struct mbuf *, u_int32_t); 135 136static void hme_cdma_callback(void *, bus_dma_segment_t *, int, int); 137 138devclass_t hme_devclass; 139 140static int hme_nerr; 141 142DRIVER_MODULE(miibus, hme, miibus_driver, miibus_devclass, 0, 0); 143MODULE_DEPEND(hme, miibus, 1, 1, 1); 144 145#define HME_SPC_READ_4(spc, sc, offs) \ 146 bus_space_read_4((sc)->sc_ ## spc ## t, (sc)->sc_ ## spc ## h, \ 147 (offs)) 148#define HME_SPC_WRITE_4(spc, sc, offs, v) \ 149 bus_space_write_4((sc)->sc_ ## spc ## t, (sc)->sc_ ## spc ## h, \ 150 (offs), (v)) 151#define HME_SPC_BARRIER(spc, sc, offs, l, f) \ 152 bus_space_barrier((sc)->sc_ ## spc ## t, (sc)->sc_ ## spc ## h, \ 153 (offs), (l), (f)) 154 155#define HME_SEB_READ_4(sc, offs) HME_SPC_READ_4(seb, (sc), (offs)) 156#define HME_SEB_WRITE_4(sc, offs, v) HME_SPC_WRITE_4(seb, (sc), (offs), (v)) 157#define HME_SEB_BARRIER(sc, offs, l, f) \ 158 HME_SPC_BARRIER(seb, (sc), (offs), (l), (f)) 159#define HME_ERX_READ_4(sc, offs) HME_SPC_READ_4(erx, (sc), (offs)) 160#define HME_ERX_WRITE_4(sc, offs, v) HME_SPC_WRITE_4(erx, (sc), (offs), (v)) 161#define HME_ERX_BARRIER(sc, offs, l, f) \ 162 HME_SPC_BARRIER(erx, (sc), (offs), (l), (f)) 163#define HME_ETX_READ_4(sc, offs) HME_SPC_READ_4(etx, (sc), (offs)) 164#define HME_ETX_WRITE_4(sc, offs, v) HME_SPC_WRITE_4(etx, (sc), (offs), (v)) 165#define HME_ETX_BARRIER(sc, offs, l, f) \ 166 HME_SPC_BARRIER(etx, (sc), (offs), (l), (f)) 167#define HME_MAC_READ_4(sc, offs) HME_SPC_READ_4(mac, (sc), (offs)) 168#define HME_MAC_WRITE_4(sc, offs, v) HME_SPC_WRITE_4(mac, (sc), (offs), (v)) 169#define HME_MAC_BARRIER(sc, offs, l, f) \ 170 HME_SPC_BARRIER(mac, (sc), (offs), (l), (f)) 171#define HME_MIF_READ_4(sc, offs) HME_SPC_READ_4(mif, (sc), (offs)) 172#define HME_MIF_WRITE_4(sc, offs, v) HME_SPC_WRITE_4(mif, (sc), (offs), (v)) 173#define HME_MIF_BARRIER(sc, offs, l, f) \ 174 HME_SPC_BARRIER(mif, (sc), (offs), (l), (f)) 175 176#define HME_MAXERR 5 177#define HME_WHINE(dev, ...) do { \ 178 if (hme_nerr++ < HME_MAXERR) \ 179 device_printf(dev, __VA_ARGS__); \ 180 if (hme_nerr == HME_MAXERR) { \ 181 device_printf(dev, "too many errors; not reporting " \ 182 "any more\n"); \ 183 } \ 184} while(0) 185 186/* Support oversized VLAN frames. */ 187#define HME_MAX_FRAMESIZE (ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN) 188 189int 190hme_config(struct hme_softc *sc) 191{ 192 struct ifnet *ifp; 193 struct mii_softc *child; 194 bus_size_t size; 195 int error, rdesc, tdesc, i; 196 197 ifp = sc->sc_ifp = if_alloc(IFT_ETHER); 198 if (ifp == NULL) 199 return (ENOSPC); 200 201 /* 202 * HME common initialization. 203 * 204 * hme_softc fields that must be initialized by the front-end: 205 * 206 * the DMA bus tag: 207 * sc_dmatag 208 * 209 * the bus handles, tags and offsets (splitted for SBus compatibility): 210 * sc_seb{t,h,o} (Shared Ethernet Block registers) 211 * sc_erx{t,h,o} (Receiver Unit registers) 212 * sc_etx{t,h,o} (Transmitter Unit registers) 213 * sc_mac{t,h,o} (MAC registers) 214 * sc_mif{t,h,o} (Management Interface registers) 215 * 216 * the maximum bus burst size: 217 * sc_burst 218 * 219 */ 220 221 callout_init_mtx(&sc->sc_tick_ch, &sc->sc_lock, 0); 222 223 /* Make sure the chip is stopped. */ 224 HME_LOCK(sc); 225 hme_stop(sc); 226 HME_UNLOCK(sc); 227 228 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, 229 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 230 BUS_SPACE_MAXSIZE_32BIT, 0, BUS_SPACE_MAXSIZE_32BIT, 0, 231 NULL, NULL, &sc->sc_pdmatag); 232 if (error) 233 goto fail_ifnet; 234 235 /* 236 * Create control, RX and TX mbuf DMA tags. 237 * Buffer descriptors must be aligned on a 2048 byte boundary; 238 * take this into account when calculating the size. Note that 239 * the maximum number of descriptors (256) occupies 2048 bytes, 240 * so we allocate that much regardless of HME_N*DESC. 241 */ 242 size = 4096; 243 error = bus_dma_tag_create(sc->sc_pdmatag, 2048, 0, 244 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size, 245 1, size, 0, busdma_lock_mutex, &sc->sc_lock, &sc->sc_cdmatag); 246 if (error) 247 goto fail_ptag; 248 249 error = bus_dma_tag_create(sc->sc_pdmatag, max(0x10, sc->sc_burst), 0, 250 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, 251 1, MCLBYTES, BUS_DMA_ALLOCNOW, NULL, NULL, &sc->sc_rdmatag); 252 if (error) 253 goto fail_ctag; 254 255 error = bus_dma_tag_create(sc->sc_pdmatag, max(0x10, sc->sc_burst), 0, 256 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 257 MCLBYTES * HME_NTXSEGS, HME_NTXSEGS, MCLBYTES, BUS_DMA_ALLOCNOW, 258 NULL, NULL, &sc->sc_tdmatag); 259 if (error) 260 goto fail_rtag; 261 262 /* Allocate the control DMA buffer. */ 263 error = bus_dmamem_alloc(sc->sc_cdmatag, (void **)&sc->sc_rb.rb_membase, 264 BUS_DMA_WAITOK | BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->sc_cdmamap); 265 if (error != 0) { 266 device_printf(sc->sc_dev, "DMA buffer alloc error %d\n", error); 267 goto fail_ttag; 268 } 269 270 /* Load the control DMA buffer. */ 271 sc->sc_rb.rb_dmabase = 0; 272 if ((error = bus_dmamap_load(sc->sc_cdmatag, sc->sc_cdmamap, 273 sc->sc_rb.rb_membase, size, hme_cdma_callback, sc, 0)) != 0 || 274 sc->sc_rb.rb_dmabase == 0) { 275 device_printf(sc->sc_dev, "DMA buffer map load error %d\n", 276 error); 277 goto fail_free; 278 } 279 CTR2(KTR_HME, "hme_config: dma va %p, pa %#lx", sc->sc_rb.rb_membase, 280 sc->sc_rb.rb_dmabase); 281 282 /* 283 * Prepare the RX descriptors. rdesc serves as marker for the last 284 * processed descriptor and may be used later on. 285 */ 286 for (rdesc = 0; rdesc < HME_NRXDESC; rdesc++) { 287 sc->sc_rb.rb_rxdesc[rdesc].hrx_m = NULL; 288 error = bus_dmamap_create(sc->sc_rdmatag, 0, 289 &sc->sc_rb.rb_rxdesc[rdesc].hrx_dmamap); 290 if (error != 0) 291 goto fail_rxdesc; 292 } 293 error = bus_dmamap_create(sc->sc_rdmatag, 0, 294 &sc->sc_rb.rb_spare_dmamap); 295 if (error != 0) 296 goto fail_rxdesc; 297 /* Same for the TX descs. */ 298 for (tdesc = 0; tdesc < HME_NTXQ; tdesc++) { 299 sc->sc_rb.rb_txdesc[tdesc].htx_m = NULL; 300 error = bus_dmamap_create(sc->sc_tdmatag, 0, 301 &sc->sc_rb.rb_txdesc[tdesc].htx_dmamap); 302 if (error != 0) 303 goto fail_txdesc; 304 } 305 306 sc->sc_csum_features = HME_CSUM_FEATURES; 307 /* Initialize ifnet structure. */ 308 ifp->if_softc = sc; 309 if_initname(ifp, device_get_name(sc->sc_dev), 310 device_get_unit(sc->sc_dev)); 311 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 312 ifp->if_start = hme_start; 313 ifp->if_ioctl = hme_ioctl; 314 ifp->if_init = hme_init; 315 IFQ_SET_MAXLEN(&ifp->if_snd, HME_NTXQ); 316 ifp->if_snd.ifq_drv_maxlen = HME_NTXQ; 317 IFQ_SET_READY(&ifp->if_snd); 318 319 hme_mifinit(sc); 320 321 /* 322 * DP83840A used with HME chips don't advertise their media 323 * capabilities themselves properly so force writing the ANAR 324 * according to the BMSR in mii_phy_setmedia(). 325 */ 326 error = mii_attach(sc->sc_dev, &sc->sc_miibus, ifp, hme_mediachange, 327 hme_mediastatus, BMSR_DEFCAPMASK, HME_PHYAD_EXTERNAL, 328 MII_OFFSET_ANY, MIIF_FORCEANEG); 329 i = mii_attach(sc->sc_dev, &sc->sc_miibus, ifp, hme_mediachange, 330 hme_mediastatus, BMSR_DEFCAPMASK, HME_PHYAD_INTERNAL, 331 MII_OFFSET_ANY, MIIF_FORCEANEG); 332 if (error != 0 && i != 0) { 333 error = ENXIO; 334 device_printf(sc->sc_dev, "attaching PHYs failed\n"); 335 goto fail_rxdesc; 336 } 337 sc->sc_mii = device_get_softc(sc->sc_miibus); 338 339 /* 340 * Walk along the list of attached MII devices and 341 * establish an `MII instance' to `PHY number' 342 * mapping. We'll use this mapping to enable the MII 343 * drivers of the external transceiver according to 344 * the currently selected media. 345 */ 346 sc->sc_phys[0] = sc->sc_phys[1] = -1; 347 LIST_FOREACH(child, &sc->sc_mii->mii_phys, mii_list) { 348 /* 349 * Note: we support just two PHYs: the built-in 350 * internal device and an external on the MII 351 * connector. 352 */ 353 if ((child->mii_phy != HME_PHYAD_EXTERNAL && 354 child->mii_phy != HME_PHYAD_INTERNAL) || 355 child->mii_inst > 1) { 356 device_printf(sc->sc_dev, "cannot accommodate " 357 "MII device %s at phy %d, instance %d\n", 358 device_get_name(child->mii_dev), 359 child->mii_phy, child->mii_inst); 360 continue; 361 } 362 363 sc->sc_phys[child->mii_inst] = child->mii_phy; 364 } 365 366 /* Attach the interface. */ 367 ether_ifattach(ifp, sc->sc_enaddr); 368 369 /* 370 * Tell the upper layer(s) we support long frames/checksum offloads. 371 */ 372 ifp->if_hdrlen = sizeof(struct ether_vlan_header); 373 ifp->if_capabilities |= IFCAP_VLAN_MTU | IFCAP_HWCSUM; 374 ifp->if_hwassist |= sc->sc_csum_features; 375 ifp->if_capenable |= IFCAP_VLAN_MTU | IFCAP_HWCSUM; 376 377 gone_in_dev(sc->sc_dev, 13, "10/100 NIC almost exclusively for sparc64"); 378 return (0); 379 380fail_txdesc: 381 for (i = 0; i < tdesc; i++) { 382 bus_dmamap_destroy(sc->sc_tdmatag, 383 sc->sc_rb.rb_txdesc[i].htx_dmamap); 384 } 385 bus_dmamap_destroy(sc->sc_rdmatag, sc->sc_rb.rb_spare_dmamap); 386fail_rxdesc: 387 for (i = 0; i < rdesc; i++) { 388 bus_dmamap_destroy(sc->sc_rdmatag, 389 sc->sc_rb.rb_rxdesc[i].hrx_dmamap); 390 } 391 bus_dmamap_unload(sc->sc_cdmatag, sc->sc_cdmamap); 392fail_free: 393 bus_dmamem_free(sc->sc_cdmatag, sc->sc_rb.rb_membase, sc->sc_cdmamap); 394fail_ttag: 395 bus_dma_tag_destroy(sc->sc_tdmatag); 396fail_rtag: 397 bus_dma_tag_destroy(sc->sc_rdmatag); 398fail_ctag: 399 bus_dma_tag_destroy(sc->sc_cdmatag); 400fail_ptag: 401 bus_dma_tag_destroy(sc->sc_pdmatag); 402fail_ifnet: 403 if_free(ifp); 404 return (error); 405} 406 407void 408hme_detach(struct hme_softc *sc) 409{ 410 struct ifnet *ifp = sc->sc_ifp; 411 int i; 412 413 HME_LOCK(sc); 414 hme_stop(sc); 415 HME_UNLOCK(sc); 416 callout_drain(&sc->sc_tick_ch); 417 ether_ifdetach(ifp); 418 if_free(ifp); 419 device_delete_child(sc->sc_dev, sc->sc_miibus); 420 421 for (i = 0; i < HME_NTXQ; i++) { 422 bus_dmamap_destroy(sc->sc_tdmatag, 423 sc->sc_rb.rb_txdesc[i].htx_dmamap); 424 } 425 bus_dmamap_destroy(sc->sc_rdmatag, sc->sc_rb.rb_spare_dmamap); 426 for (i = 0; i < HME_NRXDESC; i++) { 427 bus_dmamap_destroy(sc->sc_rdmatag, 428 sc->sc_rb.rb_rxdesc[i].hrx_dmamap); 429 } 430 bus_dmamap_sync(sc->sc_cdmatag, sc->sc_cdmamap, 431 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 432 bus_dmamap_unload(sc->sc_cdmatag, sc->sc_cdmamap); 433 bus_dmamem_free(sc->sc_cdmatag, sc->sc_rb.rb_membase, sc->sc_cdmamap); 434 bus_dma_tag_destroy(sc->sc_tdmatag); 435 bus_dma_tag_destroy(sc->sc_rdmatag); 436 bus_dma_tag_destroy(sc->sc_cdmatag); 437 bus_dma_tag_destroy(sc->sc_pdmatag); 438} 439 440void 441hme_suspend(struct hme_softc *sc) 442{ 443 444 HME_LOCK(sc); 445 hme_stop(sc); 446 HME_UNLOCK(sc); 447} 448 449void 450hme_resume(struct hme_softc *sc) 451{ 452 struct ifnet *ifp = sc->sc_ifp; 453 454 HME_LOCK(sc); 455 if ((ifp->if_flags & IFF_UP) != 0) 456 hme_init_locked(sc); 457 HME_UNLOCK(sc); 458} 459 460static void 461hme_cdma_callback(void *xsc, bus_dma_segment_t *segs, int nsegs, int error) 462{ 463 struct hme_softc *sc = (struct hme_softc *)xsc; 464 465 if (error != 0) 466 return; 467 KASSERT(nsegs == 1, 468 ("%s: too many DMA segments (%d)", __func__, nsegs)); 469 sc->sc_rb.rb_dmabase = segs[0].ds_addr; 470} 471 472static void 473hme_tick(void *arg) 474{ 475 struct hme_softc *sc = arg; 476 struct ifnet *ifp; 477 478 HME_LOCK_ASSERT(sc, MA_OWNED); 479 480 ifp = sc->sc_ifp; 481 /* 482 * Unload collision counters 483 */ 484 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 485 HME_MAC_READ_4(sc, HME_MACI_NCCNT) + 486 HME_MAC_READ_4(sc, HME_MACI_FCCNT) + 487 HME_MAC_READ_4(sc, HME_MACI_EXCNT) + 488 HME_MAC_READ_4(sc, HME_MACI_LTCNT)); 489 490 /* 491 * then clear the hardware counters. 492 */ 493 HME_MAC_WRITE_4(sc, HME_MACI_NCCNT, 0); 494 HME_MAC_WRITE_4(sc, HME_MACI_FCCNT, 0); 495 HME_MAC_WRITE_4(sc, HME_MACI_EXCNT, 0); 496 HME_MAC_WRITE_4(sc, HME_MACI_LTCNT, 0); 497 498 mii_tick(sc->sc_mii); 499 500 if (hme_watchdog(sc) == EJUSTRETURN) 501 return; 502 503 callout_reset(&sc->sc_tick_ch, hz, hme_tick, sc); 504} 505 506static void 507hme_stop(struct hme_softc *sc) 508{ 509 u_int32_t v; 510 int n; 511 512 callout_stop(&sc->sc_tick_ch); 513 sc->sc_wdog_timer = 0; 514 sc->sc_ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 515 sc->sc_flags &= ~HME_LINK; 516 517 /* Mask all interrupts */ 518 HME_SEB_WRITE_4(sc, HME_SEBI_IMASK, 0xffffffff); 519 520 /* Reset transmitter and receiver */ 521 HME_SEB_WRITE_4(sc, HME_SEBI_RESET, HME_SEB_RESET_ETX | 522 HME_SEB_RESET_ERX); 523 HME_SEB_BARRIER(sc, HME_SEBI_RESET, 4, 524 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); 525 for (n = 0; n < 20; n++) { 526 v = HME_SEB_READ_4(sc, HME_SEBI_RESET); 527 if ((v & (HME_SEB_RESET_ETX | HME_SEB_RESET_ERX)) == 0) 528 return; 529 DELAY(20); 530 } 531 532 device_printf(sc->sc_dev, "hme_stop: reset failed\n"); 533} 534 535/* 536 * Discard the contents of an mbuf in the RX ring, freeing the buffer in the 537 * ring for subsequent use. 538 */ 539static __inline void 540hme_discard_rxbuf(struct hme_softc *sc, int ix) 541{ 542 543 /* 544 * Dropped a packet, reinitialize the descriptor and turn the 545 * ownership back to the hardware. 546 */ 547 HME_XD_SETFLAGS(sc->sc_flags & HME_PCI, sc->sc_rb.rb_rxd, 548 ix, HME_XD_OWN | HME_XD_ENCODE_RSIZE(HME_DESC_RXLEN(sc, 549 &sc->sc_rb.rb_rxdesc[ix]))); 550} 551 552static int 553hme_add_rxbuf(struct hme_softc *sc, unsigned int ri, int keepold) 554{ 555 struct hme_rxdesc *rd; 556 struct mbuf *m; 557 bus_dma_segment_t segs[1]; 558 bus_dmamap_t map; 559 uintptr_t b; 560 int a, unmap, nsegs; 561 562 rd = &sc->sc_rb.rb_rxdesc[ri]; 563 unmap = rd->hrx_m != NULL; 564 if (unmap && keepold) { 565 /* 566 * Reinitialize the descriptor flags, as they may have been 567 * altered by the hardware. 568 */ 569 hme_discard_rxbuf(sc, ri); 570 return (0); 571 } 572 if ((m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR)) == NULL) 573 return (ENOBUFS); 574 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size; 575 b = mtod(m, uintptr_t); 576 /* 577 * Required alignment boundary. At least 16 is needed, but since 578 * the mapping must be done in a way that a burst can start on a 579 * natural boundary we might need to extend this. 580 */ 581 a = imax(HME_MINRXALIGN, sc->sc_burst); 582 /* 583 * Make sure the buffer suitably aligned. The 2 byte offset is removed 584 * when the mbuf is handed up. XXX: this ensures at least 16 byte 585 * alignment of the header adjacent to the ethernet header, which 586 * should be sufficient in all cases. Nevertheless, this second-guesses 587 * ALIGN(). 588 */ 589 m_adj(m, roundup2(b, a) - b); 590 if (bus_dmamap_load_mbuf_sg(sc->sc_rdmatag, sc->sc_rb.rb_spare_dmamap, 591 m, segs, &nsegs, 0) != 0) { 592 m_freem(m); 593 return (ENOBUFS); 594 } 595 /* If nsegs is wrong then the stack is corrupt. */ 596 KASSERT(nsegs == 1, 597 ("%s: too many DMA segments (%d)", __func__, nsegs)); 598 if (unmap) { 599 bus_dmamap_sync(sc->sc_rdmatag, rd->hrx_dmamap, 600 BUS_DMASYNC_POSTREAD); 601 bus_dmamap_unload(sc->sc_rdmatag, rd->hrx_dmamap); 602 } 603 map = rd->hrx_dmamap; 604 rd->hrx_dmamap = sc->sc_rb.rb_spare_dmamap; 605 sc->sc_rb.rb_spare_dmamap = map; 606 bus_dmamap_sync(sc->sc_rdmatag, rd->hrx_dmamap, BUS_DMASYNC_PREREAD); 607 HME_XD_SETADDR(sc->sc_flags & HME_PCI, sc->sc_rb.rb_rxd, ri, 608 segs[0].ds_addr); 609 rd->hrx_m = m; 610 HME_XD_SETFLAGS(sc->sc_flags & HME_PCI, sc->sc_rb.rb_rxd, ri, 611 HME_XD_OWN | HME_XD_ENCODE_RSIZE(HME_DESC_RXLEN(sc, rd))); 612 return (0); 613} 614 615static int 616hme_meminit(struct hme_softc *sc) 617{ 618 struct hme_ring *hr = &sc->sc_rb; 619 struct hme_txdesc *td; 620 bus_addr_t dma; 621 caddr_t p; 622 unsigned int i; 623 int error; 624 625 p = hr->rb_membase; 626 dma = hr->rb_dmabase; 627 628 /* 629 * Allocate transmit descriptors 630 */ 631 hr->rb_txd = p; 632 hr->rb_txddma = dma; 633 p += HME_NTXDESC * HME_XD_SIZE; 634 dma += HME_NTXDESC * HME_XD_SIZE; 635 /* 636 * We have reserved descriptor space until the next 2048 byte 637 * boundary. 638 */ 639 dma = (bus_addr_t)roundup((u_long)dma, 2048); 640 p = (caddr_t)roundup((u_long)p, 2048); 641 642 /* 643 * Allocate receive descriptors 644 */ 645 hr->rb_rxd = p; 646 hr->rb_rxddma = dma; 647 p += HME_NRXDESC * HME_XD_SIZE; 648 dma += HME_NRXDESC * HME_XD_SIZE; 649 /* Again move forward to the next 2048 byte boundary.*/ 650 dma = (bus_addr_t)roundup((u_long)dma, 2048); 651 p = (caddr_t)roundup((u_long)p, 2048); 652 653 /* 654 * Initialize transmit buffer descriptors 655 */ 656 for (i = 0; i < HME_NTXDESC; i++) { 657 HME_XD_SETADDR(sc->sc_flags & HME_PCI, hr->rb_txd, i, 0); 658 HME_XD_SETFLAGS(sc->sc_flags & HME_PCI, hr->rb_txd, i, 0); 659 } 660 661 STAILQ_INIT(&sc->sc_rb.rb_txfreeq); 662 STAILQ_INIT(&sc->sc_rb.rb_txbusyq); 663 for (i = 0; i < HME_NTXQ; i++) { 664 td = &sc->sc_rb.rb_txdesc[i]; 665 if (td->htx_m != NULL) { 666 bus_dmamap_sync(sc->sc_tdmatag, td->htx_dmamap, 667 BUS_DMASYNC_POSTWRITE); 668 bus_dmamap_unload(sc->sc_tdmatag, td->htx_dmamap); 669 m_freem(td->htx_m); 670 td->htx_m = NULL; 671 } 672 STAILQ_INSERT_TAIL(&sc->sc_rb.rb_txfreeq, td, htx_q); 673 } 674 675 /* 676 * Initialize receive buffer descriptors 677 */ 678 for (i = 0; i < HME_NRXDESC; i++) { 679 error = hme_add_rxbuf(sc, i, 1); 680 if (error != 0) 681 return (error); 682 } 683 684 bus_dmamap_sync(sc->sc_cdmatag, sc->sc_cdmamap, 685 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 686 687 hr->rb_tdhead = hr->rb_tdtail = 0; 688 hr->rb_td_nbusy = 0; 689 hr->rb_rdtail = 0; 690 CTR2(KTR_HME, "hme_meminit: tx ring va %p, pa %#lx", hr->rb_txd, 691 hr->rb_txddma); 692 CTR2(KTR_HME, "hme_meminit: rx ring va %p, pa %#lx", hr->rb_rxd, 693 hr->rb_rxddma); 694 CTR2(KTR_HME, "rx entry 1: flags %x, address %x", 695 *(u_int32_t *)hr->rb_rxd, *(u_int32_t *)(hr->rb_rxd + 4)); 696 CTR2(KTR_HME, "tx entry 1: flags %x, address %x", 697 *(u_int32_t *)hr->rb_txd, *(u_int32_t *)(hr->rb_txd + 4)); 698 return (0); 699} 700 701static int 702hme_mac_bitflip(struct hme_softc *sc, u_int32_t reg, u_int32_t val, 703 u_int32_t clr, u_int32_t set) 704{ 705 int i = 0; 706 707 val &= ~clr; 708 val |= set; 709 HME_MAC_WRITE_4(sc, reg, val); 710 HME_MAC_BARRIER(sc, reg, 4, 711 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); 712 if (clr == 0 && set == 0) 713 return (1); /* just write, no bits to wait for */ 714 do { 715 DELAY(100); 716 i++; 717 val = HME_MAC_READ_4(sc, reg); 718 if (i > 40) { 719 /* After 3.5ms, we should have been done. */ 720 device_printf(sc->sc_dev, "timeout while writing to " 721 "MAC configuration register\n"); 722 return (0); 723 } 724 } while ((val & clr) != 0 && (val & set) != set); 725 return (1); 726} 727 728/* 729 * Initialization of interface; set up initialization block 730 * and transmit/receive descriptor rings. 731 */ 732static void 733hme_init(void *xsc) 734{ 735 struct hme_softc *sc = (struct hme_softc *)xsc; 736 737 HME_LOCK(sc); 738 hme_init_locked(sc); 739 HME_UNLOCK(sc); 740} 741 742static void 743hme_init_locked(struct hme_softc *sc) 744{ 745 struct ifnet *ifp = sc->sc_ifp; 746 u_int8_t *ea; 747 u_int32_t n, v; 748 749 HME_LOCK_ASSERT(sc, MA_OWNED); 750 751 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) 752 return; 753 754 /* 755 * Initialization sequence. The numbered steps below correspond 756 * to the sequence outlined in section 6.3.5.1 in the Ethernet 757 * Channel Engine manual (part of the PCIO manual). 758 * See also the STP2002-STQ document from Sun Microsystems. 759 */ 760 761 /* step 1 & 2. Reset the Ethernet Channel */ 762 hme_stop(sc); 763 764 /* Re-initialize the MIF */ 765 hme_mifinit(sc); 766 767#if 0 768 /* Mask all MIF interrupts, just in case */ 769 HME_MIF_WRITE_4(sc, HME_MIFI_IMASK, 0xffff); 770#endif 771 772 /* step 3. Setup data structures in host memory */ 773 if (hme_meminit(sc) != 0) { 774 device_printf(sc->sc_dev, "out of buffers; init aborted."); 775 return; 776 } 777 778 /* step 4. TX MAC registers & counters */ 779 HME_MAC_WRITE_4(sc, HME_MACI_NCCNT, 0); 780 HME_MAC_WRITE_4(sc, HME_MACI_FCCNT, 0); 781 HME_MAC_WRITE_4(sc, HME_MACI_EXCNT, 0); 782 HME_MAC_WRITE_4(sc, HME_MACI_LTCNT, 0); 783 HME_MAC_WRITE_4(sc, HME_MACI_TXSIZE, HME_MAX_FRAMESIZE); 784 785 /* Load station MAC address */ 786 ea = IF_LLADDR(ifp); 787 HME_MAC_WRITE_4(sc, HME_MACI_MACADDR0, (ea[0] << 8) | ea[1]); 788 HME_MAC_WRITE_4(sc, HME_MACI_MACADDR1, (ea[2] << 8) | ea[3]); 789 HME_MAC_WRITE_4(sc, HME_MACI_MACADDR2, (ea[4] << 8) | ea[5]); 790 791 /* 792 * Init seed for backoff 793 * (source suggested by manual: low 10 bits of MAC address) 794 */ 795 v = ((ea[4] << 8) | ea[5]) & 0x3fff; 796 HME_MAC_WRITE_4(sc, HME_MACI_RANDSEED, v); 797 798 /* Note: Accepting power-on default for other MAC registers here.. */ 799 800 /* step 5. RX MAC registers & counters */ 801 hme_setladrf(sc, 0); 802 803 /* step 6 & 7. Program Descriptor Ring Base Addresses */ 804 HME_ETX_WRITE_4(sc, HME_ETXI_RING, sc->sc_rb.rb_txddma); 805 /* Transmit Descriptor ring size: in increments of 16 */ 806 HME_ETX_WRITE_4(sc, HME_ETXI_RSIZE, HME_NTXDESC / 16 - 1); 807 808 HME_ERX_WRITE_4(sc, HME_ERXI_RING, sc->sc_rb.rb_rxddma); 809 HME_MAC_WRITE_4(sc, HME_MACI_RXSIZE, HME_MAX_FRAMESIZE); 810 811 /* step 8. Global Configuration & Interrupt Mask */ 812 HME_SEB_WRITE_4(sc, HME_SEBI_IMASK, 813 ~(/*HME_SEB_STAT_GOTFRAME | HME_SEB_STAT_SENTFRAME |*/ 814 HME_SEB_STAT_HOSTTOTX | 815 HME_SEB_STAT_RXTOHOST | 816 HME_SEB_STAT_TXALL | 817 HME_SEB_STAT_TXPERR | 818 HME_SEB_STAT_RCNTEXP | 819 HME_SEB_STAT_ALL_ERRORS )); 820 821 switch (sc->sc_burst) { 822 default: 823 v = 0; 824 break; 825 case 16: 826 v = HME_SEB_CFG_BURST16; 827 break; 828 case 32: 829 v = HME_SEB_CFG_BURST32; 830 break; 831 case 64: 832 v = HME_SEB_CFG_BURST64; 833 break; 834 } 835 /* 836 * Blindly setting 64bit transfers may hang PCI cards(Cheerio?). 837 * Allowing 64bit transfers breaks TX checksum offload as well. 838 * Don't know this comes from hardware bug or driver's DMAing 839 * scheme. 840 * 841 * if (sc->sc_flags & HME_PCI == 0) 842 * v |= HME_SEB_CFG_64BIT; 843 */ 844 HME_SEB_WRITE_4(sc, HME_SEBI_CFG, v); 845 846 /* step 9. ETX Configuration: use mostly default values */ 847 848 /* Enable DMA */ 849 v = HME_ETX_READ_4(sc, HME_ETXI_CFG); 850 v |= HME_ETX_CFG_DMAENABLE; 851 HME_ETX_WRITE_4(sc, HME_ETXI_CFG, v); 852 853 /* step 10. ERX Configuration */ 854 v = HME_ERX_READ_4(sc, HME_ERXI_CFG); 855 856 /* Encode Receive Descriptor ring size: four possible values */ 857 v &= ~HME_ERX_CFG_RINGSIZEMSK; 858 switch (HME_NRXDESC) { 859 case 32: 860 v |= HME_ERX_CFG_RINGSIZE32; 861 break; 862 case 64: 863 v |= HME_ERX_CFG_RINGSIZE64; 864 break; 865 case 128: 866 v |= HME_ERX_CFG_RINGSIZE128; 867 break; 868 case 256: 869 v |= HME_ERX_CFG_RINGSIZE256; 870 break; 871 default: 872 printf("hme: invalid Receive Descriptor ring size\n"); 873 break; 874 } 875 876 /* Enable DMA, fix RX first byte offset. */ 877 v &= ~HME_ERX_CFG_FBO_MASK; 878 v |= HME_ERX_CFG_DMAENABLE | (HME_RXOFFS << HME_ERX_CFG_FBO_SHIFT); 879 /* RX TCP/UDP checksum offset */ 880 n = (ETHER_HDR_LEN + sizeof(struct ip)) / 2; 881 n = (n << HME_ERX_CFG_CSUMSTART_SHIFT) & HME_ERX_CFG_CSUMSTART_MASK; 882 v |= n; 883 CTR1(KTR_HME, "hme_init: programming ERX_CFG to %x", (u_int)v); 884 HME_ERX_WRITE_4(sc, HME_ERXI_CFG, v); 885 886 /* step 11. XIF Configuration */ 887 v = HME_MAC_READ_4(sc, HME_MACI_XIF); 888 v |= HME_MAC_XIF_OE; 889 CTR1(KTR_HME, "hme_init: programming XIF to %x", (u_int)v); 890 HME_MAC_WRITE_4(sc, HME_MACI_XIF, v); 891 892 /* step 12. RX_MAC Configuration Register */ 893 v = HME_MAC_READ_4(sc, HME_MACI_RXCFG); 894 v |= HME_MAC_RXCFG_ENABLE; 895 v &= ~(HME_MAC_RXCFG_DCRCS); 896 CTR1(KTR_HME, "hme_init: programming RX_MAC to %x", (u_int)v); 897 HME_MAC_WRITE_4(sc, HME_MACI_RXCFG, v); 898 899 /* step 13. TX_MAC Configuration Register */ 900 v = HME_MAC_READ_4(sc, HME_MACI_TXCFG); 901 v |= (HME_MAC_TXCFG_ENABLE | HME_MAC_TXCFG_DGIVEUP); 902 CTR1(KTR_HME, "hme_init: programming TX_MAC to %x", (u_int)v); 903 HME_MAC_WRITE_4(sc, HME_MACI_TXCFG, v); 904 905 /* step 14. Issue Transmit Pending command */ 906 907#ifdef HMEDEBUG 908 /* Debug: double-check. */ 909 CTR4(KTR_HME, "hme_init: tx ring %#x, rsz %#x, rx ring %#x, " 910 "rxsize %#x", HME_ETX_READ_4(sc, HME_ETXI_RING), 911 HME_ETX_READ_4(sc, HME_ETXI_RSIZE), 912 HME_ERX_READ_4(sc, HME_ERXI_RING), 913 HME_MAC_READ_4(sc, HME_MACI_RXSIZE)); 914 CTR3(KTR_HME, "hme_init: intr mask %#x, erx cfg %#x, etx cfg %#x", 915 HME_SEB_READ_4(sc, HME_SEBI_IMASK), 916 HME_ERX_READ_4(sc, HME_ERXI_CFG), 917 HME_ETX_READ_4(sc, HME_ETXI_CFG)); 918 CTR2(KTR_HME, "hme_init: mac rxcfg %#x, maci txcfg %#x", 919 HME_MAC_READ_4(sc, HME_MACI_RXCFG), 920 HME_MAC_READ_4(sc, HME_MACI_TXCFG)); 921#endif 922 923 ifp->if_drv_flags |= IFF_DRV_RUNNING; 924 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 925 926 /* Set the current media. */ 927 hme_mediachange_locked(sc); 928 929 /* Start the one second timer. */ 930 sc->sc_wdog_timer = 0; 931 callout_reset(&sc->sc_tick_ch, hz, hme_tick, sc); 932} 933 934/* 935 * Routine to DMA map an mbuf chain, set up the descriptor rings 936 * accordingly and start the transmission. 937 * Returns 0 on success, -1 if there were not enough free descriptors 938 * to map the packet, or an errno otherwise. 939 * 940 * XXX: this relies on the fact that segments returned by 941 * bus_dmamap_load_mbuf_sg() are readable from the nearest burst 942 * boundary on (i.e. potentially before ds_addr) to the first 943 * boundary beyond the end. This is usually a safe assumption to 944 * make, but is not documented. 945 */ 946static int 947hme_load_txmbuf(struct hme_softc *sc, struct mbuf **m0) 948{ 949 bus_dma_segment_t segs[HME_NTXSEGS]; 950 struct hme_txdesc *htx; 951 struct ip *ip; 952 struct mbuf *m; 953 caddr_t txd; 954 int error, i, nsegs, pci, ri, si; 955 uint32_t cflags, flags; 956 957 if ((htx = STAILQ_FIRST(&sc->sc_rb.rb_txfreeq)) == NULL) 958 return (ENOBUFS); 959 960 cflags = 0; 961 if (((*m0)->m_pkthdr.csum_flags & sc->sc_csum_features) != 0) { 962 if (M_WRITABLE(*m0) == 0) { 963 m = m_dup(*m0, M_NOWAIT); 964 m_freem(*m0); 965 *m0 = m; 966 if (m == NULL) 967 return (ENOBUFS); 968 } 969 i = sizeof(struct ether_header); 970 m = m_pullup(*m0, i + sizeof(struct ip)); 971 if (m == NULL) { 972 *m0 = NULL; 973 return (ENOBUFS); 974 } 975 ip = (struct ip *)(mtod(m, caddr_t) + i); 976 i += (ip->ip_hl << 2); 977 cflags = i << HME_XD_TXCKSUM_SSHIFT | 978 ((i + m->m_pkthdr.csum_data) << HME_XD_TXCKSUM_OSHIFT) | 979 HME_XD_TXCKSUM; 980 *m0 = m; 981 } 982 983 error = bus_dmamap_load_mbuf_sg(sc->sc_tdmatag, htx->htx_dmamap, 984 *m0, segs, &nsegs, 0); 985 if (error == EFBIG) { 986 m = m_collapse(*m0, M_NOWAIT, HME_NTXSEGS); 987 if (m == NULL) { 988 m_freem(*m0); 989 *m0 = NULL; 990 return (ENOMEM); 991 } 992 *m0 = m; 993 error = bus_dmamap_load_mbuf_sg(sc->sc_tdmatag, htx->htx_dmamap, 994 *m0, segs, &nsegs, 0); 995 if (error != 0) { 996 m_freem(*m0); 997 *m0 = NULL; 998 return (error); 999 } 1000 } else if (error != 0) 1001 return (error); 1002 /* If nsegs is wrong then the stack is corrupt. */ 1003 KASSERT(nsegs <= HME_NTXSEGS, 1004 ("%s: too many DMA segments (%d)", __func__, nsegs)); 1005 if (nsegs == 0) { 1006 m_freem(*m0); 1007 *m0 = NULL; 1008 return (EIO); 1009 } 1010 if (sc->sc_rb.rb_td_nbusy + nsegs >= HME_NTXDESC) { 1011 bus_dmamap_unload(sc->sc_tdmatag, htx->htx_dmamap); 1012 /* Retry with m_collapse(9)? */ 1013 return (ENOBUFS); 1014 } 1015 bus_dmamap_sync(sc->sc_tdmatag, htx->htx_dmamap, BUS_DMASYNC_PREWRITE); 1016 1017 si = ri = sc->sc_rb.rb_tdhead; 1018 txd = sc->sc_rb.rb_txd; 1019 pci = sc->sc_flags & HME_PCI; 1020 CTR2(KTR_HME, "hme_load_mbuf: next desc is %d (%#x)", ri, 1021 HME_XD_GETFLAGS(pci, txd, ri)); 1022 for (i = 0; i < nsegs; i++) { 1023 /* Fill the ring entry. */ 1024 flags = HME_XD_ENCODE_TSIZE(segs[i].ds_len); 1025 if (i == 0) 1026 flags |= HME_XD_SOP | cflags; 1027 else 1028 flags |= HME_XD_OWN | cflags; 1029 CTR3(KTR_HME, "hme_load_mbuf: activating ri %d, si %d (%#x)", 1030 ri, si, flags); 1031 HME_XD_SETADDR(pci, txd, ri, segs[i].ds_addr); 1032 HME_XD_SETFLAGS(pci, txd, ri, flags); 1033 sc->sc_rb.rb_td_nbusy++; 1034 htx->htx_lastdesc = ri; 1035 ri = (ri + 1) % HME_NTXDESC; 1036 } 1037 sc->sc_rb.rb_tdhead = ri; 1038 1039 /* set EOP on the last descriptor */ 1040 ri = (ri + HME_NTXDESC - 1) % HME_NTXDESC; 1041 flags = HME_XD_GETFLAGS(pci, txd, ri); 1042 flags |= HME_XD_EOP; 1043 CTR3(KTR_HME, "hme_load_mbuf: setting EOP ri %d, si %d (%#x)", ri, si, 1044 flags); 1045 HME_XD_SETFLAGS(pci, txd, ri, flags); 1046 1047 /* Turn the first descriptor ownership to the hme */ 1048 flags = HME_XD_GETFLAGS(pci, txd, si); 1049 flags |= HME_XD_OWN; 1050 CTR2(KTR_HME, "hme_load_mbuf: setting OWN for 1st desc ri %d, (%#x)", 1051 ri, flags); 1052 HME_XD_SETFLAGS(pci, txd, si, flags); 1053 1054 STAILQ_REMOVE_HEAD(&sc->sc_rb.rb_txfreeq, htx_q); 1055 STAILQ_INSERT_TAIL(&sc->sc_rb.rb_txbusyq, htx, htx_q); 1056 htx->htx_m = *m0; 1057 1058 /* start the transmission. */ 1059 HME_ETX_WRITE_4(sc, HME_ETXI_PENDING, HME_ETX_TP_DMAWAKEUP); 1060 1061 return (0); 1062} 1063 1064/* 1065 * Pass a packet to the higher levels. 1066 */ 1067static void 1068hme_read(struct hme_softc *sc, int ix, int len, u_int32_t flags) 1069{ 1070 struct ifnet *ifp = sc->sc_ifp; 1071 struct mbuf *m; 1072 1073 if (len <= sizeof(struct ether_header) || 1074 len > HME_MAX_FRAMESIZE) { 1075#ifdef HMEDEBUG 1076 HME_WHINE(sc->sc_dev, "invalid packet size %d; dropping\n", 1077 len); 1078#endif 1079 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); 1080 hme_discard_rxbuf(sc, ix); 1081 return; 1082 } 1083 1084 m = sc->sc_rb.rb_rxdesc[ix].hrx_m; 1085 CTR1(KTR_HME, "hme_read: len %d", len); 1086 1087 if (hme_add_rxbuf(sc, ix, 0) != 0) { 1088 /* 1089 * hme_add_rxbuf will leave the old buffer in the ring until 1090 * it is sure that a new buffer can be mapped. If it can not, 1091 * drop the packet, but leave the interface up. 1092 */ 1093 if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1); 1094 hme_discard_rxbuf(sc, ix); 1095 return; 1096 } 1097 1098 if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1); 1099 1100 m->m_pkthdr.rcvif = ifp; 1101 m->m_pkthdr.len = m->m_len = len + HME_RXOFFS; 1102 m_adj(m, HME_RXOFFS); 1103 /* RX TCP/UDP checksum */ 1104 if (ifp->if_capenable & IFCAP_RXCSUM) 1105 hme_rxcksum(m, flags); 1106 /* Pass the packet up. */ 1107 HME_UNLOCK(sc); 1108 (*ifp->if_input)(ifp, m); 1109 HME_LOCK(sc); 1110} 1111 1112static void 1113hme_start(struct ifnet *ifp) 1114{ 1115 struct hme_softc *sc = ifp->if_softc; 1116 1117 HME_LOCK(sc); 1118 hme_start_locked(ifp); 1119 HME_UNLOCK(sc); 1120} 1121 1122static void 1123hme_start_locked(struct ifnet *ifp) 1124{ 1125 struct hme_softc *sc = (struct hme_softc *)ifp->if_softc; 1126 struct mbuf *m; 1127 int error, enq = 0; 1128 1129 if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != 1130 IFF_DRV_RUNNING || (sc->sc_flags & HME_LINK) == 0) 1131 return; 1132 1133 for (; !IFQ_DRV_IS_EMPTY(&ifp->if_snd) && 1134 sc->sc_rb.rb_td_nbusy < HME_NTXDESC - 1;) { 1135 IFQ_DRV_DEQUEUE(&ifp->if_snd, m); 1136 if (m == NULL) 1137 break; 1138 1139 error = hme_load_txmbuf(sc, &m); 1140 if (error != 0) { 1141 if (m == NULL) 1142 break; 1143 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1144 IFQ_DRV_PREPEND(&ifp->if_snd, m); 1145 break; 1146 } 1147 enq++; 1148 BPF_MTAP(ifp, m); 1149 } 1150 1151 if (enq > 0) { 1152 bus_dmamap_sync(sc->sc_cdmatag, sc->sc_cdmamap, 1153 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1154 sc->sc_wdog_timer = 5; 1155 } 1156} 1157 1158/* 1159 * Transmit interrupt. 1160 */ 1161static void 1162hme_tint(struct hme_softc *sc) 1163{ 1164 caddr_t txd; 1165 struct ifnet *ifp = sc->sc_ifp; 1166 struct hme_txdesc *htx; 1167 unsigned int ri, txflags; 1168 1169 txd = sc->sc_rb.rb_txd; 1170 htx = STAILQ_FIRST(&sc->sc_rb.rb_txbusyq); 1171 bus_dmamap_sync(sc->sc_cdmatag, sc->sc_cdmamap, BUS_DMASYNC_POSTREAD); 1172 /* Fetch current position in the transmit ring */ 1173 for (ri = sc->sc_rb.rb_tdtail;; ri = (ri + 1) % HME_NTXDESC) { 1174 if (sc->sc_rb.rb_td_nbusy <= 0) { 1175 CTR0(KTR_HME, "hme_tint: not busy!"); 1176 break; 1177 } 1178 1179 txflags = HME_XD_GETFLAGS(sc->sc_flags & HME_PCI, txd, ri); 1180 CTR2(KTR_HME, "hme_tint: index %d, flags %#x", ri, txflags); 1181 1182 if ((txflags & HME_XD_OWN) != 0) 1183 break; 1184 1185 CTR0(KTR_HME, "hme_tint: not owned"); 1186 --sc->sc_rb.rb_td_nbusy; 1187 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 1188 1189 /* Complete packet transmitted? */ 1190 if ((txflags & HME_XD_EOP) == 0) 1191 continue; 1192 1193 KASSERT(htx->htx_lastdesc == ri, 1194 ("%s: ring indices skewed: %d != %d!", 1195 __func__, htx->htx_lastdesc, ri)); 1196 bus_dmamap_sync(sc->sc_tdmatag, htx->htx_dmamap, 1197 BUS_DMASYNC_POSTWRITE); 1198 bus_dmamap_unload(sc->sc_tdmatag, htx->htx_dmamap); 1199 1200 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1); 1201 m_freem(htx->htx_m); 1202 htx->htx_m = NULL; 1203 STAILQ_REMOVE_HEAD(&sc->sc_rb.rb_txbusyq, htx_q); 1204 STAILQ_INSERT_TAIL(&sc->sc_rb.rb_txfreeq, htx, htx_q); 1205 htx = STAILQ_FIRST(&sc->sc_rb.rb_txbusyq); 1206 } 1207 sc->sc_wdog_timer = sc->sc_rb.rb_td_nbusy > 0 ? 5 : 0; 1208 1209 /* Update ring */ 1210 sc->sc_rb.rb_tdtail = ri; 1211 1212 hme_start_locked(ifp); 1213} 1214 1215/* 1216 * RX TCP/UDP checksum 1217 */ 1218static void 1219hme_rxcksum(struct mbuf *m, u_int32_t flags) 1220{ 1221 struct ether_header *eh; 1222 struct ip *ip; 1223 struct udphdr *uh; 1224 int32_t hlen, len, pktlen; 1225 u_int16_t cksum, *opts; 1226 u_int32_t temp32; 1227 1228 pktlen = m->m_pkthdr.len; 1229 if (pktlen < sizeof(struct ether_header) + sizeof(struct ip)) 1230 return; 1231 eh = mtod(m, struct ether_header *); 1232 if (eh->ether_type != htons(ETHERTYPE_IP)) 1233 return; 1234 ip = (struct ip *)(eh + 1); 1235 if (ip->ip_v != IPVERSION) 1236 return; 1237 1238 hlen = ip->ip_hl << 2; 1239 pktlen -= sizeof(struct ether_header); 1240 if (hlen < sizeof(struct ip)) 1241 return; 1242 if (ntohs(ip->ip_len) < hlen) 1243 return; 1244 if (ntohs(ip->ip_len) != pktlen) 1245 return; 1246 if (ip->ip_off & htons(IP_MF | IP_OFFMASK)) 1247 return; /* can't handle fragmented packet */ 1248 1249 switch (ip->ip_p) { 1250 case IPPROTO_TCP: 1251 if (pktlen < (hlen + sizeof(struct tcphdr))) 1252 return; 1253 break; 1254 case IPPROTO_UDP: 1255 if (pktlen < (hlen + sizeof(struct udphdr))) 1256 return; 1257 uh = (struct udphdr *)((caddr_t)ip + hlen); 1258 if (uh->uh_sum == 0) 1259 return; /* no checksum */ 1260 break; 1261 default: 1262 return; 1263 } 1264 1265 cksum = ~(flags & HME_XD_RXCKSUM); 1266 /* checksum fixup for IP options */ 1267 len = hlen - sizeof(struct ip); 1268 if (len > 0) { 1269 opts = (u_int16_t *)(ip + 1); 1270 for (; len > 0; len -= sizeof(u_int16_t), opts++) { 1271 temp32 = cksum - *opts; 1272 temp32 = (temp32 >> 16) + (temp32 & 65535); 1273 cksum = temp32 & 65535; 1274 } 1275 } 1276 m->m_pkthdr.csum_flags |= CSUM_DATA_VALID; 1277 m->m_pkthdr.csum_data = cksum; 1278} 1279 1280/* 1281 * Receive interrupt. 1282 */ 1283static void 1284hme_rint(struct hme_softc *sc) 1285{ 1286 caddr_t xdr = sc->sc_rb.rb_rxd; 1287 struct ifnet *ifp = sc->sc_ifp; 1288 unsigned int ri, len; 1289 int progress = 0; 1290 u_int32_t flags; 1291 1292 /* 1293 * Process all buffers with valid data. 1294 */ 1295 bus_dmamap_sync(sc->sc_cdmatag, sc->sc_cdmamap, BUS_DMASYNC_POSTREAD); 1296 for (ri = sc->sc_rb.rb_rdtail;; ri = (ri + 1) % HME_NRXDESC) { 1297 flags = HME_XD_GETFLAGS(sc->sc_flags & HME_PCI, xdr, ri); 1298 CTR2(KTR_HME, "hme_rint: index %d, flags %#x", ri, flags); 1299 if ((flags & HME_XD_OWN) != 0) 1300 break; 1301 1302 progress++; 1303 if ((flags & HME_XD_OFL) != 0) { 1304 device_printf(sc->sc_dev, "buffer overflow, ri=%d; " 1305 "flags=0x%x\n", ri, flags); 1306 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); 1307 hme_discard_rxbuf(sc, ri); 1308 } else { 1309 len = HME_XD_DECODE_RSIZE(flags); 1310 hme_read(sc, ri, len, flags); 1311 } 1312 } 1313 if (progress) { 1314 bus_dmamap_sync(sc->sc_cdmatag, sc->sc_cdmamap, 1315 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1316 } 1317 sc->sc_rb.rb_rdtail = ri; 1318} 1319 1320static void 1321hme_eint(struct hme_softc *sc, u_int status) 1322{ 1323 1324 if ((status & HME_SEB_STAT_MIFIRQ) != 0) { 1325 device_printf(sc->sc_dev, "XXXlink status changed: " 1326 "cfg=%#x, stat=%#x, sm=%#x\n", 1327 HME_MIF_READ_4(sc, HME_MIFI_CFG), 1328 HME_MIF_READ_4(sc, HME_MIFI_STAT), 1329 HME_MIF_READ_4(sc, HME_MIFI_SM)); 1330 return; 1331 } 1332 1333 /* check for fatal errors that needs reset to unfreeze DMA engine */ 1334 if ((status & HME_SEB_STAT_FATAL_ERRORS) != 0) { 1335 HME_WHINE(sc->sc_dev, "error signaled, status=%#x\n", status); 1336 sc->sc_ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 1337 hme_init_locked(sc); 1338 } 1339} 1340 1341void 1342hme_intr(void *v) 1343{ 1344 struct hme_softc *sc = (struct hme_softc *)v; 1345 u_int32_t status; 1346 1347 HME_LOCK(sc); 1348 status = HME_SEB_READ_4(sc, HME_SEBI_STAT); 1349 CTR1(KTR_HME, "hme_intr: status %#x", (u_int)status); 1350 1351 if ((status & HME_SEB_STAT_ALL_ERRORS) != 0) 1352 hme_eint(sc, status); 1353 1354 if ((status & HME_SEB_STAT_RXTOHOST) != 0) 1355 hme_rint(sc); 1356 1357 if ((status & (HME_SEB_STAT_TXALL | HME_SEB_STAT_HOSTTOTX)) != 0) 1358 hme_tint(sc); 1359 HME_UNLOCK(sc); 1360} 1361 1362static int 1363hme_watchdog(struct hme_softc *sc) 1364{ 1365 struct ifnet *ifp = sc->sc_ifp; 1366 1367 HME_LOCK_ASSERT(sc, MA_OWNED); 1368 1369#ifdef HMEDEBUG 1370 CTR1(KTR_HME, "hme_watchdog: status %x", 1371 (u_int)HME_SEB_READ_4(sc, HME_SEBI_STAT)); 1372#endif 1373 1374 if (sc->sc_wdog_timer == 0 || --sc->sc_wdog_timer != 0) 1375 return (0); 1376 1377 if ((sc->sc_flags & HME_LINK) != 0) 1378 device_printf(sc->sc_dev, "device timeout\n"); 1379 else if (bootverbose) 1380 device_printf(sc->sc_dev, "device timeout (no link)\n"); 1381 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); 1382 1383 ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 1384 hme_init_locked(sc); 1385 hme_start_locked(ifp); 1386 return (EJUSTRETURN); 1387} 1388 1389/* 1390 * Initialize the MII Management Interface 1391 */ 1392static void 1393hme_mifinit(struct hme_softc *sc) 1394{ 1395 u_int32_t v; 1396 1397 /* 1398 * Configure the MIF in frame mode, polling disabled, internal PHY 1399 * selected. 1400 */ 1401 HME_MIF_WRITE_4(sc, HME_MIFI_CFG, 0); 1402 1403 /* 1404 * If the currently selected media uses the external transceiver, 1405 * enable its MII drivers (which basically isolates the internal 1406 * one and vice versa). In case the current media hasn't been set, 1407 * yet, we default to the internal transceiver. 1408 */ 1409 v = HME_MAC_READ_4(sc, HME_MACI_XIF); 1410 if (sc->sc_mii != NULL && sc->sc_mii->mii_media.ifm_cur != NULL && 1411 sc->sc_phys[IFM_INST(sc->sc_mii->mii_media.ifm_cur->ifm_media)] == 1412 HME_PHYAD_EXTERNAL) 1413 v |= HME_MAC_XIF_MIIENABLE; 1414 else 1415 v &= ~HME_MAC_XIF_MIIENABLE; 1416 HME_MAC_WRITE_4(sc, HME_MACI_XIF, v); 1417} 1418 1419/* 1420 * MII interface 1421 */ 1422int 1423hme_mii_readreg(device_t dev, int phy, int reg) 1424{ 1425 struct hme_softc *sc; 1426 int n; 1427 u_int32_t v; 1428 1429 sc = device_get_softc(dev); 1430 /* Select the desired PHY in the MIF configuration register */ 1431 v = HME_MIF_READ_4(sc, HME_MIFI_CFG); 1432 if (phy == HME_PHYAD_EXTERNAL) 1433 v |= HME_MIF_CFG_PHY; 1434 else 1435 v &= ~HME_MIF_CFG_PHY; 1436 HME_MIF_WRITE_4(sc, HME_MIFI_CFG, v); 1437 1438 /* Construct the frame command */ 1439 v = (MII_COMMAND_START << HME_MIF_FO_ST_SHIFT) | 1440 HME_MIF_FO_TAMSB | 1441 (MII_COMMAND_READ << HME_MIF_FO_OPC_SHIFT) | 1442 (phy << HME_MIF_FO_PHYAD_SHIFT) | 1443 (reg << HME_MIF_FO_REGAD_SHIFT); 1444 1445 HME_MIF_WRITE_4(sc, HME_MIFI_FO, v); 1446 HME_MIF_BARRIER(sc, HME_MIFI_FO, 4, 1447 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); 1448 for (n = 0; n < 100; n++) { 1449 DELAY(1); 1450 v = HME_MIF_READ_4(sc, HME_MIFI_FO); 1451 if (v & HME_MIF_FO_TALSB) 1452 return (v & HME_MIF_FO_DATA); 1453 } 1454 1455 device_printf(sc->sc_dev, "mii_read timeout\n"); 1456 return (0); 1457} 1458 1459int 1460hme_mii_writereg(device_t dev, int phy, int reg, int val) 1461{ 1462 struct hme_softc *sc; 1463 int n; 1464 u_int32_t v; 1465 1466 sc = device_get_softc(dev); 1467 /* Select the desired PHY in the MIF configuration register */ 1468 v = HME_MIF_READ_4(sc, HME_MIFI_CFG); 1469 if (phy == HME_PHYAD_EXTERNAL) 1470 v |= HME_MIF_CFG_PHY; 1471 else 1472 v &= ~HME_MIF_CFG_PHY; 1473 HME_MIF_WRITE_4(sc, HME_MIFI_CFG, v); 1474 1475 /* Construct the frame command */ 1476 v = (MII_COMMAND_START << HME_MIF_FO_ST_SHIFT) | 1477 HME_MIF_FO_TAMSB | 1478 (MII_COMMAND_WRITE << HME_MIF_FO_OPC_SHIFT) | 1479 (phy << HME_MIF_FO_PHYAD_SHIFT) | 1480 (reg << HME_MIF_FO_REGAD_SHIFT) | 1481 (val & HME_MIF_FO_DATA); 1482 1483 HME_MIF_WRITE_4(sc, HME_MIFI_FO, v); 1484 HME_MIF_BARRIER(sc, HME_MIFI_FO, 4, 1485 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); 1486 for (n = 0; n < 100; n++) { 1487 DELAY(1); 1488 v = HME_MIF_READ_4(sc, HME_MIFI_FO); 1489 if (v & HME_MIF_FO_TALSB) 1490 return (1); 1491 } 1492 1493 device_printf(sc->sc_dev, "mii_write timeout\n"); 1494 return (0); 1495} 1496 1497void 1498hme_mii_statchg(device_t dev) 1499{ 1500 struct hme_softc *sc; 1501 uint32_t rxcfg, txcfg; 1502 1503 sc = device_get_softc(dev); 1504 1505#ifdef HMEDEBUG 1506 if ((sc->sc_ifp->if_flags & IFF_DEBUG) != 0) 1507 device_printf(sc->sc_dev, "hme_mii_statchg: status change\n"); 1508#endif 1509 1510 if ((sc->sc_mii->mii_media_status & IFM_ACTIVE) != 0 && 1511 IFM_SUBTYPE(sc->sc_mii->mii_media_active) != IFM_NONE) 1512 sc->sc_flags |= HME_LINK; 1513 else 1514 sc->sc_flags &= ~HME_LINK; 1515 1516 txcfg = HME_MAC_READ_4(sc, HME_MACI_TXCFG); 1517 if (!hme_mac_bitflip(sc, HME_MACI_TXCFG, txcfg, 1518 HME_MAC_TXCFG_ENABLE, 0)) 1519 device_printf(sc->sc_dev, "cannot disable TX MAC\n"); 1520 rxcfg = HME_MAC_READ_4(sc, HME_MACI_RXCFG); 1521 if (!hme_mac_bitflip(sc, HME_MACI_RXCFG, rxcfg, 1522 HME_MAC_RXCFG_ENABLE, 0)) 1523 device_printf(sc->sc_dev, "cannot disable RX MAC\n"); 1524 1525 /* Set the MAC Full Duplex bit appropriately. */ 1526 if ((IFM_OPTIONS(sc->sc_mii->mii_media_active) & IFM_FDX) != 0) 1527 txcfg |= HME_MAC_TXCFG_FULLDPLX; 1528 else 1529 txcfg &= ~HME_MAC_TXCFG_FULLDPLX; 1530 HME_MAC_WRITE_4(sc, HME_MACI_TXCFG, txcfg); 1531 1532 if ((sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 && 1533 (sc->sc_flags & HME_LINK) != 0) { 1534 if (!hme_mac_bitflip(sc, HME_MACI_TXCFG, txcfg, 0, 1535 HME_MAC_TXCFG_ENABLE)) 1536 device_printf(sc->sc_dev, "cannot enable TX MAC\n"); 1537 if (!hme_mac_bitflip(sc, HME_MACI_RXCFG, rxcfg, 0, 1538 HME_MAC_RXCFG_ENABLE)) 1539 device_printf(sc->sc_dev, "cannot enable RX MAC\n"); 1540 } 1541} 1542 1543static int 1544hme_mediachange(struct ifnet *ifp) 1545{ 1546 struct hme_softc *sc = ifp->if_softc; 1547 int error; 1548 1549 HME_LOCK(sc); 1550 error = hme_mediachange_locked(sc); 1551 HME_UNLOCK(sc); 1552 return (error); 1553} 1554 1555static int 1556hme_mediachange_locked(struct hme_softc *sc) 1557{ 1558 struct mii_softc *child; 1559 1560 HME_LOCK_ASSERT(sc, MA_OWNED); 1561 1562#ifdef HMEDEBUG 1563 if ((sc->sc_ifp->if_flags & IFF_DEBUG) != 0) 1564 device_printf(sc->sc_dev, "hme_mediachange_locked"); 1565#endif 1566 1567 hme_mifinit(sc); 1568 1569 /* 1570 * If both PHYs are present reset them. This is required for 1571 * unisolating the previously isolated PHY when switching PHYs. 1572 * As the above hme_mifinit() call will set the MII drivers in 1573 * the XIF configuration register according to the currently 1574 * selected media, there should be no window during which the 1575 * data paths of both transceivers are open at the same time, 1576 * even if the PHY device drivers use MIIF_NOISOLATE. 1577 */ 1578 if (sc->sc_phys[0] != -1 && sc->sc_phys[1] != -1) 1579 LIST_FOREACH(child, &sc->sc_mii->mii_phys, mii_list) 1580 PHY_RESET(child); 1581 return (mii_mediachg(sc->sc_mii)); 1582} 1583 1584static void 1585hme_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 1586{ 1587 struct hme_softc *sc = ifp->if_softc; 1588 1589 HME_LOCK(sc); 1590 if ((ifp->if_flags & IFF_UP) == 0) { 1591 HME_UNLOCK(sc); 1592 return; 1593 } 1594 1595 mii_pollstat(sc->sc_mii); 1596 ifmr->ifm_active = sc->sc_mii->mii_media_active; 1597 ifmr->ifm_status = sc->sc_mii->mii_media_status; 1598 HME_UNLOCK(sc); 1599} 1600 1601/* 1602 * Process an ioctl request. 1603 */ 1604static int 1605hme_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 1606{ 1607 struct hme_softc *sc = ifp->if_softc; 1608 struct ifreq *ifr = (struct ifreq *)data; 1609 int error = 0; 1610 1611 switch (cmd) { 1612 case SIOCSIFFLAGS: 1613 HME_LOCK(sc); 1614 if ((ifp->if_flags & IFF_UP) != 0) { 1615 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 && 1616 ((ifp->if_flags ^ sc->sc_ifflags) & 1617 (IFF_ALLMULTI | IFF_PROMISC)) != 0) 1618 hme_setladrf(sc, 1); 1619 else 1620 hme_init_locked(sc); 1621 } else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) 1622 hme_stop(sc); 1623 if ((ifp->if_flags & IFF_LINK0) != 0) 1624 sc->sc_csum_features |= CSUM_UDP; 1625 else 1626 sc->sc_csum_features &= ~CSUM_UDP; 1627 if ((ifp->if_capenable & IFCAP_TXCSUM) != 0) 1628 ifp->if_hwassist = sc->sc_csum_features; 1629 sc->sc_ifflags = ifp->if_flags; 1630 HME_UNLOCK(sc); 1631 break; 1632 1633 case SIOCADDMULTI: 1634 case SIOCDELMULTI: 1635 HME_LOCK(sc); 1636 hme_setladrf(sc, 1); 1637 HME_UNLOCK(sc); 1638 error = 0; 1639 break; 1640 case SIOCGIFMEDIA: 1641 case SIOCSIFMEDIA: 1642 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii->mii_media, cmd); 1643 break; 1644 case SIOCSIFCAP: 1645 HME_LOCK(sc); 1646 ifp->if_capenable = ifr->ifr_reqcap; 1647 if ((ifp->if_capenable & IFCAP_TXCSUM) != 0) 1648 ifp->if_hwassist = sc->sc_csum_features; 1649 else 1650 ifp->if_hwassist = 0; 1651 HME_UNLOCK(sc); 1652 break; 1653 default: 1654 error = ether_ioctl(ifp, cmd, data); 1655 break; 1656 } 1657 1658 return (error); 1659} 1660 1661/* 1662 * Set up the logical address filter. 1663 */ 1664static void 1665hme_setladrf(struct hme_softc *sc, int reenable) 1666{ 1667 struct ifnet *ifp = sc->sc_ifp; 1668 struct ifmultiaddr *inm; 1669 u_int32_t crc; 1670 u_int32_t hash[4]; 1671 u_int32_t macc; 1672 1673 HME_LOCK_ASSERT(sc, MA_OWNED); 1674 /* Clear the hash table. */ 1675 hash[3] = hash[2] = hash[1] = hash[0] = 0; 1676 1677 /* Get the current RX configuration. */ 1678 macc = HME_MAC_READ_4(sc, HME_MACI_RXCFG); 1679 1680 /* 1681 * Turn off promiscuous mode, promiscuous group mode (all multicast), 1682 * and hash filter. Depending on the case, the right bit will be 1683 * enabled. 1684 */ 1685 macc &= ~(HME_MAC_RXCFG_PGRP | HME_MAC_RXCFG_PMISC); 1686 1687 /* 1688 * Disable the receiver while changing it's state as the documentation 1689 * mandates. 1690 * We then must wait until the bit clears in the register. This should 1691 * take at most 3.5ms. 1692 */ 1693 if (!hme_mac_bitflip(sc, HME_MACI_RXCFG, macc, 1694 HME_MAC_RXCFG_ENABLE, 0)) 1695 device_printf(sc->sc_dev, "cannot disable RX MAC\n"); 1696 /* Disable the hash filter before writing to the filter registers. */ 1697 if (!hme_mac_bitflip(sc, HME_MACI_RXCFG, macc, 1698 HME_MAC_RXCFG_HENABLE, 0)) 1699 device_printf(sc->sc_dev, "cannot disable hash filter\n"); 1700 1701 /* Make the RX MAC really SIMPLEX. */ 1702 macc |= HME_MAC_RXCFG_ME; 1703 if (reenable) 1704 macc |= HME_MAC_RXCFG_ENABLE; 1705 else 1706 macc &= ~HME_MAC_RXCFG_ENABLE; 1707 1708 if ((ifp->if_flags & IFF_PROMISC) != 0) { 1709 macc |= HME_MAC_RXCFG_PMISC; 1710 goto chipit; 1711 } 1712 if ((ifp->if_flags & IFF_ALLMULTI) != 0) { 1713 macc |= HME_MAC_RXCFG_PGRP; 1714 goto chipit; 1715 } 1716 1717 macc |= HME_MAC_RXCFG_HENABLE; 1718 1719 /* 1720 * Set up multicast address filter by passing all multicast addresses 1721 * through a crc generator, and then using the high order 6 bits as an 1722 * index into the 64 bit logical address filter. The high order bit 1723 * selects the word, while the rest of the bits select the bit within 1724 * the word. 1725 */ 1726 1727 if_maddr_rlock(ifp); 1728 CK_STAILQ_FOREACH(inm, &ifp->if_multiaddrs, ifma_link) { 1729 if (inm->ifma_addr->sa_family != AF_LINK) 1730 continue; 1731 crc = ether_crc32_le(LLADDR((struct sockaddr_dl *) 1732 inm->ifma_addr), ETHER_ADDR_LEN); 1733 1734 /* Just want the 6 most significant bits. */ 1735 crc >>= 26; 1736 1737 /* Set the corresponding bit in the filter. */ 1738 hash[crc >> 4] |= 1 << (crc & 0xf); 1739 } 1740 if_maddr_runlock(ifp); 1741 1742chipit: 1743 /* Now load the hash table into the chip */ 1744 HME_MAC_WRITE_4(sc, HME_MACI_HASHTAB0, hash[0]); 1745 HME_MAC_WRITE_4(sc, HME_MACI_HASHTAB1, hash[1]); 1746 HME_MAC_WRITE_4(sc, HME_MACI_HASHTAB2, hash[2]); 1747 HME_MAC_WRITE_4(sc, HME_MACI_HASHTAB3, hash[3]); 1748 if (!hme_mac_bitflip(sc, HME_MACI_RXCFG, macc, 0, 1749 macc & (HME_MAC_RXCFG_ENABLE | HME_MAC_RXCFG_HENABLE | 1750 HME_MAC_RXCFG_ME))) 1751 device_printf(sc->sc_dev, "cannot configure RX MAC\n"); 1752} 1753