Hi there, I had the same problem about 6 months ago, and someone posted a patch that did the trick. I have no idea who made the patch so I can't give credit.
It's attached, hope it works. Jeff Seeman Technical Instructor ------------------------------------------------------------------- **** FreeBSD-Advocate ----------------------- [EMAIL PROTECTED] **** ------------------------------------------------------------------- On Mon, 18 Nov 2002, Willy Offermans wrote: > Dear FreeBSD friends, > > I have bought a nice laptop computer (Gericom Masterpiece 25340 XL). > It has an ethernet card inside, based on SiS 900 chip. > During boot, FreeBSD can detect the card, but cannot assign an MAC > address, nor initializing the card. I receive following messages: > > .... > sis0: <SiS 900 10/100BaseTX> port 0xf800-0xf8ff mem 0xe8005000-0xe8005fff irq 4 at >device 4.0 on pci0 > sis0: Ethernet address: ff:ff:ff:ff:ff:ff > sis0: MII without any PHY! > device_probe_and_attach: sis0 attach returned 6 > .... > > Does anybody know to solve this problem? > > -- > Met vriendelijke groeten, > With kind regards, > > Willy > > ************************************* > W.K. Offermans > Eindhoven University of Technology > Department of Chemical Engineering > Laboratory of Catalysis (SKA) > building ST-W 4.27, PO Box 513 > 5600 MB Eindhoven, Netherlands > Tel: 0(031) 40 247 37 81 > Fax: 0(031) 40 247 50 32 > Home: 0(031) 45 544 49 99 > e-mail: [EMAIL PROTECTED] > http://www.catalysis.nl > > If you are bored playing with Bill Gates' toy, start to work with a real >operating system > Feel free, feel FreeBSD .... (www.FreeBSD.org) > > > To Unsubscribe: send mail to [EMAIL PROTECTED] > with "unsubscribe freebsd-stable" in the body of the message >
*** /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); }