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