if_fxp.c revision 21666
1/* 2 * Copyright (c) 1995, David Greenman 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice unmodified, this list of conditions, and the following 10 * disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * $Id: if_fxp.c,v 1.23 1996/12/10 07:29:50 davidg Exp $ 28 */ 29 30/* 31 * Intel EtherExpress Pro/100B PCI Fast Ethernet driver 32 */ 33 34#include "bpfilter.h" 35 36#include <sys/param.h> 37#include <sys/systm.h> 38#include <sys/ioctl.h> 39#include <sys/mbuf.h> 40#include <sys/malloc.h> 41#include <sys/kernel.h> 42#include <sys/socket.h> 43#include <sys/syslog.h> 44 45#include <net/if.h> 46#include <net/if_dl.h> 47#include <net/if_types.h> 48 49#ifdef INET 50#include <netinet/in.h> 51#include <netinet/in_systm.h> 52#include <netinet/in_var.h> 53#include <netinet/ip.h> 54#include <netinet/if_ether.h> 55#endif 56 57#ifdef IPX 58#include <netipx/ipx.h> 59#include <netipx/ipx_if.h> 60#endif 61 62#ifdef NS 63#include <netns/ns.h> 64#include <netns/ns_if.h> 65#endif 66 67#if NBPFILTER > 0 68#include <net/bpf.h> 69#include <net/bpfdesc.h> 70#endif 71 72#include <vm/vm.h> /* for vtophys */ 73#include <vm/vm_param.h> /* for vtophys */ 74#include <vm/pmap.h> /* for vtophys */ 75#include <machine/clock.h> /* for DELAY */ 76 77#include <pci/pcivar.h> 78#include <pci/if_fxpreg.h> 79 80struct fxp_softc { 81 struct arpcom arpcom; /* per-interface network data */ 82 struct fxp_csr *csr; /* control/status registers */ 83 struct fxp_cb_tx *cbl_base; /* base of TxCB list */ 84 struct fxp_cb_tx *cbl_first; /* first active TxCB in list */ 85 struct fxp_cb_tx *cbl_last; /* last active TxCB in list */ 86 struct mbuf *rfa_headm; /* first mbuf in receive frame area */ 87 struct mbuf *rfa_tailm; /* last mbuf in receive frame area */ 88 struct fxp_stats *fxp_stats; /* Pointer to interface stats */ 89 int tx_queued; /* # of active TxCB's */ 90 int promisc_mode; /* promiscuous mode enabled */ 91}; 92 93static u_long fxp_count; 94 95/* 96 * Template for default configuration parameters. 97 * See struct fxp_cb_config for the bit definitions. 98 */ 99static u_char fxp_cb_config_template[] = { 100 0x0, 0x0, /* cb_status */ 101 0x80, 0x2, /* cb_command */ 102 0xff, 0xff, 0xff, 0xff, /* link_addr */ 103 0x16, /* 0 */ 104 0x8, /* 1 */ 105 0x0, /* 2 */ 106 0x0, /* 3 */ 107 0x0, /* 4 */ 108 0x80, /* 5 */ 109 0xb2, /* 6 */ 110 0x3, /* 7 */ 111 0x1, /* 8 */ 112 0x0, /* 9 */ 113 0x26, /* 10 */ 114 0x0, /* 11 */ 115 0x60, /* 12 */ 116 0x0, /* 13 */ 117 0xf2, /* 14 */ 118 0x48, /* 15 */ 119 0x0, /* 16 */ 120 0x40, /* 17 */ 121 0xf3, /* 18 */ 122 0x0, /* 19 */ 123 0x3f, /* 20 */ 124 0x5, /* 21 */ 125 0x0, 0x0 126}; 127 128static inline void fxp_scb_wait __P((struct fxp_csr *)); 129static char *fxp_probe __P((pcici_t, pcidi_t)); 130static void fxp_attach __P((pcici_t, int)); 131static void fxp_intr __P((void *)); 132static void fxp_start __P((struct ifnet *)); 133static int fxp_ioctl __P((struct ifnet *, int, caddr_t)); 134static void fxp_init __P((void *)); 135static void fxp_stop __P((struct fxp_softc *)); 136static void fxp_watchdog __P((struct ifnet *)); 137static void fxp_get_macaddr __P((struct fxp_softc *)); 138static int fxp_add_rfabuf __P((struct fxp_softc *, struct mbuf *)); 139static void fxp_shutdown __P((int, void *)); 140 141timeout_t fxp_stats_update; 142 143static struct pci_device fxp_device = { 144 "fxp", 145 fxp_probe, 146 fxp_attach, 147 &fxp_count, 148 NULL 149}; 150DATA_SET(pcidevice_set, fxp_device); 151 152/* 153 * Set initial transmit threshold at 64 (512 bytes). This is 154 * increased by 64 (512 bytes) at a time, to maximum of 192 155 * (1536 bytes), if an underrun occurs. 156 */ 157static int tx_threshold = 64; 158 159/* 160 * Number of transmit control blocks. This determines the number 161 * of transmit buffers that can be chained in the CB list. 162 * This must be a power of two. 163 */ 164#define FXP_NTXCB 128 165 166/* 167 * TxCB list index mask. This is used to do list wrap-around. 168 */ 169#define FXP_TXCB_MASK (FXP_NTXCB - 1) 170 171/* 172 * Number of DMA segments in a TxCB. Note that this is carefully 173 * chosen to make the total struct size an even power of two. It's 174 * critical that no TxCB be split across a page boundry since 175 * no attempt is made to allocate physically contiguous memory. 176 * 177 * XXX - don't forget to change the hard-coded constant in the 178 * fxp_cb_tx struct (defined in if_fxpreg.h), too! 179 */ 180#define FXP_NTXSEG 29 181 182/* 183 * Number of receive frame area buffers. These are large so chose 184 * wisely. 185 */ 186#define FXP_NRFABUFS 32 187 188/* 189 * Wait for the previous command to be accepted (but not necessarily 190 * completed). 191 */ 192static inline void 193fxp_scb_wait(csr) 194 struct fxp_csr *csr; 195{ 196 int i = 10000; 197 198 while ((csr->scb_command & FXP_SCB_COMMAND_MASK) && --i); 199} 200 201/* 202 * Return identification string if this is device is ours. 203 */ 204static char * 205fxp_probe(config_id, device_id) 206 pcici_t config_id; 207 pcidi_t device_id; 208{ 209 if (((device_id & 0xffff) == FXP_VENDORID_INTEL) && 210 ((device_id >> 16) & 0xffff) == FXP_DEVICEID_i82557) 211 return ("Intel EtherExpress Pro/100B Fast Ethernet"); 212 213 return NULL; 214} 215 216/* 217 * Allocate data structures and attach the device. 218 */ 219static void 220fxp_attach(config_id, unit) 221 pcici_t config_id; 222 int unit; 223{ 224 struct fxp_softc *sc; 225 struct ifnet *ifp; 226 vm_offset_t pbase; 227 int s, i; 228 229 sc = malloc(sizeof(struct fxp_softc), M_DEVBUF, M_NOWAIT); 230 if (sc == NULL) 231 return; 232 bzero(sc, sizeof(struct fxp_softc)); 233 234 s = splimp(); 235 236 /* 237 * Map control/status registers. 238 */ 239 if (!pci_map_mem(config_id, FXP_PCI_MMBA, 240 (vm_offset_t *)&sc->csr, &pbase)) { 241 printf("fxp%d: couldn't map memory\n", unit); 242 goto fail; 243 } 244 245 /* 246 * Issue a software reset. 247 */ 248 sc->csr->port = 0; 249 DELAY(10); 250 251 /* 252 * Allocate our interrupt. 253 */ 254 if (!pci_map_int(config_id, fxp_intr, sc, &net_imask)) { 255 printf("fxp%d: couldn't map interrupt\n", unit); 256 goto fail; 257 } 258 259 sc->cbl_base = malloc(sizeof(struct fxp_cb_tx) * FXP_NTXCB, 260 M_DEVBUF, M_NOWAIT); 261 if (sc->cbl_base == NULL) 262 goto malloc_fail; 263 264 sc->fxp_stats = malloc(sizeof(struct fxp_stats), M_DEVBUF, M_NOWAIT); 265 if (sc->fxp_stats == NULL) 266 goto malloc_fail; 267 bzero(sc->fxp_stats, sizeof(struct fxp_stats)); 268 269 /* 270 * Pre-allocate our receive buffers. 271 */ 272 for (i = 0; i < FXP_NRFABUFS; i++) { 273 if (fxp_add_rfabuf(sc, NULL) != 0) { 274 goto malloc_fail; 275 } 276 } 277 278 ifp = &sc->arpcom.ac_if; 279 ifp->if_softc = sc; 280 ifp->if_unit = unit; 281 ifp->if_name = "fxp"; 282 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 283 ifp->if_ioctl = fxp_ioctl; 284 ifp->if_output = ether_output; 285 ifp->if_start = fxp_start; 286 ifp->if_watchdog = fxp_watchdog; 287 ifp->if_baudrate = 100000000; 288 ifp->if_init = fxp_init; 289 290 fxp_get_macaddr(sc); 291 printf("fxp%d: Ethernet address %6D\n", unit, 292 sc->arpcom.ac_enaddr, ":"); 293 294 /* 295 * Attach the interface. 296 */ 297 if_attach(ifp); 298 ether_ifattach(ifp); 299 300#if NBPFILTER > 0 301 bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header)); 302#endif 303 304 /* 305 * Add shutdown hook so that DMA is disabled prior to reboot. Not 306 * doing do could allow DMA to corrupt kernel memory during the 307 * reboot before the driver initializes. 308 */ 309 at_shutdown(fxp_shutdown, sc, SHUTDOWN_POST_SYNC); 310 311 splx(s); 312 return; 313 314malloc_fail: 315 printf("fxp%d: Failed to malloc memory\n", unit); 316 (void) pci_unmap_int(config_id); 317 if (sc && sc->cbl_base) 318 free(sc->cbl_base, M_DEVBUF); 319 if (sc && sc->fxp_stats) 320 free(sc->fxp_stats, M_DEVBUF); 321 /* frees entire chain */ 322 if (sc && sc->rfa_headm) 323 m_freem(sc->rfa_headm); 324fail: 325 if (sc) 326 free(sc, M_DEVBUF); 327 splx(s); 328} 329 330/* 331 * Read station (MAC) address from serial EEPROM. Basically, you 332 * manually shift in the read opcode (one bit at a time) and then 333 * shift in the address, and then you shift out the data (all of 334 * this one bit at a time). The word size is 16 bits, so you have 335 * to provide the address for every 16 bits of data. The MAC address 336 * is in the first 3 words (6 bytes total). 337 */ 338static void 339fxp_get_macaddr(sc) 340 struct fxp_softc *sc; 341{ 342 struct fxp_csr *csr; 343 u_short reg, *data; 344 int i, x; 345 346 csr = sc->csr; 347 data = (u_short *)sc->arpcom.ac_enaddr; 348 349 for (i = 0; i < 3; i++) { 350 csr->eeprom_control = FXP_EEPROM_EECS; 351 /* 352 * Shift in read opcode. 353 */ 354 for (x = 3; x > 0; x--) { 355 if (FXP_EEPROM_OPC_READ & (1 << (x - 1))) { 356 reg = FXP_EEPROM_EECS | FXP_EEPROM_EEDI; 357 } else { 358 reg = FXP_EEPROM_EECS; 359 } 360 csr->eeprom_control = reg; 361 csr->eeprom_control = reg | FXP_EEPROM_EESK; 362 DELAY(1); 363 csr->eeprom_control = reg; 364 DELAY(1); 365 } 366 /* 367 * Shift in address. 368 */ 369 for (x = 6; x > 0; x--) { 370 if (i & (1 << (x - 1))) { 371 reg = FXP_EEPROM_EECS | FXP_EEPROM_EEDI; 372 } else { 373 reg = FXP_EEPROM_EECS; 374 } 375 csr->eeprom_control = reg; 376 csr->eeprom_control = reg | FXP_EEPROM_EESK; 377 DELAY(1); 378 csr->eeprom_control = reg; 379 DELAY(1); 380 } 381 reg = FXP_EEPROM_EECS; 382 data[i] = 0; 383 /* 384 * Shift out data. 385 */ 386 for (x = 16; x > 0; x--) { 387 csr->eeprom_control = reg | FXP_EEPROM_EESK; 388 DELAY(1); 389 if (csr->eeprom_control & FXP_EEPROM_EEDO) 390 data[i] |= (1 << (x - 1)); 391 csr->eeprom_control = reg; 392 DELAY(1); 393 } 394 csr->eeprom_control = 0; 395 DELAY(1); 396 } 397} 398 399/* 400 * Device shutdown routine. Called at system shutdown after sync. The 401 * main purpose of this routine is to shut off receiver DMA so that 402 * kernel memory doesn't get clobbered during warmboot. 403 */ 404static void 405fxp_shutdown(howto, sc) 406 int howto; 407 void *sc; 408{ 409 fxp_stop((struct fxp_softc *) sc); 410} 411 412/* 413 * Start packet transmission on the interface. 414 */ 415static void 416fxp_start(ifp) 417 struct ifnet *ifp; 418{ 419 struct fxp_softc *sc = ifp->if_softc; 420 struct fxp_csr *csr = sc->csr; 421 struct fxp_cb_tx *txp; 422 struct mbuf *m, *mb_head; 423 int segment, first = 1; 424 425txloop: 426 /* 427 * See if we're all filled up with buffers to transmit. 428 */ 429 if (sc->tx_queued >= FXP_NTXCB) 430 return; 431 432 /* 433 * Grab a packet to transmit. 434 */ 435 IF_DEQUEUE(&sc->arpcom.ac_if.if_snd, mb_head); 436 if (mb_head == NULL) { 437 /* 438 * No more packets to send. 439 */ 440 return; 441 } 442 443 /* 444 * Get pointer to next available (unused) descriptor. 445 */ 446 txp = sc->cbl_last->next; 447 448 /* 449 * Go through each of the mbufs in the chain and initialize 450 * the transmit buffers descriptors with the physical address 451 * and size of the mbuf. 452 */ 453tbdinit: 454 for (m = mb_head, segment = 0; m != NULL; m = m->m_next) { 455 if (m->m_len != 0) { 456 if (segment == FXP_NTXSEG) 457 break; 458 txp->tbd[segment].tb_addr = 459 vtophys(mtod(m, vm_offset_t)); 460 txp->tbd[segment].tb_size = m->m_len; 461 segment++; 462 } 463 } 464 if (m != NULL) { 465 struct mbuf *mn; 466 467 /* 468 * We ran out of segments. We have to recopy this mbuf 469 * chain first. 470 */ 471 MGETHDR(mn, M_DONTWAIT, MT_DATA); 472 if (mn == NULL) { 473 m_freem(mb_head); 474 return; 475 } 476 if (mb_head->m_pkthdr.len > MHLEN) { 477 MCLGET(mn, M_DONTWAIT); 478 if ((mn->m_flags & M_EXT) == 0) { 479 m_freem(mn); 480 m_freem(mb_head); 481 return; 482 } 483 } 484 m_copydata(mb_head, 0, mb_head->m_pkthdr.len, mtod(mn, caddr_t)); 485 mn->m_pkthdr.len = mn->m_len = mb_head->m_pkthdr.len; 486 m_freem(mb_head); 487 mb_head = mn; 488 goto tbdinit; 489 } 490 491 txp->tbd_number = segment; 492 txp->mb_head = mb_head; 493 494 /* 495 * Finish the initialization of this TxCB. 496 */ 497 txp->cb_status = 0; 498 txp->cb_command = 499 FXP_CB_COMMAND_XMIT | FXP_CB_COMMAND_SF | FXP_CB_COMMAND_S; 500 txp->tx_threshold = tx_threshold; 501 502 /* 503 * Advance the end-of-list forward. 504 */ 505 sc->cbl_last->cb_command &= ~FXP_CB_COMMAND_S; 506 sc->cbl_last = txp; 507 508 /* 509 * Advance the beginning of the list forward if there are 510 * no other packets queued (when nothing is queued, cbl_first 511 * sits on the last TxCB that was sent out).. 512 */ 513 if (sc->tx_queued == 0) 514 sc->cbl_first = txp; 515 516 sc->tx_queued++; 517 518 /* 519 * Only need to wait prior to the first resume command. 520 */ 521 if (first) { 522 first--; 523 fxp_scb_wait(csr); 524 } 525 526 /* 527 * Resume transmission if suspended. 528 */ 529 csr->scb_command = FXP_SCB_COMMAND_CU_RESUME; 530 531#if NBPFILTER > 0 532 /* 533 * Pass packet to bpf if there is a listener. 534 */ 535 if (ifp->if_bpf) 536 bpf_mtap(ifp, mb_head); 537#endif 538 /* 539 * Set a 5 second timer just in case we don't hear from the 540 * card again. 541 */ 542 ifp->if_timer = 5; 543 544 goto txloop; 545} 546 547/* 548 * Process interface interrupts. 549 */ 550static void 551fxp_intr(arg) 552 void *arg; 553{ 554 struct fxp_softc *sc = arg; 555 struct fxp_csr *csr = sc->csr; 556 struct ifnet *ifp = &sc->arpcom.ac_if; 557 u_int8_t statack; 558 559 while ((statack = csr->scb_statack) != 0) { 560 /* 561 * First ACK all the interrupts in this pass. 562 */ 563 csr->scb_statack = statack; 564 565 /* 566 * Free any finished transmit mbuf chains. 567 */ 568 if (statack & FXP_SCB_STATACK_CNA) { 569 struct fxp_cb_tx *txp; 570 571 for (txp = sc->cbl_first; 572 (txp->cb_status & FXP_CB_STATUS_C) != 0; 573 txp = txp->next) { 574 if (txp->mb_head != NULL) { 575 m_freem(txp->mb_head); 576 txp->mb_head = NULL; 577 sc->tx_queued--; 578 } 579 if (txp->cb_command & FXP_CB_COMMAND_S) 580 break; 581 } 582 sc->cbl_first = txp; 583 /* 584 * Clear watchdog timer. It may or may not be set 585 * again in fxp_start(). 586 */ 587 ifp->if_timer = 0; 588 fxp_start(ifp); 589 } 590 /* 591 * Process receiver interrupts. If a no-resource (RNR) 592 * condition exists, get whatever packets we can and 593 * re-start the receiver. 594 */ 595 if (statack & (FXP_SCB_STATACK_FR | FXP_SCB_STATACK_RNR)) { 596 struct mbuf *m; 597 struct fxp_rfa *rfa; 598rcvloop: 599 m = sc->rfa_headm; 600 rfa = (struct fxp_rfa *)m->m_ext.ext_buf; 601 602 if (rfa->rfa_status & FXP_RFA_STATUS_C) { 603 /* 604 * Remove first packet from the chain. 605 */ 606 sc->rfa_headm = m->m_next; 607 m->m_next = NULL; 608 609 /* 610 * Add a new buffer to the receive chain. If this 611 * fails, the old buffer is recycled instead. 612 */ 613 if (fxp_add_rfabuf(sc, m) == 0) { 614 struct ether_header *eh; 615 u_short total_len; 616 617 total_len = rfa->actual_size & (MCLBYTES - 1); 618 m->m_pkthdr.rcvif = ifp; 619 m->m_pkthdr.len = m->m_len = total_len - 620 sizeof(struct ether_header); 621 eh = mtod(m, struct ether_header *); 622#if NBPFILTER > 0 623 if (ifp->if_bpf) { 624 bpf_tap(ifp, mtod(m, caddr_t), total_len); 625 /* 626 * Only pass this packet up if it is for us. 627 */ 628 if ((ifp->if_flags & IFF_PROMISC) && 629 (rfa->rfa_status & FXP_RFA_STATUS_IAMATCH) && 630 (eh->ether_dhost[0] & 1) == 0) { 631 m_freem(m); 632 goto rcvloop; 633 } 634 } 635#endif 636 m->m_data += sizeof(struct ether_header); 637 ether_input(ifp, eh, m); 638 } 639 goto rcvloop; 640 } 641 if (statack & FXP_SCB_STATACK_RNR) { 642 struct fxp_csr *csr = sc->csr; 643 644 fxp_scb_wait(csr); 645 csr->scb_general = vtophys(sc->rfa_headm->m_ext.ext_buf); 646 csr->scb_command = FXP_SCB_COMMAND_RU_START; 647 } 648 } 649 } 650} 651 652/* 653 * Update packet in/out/collision statistics. The i82557 doesn't 654 * allow you to access these counters without doing a fairly 655 * expensive DMA to get _all_ of the statistics it maintains, so 656 * we do this operation here only once per second. The statistics 657 * counters in the kernel are updated from the previous dump-stats 658 * DMA and then a new dump-stats DMA is started. The on-chip 659 * counters are zeroed when the DMA completes. If we can't start 660 * the DMA immediately, we don't wait - we just prepare to read 661 * them again next time. 662 */ 663void 664fxp_stats_update(arg) 665 void *arg; 666{ 667 struct fxp_softc *sc = arg; 668 struct ifnet *ifp = &sc->arpcom.ac_if; 669 struct fxp_stats *sp = sc->fxp_stats; 670 671 ifp->if_opackets += sp->tx_good; 672 ifp->if_collisions += sp->tx_total_collisions; 673 ifp->if_ipackets += sp->rx_good; 674 ifp->if_ierrors += 675 sp->rx_crc_errors + 676 sp->rx_alignment_errors + 677 sp->rx_rnr_errors + 678 sp->rx_overrun_errors + 679 sp->rx_shortframes; 680 /* 681 * If any transmit underruns occured, bump up the transmit 682 * threshold by another 512 bytes (64 * 8). 683 */ 684 if (sp->tx_underruns) { 685 ifp->if_oerrors += sp->tx_underruns; 686 if (tx_threshold < 192) 687 tx_threshold += 64; 688 } 689 /* 690 * If there is no pending command, start another stats 691 * dump. Otherwise punt for now. 692 */ 693 if ((sc->csr->scb_command & FXP_SCB_COMMAND_MASK) == 0) { 694 /* 695 * Start another stats dump. By waiting for it to be 696 * accepted, we avoid having to do splhigh locking when 697 * writing scb_command in other parts of the driver. 698 */ 699 sc->csr->scb_command = FXP_SCB_COMMAND_CU_DUMPRESET; 700 fxp_scb_wait(sc->csr); 701 } else { 702 /* 703 * A previous command is still waiting to be accepted. 704 * Just zero our copy of the stats and wait for the 705 * next timer event to update them. 706 */ 707 sp->tx_good = 0; 708 sp->tx_underruns = 0; 709 sp->tx_total_collisions = 0; 710 711 sp->rx_good = 0; 712 sp->rx_crc_errors = 0; 713 sp->rx_alignment_errors = 0; 714 sp->rx_rnr_errors = 0; 715 sp->rx_overrun_errors = 0; 716 sp->rx_shortframes = 0;; 717 } 718 /* 719 * Schedule another timeout one second from now. 720 */ 721 timeout(fxp_stats_update, sc, hz); 722} 723 724/* 725 * Stop the interface. Cancels the statistics updater and resets 726 * the interface. 727 */ 728static void 729fxp_stop(sc) 730 struct fxp_softc *sc; 731{ 732 struct ifnet *ifp = &sc->arpcom.ac_if; 733 struct fxp_cb_tx *txp; 734 int i; 735 736 /* 737 * Cancel stats updater. 738 */ 739 untimeout(fxp_stats_update, sc); 740 741 /* 742 * Issue software reset 743 */ 744 sc->csr->port = 0; 745 DELAY(10); 746 747 /* 748 * Release any xmit buffers. 749 */ 750 for (txp = sc->cbl_first; txp != NULL && txp->mb_head != NULL; 751 txp = txp->next) { 752 m_freem(txp->mb_head); 753 txp->mb_head = NULL; 754 } 755 sc->tx_queued = 0; 756 757 /* 758 * Free all the receive buffers then reallocate/reinitialize 759 */ 760 if (sc->rfa_headm != NULL) 761 m_freem(sc->rfa_headm); 762 sc->rfa_headm = NULL; 763 sc->rfa_tailm = NULL; 764 for (i = 0; i < FXP_NRFABUFS; i++) { 765 if (fxp_add_rfabuf(sc, NULL) != 0) { 766 /* 767 * This "can't happen" - we're at splimp() 768 * and we just freed all the buffers we need 769 * above. 770 */ 771 panic("fxp_stop: no buffers!"); 772 } 773 } 774 775 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 776 ifp->if_timer = 0; 777} 778 779/* 780 * Watchdog/transmission transmit timeout handler. Called when a 781 * transmission is started on the interface, but no interrupt is 782 * received before the timeout. This usually indicates that the 783 * card has wedged for some reason. 784 */ 785static void 786fxp_watchdog(ifp) 787 struct ifnet *ifp; 788{ 789 log(LOG_ERR, "fxp%d: device timeout\n", ifp->if_unit); 790 ifp->if_oerrors++; 791 792 fxp_init(ifp->if_softc); 793} 794 795static void 796fxp_init(xsc) 797 void *xsc; 798{ 799 struct fxp_softc *sc = xsc; 800 struct ifnet *ifp = &sc->arpcom.ac_if; 801 struct fxp_cb_config *cbp; 802 struct fxp_cb_ias *cb_ias; 803 struct fxp_cb_tx *txp; 804 struct fxp_csr *csr = sc->csr; 805 int i, s, mcast, prm; 806 807 s = splimp(); 808 /* 809 * Cancel any pending I/O 810 */ 811 fxp_stop(sc); 812 813 prm = (ifp->if_flags & IFF_PROMISC) ? 1 : 0; 814 sc->promisc_mode = prm; 815 /* 816 * Sleeze out here and enable reception of all multicasts if 817 * multicasts are enabled. Ideally, we'd program the multicast 818 * address filter to only accept specific multicasts. 819 */ 820 mcast = (ifp->if_flags & (IFF_MULTICAST|IFF_ALLMULTI)) ? 1 : 0; 821 822 /* 823 * Initialize base of CBL and RFA memory. Loading with zero 824 * sets it up for regular linear addressing. 825 */ 826 csr->scb_general = 0; 827 csr->scb_command = FXP_SCB_COMMAND_CU_BASE; 828 829 fxp_scb_wait(csr); 830 csr->scb_command = FXP_SCB_COMMAND_RU_BASE; 831 832 /* 833 * Initialize base of dump-stats buffer. 834 */ 835 fxp_scb_wait(csr); 836 csr->scb_general = vtophys(sc->fxp_stats); 837 csr->scb_command = FXP_SCB_COMMAND_CU_DUMP_ADR; 838 839 /* 840 * We temporarily use memory that contains the TxCB list to 841 * construct the config CB. The TxCB list memory is rebuilt 842 * later. 843 */ 844 cbp = (struct fxp_cb_config *) sc->cbl_base; 845 846 /* 847 * This bcopy is kind of disgusting, but there are a bunch of must be 848 * zero and must be one bits in this structure and this is the easiest 849 * way to initialize them all to proper values. 850 */ 851 bcopy(fxp_cb_config_template, cbp, sizeof(struct fxp_cb_config)); 852 853 cbp->cb_status = 0; 854 cbp->cb_command = FXP_CB_COMMAND_CONFIG | FXP_CB_COMMAND_EL; 855 cbp->link_addr = -1; /* (no) next command */ 856 cbp->byte_count = 22; /* (22) bytes to config */ 857 cbp->rx_fifo_limit = 8; /* rx fifo threshold */ 858 cbp->tx_fifo_limit = 0; /* tx fifo threshold */ 859 cbp->adaptive_ifs = 0; /* (no) adaptive interframe spacing */ 860 cbp->rx_dma_bytecount = 16; /* (no) rx DMA max */ 861 cbp->tx_dma_bytecount = 16; /* (no) tx DMA max */ 862 cbp->dma_bce = 1; /* (enable) dma max counters */ 863 cbp->late_scb = 0; /* (don't) defer SCB update */ 864 cbp->tno_int = 0; /* (disable) tx not okay interrupt */ 865 cbp->ci_int = 0; /* (do) interrupt on CU not active */ 866 cbp->save_bf = prm; /* save bad frames */ 867 cbp->disc_short_rx = !prm; /* discard short packets */ 868 cbp->underrun_retry = 1; /* retry mode (1) on DMA underrun */ 869 cbp->mediatype = 1; /* (MII) interface mode */ 870 cbp->nsai = 1; /* (don't) disable source addr insert */ 871 cbp->preamble_length = 2; /* (7 byte) preamble */ 872 cbp->loopback = 0; /* (don't) loopback */ 873 cbp->linear_priority = 0; /* (normal CSMA/CD operation) */ 874 cbp->linear_pri_mode = 0; /* (wait after xmit only) */ 875 cbp->interfrm_spacing = 6; /* (96 bits of) interframe spacing */ 876 cbp->promiscuous = prm; /* promiscuous mode */ 877 cbp->bcast_disable = 0; /* (don't) disable broadcasts */ 878 cbp->crscdt = 1; /* (CRS only) */ 879 cbp->stripping = !prm; /* truncate rx packet to byte count */ 880 cbp->padding = 1; /* (do) pad short tx packets */ 881 cbp->rcv_crc_xfer = 0; /* (don't) xfer CRC to host */ 882 cbp->force_fdx = 0; /* (don't) force full duplex */ 883 cbp->fdx_pin_en = 1; /* (enable) FDX# pin */ 884 cbp->multi_ia = 0; /* (don't) accept multiple IAs */ 885 cbp->mc_all = mcast; /* accept all multicasts */ 886 887 /* 888 * Start the config command/DMA. 889 */ 890 fxp_scb_wait(csr); 891 csr->scb_general = vtophys(cbp); 892 csr->scb_command = FXP_SCB_COMMAND_CU_START; 893 /* ...and wait for it to complete. */ 894 while (!(cbp->cb_status & FXP_CB_STATUS_C)); 895 896 /* 897 * Now initialize the station address. Temporarily use the TxCB 898 * memory area like we did above for the config CB. 899 */ 900 cb_ias = (struct fxp_cb_ias *) sc->cbl_base; 901 cb_ias->cb_status = 0; 902 cb_ias->cb_command = FXP_CB_COMMAND_IAS | FXP_CB_COMMAND_EL; 903 cb_ias->link_addr = -1; 904 bcopy(sc->arpcom.ac_enaddr, (void *)cb_ias->macaddr, 905 sizeof(sc->arpcom.ac_enaddr)); 906 907 /* 908 * Start the IAS (Individual Address Setup) command/DMA. 909 */ 910 fxp_scb_wait(csr); 911 csr->scb_command = FXP_SCB_COMMAND_CU_START; 912 /* ...and wait for it to complete. */ 913 while (!(cb_ias->cb_status & FXP_CB_STATUS_C)); 914 915 /* 916 * Initialize transmit control block (TxCB) list. 917 */ 918 919 txp = sc->cbl_base; 920 bzero(txp, sizeof(struct fxp_cb_tx) * FXP_NTXCB); 921 for (i = 0; i < FXP_NTXCB; i++) { 922 txp[i].cb_status = FXP_CB_STATUS_C | FXP_CB_STATUS_OK; 923 txp[i].cb_command = FXP_CB_COMMAND_NOP; 924 txp[i].link_addr = vtophys(&txp[(i + 1) & FXP_TXCB_MASK]); 925 txp[i].tbd_array_addr = vtophys(&txp[i].tbd[0]); 926 txp[i].next = &txp[(i + 1) & FXP_TXCB_MASK]; 927 } 928 /* 929 * Set the stop flag on the first TxCB and start the control 930 * unit. It will execute the NOP and then suspend. 931 */ 932 txp->cb_command = FXP_CB_COMMAND_NOP | FXP_CB_COMMAND_S; 933 sc->cbl_first = sc->cbl_last = txp; 934 sc->tx_queued = 0; 935 936 fxp_scb_wait(csr); 937 csr->scb_command = FXP_SCB_COMMAND_CU_START; 938 939 /* 940 * Initialize receiver buffer area - RFA. 941 */ 942 fxp_scb_wait(csr); 943 csr->scb_general = vtophys(sc->rfa_headm->m_ext.ext_buf); 944 csr->scb_command = FXP_SCB_COMMAND_RU_START; 945 946 ifp->if_flags |= IFF_RUNNING; 947 ifp->if_flags &= ~IFF_OACTIVE; 948 splx(s); 949 950 /* 951 * Start stats updater. 952 */ 953 timeout(fxp_stats_update, sc, hz); 954} 955 956/* 957 * Add a buffer to the end of the RFA buffer list. 958 * Return 0 if successful, 1 for failure. A failure results in 959 * adding the 'oldm' (if non-NULL) on to the end of the list - 960 * tossing out it's old contents and recycling it. 961 * The RFA struct is stuck at the beginning of mbuf cluster and the 962 * data pointer is fixed up to point just past it. 963 */ 964static int 965fxp_add_rfabuf(sc, oldm) 966 struct fxp_softc *sc; 967 struct mbuf *oldm; 968{ 969 struct mbuf *m; 970 struct fxp_rfa *rfa, *p_rfa; 971 972 MGETHDR(m, M_DONTWAIT, MT_DATA); 973 if (m != NULL) { 974 MCLGET(m, M_DONTWAIT); 975 if ((m->m_flags & M_EXT) == 0) { 976 m_freem(m); 977 if (oldm == NULL) 978 return 1; 979 m = oldm; 980 m->m_data = m->m_ext.ext_buf; 981 } 982 } else { 983 if (oldm == NULL) 984 return 1; 985 m = oldm; 986 m->m_data = m->m_ext.ext_buf; 987 } 988 /* 989 * Get a pointer to the base of the mbuf cluster and move 990 * data start past it. 991 */ 992 rfa = mtod(m, struct fxp_rfa *); 993 m->m_data += sizeof(struct fxp_rfa); 994 rfa->size = MCLBYTES - sizeof(struct fxp_rfa); 995 996 rfa->rfa_status = 0; 997 rfa->rfa_control = FXP_RFA_CONTROL_EL; 998 rfa->link_addr = -1; 999 rfa->rbd_addr = -1; 1000 rfa->actual_size = 0; 1001 /* 1002 * If there are other buffers already on the list, attach this 1003 * one to the end by fixing up the tail to point to this one. 1004 */ 1005 if (sc->rfa_headm != NULL) { 1006 p_rfa = (struct fxp_rfa *) sc->rfa_tailm->m_ext.ext_buf; 1007 sc->rfa_tailm->m_next = m; 1008 p_rfa->link_addr = vtophys(rfa); 1009 p_rfa->rfa_control &= ~FXP_RFA_CONTROL_EL; 1010 } else { 1011 sc->rfa_headm = m; 1012 } 1013 sc->rfa_tailm = m; 1014 1015 return (m == oldm); 1016} 1017 1018static int 1019fxp_ioctl(ifp, command, data) 1020 struct ifnet *ifp; 1021 int command; 1022 caddr_t data; 1023{ 1024 struct ifaddr *ifa = (struct ifaddr *) data; 1025 struct fxp_softc *sc = ifp->if_softc; 1026 struct ifreq *ifr = (struct ifreq *) data; 1027 int s, error = 0; 1028 1029 s = splimp(); 1030 1031 switch (command) { 1032 1033 case SIOCSIFADDR: 1034 case SIOCGIFADDR: 1035 case SIOCSIFMTU: 1036 error = ether_ioctl(ifp, command, data); 1037 break; 1038 1039 case SIOCSIFFLAGS: 1040 1041 /* 1042 * If interface is marked up and not running, then start it. 1043 * If it is marked down and running, stop it. 1044 * XXX If it's up then re-initialize it. This is so flags 1045 * such as IFF_PROMISC are handled. 1046 */ 1047 if (ifp->if_flags & IFF_UP) { 1048 fxp_init(sc); 1049 } else { 1050 if (ifp->if_flags & IFF_RUNNING) 1051 fxp_stop(sc); 1052 } 1053 break; 1054 1055 case SIOCADDMULTI: 1056 case SIOCDELMULTI: 1057 /* 1058 * Multicast list has changed; set the hardware filter 1059 * accordingly. 1060 */ 1061 fxp_init(sc); 1062 error = 0; 1063 break; 1064 1065 default: 1066 error = EINVAL; 1067 } 1068 (void) splx(s); 1069 return (error); 1070} 1071