1 1.59 andvar /* $NetBSD: if_emac.c,v 1.59 2024/02/10 09:30:05 andvar Exp $ */ 2 1.1 simonb 3 1.1 simonb /* 4 1.3 simonb * Copyright 2001, 2002 Wasabi Systems, Inc. 5 1.1 simonb * All rights reserved. 6 1.1 simonb * 7 1.3 simonb * Written by Simon Burge and Jason Thorpe for Wasabi Systems, Inc. 8 1.1 simonb * 9 1.1 simonb * Redistribution and use in source and binary forms, with or without 10 1.1 simonb * modification, are permitted provided that the following conditions 11 1.1 simonb * are met: 12 1.1 simonb * 1. Redistributions of source code must retain the above copyright 13 1.1 simonb * notice, this list of conditions and the following disclaimer. 14 1.1 simonb * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 simonb * notice, this list of conditions and the following disclaimer in the 16 1.1 simonb * documentation and/or other materials provided with the distribution. 17 1.1 simonb * 3. All advertising materials mentioning features or use of this software 18 1.1 simonb * must display the following acknowledgement: 19 1.1 simonb * This product includes software developed for the NetBSD Project by 20 1.1 simonb * Wasabi Systems, Inc. 21 1.1 simonb * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22 1.1 simonb * or promote products derived from this software without specific prior 23 1.1 simonb * written permission. 24 1.1 simonb * 25 1.1 simonb * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26 1.1 simonb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27 1.1 simonb * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 1.1 simonb * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29 1.1 simonb * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 1.1 simonb * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 1.1 simonb * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 1.1 simonb * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 1.1 simonb * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 1.1 simonb * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 1.1 simonb * POSSIBILITY OF SUCH DAMAGE. 36 1.1 simonb */ 37 1.15 lukem 38 1.36 kiyohara /* 39 1.36 kiyohara * emac(4) supports following ibm4xx's EMACs. 40 1.36 kiyohara * XXXX: ZMII and 'TCP Accelaration Hardware' not support yet... 41 1.36 kiyohara * 42 1.36 kiyohara * tested 43 1.36 kiyohara * ------ 44 1.36 kiyohara * 405EP - 10/100 x2 45 1.36 kiyohara * 405EX/EXr o 10/100/1000 x2 (EXr x1), STA v2, 256bit hash-Table, RGMII 46 1.36 kiyohara * 405GP/GPr o 10/100 47 1.36 kiyohara * 440EP - 10/100 x2, ZMII 48 1.36 kiyohara * 440GP - 10/100 x2, ZMII 49 1.36 kiyohara * 440GX - 10/100/1000 x4, ZMII/RGMII(ch 2, 3), TAH(ch 2, 3) 50 1.36 kiyohara * 440SP - 10/100/1000 51 1.36 kiyohara * 440SPe - 10/100/1000, STA v2 52 1.36 kiyohara */ 53 1.36 kiyohara 54 1.15 lukem #include <sys/cdefs.h> 55 1.59 andvar __KERNEL_RCSID(0, "$NetBSD: if_emac.c,v 1.59 2024/02/10 09:30:05 andvar Exp $"); 56 1.1 simonb 57 1.53 rin #ifdef _KERNEL_OPT 58 1.36 kiyohara #include "opt_emac.h" 59 1.53 rin #endif 60 1.1 simonb 61 1.1 simonb #include <sys/param.h> 62 1.1 simonb #include <sys/systm.h> 63 1.1 simonb #include <sys/mbuf.h> 64 1.1 simonb #include <sys/kernel.h> 65 1.1 simonb #include <sys/socket.h> 66 1.1 simonb #include <sys/ioctl.h> 67 1.39 matt #include <sys/cpu.h> 68 1.39 matt #include <sys/device.h> 69 1.1 simonb 70 1.54 rin #include <sys/rndsource.h> 71 1.54 rin 72 1.3 simonb #include <uvm/uvm_extern.h> /* for PAGE_SIZE */ 73 1.1 simonb 74 1.1 simonb #include <net/if.h> 75 1.1 simonb #include <net/if_dl.h> 76 1.1 simonb #include <net/if_media.h> 77 1.1 simonb #include <net/if_ether.h> 78 1.1 simonb 79 1.1 simonb #include <net/bpf.h> 80 1.1 simonb 81 1.39 matt #include <powerpc/ibm4xx/cpu.h> 82 1.36 kiyohara #include <powerpc/ibm4xx/dcr4xx.h> 83 1.3 simonb #include <powerpc/ibm4xx/mal405gp.h> 84 1.7 simonb #include <powerpc/ibm4xx/dev/emacreg.h> 85 1.3 simonb #include <powerpc/ibm4xx/dev/if_emacreg.h> 86 1.36 kiyohara #include <powerpc/ibm4xx/dev/if_emacvar.h> 87 1.36 kiyohara #include <powerpc/ibm4xx/dev/malvar.h> 88 1.36 kiyohara #include <powerpc/ibm4xx/dev/opbreg.h> 89 1.36 kiyohara #include <powerpc/ibm4xx/dev/opbvar.h> 90 1.36 kiyohara #include <powerpc/ibm4xx/dev/plbvar.h> 91 1.36 kiyohara #if defined(EMAC_ZMII_PHY) || defined(EMAC_RGMII_PHY) 92 1.36 kiyohara #include <powerpc/ibm4xx/dev/rmiivar.h> 93 1.36 kiyohara #endif 94 1.1 simonb 95 1.1 simonb #include <dev/mii/miivar.h> 96 1.1 simonb 97 1.36 kiyohara #include "locators.h" 98 1.36 kiyohara 99 1.36 kiyohara 100 1.3 simonb /* 101 1.3 simonb * Transmit descriptor list size. There are two Tx channels, each with 102 1.3 simonb * up to 256 hardware descriptors available. We currently use one Tx 103 1.3 simonb * channel. We tell the upper layers that they can queue a lot of 104 1.3 simonb * packets, and we go ahead and manage up to 64 of them at a time. We 105 1.3 simonb * allow up to 16 DMA segments per packet. 106 1.3 simonb */ 107 1.3 simonb #define EMAC_NTXSEGS 16 108 1.3 simonb #define EMAC_TXQUEUELEN 64 109 1.3 simonb #define EMAC_TXQUEUELEN_MASK (EMAC_TXQUEUELEN - 1) 110 1.3 simonb #define EMAC_TXQUEUE_GC (EMAC_TXQUEUELEN / 4) 111 1.3 simonb #define EMAC_NTXDESC 256 112 1.3 simonb #define EMAC_NTXDESC_MASK (EMAC_NTXDESC - 1) 113 1.3 simonb #define EMAC_NEXTTX(x) (((x) + 1) & EMAC_NTXDESC_MASK) 114 1.3 simonb #define EMAC_NEXTTXS(x) (((x) + 1) & EMAC_TXQUEUELEN_MASK) 115 1.3 simonb 116 1.3 simonb /* 117 1.3 simonb * Receive descriptor list size. There is one Rx channel with up to 256 118 1.3 simonb * hardware descriptors available. We allocate 64 receive descriptors, 119 1.3 simonb * each with a 2k buffer (MCLBYTES). 120 1.3 simonb */ 121 1.3 simonb #define EMAC_NRXDESC 64 122 1.3 simonb #define EMAC_NRXDESC_MASK (EMAC_NRXDESC - 1) 123 1.3 simonb #define EMAC_NEXTRX(x) (((x) + 1) & EMAC_NRXDESC_MASK) 124 1.3 simonb #define EMAC_PREVRX(x) (((x) - 1) & EMAC_NRXDESC_MASK) 125 1.3 simonb 126 1.3 simonb /* 127 1.3 simonb * Transmit/receive descriptors that are DMA'd to the EMAC. 128 1.3 simonb */ 129 1.3 simonb struct emac_control_data { 130 1.3 simonb struct mal_descriptor ecd_txdesc[EMAC_NTXDESC]; 131 1.3 simonb struct mal_descriptor ecd_rxdesc[EMAC_NRXDESC]; 132 1.3 simonb }; 133 1.3 simonb 134 1.3 simonb #define EMAC_CDOFF(x) offsetof(struct emac_control_data, x) 135 1.3 simonb #define EMAC_CDTXOFF(x) EMAC_CDOFF(ecd_txdesc[(x)]) 136 1.3 simonb #define EMAC_CDRXOFF(x) EMAC_CDOFF(ecd_rxdesc[(x)]) 137 1.3 simonb 138 1.3 simonb /* 139 1.3 simonb * Software state for transmit jobs. 140 1.3 simonb */ 141 1.3 simonb struct emac_txsoft { 142 1.3 simonb struct mbuf *txs_mbuf; /* head of mbuf chain */ 143 1.3 simonb bus_dmamap_t txs_dmamap; /* our DMA map */ 144 1.3 simonb int txs_firstdesc; /* first descriptor in packet */ 145 1.3 simonb int txs_lastdesc; /* last descriptor in packet */ 146 1.3 simonb int txs_ndesc; /* # of descriptors used */ 147 1.3 simonb }; 148 1.3 simonb 149 1.3 simonb /* 150 1.3 simonb * Software state for receive descriptors. 151 1.3 simonb */ 152 1.3 simonb struct emac_rxsoft { 153 1.3 simonb struct mbuf *rxs_mbuf; /* head of mbuf chain */ 154 1.3 simonb bus_dmamap_t rxs_dmamap; /* our DMA map */ 155 1.3 simonb }; 156 1.3 simonb 157 1.3 simonb /* 158 1.3 simonb * Software state per device. 159 1.3 simonb */ 160 1.1 simonb struct emac_softc { 161 1.36 kiyohara device_t sc_dev; /* generic device information */ 162 1.36 kiyohara int sc_instance; /* instance no. */ 163 1.1 simonb bus_space_tag_t sc_st; /* bus space tag */ 164 1.1 simonb bus_space_handle_t sc_sh; /* bus space handle */ 165 1.1 simonb bus_dma_tag_t sc_dmat; /* bus DMA tag */ 166 1.1 simonb struct ethercom sc_ethercom; /* ethernet common data */ 167 1.1 simonb void *sc_sdhook; /* shutdown hook */ 168 1.3 simonb void *sc_powerhook; /* power management hook */ 169 1.3 simonb 170 1.3 simonb struct mii_data sc_mii; /* MII/media information */ 171 1.3 simonb struct callout sc_callout; /* tick callout */ 172 1.3 simonb 173 1.36 kiyohara uint32_t sc_mr1; /* copy of Mode Register 1 */ 174 1.36 kiyohara uint32_t sc_stacr_read; /* Read opcode of STAOPC of STACR */ 175 1.36 kiyohara uint32_t sc_stacr_write; /* Write opcode of STAOPC of STACR */ 176 1.36 kiyohara uint32_t sc_stacr_bits; /* misc bits of STACR */ 177 1.36 kiyohara bool sc_stacr_completed; /* Operation completed of STACR */ 178 1.36 kiyohara int sc_htsize; /* Hash Table size */ 179 1.3 simonb 180 1.3 simonb bus_dmamap_t sc_cddmamap; /* control data dma map */ 181 1.3 simonb #define sc_cddma sc_cddmamap->dm_segs[0].ds_addr 182 1.3 simonb 183 1.3 simonb /* Software state for transmit/receive descriptors. */ 184 1.3 simonb struct emac_txsoft sc_txsoft[EMAC_TXQUEUELEN]; 185 1.3 simonb struct emac_rxsoft sc_rxsoft[EMAC_NRXDESC]; 186 1.3 simonb 187 1.3 simonb /* Control data structures. */ 188 1.3 simonb struct emac_control_data *sc_control_data; 189 1.3 simonb #define sc_txdescs sc_control_data->ecd_txdesc 190 1.3 simonb #define sc_rxdescs sc_control_data->ecd_rxdesc 191 1.3 simonb 192 1.3 simonb #ifdef EMAC_EVENT_COUNTERS 193 1.3 simonb struct evcnt sc_ev_rxintr; /* Rx interrupts */ 194 1.3 simonb struct evcnt sc_ev_txintr; /* Tx interrupts */ 195 1.3 simonb struct evcnt sc_ev_rxde; /* Rx descriptor interrupts */ 196 1.3 simonb struct evcnt sc_ev_txde; /* Tx descriptor interrupts */ 197 1.3 simonb struct evcnt sc_ev_intr; /* General EMAC interrupts */ 198 1.3 simonb 199 1.3 simonb struct evcnt sc_ev_txreap; /* Calls to Tx descriptor reaper */ 200 1.3 simonb struct evcnt sc_ev_txsstall; /* Tx stalled due to no txs */ 201 1.3 simonb struct evcnt sc_ev_txdstall; /* Tx stalled due to no txd */ 202 1.3 simonb struct evcnt sc_ev_txdrop; /* Tx packets dropped (too many segs) */ 203 1.3 simonb struct evcnt sc_ev_tu; /* Tx underrun */ 204 1.3 simonb #endif /* EMAC_EVENT_COUNTERS */ 205 1.3 simonb 206 1.3 simonb int sc_txfree; /* number of free Tx descriptors */ 207 1.3 simonb int sc_txnext; /* next ready Tx descriptor */ 208 1.3 simonb 209 1.3 simonb int sc_txsfree; /* number of free Tx jobs */ 210 1.3 simonb int sc_txsnext; /* next ready Tx job */ 211 1.3 simonb int sc_txsdirty; /* dirty Tx jobs */ 212 1.3 simonb 213 1.3 simonb int sc_rxptr; /* next ready RX descriptor/descsoft */ 214 1.36 kiyohara 215 1.54 rin krndsource_t rnd_source; /* random source */ 216 1.54 rin 217 1.36 kiyohara void (*sc_rmii_enable)(device_t, int); /* reduced MII enable */ 218 1.36 kiyohara void (*sc_rmii_disable)(device_t, int); /* reduced MII disable*/ 219 1.36 kiyohara void (*sc_rmii_speed)(device_t, int, int); /* reduced MII speed */ 220 1.1 simonb }; 221 1.1 simonb 222 1.3 simonb #ifdef EMAC_EVENT_COUNTERS 223 1.3 simonb #define EMAC_EVCNT_INCR(ev) (ev)->ev_count++ 224 1.3 simonb #else 225 1.3 simonb #define EMAC_EVCNT_INCR(ev) /* nothing */ 226 1.3 simonb #endif 227 1.3 simonb 228 1.3 simonb #define EMAC_CDTXADDR(sc, x) ((sc)->sc_cddma + EMAC_CDTXOFF((x))) 229 1.3 simonb #define EMAC_CDRXADDR(sc, x) ((sc)->sc_cddma + EMAC_CDRXOFF((x))) 230 1.3 simonb 231 1.3 simonb #define EMAC_CDTXSYNC(sc, x, n, ops) \ 232 1.3 simonb do { \ 233 1.3 simonb int __x, __n; \ 234 1.3 simonb \ 235 1.3 simonb __x = (x); \ 236 1.3 simonb __n = (n); \ 237 1.3 simonb \ 238 1.3 simonb /* If it will wrap around, sync to the end of the ring. */ \ 239 1.3 simonb if ((__x + __n) > EMAC_NTXDESC) { \ 240 1.3 simonb bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \ 241 1.3 simonb EMAC_CDTXOFF(__x), sizeof(struct mal_descriptor) * \ 242 1.3 simonb (EMAC_NTXDESC - __x), (ops)); \ 243 1.3 simonb __n -= (EMAC_NTXDESC - __x); \ 244 1.3 simonb __x = 0; \ 245 1.3 simonb } \ 246 1.3 simonb \ 247 1.3 simonb /* Now sync whatever is left. */ \ 248 1.3 simonb bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \ 249 1.3 simonb EMAC_CDTXOFF(__x), sizeof(struct mal_descriptor) * __n, (ops)); \ 250 1.3 simonb } while (/*CONSTCOND*/0) 251 1.3 simonb 252 1.3 simonb #define EMAC_CDRXSYNC(sc, x, ops) \ 253 1.3 simonb do { \ 254 1.3 simonb bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \ 255 1.3 simonb EMAC_CDRXOFF((x)), sizeof(struct mal_descriptor), (ops)); \ 256 1.3 simonb } while (/*CONSTCOND*/0) 257 1.3 simonb 258 1.3 simonb #define EMAC_INIT_RXDESC(sc, x) \ 259 1.3 simonb do { \ 260 1.3 simonb struct emac_rxsoft *__rxs = &(sc)->sc_rxsoft[(x)]; \ 261 1.3 simonb struct mal_descriptor *__rxd = &(sc)->sc_rxdescs[(x)]; \ 262 1.3 simonb struct mbuf *__m = __rxs->rxs_mbuf; \ 263 1.3 simonb \ 264 1.3 simonb /* \ 265 1.3 simonb * Note: We scoot the packet forward 2 bytes in the buffer \ 266 1.3 simonb * so that the payload after the Ethernet header is aligned \ 267 1.3 simonb * to a 4-byte boundary. \ 268 1.3 simonb */ \ 269 1.3 simonb __m->m_data = __m->m_ext.ext_buf + 2; \ 270 1.3 simonb \ 271 1.3 simonb __rxd->md_data = __rxs->rxs_dmamap->dm_segs[0].ds_addr + 2; \ 272 1.3 simonb __rxd->md_data_len = __m->m_ext.ext_size - 2; \ 273 1.3 simonb __rxd->md_stat_ctrl = MAL_RX_EMPTY | MAL_RX_INTERRUPT | \ 274 1.3 simonb /* Set wrap on last descriptor. */ \ 275 1.3 simonb (((x) == EMAC_NRXDESC - 1) ? MAL_RX_WRAP : 0); \ 276 1.50 msaitoh EMAC_CDRXSYNC((sc), (x), BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); \ 277 1.3 simonb } while (/*CONSTCOND*/0) 278 1.3 simonb 279 1.3 simonb #define EMAC_WRITE(sc, reg, val) \ 280 1.3 simonb bus_space_write_stream_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) 281 1.3 simonb #define EMAC_READ(sc, reg) \ 282 1.3 simonb bus_space_read_stream_4((sc)->sc_st, (sc)->sc_sh, (reg)) 283 1.3 simonb 284 1.36 kiyohara #define EMAC_SET_FILTER(aht, crc) \ 285 1.36 kiyohara do { \ 286 1.36 kiyohara (aht)[3 - (((crc) >> 26) >> 4)] |= 1 << (((crc) >> 26) & 0xf); \ 287 1.36 kiyohara } while (/*CONSTCOND*/0) 288 1.36 kiyohara #define EMAC_SET_FILTER256(aht, crc) \ 289 1.18 simonb do { \ 290 1.36 kiyohara (aht)[7 - (((crc) >> 24) >> 5)] |= 1 << (((crc) >> 24) & 0x1f); \ 291 1.18 simonb } while (/*CONSTCOND*/0) 292 1.18 simonb 293 1.36 kiyohara static int emac_match(device_t, cfdata_t, void *); 294 1.36 kiyohara static void emac_attach(device_t, device_t, void *); 295 1.3 simonb 296 1.36 kiyohara static int emac_intr(void *); 297 1.3 simonb static void emac_shutdown(void *); 298 1.36 kiyohara 299 1.3 simonb static void emac_start(struct ifnet *); 300 1.36 kiyohara static int emac_ioctl(struct ifnet *, u_long, void *); 301 1.36 kiyohara static int emac_init(struct ifnet *); 302 1.3 simonb static void emac_stop(struct ifnet *, int); 303 1.3 simonb static void emac_watchdog(struct ifnet *); 304 1.36 kiyohara 305 1.36 kiyohara static int emac_add_rxbuf(struct emac_softc *, int); 306 1.36 kiyohara static void emac_rxdrain(struct emac_softc *); 307 1.18 simonb static int emac_set_filter(struct emac_softc *); 308 1.36 kiyohara static int emac_txreap(struct emac_softc *); 309 1.3 simonb 310 1.36 kiyohara static void emac_soft_reset(struct emac_softc *); 311 1.36 kiyohara static void emac_smart_reset(struct emac_softc *); 312 1.1 simonb 313 1.49 msaitoh static int emac_mii_readreg(device_t, int, int, uint16_t *); 314 1.49 msaitoh static int emac_mii_writereg(device_t, int, int, uint16_t); 315 1.41 matt static void emac_mii_statchg(struct ifnet *); 316 1.36 kiyohara static uint32_t emac_mii_wait(struct emac_softc *); 317 1.3 simonb static void emac_mii_tick(void *); 318 1.3 simonb 319 1.3 simonb int emac_copy_small = 0; 320 1.3 simonb 321 1.36 kiyohara CFATTACH_DECL_NEW(emac, sizeof(struct emac_softc), 322 1.13 thorpej emac_match, emac_attach, NULL, NULL); 323 1.1 simonb 324 1.36 kiyohara 325 1.1 simonb static int 326 1.36 kiyohara emac_match(device_t parent, cfdata_t cf, void *aux) 327 1.1 simonb { 328 1.5 simonb struct opb_attach_args *oaa = aux; 329 1.1 simonb 330 1.3 simonb /* match only on-chip ethernet devices */ 331 1.10 thorpej if (strcmp(oaa->opb_name, cf->cf_name) == 0) 332 1.36 kiyohara return 1; 333 1.1 simonb 334 1.36 kiyohara return 0; 335 1.1 simonb } 336 1.1 simonb 337 1.1 simonb static void 338 1.36 kiyohara emac_attach(device_t parent, device_t self, void *aux) 339 1.1 simonb { 340 1.5 simonb struct opb_attach_args *oaa = aux; 341 1.36 kiyohara struct emac_softc *sc = device_private(self); 342 1.3 simonb struct ifnet *ifp = &sc->sc_ethercom.ec_if; 343 1.3 simonb struct mii_data *mii = &sc->sc_mii; 344 1.38 matt const char * xname = device_xname(self); 345 1.3 simonb bus_dma_segment_t seg; 346 1.36 kiyohara int error, i, nseg, opb_freq, opbc, mii_phy = MII_PHY_ANY; 347 1.26 thorpej const uint8_t *enaddr; 348 1.36 kiyohara prop_dictionary_t dict = device_properties(self); 349 1.26 thorpej prop_data_t ea; 350 1.1 simonb 351 1.27 kiyohara bus_space_map(oaa->opb_bt, oaa->opb_addr, EMAC_NREG, 0, &sc->sc_sh); 352 1.36 kiyohara 353 1.36 kiyohara sc->sc_dev = self; 354 1.36 kiyohara sc->sc_instance = oaa->opb_instance; 355 1.9 simonb sc->sc_st = oaa->opb_bt; 356 1.5 simonb sc->sc_dmat = oaa->opb_dmat; 357 1.1 simonb 358 1.36 kiyohara callout_init(&sc->sc_callout, 0); 359 1.36 kiyohara 360 1.36 kiyohara aprint_naive("\n"); 361 1.36 kiyohara aprint_normal(": Ethernet Media Access Controller\n"); 362 1.3 simonb 363 1.36 kiyohara /* Fetch the Ethernet address. */ 364 1.36 kiyohara ea = prop_dictionary_get(dict, "mac-address"); 365 1.36 kiyohara if (ea == NULL) { 366 1.36 kiyohara aprint_error_dev(self, "unable to get mac-address property\n"); 367 1.36 kiyohara return; 368 1.36 kiyohara } 369 1.36 kiyohara KASSERT(prop_object_type(ea) == PROP_TYPE_DATA); 370 1.36 kiyohara KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN); 371 1.36 kiyohara enaddr = prop_data_data_nocopy(ea); 372 1.36 kiyohara aprint_normal_dev(self, "Ethernet address %s\n", ether_sprintf(enaddr)); 373 1.33 kiyohara 374 1.36 kiyohara #if defined(EMAC_ZMII_PHY) || defined(EMAC_RGMII_PHY) 375 1.36 kiyohara /* Fetch the MII offset. */ 376 1.36 kiyohara prop_dictionary_get_uint32(dict, "mii-phy", &mii_phy); 377 1.36 kiyohara 378 1.36 kiyohara #ifdef EMAC_ZMII_PHY 379 1.36 kiyohara if (oaa->opb_flags & OPB_FLAGS_EMAC_RMII_ZMII) 380 1.36 kiyohara zmii_attach(parent, sc->sc_instance, &sc->sc_rmii_enable, 381 1.36 kiyohara &sc->sc_rmii_disable, &sc->sc_rmii_speed); 382 1.36 kiyohara #endif 383 1.36 kiyohara #ifdef EMAC_RGMII_PHY 384 1.36 kiyohara if (oaa->opb_flags & OPB_FLAGS_EMAC_RMII_RGMII) 385 1.36 kiyohara rgmii_attach(parent, sc->sc_instance, &sc->sc_rmii_enable, 386 1.36 kiyohara &sc->sc_rmii_disable, &sc->sc_rmii_speed); 387 1.36 kiyohara #endif 388 1.36 kiyohara #endif 389 1.3 simonb 390 1.3 simonb /* 391 1.3 simonb * Allocate the control data structures, and create and load the 392 1.3 simonb * DMA map for it. 393 1.3 simonb */ 394 1.3 simonb if ((error = bus_dmamem_alloc(sc->sc_dmat, 395 1.3 simonb sizeof(struct emac_control_data), 0, 0, &seg, 1, &nseg, 0)) != 0) { 396 1.36 kiyohara aprint_error_dev(self, 397 1.36 kiyohara "unable to allocate control data, error = %d\n", error); 398 1.3 simonb goto fail_0; 399 1.3 simonb } 400 1.3 simonb 401 1.3 simonb if ((error = bus_dmamem_map(sc->sc_dmat, &seg, nseg, 402 1.28 christos sizeof(struct emac_control_data), (void **)&sc->sc_control_data, 403 1.3 simonb BUS_DMA_COHERENT)) != 0) { 404 1.36 kiyohara aprint_error_dev(self, 405 1.36 kiyohara "unable to map control data, error = %d\n", error); 406 1.3 simonb goto fail_1; 407 1.3 simonb } 408 1.3 simonb 409 1.3 simonb if ((error = bus_dmamap_create(sc->sc_dmat, 410 1.3 simonb sizeof(struct emac_control_data), 1, 411 1.3 simonb sizeof(struct emac_control_data), 0, 0, &sc->sc_cddmamap)) != 0) { 412 1.36 kiyohara aprint_error_dev(self, 413 1.36 kiyohara "unable to create control data DMA map, error = %d\n", 414 1.36 kiyohara error); 415 1.3 simonb goto fail_2; 416 1.3 simonb } 417 1.3 simonb 418 1.3 simonb if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap, 419 1.3 simonb sc->sc_control_data, sizeof(struct emac_control_data), NULL, 420 1.3 simonb 0)) != 0) { 421 1.36 kiyohara aprint_error_dev(self, 422 1.36 kiyohara "unable to load control data DMA map, error = %d\n", error); 423 1.3 simonb goto fail_3; 424 1.3 simonb } 425 1.3 simonb 426 1.3 simonb /* 427 1.3 simonb * Create the transmit buffer DMA maps. 428 1.3 simonb */ 429 1.3 simonb for (i = 0; i < EMAC_TXQUEUELEN; i++) { 430 1.3 simonb if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 431 1.3 simonb EMAC_NTXSEGS, MCLBYTES, 0, 0, 432 1.3 simonb &sc->sc_txsoft[i].txs_dmamap)) != 0) { 433 1.36 kiyohara aprint_error_dev(self, 434 1.36 kiyohara "unable to create tx DMA map %d, error = %d\n", 435 1.36 kiyohara i, error); 436 1.3 simonb goto fail_4; 437 1.3 simonb } 438 1.3 simonb } 439 1.3 simonb 440 1.3 simonb /* 441 1.3 simonb * Create the receive buffer DMA maps. 442 1.3 simonb */ 443 1.3 simonb for (i = 0; i < EMAC_NRXDESC; i++) { 444 1.3 simonb if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, 445 1.3 simonb MCLBYTES, 0, 0, &sc->sc_rxsoft[i].rxs_dmamap)) != 0) { 446 1.36 kiyohara aprint_error_dev(self, 447 1.36 kiyohara "unable to create rx DMA map %d, error = %d\n", 448 1.36 kiyohara i, error); 449 1.3 simonb goto fail_5; 450 1.3 simonb } 451 1.3 simonb sc->sc_rxsoft[i].rxs_mbuf = NULL; 452 1.3 simonb } 453 1.3 simonb 454 1.36 kiyohara /* Soft Reset the EMAC. The chip to a known state. */ 455 1.36 kiyohara emac_soft_reset(sc); 456 1.3 simonb 457 1.36 kiyohara opb_freq = opb_get_frequency(); 458 1.36 kiyohara switch (opb_freq) { 459 1.56 rin case 33333333: opbc = STACR_OPBC_33MHZ; break; 460 1.36 kiyohara case 50000000: opbc = STACR_OPBC_50MHZ; break; 461 1.36 kiyohara case 66666666: opbc = STACR_OPBC_66MHZ; break; 462 1.36 kiyohara case 83333333: opbc = STACR_OPBC_83MHZ; break; 463 1.36 kiyohara case 100000000: opbc = STACR_OPBC_100MHZ; break; 464 1.36 kiyohara 465 1.36 kiyohara default: 466 1.36 kiyohara if (opb_freq > 100000000) { 467 1.36 kiyohara opbc = STACR_OPBC_A100MHZ; 468 1.36 kiyohara break; 469 1.36 kiyohara } 470 1.58 andvar aprint_error_dev(self, "unsupported OPB frequency %dMHz\n", 471 1.36 kiyohara opb_freq / 1000 / 1000); 472 1.36 kiyohara goto fail_5; 473 1.36 kiyohara } 474 1.36 kiyohara if (oaa->opb_flags & OPB_FLAGS_EMAC_GBE) { 475 1.36 kiyohara sc->sc_mr1 = 476 1.36 kiyohara MR1_RFS_GBE(MR1__FS_16KB) | 477 1.36 kiyohara MR1_TFS_GBE(MR1__FS_16KB) | 478 1.36 kiyohara MR1_TR0_MULTIPLE | 479 1.36 kiyohara MR1_OBCI(opbc); 480 1.36 kiyohara sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 481 1.36 kiyohara 482 1.36 kiyohara if (oaa->opb_flags & OPB_FLAGS_EMAC_STACV2) { 483 1.36 kiyohara sc->sc_stacr_read = STACR_STAOPC_READ; 484 1.36 kiyohara sc->sc_stacr_write = STACR_STAOPC_WRITE; 485 1.36 kiyohara sc->sc_stacr_bits = STACR_OC; 486 1.36 kiyohara sc->sc_stacr_completed = false; 487 1.36 kiyohara } else { 488 1.36 kiyohara sc->sc_stacr_read = STACR_READ; 489 1.36 kiyohara sc->sc_stacr_write = STACR_WRITE; 490 1.36 kiyohara sc->sc_stacr_completed = true; 491 1.36 kiyohara } 492 1.36 kiyohara } else { 493 1.36 kiyohara /* 494 1.36 kiyohara * Set up Mode Register 1 - set receive and transmit FIFOs to 495 1.36 kiyohara * maximum size, allow transmit of multiple packets (only 496 1.36 kiyohara * channel 0 is used). 497 1.36 kiyohara * 498 1.36 kiyohara * XXX: Allow pause packets?? 499 1.36 kiyohara */ 500 1.36 kiyohara sc->sc_mr1 = 501 1.36 kiyohara MR1_RFS(MR1__FS_4KB) | 502 1.36 kiyohara MR1_TFS(MR1__FS_2KB) | 503 1.36 kiyohara MR1_TR0_MULTIPLE; 504 1.36 kiyohara 505 1.36 kiyohara sc->sc_stacr_read = STACR_READ; 506 1.36 kiyohara sc->sc_stacr_write = STACR_WRITE; 507 1.36 kiyohara sc->sc_stacr_bits = STACR_OPBC(opbc); 508 1.36 kiyohara sc->sc_stacr_completed = true; 509 1.14 thorpej } 510 1.14 thorpej 511 1.55 rin intr_establish_xname(oaa->opb_irq, IST_LEVEL, IPL_NET, emac_intr, sc, 512 1.55 rin device_xname(self)); 513 1.36 kiyohara mal_intr_establish(sc->sc_instance, sc); 514 1.36 kiyohara 515 1.36 kiyohara if (oaa->opb_flags & OPB_FLAGS_EMAC_HT256) 516 1.36 kiyohara sc->sc_htsize = 256; 517 1.36 kiyohara else 518 1.36 kiyohara sc->sc_htsize = 64; 519 1.36 kiyohara 520 1.36 kiyohara /* Clear all interrupts */ 521 1.36 kiyohara EMAC_WRITE(sc, EMAC_ISR, ISR_ALL); 522 1.1 simonb 523 1.3 simonb /* 524 1.3 simonb * Initialise the media structures. 525 1.3 simonb */ 526 1.3 simonb mii->mii_ifp = ifp; 527 1.3 simonb mii->mii_readreg = emac_mii_readreg; 528 1.3 simonb mii->mii_writereg = emac_mii_writereg; 529 1.3 simonb mii->mii_statchg = emac_mii_statchg; 530 1.3 simonb 531 1.31 dyoung sc->sc_ethercom.ec_mii = mii; 532 1.31 dyoung ifmedia_init(&mii->mii_media, 0, ether_mediachange, ether_mediastatus); 533 1.42 msaitoh mii_attach(self, mii, 0xffffffff, mii_phy, MII_OFFSET_ANY, 534 1.42 msaitoh MIIF_DOPAUSE); 535 1.3 simonb if (LIST_FIRST(&mii->mii_phys) == NULL) { 536 1.50 msaitoh ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL); 537 1.50 msaitoh ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE); 538 1.3 simonb } else 539 1.50 msaitoh ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO); 540 1.3 simonb 541 1.3 simonb ifp = &sc->sc_ethercom.ec_if; 542 1.38 matt strcpy(ifp->if_xname, xname); 543 1.3 simonb ifp->if_softc = sc; 544 1.3 simonb ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 545 1.36 kiyohara ifp->if_start = emac_start; 546 1.3 simonb ifp->if_ioctl = emac_ioctl; 547 1.3 simonb ifp->if_init = emac_init; 548 1.3 simonb ifp->if_stop = emac_stop; 549 1.36 kiyohara ifp->if_watchdog = emac_watchdog; 550 1.3 simonb IFQ_SET_READY(&ifp->if_snd); 551 1.3 simonb 552 1.3 simonb /* 553 1.3 simonb * We can support 802.1Q VLAN-sized frames. 554 1.3 simonb */ 555 1.3 simonb sc->sc_ethercom.ec_capabilities |= ETHERCAP_VLAN_MTU; 556 1.3 simonb 557 1.3 simonb /* 558 1.3 simonb * Attach the interface. 559 1.3 simonb */ 560 1.3 simonb if_attach(ifp); 561 1.46 ozaki if_deferred_start_init(ifp, NULL); 562 1.14 thorpej ether_ifattach(ifp, enaddr); 563 1.3 simonb 564 1.54 rin rnd_attach_source(&sc->rnd_source, xname, RND_TYPE_NET, 565 1.54 rin RND_FLAG_DEFAULT); 566 1.54 rin 567 1.3 simonb #ifdef EMAC_EVENT_COUNTERS 568 1.3 simonb /* 569 1.3 simonb * Attach the event counters. 570 1.3 simonb */ 571 1.36 kiyohara evcnt_attach_dynamic(&sc->sc_ev_txintr, EVCNT_TYPE_INTR, 572 1.38 matt NULL, xname, "txintr"); 573 1.3 simonb evcnt_attach_dynamic(&sc->sc_ev_rxintr, EVCNT_TYPE_INTR, 574 1.38 matt NULL, xname, "rxintr"); 575 1.36 kiyohara evcnt_attach_dynamic(&sc->sc_ev_txde, EVCNT_TYPE_INTR, 576 1.38 matt NULL, xname, "txde"); 577 1.3 simonb evcnt_attach_dynamic(&sc->sc_ev_rxde, EVCNT_TYPE_INTR, 578 1.38 matt NULL, xname, "rxde"); 579 1.3 simonb evcnt_attach_dynamic(&sc->sc_ev_intr, EVCNT_TYPE_INTR, 580 1.38 matt NULL, xname, "intr"); 581 1.3 simonb 582 1.3 simonb evcnt_attach_dynamic(&sc->sc_ev_txreap, EVCNT_TYPE_MISC, 583 1.38 matt NULL, xname, "txreap"); 584 1.3 simonb evcnt_attach_dynamic(&sc->sc_ev_txsstall, EVCNT_TYPE_MISC, 585 1.38 matt NULL, xname, "txsstall"); 586 1.3 simonb evcnt_attach_dynamic(&sc->sc_ev_txdstall, EVCNT_TYPE_MISC, 587 1.38 matt NULL, xname, "txdstall"); 588 1.3 simonb evcnt_attach_dynamic(&sc->sc_ev_txdrop, EVCNT_TYPE_MISC, 589 1.38 matt NULL, xname, "txdrop"); 590 1.3 simonb evcnt_attach_dynamic(&sc->sc_ev_tu, EVCNT_TYPE_MISC, 591 1.38 matt NULL, xname, "tu"); 592 1.3 simonb #endif /* EMAC_EVENT_COUNTERS */ 593 1.3 simonb 594 1.3 simonb /* 595 1.3 simonb * Make sure the interface is shutdown during reboot. 596 1.3 simonb */ 597 1.3 simonb sc->sc_sdhook = shutdownhook_establish(emac_shutdown, sc); 598 1.3 simonb if (sc->sc_sdhook == NULL) 599 1.36 kiyohara aprint_error_dev(self, 600 1.36 kiyohara "WARNING: unable to establish shutdown hook\n"); 601 1.3 simonb 602 1.3 simonb return; 603 1.3 simonb 604 1.3 simonb /* 605 1.3 simonb * Free any resources we've allocated during the failed attach 606 1.3 simonb * attempt. Do this in reverse order and fall through. 607 1.3 simonb */ 608 1.3 simonb fail_5: 609 1.3 simonb for (i = 0; i < EMAC_NRXDESC; i++) { 610 1.3 simonb if (sc->sc_rxsoft[i].rxs_dmamap != NULL) 611 1.3 simonb bus_dmamap_destroy(sc->sc_dmat, 612 1.3 simonb sc->sc_rxsoft[i].rxs_dmamap); 613 1.3 simonb } 614 1.3 simonb fail_4: 615 1.3 simonb for (i = 0; i < EMAC_TXQUEUELEN; i++) { 616 1.3 simonb if (sc->sc_txsoft[i].txs_dmamap != NULL) 617 1.3 simonb bus_dmamap_destroy(sc->sc_dmat, 618 1.3 simonb sc->sc_txsoft[i].txs_dmamap); 619 1.3 simonb } 620 1.3 simonb bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap); 621 1.3 simonb fail_3: 622 1.3 simonb bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap); 623 1.3 simonb fail_2: 624 1.28 christos bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_control_data, 625 1.3 simonb sizeof(struct emac_control_data)); 626 1.3 simonb fail_1: 627 1.3 simonb bus_dmamem_free(sc->sc_dmat, &seg, nseg); 628 1.3 simonb fail_0: 629 1.3 simonb return; 630 1.3 simonb } 631 1.3 simonb 632 1.3 simonb /* 633 1.36 kiyohara * EMAC General interrupt handler 634 1.3 simonb */ 635 1.36 kiyohara static int 636 1.36 kiyohara emac_intr(void *arg) 637 1.36 kiyohara { 638 1.36 kiyohara struct emac_softc *sc = arg; 639 1.36 kiyohara uint32_t status; 640 1.36 kiyohara 641 1.36 kiyohara EMAC_EVCNT_INCR(&sc->sc_ev_intr); 642 1.36 kiyohara status = EMAC_READ(sc, EMAC_ISR); 643 1.36 kiyohara 644 1.36 kiyohara /* Clear the interrupt status bits. */ 645 1.36 kiyohara EMAC_WRITE(sc, EMAC_ISR, status); 646 1.36 kiyohara 647 1.36 kiyohara return 1; 648 1.36 kiyohara } 649 1.36 kiyohara 650 1.3 simonb static void 651 1.3 simonb emac_shutdown(void *arg) 652 1.3 simonb { 653 1.3 simonb struct emac_softc *sc = arg; 654 1.3 simonb 655 1.3 simonb emac_stop(&sc->sc_ethercom.ec_if, 0); 656 1.3 simonb } 657 1.3 simonb 658 1.36 kiyohara 659 1.36 kiyohara /* 660 1.36 kiyohara * ifnet interface functions 661 1.36 kiyohara */ 662 1.36 kiyohara 663 1.3 simonb static void 664 1.3 simonb emac_start(struct ifnet *ifp) 665 1.3 simonb { 666 1.3 simonb struct emac_softc *sc = ifp->if_softc; 667 1.3 simonb struct mbuf *m0; 668 1.3 simonb struct emac_txsoft *txs; 669 1.3 simonb bus_dmamap_t dmamap; 670 1.3 simonb int error, firsttx, nexttx, lasttx, ofree, seg; 671 1.17 simonb 672 1.17 simonb lasttx = 0; /* XXX gcc */ 673 1.3 simonb 674 1.57 thorpej if ((ifp->if_flags & IFF_RUNNING) == 0) 675 1.3 simonb return; 676 1.3 simonb 677 1.3 simonb /* 678 1.3 simonb * Remember the previous number of free descriptors. 679 1.3 simonb */ 680 1.3 simonb ofree = sc->sc_txfree; 681 1.3 simonb 682 1.3 simonb /* 683 1.3 simonb * Loop through the send queue, setting up transmit descriptors 684 1.3 simonb * until we drain the queue, or use up all available transmit 685 1.3 simonb * descriptors. 686 1.3 simonb */ 687 1.3 simonb for (;;) { 688 1.3 simonb /* Grab a packet off the queue. */ 689 1.3 simonb IFQ_POLL(&ifp->if_snd, m0); 690 1.3 simonb if (m0 == NULL) 691 1.3 simonb break; 692 1.3 simonb 693 1.3 simonb /* 694 1.3 simonb * Get a work queue entry. Reclaim used Tx descriptors if 695 1.3 simonb * we are running low. 696 1.3 simonb */ 697 1.3 simonb if (sc->sc_txsfree < EMAC_TXQUEUE_GC) { 698 1.3 simonb emac_txreap(sc); 699 1.3 simonb if (sc->sc_txsfree == 0) { 700 1.3 simonb EMAC_EVCNT_INCR(&sc->sc_ev_txsstall); 701 1.3 simonb break; 702 1.3 simonb } 703 1.3 simonb } 704 1.3 simonb 705 1.3 simonb txs = &sc->sc_txsoft[sc->sc_txsnext]; 706 1.3 simonb dmamap = txs->txs_dmamap; 707 1.3 simonb 708 1.3 simonb /* 709 1.3 simonb * Load the DMA map. If this fails, the packet either 710 1.59 andvar * didn't fit in the allotted number of segments, or we 711 1.3 simonb * were short on resources. In this case, we'll copy 712 1.3 simonb * and try again. 713 1.3 simonb */ 714 1.3 simonb error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 715 1.50 msaitoh BUS_DMA_WRITE | BUS_DMA_NOWAIT); 716 1.3 simonb if (error) { 717 1.3 simonb if (error == EFBIG) { 718 1.3 simonb EMAC_EVCNT_INCR(&sc->sc_ev_txdrop); 719 1.36 kiyohara aprint_error_ifnet(ifp, 720 1.36 kiyohara "Tx packet consumes too many " 721 1.36 kiyohara "DMA segments, dropping...\n"); 722 1.3 simonb IFQ_DEQUEUE(&ifp->if_snd, m0); 723 1.3 simonb m_freem(m0); 724 1.3 simonb continue; 725 1.3 simonb } 726 1.3 simonb /* Short on resources, just stop for now. */ 727 1.3 simonb break; 728 1.3 simonb } 729 1.3 simonb 730 1.3 simonb /* 731 1.3 simonb * Ensure we have enough descriptors free to describe 732 1.3 simonb * the packet. 733 1.3 simonb */ 734 1.3 simonb if (dmamap->dm_nsegs > sc->sc_txfree) { 735 1.3 simonb /* 736 1.3 simonb * Not enough free descriptors to transmit this 737 1.3 simonb * packet. We haven't committed anything yet, 738 1.3 simonb * so just unload the DMA map, put the packet 739 1.3 simonb * back on the queue, and punt. Notify the upper 740 1.3 simonb * layer that there are not more slots left. 741 1.3 simonb * 742 1.3 simonb */ 743 1.3 simonb bus_dmamap_unload(sc->sc_dmat, dmamap); 744 1.3 simonb EMAC_EVCNT_INCR(&sc->sc_ev_txdstall); 745 1.3 simonb break; 746 1.3 simonb } 747 1.3 simonb 748 1.3 simonb IFQ_DEQUEUE(&ifp->if_snd, m0); 749 1.3 simonb 750 1.3 simonb /* 751 1.3 simonb * WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. 752 1.3 simonb */ 753 1.3 simonb 754 1.3 simonb /* Sync the DMA map. */ 755 1.3 simonb bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 756 1.3 simonb BUS_DMASYNC_PREWRITE); 757 1.3 simonb 758 1.3 simonb /* 759 1.3 simonb * Store a pointer to the packet so that we can free it 760 1.3 simonb * later. 761 1.3 simonb */ 762 1.3 simonb txs->txs_mbuf = m0; 763 1.3 simonb txs->txs_firstdesc = sc->sc_txnext; 764 1.3 simonb txs->txs_ndesc = dmamap->dm_nsegs; 765 1.3 simonb 766 1.3 simonb /* 767 1.3 simonb * Initialize the transmit descriptor. 768 1.3 simonb */ 769 1.3 simonb firsttx = sc->sc_txnext; 770 1.3 simonb for (nexttx = sc->sc_txnext, seg = 0; 771 1.3 simonb seg < dmamap->dm_nsegs; 772 1.3 simonb seg++, nexttx = EMAC_NEXTTX(nexttx)) { 773 1.36 kiyohara struct mal_descriptor *txdesc = 774 1.36 kiyohara &sc->sc_txdescs[nexttx]; 775 1.36 kiyohara 776 1.3 simonb /* 777 1.3 simonb * If this is the first descriptor we're 778 1.3 simonb * enqueueing, don't set the TX_READY bit just 779 1.3 simonb * yet. That could cause a race condition. 780 1.3 simonb * We'll do it below. 781 1.3 simonb */ 782 1.36 kiyohara txdesc->md_data = dmamap->dm_segs[seg].ds_addr; 783 1.36 kiyohara txdesc->md_data_len = dmamap->dm_segs[seg].ds_len; 784 1.36 kiyohara txdesc->md_stat_ctrl = 785 1.36 kiyohara (txdesc->md_stat_ctrl & MAL_TX_WRAP) | 786 1.3 simonb (nexttx == firsttx ? 0 : MAL_TX_READY) | 787 1.3 simonb EMAC_TXC_GFCS | EMAC_TXC_GPAD; 788 1.3 simonb lasttx = nexttx; 789 1.3 simonb } 790 1.3 simonb 791 1.3 simonb /* Set the LAST bit on the last segment. */ 792 1.3 simonb sc->sc_txdescs[lasttx].md_stat_ctrl |= MAL_TX_LAST; 793 1.3 simonb 794 1.21 simonb /* 795 1.21 simonb * Set up last segment descriptor to send an interrupt after 796 1.21 simonb * that descriptor is transmitted, and bypass existing Tx 797 1.21 simonb * descriptor reaping method (for now...). 798 1.21 simonb */ 799 1.21 simonb sc->sc_txdescs[lasttx].md_stat_ctrl |= MAL_TX_INTERRUPT; 800 1.21 simonb 801 1.21 simonb 802 1.3 simonb txs->txs_lastdesc = lasttx; 803 1.3 simonb 804 1.3 simonb /* Sync the descriptors we're using. */ 805 1.3 simonb EMAC_CDTXSYNC(sc, sc->sc_txnext, dmamap->dm_nsegs, 806 1.3 simonb BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 807 1.3 simonb 808 1.3 simonb /* 809 1.3 simonb * The entire packet chain is set up. Give the 810 1.3 simonb * first descriptor to the chip now. 811 1.3 simonb */ 812 1.3 simonb sc->sc_txdescs[firsttx].md_stat_ctrl |= MAL_TX_READY; 813 1.3 simonb EMAC_CDTXSYNC(sc, firsttx, 1, 814 1.3 simonb BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 815 1.3 simonb /* 816 1.3 simonb * Tell the EMAC that a new packet is available. 817 1.3 simonb */ 818 1.36 kiyohara EMAC_WRITE(sc, EMAC_TMR0, TMR0_GNP0 | TMR0_TFAE_2); 819 1.3 simonb 820 1.3 simonb /* Advance the tx pointer. */ 821 1.3 simonb sc->sc_txfree -= txs->txs_ndesc; 822 1.3 simonb sc->sc_txnext = nexttx; 823 1.3 simonb 824 1.3 simonb sc->sc_txsfree--; 825 1.3 simonb sc->sc_txsnext = EMAC_NEXTTXS(sc->sc_txsnext); 826 1.3 simonb 827 1.3 simonb /* 828 1.3 simonb * Pass the packet to any BPF listeners. 829 1.3 simonb */ 830 1.48 msaitoh bpf_mtap(ifp, m0, BPF_D_OUT); 831 1.3 simonb } 832 1.3 simonb 833 1.36 kiyohara if (sc->sc_txfree != ofree) 834 1.3 simonb /* Set a watchdog timer in case the chip flakes out. */ 835 1.3 simonb ifp->if_timer = 5; 836 1.36 kiyohara } 837 1.36 kiyohara 838 1.36 kiyohara static int 839 1.36 kiyohara emac_ioctl(struct ifnet *ifp, u_long cmd, void *data) 840 1.36 kiyohara { 841 1.36 kiyohara struct emac_softc *sc = ifp->if_softc; 842 1.36 kiyohara int s, error; 843 1.36 kiyohara 844 1.36 kiyohara s = splnet(); 845 1.36 kiyohara 846 1.36 kiyohara switch (cmd) { 847 1.36 kiyohara case SIOCSIFMTU: 848 1.36 kiyohara { 849 1.36 kiyohara struct ifreq *ifr = (struct ifreq *)data; 850 1.36 kiyohara int maxmtu; 851 1.36 kiyohara 852 1.36 kiyohara if (sc->sc_ethercom.ec_capabilities & ETHERCAP_JUMBO_MTU) 853 1.36 kiyohara maxmtu = EMAC_MAX_MTU; 854 1.36 kiyohara else 855 1.36 kiyohara maxmtu = ETHERMTU; 856 1.36 kiyohara 857 1.36 kiyohara if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > maxmtu) 858 1.36 kiyohara error = EINVAL; 859 1.36 kiyohara else if ((error = ifioctl_common(ifp, cmd, data)) != ENETRESET) 860 1.36 kiyohara break; 861 1.36 kiyohara else if (ifp->if_flags & IFF_UP) 862 1.36 kiyohara error = emac_init(ifp); 863 1.36 kiyohara else 864 1.36 kiyohara error = 0; 865 1.36 kiyohara break; 866 1.36 kiyohara } 867 1.36 kiyohara 868 1.36 kiyohara default: 869 1.36 kiyohara error = ether_ioctl(ifp, cmd, data); 870 1.36 kiyohara if (error == ENETRESET) { 871 1.36 kiyohara /* 872 1.36 kiyohara * Multicast list has changed; set the hardware filter 873 1.36 kiyohara * accordingly. 874 1.36 kiyohara */ 875 1.36 kiyohara if (ifp->if_flags & IFF_RUNNING) 876 1.36 kiyohara error = emac_set_filter(sc); 877 1.36 kiyohara else 878 1.36 kiyohara error = 0; 879 1.36 kiyohara } 880 1.3 simonb } 881 1.36 kiyohara 882 1.36 kiyohara /* try to get more packets going */ 883 1.36 kiyohara emac_start(ifp); 884 1.36 kiyohara 885 1.36 kiyohara splx(s); 886 1.36 kiyohara return error; 887 1.3 simonb } 888 1.3 simonb 889 1.3 simonb static int 890 1.3 simonb emac_init(struct ifnet *ifp) 891 1.3 simonb { 892 1.3 simonb struct emac_softc *sc = ifp->if_softc; 893 1.3 simonb struct emac_rxsoft *rxs; 894 1.29 dyoung const uint8_t *enaddr = CLLADDR(ifp->if_sadl); 895 1.3 simonb int error, i; 896 1.3 simonb 897 1.3 simonb error = 0; 898 1.3 simonb 899 1.3 simonb /* Cancel any pending I/O. */ 900 1.3 simonb emac_stop(ifp, 0); 901 1.3 simonb 902 1.3 simonb /* Reset the chip to a known state. */ 903 1.36 kiyohara emac_soft_reset(sc); 904 1.3 simonb 905 1.36 kiyohara /* 906 1.3 simonb * Initialise the transmit descriptor ring. 907 1.3 simonb */ 908 1.3 simonb memset(sc->sc_txdescs, 0, sizeof(sc->sc_txdescs)); 909 1.3 simonb /* set wrap on last descriptor */ 910 1.3 simonb sc->sc_txdescs[EMAC_NTXDESC - 1].md_stat_ctrl |= MAL_TX_WRAP; 911 1.3 simonb EMAC_CDTXSYNC(sc, 0, EMAC_NTXDESC, 912 1.36 kiyohara BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 913 1.3 simonb sc->sc_txfree = EMAC_NTXDESC; 914 1.3 simonb sc->sc_txnext = 0; 915 1.3 simonb 916 1.3 simonb /* 917 1.3 simonb * Initialise the transmit job descriptors. 918 1.3 simonb */ 919 1.3 simonb for (i = 0; i < EMAC_TXQUEUELEN; i++) 920 1.3 simonb sc->sc_txsoft[i].txs_mbuf = NULL; 921 1.3 simonb sc->sc_txsfree = EMAC_TXQUEUELEN; 922 1.3 simonb sc->sc_txsnext = 0; 923 1.3 simonb sc->sc_txsdirty = 0; 924 1.3 simonb 925 1.3 simonb /* 926 1.3 simonb * Initialise the receiver descriptor and receive job 927 1.3 simonb * descriptor rings. 928 1.3 simonb */ 929 1.3 simonb for (i = 0; i < EMAC_NRXDESC; i++) { 930 1.3 simonb rxs = &sc->sc_rxsoft[i]; 931 1.3 simonb if (rxs->rxs_mbuf == NULL) { 932 1.3 simonb if ((error = emac_add_rxbuf(sc, i)) != 0) { 933 1.36 kiyohara aprint_error_ifnet(ifp, 934 1.36 kiyohara "unable to allocate or map rx buffer %d," 935 1.36 kiyohara " error = %d\n", 936 1.36 kiyohara i, error); 937 1.3 simonb /* 938 1.3 simonb * XXX Should attempt to run with fewer receive 939 1.3 simonb * XXX buffers instead of just failing. 940 1.3 simonb */ 941 1.3 simonb emac_rxdrain(sc); 942 1.3 simonb goto out; 943 1.3 simonb } 944 1.3 simonb } else 945 1.3 simonb EMAC_INIT_RXDESC(sc, i); 946 1.3 simonb } 947 1.3 simonb sc->sc_rxptr = 0; 948 1.3 simonb 949 1.3 simonb /* 950 1.3 simonb * Set the current media. 951 1.3 simonb */ 952 1.31 dyoung if ((error = ether_mediachange(ifp)) != 0) 953 1.31 dyoung goto out; 954 1.3 simonb 955 1.3 simonb /* 956 1.3 simonb * Load the MAC address. 957 1.3 simonb */ 958 1.6 simonb EMAC_WRITE(sc, EMAC_IAHR, enaddr[0] << 8 | enaddr[1]); 959 1.6 simonb EMAC_WRITE(sc, EMAC_IALR, 960 1.3 simonb enaddr[2] << 24 | enaddr[3] << 16 | enaddr[4] << 8 | enaddr[5]); 961 1.3 simonb 962 1.36 kiyohara /* Enable the transmit and receive channel on the MAL. */ 963 1.36 kiyohara error = mal_start(sc->sc_instance, 964 1.36 kiyohara EMAC_CDTXADDR(sc, 0), EMAC_CDRXADDR(sc, 0)); 965 1.36 kiyohara if (error) 966 1.36 kiyohara goto out; 967 1.36 kiyohara 968 1.36 kiyohara sc->sc_mr1 &= ~MR1_JPSM; 969 1.36 kiyohara if (ifp->if_mtu > ETHERMTU) 970 1.36 kiyohara /* Enable Jumbo Packet Support Mode */ 971 1.36 kiyohara sc->sc_mr1 |= MR1_JPSM; 972 1.3 simonb 973 1.3 simonb /* Set fifos, media modes. */ 974 1.6 simonb EMAC_WRITE(sc, EMAC_MR1, sc->sc_mr1); 975 1.3 simonb 976 1.3 simonb /* 977 1.3 simonb * Enable Individual and (possibly) Broadcast Address modes, 978 1.3 simonb * runt packets, and strip padding. 979 1.3 simonb */ 980 1.36 kiyohara EMAC_WRITE(sc, EMAC_RMR, RMR_IAE | RMR_RRP | RMR_SP | RMR_TFAE_2 | 981 1.18 simonb (ifp->if_flags & IFF_PROMISC ? RMR_PME : 0) | 982 1.3 simonb (ifp->if_flags & IFF_BROADCAST ? RMR_BAE : 0)); 983 1.3 simonb 984 1.3 simonb /* 985 1.27 kiyohara * Set multicast filter. 986 1.27 kiyohara */ 987 1.27 kiyohara emac_set_filter(sc); 988 1.27 kiyohara 989 1.27 kiyohara /* 990 1.3 simonb * Set low- and urgent-priority request thresholds. 991 1.3 simonb */ 992 1.6 simonb EMAC_WRITE(sc, EMAC_TMR1, 993 1.3 simonb ((7 << TMR1_TLR_SHIFT) & TMR1_TLR_MASK) | /* 16 word burst */ 994 1.3 simonb ((15 << TMR1_TUR_SHIFT) & TMR1_TUR_MASK)); 995 1.3 simonb /* 996 1.3 simonb * Set Transmit Request Threshold Register. 997 1.3 simonb */ 998 1.6 simonb EMAC_WRITE(sc, EMAC_TRTR, TRTR_256); 999 1.3 simonb 1000 1.3 simonb /* 1001 1.3 simonb * Set high and low receive watermarks. 1002 1.3 simonb */ 1003 1.6 simonb EMAC_WRITE(sc, EMAC_RWMR, 1004 1.3 simonb 30 << RWMR_RLWM_SHIFT | 64 << RWMR_RLWM_SHIFT); 1005 1.3 simonb 1006 1.3 simonb /* 1007 1.3 simonb * Set frame gap. 1008 1.3 simonb */ 1009 1.6 simonb EMAC_WRITE(sc, EMAC_IPGVR, 8); 1010 1.3 simonb 1011 1.3 simonb /* 1012 1.36 kiyohara * Set interrupt status enable bits for EMAC. 1013 1.3 simonb */ 1014 1.6 simonb EMAC_WRITE(sc, EMAC_ISER, 1015 1.36 kiyohara ISR_TXPE | /* TX Parity Error */ 1016 1.36 kiyohara ISR_RXPE | /* RX Parity Error */ 1017 1.36 kiyohara ISR_TXUE | /* TX Underrun Event */ 1018 1.36 kiyohara ISR_RXOE | /* RX Overrun Event */ 1019 1.36 kiyohara ISR_OVR | /* Overrun Error */ 1020 1.36 kiyohara ISR_PP | /* Pause Packet */ 1021 1.36 kiyohara ISR_BP | /* Bad Packet */ 1022 1.36 kiyohara ISR_RP | /* Runt Packet */ 1023 1.36 kiyohara ISR_SE | /* Short Event */ 1024 1.36 kiyohara ISR_ALE | /* Alignment Error */ 1025 1.36 kiyohara ISR_BFCS | /* Bad FCS */ 1026 1.36 kiyohara ISR_PTLE | /* Packet Too Long Error */ 1027 1.36 kiyohara ISR_ORE | /* Out of Range Error */ 1028 1.36 kiyohara ISR_IRE | /* In Range Error */ 1029 1.36 kiyohara ISR_SE0 | /* Signal Quality Error 0 (SQE) */ 1030 1.36 kiyohara ISR_TE0 | /* Transmit Error 0 */ 1031 1.36 kiyohara ISR_MOS | /* MMA Operation Succeeded */ 1032 1.36 kiyohara ISR_MOF); /* MMA Operation Failed */ 1033 1.3 simonb 1034 1.3 simonb /* 1035 1.3 simonb * Enable the transmit and receive channel on the EMAC. 1036 1.3 simonb */ 1037 1.6 simonb EMAC_WRITE(sc, EMAC_MR0, MR0_TXE | MR0_RXE); 1038 1.3 simonb 1039 1.3 simonb /* 1040 1.3 simonb * Start the one second MII clock. 1041 1.3 simonb */ 1042 1.3 simonb callout_reset(&sc->sc_callout, hz, emac_mii_tick, sc); 1043 1.3 simonb 1044 1.3 simonb /* 1045 1.3 simonb * ... all done! 1046 1.3 simonb */ 1047 1.3 simonb ifp->if_flags |= IFF_RUNNING; 1048 1.3 simonb 1049 1.3 simonb out: 1050 1.3 simonb if (error) { 1051 1.57 thorpej ifp->if_flags &= ~IFF_RUNNING; 1052 1.3 simonb ifp->if_timer = 0; 1053 1.36 kiyohara aprint_error_ifnet(ifp, "interface not running\n"); 1054 1.3 simonb } 1055 1.36 kiyohara return error; 1056 1.3 simonb } 1057 1.3 simonb 1058 1.3 simonb static void 1059 1.3 simonb emac_stop(struct ifnet *ifp, int disable) 1060 1.3 simonb { 1061 1.3 simonb struct emac_softc *sc = ifp->if_softc; 1062 1.3 simonb struct emac_txsoft *txs; 1063 1.3 simonb int i; 1064 1.3 simonb 1065 1.3 simonb /* Stop the one second clock. */ 1066 1.3 simonb callout_stop(&sc->sc_callout); 1067 1.3 simonb 1068 1.3 simonb /* Down the MII */ 1069 1.3 simonb mii_down(&sc->sc_mii); 1070 1.3 simonb 1071 1.3 simonb /* Disable interrupts. */ 1072 1.6 simonb EMAC_WRITE(sc, EMAC_ISER, 0); 1073 1.3 simonb 1074 1.3 simonb /* Disable the receive and transmit channels. */ 1075 1.36 kiyohara mal_stop(sc->sc_instance); 1076 1.3 simonb 1077 1.3 simonb /* Disable the transmit enable and receive MACs. */ 1078 1.6 simonb EMAC_WRITE(sc, EMAC_MR0, 1079 1.6 simonb EMAC_READ(sc, EMAC_MR0) & ~(MR0_TXE | MR0_RXE)); 1080 1.3 simonb 1081 1.3 simonb /* Release any queued transmit buffers. */ 1082 1.3 simonb for (i = 0; i < EMAC_TXQUEUELEN; i++) { 1083 1.3 simonb txs = &sc->sc_txsoft[i]; 1084 1.3 simonb if (txs->txs_mbuf != NULL) { 1085 1.3 simonb bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 1086 1.3 simonb m_freem(txs->txs_mbuf); 1087 1.3 simonb txs->txs_mbuf = NULL; 1088 1.3 simonb } 1089 1.3 simonb } 1090 1.3 simonb 1091 1.3 simonb if (disable) 1092 1.3 simonb emac_rxdrain(sc); 1093 1.3 simonb 1094 1.3 simonb /* 1095 1.3 simonb * Mark the interface down and cancel the watchdog timer. 1096 1.3 simonb */ 1097 1.57 thorpej ifp->if_flags &= ~IFF_RUNNING; 1098 1.3 simonb ifp->if_timer = 0; 1099 1.3 simonb } 1100 1.3 simonb 1101 1.36 kiyohara static void 1102 1.36 kiyohara emac_watchdog(struct ifnet *ifp) 1103 1.3 simonb { 1104 1.3 simonb struct emac_softc *sc = ifp->if_softc; 1105 1.3 simonb 1106 1.36 kiyohara /* 1107 1.36 kiyohara * Since we're not interrupting every packet, sweep 1108 1.36 kiyohara * up before we report an error. 1109 1.36 kiyohara */ 1110 1.36 kiyohara emac_txreap(sc); 1111 1.36 kiyohara 1112 1.36 kiyohara if (sc->sc_txfree != EMAC_NTXDESC) { 1113 1.36 kiyohara aprint_error_ifnet(ifp, 1114 1.36 kiyohara "device timeout (txfree %d txsfree %d txnext %d)\n", 1115 1.36 kiyohara sc->sc_txfree, sc->sc_txsfree, sc->sc_txnext); 1116 1.52 thorpej if_statinc(ifp, if_oerrors); 1117 1.3 simonb 1118 1.36 kiyohara /* Reset the interface. */ 1119 1.36 kiyohara (void)emac_init(ifp); 1120 1.36 kiyohara } else if (ifp->if_flags & IFF_DEBUG) 1121 1.36 kiyohara aprint_error_ifnet(ifp, "recovered from device timeout\n"); 1122 1.3 simonb 1123 1.3 simonb /* try to get more packets going */ 1124 1.3 simonb emac_start(ifp); 1125 1.3 simonb } 1126 1.3 simonb 1127 1.36 kiyohara static int 1128 1.36 kiyohara emac_add_rxbuf(struct emac_softc *sc, int idx) 1129 1.3 simonb { 1130 1.36 kiyohara struct emac_rxsoft *rxs = &sc->sc_rxsoft[idx]; 1131 1.36 kiyohara struct mbuf *m; 1132 1.36 kiyohara int error; 1133 1.36 kiyohara 1134 1.36 kiyohara MGETHDR(m, M_DONTWAIT, MT_DATA); 1135 1.36 kiyohara if (m == NULL) 1136 1.36 kiyohara return ENOBUFS; 1137 1.36 kiyohara 1138 1.36 kiyohara MCLGET(m, M_DONTWAIT); 1139 1.36 kiyohara if ((m->m_flags & M_EXT) == 0) { 1140 1.36 kiyohara m_freem(m); 1141 1.36 kiyohara return ENOBUFS; 1142 1.36 kiyohara } 1143 1.3 simonb 1144 1.36 kiyohara if (rxs->rxs_mbuf != NULL) 1145 1.36 kiyohara bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 1146 1.36 kiyohara 1147 1.36 kiyohara rxs->rxs_mbuf = m; 1148 1.3 simonb 1149 1.36 kiyohara error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap, 1150 1.36 kiyohara m->m_ext.ext_buf, m->m_ext.ext_size, NULL, BUS_DMA_NOWAIT); 1151 1.36 kiyohara if (error) { 1152 1.36 kiyohara aprint_error_dev(sc->sc_dev, 1153 1.36 kiyohara "can't load rx DMA map %d, error = %d\n", idx, error); 1154 1.36 kiyohara panic("emac_add_rxbuf"); /* XXX */ 1155 1.36 kiyohara } 1156 1.3 simonb 1157 1.36 kiyohara bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1158 1.36 kiyohara rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 1159 1.3 simonb 1160 1.36 kiyohara EMAC_INIT_RXDESC(sc, idx); 1161 1.3 simonb 1162 1.36 kiyohara return 0; 1163 1.36 kiyohara } 1164 1.36 kiyohara 1165 1.36 kiyohara static void 1166 1.36 kiyohara emac_rxdrain(struct emac_softc *sc) 1167 1.36 kiyohara { 1168 1.36 kiyohara struct emac_rxsoft *rxs; 1169 1.36 kiyohara int i; 1170 1.36 kiyohara 1171 1.36 kiyohara for (i = 0; i < EMAC_NRXDESC; i++) { 1172 1.36 kiyohara rxs = &sc->sc_rxsoft[i]; 1173 1.36 kiyohara if (rxs->rxs_mbuf != NULL) { 1174 1.36 kiyohara bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 1175 1.36 kiyohara m_freem(rxs->rxs_mbuf); 1176 1.36 kiyohara rxs->rxs_mbuf = NULL; 1177 1.36 kiyohara } 1178 1.36 kiyohara } 1179 1.3 simonb } 1180 1.3 simonb 1181 1.18 simonb static int 1182 1.18 simonb emac_set_filter(struct emac_softc *sc) 1183 1.18 simonb { 1184 1.51 msaitoh struct ethercom *ec = &sc->sc_ethercom; 1185 1.18 simonb struct ether_multistep step; 1186 1.18 simonb struct ether_multi *enm; 1187 1.18 simonb struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1188 1.36 kiyohara uint32_t rmr, crc, mask, tmp, reg, gaht[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; 1189 1.36 kiyohara int regs, cnt = 0, i; 1190 1.36 kiyohara 1191 1.36 kiyohara if (sc->sc_htsize == 256) { 1192 1.36 kiyohara reg = EMAC_GAHT256(0); 1193 1.36 kiyohara regs = 8; 1194 1.36 kiyohara } else { 1195 1.36 kiyohara reg = EMAC_GAHT64(0); 1196 1.36 kiyohara regs = 4; 1197 1.36 kiyohara } 1198 1.36 kiyohara mask = (1ULL << (sc->sc_htsize / regs)) - 1; 1199 1.18 simonb 1200 1.18 simonb rmr = EMAC_READ(sc, EMAC_RMR); 1201 1.18 simonb rmr &= ~(RMR_PMME | RMR_MAE); 1202 1.18 simonb ifp->if_flags &= ~IFF_ALLMULTI; 1203 1.18 simonb 1204 1.51 msaitoh ETHER_LOCK(ec); 1205 1.51 msaitoh ETHER_FIRST_MULTI(step, ec, enm); 1206 1.18 simonb while (enm != NULL) { 1207 1.18 simonb if (memcmp(enm->enm_addrlo, 1208 1.18 simonb enm->enm_addrhi, ETHER_ADDR_LEN) != 0) { 1209 1.18 simonb /* 1210 1.18 simonb * We must listen to a range of multicast addresses. 1211 1.18 simonb * For now, just accept all multicasts, rather than 1212 1.18 simonb * trying to set only those filter bits needed to match 1213 1.18 simonb * the range. (At this time, the only use of address 1214 1.18 simonb * ranges is for IP multicast routing, for which the 1215 1.18 simonb * range is big enough to require all bits set.) 1216 1.18 simonb */ 1217 1.36 kiyohara gaht[0] = gaht[1] = gaht[2] = gaht[3] = 1218 1.36 kiyohara gaht[4] = gaht[5] = gaht[6] = gaht[7] = mask; 1219 1.18 simonb break; 1220 1.18 simonb } 1221 1.18 simonb 1222 1.18 simonb crc = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN); 1223 1.18 simonb 1224 1.36 kiyohara if (sc->sc_htsize == 256) 1225 1.36 kiyohara EMAC_SET_FILTER256(gaht, crc); 1226 1.36 kiyohara else 1227 1.36 kiyohara EMAC_SET_FILTER(gaht, crc); 1228 1.18 simonb 1229 1.18 simonb ETHER_NEXT_MULTI(step, enm); 1230 1.18 simonb cnt++; 1231 1.18 simonb } 1232 1.51 msaitoh ETHER_UNLOCK(ec); 1233 1.18 simonb 1234 1.36 kiyohara for (i = 1, tmp = gaht[0]; i < regs; i++) 1235 1.36 kiyohara tmp &= gaht[i]; 1236 1.36 kiyohara if (tmp == mask) { 1237 1.18 simonb /* All categories are true. */ 1238 1.18 simonb ifp->if_flags |= IFF_ALLMULTI; 1239 1.18 simonb rmr |= RMR_PMME; 1240 1.18 simonb } else if (cnt != 0) { 1241 1.18 simonb /* Some categories are true. */ 1242 1.36 kiyohara for (i = 0; i < regs; i++) 1243 1.36 kiyohara EMAC_WRITE(sc, reg + (i << 2), gaht[i]); 1244 1.18 simonb rmr |= RMR_MAE; 1245 1.18 simonb } 1246 1.18 simonb EMAC_WRITE(sc, EMAC_RMR, rmr); 1247 1.18 simonb 1248 1.18 simonb return 0; 1249 1.18 simonb } 1250 1.18 simonb 1251 1.3 simonb /* 1252 1.3 simonb * Reap completed Tx descriptors. 1253 1.3 simonb */ 1254 1.3 simonb static int 1255 1.3 simonb emac_txreap(struct emac_softc *sc) 1256 1.3 simonb { 1257 1.3 simonb struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1258 1.3 simonb struct emac_txsoft *txs; 1259 1.20 simonb int handled, i; 1260 1.54 rin uint32_t txstat, count; 1261 1.3 simonb 1262 1.3 simonb EMAC_EVCNT_INCR(&sc->sc_ev_txreap); 1263 1.20 simonb handled = 0; 1264 1.3 simonb 1265 1.54 rin count = 0; 1266 1.3 simonb /* 1267 1.3 simonb * Go through our Tx list and free mbufs for those 1268 1.3 simonb * frames that have been transmitted. 1269 1.3 simonb */ 1270 1.3 simonb for (i = sc->sc_txsdirty; sc->sc_txsfree != EMAC_TXQUEUELEN; 1271 1.3 simonb i = EMAC_NEXTTXS(i), sc->sc_txsfree++) { 1272 1.3 simonb txs = &sc->sc_txsoft[i]; 1273 1.3 simonb 1274 1.3 simonb EMAC_CDTXSYNC(sc, txs->txs_lastdesc, 1275 1.3 simonb txs->txs_dmamap->dm_nsegs, 1276 1.50 msaitoh BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 1277 1.3 simonb 1278 1.3 simonb txstat = sc->sc_txdescs[txs->txs_lastdesc].md_stat_ctrl; 1279 1.3 simonb if (txstat & MAL_TX_READY) 1280 1.3 simonb break; 1281 1.3 simonb 1282 1.20 simonb handled = 1; 1283 1.20 simonb 1284 1.3 simonb /* 1285 1.3 simonb * Check for errors and collisions. 1286 1.3 simonb */ 1287 1.3 simonb if (txstat & (EMAC_TXS_UR | EMAC_TXS_ED)) 1288 1.52 thorpej if_statinc(ifp, if_oerrors); 1289 1.3 simonb 1290 1.3 simonb #ifdef EMAC_EVENT_COUNTERS 1291 1.3 simonb if (txstat & EMAC_TXS_UR) 1292 1.3 simonb EMAC_EVCNT_INCR(&sc->sc_ev_tu); 1293 1.3 simonb #endif /* EMAC_EVENT_COUNTERS */ 1294 1.3 simonb 1295 1.36 kiyohara if (txstat & 1296 1.36 kiyohara (EMAC_TXS_EC | EMAC_TXS_MC | EMAC_TXS_SC | EMAC_TXS_LC)) { 1297 1.3 simonb if (txstat & EMAC_TXS_EC) 1298 1.52 thorpej if_statadd(ifp, if_collisions, 16); 1299 1.3 simonb else if (txstat & EMAC_TXS_MC) 1300 1.52 thorpej if_statadd(ifp, if_collisions, 2); /* XXX? */ 1301 1.3 simonb else if (txstat & EMAC_TXS_SC) 1302 1.52 thorpej if_statinc(ifp, if_collisions); 1303 1.3 simonb if (txstat & EMAC_TXS_LC) 1304 1.52 thorpej if_statinc(ifp, if_collisions); 1305 1.3 simonb } else 1306 1.52 thorpej if_statinc(ifp, if_opackets); 1307 1.3 simonb 1308 1.3 simonb if (ifp->if_flags & IFF_DEBUG) { 1309 1.3 simonb if (txstat & EMAC_TXS_ED) 1310 1.36 kiyohara aprint_error_ifnet(ifp, "excessive deferral\n"); 1311 1.3 simonb if (txstat & EMAC_TXS_EC) 1312 1.36 kiyohara aprint_error_ifnet(ifp, 1313 1.36 kiyohara "excessive collisions\n"); 1314 1.3 simonb } 1315 1.3 simonb 1316 1.3 simonb sc->sc_txfree += txs->txs_ndesc; 1317 1.3 simonb bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap, 1318 1.3 simonb 0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE); 1319 1.3 simonb bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 1320 1.3 simonb m_freem(txs->txs_mbuf); 1321 1.3 simonb txs->txs_mbuf = NULL; 1322 1.54 rin 1323 1.54 rin count++; 1324 1.3 simonb } 1325 1.3 simonb 1326 1.3 simonb /* Update the dirty transmit buffer pointer. */ 1327 1.3 simonb sc->sc_txsdirty = i; 1328 1.3 simonb 1329 1.3 simonb /* 1330 1.3 simonb * If there are no more pending transmissions, cancel the watchdog 1331 1.3 simonb * timer. 1332 1.3 simonb */ 1333 1.3 simonb if (sc->sc_txsfree == EMAC_TXQUEUELEN) 1334 1.3 simonb ifp->if_timer = 0; 1335 1.3 simonb 1336 1.54 rin if (count != 0) 1337 1.54 rin rnd_add_uint32(&sc->rnd_source, count); 1338 1.54 rin 1339 1.36 kiyohara return handled; 1340 1.36 kiyohara } 1341 1.36 kiyohara 1342 1.36 kiyohara 1343 1.36 kiyohara /* 1344 1.36 kiyohara * Reset functions 1345 1.36 kiyohara */ 1346 1.36 kiyohara 1347 1.36 kiyohara static void 1348 1.36 kiyohara emac_soft_reset(struct emac_softc *sc) 1349 1.36 kiyohara { 1350 1.36 kiyohara uint32_t sdr; 1351 1.36 kiyohara int t = 0; 1352 1.36 kiyohara 1353 1.36 kiyohara /* 1354 1.36 kiyohara * The PHY must provide a TX Clk in order perform a soft reset the 1355 1.36 kiyohara * EMAC. If none is present, select the internal clock, 1356 1.50 msaitoh * SDR0_MFR[E0CS, E1CS]. After the soft reset, select the external 1357 1.36 kiyohara * clock. 1358 1.36 kiyohara */ 1359 1.36 kiyohara 1360 1.36 kiyohara sdr = mfsdr(DCR_SDR0_MFR); 1361 1.36 kiyohara sdr |= SDR0_MFR_ECS(sc->sc_instance); 1362 1.36 kiyohara mtsdr(DCR_SDR0_MFR, sdr); 1363 1.36 kiyohara 1364 1.36 kiyohara EMAC_WRITE(sc, EMAC_MR0, MR0_SRST); 1365 1.36 kiyohara 1366 1.36 kiyohara sdr = mfsdr(DCR_SDR0_MFR); 1367 1.36 kiyohara sdr &= ~SDR0_MFR_ECS(sc->sc_instance); 1368 1.36 kiyohara mtsdr(DCR_SDR0_MFR, sdr); 1369 1.36 kiyohara 1370 1.36 kiyohara delay(5); 1371 1.36 kiyohara 1372 1.36 kiyohara /* wait finish */ 1373 1.36 kiyohara while (EMAC_READ(sc, EMAC_MR0) & MR0_SRST) { 1374 1.36 kiyohara if (++t == 1000000 /* 1sec XXXXX */) { 1375 1.36 kiyohara aprint_error_dev(sc->sc_dev, "Soft Reset failed\n"); 1376 1.36 kiyohara return; 1377 1.36 kiyohara } 1378 1.36 kiyohara delay(1); 1379 1.36 kiyohara } 1380 1.36 kiyohara } 1381 1.36 kiyohara 1382 1.36 kiyohara static void 1383 1.36 kiyohara emac_smart_reset(struct emac_softc *sc) 1384 1.36 kiyohara { 1385 1.36 kiyohara uint32_t mr0; 1386 1.36 kiyohara int t = 0; 1387 1.36 kiyohara 1388 1.36 kiyohara mr0 = EMAC_READ(sc, EMAC_MR0); 1389 1.36 kiyohara if (mr0 & (MR0_TXE | MR0_RXE)) { 1390 1.36 kiyohara mr0 &= ~(MR0_TXE | MR0_RXE); 1391 1.36 kiyohara EMAC_WRITE(sc, EMAC_MR0, mr0); 1392 1.36 kiyohara 1393 1.36 kiyohara /* wait idel state */ 1394 1.36 kiyohara while ((EMAC_READ(sc, EMAC_MR0) & (MR0_TXI | MR0_RXI)) != 1395 1.36 kiyohara (MR0_TXI | MR0_RXI)) { 1396 1.36 kiyohara if (++t == 1000000 /* 1sec XXXXX */) { 1397 1.36 kiyohara aprint_error_dev(sc->sc_dev, 1398 1.36 kiyohara "Smart Reset failed\n"); 1399 1.36 kiyohara return; 1400 1.36 kiyohara } 1401 1.36 kiyohara delay(1); 1402 1.36 kiyohara } 1403 1.36 kiyohara } 1404 1.3 simonb } 1405 1.3 simonb 1406 1.36 kiyohara 1407 1.3 simonb /* 1408 1.36 kiyohara * MII related functions 1409 1.3 simonb */ 1410 1.36 kiyohara 1411 1.3 simonb static int 1412 1.49 msaitoh emac_mii_readreg(device_t self, int phy, int reg, uint16_t *val) 1413 1.36 kiyohara { 1414 1.36 kiyohara struct emac_softc *sc = device_private(self); 1415 1.36 kiyohara uint32_t sta_reg; 1416 1.49 msaitoh int rv; 1417 1.36 kiyohara 1418 1.36 kiyohara if (sc->sc_rmii_enable) 1419 1.36 kiyohara sc->sc_rmii_enable(device_parent(self), sc->sc_instance); 1420 1.36 kiyohara 1421 1.36 kiyohara /* wait for PHY data transfer to complete */ 1422 1.49 msaitoh if ((rv = emac_mii_wait(sc)) != 0) 1423 1.36 kiyohara goto fail; 1424 1.36 kiyohara 1425 1.36 kiyohara sta_reg = 1426 1.36 kiyohara sc->sc_stacr_read | 1427 1.36 kiyohara (reg << STACR_PRA_SHIFT) | 1428 1.36 kiyohara (phy << STACR_PCDA_SHIFT) | 1429 1.36 kiyohara sc->sc_stacr_bits; 1430 1.36 kiyohara EMAC_WRITE(sc, EMAC_STACR, sta_reg); 1431 1.36 kiyohara 1432 1.49 msaitoh if ((rv = emac_mii_wait(sc)) != 0) 1433 1.36 kiyohara goto fail; 1434 1.36 kiyohara sta_reg = EMAC_READ(sc, EMAC_STACR); 1435 1.36 kiyohara 1436 1.49 msaitoh if (sta_reg & STACR_PHYE) { 1437 1.49 msaitoh rv = -1; 1438 1.49 msaitoh goto fail; 1439 1.49 msaitoh } 1440 1.49 msaitoh *val = sta_reg >> STACR_PHYD_SHIFT; 1441 1.36 kiyohara 1442 1.36 kiyohara fail: 1443 1.36 kiyohara if (sc->sc_rmii_disable) 1444 1.36 kiyohara sc->sc_rmii_disable(device_parent(self), sc->sc_instance); 1445 1.49 msaitoh return rv; 1446 1.36 kiyohara } 1447 1.36 kiyohara 1448 1.49 msaitoh static int 1449 1.49 msaitoh emac_mii_writereg(device_t self, int phy, int reg, uint16_t val) 1450 1.36 kiyohara { 1451 1.36 kiyohara struct emac_softc *sc = device_private(self); 1452 1.36 kiyohara uint32_t sta_reg; 1453 1.49 msaitoh int rv; 1454 1.36 kiyohara 1455 1.36 kiyohara if (sc->sc_rmii_enable) 1456 1.36 kiyohara sc->sc_rmii_enable(device_parent(self), sc->sc_instance); 1457 1.36 kiyohara 1458 1.36 kiyohara /* wait for PHY data transfer to complete */ 1459 1.49 msaitoh if ((rv = emac_mii_wait(sc)) != 0) 1460 1.36 kiyohara goto out; 1461 1.36 kiyohara 1462 1.36 kiyohara sta_reg = 1463 1.36 kiyohara (val << STACR_PHYD_SHIFT) | 1464 1.36 kiyohara sc->sc_stacr_write | 1465 1.36 kiyohara (reg << STACR_PRA_SHIFT) | 1466 1.36 kiyohara (phy << STACR_PCDA_SHIFT) | 1467 1.36 kiyohara sc->sc_stacr_bits; 1468 1.36 kiyohara EMAC_WRITE(sc, EMAC_STACR, sta_reg); 1469 1.36 kiyohara 1470 1.49 msaitoh if ((rv = emac_mii_wait(sc)) != 0) 1471 1.36 kiyohara goto out; 1472 1.49 msaitoh if (EMAC_READ(sc, EMAC_STACR) & STACR_PHYE) { 1473 1.36 kiyohara aprint_error_dev(sc->sc_dev, "MII PHY Error\n"); 1474 1.49 msaitoh rv = -1; 1475 1.49 msaitoh } 1476 1.36 kiyohara 1477 1.36 kiyohara out: 1478 1.36 kiyohara if (sc->sc_rmii_disable) 1479 1.36 kiyohara sc->sc_rmii_disable(device_parent(self), sc->sc_instance); 1480 1.49 msaitoh 1481 1.49 msaitoh return rv; 1482 1.36 kiyohara } 1483 1.36 kiyohara 1484 1.36 kiyohara static void 1485 1.41 matt emac_mii_statchg(struct ifnet *ifp) 1486 1.36 kiyohara { 1487 1.41 matt struct emac_softc *sc = ifp->if_softc; 1488 1.36 kiyohara struct mii_data *mii = &sc->sc_mii; 1489 1.36 kiyohara 1490 1.36 kiyohara /* 1491 1.36 kiyohara * MR1 can only be written immediately after a reset... 1492 1.36 kiyohara */ 1493 1.36 kiyohara emac_smart_reset(sc); 1494 1.36 kiyohara 1495 1.36 kiyohara sc->sc_mr1 &= ~(MR1_FDE | MR1_ILE | MR1_EIFC | MR1_MF_MASK | MR1_IST); 1496 1.36 kiyohara if (mii->mii_media_active & IFM_FDX) 1497 1.36 kiyohara sc->sc_mr1 |= (MR1_FDE | MR1_EIFC | MR1_IST); 1498 1.36 kiyohara if (mii->mii_media_active & IFM_FLOW) 1499 1.36 kiyohara sc->sc_mr1 |= MR1_EIFC; 1500 1.36 kiyohara if (mii->mii_media_active & IFM_LOOP) 1501 1.36 kiyohara sc->sc_mr1 |= MR1_ILE; 1502 1.36 kiyohara switch (IFM_SUBTYPE(mii->mii_media_active)) { 1503 1.36 kiyohara case IFM_1000_T: 1504 1.36 kiyohara sc->sc_mr1 |= (MR1_MF_1000MBS | MR1_IST); 1505 1.36 kiyohara break; 1506 1.36 kiyohara 1507 1.36 kiyohara case IFM_100_TX: 1508 1.36 kiyohara sc->sc_mr1 |= (MR1_MF_100MBS | MR1_IST); 1509 1.36 kiyohara break; 1510 1.36 kiyohara 1511 1.36 kiyohara case IFM_10_T: 1512 1.36 kiyohara sc->sc_mr1 |= MR1_MF_10MBS; 1513 1.36 kiyohara break; 1514 1.36 kiyohara 1515 1.36 kiyohara case IFM_NONE: 1516 1.36 kiyohara break; 1517 1.36 kiyohara 1518 1.36 kiyohara default: 1519 1.41 matt aprint_error_dev(sc->sc_dev, "unknown sub-type %d\n", 1520 1.36 kiyohara IFM_SUBTYPE(mii->mii_media_active)); 1521 1.36 kiyohara break; 1522 1.36 kiyohara } 1523 1.36 kiyohara if (sc->sc_rmii_speed) 1524 1.41 matt sc->sc_rmii_speed(device_parent(sc->sc_dev), sc->sc_instance, 1525 1.36 kiyohara IFM_SUBTYPE(mii->mii_media_active)); 1526 1.36 kiyohara 1527 1.36 kiyohara EMAC_WRITE(sc, EMAC_MR1, sc->sc_mr1); 1528 1.36 kiyohara 1529 1.36 kiyohara /* Enable TX and RX if already RUNNING */ 1530 1.36 kiyohara if (ifp->if_flags & IFF_RUNNING) 1531 1.36 kiyohara EMAC_WRITE(sc, EMAC_MR0, MR0_TXE | MR0_RXE); 1532 1.36 kiyohara } 1533 1.36 kiyohara 1534 1.36 kiyohara static uint32_t 1535 1.36 kiyohara emac_mii_wait(struct emac_softc *sc) 1536 1.36 kiyohara { 1537 1.36 kiyohara int i; 1538 1.36 kiyohara uint32_t oc; 1539 1.36 kiyohara 1540 1.36 kiyohara /* wait for PHY data transfer to complete */ 1541 1.36 kiyohara i = 0; 1542 1.36 kiyohara oc = EMAC_READ(sc, EMAC_STACR) & STACR_OC; 1543 1.36 kiyohara while ((oc == STACR_OC) != sc->sc_stacr_completed) { 1544 1.36 kiyohara delay(7); 1545 1.36 kiyohara if (i++ > 5) { 1546 1.36 kiyohara aprint_error_dev(sc->sc_dev, "MII timed out\n"); 1547 1.49 msaitoh return ETIMEDOUT; 1548 1.36 kiyohara } 1549 1.36 kiyohara oc = EMAC_READ(sc, EMAC_STACR) & STACR_OC; 1550 1.36 kiyohara } 1551 1.36 kiyohara return 0; 1552 1.36 kiyohara } 1553 1.36 kiyohara 1554 1.36 kiyohara static void 1555 1.36 kiyohara emac_mii_tick(void *arg) 1556 1.36 kiyohara { 1557 1.36 kiyohara struct emac_softc *sc = arg; 1558 1.36 kiyohara int s; 1559 1.36 kiyohara 1560 1.36 kiyohara if (!device_is_active(sc->sc_dev)) 1561 1.36 kiyohara return; 1562 1.36 kiyohara 1563 1.36 kiyohara s = splnet(); 1564 1.36 kiyohara mii_tick(&sc->sc_mii); 1565 1.36 kiyohara splx(s); 1566 1.36 kiyohara 1567 1.36 kiyohara callout_reset(&sc->sc_callout, hz, emac_mii_tick, sc); 1568 1.36 kiyohara } 1569 1.36 kiyohara 1570 1.36 kiyohara int 1571 1.36 kiyohara emac_txeob_intr(void *arg) 1572 1.36 kiyohara { 1573 1.36 kiyohara struct emac_softc *sc = arg; 1574 1.36 kiyohara int handled = 0; 1575 1.36 kiyohara 1576 1.36 kiyohara EMAC_EVCNT_INCR(&sc->sc_ev_txintr); 1577 1.36 kiyohara handled |= emac_txreap(sc); 1578 1.36 kiyohara 1579 1.36 kiyohara /* try to get more packets going */ 1580 1.46 ozaki if_schedule_deferred_start(&sc->sc_ethercom.ec_if); 1581 1.36 kiyohara 1582 1.36 kiyohara return handled; 1583 1.36 kiyohara } 1584 1.36 kiyohara 1585 1.36 kiyohara int 1586 1.3 simonb emac_rxeob_intr(void *arg) 1587 1.3 simonb { 1588 1.3 simonb struct emac_softc *sc = arg; 1589 1.3 simonb struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1590 1.3 simonb struct emac_rxsoft *rxs; 1591 1.3 simonb struct mbuf *m; 1592 1.54 rin uint32_t rxstat, count; 1593 1.3 simonb int i, len; 1594 1.3 simonb 1595 1.3 simonb EMAC_EVCNT_INCR(&sc->sc_ev_rxintr); 1596 1.3 simonb 1597 1.54 rin count = 0; 1598 1.36 kiyohara for (i = sc->sc_rxptr; ; i = EMAC_NEXTRX(i)) { 1599 1.3 simonb rxs = &sc->sc_rxsoft[i]; 1600 1.3 simonb 1601 1.3 simonb EMAC_CDRXSYNC(sc, i, 1602 1.50 msaitoh BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 1603 1.3 simonb 1604 1.3 simonb rxstat = sc->sc_rxdescs[i].md_stat_ctrl; 1605 1.3 simonb 1606 1.40 kiyohara if (rxstat & MAL_RX_EMPTY) { 1607 1.3 simonb /* 1608 1.3 simonb * We have processed all of the receive buffers. 1609 1.3 simonb */ 1610 1.40 kiyohara /* Flush current empty descriptor */ 1611 1.40 kiyohara EMAC_CDRXSYNC(sc, i, 1612 1.50 msaitoh BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1613 1.3 simonb break; 1614 1.40 kiyohara } 1615 1.3 simonb 1616 1.3 simonb /* 1617 1.3 simonb * If an error occurred, update stats, clear the status 1618 1.3 simonb * word, and leave the packet buffer in place. It will 1619 1.3 simonb * simply be reused the next time the ring comes around. 1620 1.3 simonb */ 1621 1.3 simonb if (rxstat & (EMAC_RXS_OE | EMAC_RXS_BP | EMAC_RXS_SE | 1622 1.3 simonb EMAC_RXS_AE | EMAC_RXS_BFCS | EMAC_RXS_PTL | EMAC_RXS_ORE | 1623 1.3 simonb EMAC_RXS_IRE)) { 1624 1.36 kiyohara #define PRINTERR(bit, str) \ 1625 1.36 kiyohara if (rxstat & (bit)) \ 1626 1.36 kiyohara aprint_error_ifnet(ifp, \ 1627 1.36 kiyohara "receive error: %s\n", str) 1628 1.52 thorpej if_statinc(ifp, if_ierrors); 1629 1.3 simonb PRINTERR(EMAC_RXS_OE, "overrun error"); 1630 1.3 simonb PRINTERR(EMAC_RXS_BP, "bad packet"); 1631 1.3 simonb PRINTERR(EMAC_RXS_RP, "runt packet"); 1632 1.3 simonb PRINTERR(EMAC_RXS_SE, "short event"); 1633 1.3 simonb PRINTERR(EMAC_RXS_AE, "alignment error"); 1634 1.3 simonb PRINTERR(EMAC_RXS_BFCS, "bad FCS"); 1635 1.3 simonb PRINTERR(EMAC_RXS_PTL, "packet too long"); 1636 1.3 simonb PRINTERR(EMAC_RXS_ORE, "out of range error"); 1637 1.3 simonb PRINTERR(EMAC_RXS_IRE, "in range error"); 1638 1.3 simonb #undef PRINTERR 1639 1.3 simonb EMAC_INIT_RXDESC(sc, i); 1640 1.3 simonb continue; 1641 1.3 simonb } 1642 1.3 simonb 1643 1.3 simonb bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1644 1.3 simonb rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); 1645 1.3 simonb 1646 1.3 simonb /* 1647 1.3 simonb * No errors; receive the packet. Note, the 405GP emac 1648 1.3 simonb * includes the CRC with every packet. 1649 1.3 simonb */ 1650 1.22 thorpej len = sc->sc_rxdescs[i].md_data_len - ETHER_CRC_LEN; 1651 1.3 simonb 1652 1.3 simonb /* 1653 1.3 simonb * If the packet is small enough to fit in a 1654 1.3 simonb * single header mbuf, allocate one and copy 1655 1.3 simonb * the data into it. This greatly reduces 1656 1.3 simonb * memory consumption when we receive lots 1657 1.3 simonb * of small packets. 1658 1.3 simonb * 1659 1.3 simonb * Otherwise, we add a new buffer to the receive 1660 1.3 simonb * chain. If this fails, we drop the packet and 1661 1.3 simonb * recycle the old buffer. 1662 1.3 simonb */ 1663 1.3 simonb if (emac_copy_small != 0 && len <= MHLEN) { 1664 1.3 simonb MGETHDR(m, M_DONTWAIT, MT_DATA); 1665 1.3 simonb if (m == NULL) 1666 1.3 simonb goto dropit; 1667 1.28 christos memcpy(mtod(m, void *), 1668 1.28 christos mtod(rxs->rxs_mbuf, void *), len); 1669 1.3 simonb EMAC_INIT_RXDESC(sc, i); 1670 1.3 simonb bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1671 1.3 simonb rxs->rxs_dmamap->dm_mapsize, 1672 1.3 simonb BUS_DMASYNC_PREREAD); 1673 1.3 simonb } else { 1674 1.3 simonb m = rxs->rxs_mbuf; 1675 1.3 simonb if (emac_add_rxbuf(sc, i) != 0) { 1676 1.3 simonb dropit: 1677 1.52 thorpej if_statinc(ifp, if_ierrors); 1678 1.3 simonb EMAC_INIT_RXDESC(sc, i); 1679 1.3 simonb bus_dmamap_sync(sc->sc_dmat, 1680 1.3 simonb rxs->rxs_dmamap, 0, 1681 1.3 simonb rxs->rxs_dmamap->dm_mapsize, 1682 1.3 simonb BUS_DMASYNC_PREREAD); 1683 1.3 simonb continue; 1684 1.3 simonb } 1685 1.3 simonb } 1686 1.3 simonb 1687 1.45 ozaki m_set_rcvif(m, ifp); 1688 1.3 simonb m->m_pkthdr.len = m->m_len = len; 1689 1.3 simonb 1690 1.3 simonb /* Pass it on. */ 1691 1.44 ozaki if_percpuq_enqueue(ifp->if_percpuq, m); 1692 1.54 rin 1693 1.54 rin count++; 1694 1.3 simonb } 1695 1.3 simonb 1696 1.3 simonb /* Update the receive pointer. */ 1697 1.3 simonb sc->sc_rxptr = i; 1698 1.3 simonb 1699 1.54 rin if (count != 0) 1700 1.54 rin rnd_add_uint32(&sc->rnd_source, count); 1701 1.54 rin 1702 1.36 kiyohara return 1; 1703 1.3 simonb } 1704 1.3 simonb 1705 1.36 kiyohara int 1706 1.3 simonb emac_txde_intr(void *arg) 1707 1.3 simonb { 1708 1.3 simonb struct emac_softc *sc = arg; 1709 1.3 simonb 1710 1.3 simonb EMAC_EVCNT_INCR(&sc->sc_ev_txde); 1711 1.36 kiyohara aprint_error_dev(sc->sc_dev, "emac_txde_intr\n"); 1712 1.36 kiyohara return 1; 1713 1.3 simonb } 1714 1.3 simonb 1715 1.36 kiyohara int 1716 1.3 simonb emac_rxde_intr(void *arg) 1717 1.3 simonb { 1718 1.36 kiyohara struct emac_softc *sc = arg; 1719 1.3 simonb int i; 1720 1.3 simonb 1721 1.3 simonb EMAC_EVCNT_INCR(&sc->sc_ev_rxde); 1722 1.36 kiyohara aprint_error_dev(sc->sc_dev, "emac_rxde_intr\n"); 1723 1.3 simonb /* 1724 1.3 simonb * XXX! 1725 1.3 simonb * This is a bit drastic; we just drop all descriptors that aren't 1726 1.3 simonb * "clean". We should probably send any that are up the stack. 1727 1.3 simonb */ 1728 1.3 simonb for (i = 0; i < EMAC_NRXDESC; i++) { 1729 1.36 kiyohara EMAC_CDRXSYNC(sc, i, 1730 1.36 kiyohara BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 1731 1.3 simonb 1732 1.36 kiyohara if (sc->sc_rxdescs[i].md_data_len != MCLBYTES) 1733 1.3 simonb EMAC_INIT_RXDESC(sc, i); 1734 1.3 simonb } 1735 1.3 simonb 1736 1.36 kiyohara return 1; 1737 1.3 simonb } 1738