Date: Tue, 24 Oct 2000 23:12:53 -0700 (PDT) From: asami@freebsd.org (Satoshi Asami) To: mobile@freebsd.org Subject: Linksys EtherFast 10/100 in 4-stable? Message-ID: <200010250612.e9P6CrX97864@silvia.hip.berkeley.edu>
next in thread | raw e-mail | index | archive | help
Hi,
I upgraded my ThinkPad 560 to 4.1 today and the network is not working
well. NFS seems to hang as soon as I try to transfer a big file. It
happens 4.1 as well as the latest (as of two days ago) 4-stable.
Normal network stuff seems fine, at least I can transfer stuff like
the kernel with ftp.
I'm not sure if it's related but I'm using a Linksys EtherFast 10/100.
It used to work fine with the following patch to 3-stable. Looking at
sys/dev/ed, it seems some of the stuff were merged but not all of it.
I tried to apply the patch by hand but not being a kernel buff at all,
I can't get anything to work. ;)
Does anyone have any idea what I should do?
Satoshi
-------
Index: sys/i386/isa/if_ed.c
===================================================================
RCS file: /usr/cvs/src/sys/i386/isa/Attic/if_ed.c,v
retrieving revision 1.148.2.5
diff -u -r1.148.2.5 if_ed.c
--- sys/i386/isa/if_ed.c 2000/01/18 14:19:39 1.148.2.5
+++ sys/i386/isa/if_ed.c 2000/01/19 11:48:24
@@ -1072,6 +1072,7 @@
u_char romdata[16], tmp;
static char test_pattern[32] = "THIS is A memory TEST pattern";
char test_buffer[32];
+ int linksys = 0;
sc->asic_addr = port + ED_NOVELL_ASIC_OFFSET;
sc->nic_addr = port + ED_NOVELL_NIC_OFFSET;
@@ -1141,7 +1142,13 @@
ed_pio_writemem(sc, test_pattern, 8192, sizeof(test_pattern));
ed_pio_readmem(sc, 8192, test_buffer, sizeof(test_pattern));
- if (bcmp(test_pattern, test_buffer, sizeof(test_pattern))) {
+ linksys = ed_get_Linksys(sc);
+ if (linksys) {
+ outb(sc->nic_addr + ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS);
+ sc->isa16bit = 1;
+ sc->type = ED_TYPE_NE2000;
+ sc->type_str = "Linksys";
+ } else if (bcmp(test_pattern, test_buffer, sizeof(test_pattern))) {
/* not an NE1000 - try NE2000 */
outb(sc->nic_addr + ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS);
@@ -1251,19 +1258,22 @@
* Use one xmit buffer if < 16k, two buffers otherwise (if not told
* otherwise).
*/
- if ((memsize < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING))
+ if ((sc->mem_size < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING))
sc->txb_cnt = 1;
else
sc->txb_cnt = 2;
sc->rec_page_start = sc->tx_page_start + sc->txb_cnt * ED_TXBUF_SIZE;
- sc->rec_page_stop = sc->tx_page_start + memsize / ED_PAGE_SIZE;
+ n = sc->tx_page_start + sc->mem_size / ED_PAGE_SIZE;
+ sc->rec_page_stop = (n > 0xff) ? 0xff : n;
sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
- ed_pio_readmem(sc, 0, romdata, 16);
- for (n = 0; n < ETHER_ADDR_LEN; n++)
- sc->arpcom.ac_enaddr[n] = romdata[n * (sc->isa16bit + 1)];
+ if (!linksys) {
+ ed_pio_readmem(sc, 0, romdata, 16);
+ for (n = 0; n < ETHER_ADDR_LEN; n++)
+ sc->arpcom.ac_enaddr[n] = romdata[n * (sc->isa16bit + 1)];
+ }
#ifdef GWETHER
if (sc->arpcom.ac_enaddr[2] == 0x86) {
@@ -2195,6 +2205,24 @@
* Loop back to the top to possibly buffer more packets
*/
goto outloop;
+}
+
+static int
+ed_get_Linksys(sc)
+ struct ed_softc *sc;
+{
+ u_char sum;
+ int i;
+
+ for (sum = 0, i = 0x14; i < 0x1c; i++)
+ sum += inb(sc->nic_addr + i);
+ if (sum != 0xff)
+ return (0);
+ for (i = 0; i < ETHER_ADDR_LEN; i++) {
+ sc->arpcom.ac_enaddr[i] = inb(sc->nic_addr + 0x14 + i);
+ printf("%02x.", sc->arpcom.ac_enaddr[i]);
+ }
+ return (1);
}
/*
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-mobile" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200010250612.e9P6CrX97864>
