Skip site navigation (1)Skip section navigation (2)
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>