1 /* $NetBSD: i82586.c,v 1.55 2005/12/24 23:41:33 perry Exp $ */ 2 3 /*- 4 * Copyright (c) 1998 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Paul Kranenburg and Charles M. Hannum. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 38 39 /*- 40 * Copyright (c) 1997 Paul Kranenburg. 41 * Copyright (c) 1992, 1993, University of Vermont and State 42 * Agricultural College. 43 * Copyright (c) 1992, 1993, Garrett A. Wollman. 44 * 45 * Portions: 46 * Copyright (c) 1994, 1995, Rafal K. Boni 47 * Copyright (c) 1990, 1991, William F. Jolitz 48 * Copyright (c) 1990, The Regents of the University of California 49 * 50 * All rights reserved. 51 * 52 * Redistribution and use in source and binary forms, with or without 53 * modification, are permitted provided that the following conditions 54 * are met: 55 * 1. Redistributions of source code must retain the above copyright 56 * notice, this list of conditions and the following disclaimer. 57 * 2. Redistributions in binary form must reproduce the above copyright 58 * notice, this list of conditions and the following disclaimer in the 59 * documentation and/or other materials provided with the distribution. 60 * 3. All advertising materials mentioning features or use of this software 61 * must display the following acknowledgement: 62 * This product includes software developed by the University of Vermont 63 * and State Agricultural College and Garrett A. Wollman, by William F. 64 * Jolitz, and by the University of California, Berkeley, Lawrence 65 * Berkeley Laboratory, and its contributors. 66 * 4. Neither the names of the Universities nor the names of the authors 67 * may be used to endorse or promote products derived from this software 68 * without specific prior written permission. 69 * 70 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 71 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 72 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 73 * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR AUTHORS BE LIABLE 74 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 75 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 76 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 77 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 78 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 79 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 80 * SUCH DAMAGE. 81 */ 82 83 /* 84 * Intel 82586 Ethernet chip 85 * Register, bit, and structure definitions. 86 * 87 * Original StarLAN driver written by Garrett Wollman with reference to the 88 * Clarkson Packet Driver code for this chip written by Russ Nelson and others. 89 * 90 * BPF support code taken from hpdev/if_le.c, supplied with tcpdump. 91 * 92 * 3C507 support is loosely based on code donated to NetBSD by Rafal Boni. 93 * 94 * Majorly cleaned up and 3C507 code merged by Charles Hannum. 95 * 96 * Converted to SUN ie driver by Charles D. Cranor, 97 * October 1994, January 1995. 98 * This sun version based on i386 version 1.30. 99 */ 100 101 /* 102 * The i82586 is a very painful chip, found in sun3's, sun-4/100's 103 * sun-4/200's, and VME based suns. The byte order is all wrong for a 104 * SUN, making life difficult. Programming this chip is mostly the same, 105 * but certain details differ from system to system. This driver is 106 * written so that different "ie" interfaces can be controled by the same 107 * driver. 108 */ 109 110 /* 111 Mode of operation: 112 113 We run the 82586 in a standard Ethernet mode. We keep NFRAMES 114 received frame descriptors around for the receiver to use, and 115 NRXBUF associated receive buffer descriptors, both in a circular 116 list. Whenever a frame is received, we rotate both lists as 117 necessary. (The 586 treats both lists as a simple queue.) We also 118 keep a transmit command around so that packets can be sent off 119 quickly. 120 121 We configure the adapter in AL-LOC = 1 mode, which means that the 122 Ethernet/802.3 MAC header is placed at the beginning of the receive 123 buffer rather than being split off into various fields in the RFD. 124 This also means that we must include this header in the transmit 125 buffer as well. 126 127 By convention, all transmit commands, and only transmit commands, 128 shall have the I (IE_CMD_INTR) bit set in the command. This way, 129 when an interrupt arrives at i82586_intr(), it is immediately possible 130 to tell what precisely caused it. ANY OTHER command-sending 131 routines should run at splnet(), and should post an acknowledgement 132 to every interrupt they generate. 133 134 To save the expense of shipping a command to 82586 every time we 135 want to send a frame, we use a linked list of commands consisting 136 of alternate XMIT and NOP commands. The links of these elements 137 are manipulated (in iexmit()) such that the NOP command loops back 138 to itself whenever the following XMIT command is not yet ready to 139 go. Whenever an XMIT is ready, the preceding NOP link is pointed 140 at it, while its own link field points to the following NOP command. 141 Thus, a single transmit command sets off an interlocked traversal 142 of the xmit command chain, with the host processor in control of 143 the synchronization. 144 */ 145 146 #include <sys/cdefs.h> 147 __KERNEL_RCSID(0, "$NetBSD: i82586.c,v 1.55 2005/12/24 23:41:33 perry Exp $"); 148 149 #include "bpfilter.h" 150 151 #include <sys/param.h> 152 #include <sys/systm.h> 153 #include <sys/mbuf.h> 154 #include <sys/socket.h> 155 #include <sys/ioctl.h> 156 #include <sys/errno.h> 157 #include <sys/syslog.h> 158 #include <sys/device.h> 159 160 #include <net/if.h> 161 #include <net/if_dl.h> 162 #include <net/if_types.h> 163 #include <net/if_media.h> 164 #include <net/if_ether.h> 165 166 #if NBPFILTER > 0 167 #include <net/bpf.h> 168 #include <net/bpfdesc.h> 169 #endif 170 171 #include <machine/bus.h> 172 173 #include <dev/ic/i82586reg.h> 174 #include <dev/ic/i82586var.h> 175 176 void i82586_reset(struct ie_softc *, int); 177 void i82586_watchdog(struct ifnet *); 178 int i82586_init(struct ifnet *); 179 int i82586_ioctl(struct ifnet *, u_long, caddr_t); 180 void i82586_start(struct ifnet *); 181 void i82586_stop(struct ifnet *, int); 182 183 184 int i82586_rint(struct ie_softc *, int); 185 int i82586_tint(struct ie_softc *, int); 186 187 int i82586_mediachange(struct ifnet *); 188 void i82586_mediastatus(struct ifnet *, struct ifmediareq *); 189 190 static int ie_readframe(struct ie_softc *, int); 191 static struct mbuf *ieget(struct ie_softc *, int, int); 192 static int i82586_get_rbd_list(struct ie_softc *, 193 u_int16_t *, u_int16_t *, int *); 194 static void i82586_release_rbd_list(struct ie_softc *, 195 u_int16_t, u_int16_t); 196 static int i82586_drop_frames(struct ie_softc *); 197 static int i82586_chk_rx_ring(struct ie_softc *); 198 199 static inline void ie_ack(struct ie_softc *, u_int); 200 static inline void iexmit(struct ie_softc *); 201 static void i82586_start_transceiver(struct ie_softc *); 202 203 static void i82586_count_errors(struct ie_softc *); 204 static void i82586_rx_errors(struct ie_softc *, int, int); 205 static void i82586_setup_bufs(struct ie_softc *); 206 static void setup_simple_command(struct ie_softc *, int, int); 207 static int ie_cfg_setup(struct ie_softc *, int, int, int); 208 static int ie_ia_setup(struct ie_softc *, int); 209 static void ie_run_tdr(struct ie_softc *, int); 210 static int ie_mc_setup(struct ie_softc *, int); 211 static void ie_mc_reset(struct ie_softc *); 212 static int i82586_start_cmd(struct ie_softc *, int, int, int, int); 213 static int i82586_cmd_wait(struct ie_softc *); 214 215 #if I82586_DEBUG 216 void print_rbd(struct ie_softc *, int); 217 #endif 218 219 static char* padbuf = NULL; 220 221 /* 222 * Front-ends call this function to attach to the MI driver. 223 * 224 * The front-end has responsibility for managing the ICP and ISCP 225 * structures. Both of these are opaque to us. Also, the front-end 226 * chooses a location for the SCB which is expected to be addressable 227 * (through `sc->scb') as an offset against the shared-memory bus handle. 228 * 229 * The following MD interface function must be setup by the front-end 230 * before calling here: 231 * 232 * hwreset - board dependent reset 233 * hwinit - board dependent initialization 234 * chan_attn - channel attention 235 * intrhook - board dependent interrupt processing 236 * memcopyin - shared memory copy: board to KVA 237 * memcopyout - shared memory copy: KVA to board 238 * ie_bus_read16 - read a sixteen-bit i82586 pointer 239 * ie_bus_write16 - write a sixteen-bit i82586 pointer 240 * ie_bus_write24 - write a twenty-four-bit i82586 pointer 241 * 242 */ 243 void 244 i82586_attach(sc, name, etheraddr, media, nmedia, defmedia) 245 struct ie_softc *sc; 246 const char *name; 247 u_int8_t *etheraddr; 248 int *media, nmedia, defmedia; 249 { 250 int i; 251 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 252 253 strcpy(ifp->if_xname, sc->sc_dev.dv_xname); 254 ifp->if_softc = sc; 255 ifp->if_start = i82586_start; 256 ifp->if_ioctl = i82586_ioctl; 257 ifp->if_init = i82586_init; 258 ifp->if_stop = i82586_stop; 259 ifp->if_watchdog = i82586_watchdog; 260 ifp->if_flags = 261 IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS | IFF_MULTICAST; 262 IFQ_SET_READY(&ifp->if_snd); 263 264 /* Initialize media goo. */ 265 ifmedia_init(&sc->sc_media, 0, i82586_mediachange, i82586_mediastatus); 266 if (media != NULL) { 267 for (i = 0; i < nmedia; i++) 268 ifmedia_add(&sc->sc_media, media[i], 0, NULL); 269 ifmedia_set(&sc->sc_media, defmedia); 270 } else { 271 ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL); 272 ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL); 273 } 274 275 if (padbuf == NULL) { 276 padbuf = malloc(ETHER_MIN_LEN - ETHER_CRC_LEN, M_DEVBUF, 277 M_ZERO | M_NOWAIT); 278 if (padbuf == NULL) { 279 printf("%s: can't allocate pad buffer\n", 280 sc->sc_dev.dv_xname); 281 return; 282 } 283 } 284 285 /* Attach the interface. */ 286 if_attach(ifp); 287 ether_ifattach(ifp, etheraddr); 288 289 printf(" address %s, type %s\n", ether_sprintf(etheraddr), name); 290 } 291 292 293 /* 294 * Device timeout/watchdog routine. 295 * Entered if the device neglects to generate an interrupt after a 296 * transmit has been started on it. 297 */ 298 void 299 i82586_watchdog(ifp) 300 struct ifnet *ifp; 301 { 302 struct ie_softc *sc = ifp->if_softc; 303 304 log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname); 305 ++ifp->if_oerrors; 306 307 i82586_reset(sc, 1); 308 } 309 310 static int 311 i82586_cmd_wait(sc) 312 struct ie_softc *sc; 313 { 314 /* spin on i82586 command acknowledge; wait at most 0.9 (!) seconds */ 315 int i, off; 316 u_int16_t cmd; 317 318 for (i = 0; i < 900000; i++) { 319 /* Read the command word */ 320 off = IE_SCB_CMD(sc->scb); 321 322 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ); 323 if ((cmd = sc->ie_bus_read16(sc, off)) == 0) 324 return (0); 325 delay(1); 326 } 327 328 off = IE_SCB_STATUS(sc->scb); 329 printf("i82586_cmd_wait: timo(%ssync): scb status: 0x%x, cmd: 0x%x\n", 330 sc->async_cmd_inprogress?"a":"", 331 sc->ie_bus_read16(sc, off), cmd); 332 333 return (1); /* Timeout */ 334 } 335 336 /* 337 * Send a command to the controller and wait for it to either complete 338 * or be accepted, depending on the command. If the command pointer 339 * is null, then pretend that the command is not an action command. 340 * If the command pointer is not null, and the command is an action 341 * command, wait for one of the MASK bits to turn on in the command's 342 * status field. 343 * If ASYNC is set, we just call the chip's attention and return. 344 * We may have to wait for the command's acceptance later though. 345 */ 346 static int 347 i82586_start_cmd(sc, cmd, iecmdbuf, mask, async) 348 struct ie_softc *sc; 349 int cmd; 350 int iecmdbuf; 351 int mask; 352 int async; 353 { 354 int i; 355 int off; 356 357 if (sc->async_cmd_inprogress != 0) { 358 /* 359 * If previous command was issued asynchronously, wait 360 * for it now. 361 */ 362 if (i82586_cmd_wait(sc) != 0) 363 return (1); 364 sc->async_cmd_inprogress = 0; 365 } 366 367 off = IE_SCB_CMD(sc->scb); 368 sc->ie_bus_write16(sc, off, cmd); 369 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE); 370 (sc->chan_attn)(sc, CARD_RESET); 371 372 if (async != 0) { 373 sc->async_cmd_inprogress = 1; 374 return (0); 375 } 376 377 if (IE_ACTION_COMMAND(cmd) && iecmdbuf) { 378 int status; 379 /* 380 * Now spin-lock waiting for status. This is not a very nice 381 * thing to do, and can kill performance pretty well... 382 * According to the packet driver, the minimum timeout 383 * should be .369 seconds. 384 */ 385 for (i = 0; i < 369000; i++) { 386 /* Read the command status */ 387 off = IE_CMD_COMMON_STATUS(iecmdbuf); 388 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ); 389 status = sc->ie_bus_read16(sc, off); 390 if (status & mask) 391 return (0); 392 delay(1); 393 } 394 395 } else { 396 /* 397 * Otherwise, just wait for the command to be accepted. 398 */ 399 return (i82586_cmd_wait(sc)); 400 } 401 402 /* Timeout */ 403 return (1); 404 } 405 406 /* 407 * Interrupt Acknowledge. 408 */ 409 static inline void 410 ie_ack(sc, mask) 411 struct ie_softc *sc; 412 u_int mask; /* in native byte-order */ 413 { 414 u_int status; 415 416 IE_BUS_BARRIER(sc, 0, 0, BUS_SPACE_BARRIER_READ); 417 status = sc->ie_bus_read16(sc, IE_SCB_STATUS(sc->scb)); 418 i82586_start_cmd(sc, status & mask, 0, 0, 0); 419 if (sc->intrhook) 420 sc->intrhook(sc, INTR_ACK); 421 } 422 423 /* 424 * Transfer accumulated chip error counters to IF. 425 */ 426 static inline void 427 i82586_count_errors(sc) 428 struct ie_softc *sc; 429 { 430 int scb = sc->scb; 431 432 sc->sc_ethercom.ec_if.if_ierrors += 433 sc->ie_bus_read16(sc, IE_SCB_ERRCRC(scb)) + 434 sc->ie_bus_read16(sc, IE_SCB_ERRALN(scb)) + 435 sc->ie_bus_read16(sc, IE_SCB_ERRRES(scb)) + 436 sc->ie_bus_read16(sc, IE_SCB_ERROVR(scb)); 437 438 /* Clear error counters */ 439 sc->ie_bus_write16(sc, IE_SCB_ERRCRC(scb), 0); 440 sc->ie_bus_write16(sc, IE_SCB_ERRALN(scb), 0); 441 sc->ie_bus_write16(sc, IE_SCB_ERRRES(scb), 0); 442 sc->ie_bus_write16(sc, IE_SCB_ERROVR(scb), 0); 443 } 444 445 static void 446 i82586_rx_errors(sc, fn, status) 447 struct ie_softc *sc; 448 int fn; 449 int status; 450 { 451 char bits[128]; 452 453 log(LOG_ERR, "%s: rx error (frame# %d): %s\n", sc->sc_dev.dv_xname, fn, 454 bitmask_snprintf(status, IE_FD_STATUSBITS, bits, sizeof(bits))); 455 } 456 457 /* 458 * i82586 interrupt entry point. 459 */ 460 int 461 i82586_intr(v) 462 void *v; 463 { 464 struct ie_softc *sc = v; 465 u_int status; 466 int off; 467 468 /* 469 * Implementation dependent interrupt handling. 470 */ 471 if (sc->intrhook) 472 (sc->intrhook)(sc, INTR_ENTER); 473 474 off = IE_SCB_STATUS(sc->scb); 475 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ); 476 status = sc->ie_bus_read16(sc, off) & IE_ST_WHENCE; 477 478 if ((status & IE_ST_WHENCE) == 0) { 479 if (sc->intrhook) 480 (sc->intrhook)(sc, INTR_EXIT); 481 482 return (0); 483 } 484 485 loop: 486 /* Ack interrupts FIRST in case we receive more during the ISR. */ 487 #if 0 488 ie_ack(sc, status & IE_ST_WHENCE); 489 #endif 490 i82586_start_cmd(sc, status & IE_ST_WHENCE, 0, 0, 1); 491 492 if (status & (IE_ST_FR | IE_ST_RNR)) 493 if (i82586_rint(sc, status) != 0) 494 goto reset; 495 496 if (status & IE_ST_CX) 497 if (i82586_tint(sc, status) != 0) 498 goto reset; 499 500 #if I82586_DEBUG 501 if ((status & IE_ST_CNA) && (sc->sc_debug & IED_CNA)) 502 printf("%s: cna; status=0x%x\n", sc->sc_dev.dv_xname, status); 503 #endif 504 if (sc->intrhook) 505 (sc->intrhook)(sc, INTR_LOOP); 506 507 /* 508 * Interrupt ACK was posted asynchronously; wait for 509 * completion here before reading SCB status again. 510 * 511 * If ACK fails, try to reset the chip, in hopes that 512 * it helps. 513 */ 514 if (i82586_cmd_wait(sc) != 0) 515 goto reset; 516 517 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ); 518 status = sc->ie_bus_read16(sc, off); 519 if ((status & IE_ST_WHENCE) != 0) 520 goto loop; 521 522 out: 523 if (sc->intrhook) 524 (sc->intrhook)(sc, INTR_EXIT); 525 return (1); 526 527 reset: 528 i82586_cmd_wait(sc); 529 i82586_reset(sc, 1); 530 goto out; 531 532 } 533 534 /* 535 * Process a received-frame interrupt. 536 */ 537 int 538 i82586_rint(sc, scbstatus) 539 struct ie_softc *sc; 540 int scbstatus; 541 { 542 static int timesthru = 1024; 543 int i, status, off; 544 545 #if I82586_DEBUG 546 if (sc->sc_debug & IED_RINT) 547 printf("%s: rint: status 0x%x\n", 548 sc->sc_dev.dv_xname, scbstatus); 549 #endif 550 551 for (;;) { 552 int drop = 0; 553 554 i = sc->rfhead; 555 off = IE_RFRAME_STATUS(sc->rframes, i); 556 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ); 557 status = sc->ie_bus_read16(sc, off); 558 559 #if I82586_DEBUG 560 if (sc->sc_debug & IED_RINT) 561 printf("%s: rint: frame(%d) status 0x%x\n", 562 sc->sc_dev.dv_xname, i, status); 563 #endif 564 if ((status & IE_FD_COMPLETE) == 0) { 565 if ((status & IE_FD_OK) != 0) { 566 printf("%s: rint: weird: ", 567 sc->sc_dev.dv_xname); 568 i82586_rx_errors(sc, i, status); 569 break; 570 } 571 if (--timesthru == 0) { 572 /* Account the accumulated errors */ 573 i82586_count_errors(sc); 574 timesthru = 1024; 575 } 576 break; 577 } else if ((status & IE_FD_OK) == 0) { 578 /* 579 * If the chip is configured to automatically 580 * discard bad frames, the only reason we can 581 * get here is an "out-of-resource" condition. 582 */ 583 i82586_rx_errors(sc, i, status); 584 drop = 1; 585 } 586 587 #if I82586_DEBUG 588 if ((status & IE_FD_BUSY) != 0) 589 printf("%s: rint: frame(%d) busy; status=0x%x\n", 590 sc->sc_dev.dv_xname, i, status); 591 #endif 592 593 594 /* 595 * Advance the RFD list, since we're done with 596 * this descriptor. 597 */ 598 599 /* Clear frame status */ 600 sc->ie_bus_write16(sc, off, 0); 601 602 /* Put fence at this frame (the head) */ 603 off = IE_RFRAME_LAST(sc->rframes, i); 604 sc->ie_bus_write16(sc, off, IE_FD_EOL|IE_FD_SUSP); 605 606 /* and clear RBD field */ 607 off = IE_RFRAME_BUFDESC(sc->rframes, i); 608 sc->ie_bus_write16(sc, off, 0xffff); 609 610 /* Remove fence from current tail */ 611 off = IE_RFRAME_LAST(sc->rframes, sc->rftail); 612 sc->ie_bus_write16(sc, off, 0); 613 614 if (++sc->rftail == sc->nframes) 615 sc->rftail = 0; 616 if (++sc->rfhead == sc->nframes) 617 sc->rfhead = 0; 618 619 /* Pull the frame off the board */ 620 if (drop) { 621 i82586_drop_frames(sc); 622 if ((status & IE_FD_RNR) != 0) 623 sc->rnr_expect = 1; 624 sc->sc_ethercom.ec_if.if_ierrors++; 625 } else if (ie_readframe(sc, i) != 0) 626 return (1); 627 } 628 629 if ((scbstatus & IE_ST_RNR) != 0) { 630 631 /* 632 * Receiver went "Not Ready". We try to figure out 633 * whether this was an expected event based on past 634 * frame status values. 635 */ 636 637 if ((scbstatus & IE_RUS_SUSPEND) != 0) { 638 /* 639 * We use the "suspend on last frame" flag. 640 * Send a RU RESUME command in response, since 641 * we should have dealt with all completed frames 642 * by now. 643 */ 644 printf("RINT: SUSPENDED; scbstatus=0x%x\n", 645 scbstatus); 646 if (i82586_start_cmd(sc, IE_RUC_RESUME, 0, 0, 0) == 0) 647 return (0); 648 printf("%s: RU RESUME command timed out\n", 649 sc->sc_dev.dv_xname); 650 return (1); /* Ask for a reset */ 651 } 652 653 if (sc->rnr_expect != 0) { 654 /* 655 * The RNR condition was announced in the previously 656 * completed frame. Assume the receive ring is Ok, 657 * so restart the receiver without further delay. 658 */ 659 i82586_start_transceiver(sc); 660 sc->rnr_expect = 0; 661 return (0); 662 663 } else if ((scbstatus & IE_RUS_NOSPACE) != 0) { 664 /* 665 * We saw no previous IF_FD_RNR flag. 666 * We check our ring invariants and, if ok, 667 * just restart the receiver at the current 668 * point in the ring. 669 */ 670 if (i82586_chk_rx_ring(sc) != 0) 671 return (1); 672 673 i82586_start_transceiver(sc); 674 sc->sc_ethercom.ec_if.if_ierrors++; 675 return (0); 676 } else 677 printf("%s: receiver not ready; scbstatus=0x%x\n", 678 sc->sc_dev.dv_xname, scbstatus); 679 680 sc->sc_ethercom.ec_if.if_ierrors++; 681 return (1); /* Ask for a reset */ 682 } 683 684 return (0); 685 } 686 687 /* 688 * Process a command-complete interrupt. These are only generated by the 689 * transmission of frames. This routine is deceptively simple, since most 690 * of the real work is done by i82586_start(). 691 */ 692 int 693 i82586_tint(sc, scbstatus) 694 struct ie_softc *sc; 695 int scbstatus; 696 { 697 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 698 int status; 699 700 ifp->if_timer = 0; 701 ifp->if_flags &= ~IFF_OACTIVE; 702 703 #if I82586_DEBUG 704 if (sc->xmit_busy <= 0) { 705 printf("i82586_tint: WEIRD: xmit_busy=%d, xctail=%d, xchead=%d\n", 706 sc->xmit_busy, sc->xctail, sc->xchead); 707 return (0); 708 } 709 #endif 710 711 status = sc->ie_bus_read16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds, 712 sc->xctail)); 713 714 #if I82586_DEBUG 715 if (sc->sc_debug & IED_TINT) 716 printf("%s: tint: SCB status 0x%x; xmit status 0x%x\n", 717 sc->sc_dev.dv_xname, scbstatus, status); 718 #endif 719 720 if ((status & IE_STAT_COMPL) == 0 || (status & IE_STAT_BUSY)) { 721 printf("i82586_tint: command still busy; status=0x%x; tail=%d\n", 722 status, sc->xctail); 723 printf("iestatus = 0x%x\n", scbstatus); 724 } 725 726 if (status & IE_STAT_OK) { 727 ifp->if_opackets++; 728 ifp->if_collisions += (status & IE_XS_MAXCOLL); 729 } else { 730 ifp->if_oerrors++; 731 /* 732 * Check SQE and DEFERRED? 733 * What if more than one bit is set? 734 */ 735 if (status & IE_STAT_ABORT) 736 printf("%s: send aborted\n", sc->sc_dev.dv_xname); 737 else if (status & IE_XS_NOCARRIER) 738 printf("%s: no carrier\n", sc->sc_dev.dv_xname); 739 else if (status & IE_XS_LOSTCTS) 740 printf("%s: lost CTS\n", sc->sc_dev.dv_xname); 741 else if (status & IE_XS_UNDERRUN) 742 printf("%s: DMA underrun\n", sc->sc_dev.dv_xname); 743 else if (status & IE_XS_EXCMAX) { 744 printf("%s: too many collisions\n", 745 sc->sc_dev.dv_xname); 746 sc->sc_ethercom.ec_if.if_collisions += 16; 747 } 748 } 749 750 /* 751 * If multicast addresses were added or deleted while transmitting, 752 * ie_mc_reset() set the want_mcsetup flag indicating that we 753 * should do it. 754 */ 755 if (sc->want_mcsetup) { 756 ie_mc_setup(sc, IE_XBUF_ADDR(sc, sc->xctail)); 757 sc->want_mcsetup = 0; 758 } 759 760 /* Done with the buffer. */ 761 sc->xmit_busy--; 762 sc->xctail = (sc->xctail + 1) % NTXBUF; 763 764 /* Start the next packet, if any, transmitting. */ 765 if (sc->xmit_busy > 0) 766 iexmit(sc); 767 768 i82586_start(ifp); 769 return (0); 770 } 771 772 /* 773 * Get a range of receive buffer descriptors that represent one packet. 774 */ 775 static int 776 i82586_get_rbd_list(sc, start, end, pktlen) 777 struct ie_softc *sc; 778 u_int16_t *start; 779 u_int16_t *end; 780 int *pktlen; 781 { 782 int off, rbbase = sc->rbds; 783 int rbindex, count = 0; 784 int plen = 0; 785 int rbdstatus; 786 787 *start = rbindex = sc->rbhead; 788 789 do { 790 off = IE_RBD_STATUS(rbbase, rbindex); 791 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ); 792 rbdstatus = sc->ie_bus_read16(sc, off); 793 if ((rbdstatus & IE_RBD_USED) == 0) { 794 /* 795 * This means we are somehow out of sync. So, we 796 * reset the adapter. 797 */ 798 #if I82586_DEBUG 799 print_rbd(sc, rbindex); 800 #endif 801 log(LOG_ERR, 802 "%s: receive descriptors out of sync at %d\n", 803 sc->sc_dev.dv_xname, rbindex); 804 return (0); 805 } 806 plen += (rbdstatus & IE_RBD_CNTMASK); 807 808 if (++rbindex == sc->nrxbuf) 809 rbindex = 0; 810 811 ++count; 812 } while ((rbdstatus & IE_RBD_LAST) == 0); 813 *end = rbindex; 814 *pktlen = plen; 815 return (count); 816 } 817 818 819 /* 820 * Release a range of receive buffer descriptors after we've copied the packet. 821 */ 822 static void 823 i82586_release_rbd_list(sc, start, end) 824 struct ie_softc *sc; 825 u_int16_t start; 826 u_int16_t end; 827 { 828 int off, rbbase = sc->rbds; 829 int rbindex = start; 830 831 do { 832 /* Clear buffer status */ 833 off = IE_RBD_STATUS(rbbase, rbindex); 834 sc->ie_bus_write16(sc, off, 0); 835 if (++rbindex == sc->nrxbuf) 836 rbindex = 0; 837 } while (rbindex != end); 838 839 /* Mark EOL at new tail */ 840 rbindex = ((rbindex == 0) ? sc->nrxbuf : rbindex) - 1; 841 off = IE_RBD_BUFLEN(rbbase, rbindex); 842 sc->ie_bus_write16(sc, off, IE_RBUF_SIZE|IE_RBD_EOL); 843 844 /* Remove EOL from current tail */ 845 off = IE_RBD_BUFLEN(rbbase, sc->rbtail); 846 sc->ie_bus_write16(sc, off, IE_RBUF_SIZE); 847 848 /* New head & tail pointer */ 849 /* hmm, why have both? head is always (tail + 1) % NRXBUF */ 850 sc->rbhead = end; 851 sc->rbtail = rbindex; 852 } 853 854 /* 855 * Drop the packet at the head of the RX buffer ring. 856 * Called if the frame descriptor reports an error on this packet. 857 * Returns 1 if the buffer descriptor ring appears to be corrupt; 858 * and 0 otherwise. 859 */ 860 static int 861 i82586_drop_frames(sc) 862 struct ie_softc *sc; 863 { 864 u_int16_t bstart, bend; 865 int pktlen; 866 867 if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0) 868 return (1); 869 i82586_release_rbd_list(sc, bstart, bend); 870 return (0); 871 } 872 873 /* 874 * Check the RX frame & buffer descriptor lists for our invariants, 875 * i.e.: EOL bit set iff. it is pointed at by the r*tail pointer. 876 * 877 * Called when the receive unit has stopped unexpectedly. 878 * Returns 1 if an inconsistency is detected; 0 otherwise. 879 * 880 * The Receive Unit is expected to be NOT RUNNING. 881 */ 882 static int 883 i82586_chk_rx_ring(sc) 884 struct ie_softc *sc; 885 { 886 int n, off, val; 887 888 for (n = 0; n < sc->nrxbuf; n++) { 889 off = IE_RBD_BUFLEN(sc->rbds, n); 890 val = sc->ie_bus_read16(sc, off); 891 if ((n == sc->rbtail) ^ ((val & IE_RBD_EOL) != 0)) { 892 /* `rbtail' and EOL flag out of sync */ 893 log(LOG_ERR, 894 "%s: rx buffer descriptors out of sync at %d\n", 895 sc->sc_dev.dv_xname, n); 896 return (1); 897 } 898 899 /* Take the opportunity to clear the status fields here ? */ 900 } 901 902 for (n = 0; n < sc->nframes; n++) { 903 off = IE_RFRAME_LAST(sc->rframes, n); 904 val = sc->ie_bus_read16(sc, off); 905 if ((n == sc->rftail) ^ ((val & (IE_FD_EOL|IE_FD_SUSP)) != 0)) { 906 /* `rftail' and EOL flag out of sync */ 907 log(LOG_ERR, 908 "%s: rx frame list out of sync at %d\n", 909 sc->sc_dev.dv_xname, n); 910 return (1); 911 } 912 } 913 914 return (0); 915 } 916 917 /* 918 * Read data off the interface, and turn it into an mbuf chain. 919 * 920 * This code is DRAMATICALLY different from the previous version; this 921 * version tries to allocate the entire mbuf chain up front, given the 922 * length of the data available. This enables us to allocate mbuf 923 * clusters in many situations where before we would have had a long 924 * chain of partially-full mbufs. This should help to speed up the 925 * operation considerably. (Provided that it works, of course.) 926 */ 927 static inline struct mbuf * 928 ieget(sc, head, totlen) 929 struct ie_softc *sc; 930 int head; 931 int totlen; 932 { 933 struct mbuf *m, *m0, *newm; 934 int len, resid; 935 int thisrboff, thismboff; 936 struct ether_header eh; 937 938 /* 939 * Snarf the Ethernet header. 940 */ 941 (sc->memcopyin)(sc, &eh, IE_RBUF_ADDR(sc, head), 942 sizeof(struct ether_header)); 943 944 resid = totlen; 945 946 MGETHDR(m0, M_DONTWAIT, MT_DATA); 947 if (m0 == 0) 948 return (0); 949 m0->m_pkthdr.rcvif = &sc->sc_ethercom.ec_if; 950 m0->m_pkthdr.len = totlen; 951 len = MHLEN; 952 m = m0; 953 954 /* 955 * This loop goes through and allocates mbufs for all the data we will 956 * be copying in. It does not actually do the copying yet. 957 */ 958 while (totlen > 0) { 959 if (totlen >= MINCLSIZE) { 960 MCLGET(m, M_DONTWAIT); 961 if ((m->m_flags & M_EXT) == 0) 962 goto bad; 963 len = MCLBYTES; 964 } 965 966 if (m == m0) { 967 caddr_t newdata = (caddr_t) 968 ALIGN(m->m_data + sizeof(struct ether_header)) - 969 sizeof(struct ether_header); 970 len -= newdata - m->m_data; 971 m->m_data = newdata; 972 } 973 974 m->m_len = len = min(totlen, len); 975 976 totlen -= len; 977 if (totlen > 0) { 978 MGET(newm, M_DONTWAIT, MT_DATA); 979 if (newm == 0) 980 goto bad; 981 len = MLEN; 982 m = m->m_next = newm; 983 } 984 } 985 986 m = m0; 987 thismboff = 0; 988 989 /* 990 * Copy the Ethernet header into the mbuf chain. 991 */ 992 memcpy(mtod(m, caddr_t), &eh, sizeof(struct ether_header)); 993 thismboff = sizeof(struct ether_header); 994 thisrboff = sizeof(struct ether_header); 995 resid -= sizeof(struct ether_header); 996 997 /* 998 * Now we take the mbuf chain (hopefully only one mbuf most of the 999 * time) and stuff the data into it. There are no possible failures 1000 * at or after this point. 1001 */ 1002 while (resid > 0) { 1003 int thisrblen = IE_RBUF_SIZE - thisrboff, 1004 thismblen = m->m_len - thismboff; 1005 len = min(thisrblen, thismblen); 1006 1007 (sc->memcopyin)(sc, mtod(m, caddr_t) + thismboff, 1008 IE_RBUF_ADDR(sc,head) + thisrboff, 1009 (u_int)len); 1010 resid -= len; 1011 1012 if (len == thismblen) { 1013 m = m->m_next; 1014 thismboff = 0; 1015 } else 1016 thismboff += len; 1017 1018 if (len == thisrblen) { 1019 if (++head == sc->nrxbuf) 1020 head = 0; 1021 thisrboff = 0; 1022 } else 1023 thisrboff += len; 1024 } 1025 1026 /* 1027 * Unless something changed strangely while we were doing the copy, 1028 * we have now copied everything in from the shared memory. 1029 * This means that we are done. 1030 */ 1031 return (m0); 1032 1033 bad: 1034 m_freem(m0); 1035 return (0); 1036 } 1037 1038 /* 1039 * Read frame NUM from unit UNIT (pre-cached as IE). 1040 * 1041 * This routine reads the RFD at NUM, and copies in the buffers from the list 1042 * of RBD, then rotates the RBD list so that the receiver doesn't start 1043 * complaining. Trailers are DROPPED---there's no point in wasting time 1044 * on confusing code to deal with them. Hopefully, this machine will 1045 * never ARP for trailers anyway. 1046 */ 1047 static int 1048 ie_readframe(sc, num) 1049 struct ie_softc *sc; 1050 int num; /* frame number to read */ 1051 { 1052 struct mbuf *m; 1053 u_int16_t bstart, bend; 1054 int pktlen; 1055 1056 if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0) { 1057 sc->sc_ethercom.ec_if.if_ierrors++; 1058 return (1); 1059 } 1060 1061 m = ieget(sc, bstart, pktlen); 1062 i82586_release_rbd_list(sc, bstart, bend); 1063 1064 if (m == 0) { 1065 sc->sc_ethercom.ec_if.if_ierrors++; 1066 return (0); 1067 } 1068 1069 #if I82586_DEBUG 1070 if (sc->sc_debug & IED_READFRAME) { 1071 struct ether_header *eh = mtod(m, struct ether_header *); 1072 1073 printf("%s: frame from ether %s type 0x%x len %d\n", 1074 sc->sc_dev.dv_xname, 1075 ether_sprintf(eh->ether_shost), 1076 (u_int)ntohs(eh->ether_type), 1077 pktlen); 1078 } 1079 #endif 1080 1081 #if NBPFILTER > 0 1082 /* Check for a BPF filter; if so, hand it up. */ 1083 if (sc->sc_ethercom.ec_if.if_bpf != 0) 1084 /* Pass it up. */ 1085 bpf_mtap(sc->sc_ethercom.ec_if.if_bpf, m); 1086 #endif /* NBPFILTER > 0 */ 1087 1088 /* 1089 * Finally pass this packet up to higher layers. 1090 */ 1091 (*sc->sc_ethercom.ec_if.if_input)(&sc->sc_ethercom.ec_if, m); 1092 sc->sc_ethercom.ec_if.if_ipackets++; 1093 return (0); 1094 } 1095 1096 1097 /* 1098 * Setup all necessary artifacts for an XMIT command, and then pass the XMIT 1099 * command to the chip to be executed. 1100 */ 1101 static inline void 1102 iexmit(sc) 1103 struct ie_softc *sc; 1104 { 1105 int off; 1106 int cur, prev; 1107 1108 cur = sc->xctail; 1109 1110 #if I82586_DEBUG 1111 if (sc->sc_debug & IED_XMIT) 1112 printf("%s: xmit buffer %d\n", sc->sc_dev.dv_xname, cur); 1113 #endif 1114 1115 /* 1116 * Setup the transmit command. 1117 */ 1118 sc->ie_bus_write16(sc, IE_CMD_XMIT_DESC(sc->xmit_cmds, cur), 1119 IE_XBD_ADDR(sc->xbds, cur)); 1120 1121 sc->ie_bus_write16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds, cur), 0); 1122 1123 if (sc->do_xmitnopchain) { 1124 /* 1125 * Gate this XMIT command to the following NOP 1126 */ 1127 sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds, cur), 1128 IE_CMD_NOP_ADDR(sc->nop_cmds, cur)); 1129 sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur), 1130 IE_CMD_XMIT | IE_CMD_INTR); 1131 1132 /* 1133 * Loopback at following NOP 1134 */ 1135 sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, cur), 0); 1136 sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, cur), 1137 IE_CMD_NOP_ADDR(sc->nop_cmds, cur)); 1138 1139 /* 1140 * Gate preceding NOP to this XMIT command 1141 */ 1142 prev = (cur + NTXBUF - 1) % NTXBUF; 1143 sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, prev), 0); 1144 sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, prev), 1145 IE_CMD_XMIT_ADDR(sc->xmit_cmds, cur)); 1146 1147 off = IE_SCB_STATUS(sc->scb); 1148 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ); 1149 if ((sc->ie_bus_read16(sc, off) & IE_CUS_ACTIVE) == 0) { 1150 printf("iexmit: CU not active\n"); 1151 i82586_start_transceiver(sc); 1152 } 1153 } else { 1154 sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds,cur), 1155 0xffff); 1156 1157 sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur), 1158 IE_CMD_XMIT | IE_CMD_INTR | IE_CMD_LAST); 1159 1160 off = IE_SCB_CMDLST(sc->scb); 1161 sc->ie_bus_write16(sc, off, IE_CMD_XMIT_ADDR(sc->xmit_cmds, cur)); 1162 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ); 1163 1164 if (i82586_start_cmd(sc, IE_CUC_START, 0, 0, 1)) 1165 printf("%s: iexmit: start xmit command timed out\n", 1166 sc->sc_dev.dv_xname); 1167 } 1168 1169 sc->sc_ethercom.ec_if.if_timer = 5; 1170 } 1171 1172 1173 /* 1174 * Start transmission on an interface. 1175 */ 1176 void 1177 i82586_start(ifp) 1178 struct ifnet *ifp; 1179 { 1180 struct ie_softc *sc = ifp->if_softc; 1181 struct mbuf *m0, *m; 1182 int buffer, head, xbase; 1183 u_short len; 1184 int s; 1185 1186 if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING) 1187 return; 1188 1189 for (;;) { 1190 if (sc->xmit_busy == NTXBUF) { 1191 ifp->if_flags |= IFF_OACTIVE; 1192 break; 1193 } 1194 1195 head = sc->xchead; 1196 xbase = sc->xbds; 1197 1198 IFQ_DEQUEUE(&ifp->if_snd, m0); 1199 if (m0 == 0) 1200 break; 1201 1202 /* We need to use m->m_pkthdr.len, so require the header */ 1203 if ((m0->m_flags & M_PKTHDR) == 0) 1204 panic("i82586_start: no header mbuf"); 1205 1206 #if NBPFILTER > 0 1207 /* Tap off here if there is a BPF listener. */ 1208 if (ifp->if_bpf) 1209 bpf_mtap(ifp->if_bpf, m0); 1210 #endif 1211 1212 #if I82586_DEBUG 1213 if (sc->sc_debug & IED_ENQ) 1214 printf("%s: fill buffer %d\n", sc->sc_dev.dv_xname, 1215 sc->xchead); 1216 #endif 1217 1218 if (m0->m_pkthdr.len > IE_TBUF_SIZE) 1219 printf("%s: tbuf overflow\n", sc->sc_dev.dv_xname); 1220 1221 buffer = IE_XBUF_ADDR(sc, head); 1222 for (m = m0; m != 0; m = m->m_next) { 1223 (sc->memcopyout)(sc, mtod(m,caddr_t), buffer, m->m_len); 1224 buffer += m->m_len; 1225 } 1226 len = m0->m_pkthdr.len; 1227 if (len < ETHER_MIN_LEN - ETHER_CRC_LEN) { 1228 (sc->memcopyout)(sc, padbuf, buffer, 1229 ETHER_MIN_LEN - ETHER_CRC_LEN - len); 1230 buffer += ETHER_MIN_LEN -ETHER_CRC_LEN - len; 1231 len = ETHER_MIN_LEN - ETHER_CRC_LEN; 1232 } 1233 m_freem(m0); 1234 1235 /* 1236 * Setup the transmit buffer descriptor here, while we 1237 * know the packet's length. 1238 */ 1239 sc->ie_bus_write16(sc, IE_XBD_FLAGS(xbase, head), 1240 len | IE_TBD_EOL); 1241 sc->ie_bus_write16(sc, IE_XBD_NEXT(xbase, head), 0xffff); 1242 sc->ie_bus_write24(sc, IE_XBD_BUF(xbase, head), 1243 IE_XBUF_ADDR(sc, head)); 1244 1245 if (++head == NTXBUF) 1246 head = 0; 1247 sc->xchead = head; 1248 1249 s = splnet(); 1250 /* Start the first packet transmitting. */ 1251 if (sc->xmit_busy == 0) 1252 iexmit(sc); 1253 1254 sc->xmit_busy++; 1255 splx(s); 1256 } 1257 } 1258 1259 /* 1260 * Probe IE's ram setup [ Move all this into MD front-end!? ] 1261 * Use only if SCP and ISCP represent offsets into shared ram space. 1262 */ 1263 int 1264 i82586_proberam(sc) 1265 struct ie_softc *sc; 1266 { 1267 int result, off; 1268 1269 /* Put in 16-bit mode */ 1270 off = IE_SCP_BUS_USE(sc->scp); 1271 sc->ie_bus_write16(sc, off, IE_SYSBUS_16BIT); 1272 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE); 1273 1274 /* Set the ISCP `busy' bit */ 1275 off = IE_ISCP_BUSY(sc->iscp); 1276 sc->ie_bus_write16(sc, off, 1); 1277 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE); 1278 1279 if (sc->hwreset) 1280 (sc->hwreset)(sc, CHIP_PROBE); 1281 1282 (sc->chan_attn) (sc, CHIP_PROBE); 1283 1284 delay(100); /* wait a while... */ 1285 1286 /* Read back the ISCP `busy' bit; it should be clear by now */ 1287 off = IE_ISCP_BUSY(sc->iscp); 1288 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ); 1289 result = sc->ie_bus_read16(sc, off) == 0; 1290 1291 /* Acknowledge any interrupts we may have caused. */ 1292 ie_ack(sc, IE_ST_WHENCE); 1293 1294 return (result); 1295 } 1296 1297 void 1298 i82586_reset(sc, hard) 1299 struct ie_softc *sc; 1300 int hard; 1301 { 1302 int s = splnet(); 1303 1304 if (hard) 1305 printf("%s: reset\n", sc->sc_dev.dv_xname); 1306 1307 /* Clear OACTIVE in case we're called from watchdog (frozen xmit). */ 1308 sc->sc_ethercom.ec_if.if_timer = 0; 1309 sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE; 1310 1311 /* 1312 * Stop i82586 dead in its tracks. 1313 */ 1314 if (i82586_start_cmd(sc, IE_RUC_ABORT | IE_CUC_ABORT, 0, 0, 0)) 1315 printf("%s: abort commands timed out\n", sc->sc_dev.dv_xname); 1316 1317 /* 1318 * This can really slow down the i82586_reset() on some cards, but it's 1319 * necessary to unwedge other ones (eg, the Sun VME ones) from certain 1320 * lockups. 1321 */ 1322 if (hard && sc->hwreset) 1323 (sc->hwreset)(sc, CARD_RESET); 1324 1325 delay(100); 1326 ie_ack(sc, IE_ST_WHENCE); 1327 1328 if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) != 0) { 1329 int retries=0; /* XXX - find out why init sometimes fails */ 1330 while (retries++ < 2) 1331 if (i82586_init(&sc->sc_ethercom.ec_if) == 0) 1332 break; 1333 } 1334 1335 splx(s); 1336 } 1337 1338 1339 static void 1340 setup_simple_command(sc, cmd, cmdbuf) 1341 struct ie_softc *sc; 1342 int cmd; 1343 int cmdbuf; 1344 { 1345 /* Setup a simple command */ 1346 sc->ie_bus_write16(sc, IE_CMD_COMMON_STATUS(cmdbuf), 0); 1347 sc->ie_bus_write16(sc, IE_CMD_COMMON_CMD(cmdbuf), cmd | IE_CMD_LAST); 1348 sc->ie_bus_write16(sc, IE_CMD_COMMON_LINK(cmdbuf), 0xffff); 1349 1350 /* Assign the command buffer to the SCB command list */ 1351 sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb), cmdbuf); 1352 } 1353 1354 /* 1355 * Run the time-domain reflectometer. 1356 */ 1357 static void 1358 ie_run_tdr(sc, cmd) 1359 struct ie_softc *sc; 1360 int cmd; 1361 { 1362 int result; 1363 1364 setup_simple_command(sc, IE_CMD_TDR, cmd); 1365 sc->ie_bus_write16(sc, IE_CMD_TDR_TIME(cmd), 0); 1366 1367 if (i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0) || 1368 (sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd)) & IE_STAT_OK) == 0) 1369 result = 0x10000; /* XXX */ 1370 else 1371 result = sc->ie_bus_read16(sc, IE_CMD_TDR_TIME(cmd)); 1372 1373 /* Squash any pending interrupts */ 1374 ie_ack(sc, IE_ST_WHENCE); 1375 1376 if (result & IE_TDR_SUCCESS) 1377 return; 1378 1379 if (result & 0x10000) 1380 printf("%s: TDR command failed\n", sc->sc_dev.dv_xname); 1381 else if (result & IE_TDR_XCVR) 1382 printf("%s: transceiver problem\n", sc->sc_dev.dv_xname); 1383 else if (result & IE_TDR_OPEN) 1384 printf("%s: TDR detected incorrect termination %d clocks away\n", 1385 sc->sc_dev.dv_xname, result & IE_TDR_TIME); 1386 else if (result & IE_TDR_SHORT) 1387 printf("%s: TDR detected a short circuit %d clocks away\n", 1388 sc->sc_dev.dv_xname, result & IE_TDR_TIME); 1389 else 1390 printf("%s: TDR returned unknown status 0x%x\n", 1391 sc->sc_dev.dv_xname, result); 1392 } 1393 1394 1395 /* 1396 * i82586_setup_bufs: set up the buffers 1397 * 1398 * We have a block of KVA at sc->buf_area which is of size sc->buf_area_sz. 1399 * this is to be used for the buffers. The chip indexs its control data 1400 * structures with 16 bit offsets, and it indexes actual buffers with 1401 * 24 bit addresses. So we should allocate control buffers first so that 1402 * we don't overflow the 16 bit offset field. The number of transmit 1403 * buffers is fixed at compile time. 1404 * 1405 */ 1406 static void 1407 i82586_setup_bufs(sc) 1408 struct ie_softc *sc; 1409 { 1410 int ptr = sc->buf_area; /* memory pool */ 1411 int n, r; 1412 1413 /* 1414 * step 0: zero memory and figure out how many recv buffers and 1415 * frames we can have. 1416 */ 1417 ptr = (ptr + 3) & ~3; /* set alignment and stick with it */ 1418 1419 1420 /* 1421 * step 1: lay out data structures in the shared-memory area 1422 */ 1423 1424 /* The no-op commands; used if "nop-chaining" is in effect */ 1425 sc->nop_cmds = ptr; 1426 ptr += NTXBUF * IE_CMD_NOP_SZ; 1427 1428 /* The transmit commands */ 1429 sc->xmit_cmds = ptr; 1430 ptr += NTXBUF * IE_CMD_XMIT_SZ; 1431 1432 /* The transmit buffers descriptors */ 1433 sc->xbds = ptr; 1434 ptr += NTXBUF * IE_XBD_SZ; 1435 1436 /* The transmit buffers */ 1437 sc->xbufs = ptr; 1438 ptr += NTXBUF * IE_TBUF_SIZE; 1439 1440 ptr = (ptr + 3) & ~3; /* re-align.. just in case */ 1441 1442 /* Compute free space for RECV stuff */ 1443 n = sc->buf_area_sz - (ptr - sc->buf_area); 1444 1445 /* Compute size of one RECV frame */ 1446 r = IE_RFRAME_SZ + ((IE_RBD_SZ + IE_RBUF_SIZE) * B_PER_F); 1447 1448 sc->nframes = n / r; 1449 1450 if (sc->nframes <= 0) 1451 panic("ie: bogus buffer calc"); 1452 1453 sc->nrxbuf = sc->nframes * B_PER_F; 1454 1455 /* The receive frame descriptors */ 1456 sc->rframes = ptr; 1457 ptr += sc->nframes * IE_RFRAME_SZ; 1458 1459 /* The receive buffer descriptors */ 1460 sc->rbds = ptr; 1461 ptr += sc->nrxbuf * IE_RBD_SZ; 1462 1463 /* The receive buffers */ 1464 sc->rbufs = ptr; 1465 ptr += sc->nrxbuf * IE_RBUF_SIZE; 1466 1467 #if I82586_DEBUG 1468 printf("%s: %d frames %d bufs\n", sc->sc_dev.dv_xname, sc->nframes, 1469 sc->nrxbuf); 1470 #endif 1471 1472 /* 1473 * step 2: link together the recv frames and set EOL on last one 1474 */ 1475 for (n = 0; n < sc->nframes; n++) { 1476 int m = (n == sc->nframes - 1) ? 0 : n + 1; 1477 1478 /* Clear status */ 1479 sc->ie_bus_write16(sc, IE_RFRAME_STATUS(sc->rframes,n), 0); 1480 1481 /* RBD link = NULL */ 1482 sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes,n), 1483 0xffff); 1484 1485 /* Make a circular list */ 1486 sc->ie_bus_write16(sc, IE_RFRAME_NEXT(sc->rframes,n), 1487 IE_RFRAME_ADDR(sc->rframes,m)); 1488 1489 /* Mark last as EOL */ 1490 sc->ie_bus_write16(sc, IE_RFRAME_LAST(sc->rframes,n), 1491 ((m==0)? (IE_FD_EOL|IE_FD_SUSP) : 0)); 1492 } 1493 1494 /* 1495 * step 3: link the RBDs and set EOL on last one 1496 */ 1497 for (n = 0; n < sc->nrxbuf; n++) { 1498 int m = (n == sc->nrxbuf - 1) ? 0 : n + 1; 1499 1500 /* Clear status */ 1501 sc->ie_bus_write16(sc, IE_RBD_STATUS(sc->rbds,n), 0); 1502 1503 /* Make a circular list */ 1504 sc->ie_bus_write16(sc, IE_RBD_NEXT(sc->rbds,n), 1505 IE_RBD_ADDR(sc->rbds,m)); 1506 1507 /* Link to data buffers */ 1508 sc->ie_bus_write24(sc, IE_RBD_BUFADDR(sc->rbds, n), 1509 IE_RBUF_ADDR(sc, n)); 1510 sc->ie_bus_write16(sc, IE_RBD_BUFLEN(sc->rbds,n), 1511 IE_RBUF_SIZE | ((m==0)?IE_RBD_EOL:0)); 1512 } 1513 1514 /* 1515 * step 4: all xmit no-op commands loopback onto themselves 1516 */ 1517 for (n = 0; n < NTXBUF; n++) { 1518 sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, n), 0); 1519 1520 sc->ie_bus_write16(sc, IE_CMD_NOP_CMD(sc->nop_cmds, n), 1521 IE_CMD_NOP); 1522 1523 sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, n), 1524 IE_CMD_NOP_ADDR(sc->nop_cmds, n)); 1525 } 1526 1527 1528 /* 1529 * step 6: set the head and tail pointers on receive to keep track of 1530 * the order in which RFDs and RBDs are used. 1531 */ 1532 1533 /* Pointers to last packet sent and next available transmit buffer. */ 1534 sc->xchead = sc->xctail = 0; 1535 1536 /* Clear transmit-busy flag and set number of free transmit buffers. */ 1537 sc->xmit_busy = 0; 1538 1539 /* 1540 * Pointers to first and last receive frame. 1541 * The RFD pointed to by rftail is the only one that has EOL set. 1542 */ 1543 sc->rfhead = 0; 1544 sc->rftail = sc->nframes - 1; 1545 1546 /* 1547 * Pointers to first and last receive descriptor buffer. 1548 * The RBD pointed to by rbtail is the only one that has EOL set. 1549 */ 1550 sc->rbhead = 0; 1551 sc->rbtail = sc->nrxbuf - 1; 1552 1553 /* link in recv frames * and buffer into the scb. */ 1554 #if I82586_DEBUG 1555 printf("%s: reserved %d bytes\n", 1556 sc->sc_dev.dv_xname, ptr - sc->buf_area); 1557 #endif 1558 } 1559 1560 static int 1561 ie_cfg_setup(sc, cmd, promiscuous, manchester) 1562 struct ie_softc *sc; 1563 int cmd; 1564 int promiscuous, manchester; 1565 { 1566 int cmdresult, status; 1567 u_int8_t buf[IE_CMD_CFG_SZ]; /* XXX malloc? */ 1568 1569 *IE_CMD_CFG_CNT(buf) = 0x0c; 1570 *IE_CMD_CFG_FIFO(buf) = 8; 1571 *IE_CMD_CFG_SAVEBAD(buf) = 0x40; 1572 *IE_CMD_CFG_ADDRLEN(buf) = 0x2e; 1573 *IE_CMD_CFG_PRIORITY(buf) = 0; 1574 *IE_CMD_CFG_IFS(buf) = 0x60; 1575 *IE_CMD_CFG_SLOT_LOW(buf) = 0; 1576 *IE_CMD_CFG_SLOT_HIGH(buf) = 0xf2; 1577 *IE_CMD_CFG_PROMISC(buf) = !!promiscuous | manchester << 2; 1578 *IE_CMD_CFG_CRSCDT(buf) = 0; 1579 *IE_CMD_CFG_MINLEN(buf) = 64; 1580 *IE_CMD_CFG_JUNK(buf) = 0xff; 1581 sc->memcopyout(sc, buf, cmd, IE_CMD_CFG_SZ); 1582 setup_simple_command(sc, IE_CMD_CONFIG, cmd); 1583 IE_BUS_BARRIER(sc, cmd, IE_CMD_CFG_SZ, BUS_SPACE_BARRIER_WRITE); 1584 1585 cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0); 1586 status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd)); 1587 if (cmdresult != 0) { 1588 printf("%s: configure command timed out; status %x\n", 1589 sc->sc_dev.dv_xname, status); 1590 return (0); 1591 } 1592 if ((status & IE_STAT_OK) == 0) { 1593 printf("%s: configure command failed; status %x\n", 1594 sc->sc_dev.dv_xname, status); 1595 return (0); 1596 } 1597 1598 /* Squash any pending interrupts */ 1599 ie_ack(sc, IE_ST_WHENCE); 1600 return (1); 1601 } 1602 1603 static int 1604 ie_ia_setup(sc, cmdbuf) 1605 struct ie_softc *sc; 1606 int cmdbuf; 1607 { 1608 int cmdresult, status; 1609 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1610 1611 setup_simple_command(sc, IE_CMD_IASETUP, cmdbuf); 1612 1613 (sc->memcopyout)(sc, LLADDR(ifp->if_sadl), 1614 IE_CMD_IAS_EADDR(cmdbuf), ETHER_ADDR_LEN); 1615 1616 cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0); 1617 status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf)); 1618 if (cmdresult != 0) { 1619 printf("%s: individual address command timed out; status %x\n", 1620 sc->sc_dev.dv_xname, status); 1621 return (0); 1622 } 1623 if ((status & IE_STAT_OK) == 0) { 1624 printf("%s: individual address command failed; status %x\n", 1625 sc->sc_dev.dv_xname, status); 1626 return (0); 1627 } 1628 1629 /* Squash any pending interrupts */ 1630 ie_ack(sc, IE_ST_WHENCE); 1631 return (1); 1632 } 1633 1634 /* 1635 * Run the multicast setup command. 1636 * Called at splnet(). 1637 */ 1638 static int 1639 ie_mc_setup(sc, cmdbuf) 1640 struct ie_softc *sc; 1641 int cmdbuf; 1642 { 1643 int cmdresult, status; 1644 1645 if (sc->mcast_count == 0) 1646 return (1); 1647 1648 setup_simple_command(sc, IE_CMD_MCAST, cmdbuf); 1649 1650 (sc->memcopyout)(sc, (caddr_t)sc->mcast_addrs, 1651 IE_CMD_MCAST_MADDR(cmdbuf), 1652 sc->mcast_count * ETHER_ADDR_LEN); 1653 1654 sc->ie_bus_write16(sc, IE_CMD_MCAST_BYTES(cmdbuf), 1655 sc->mcast_count * ETHER_ADDR_LEN); 1656 1657 /* Start the command */ 1658 cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0); 1659 status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf)); 1660 if (cmdresult != 0) { 1661 printf("%s: multicast setup command timed out; status %x\n", 1662 sc->sc_dev.dv_xname, status); 1663 return (0); 1664 } 1665 if ((status & IE_STAT_OK) == 0) { 1666 printf("%s: multicast setup command failed; status %x\n", 1667 sc->sc_dev.dv_xname, status); 1668 return (0); 1669 } 1670 1671 /* Squash any pending interrupts */ 1672 ie_ack(sc, IE_ST_WHENCE); 1673 return (1); 1674 } 1675 1676 /* 1677 * This routine takes the environment generated by check_ie_present() and adds 1678 * to it all the other structures we need to operate the adapter. This 1679 * includes executing the CONFIGURE, IA-SETUP, and MC-SETUP commands, starting 1680 * the receiver unit, and clearing interrupts. 1681 * 1682 * THIS ROUTINE MUST BE CALLED AT splnet() OR HIGHER. 1683 */ 1684 int 1685 i82586_init(ifp) 1686 struct ifnet *ifp; 1687 { 1688 struct ie_softc *sc = ifp->if_softc; 1689 int cmd; 1690 1691 sc->async_cmd_inprogress = 0; 1692 1693 cmd = sc->buf_area; 1694 1695 /* 1696 * Send the configure command first. 1697 */ 1698 if (ie_cfg_setup(sc, cmd, sc->promisc, 0) == 0) 1699 return EIO; 1700 1701 /* 1702 * Send the Individual Address Setup command. 1703 */ 1704 if (ie_ia_setup(sc, cmd) == 0) 1705 return EIO; 1706 1707 /* 1708 * Run the time-domain reflectometer. 1709 */ 1710 ie_run_tdr(sc, cmd); 1711 1712 /* 1713 * Set the multi-cast filter, if any 1714 */ 1715 if (ie_mc_setup(sc, cmd) == 0) 1716 return EIO; 1717 1718 /* 1719 * Acknowledge any interrupts we have generated thus far. 1720 */ 1721 ie_ack(sc, IE_ST_WHENCE); 1722 1723 /* 1724 * Set up the transmit and recv buffers. 1725 */ 1726 i82586_setup_bufs(sc); 1727 1728 if (sc->hwinit) 1729 (sc->hwinit)(sc); 1730 1731 ifp->if_flags |= IFF_RUNNING; 1732 ifp->if_flags &= ~IFF_OACTIVE; 1733 1734 if (NTXBUF < 2) 1735 sc->do_xmitnopchain = 0; 1736 1737 i82586_start_transceiver(sc); 1738 return (0); 1739 } 1740 1741 /* 1742 * Start the RU and possibly the CU unit 1743 */ 1744 static void 1745 i82586_start_transceiver(sc) 1746 struct ie_softc *sc; 1747 { 1748 1749 /* 1750 * Start RU at current position in frame & RBD lists. 1751 */ 1752 sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes,sc->rfhead), 1753 IE_RBD_ADDR(sc->rbds, sc->rbhead)); 1754 1755 sc->ie_bus_write16(sc, IE_SCB_RCVLST(sc->scb), 1756 IE_RFRAME_ADDR(sc->rframes,sc->rfhead)); 1757 1758 if (sc->do_xmitnopchain) { 1759 /* Stop transmit command chain */ 1760 if (i82586_start_cmd(sc, IE_CUC_SUSPEND|IE_RUC_SUSPEND, 0, 0, 0)) 1761 printf("%s: CU/RU stop command timed out\n", 1762 sc->sc_dev.dv_xname); 1763 1764 /* Start the receiver & transmitter chain */ 1765 /* sc->scb->ie_command_list = 1766 IEADDR(sc->nop_cmds[(sc->xctail+NTXBUF-1) % NTXBUF]);*/ 1767 sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb), 1768 IE_CMD_NOP_ADDR( 1769 sc->nop_cmds, 1770 (sc->xctail + NTXBUF - 1) % NTXBUF)); 1771 1772 if (i82586_start_cmd(sc, IE_CUC_START|IE_RUC_START, 0, 0, 0)) 1773 printf("%s: CU/RU command timed out\n", 1774 sc->sc_dev.dv_xname); 1775 } else { 1776 if (i82586_start_cmd(sc, IE_RUC_START, 0, 0, 0)) 1777 printf("%s: RU command timed out\n", 1778 sc->sc_dev.dv_xname); 1779 } 1780 } 1781 1782 void 1783 i82586_stop(ifp, disable) 1784 struct ifnet *ifp; 1785 int disable; 1786 { 1787 struct ie_softc *sc = ifp->if_softc; 1788 1789 if (i82586_start_cmd(sc, IE_RUC_SUSPEND | IE_CUC_SUSPEND, 0, 0, 0)) 1790 printf("%s: iestop: disable commands timed out\n", 1791 sc->sc_dev.dv_xname); 1792 } 1793 1794 int 1795 i82586_ioctl(ifp, cmd, data) 1796 struct ifnet *ifp; 1797 u_long cmd; 1798 caddr_t data; 1799 { 1800 struct ie_softc *sc = ifp->if_softc; 1801 struct ifreq *ifr = (struct ifreq *)data; 1802 int s, error = 0; 1803 1804 s = splnet(); 1805 switch(cmd) { 1806 case SIOCGIFMEDIA: 1807 case SIOCSIFMEDIA: 1808 error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd); 1809 break; 1810 default: 1811 error = ether_ioctl(ifp, cmd, data); 1812 if (error == ENETRESET) { 1813 /* 1814 * Multicast list has changed; set the hardware filter 1815 * accordingly. 1816 */ 1817 if (ifp->if_flags & IFF_RUNNING) 1818 ie_mc_reset(sc); 1819 error = 0; 1820 } 1821 break; 1822 } 1823 #if I82586_DEBUG 1824 if (cmd == SIOCSIFFLAGS) 1825 sc->sc_debug = (ifp->if_flags & IFF_DEBUG) ? IED_ALL : 0; 1826 #endif 1827 splx(s); 1828 return (error); 1829 } 1830 1831 static void 1832 ie_mc_reset(sc) 1833 struct ie_softc *sc; 1834 { 1835 struct ether_multi *enm; 1836 struct ether_multistep step; 1837 int size; 1838 1839 /* 1840 * Step through the list of addresses. 1841 */ 1842 again: 1843 size = 0; 1844 sc->mcast_count = 0; 1845 ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm); 1846 while (enm) { 1847 size += 6; 1848 if (sc->mcast_count >= IE_MAXMCAST || 1849 memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) { 1850 sc->sc_ethercom.ec_if.if_flags |= IFF_ALLMULTI; 1851 i82586_ioctl(&sc->sc_ethercom.ec_if, 1852 SIOCSIFFLAGS, (void *)0); 1853 return; 1854 } 1855 ETHER_NEXT_MULTI(step, enm); 1856 } 1857 1858 if (size > sc->mcast_addrs_size) { 1859 /* Need to allocate more space */ 1860 if (sc->mcast_addrs_size) 1861 free(sc->mcast_addrs, M_IFMADDR); 1862 sc->mcast_addrs = (char *) 1863 malloc(size, M_IFMADDR, M_WAITOK); 1864 sc->mcast_addrs_size = size; 1865 } 1866 1867 /* 1868 * We've got the space; now copy the addresses 1869 */ 1870 ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm); 1871 while (enm) { 1872 if (sc->mcast_count >= IE_MAXMCAST) 1873 goto again; /* Just in case */ 1874 1875 memcpy(&sc->mcast_addrs[sc->mcast_count], enm->enm_addrlo, 6); 1876 sc->mcast_count++; 1877 ETHER_NEXT_MULTI(step, enm); 1878 } 1879 sc->want_mcsetup = 1; 1880 } 1881 1882 /* 1883 * Media change callback. 1884 */ 1885 int 1886 i82586_mediachange(ifp) 1887 struct ifnet *ifp; 1888 { 1889 struct ie_softc *sc = ifp->if_softc; 1890 1891 if (sc->sc_mediachange) 1892 return ((*sc->sc_mediachange)(sc)); 1893 return (0); 1894 } 1895 1896 /* 1897 * Media status callback. 1898 */ 1899 void 1900 i82586_mediastatus(ifp, ifmr) 1901 struct ifnet *ifp; 1902 struct ifmediareq *ifmr; 1903 { 1904 struct ie_softc *sc = ifp->if_softc; 1905 1906 if (sc->sc_mediastatus) 1907 (*sc->sc_mediastatus)(sc, ifmr); 1908 } 1909 1910 #if I82586_DEBUG 1911 void 1912 print_rbd(sc, n) 1913 struct ie_softc *sc; 1914 int n; 1915 { 1916 1917 printf("RBD at %08x:\n status %04x, next %04x, buffer %lx\n" 1918 "length/EOL %04x\n", IE_RBD_ADDR(sc->rbds,n), 1919 sc->ie_bus_read16(sc, IE_RBD_STATUS(sc->rbds,n)), 1920 sc->ie_bus_read16(sc, IE_RBD_NEXT(sc->rbds,n)), 1921 (u_long)0,/*bus_space_read_4(sc->bt, sc->bh, IE_RBD_BUFADDR(sc->rbds,n)),-* XXX */ 1922 sc->ie_bus_read16(sc, IE_RBD_BUFLEN(sc->rbds,n))); 1923 } 1924 #endif 1925