--- /usr/src/sys/dev/ie/if_ie.c Mon Jul 17 14:24:27 2000 +++ if_ie.c Thu Aug 2 22:59:34 2001 @@ -549,6 +549,7 @@ struct ie_softc *ie = (struct ie_softc *)sc; int unit = ie - &ie_softc[0]; + return; /* Do nothing - ee16_reset_586 will hang the machine!!! */ ee16_reset_586(unit); outb(PORT + IEE16_ECTRL, IEE16_RESET_ASIC); outb(PORT + IEE16_ECTRL, 0); @@ -621,6 +622,9 @@ bd_maddr = 0; i = (ee16_read_eeprom(sc, 6) & 0x00ff) >> 3; switch (i) { + case 0x01: + bd_maddr = 0xC8000; + break; case 0x03: bd_maddr = 0xCC000; break; @@ -634,6 +638,16 @@ bd_maddr = 0xD8000; break; default: + printf("ie%d: Unknown maddr id: %x\n", unit, i); + /* + * This stupid driver only supports a narrow subset of possible settings. + * Also, certain card settings seem to give better results than others. + * At this point, the user has guessed wrong, so let's give him/her a clue... + */ + printf("ie%d: Supported settings: 32K at C8000, CC000, D0000, D4000 or D8000\n", unit); + printf("ie%d: Recommended primary settings: irq=10, port=300, mem=32K at D0000\n", unit); + printf("ie%d: Recommended secondary settings: irq=11, port=260, mem=32K at C8000\n", unit); + printf("ie%d: Use Intel's SOFTSET.EXE from a DOS boot to change card settings\n", unit); bd_maddr = 0; break; } @@ -825,6 +839,7 @@ ifp->if_type = IFT_ETHER; ifp->if_addrlen = 6; ifp->if_hdrlen = 14; + ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; if (ie->hard_type == IE_EE16) EVENTHANDLER_REGISTER(shutdown_post_sync, ee16_shutdown, @@ -858,6 +873,19 @@ /* Don't ack interrupts which we didn't receive */ ie_ack(ie->scb, IE_ST_WHENCE & status, unit, ie->ie_chan_attn); + + /* + * Heavy traffic hangs an EE16. Looks like it may be a timing + * issue processing the above request to disable interrupts. + * Whatever the cause, this delay seems to cure things, though + * it does slow throughput by a few %. Better to lose a few % + * than lose everything through a system hang. + * The delay can be cut as low as 15, which puts performance + * on near-par with no delay, but very occasional problems + * may still crop up if any of the hardware is borderline. + */ + if (ie->hard_type == IE_EE16) + DELAY(20); if (status & (IE_ST_RECV | IE_ST_RNR)) { #ifdef DEBUG