From owner-freebsd-mobile Tue Jun 20 12:48: 2 2000 Delivered-To: freebsd-mobile@freebsd.org Received: from elvis.mu.org (elvis.mu.org [207.154.226.10]) by hub.freebsd.org (Postfix) with ESMTP id 749A537BE7F for ; Tue, 20 Jun 2000 12:47:54 -0700 (PDT) (envelope-from paul@elvis.mu.org) Received: by elvis.mu.org (Postfix, from userid 1000) id 1A14C2B25E; Tue, 20 Jun 2000 14:47:54 -0500 (CDT) Date: Tue, 20 Jun 2000 12:47:54 -0700 From: Paul Saab To: Marc Fonvieille Cc: freebsd-mobile@freebsd.org, phthin@club-internet.fr Subject: Re: 4.0-RELEASE, Netgear FA410TXC, device timeout [Long Solution] Message-ID: <20000620124753.A57147@elvis.mu.org> References: <20000620140632.A10243@vobiscum.styx.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2i In-Reply-To: <20000620140632.A10243@vobiscum.styx.org>; from fonvi@easynet.fr on Tue, Jun 20, 2000 at 02:06:32PM +0200 Sender: owner-freebsd-mobile@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org There is a fix in -current and -stable now that fixes the detection problem properly. paul Marc Fonvieille (fonvi@easynet.fr) wrote: > Hello, > > Now my Netgear FA410TXC runs fine!!! > > Well, here's the solution: > > > 1- Correct card detection: > The card MAC address is written on the card (Node ID), mine is > 00 E0 98 7A F5 61. By default the ed driver doesn't detect the > good type of card and so the correct MAC address. > > To fix that we need to modify /usr/src/sys/dev/ed/if_ed.c > at line 1016 (for 4.0R, 1011 for 4.0S) we've got this: > > if (bcmp(test_pattern, test_buffer, sizeof(test_pattern)) == 0) { > /* could be either an NE1000 or a Linksys ethernet controller */ > linksys = ed_get_Linksys(sc); > > replace with: > > /* if (bcmp(test_pattern, test_buffer, sizeof(test_pattern)) == 0) {*/ > if (1) { > /* could be either an NE1000 or a Linksys ethernet controller */ > linksys = ed_get_Linksys(sc); > > Rebuild your kernel, now your card must be detect with correct > address and type Linksys (16 bit) > > 2- Force speed negociation > The card seems unable to negociate link. > I modified the fa_select.c used under linux to fix that pb. > Here's the code for FreeBSD: > > /* fa_select.c */ > /* modified for FreeBSD 4.x */ > /* */ > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > > #define BASE_ADDR 0x240 /* replace with the card base address */ > > > inline unsigned char > inb (unsigned short port) > { > unsigned char _v; > > __asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" (port)); > return _v; > } > > inline void > outb (unsigned char value, unsigned short port) > { > __asm__ __volatile__ ("outb %b0,%w1"::"a" (value), "Nd" (port)); > } > > static int sockets_open(void) > { > int sock; > if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) != -1) > return sock; > else if ((sock = socket(AF_IPX, SOCK_DGRAM, 0)) != -1) > return sock; > else > return socket(AF_APPLETALK, SOCK_DGRAM, 0); > } > void write_bit(int port, int bit) > { > outb((bit << 6) + 0x20, port); > usleep(1); > outb((bit << 6) + 0xa0, port); > usleep(1); > outb((bit << 6) + 0x20, port); > } > int read_bit(int port) > { > int i; > outb(0, port); > usleep(1); > outb(0x80, port); > usleep(1); > i = inb(port); > outb(0, port); > return (i & 0x10) >> 4; > } > void reset(int port) > { > outb(0x08, port); > usleep(1); > outb(0x0C, port); > usleep(1); > outb(0x08, port); > usleep(1); > outb(0x0C, port); > outb(0x00, port); > } > int reada(int port, int adr) > { > int i,j; > > for (i=0; i<0x20; i++) > write_bit(port, 1); > > write_bit(port, 0); > write_bit(port, 1); > write_bit(port, 1); > write_bit(port, 0); > > write_bit(port, 0); > write_bit(port, 0); > write_bit(port, 0); > write_bit(port, 0); > write_bit(port, 0); > > write_bit(port, (adr & 0x10) >> 4); > write_bit(port, (adr & 0x08) >> 3); > write_bit(port, (adr & 0x04) >> 2); > write_bit(port, (adr & 0x02) >> 1); > write_bit(port, (adr & 0x01) >> 0); > > j = read_bit(port); > if (j == 1) > j = read_bit(port); > for (i=0; i<16; i++) { > j = (j << 1) + read_bit(port); > } > write_bit(port, 1); > return j; > } > int writea(int port, int adr, int val) > { > int i; > > outb(0x08, port); > usleep(1); > outb(0x0C, port); > usleep(1); > outb(0x08, port); > usleep(1); > outb(0x0C, port); > outb(0x00, port); > > for (i=0; i<0x20; i++) > write_bit(port, 1); > > write_bit(port, 0); > write_bit(port, 1); > write_bit(port, 0); > write_bit(port, 1); > > write_bit(port, 0); > write_bit(port, 0); > write_bit(port, 0); > write_bit(port, 0); > write_bit(port, 0); > > write_bit(port, (adr & 0x10) >> 4); > write_bit(port, (adr & 0x08) >> 3); > write_bit(port, (adr & 0x04) >> 2); > write_bit(port, (adr & 0x02) >> 1); > write_bit(port, (adr & 0x01) >> 0); > > write_bit(port, 1); > write_bit(port, 0); > > write_bit(port, (val & 0x8000) >> 15); > write_bit(port, (val & 0x4000) >> 14); > write_bit(port, (val & 0x2000) >> 13); > write_bit(port, (val & 0x1000) >> 12); > write_bit(port, (val & 0x0800) >> 11); > write_bit(port, (val & 0x0400) >> 10); > write_bit(port, (val & 0x0200) >> 9); > write_bit(port, (val & 0x0100) >> 8); > write_bit(port, (val & 0x0080) >> 7); > write_bit(port, (val & 0x0040) >> 6); > write_bit(port, (val & 0x0020) >> 5); > write_bit(port, (val & 0x0010) >> 4); > write_bit(port, (val & 0x0008) >> 3); > write_bit(port, (val & 0x0004) >> 2); > write_bit(port, (val & 0x0002) >> 1); > write_bit(port, (val & 0x0001) >> 0); > > write_bit(port, 1); > return 0; > } > int > main(int argc, char **argv) > { > int skfd, i, sub; > struct ifreq ifr; > > /* base_addr = atoi(argv[3]);*/ > /* printf ("%i",base_addr);*/ > skfd = sockets_open(); > if (skfd == -1) { > perror("socket"); > exit(1); > } > strcpy(ifr.ifr_name, argv[1]); > /* if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) { > perror("ioctl"); > exit(1); > }*/ > i = atoi(argv[2]); > switch(i) { > case 0: > sub = 0x0000; > break; > case 1: > sub = 0x0100; > break; > case 2: > sub = 0x2000; > break; > default: > sub = 0x2100; > break; > } > i386_set_ioperm(BASE_ADDR+0x1c, 1, 1); > reset(BASE_ADDR+0x1c); > writea(BASE_ADDR+0x1c, 0, 0x8000); > writea(BASE_ADDR+0x1c, 0, sub); > close(skfd); > exit(0); > return 0; > } > > Don't forget to change #define BASE_ADDR 0x240 with the card address. > > To compile it: gcc -Wall fa_select.c -o fa_select > > To use it: > > fa_select device rate > > where device is: ed0, ed1... > rate is: 0 for 10BaseT > 1 for 10Base2 (full duplex) > 2 for 100BaseT > 3 for 100Mbit (full duplex) > > I tried this with my adsl modem (Alcatel 1000 Adsl) with 'fa_select ed1 0' > and it runs fine without timeout. > > Ok, that's all. > > Great thanks for the help to all persons from the mailing list. > > Marc > > > To Unsubscribe: send mail to majordomo@FreeBSD.org > with "unsubscribe freebsd-mobile" in the body of the message -- Paul Saab Technical Yahoo paul@mu.org - ps@yahoo-inc.com - ps@freebsd.org Do You .. uhh .. Yahoo!? To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-mobile" in the body of the message