Date: Mon, 01 Jul 2002 01:15:08 +0900 (JST) From: FUJITA Kazutoshi <fujita@soum.co.jp> To: freebsd-stable@FreeBSD.ORG Subject: Re: SiS900 attach failed Message-ID: <20020701.011508.78701662.fujita@soum.co.jp> In-Reply-To: <20020627.025834.74679455.fujita@soum.co.jp> References: <20020612.033500.74692669.fujita@soum.co.jp> <20020613.130343.104087941.fujita@soum.co.jp> <20020627.025834.74679455.fujita@soum.co.jp>
next in thread | previous in thread | raw e-mail | index | archive | help
----Next_Part(Mon_Jul__1_01:15:08_2002_617)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit From: FUJITA Kazutoshi <fujita@soum.co.jp> Subject: Re: SiS900 attach failed Date: Thu, 27 Jun 2002 02:58:34 +0900 (JST) Message-ID: <20020627.025834.74679455.fujita@soum.co.jp> > > > I got SiS chipset based PC recently, and install 4-STABLE. > > > > > > But my SiS900 does not work with GENERIC kernel. > > > > > > sis0: <SiS 900 10/100BaseTX> port 0xd400-0xd4ff mem 0xdfff9000-0xdfff9fff irq 11 at device 3.0 on pci0 > > > sis0: Ethernet address: 00:07:95:c0:de:e2 > > > sis0: MII without any PHY! > > > device_probe_and_attach: sis0 attach returned 6 > > > > additional information. > > > > the chipset is SiS650(for Pentium4) > > and the embeded NIC works on Linux(RedHat 7.3/kernel 2.4.18) > > > > sis900.c: v1.08.03 2/1/2002 > > PCI: Assigned IRQ 11 for device 00:03.0 > > eth0: Realtek RTL8201 PHY transceiver found at address 1. > > eth0: Using transceiver found at address 1 as default > > eth0: SiS 900 PCI Fast Ethernet at 0xd400, IRQ 11, 00:07:95:c0:de:e2. > > eth0: Media Link On 100mbps full-duplex > > > > (Linux driver says PHY is on address 1.) > > > > sis_miibus_readreg() returns always 0 in mii_phy_probe() > > I compared the drivers between FreeBSD and Linux. > > In FreeBSD, the driver use ENPHY(Enhanced PHY Access) register > to access to the PHY. > But in Linux, the driver use EEPROM(serial io). > > I don't know why, but the ENPHY register does not work well > in the SiS650 chipset environment, maybe. I tried to implement serial io via EEPROM, referred to Linux driver, then succeed in probing PHY and it seems work, sis0: <SiS 900 10/100BaseTX> port 0xd400-0xd4ff mem 0xdfff9000-0xdfff9fff irq 11 at device 3.0 on pci0 sis0: Ethernet address: 00:07:95:c0:de:e2 miibus0: <MII bus> on sis0 rlphy0: <RTL8201L 10/100 media interface> on miibus0 rlphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto but it seems something is strange with multicast handling. For example, try to ping6 to all-node multicast such as [sishost]# ping6 -c 2 ff02::1%sis0 PING6(56=40+8+8 bytes) fe80::207:95ff:fec0:dee2%sis0 --> ff02::1%sis0 16 bytes from fe80::207:95ff:fec0:dee2%sis0, icmp_seq=0 hlim=64 time=0.316 ms 16 bytes from fe80::204:76ff:fe6e:1f81%sis0, icmp_seq=0 hlim=64 time=0.769 ms(DUP!) 16 bytes from fe80::207:95ff:fec0:dee2%sis0, icmp_seq=1 hlim=64 time=0.21 ms --- ff02::1%sis0 ping6 statistics --- 2 packets transmitted, 2 packets received, +1 duplicates, 0% packet loss round-trip min/avg/max/std-dev = 0.210/0.432/0.769/0.242 ms and tcpdump on same host, [sishost]# tcpdump -i sis0 tcpdump: WARNING: sis0: no IPv4 address assigned tcpdump: listening on sis0 00:56:16.731362 3a:40:fe:80:0:0 > 60:0:0:0:0:10 null I (s=1,r=3,P) len=38 95ff fec0 dee2 ff02 0000 0000 0000 0000 0000 0000 0001 8000 47db 011b 0000 202a 1f3d 7928 0b00 00:56:16.731376 fe80::207:95ff:fec0:dee2 > ff02::1: icmp6: echo request 00:56:16.731478 3a:40:fe:80:0:0 > 60:0:0:0:0:10 null I (s=1,r=3,P) len=38 95ff fec0 dee2 fe80 0000 0000 0000 0207 95ff fec0 dee2 8100 d1b3 011b 0000 202a 1f3d 7928 0b00 00:56:16.731536 fe80::204:76ff:fe6e:1f81 > fe80::207:95ff:fec0:dee2: icmp6: echo reply 00:56:17.732960 3a:40:fe:80:0:0 > 60:0:0:0:0:10 null I (s=1,r=3,P) len=38 95ff fec0 dee2 ff02 0000 0000 0000 0000 0000 0000 0001 8000 e7d3 011b 0001 212a 1f3d d82e 0b00 00:56:17.732976 fe80::207:95ff:fec0:dee2 > ff02::1: icmp6: echo request 00:56:17.733048 3a:40:fe:80:0:0 > 60:0:0:0:0:10 null I (s=1,r=3,P) len=38 95ff fec0 dee2 fe80 0000 0000 0000 0207 95ff fec0 dee2 8100 71ac 011b 0001 212a 1f3d d82e 0b00 00:56:17.733138 fe80::204:76ff:fe6e:1f81 > fe80::207:95ff:fec0:dee2: icmp6: echo reply unknown packets are sent from sis. This might be same problem discuss in freebsd-hackers@freebsd.org several months ago.(Subject: Multicast problem with sis interface?) TIA ----Next_Part(Mon_Jul__1_01:15:08_2002_617)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="if_sis.patch" *** /sys/pci/if_sisreg.h Thu Feb 28 14:39:32 2002 --- if_sisreg.h Mon Jul 1 00:19:19 2002 *************** *** 124,129 **** --- 124,151 ---- #define SIS_EECMD_READ 0x180 #define SIS_EECMD_ERASE 0x1c0 + #define SIS_NOENPHY /* don't use Enhanced PHY Access Register */ + #ifdef SIS_NOENPHY + #define SIS_MII_FRAME_START 0x4000 + #define SIS_MII_FRAME_OP_READ 0x2000 + #define SIS_MII_FRAME_OP_WRITE 0x1000 + #define SIS_MII_FRAME_PMD(phy) ((phy & 0x1F) << 7) + #define SIS_MII_FRAME_REG(reg) ((reg & 0x1F) << 2) + #define SIS_MII_FRAME_LINE_READ 0x0000 + #define SIS_MII_FRAME_LINE_WRITE 0x0002 + #define SIS_MII_FRAME_READ(phy, reg) \ + (SIS_MII_FRAME_START | SIS_MII_FRAME_OP_READ \ + | SIS_MII_FRAME_PMD(phy) | SIS_MII_FRAME_REG(reg) \ + | SIS_MII_FRAME_LINE_READ) + #define SIS_MII_FRAME_WRITE(phy, reg) \ + (SIS_MII_FRAME_START | SIS_MII_FRAME_OP_WRITE \ + | SIS_MII_FRAME_PMD(phy) | SIS_MII_FRAME_REG(reg) \ + | SIS_MII_FRAME_LINE_WRITE) + #define SIS_MII_MDC 0x00000040 + #define SIS_MII_MDDIR 0x00000020 + #define SIS_MII_MDIO 0x00000010 + #endif /* SIS_NOENPHY */ + #define SIS_EE_NODEADDR 0x8 #define NS_EE_NODEADDR 0x6 *** /sys/pci/if_sis.c Thu Feb 28 14:39:32 2002 --- if_sis.c Mon Jul 1 00:11:11 2002 *************** *** 475,480 **** --- 475,483 ---- { struct sis_softc *sc; int i, val = 0; + #ifdef SIS_NOENPHY + int frame_hdr = SIS_MII_FRAME_READ(phy, reg); + #endif sc = device_get_softc(dev); *************** *** 501,506 **** --- 504,536 ---- sc->sis_rev < SIS_REV_635 && phy != 0) return(0); + #ifdef SIS_NOENPHY + sis_eeprom_idle(sc); + + for (i = (1 << 15); i; i >>= 1) { + int dataval = SIS_MII_MDDIR; + if (frame_hdr & i) { + dataval |= SIS_MII_MDIO; + } + CSR_WRITE_4(sc, SIS_EECTL, dataval); + sis_delay(sc); + CSR_WRITE_4(sc, SIS_EECTL, (dataval | SIS_MII_MDC)); + sis_delay(sc); + } + + for (i = (1 << 15); i; i >>= 1) { + CSR_WRITE_4(sc, SIS_EECTL, 0); + sis_delay(sc); + if (CSR_READ_4(sc, SIS_EECTL) & SIS_MII_MDIO) { + val |= i; + } + CSR_WRITE_4(sc, SIS_EECTL, SIS_MII_MDC); + sis_delay(sc); + } + CSR_WRITE_4(sc, SIS_EECTL, 0); + + sis_eeprom_idle(sc); + #else /* SIS_NOENPHY */ CSR_WRITE_4(sc, SIS_PHYCTL, (phy << 11) | (reg << 6) | SIS_PHYOP_READ); SIS_SETBIT(sc, SIS_PHYCTL, SIS_PHYCTL_ACCESS); *************** *** 518,523 **** --- 548,554 ---- if (val == 0xFFFF) return(0); + #endif /* SIS_NOENPHY */ return(val); } *************** *** 528,533 **** --- 559,567 ---- { struct sis_softc *sc; int i; + #ifdef SIS_NOENPHY + int frame_hdr = SIS_MII_FRAME_WRITE(phy, reg); + #endif /* SIS_NOENPHY */ sc = device_get_softc(dev); *************** *** 538,546 **** return(0); } ! if (sc->sis_type == SIS_TYPE_900 && phy != 0) return(0); CSR_WRITE_4(sc, SIS_PHYCTL, (data << 16) | (phy << 11) | (reg << 6) | SIS_PHYOP_WRITE); SIS_SETBIT(sc, SIS_PHYCTL, SIS_PHYCTL_ACCESS); --- 572,618 ---- return(0); } ! if (sc->sis_type == SIS_TYPE_900 && ! sc->sis_rev < SIS_REV_635 && phy != 0) return(0); + #ifdef SIS_NOENPHY + sis_eeprom_idle(sc); + + for (i = (1 << 15); i; i >>= 1) { + int dataval = SIS_MII_MDDIR; + if (frame_hdr & i) { + dataval |= SIS_MII_MDIO; + } + CSR_WRITE_4(sc, SIS_EECTL, dataval); + sis_delay(sc); + CSR_WRITE_4(sc, SIS_EECTL, (dataval | SIS_MII_MDC)); + sis_delay(sc); + } + sis_delay(sc); + + for (i = (1 << 15); i; i >>= 1) { + int dataval = SIS_MII_MDDIR; + if (data & i) { + dataval |= SIS_MII_MDIO; + } + CSR_WRITE_4(sc, SIS_EECTL, dataval); + sis_delay(sc); + CSR_WRITE_4(sc, SIS_EECTL, (dataval | SIS_MII_MDC)); + sis_delay(sc); + } + sis_delay(sc); + + for (i = 2; i > 0; i --) { + CSR_WRITE_4(sc, SIS_EECTL, 0); + sis_delay(sc); + CSR_WRITE_4(sc, SIS_EECTL, SIS_MII_MDC); + sis_delay(sc); + } + CSR_WRITE_4(sc, SIS_EECTL, 0); + + sis_eeprom_idle(sc); + #else /* SIS_NOENPHY */ CSR_WRITE_4(sc, SIS_PHYCTL, (data << 16) | (phy << 11) | (reg << 6) | SIS_PHYOP_WRITE); SIS_SETBIT(sc, SIS_PHYCTL, SIS_PHYCTL_ACCESS); *************** *** 552,557 **** --- 624,630 ---- if (i == SIS_TIMEOUT) printf("sis%d: PHY failed to come ready\n", sc->sis_unit); + #endif /* SIS_NOENPHY */ return(0); } ----Next_Part(Mon_Jul__1_01:15:08_2002_617)---- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020701.011508.78701662.fujita>