1 1.80 riastrad /* $NetBSD: qe.c,v 1.80 2024/06/29 12:11:12 riastradh Exp $ */ 2 1.1 pk 3 1.1 pk /*- 4 1.1 pk * Copyright (c) 1999 The NetBSD Foundation, Inc. 5 1.1 pk * All rights reserved. 6 1.1 pk * 7 1.1 pk * This code is derived from software contributed to The NetBSD Foundation 8 1.1 pk * by Paul Kranenburg. 9 1.1 pk * 10 1.1 pk * Redistribution and use in source and binary forms, with or without 11 1.1 pk * modification, are permitted provided that the following conditions 12 1.1 pk * are met: 13 1.1 pk * 1. Redistributions of source code must retain the above copyright 14 1.1 pk * notice, this list of conditions and the following disclaimer. 15 1.1 pk * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 pk * notice, this list of conditions and the following disclaimer in the 17 1.1 pk * documentation and/or other materials provided with the distribution. 18 1.1 pk * 19 1.1 pk * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 pk * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 pk * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 pk * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 pk * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 pk * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 pk * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 pk * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 pk * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 pk * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 pk * POSSIBILITY OF SUCH DAMAGE. 30 1.1 pk */ 31 1.1 pk 32 1.1 pk /* 33 1.1 pk * Copyright (c) 1998 Jason L. Wright. 34 1.1 pk * All rights reserved. 35 1.1 pk * 36 1.1 pk * Redistribution and use in source and binary forms, with or without 37 1.1 pk * modification, are permitted provided that the following conditions 38 1.1 pk * are met: 39 1.1 pk * 1. Redistributions of source code must retain the above copyright 40 1.1 pk * notice, this list of conditions and the following disclaimer. 41 1.1 pk * 2. Redistributions in binary form must reproduce the above copyright 42 1.1 pk * notice, this list of conditions and the following disclaimer in the 43 1.1 pk * documentation and/or other materials provided with the distribution. 44 1.1 pk * 3. The name of the authors may not be used to endorse or promote products 45 1.1 pk * derived from this software without specific prior written permission. 46 1.1 pk * 47 1.1 pk * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 48 1.1 pk * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 49 1.1 pk * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 50 1.1 pk * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 51 1.1 pk * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 52 1.1 pk * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 53 1.1 pk * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 54 1.1 pk * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 55 1.1 pk * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 56 1.1 pk * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 57 1.1 pk */ 58 1.1 pk 59 1.1 pk /* 60 1.1 pk * Driver for the SBus qec+qe QuadEthernet board. 61 1.1 pk * 62 1.1 pk * This driver was written using the AMD MACE Am79C940 documentation, some 63 1.1 pk * ideas gleaned from the S/Linux driver for this card, Solaris header files, 64 1.1 pk * and a loan of a card from Paul Southworth of the Internet Engineering 65 1.1 pk * Group (www.ieng.com). 66 1.1 pk */ 67 1.19 lukem 68 1.19 lukem #include <sys/cdefs.h> 69 1.80 riastrad __KERNEL_RCSID(0, "$NetBSD: qe.c,v 1.80 2024/06/29 12:11:12 riastradh Exp $"); 70 1.1 pk 71 1.7 pk #define QEDEBUG 72 1.7 pk 73 1.1 pk #include "opt_ddb.h" 74 1.1 pk #include "opt_inet.h" 75 1.1 pk 76 1.1 pk #include <sys/param.h> 77 1.1 pk #include <sys/systm.h> 78 1.1 pk #include <sys/kernel.h> 79 1.1 pk #include <sys/errno.h> 80 1.1 pk #include <sys/ioctl.h> 81 1.1 pk #include <sys/mbuf.h> 82 1.1 pk #include <sys/socket.h> 83 1.1 pk #include <sys/syslog.h> 84 1.1 pk #include <sys/device.h> 85 1.1 pk 86 1.1 pk #include <net/if.h> 87 1.1 pk #include <net/if_dl.h> 88 1.1 pk #include <net/if_types.h> 89 1.1 pk #include <net/if_media.h> 90 1.1 pk #include <net/if_ether.h> 91 1.68 msaitoh #include <net/bpf.h> 92 1.1 pk 93 1.1 pk #ifdef INET 94 1.1 pk #include <netinet/in.h> 95 1.1 pk #include <netinet/if_inarp.h> 96 1.1 pk #include <netinet/in_systm.h> 97 1.1 pk #include <netinet/in_var.h> 98 1.1 pk #include <netinet/ip.h> 99 1.1 pk #endif 100 1.1 pk 101 1.43 ad #include <sys/bus.h> 102 1.43 ad #include <sys/intr.h> 103 1.1 pk #include <machine/autoconf.h> 104 1.1 pk 105 1.3 mrg #include <dev/sbus/sbusvar.h> 106 1.1 pk #include <dev/sbus/qecreg.h> 107 1.1 pk #include <dev/sbus/qecvar.h> 108 1.1 pk #include <dev/sbus/qereg.h> 109 1.1 pk 110 1.1 pk struct qe_softc { 111 1.59 mrg device_t sc_dev; 112 1.30 wiz bus_space_tag_t sc_bustag; /* bus & DMA tags */ 113 1.1 pk bus_dma_tag_t sc_dmatag; 114 1.8 pk bus_dmamap_t sc_dmamap; 115 1.1 pk struct ethercom sc_ethercom; 116 1.1 pk struct ifmedia sc_ifmedia; /* interface media */ 117 1.1 pk 118 1.1 pk struct qec_softc *sc_qec; /* QEC parent */ 119 1.1 pk 120 1.1 pk bus_space_handle_t sc_qr; /* QEC registers */ 121 1.1 pk bus_space_handle_t sc_mr; /* MACE registers */ 122 1.1 pk bus_space_handle_t sc_cr; /* channel registers */ 123 1.1 pk 124 1.1 pk int sc_channel; /* channel number */ 125 1.1 pk u_int sc_rev; /* board revision */ 126 1.1 pk 127 1.1 pk int sc_burst; 128 1.1 pk 129 1.1 pk struct qec_ring sc_rb; /* Packet Ring Buffer */ 130 1.1 pk 131 1.1 pk /* MAC address */ 132 1.55 tsutsui uint8_t sc_enaddr[6]; 133 1.7 pk 134 1.7 pk #ifdef QEDEBUG 135 1.7 pk int sc_debug; 136 1.7 pk #endif 137 1.1 pk }; 138 1.1 pk 139 1.51 cegger int qematch(device_t, cfdata_t, void *); 140 1.51 cegger void qeattach(device_t, device_t, void *); 141 1.1 pk 142 1.34 perry void qeinit(struct qe_softc *); 143 1.34 perry void qestart(struct ifnet *); 144 1.34 perry void qestop(struct qe_softc *); 145 1.34 perry void qewatchdog(struct ifnet *); 146 1.40 christos int qeioctl(struct ifnet *, u_long, void *); 147 1.34 perry void qereset(struct qe_softc *); 148 1.34 perry 149 1.34 perry int qeintr(void *); 150 1.55 tsutsui int qe_eint(struct qe_softc *, uint32_t); 151 1.34 perry int qe_rint(struct qe_softc *); 152 1.34 perry int qe_tint(struct qe_softc *); 153 1.34 perry void qe_mcreset(struct qe_softc *); 154 1.34 perry 155 1.34 perry static int qe_put(struct qe_softc *, int, struct mbuf *); 156 1.34 perry static void qe_read(struct qe_softc *, int, int); 157 1.34 perry static struct mbuf *qe_get(struct qe_softc *, int, int); 158 1.1 pk 159 1.1 pk /* ifmedia callbacks */ 160 1.34 perry void qe_ifmedia_sts(struct ifnet *, struct ifmediareq *); 161 1.34 perry int qe_ifmedia_upd(struct ifnet *); 162 1.1 pk 163 1.59 mrg CFATTACH_DECL_NEW(qe, sizeof(struct qe_softc), 164 1.28 thorpej qematch, qeattach, NULL, NULL); 165 1.1 pk 166 1.1 pk int 167 1.51 cegger qematch(device_t parent, cfdata_t cf, void *aux) 168 1.1 pk { 169 1.1 pk struct sbus_attach_args *sa = aux; 170 1.1 pk 171 1.25 thorpej return (strcmp(cf->cf_name, sa->sa_name) == 0); 172 1.1 pk } 173 1.1 pk 174 1.1 pk void 175 1.51 cegger qeattach(device_t parent, device_t self, void *aux) 176 1.1 pk { 177 1.1 pk struct sbus_attach_args *sa = aux; 178 1.53 tsutsui struct qec_softc *qec = device_private(parent); 179 1.53 tsutsui struct qe_softc *sc = device_private(self); 180 1.1 pk struct ifnet *ifp = &sc->sc_ethercom.ec_if; 181 1.1 pk int node = sa->sa_node; 182 1.8 pk bus_dma_tag_t dmatag = sa->sa_dmatag; 183 1.1 pk bus_dma_segment_t seg; 184 1.1 pk bus_size_t size; 185 1.1 pk int rseg, error; 186 1.1 pk 187 1.59 mrg sc->sc_dev = self; 188 1.59 mrg 189 1.1 pk if (sa->sa_nreg < 2) { 190 1.1 pk printf("%s: only %d register sets\n", 191 1.44 cegger device_xname(self), sa->sa_nreg); 192 1.1 pk return; 193 1.1 pk } 194 1.1 pk 195 1.21 pk if (bus_space_map(sa->sa_bustag, 196 1.21 pk (bus_addr_t)BUS_ADDR( 197 1.24 thorpej sa->sa_reg[0].oa_space, 198 1.24 thorpej sa->sa_reg[0].oa_base), 199 1.24 thorpej (bus_size_t)sa->sa_reg[0].oa_size, 200 1.22 eeh 0, &sc->sc_cr) != 0) { 201 1.44 cegger aprint_error_dev(self, "cannot map registers\n"); 202 1.1 pk return; 203 1.1 pk } 204 1.1 pk 205 1.21 pk if (bus_space_map(sa->sa_bustag, 206 1.21 pk (bus_addr_t)BUS_ADDR( 207 1.24 thorpej sa->sa_reg[1].oa_space, 208 1.24 thorpej sa->sa_reg[1].oa_base), 209 1.24 thorpej (bus_size_t)sa->sa_reg[1].oa_size, 210 1.22 eeh 0, &sc->sc_mr) != 0) { 211 1.44 cegger aprint_error_dev(self, "cannot map registers\n"); 212 1.1 pk return; 213 1.1 pk } 214 1.1 pk 215 1.32 pk sc->sc_rev = prom_getpropint(node, "mace-version", -1); 216 1.1 pk printf(" rev %x", sc->sc_rev); 217 1.1 pk 218 1.17 eeh sc->sc_bustag = sa->sa_bustag; 219 1.17 eeh sc->sc_dmatag = sa->sa_dmatag; 220 1.1 pk sc->sc_qec = qec; 221 1.1 pk sc->sc_qr = qec->sc_regs; 222 1.1 pk 223 1.32 pk sc->sc_channel = prom_getpropint(node, "channel#", -1); 224 1.1 pk sc->sc_burst = qec->sc_burst; 225 1.1 pk 226 1.1 pk qestop(sc); 227 1.1 pk 228 1.1 pk /* Note: no interrupt level passed */ 229 1.29 pk (void)bus_intr_establish(sa->sa_bustag, 0, IPL_NET, qeintr, sc); 230 1.31 pk prom_getether(node, sc->sc_enaddr); 231 1.1 pk 232 1.1 pk /* 233 1.1 pk * Allocate descriptor ring and buffers. 234 1.1 pk */ 235 1.1 pk 236 1.1 pk /* for now, allocate as many bufs as there are ring descriptors */ 237 1.1 pk sc->sc_rb.rb_ntbuf = QEC_XD_RING_MAXSIZE; 238 1.1 pk sc->sc_rb.rb_nrbuf = QEC_XD_RING_MAXSIZE; 239 1.1 pk 240 1.1 pk size = QEC_XD_RING_MAXSIZE * sizeof(struct qec_xd) + 241 1.1 pk QEC_XD_RING_MAXSIZE * sizeof(struct qec_xd) + 242 1.1 pk sc->sc_rb.rb_ntbuf * QE_PKT_BUF_SZ + 243 1.1 pk sc->sc_rb.rb_nrbuf * QE_PKT_BUF_SZ; 244 1.8 pk 245 1.9 pk /* Get a DMA handle */ 246 1.9 pk if ((error = bus_dmamap_create(dmatag, size, 1, size, 0, 247 1.8 pk BUS_DMA_NOWAIT, &sc->sc_dmamap)) != 0) { 248 1.44 cegger aprint_error_dev(self, "DMA map create error %d\n", 249 1.44 cegger error); 250 1.8 pk return; 251 1.8 pk } 252 1.8 pk 253 1.8 pk /* Allocate DMA buffer */ 254 1.10 pk if ((error = bus_dmamem_alloc(dmatag, size, 0, 0, 255 1.1 pk &seg, 1, &rseg, BUS_DMA_NOWAIT)) != 0) { 256 1.44 cegger aprint_error_dev(self, "DMA buffer alloc error %d\n", 257 1.44 cegger error); 258 1.1 pk return; 259 1.1 pk } 260 1.8 pk 261 1.8 pk /* Map DMA buffer in CPU addressable space */ 262 1.8 pk if ((error = bus_dmamem_map(dmatag, &seg, rseg, size, 263 1.73 msaitoh &sc->sc_rb.rb_membase, 264 1.73 msaitoh BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) { 265 1.44 cegger aprint_error_dev(self, "DMA buffer map error %d\n", 266 1.44 cegger error); 267 1.15 thorpej bus_dmamem_free(dmatag, &seg, rseg); 268 1.15 thorpej return; 269 1.15 thorpej } 270 1.15 thorpej 271 1.15 thorpej /* Load the buffer */ 272 1.15 thorpej if ((error = bus_dmamap_load(dmatag, sc->sc_dmamap, 273 1.15 thorpej sc->sc_rb.rb_membase, size, NULL, 274 1.15 thorpej BUS_DMA_NOWAIT)) != 0) { 275 1.44 cegger aprint_error_dev(self, "DMA buffer map load error %d\n", 276 1.44 cegger error); 277 1.15 thorpej bus_dmamem_unmap(dmatag, sc->sc_rb.rb_membase, size); 278 1.8 pk bus_dmamem_free(dmatag, &seg, rseg); 279 1.1 pk return; 280 1.1 pk } 281 1.20 frueauf sc->sc_rb.rb_dmabase = sc->sc_dmamap->dm_segs[0].ds_addr; 282 1.1 pk 283 1.1 pk /* Initialize media properties */ 284 1.75 msaitoh sc->sc_ethercom.ec_ifmedia = &sc->sc_ifmedia; 285 1.1 pk ifmedia_init(&sc->sc_ifmedia, 0, qe_ifmedia_upd, qe_ifmedia_sts); 286 1.1 pk ifmedia_add(&sc->sc_ifmedia, 287 1.72 msaitoh IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0), 288 1.1 pk 0, NULL); 289 1.1 pk ifmedia_add(&sc->sc_ifmedia, 290 1.72 msaitoh IFM_MAKEWORD(IFM_ETHER, IFM_10_5, 0, 0), 291 1.1 pk 0, NULL); 292 1.1 pk ifmedia_add(&sc->sc_ifmedia, 293 1.72 msaitoh IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0), 294 1.1 pk 0, NULL); 295 1.72 msaitoh ifmedia_set(&sc->sc_ifmedia, IFM_ETHER | IFM_AUTO); 296 1.1 pk 297 1.53 tsutsui memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ); 298 1.1 pk ifp->if_softc = sc; 299 1.1 pk ifp->if_start = qestart; 300 1.1 pk ifp->if_ioctl = qeioctl; 301 1.1 pk ifp->if_watchdog = qewatchdog; 302 1.71 msaitoh ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 303 1.13 thorpej IFQ_SET_READY(&ifp->if_snd); 304 1.1 pk 305 1.1 pk /* Attach the interface. */ 306 1.1 pk if_attach(ifp); 307 1.1 pk ether_ifattach(ifp, sc->sc_enaddr); 308 1.1 pk 309 1.1 pk printf(" address %s\n", ether_sprintf(sc->sc_enaddr)); 310 1.1 pk } 311 1.1 pk 312 1.1 pk /* 313 1.1 pk * Pull data off an interface. 314 1.1 pk * Len is the length of data, with local net header stripped. 315 1.1 pk * We copy the data into mbufs. When full cluster sized units are present, 316 1.1 pk * we copy into clusters. 317 1.1 pk */ 318 1.38 perry static inline struct mbuf * 319 1.49 dsl qe_get(struct qe_softc *sc, int idx, int totlen) 320 1.1 pk { 321 1.1 pk struct ifnet *ifp = &sc->sc_ethercom.ec_if; 322 1.1 pk struct mbuf *m; 323 1.1 pk struct mbuf *top, **mp; 324 1.1 pk int len, pad, boff = 0; 325 1.56 tsutsui uint8_t *bp; 326 1.1 pk 327 1.54 tsutsui bp = sc->sc_rb.rb_rxbuf + (idx % sc->sc_rb.rb_nrbuf) * QE_PKT_BUF_SZ; 328 1.1 pk 329 1.1 pk MGETHDR(m, M_DONTWAIT, MT_DATA); 330 1.1 pk if (m == NULL) 331 1.1 pk return (NULL); 332 1.65 ozaki m_set_rcvif(m, ifp); 333 1.1 pk m->m_pkthdr.len = totlen; 334 1.1 pk pad = ALIGN(sizeof(struct ether_header)) - sizeof(struct ether_header); 335 1.1 pk m->m_data += pad; 336 1.1 pk len = MHLEN - pad; 337 1.1 pk top = NULL; 338 1.1 pk mp = ⊤ 339 1.1 pk 340 1.1 pk while (totlen > 0) { 341 1.1 pk if (top) { 342 1.1 pk MGET(m, M_DONTWAIT, MT_DATA); 343 1.1 pk if (m == NULL) { 344 1.1 pk m_freem(top); 345 1.1 pk return (NULL); 346 1.1 pk } 347 1.1 pk len = MLEN; 348 1.1 pk } 349 1.1 pk if (top && totlen >= MINCLSIZE) { 350 1.1 pk MCLGET(m, M_DONTWAIT); 351 1.1 pk if (m->m_flags & M_EXT) 352 1.1 pk len = MCLBYTES; 353 1.1 pk } 354 1.70 riastrad m->m_len = len = uimin(totlen, len); 355 1.56 tsutsui memcpy(mtod(m, void *), bp + boff, len); 356 1.1 pk boff += len; 357 1.1 pk totlen -= len; 358 1.1 pk *mp = m; 359 1.1 pk mp = &m->m_next; 360 1.1 pk } 361 1.1 pk 362 1.1 pk return (top); 363 1.1 pk } 364 1.1 pk 365 1.1 pk /* 366 1.1 pk * Routine to copy from mbuf chain to transmit buffer in 367 1.1 pk * network buffer memory. 368 1.1 pk */ 369 1.38 perry inline int 370 1.48 dsl qe_put(struct qe_softc *sc, int idx, struct mbuf *m) 371 1.1 pk { 372 1.1 pk struct mbuf *n; 373 1.1 pk int len, tlen = 0, boff = 0; 374 1.56 tsutsui uint8_t *bp; 375 1.1 pk 376 1.54 tsutsui bp = sc->sc_rb.rb_txbuf + (idx % sc->sc_rb.rb_ntbuf) * QE_PKT_BUF_SZ; 377 1.1 pk 378 1.1 pk for (; m; m = n) { 379 1.1 pk len = m->m_len; 380 1.1 pk if (len == 0) { 381 1.66 christos n = m_free(m); 382 1.1 pk continue; 383 1.1 pk } 384 1.56 tsutsui memcpy(bp + boff, mtod(m, void *), len); 385 1.1 pk boff += len; 386 1.1 pk tlen += len; 387 1.66 christos n = m_free(m); 388 1.1 pk } 389 1.1 pk return (tlen); 390 1.1 pk } 391 1.1 pk 392 1.1 pk /* 393 1.1 pk * Pass a packet to the higher levels. 394 1.1 pk */ 395 1.38 perry inline void 396 1.49 dsl qe_read(struct qe_softc *sc, int idx, int len) 397 1.1 pk { 398 1.1 pk struct ifnet *ifp = &sc->sc_ethercom.ec_if; 399 1.1 pk struct mbuf *m; 400 1.1 pk 401 1.1 pk if (len <= sizeof(struct ether_header) || 402 1.1 pk len > ETHERMTU + sizeof(struct ether_header)) { 403 1.1 pk 404 1.1 pk printf("%s: invalid packet size %d; dropping\n", 405 1.1 pk ifp->if_xname, len); 406 1.1 pk 407 1.76 thorpej if_statinc(ifp, if_ierrors); 408 1.1 pk return; 409 1.1 pk } 410 1.1 pk 411 1.1 pk /* 412 1.1 pk * Pull packet off interface. 413 1.1 pk */ 414 1.1 pk m = qe_get(sc, idx, len); 415 1.1 pk if (m == NULL) { 416 1.76 thorpej if_statinc(ifp, if_ierrors); 417 1.1 pk return; 418 1.1 pk } 419 1.1 pk 420 1.6 thorpej /* Pass the packet up. */ 421 1.64 ozaki if_percpuq_enqueue(ifp->if_percpuq, m); 422 1.1 pk } 423 1.1 pk 424 1.1 pk /* 425 1.1 pk * Start output on interface. 426 1.77 thorpej * We make an assumption here: 427 1.1 pk * 1) that the current priority is set to splnet _before_ this code 428 1.1 pk * is called *and* is returned to the appropriate priority after 429 1.1 pk * return 430 1.1 pk */ 431 1.1 pk void 432 1.48 dsl qestart(struct ifnet *ifp) 433 1.1 pk { 434 1.53 tsutsui struct qe_softc *sc = ifp->if_softc; 435 1.1 pk struct qec_xd *txd = sc->sc_rb.rb_txd; 436 1.1 pk struct mbuf *m; 437 1.1 pk unsigned int bix, len; 438 1.1 pk unsigned int ntbuf = sc->sc_rb.rb_ntbuf; 439 1.1 pk 440 1.77 thorpej if ((ifp->if_flags & IFF_RUNNING) != IFF_RUNNING) 441 1.1 pk return; 442 1.1 pk 443 1.1 pk bix = sc->sc_rb.rb_tdhead; 444 1.1 pk 445 1.77 thorpej while (sc->sc_rb.rb_td_nbusy < ntbuf) { 446 1.13 thorpej IFQ_DEQUEUE(&ifp->if_snd, m); 447 1.1 pk if (m == 0) 448 1.1 pk break; 449 1.1 pk 450 1.1 pk /* 451 1.1 pk * If BPF is listening on this interface, let it see the 452 1.1 pk * packet before we commit it to the wire. 453 1.1 pk */ 454 1.69 msaitoh bpf_mtap(ifp, m, BPF_D_OUT); 455 1.1 pk 456 1.1 pk /* 457 1.1 pk * Copy the mbuf chain into the transmit buffer. 458 1.1 pk */ 459 1.1 pk len = qe_put(sc, bix, m); 460 1.1 pk 461 1.1 pk /* 462 1.1 pk * Initialize transmit registers and start transmission 463 1.1 pk */ 464 1.1 pk txd[bix].xd_flags = QEC_XD_OWN | QEC_XD_SOP | QEC_XD_EOP | 465 1.1 pk (len & QEC_XD_LENGTH); 466 1.1 pk bus_space_write_4(sc->sc_bustag, sc->sc_cr, QE_CRI_CTRL, 467 1.1 pk QE_CR_CTRL_TWAKEUP); 468 1.1 pk 469 1.1 pk if (++bix == QEC_XD_RING_MAXSIZE) 470 1.1 pk bix = 0; 471 1.1 pk 472 1.77 thorpej sc->sc_rb.rb_td_nbusy++; 473 1.1 pk } 474 1.1 pk 475 1.1 pk sc->sc_rb.rb_tdhead = bix; 476 1.1 pk } 477 1.1 pk 478 1.1 pk void 479 1.48 dsl qestop(struct qe_softc *sc) 480 1.35 perry { 481 1.1 pk bus_space_tag_t t = sc->sc_bustag; 482 1.1 pk bus_space_handle_t mr = sc->sc_mr; 483 1.1 pk bus_space_handle_t cr = sc->sc_cr; 484 1.1 pk int n; 485 1.1 pk 486 1.4 mrg #if defined(SUN4U) || defined(__GNUC__) 487 1.4 mrg (void)&t; 488 1.4 mrg #endif 489 1.1 pk /* Stop the schwurst */ 490 1.1 pk bus_space_write_1(t, mr, QE_MRI_BIUCC, QE_MR_BIUCC_SWRST); 491 1.1 pk for (n = 200; n > 0; n--) { 492 1.1 pk if ((bus_space_read_1(t, mr, QE_MRI_BIUCC) & 493 1.1 pk QE_MR_BIUCC_SWRST) == 0) 494 1.1 pk break; 495 1.1 pk DELAY(20); 496 1.1 pk } 497 1.1 pk 498 1.1 pk /* then reset */ 499 1.1 pk bus_space_write_4(t, cr, QE_CRI_CTRL, QE_CR_CTRL_RESET); 500 1.1 pk for (n = 200; n > 0; n--) { 501 1.1 pk if ((bus_space_read_4(t, cr, QE_CRI_CTRL) & 502 1.1 pk QE_CR_CTRL_RESET) == 0) 503 1.1 pk break; 504 1.1 pk DELAY(20); 505 1.1 pk } 506 1.1 pk } 507 1.1 pk 508 1.1 pk /* 509 1.1 pk * Reset interface. 510 1.1 pk */ 511 1.1 pk void 512 1.48 dsl qereset(struct qe_softc *sc) 513 1.1 pk { 514 1.1 pk int s; 515 1.1 pk 516 1.1 pk s = splnet(); 517 1.1 pk qestop(sc); 518 1.1 pk qeinit(sc); 519 1.1 pk splx(s); 520 1.1 pk } 521 1.1 pk 522 1.1 pk void 523 1.48 dsl qewatchdog(struct ifnet *ifp) 524 1.1 pk { 525 1.1 pk struct qe_softc *sc = ifp->if_softc; 526 1.1 pk 527 1.59 mrg log(LOG_ERR, "%s: device timeout\n", device_xname(sc->sc_dev)); 528 1.76 thorpej if_statinc(ifp, if_oerrors); 529 1.1 pk 530 1.1 pk qereset(sc); 531 1.1 pk } 532 1.1 pk 533 1.1 pk /* 534 1.1 pk * Interrupt dispatch. 535 1.1 pk */ 536 1.1 pk int 537 1.48 dsl qeintr(void *arg) 538 1.1 pk { 539 1.53 tsutsui struct qe_softc *sc = arg; 540 1.1 pk bus_space_tag_t t = sc->sc_bustag; 541 1.55 tsutsui uint32_t qecstat, qestat; 542 1.1 pk int r = 0; 543 1.1 pk 544 1.4 mrg #if defined(SUN4U) || defined(__GNUC__) 545 1.4 mrg (void)&t; 546 1.4 mrg #endif 547 1.1 pk /* Read QEC status and channel status */ 548 1.1 pk qecstat = bus_space_read_4(t, sc->sc_qr, QEC_QRI_STAT); 549 1.7 pk #ifdef QEDEBUG 550 1.7 pk if (sc->sc_debug) { 551 1.7 pk printf("qe%d: intr: qecstat=%x\n", sc->sc_channel, qecstat); 552 1.7 pk } 553 1.7 pk #endif 554 1.1 pk 555 1.1 pk /* Filter out status for this channel */ 556 1.1 pk qecstat = qecstat >> (4 * sc->sc_channel); 557 1.1 pk if ((qecstat & 0xf) == 0) 558 1.1 pk return (r); 559 1.1 pk 560 1.1 pk qestat = bus_space_read_4(t, sc->sc_cr, QE_CRI_STAT); 561 1.1 pk 562 1.7 pk #ifdef QEDEBUG 563 1.7 pk if (sc->sc_debug) { 564 1.7 pk char bits[64]; int i; 565 1.36 christos bus_space_tag_t t1 = sc->sc_bustag; 566 1.7 pk bus_space_handle_t mr = sc->sc_mr; 567 1.7 pk 568 1.47 christos snprintb(bits, sizeof(bits), QE_CR_STAT_BITS, qestat); 569 1.47 christos printf("qe%d: intr: qestat=%s\n", sc->sc_channel, bits); 570 1.7 pk 571 1.7 pk printf("MACE registers:\n"); 572 1.7 pk for (i = 0 ; i < 32; i++) { 573 1.36 christos printf(" m[%d]=%x,", i, bus_space_read_1(t1, mr, i)); 574 1.7 pk if (((i+1) & 7) == 0) 575 1.7 pk printf("\n"); 576 1.7 pk } 577 1.7 pk } 578 1.7 pk #endif 579 1.7 pk 580 1.1 pk if (qestat & QE_CR_STAT_ALLERRORS) { 581 1.7 pk #ifdef QEDEBUG 582 1.16 christos if (sc->sc_debug) { 583 1.16 christos char bits[64]; 584 1.47 christos snprintb(bits, sizeof(bits), QE_CR_STAT_BITS, qestat); 585 1.47 christos printf("qe%d: eint: qestat=%s\n", sc->sc_channel, bits); 586 1.16 christos } 587 1.7 pk #endif 588 1.1 pk r |= qe_eint(sc, qestat); 589 1.1 pk if (r == -1) 590 1.1 pk return (1); 591 1.1 pk } 592 1.1 pk 593 1.1 pk if (qestat & QE_CR_STAT_TXIRQ) 594 1.1 pk r |= qe_tint(sc); 595 1.1 pk 596 1.1 pk if (qestat & QE_CR_STAT_RXIRQ) 597 1.1 pk r |= qe_rint(sc); 598 1.1 pk 599 1.1 pk return (r); 600 1.1 pk } 601 1.1 pk 602 1.1 pk /* 603 1.1 pk * Transmit interrupt. 604 1.1 pk */ 605 1.1 pk int 606 1.48 dsl qe_tint(struct qe_softc *sc) 607 1.1 pk { 608 1.1 pk struct ifnet *ifp = &sc->sc_ethercom.ec_if; 609 1.1 pk unsigned int bix, txflags; 610 1.1 pk 611 1.1 pk bix = sc->sc_rb.rb_tdtail; 612 1.1 pk 613 1.1 pk for (;;) { 614 1.1 pk if (sc->sc_rb.rb_td_nbusy <= 0) 615 1.1 pk break; 616 1.1 pk 617 1.1 pk txflags = sc->sc_rb.rb_txd[bix].xd_flags; 618 1.1 pk 619 1.1 pk if (txflags & QEC_XD_OWN) 620 1.1 pk break; 621 1.1 pk 622 1.76 thorpej if_statinc(ifp, if_opackets); 623 1.1 pk 624 1.1 pk if (++bix == QEC_XD_RING_MAXSIZE) 625 1.1 pk bix = 0; 626 1.1 pk 627 1.1 pk --sc->sc_rb.rb_td_nbusy; 628 1.1 pk } 629 1.1 pk 630 1.1 pk sc->sc_rb.rb_tdtail = bix; 631 1.1 pk 632 1.1 pk qestart(ifp); 633 1.1 pk 634 1.1 pk if (sc->sc_rb.rb_td_nbusy == 0) 635 1.1 pk ifp->if_timer = 0; 636 1.1 pk 637 1.1 pk return (1); 638 1.1 pk } 639 1.1 pk 640 1.1 pk /* 641 1.1 pk * Receive interrupt. 642 1.1 pk */ 643 1.1 pk int 644 1.48 dsl qe_rint(struct qe_softc *sc) 645 1.1 pk { 646 1.1 pk struct qec_xd *xd = sc->sc_rb.rb_rxd; 647 1.1 pk unsigned int bix, len; 648 1.1 pk unsigned int nrbuf = sc->sc_rb.rb_nrbuf; 649 1.7 pk #ifdef QEDEBUG 650 1.7 pk int npackets = 0; 651 1.7 pk #endif 652 1.1 pk 653 1.1 pk bix = sc->sc_rb.rb_rdtail; 654 1.1 pk 655 1.1 pk /* 656 1.1 pk * Process all buffers with valid data. 657 1.1 pk */ 658 1.1 pk for (;;) { 659 1.1 pk len = xd[bix].xd_flags; 660 1.1 pk if (len & QEC_XD_OWN) 661 1.1 pk break; 662 1.1 pk 663 1.7 pk #ifdef QEDEBUG 664 1.7 pk npackets++; 665 1.7 pk #endif 666 1.7 pk 667 1.1 pk len &= QEC_XD_LENGTH; 668 1.1 pk len -= 4; 669 1.1 pk qe_read(sc, bix, len); 670 1.1 pk 671 1.1 pk /* ... */ 672 1.1 pk xd[(bix+nrbuf) % QEC_XD_RING_MAXSIZE].xd_flags = 673 1.1 pk QEC_XD_OWN | (QE_PKT_BUF_SZ & QEC_XD_LENGTH); 674 1.1 pk 675 1.1 pk if (++bix == QEC_XD_RING_MAXSIZE) 676 1.1 pk bix = 0; 677 1.1 pk } 678 1.7 pk #ifdef QEDEBUG 679 1.16 christos if (npackets == 0 && sc->sc_debug) 680 1.7 pk printf("%s: rint: no packets; rb index %d; status 0x%x\n", 681 1.59 mrg device_xname(sc->sc_dev), bix, len); 682 1.7 pk #endif 683 1.1 pk 684 1.1 pk sc->sc_rb.rb_rdtail = bix; 685 1.1 pk 686 1.1 pk return (1); 687 1.1 pk } 688 1.1 pk 689 1.1 pk /* 690 1.1 pk * Error interrupt. 691 1.1 pk */ 692 1.1 pk int 693 1.55 tsutsui qe_eint(struct qe_softc *sc, uint32_t why) 694 1.1 pk { 695 1.1 pk struct ifnet *ifp = &sc->sc_ethercom.ec_if; 696 1.59 mrg device_t self = sc->sc_dev; 697 1.59 mrg const char *xname = device_xname(self); 698 1.1 pk int r = 0, rst = 0; 699 1.1 pk 700 1.76 thorpej net_stat_ref_t nsr = IF_STAT_GETREF(ifp); 701 1.76 thorpej 702 1.1 pk if (why & QE_CR_STAT_EDEFER) { 703 1.59 mrg printf("%s: excessive tx defers.\n", xname); 704 1.1 pk r |= 1; 705 1.80 riastrad if_statinc_ref(ifp, nsr, if_oerrors); 706 1.1 pk } 707 1.1 pk 708 1.1 pk if (why & QE_CR_STAT_CLOSS) { 709 1.59 mrg printf("%s: no carrier, link down?\n", xname); 710 1.80 riastrad if_statinc_ref(ifp, nsr, if_oerrors); 711 1.1 pk r |= 1; 712 1.1 pk } 713 1.1 pk 714 1.1 pk if (why & QE_CR_STAT_ERETRIES) { 715 1.59 mrg printf("%s: excessive tx retries\n", xname); 716 1.80 riastrad if_statinc_ref(ifp, nsr, if_oerrors); 717 1.1 pk r |= 1; 718 1.1 pk rst = 1; 719 1.1 pk } 720 1.1 pk 721 1.1 pk 722 1.1 pk if (why & QE_CR_STAT_LCOLL) { 723 1.59 mrg printf("%s: late tx transmission\n", xname); 724 1.80 riastrad if_statinc_ref(ifp, nsr, if_oerrors); 725 1.1 pk r |= 1; 726 1.1 pk rst = 1; 727 1.1 pk } 728 1.1 pk 729 1.1 pk if (why & QE_CR_STAT_FUFLOW) { 730 1.59 mrg printf("%s: tx fifo underflow\n", xname); 731 1.80 riastrad if_statinc_ref(ifp, nsr, if_oerrors); 732 1.1 pk r |= 1; 733 1.1 pk rst = 1; 734 1.1 pk } 735 1.1 pk 736 1.1 pk if (why & QE_CR_STAT_JERROR) { 737 1.59 mrg printf("%s: jabber seen\n", xname); 738 1.1 pk r |= 1; 739 1.1 pk } 740 1.1 pk 741 1.1 pk if (why & QE_CR_STAT_BERROR) { 742 1.59 mrg printf("%s: babble seen\n", xname); 743 1.1 pk r |= 1; 744 1.1 pk } 745 1.1 pk 746 1.1 pk if (why & QE_CR_STAT_TCCOFLOW) { 747 1.80 riastrad if_statadd_ref(ifp, nsr, if_collisions, 256); 748 1.80 riastrad if_statadd_ref(ifp, nsr, if_oerrors, 256); 749 1.1 pk r |= 1; 750 1.1 pk } 751 1.1 pk 752 1.1 pk if (why & QE_CR_STAT_TXDERROR) { 753 1.59 mrg printf("%s: tx descriptor is bad\n", xname); 754 1.1 pk rst = 1; 755 1.1 pk r |= 1; 756 1.1 pk } 757 1.1 pk 758 1.1 pk if (why & QE_CR_STAT_TXLERR) { 759 1.59 mrg printf("%s: tx late error\n", xname); 760 1.80 riastrad if_statinc_ref(ifp, nsr, if_oerrors); 761 1.1 pk rst = 1; 762 1.1 pk r |= 1; 763 1.1 pk } 764 1.1 pk 765 1.1 pk if (why & QE_CR_STAT_TXPERR) { 766 1.59 mrg printf("%s: tx DMA parity error\n", xname); 767 1.80 riastrad if_statinc_ref(ifp, nsr, if_oerrors); 768 1.1 pk rst = 1; 769 1.1 pk r |= 1; 770 1.1 pk } 771 1.1 pk 772 1.1 pk if (why & QE_CR_STAT_TXSERR) { 773 1.59 mrg printf("%s: tx DMA sbus error ack\n", xname); 774 1.80 riastrad if_statinc_ref(ifp, nsr, if_oerrors); 775 1.1 pk rst = 1; 776 1.1 pk r |= 1; 777 1.1 pk } 778 1.1 pk 779 1.1 pk if (why & QE_CR_STAT_RCCOFLOW) { 780 1.80 riastrad if_statadd_ref(ifp, nsr, if_collisions, 256); 781 1.80 riastrad if_statadd_ref(ifp, nsr, if_ierrors, 256); 782 1.1 pk r |= 1; 783 1.1 pk } 784 1.1 pk 785 1.1 pk if (why & QE_CR_STAT_RUOFLOW) { 786 1.80 riastrad if_statadd_ref(ifp, nsr, if_ierrors, 256); 787 1.1 pk r |= 1; 788 1.1 pk } 789 1.1 pk 790 1.1 pk if (why & QE_CR_STAT_MCOFLOW) { 791 1.80 riastrad if_statadd_ref(ifp, nsr, if_ierrors, 256); 792 1.1 pk r |= 1; 793 1.1 pk } 794 1.1 pk 795 1.1 pk if (why & QE_CR_STAT_RXFOFLOW) { 796 1.59 mrg printf("%s: rx fifo overflow\n", xname); 797 1.80 riastrad if_statinc_ref(ifp, nsr, if_ierrors); 798 1.1 pk r |= 1; 799 1.1 pk } 800 1.1 pk 801 1.1 pk if (why & QE_CR_STAT_RLCOLL) { 802 1.59 mrg printf("%s: rx late collision\n", xname); 803 1.80 riastrad if_statinc_ref(ifp, nsr, if_ierrors); 804 1.80 riastrad if_statinc_ref(ifp, nsr, if_collisions); 805 1.1 pk r |= 1; 806 1.1 pk } 807 1.1 pk 808 1.1 pk if (why & QE_CR_STAT_FCOFLOW) { 809 1.80 riastrad if_statadd_ref(ifp, nsr, if_ierrors, 256); 810 1.1 pk r |= 1; 811 1.1 pk } 812 1.1 pk 813 1.1 pk if (why & QE_CR_STAT_CECOFLOW) { 814 1.80 riastrad if_statadd_ref(ifp, nsr, if_ierrors, 256); 815 1.1 pk r |= 1; 816 1.1 pk } 817 1.1 pk 818 1.1 pk if (why & QE_CR_STAT_RXDROP) { 819 1.59 mrg printf("%s: rx packet dropped\n", xname); 820 1.80 riastrad if_statinc_ref(ifp, nsr, if_ierrors); 821 1.1 pk r |= 1; 822 1.1 pk } 823 1.1 pk 824 1.1 pk if (why & QE_CR_STAT_RXSMALL) { 825 1.59 mrg printf("%s: rx buffer too small\n", xname); 826 1.80 riastrad if_statinc_ref(ifp, nsr, if_ierrors); 827 1.1 pk r |= 1; 828 1.1 pk rst = 1; 829 1.1 pk } 830 1.1 pk 831 1.1 pk if (why & QE_CR_STAT_RXLERR) { 832 1.59 mrg printf("%s: rx late error\n", xname); 833 1.80 riastrad if_statinc_ref(ifp, nsr, if_ierrors); 834 1.1 pk r |= 1; 835 1.1 pk rst = 1; 836 1.1 pk } 837 1.1 pk 838 1.1 pk if (why & QE_CR_STAT_RXPERR) { 839 1.59 mrg printf("%s: rx DMA parity error\n", xname); 840 1.80 riastrad if_statinc_ref(ifp, nsr, if_ierrors); 841 1.1 pk r |= 1; 842 1.1 pk rst = 1; 843 1.1 pk } 844 1.1 pk 845 1.1 pk if (why & QE_CR_STAT_RXSERR) { 846 1.59 mrg printf("%s: rx DMA sbus error ack\n", xname); 847 1.80 riastrad if_statinc_ref(ifp, nsr, if_ierrors); 848 1.1 pk r |= 1; 849 1.1 pk rst = 1; 850 1.1 pk } 851 1.1 pk 852 1.76 thorpej IF_STAT_PUTREF(ifp); 853 1.76 thorpej 854 1.1 pk if (r == 0) 855 1.53 tsutsui aprint_error_dev(self, "unexpected interrupt error: %08x\n", 856 1.44 cegger why); 857 1.1 pk 858 1.1 pk if (rst) { 859 1.59 mrg printf("%s: resetting...\n", xname); 860 1.1 pk qereset(sc); 861 1.1 pk return (-1); 862 1.1 pk } 863 1.1 pk 864 1.1 pk return (r); 865 1.1 pk } 866 1.1 pk 867 1.1 pk int 868 1.48 dsl qeioctl(struct ifnet *ifp, u_long cmd, void *data) 869 1.1 pk { 870 1.1 pk struct qe_softc *sc = ifp->if_softc; 871 1.53 tsutsui struct ifaddr *ifa = data; 872 1.1 pk int s, error = 0; 873 1.1 pk 874 1.1 pk s = splnet(); 875 1.1 pk 876 1.1 pk switch (cmd) { 877 1.46 dyoung case SIOCINITIFADDR: 878 1.1 pk ifp->if_flags |= IFF_UP; 879 1.46 dyoung qeinit(sc); 880 1.1 pk switch (ifa->ifa_addr->sa_family) { 881 1.1 pk #ifdef INET 882 1.1 pk case AF_INET: 883 1.1 pk arp_ifinit(ifp, ifa); 884 1.1 pk break; 885 1.1 pk #endif /* INET */ 886 1.1 pk default: 887 1.1 pk break; 888 1.1 pk } 889 1.1 pk break; 890 1.1 pk 891 1.1 pk case SIOCSIFFLAGS: 892 1.46 dyoung if ((error = ifioctl_common(ifp, cmd, data)) != 0) 893 1.46 dyoung break; 894 1.46 dyoung /* XXX re-use ether_ioctl() */ 895 1.72 msaitoh switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) { 896 1.46 dyoung case IFF_RUNNING: 897 1.1 pk /* 898 1.1 pk * If interface is marked down and it is running, then 899 1.1 pk * stop it. 900 1.1 pk */ 901 1.1 pk qestop(sc); 902 1.1 pk ifp->if_flags &= ~IFF_RUNNING; 903 1.46 dyoung break; 904 1.46 dyoung case IFF_UP: 905 1.1 pk /* 906 1.1 pk * If interface is marked up and it is stopped, then 907 1.1 pk * start it. 908 1.1 pk */ 909 1.1 pk qeinit(sc); 910 1.46 dyoung break; 911 1.46 dyoung default: 912 1.1 pk /* 913 1.1 pk * Reset the interface to pick up changes in any other 914 1.1 pk * flags that affect hardware registers. 915 1.1 pk */ 916 1.1 pk qestop(sc); 917 1.1 pk qeinit(sc); 918 1.46 dyoung break; 919 1.1 pk } 920 1.1 pk #ifdef QEDEBUG 921 1.7 pk sc->sc_debug = (ifp->if_flags & IFF_DEBUG) != 0 ? 1 : 0; 922 1.1 pk #endif 923 1.1 pk break; 924 1.1 pk 925 1.1 pk case SIOCADDMULTI: 926 1.1 pk case SIOCDELMULTI: 927 1.42 dyoung if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) { 928 1.1 pk /* 929 1.1 pk * Multicast list has changed; set the hardware filter 930 1.1 pk * accordingly. 931 1.1 pk */ 932 1.33 thorpej if (ifp->if_flags & IFF_RUNNING) 933 1.33 thorpej qe_mcreset(sc); 934 1.1 pk error = 0; 935 1.1 pk } 936 1.1 pk break; 937 1.1 pk 938 1.1 pk default: 939 1.61 jdc error = ether_ioctl(ifp, cmd, data); 940 1.1 pk break; 941 1.1 pk } 942 1.1 pk 943 1.1 pk splx(s); 944 1.1 pk return (error); 945 1.1 pk } 946 1.1 pk 947 1.1 pk 948 1.1 pk void 949 1.48 dsl qeinit(struct qe_softc *sc) 950 1.1 pk { 951 1.1 pk struct ifnet *ifp = &sc->sc_ethercom.ec_if; 952 1.1 pk bus_space_tag_t t = sc->sc_bustag; 953 1.1 pk bus_space_handle_t cr = sc->sc_cr; 954 1.1 pk bus_space_handle_t mr = sc->sc_mr; 955 1.1 pk struct qec_softc *qec = sc->sc_qec; 956 1.55 tsutsui uint32_t qecaddr; 957 1.55 tsutsui uint8_t *ea; 958 1.7 pk int s; 959 1.1 pk 960 1.4 mrg #if defined(SUN4U) || defined(__GNUC__) 961 1.4 mrg (void)&t; 962 1.4 mrg #endif 963 1.14 thorpej s = splnet(); 964 1.7 pk 965 1.1 pk qestop(sc); 966 1.1 pk 967 1.1 pk /* 968 1.1 pk * Allocate descriptor ring and buffers 969 1.1 pk */ 970 1.1 pk qec_meminit(&sc->sc_rb, QE_PKT_BUF_SZ); 971 1.1 pk 972 1.1 pk /* Channel registers: */ 973 1.55 tsutsui bus_space_write_4(t, cr, QE_CRI_RXDS, (uint32_t)sc->sc_rb.rb_rxddma); 974 1.55 tsutsui bus_space_write_4(t, cr, QE_CRI_TXDS, (uint32_t)sc->sc_rb.rb_txddma); 975 1.1 pk 976 1.1 pk bus_space_write_4(t, cr, QE_CRI_RIMASK, 0); 977 1.1 pk bus_space_write_4(t, cr, QE_CRI_TIMASK, 0); 978 1.1 pk bus_space_write_4(t, cr, QE_CRI_QMASK, 0); 979 1.1 pk bus_space_write_4(t, cr, QE_CRI_MMASK, QE_CR_MMASK_RXCOLL); 980 1.1 pk bus_space_write_4(t, cr, QE_CRI_CCNT, 0); 981 1.1 pk bus_space_write_4(t, cr, QE_CRI_PIPG, 0); 982 1.1 pk 983 1.1 pk qecaddr = sc->sc_channel * qec->sc_msize; 984 1.1 pk bus_space_write_4(t, cr, QE_CRI_RXWBUF, qecaddr); 985 1.1 pk bus_space_write_4(t, cr, QE_CRI_RXRBUF, qecaddr); 986 1.1 pk bus_space_write_4(t, cr, QE_CRI_TXWBUF, qecaddr + qec->sc_rsize); 987 1.1 pk bus_space_write_4(t, cr, QE_CRI_TXRBUF, qecaddr + qec->sc_rsize); 988 1.1 pk 989 1.1 pk /* MACE registers: */ 990 1.1 pk bus_space_write_1(t, mr, QE_MRI_PHYCC, QE_MR_PHYCC_ASEL); 991 1.1 pk bus_space_write_1(t, mr, QE_MRI_XMTFC, QE_MR_XMTFC_APADXMT); 992 1.1 pk bus_space_write_1(t, mr, QE_MRI_RCVFC, 0); 993 1.7 pk 994 1.7 pk /* 995 1.7 pk * Mask MACE's receive interrupt, since we're being notified 996 1.7 pk * by the QEC after DMA completes. 997 1.7 pk */ 998 1.1 pk bus_space_write_1(t, mr, QE_MRI_IMR, 999 1.1 pk QE_MR_IMR_CERRM | QE_MR_IMR_RCVINTM); 1000 1.7 pk 1001 1.1 pk bus_space_write_1(t, mr, QE_MRI_BIUCC, 1002 1.1 pk QE_MR_BIUCC_BSWAP | QE_MR_BIUCC_64TS); 1003 1.1 pk 1004 1.1 pk bus_space_write_1(t, mr, QE_MRI_FIFOFC, 1005 1.1 pk QE_MR_FIFOCC_TXF16 | QE_MR_FIFOCC_RXF32 | 1006 1.1 pk QE_MR_FIFOCC_RFWU | QE_MR_FIFOCC_TFWU); 1007 1.1 pk 1008 1.1 pk bus_space_write_1(t, mr, QE_MRI_PLSCC, QE_MR_PLSCC_TP); 1009 1.1 pk 1010 1.1 pk /* 1011 1.1 pk * Station address 1012 1.1 pk */ 1013 1.1 pk ea = sc->sc_enaddr; 1014 1.1 pk bus_space_write_1(t, mr, QE_MRI_IAC, 1015 1.1 pk QE_MR_IAC_ADDRCHG | QE_MR_IAC_PHYADDR); 1016 1.7 pk bus_space_write_multi_1(t, mr, QE_MRI_PADR, ea, 6); 1017 1.1 pk 1018 1.1 pk /* Apply media settings */ 1019 1.1 pk qe_ifmedia_upd(ifp); 1020 1.1 pk 1021 1.1 pk /* 1022 1.7 pk * Clear Logical address filter 1023 1.1 pk */ 1024 1.1 pk bus_space_write_1(t, mr, QE_MRI_IAC, 1025 1.1 pk QE_MR_IAC_ADDRCHG | QE_MR_IAC_LOGADDR); 1026 1.7 pk bus_space_set_multi_1(t, mr, QE_MRI_LADRF, 0, 8); 1027 1.1 pk bus_space_write_1(t, mr, QE_MRI_IAC, 0); 1028 1.1 pk 1029 1.1 pk /* Clear missed packet count (register cleared on read) */ 1030 1.1 pk (void)bus_space_read_1(t, mr, QE_MRI_MPC); 1031 1.1 pk 1032 1.7 pk #if 0 1033 1.7 pk /* test register: */ 1034 1.7 pk bus_space_write_1(t, mr, QE_MRI_UTR, 0); 1035 1.7 pk #endif 1036 1.1 pk 1037 1.5 pk /* Reset multicast filter */ 1038 1.5 pk qe_mcreset(sc); 1039 1.5 pk 1040 1.1 pk ifp->if_flags |= IFF_RUNNING; 1041 1.1 pk splx(s); 1042 1.1 pk } 1043 1.1 pk 1044 1.1 pk /* 1045 1.1 pk * Reset multicast filter. 1046 1.1 pk */ 1047 1.1 pk void 1048 1.48 dsl qe_mcreset(struct qe_softc *sc) 1049 1.1 pk { 1050 1.1 pk struct ethercom *ec = &sc->sc_ethercom; 1051 1.1 pk struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1052 1.1 pk bus_space_tag_t t = sc->sc_bustag; 1053 1.1 pk bus_space_handle_t mr = sc->sc_mr; 1054 1.1 pk struct ether_multi *enm; 1055 1.1 pk struct ether_multistep step; 1056 1.55 tsutsui uint32_t crc; 1057 1.55 tsutsui uint16_t hash[4]; 1058 1.55 tsutsui uint8_t octet, maccc, *ladrp = (uint8_t *)&hash[0]; 1059 1.62 jdc int i; 1060 1.1 pk 1061 1.4 mrg #if defined(SUN4U) || defined(__GNUC__) 1062 1.4 mrg (void)&t; 1063 1.4 mrg #endif 1064 1.5 pk 1065 1.7 pk /* We also enable transmitter & receiver here */ 1066 1.5 pk maccc = QE_MR_MACCC_ENXMT | QE_MR_MACCC_ENRCV; 1067 1.5 pk 1068 1.5 pk if (ifp->if_flags & IFF_PROMISC) { 1069 1.5 pk maccc |= QE_MR_MACCC_PROM; 1070 1.5 pk bus_space_write_1(t, mr, QE_MRI_MACCC, maccc); 1071 1.5 pk return; 1072 1.5 pk } 1073 1.5 pk 1074 1.1 pk if (ifp->if_flags & IFF_ALLMULTI) { 1075 1.1 pk bus_space_write_1(t, mr, QE_MRI_IAC, 1076 1.1 pk QE_MR_IAC_ADDRCHG | QE_MR_IAC_LOGADDR); 1077 1.7 pk bus_space_set_multi_1(t, mr, QE_MRI_LADRF, 0xff, 8); 1078 1.1 pk bus_space_write_1(t, mr, QE_MRI_IAC, 0); 1079 1.5 pk bus_space_write_1(t, mr, QE_MRI_MACCC, maccc); 1080 1.5 pk return; 1081 1.5 pk } 1082 1.5 pk 1083 1.5 pk hash[3] = hash[2] = hash[1] = hash[0] = 0; 1084 1.1 pk 1085 1.74 msaitoh ETHER_LOCK(ec); 1086 1.5 pk ETHER_FIRST_MULTI(step, ec, enm); 1087 1.5 pk while (enm != NULL) { 1088 1.23 wiz if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 1089 1.5 pk ETHER_ADDR_LEN) != 0) { 1090 1.5 pk /* 1091 1.5 pk * We must listen to a range of multicast 1092 1.5 pk * addresses. For now, just accept all 1093 1.5 pk * multicasts, rather than trying to set only 1094 1.5 pk * those filter bits needed to match the range. 1095 1.5 pk * (At this time, the only use of address 1096 1.5 pk * ranges is for IP multicast routing, for 1097 1.5 pk * which the range is big enough to require 1098 1.5 pk * all bits set.) 1099 1.5 pk */ 1100 1.5 pk bus_space_write_1(t, mr, QE_MRI_IAC, 1101 1.5 pk QE_MR_IAC_ADDRCHG | QE_MR_IAC_LOGADDR); 1102 1.7 pk bus_space_set_multi_1(t, mr, QE_MRI_LADRF, 0xff, 8); 1103 1.5 pk bus_space_write_1(t, mr, QE_MRI_IAC, 0); 1104 1.5 pk ifp->if_flags |= IFF_ALLMULTI; 1105 1.5 pk break; 1106 1.5 pk } 1107 1.1 pk 1108 1.62 jdc crc = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN); 1109 1.5 pk crc >>= 26; 1110 1.5 pk hash[crc >> 4] |= 1 << (crc & 0xf); 1111 1.5 pk ETHER_NEXT_MULTI(step, enm); 1112 1.1 pk } 1113 1.74 msaitoh ETHER_UNLOCK(ec); 1114 1.1 pk 1115 1.62 jdc /* We need to byte-swap the hash before writing to the chip. */ 1116 1.62 jdc for (i = 0; i < 7; i += 2) { 1117 1.62 jdc octet = ladrp[i]; 1118 1.62 jdc ladrp[i] = ladrp[i + 1]; 1119 1.62 jdc ladrp[i + 1] = octet; 1120 1.62 jdc } 1121 1.5 pk bus_space_write_1(t, mr, QE_MRI_IAC, 1122 1.5 pk QE_MR_IAC_ADDRCHG | QE_MR_IAC_LOGADDR); 1123 1.7 pk bus_space_write_multi_1(t, mr, QE_MRI_LADRF, ladrp, 8); 1124 1.5 pk bus_space_write_1(t, mr, QE_MRI_IAC, 0); 1125 1.5 pk bus_space_write_1(t, mr, QE_MRI_MACCC, maccc); 1126 1.1 pk } 1127 1.1 pk 1128 1.1 pk /* 1129 1.1 pk * Get current media settings. 1130 1.1 pk */ 1131 1.1 pk void 1132 1.48 dsl qe_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) 1133 1.1 pk { 1134 1.1 pk struct qe_softc *sc = ifp->if_softc; 1135 1.1 pk bus_space_tag_t t = sc->sc_bustag; 1136 1.1 pk bus_space_handle_t mr = sc->sc_mr; 1137 1.55 tsutsui uint8_t v; 1138 1.1 pk 1139 1.4 mrg #if defined(SUN4U) || defined(__GNUC__) 1140 1.4 mrg (void)&t; 1141 1.4 mrg #endif 1142 1.1 pk v = bus_space_read_1(t, mr, QE_MRI_PLSCC); 1143 1.1 pk 1144 1.1 pk switch (bus_space_read_1(t, mr, QE_MRI_PLSCC) & QE_MR_PLSCC_PORTMASK) { 1145 1.1 pk case QE_MR_PLSCC_TP: 1146 1.1 pk ifmr->ifm_active = IFM_ETHER | IFM_10_T; 1147 1.1 pk break; 1148 1.1 pk case QE_MR_PLSCC_AUI: 1149 1.1 pk ifmr->ifm_active = IFM_ETHER | IFM_10_5; 1150 1.1 pk break; 1151 1.1 pk case QE_MR_PLSCC_GPSI: 1152 1.1 pk case QE_MR_PLSCC_DAI: 1153 1.1 pk /* ... */ 1154 1.1 pk break; 1155 1.1 pk } 1156 1.1 pk 1157 1.1 pk v = bus_space_read_1(t, mr, QE_MRI_PHYCC); 1158 1.1 pk ifmr->ifm_status |= IFM_AVALID; 1159 1.1 pk if ((v & QE_MR_PHYCC_LNKFL) != 0) 1160 1.1 pk ifmr->ifm_status &= ~IFM_ACTIVE; 1161 1.1 pk else 1162 1.1 pk ifmr->ifm_status |= IFM_ACTIVE; 1163 1.1 pk 1164 1.1 pk } 1165 1.1 pk 1166 1.1 pk /* 1167 1.1 pk * Set media options. 1168 1.1 pk */ 1169 1.1 pk int 1170 1.48 dsl qe_ifmedia_upd(struct ifnet *ifp) 1171 1.1 pk { 1172 1.1 pk struct qe_softc *sc = ifp->if_softc; 1173 1.1 pk struct ifmedia *ifm = &sc->sc_ifmedia; 1174 1.1 pk bus_space_tag_t t = sc->sc_bustag; 1175 1.1 pk bus_space_handle_t mr = sc->sc_mr; 1176 1.1 pk int newmedia = ifm->ifm_media; 1177 1.55 tsutsui uint8_t plscc, phycc; 1178 1.1 pk 1179 1.4 mrg #if defined(SUN4U) || defined(__GNUC__) 1180 1.4 mrg (void)&t; 1181 1.4 mrg #endif 1182 1.1 pk if (IFM_TYPE(newmedia) != IFM_ETHER) 1183 1.1 pk return (EINVAL); 1184 1.1 pk 1185 1.1 pk plscc = bus_space_read_1(t, mr, QE_MRI_PLSCC) & ~QE_MR_PLSCC_PORTMASK; 1186 1.1 pk phycc = bus_space_read_1(t, mr, QE_MRI_PHYCC) & ~QE_MR_PHYCC_ASEL; 1187 1.1 pk 1188 1.1 pk if (IFM_SUBTYPE(newmedia) == IFM_AUTO) 1189 1.1 pk phycc |= QE_MR_PHYCC_ASEL; 1190 1.1 pk else if (IFM_SUBTYPE(newmedia) == IFM_10_T) 1191 1.1 pk plscc |= QE_MR_PLSCC_TP; 1192 1.1 pk else if (IFM_SUBTYPE(newmedia) == IFM_10_5) 1193 1.1 pk plscc |= QE_MR_PLSCC_AUI; 1194 1.1 pk 1195 1.1 pk bus_space_write_1(t, mr, QE_MRI_PLSCC, plscc); 1196 1.1 pk bus_space_write_1(t, mr, QE_MRI_PHYCC, phycc); 1197 1.1 pk 1198 1.1 pk return (0); 1199 1.1 pk } 1200