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
[-- Attachment #1 --]
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
[-- Attachment #2 --]
*** /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);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020701.011508.78701662.fujita>
