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);
  }

Reply via email to