void EtherStop(void) { epstop(); outw(BASE + EP_COMMAND, GLOBAL_RESET); delay(100000); }
static int ep_if_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr) { struct ep_softc * sc = ifp->if_softc; struct ifreq * ifr = (struct ifreq *)data; int error = 0; crit_enter(); switch (cmd) { case SIOCSIFFLAGS: if (((ifp->if_flags & IFF_UP) == 0) && (ifp->if_flags & IFF_RUNNING)) { ifp->if_flags &= ~IFF_RUNNING; epstop(sc); } else { /* reinitialize card on any parameter change */ ep_if_init(sc); } break; #ifdef notdef case SIOCGHWADDR: bcopy((caddr_t) sc->sc_addr, (caddr_t) & ifr->ifr_data, sizeof(sc->sc_addr)); break; #endif case SIOCADDMULTI: case SIOCDELMULTI: /* * The Etherlink III has no programmable multicast * filter. We always initialize the card to be * promiscuous to multicast, since we're always a * member of the ALL-SYSTEMS group, so there's no * need to process SIOC*MULTI requests. */ error = 0; break; case SIOCSIFMEDIA: case SIOCGIFMEDIA: if (!sc->epb.mii_trans) { error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, cmd); } else { error = EINVAL; } break; default: error = ether_ioctl(ifp, cmd, data); break; } crit_exit(); return (error); }
/************************************************************************** ETH_RESET - Reset adapter ***************************************************************************/ void epreset(void) { int i; /*********************************************************** Reset 3Com 509 card *************************************************************/ epstop(); /* * initialize card */ while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS) continue; GO_WINDOW(0); /* Disable the card */ outw(BASE + EP_W0_CONFIG_CTRL, 0); /* Configure IRQ to none */ outw(BASE + EP_W0_RESOURCE_CFG, SET_IRQ(0)); /* Enable the card */ outw(BASE + EP_W0_CONFIG_CTRL, ENABLE_DRQ_IRQ); GO_WINDOW(2); /* Reload the ether_addr. */ for (i = 0; i < 6; i++) outb(BASE + EP_W2_ADDR_0 + i, eth_myaddr[i]); outw(BASE + EP_COMMAND, RX_RESET); outw(BASE + EP_COMMAND, TX_RESET); /* Window 1 is operating window */ GO_WINDOW(1); for (i = 0; i < 31; i++) inb(BASE + EP_W1_TX_STATUS); /* get rid of stray intr's */ outw(BASE + EP_COMMAND, ACK_INTR | 0xff); outw(BASE + EP_COMMAND, SET_RD_0_MASK | S_5_INTS); outw(BASE + EP_COMMAND, SET_INTR_MASK); outw(BASE + EP_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | FIL_BRDCST); /* configure BNC */ if (ether_medium == ETHERMEDIUM_BNC) { outw(BASE + EP_COMMAND, START_TRANSCEIVER); delay(1000); } /* configure UTP */ if (ether_medium == ETHERMEDIUM_UTP) { GO_WINDOW(4); outw(BASE + EP_W4_MEDIA_TYPE, ENABLE_UTP); GO_WINDOW(1); } /* start tranciever and receiver */ outw(BASE + EP_COMMAND, RX_ENABLE); outw(BASE + EP_COMMAND, TX_ENABLE); /* set early threshold for minimal packet length */ outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | 64); outw(BASE + EP_COMMAND, SET_TX_START_THRESH | 16); }