The sis900 netboot code does not work on my Asus TUSI board, while the
Linux kernel does.  The code appears to originate from the same source,
so I back-ported what was necessary to get my card working.  Attached is
the unified diff.  Good luck!

Felix
diff -ur grub-0.92/ChangeLog grub-0.92-fefe/ChangeLog
--- grub-0.92/ChangeLog Mon Apr 29 20:51:03 2002
+++ grub-0.92-fefe/ChangeLog    Sat Jun  8 04:15:20 2002
@@ -1,3 +1,8 @@
+2002-06-04  Felix von Leitner <[EMAIL PROTECTED]>
+
+       * netboot/sis900.c: back-port support for SIS630ET_900_REV from
+         Linux 2.4.18 sources (found on my Asus TUSI mainboard).
+
 2002-04-30  Yoshinori K. Okuji  <[EMAIL PROTECTED]>
 
        * stage2/boot.c (load_image): For Linux, don't check if the
diff -ur grub-0.92/netboot/sis900.c grub-0.92-fefe/netboot/sis900.c
--- grub-0.92/netboot/sis900.c  Wed Jan  2 22:56:40 2002
+++ grub-0.92-fefe/netboot/sis900.c     Sat Jun  8 04:11:17 2002
@@ -201,6 +201,31 @@
 
        return 1;
 }
+
+static int sis635_get_mac_addr(struct pci_device * pci_dev, struct nic *nic)
+{
+    u32 rfcrSave;
+    u32 i;
+
+    rfcrSave = inl(rfcr + ioaddr);
+
+    outl(rfcrSave | RELOAD, ioaddr + cr);
+    outl(0, ioaddr + cr);
+
+    /* disable packet filtering before setting filter */
+    outl(rfcrSave & ~RFEN, rfcr + ioaddr);
+
+    /* load MAC addr to filter data register */
+    for (i = 0 ; i < 3 ; i++) {
+           outl((i << RFADDR_shift), ioaddr + rfcr);
+           *( ((u16 *)nic->node_addr) + i) = inw(ioaddr + rfdr);
+    }
+
+    /* enable packet filitering */
+    outl(rfcrSave | RFEN, rfcr + ioaddr);
+
+    return 1;
+}
 
 /* 
  * Function: sis900_probe
@@ -244,6 +269,8 @@
        ret = sis630e_get_mac_addr(pci, nic);
     else if (revision == SIS630S_900_REV)
         ret = sis630e_get_mac_addr(pci, nic);
+    else if ((revision > 0x81) && (revision <= 0x90))
+        ret = sis635_get_mac_addr(pci, nic);
     else
         ret = sis900_get_mac_addr(pci, nic);
 
@@ -253,6 +280,9 @@
         return NULL;
     }
 
+    if (revision == SIS630ET_900_REV)
+      outl(ACCESSMODE | inl(ioaddr + cr), ioaddr + cr);
+
     printf("\nsis900_probe: MAC addr %! at ioaddr %#hX\n",
            nic->node_addr, ioaddr);
     printf("sis900_probe: Vendor:%#hX Device:%#hX\n", vendor, dev_id);
@@ -265,7 +295,8 @@
         u16 mii_status;
         u16 phy_id0, phy_id1;
                 
-        mii_status = sis900_mdio_read(phy_addr, MII_STATUS);
+       for (i=0; i<2; ++i)
+         mii_status = sis900_mdio_read(phy_addr, MII_STATUS);
         if (mii_status == 0xffff || mii_status == 0x0000)
             /* the mii is not accessable, try next one */
             continue;
@@ -432,6 +463,7 @@
         outl(MDC, mdio_addr);
         sis900_mdio_delay();
     }
+    outl(0,mdio_addr);
     return retval;
 }
 
@@ -471,6 +503,7 @@
         outb(MDC, mdio_addr);
         sis900_mdio_delay();
     }
+    outl(0,mdio_addr);
     return;
 }
 
diff -ur grub-0.92/netboot/sis900.h grub-0.92-fefe/netboot/sis900.h
--- grub-0.92/netboot/sis900.h  Wed Jan  2 22:56:40 2002
+++ grub-0.92-fefe/netboot/sis900.h     Sat Jun  8 03:51:27 2002
@@ -39,6 +39,8 @@
 
 /* Symbolic names for bits in various registers */
 enum sis900_command_register_bits {
+    RELOAD  = 0x00000400,
+    ACCESSMODE = 0x00000200,
     RESET   = 0x00000100, 
     SWI     = 0x00000080, 
     RxRESET = 0x00000020,
@@ -320,7 +322,9 @@
 
 enum sis900_revision_id {
        SIS630A_900_REV = 0x80,         SIS630E_900_REV = 0x81,
-       SIS630S_900_REV = 0x82,         SIS630EA1_900_REV = 0x83
+       SIS630S_900_REV = 0x82,         SIS630EA1_900_REV = 0x83,
+       SIS630ET_900_REV = 0x84,        SIS635A_900_REV = 0x90,
+       SIS900B_900_REV = 0x03
 };
 
 enum sis630_revision_id {

Reply via email to