Date: Wed, 20 Dec 1995 22:40:41 +0200 From: Dmitry Kohmanyuk <dk@snark.ukma.kiev.ua> To: FreeBSD-gnats-submit@freebsd.org Subject: i386/906: netboot ca't find NE2000-compat card (DP83905 chip, Dauphin notebook) Message-ID: <199512202040.WAA03820@snark.ukma.kiev.ua> Resent-Message-ID: <199512202100.NAA15389@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 906 >Category: i386 >Synopsis: /sys/i386/boot/netboot/nb8390.com cannot recognize NE2000-comp. card >Confidential: no >Severity: serious >Priority: high >Responsible: freebsd-bugs >State: open >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Dec 20 13:00:02 PST 1995 >Last-Modified: >Originator: Dmitry Kohmanyuk >Organization: FARM Computing Association >Release: FreeBSD snark.ukma.kiev.ua 2.0.5-RELEASE >Environment: I have Douphin DTR-1 notebook (bought it yesterday). It is 486SLC (no coprocessor), has 6 megs of RAM, small HD, and built-in Ethernet card. The documentation claims that the card is NE-2000 compatible, based on DP83905 chip from NS, controller is AT/LANTIC, connection is TP, RJ-45, and it has 8K x 8 static RAM buffer (so, should be fast), 256 bit EEPROM (for port/irq/etc setup), 16 byte FIFO. Then, doc says: "Mode: I/O Port mode, compatible with 8BIT Mode offered by Novell NE2000" >Description: I try to setup my notebook to be a diskless FreeBSD workstation (I think it should work fine at least in text mode). I boot bare-bones DOS (F5 on boot), run the supplied "lanon" program (it enables the card); the light on hub goes on after that). I run the setup/diagnostic program in "packet sniffer" mode and it indeed shows all my rwho packets flowing on the wire (and some others, too). The setup/diag program, when tests reading NIC regs, says: "8 bit slot found", so I assume card should work in 8-bit mode. I already have 2 diskless PCs running FreeBSD (2.0.5 and 2.1) here. Then, I run nb8390.com program (from floppy). I know there can be some problems with supplied nb8390.com since it's configured to probe for both WD and NE, so I built a custom version which probes only for NE. the stock version says, "No adapter found". My version (that same file which boots 2 other boxes) hangs. The card is set to port 0x300, irq 5. The boot program is set to port 0x300. I have patched source to insert some debug printf's, and found that it fails testing for 8-bit card, and hangs when testing for 16-bit card. I have read the if_ed.c from 2.0.5 (it seems 2.1 is the same for NE2000s), and copied the ed_probe_generic8390() code to test the board. it succeeds! This is a relevant piece of code from /sys/i386/boot/netboot/ns8390.c (DPRINTF() and DELAY() are mine, as well as long if() followed by goto): [ the last thing printed is ne-3, so it hangs before ne-3.1 ] [ note that bcompare() returns 1 on memory equal, unlike bcmp() ] [...] DPRINTF(("NE*000 card... ")); eth_bmem = (char *)0; /* No shared memory */ eth_asic_base = NE_BASE + NE_ASIC_OFFSET; eth_nic_base = NE_BASE; eth_vendor = VENDOR_NOVELL; eth_flags = FLAG_PIO; eth_memsize = MEM_16384; eth_tx_start = 32; c = inb(eth_asic_base + NE_RESET); outb(eth_asic_base + NE_RESET, c); DELAY(5000); inb(0x84); outb(eth_nic_base + D8390_P0_COMMAND, D8390_COMMAND_STP | D8390_COMMAND_RD2); DELAY(5000); DPRINTF(("ne-1 ")); /* dk: test for 8390 chip, from 2.0.5's driver */ if ((inb(eth_nic_base + D8390_P0_COMMAND) & (D8390_COMMAND_RD2 | D8390_COMMAND_TXP | D8390_COMMAND_STA | D8390_COMMAND_STP)) != (D8390_COMMAND_RD2 | D8390_COMMAND_STP) || (inb(eth_nic_base + D8390_P0_ISR) & D8390_ISR_RST) != D8390_ISR_RST) goto no_novell; DPRINTF(("ne-1.2 ")); outb(eth_nic_base + D8390_P0_RCR, D8390_RCR_MON); outb(eth_nic_base + D8390_P0_DCR, D8390_DCR_FT1 | D8390_DCR_LS); outb(eth_nic_base + D8390_P0_PSTART, MEM_8192); outb(eth_nic_base + D8390_P0_PSTOP, MEM_16384); DPRINTF(("ne-2 ")); eth_pio_write(test, 8192, sizeof(test)); eth_pio_read(8192, testbuf, sizeof(test)); if (!bcompare(test, testbuf, sizeof(test))) { DPRINTF(("ne-3 ")); eth_flags |= FLAG_16BIT; eth_memsize = MEM_32768; eth_tx_start = 64; outb(eth_nic_base + D8390_P0_DCR, D8390_DCR_WTS | D8390_DCR_FT1 | D8390_DCR_LS); outb(eth_nic_base + D8390_P0_PSTART, MEM_16384); outb(eth_nic_base + D8390_P0_PSTOP, MEM_32768); eth_pio_write(test, 16384, sizeof(test)); eth_pio_read(16384, testbuf, sizeof(test)); DPRINTF(("ne-3.1 ")); if (!bcompare(testbuf, test, sizeof(test))) return (0); } DPRINTF(("ne-4 ")); eth_pio_read(0, romdata, 16); DPRINTF(("ne-5 ")); printf("\r\nNE1000/NE2000 base 0x%x, addr ", eth_nic_base); [...] I have tried to enable shared memory mode. I have tried to set 64K mode instead of 16K ("Novell-compatible" as setup prog says) I have "CHRDY after BALE high", "IO16 after strobe", "read cycles enhanced", "TPI link integrity checking enabled" settings, but I haven't touched them. I have written down the NIC registers (thanks great diag program which comes with board!) CR 22 TSK 83 ISR 15 IMR 00 RSR 11 RCR 1C TCR 00 DCR 58 although I doubt this is relevant here. >How-To-Repeat: just run the nb8390.com program. >Fix: none known ;-( sorry for this long report, I have tried to provide _ALL_ the info which can help. >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199512202040.WAA03820>