Index: gpxe_study/kernel_2.6.20_src/sis900.c
===================================================================
--- gpxe_study/kernel_2.6.20_src/sis900.c	(revision 4)
+++ gpxe_study/kernel_2.6.20_src/sis900.c	(revision 5)
@@ -974,8 +974,8 @@
     /* Equalizer workaround Rule */
     sis630_set_eq(net_dev, sis_priv->chipset_rev);
-    ret = request_irq(net_dev->irq, &sis900_interrupt, IRQF_SHARED,
-						net_dev->name, net_dev);
+    ret = request_irq(net_dev->irq, &sis900_interrupt, IRQF_SHARED, net_dev->name, net_dev);
     if (ret)
         return ret;
+
 
     sis900_init_rxfilter(net_dev);
@@ -1094,7 +1094,7 @@
 {
     u32 rfcrSave;
-	struct sis900_private *sis_priv = net_dev->priv;
-	long ioaddr = net_dev->base_addr;
-	u32 i;
+    struct sis900_private *sis_priv = net_dev->priv;
+    long ioaddr = net_dev->base_addr;
+    u32 i;
     rfcrSave = inl(rfcr + ioaddr);
 
@@ -1130,25 +1130,22 @@
 sis900_init_tx_ring(struct net_device *net_dev)
 {
-	struct sis900_private *sis_priv = net_dev->priv;
-	long ioaddr = net_dev->base_addr;
-	int i;
-
-	sis_priv->tx_full = 0;
-	sis_priv->dirty_tx = sis_priv->cur_tx = 0;
-
-	for (i = 0; i < NUM_TX_DESC; i++) {
-		sis_priv->tx_skbuff[i] = NULL;
-
-		sis_priv->tx_ring[i].link = sis_priv->tx_ring_dma +
-			((i+1)%NUM_TX_DESC)*sizeof(BufferDesc);
-		sis_priv->tx_ring[i].cmdsts = 0;
+    struct sis900_private *sis_priv = net_dev->priv;
+    long ioaddr = net_dev->base_addr;
+    int i;
+    sis_priv->tx_full = 0;
+    sis_priv->dirty_tx = sis_priv->cur_tx = 0;
+    for (i = 0; i < NUM_TX_DESC; i++) {
+        sis_priv->tx_skbuff[i] = NULL;
+	sis_priv->tx_ring[i].link = sis_priv->tx_ring_dma +
+		((i+1)%NUM_TX_DESC)*sizeof(BufferDesc);
+	sis_priv->tx_ring[i].cmdsts = 0;
 		sis_priv->tx_ring[i].bufptr = 0;
-	}
-
-	/* load Transmit Descriptor Register */
-	outl(sis_priv->tx_ring_dma, ioaddr + txdp);
-	if (netif_msg_hw(sis_priv))
-		printk(KERN_DEBUG "%s: TX descriptor register loaded with: %8.8x\n",
-		       net_dev->name, inl(ioaddr + txdp));
+    }
+
+    /* load Transmit Descriptor Register */
+    outl(sis_priv->tx_ring_dma, ioaddr + txdp);
+    if (netif_msg_hw(sis_priv))
+        printk(KERN_DEBUG "%s: TX descriptor register loaded with: %8.8x\n",
+              net_dev->name, inl(ioaddr + txdp));
 }
 
@@ -1206,4 +1203,112 @@
 		printk(KERN_DEBUG "%s: RX descriptor register loaded with: %8.8x\n",
 		       net_dev->name, inl(ioaddr + rxdp));
+}
+
+/**
+ *	set_rx_mode - Set SiS900 receive mode
+ *	@net_dev: the net device to be set
+ *
+ *	Set SiS900 receive mode for promiscuous, multicast, or broadcast mode.
+ *	And set the appropriate multicast filter.
+ *	Multicast hash table changes from 128 to 256 bits for 635M/B & 900B0.
+ */
+
+static void set_rx_mode(struct net_device *net_dev)
+{
+    int i, table_entries;
+    u32 rx_mode; 
+    long ioaddr = net_dev->base_addr;
+    struct sis900_private * sis_priv = net_dev->priv;
+    u16 mc_filter[16] = {0};	/* 256/128 bits multicast hash table */
+    /* 635 Hash Table entries = 256(2^16) */
+    	
+    if((sis_priv->chipset_rev >= SIS635A_900_REV) || (sis_priv->chipset_rev == SIS900B_900_REV))
+	table_entries = 16;
+    else
+	table_entries = 8;
+    if (net_dev->flags & IFF_PROMISC) {
+    /* Accept any kinds of packets */
+        rx_mode = RFPromiscuous;
+        for (i = 0; i < table_entries; i++)
+	    mc_filter[i] = 0xffff;
+    } else if ((net_dev->mc_count > multicast_filter_limit) || (net_dev->flags & IFF_ALLMULTI)) {
+
+    /* too many multicast addresses or accept all multicast packet */
+    rx_mode = RFAAB | RFAAM;
+    for (i = 0; i < table_entries; i++)
+		mc_filter[i] = 0xffff;
+					
+    } else {
+	/* Accept Broadcast packet, destination address matchs our
+	 * MAC address, use Receive Filter to reject unwanted MCAST
+	 * packets */
+	struct dev_mc_list *mclist;
+	rx_mode = RFAAB;
+	for (i = 0, mclist = net_dev->mc_list;
+		mclist && i < net_dev->mc_count;
+		i++, mclist = mclist->next) {
+		unsigned int bit_nr = sis900_mcast_bitnr(mclist->dmi_addr, sis_priv->chipset_rev);
+		mc_filter[bit_nr >> 4] |= (1 << (bit_nr & 0xf));
+        }
+    }
+    /* update Multicast Hash Table in Receive Filter */
+    for (i = 0; i < table_entries; i++) {
+        /* why plus 0x04 ??, That makes the correct value for hash table. */
+        outl((u32)(0x00000004+i) << RFADDR_shift, ioaddr + rfcr);
+        outl(mc_filter[i], ioaddr + rfdr);
+    }
+
+    outl(RFEN | rx_mode, ioaddr + rfcr);
+
+    /* sis900 is capable of looping back packets at MAC level for
+     * debugging purpose */
+    if (net_dev->flags & IFF_LOOPBACK) {
+	u32 cr_saved;
+	/* We must disable Tx/Rx before setting loopback mode */
+	cr_saved = inl(ioaddr + cr);
+	outl(cr_saved | TxDIS | RxDIS, ioaddr + cr);
+	/* enable loopback */
+	outl(inl(ioaddr + txcfg) | TxMLB, ioaddr + txcfg);
+	outl(inl(ioaddr + rxcfg) | RxATX, ioaddr + rxcfg);
+	/* restore cr */
+	outl(cr_saved, ioaddr + cr);
+    }
+
+    return;
+}
+
+
+/* Function: sis900_check_mode
+ *
+ * - check the media mode for sis900
+ *	@net_dev: the net device to be checked
+ *	@mii_phy: the mii phy
+ *
+ *	Older driver gets the media mode from mii status output
+ *	register. Now we set our media capability and auto-negotiate
+ *	to get the upper bound of speed and duplex between two ends.
+ *	If the types of mii phy is HOME, it doesn't need to auto-negotiate
+ *	and autong_complete should be set to 1.
+ * Returns:   void.
+ */
+
+static void
+sis900_check_mode(struct net_device *net_dev, struct mii_phy *mii_phy)
+{
+    int speed, duplex;
+    struct sis900_private *sis_priv = net_dev->priv;
+    long ioaddr = net_dev->base_addr;
+
+	if (mii_phy->phy_types == LAN) {
+		outl(~EXD & inl(ioaddr + cfg), ioaddr + cfg);
+		sis900_set_capability(net_dev , mii_phy);
+		sis900_auto_negotiate(net_dev, sis_priv->cur_phy);
+	} else {
+		outl(EXD | inl(ioaddr + cfg), ioaddr + cfg);
+		speed = HW_SPEED_HOME;
+		duplex = FDX_CAPABLE_HALF_SELECTED;
+		sis900_set_mode(ioaddr, speed, duplex);
+		sis_priv->autong_complete = 1;
+	}
 }
 
@@ -1299,4 +1404,5 @@
 }
 
+
 /**
  *	sis900_timer - sis900 timer routine
@@ -1366,34 +1472,4 @@
 }
 
-/**
- *	sis900_check_mode - check the media mode for sis900
- *	@net_dev: the net device to be checked
- *	@mii_phy: the mii phy
- *
- *	Older driver gets the media mode from mii status output
- *	register. Now we set our media capability and auto-negotiate
- *	to get the upper bound of speed and duplex between two ends.
- *	If the types of mii phy is HOME, it doesn't need to auto-negotiate
- *	and autong_complete should be set to 1.
- */
-
-static void sis900_check_mode(struct net_device *net_dev, struct mii_phy *mii_phy)
-{
-	struct sis900_private *sis_priv = net_dev->priv;
-	long ioaddr = net_dev->base_addr;
-	int speed, duplex;
-
-	if (mii_phy->phy_types == LAN) {
-		outl(~EXD & inl(ioaddr + cfg), ioaddr + cfg);
-		sis900_set_capability(net_dev , mii_phy);
-		sis900_auto_negotiate(net_dev, sis_priv->cur_phy);
-	} else {
-		outl(EXD | inl(ioaddr + cfg), ioaddr + cfg);
-		speed = HW_SPEED_HOME;
-		duplex = FDX_CAPABLE_HALF_SELECTED;
-		sis900_set_mode(ioaddr, speed, duplex);
-		sis_priv->autong_complete = 1;
-	}
-}
 
 /**
@@ -2315,80 +2391,4 @@
 }
 
-/**
- *	set_rx_mode - Set SiS900 receive mode
- *	@net_dev: the net device to be set
- *
- *	Set SiS900 receive mode for promiscuous, multicast, or broadcast mode.
- *	And set the appropriate multicast filter.
- *	Multicast hash table changes from 128 to 256 bits for 635M/B & 900B0.
- */
-
-static void set_rx_mode(struct net_device *net_dev)
-{
-	long ioaddr = net_dev->base_addr;
-	struct sis900_private * sis_priv = net_dev->priv;
-	u16 mc_filter[16] = {0};	/* 256/128 bits multicast hash table */
-	int i, table_entries;
-	u32 rx_mode;
-
-	/* 635 Hash Table entries = 256(2^16) */
-	if((sis_priv->chipset_rev >= SIS635A_900_REV) ||
-			(sis_priv->chipset_rev == SIS900B_900_REV))
-		table_entries = 16;
-	else
-		table_entries = 8;
-
-	if (net_dev->flags & IFF_PROMISC) {
-		/* Accept any kinds of packets */
-		rx_mode = RFPromiscuous;
-		for (i = 0; i < table_entries; i++)
-			mc_filter[i] = 0xffff;
-	} else if ((net_dev->mc_count > multicast_filter_limit) ||
-		   (net_dev->flags & IFF_ALLMULTI)) {
-		/* too many multicast addresses or accept all multicast packet */
-		rx_mode = RFAAB | RFAAM;
-		for (i = 0; i < table_entries; i++)
-			mc_filter[i] = 0xffff;
-	} else {
-		/* Accept Broadcast packet, destination address matchs our
-		 * MAC address, use Receive Filter to reject unwanted MCAST
-		 * packets */
-		struct dev_mc_list *mclist;
-		rx_mode = RFAAB;
-		for (i = 0, mclist = net_dev->mc_list;
-			mclist && i < net_dev->mc_count;
-			i++, mclist = mclist->next) {
-			unsigned int bit_nr =
-				sis900_mcast_bitnr(mclist->dmi_addr, sis_priv->chipset_rev);
-			mc_filter[bit_nr >> 4] |= (1 << (bit_nr & 0xf));
-		}
-	}
-
-	/* update Multicast Hash Table in Receive Filter */
-	for (i = 0; i < table_entries; i++) {
-                /* why plus 0x04 ??, That makes the correct value for hash table. */
-		outl((u32)(0x00000004+i) << RFADDR_shift, ioaddr + rfcr);
-		outl(mc_filter[i], ioaddr + rfdr);
-	}
-
-	outl(RFEN | rx_mode, ioaddr + rfcr);
-
-	/* sis900 is capable of looping back packets at MAC level for
-	 * debugging purpose */
-	if (net_dev->flags & IFF_LOOPBACK) {
-		u32 cr_saved;
-		/* We must disable Tx/Rx before setting loopback mode */
-		cr_saved = inl(ioaddr + cr);
-		outl(cr_saved | TxDIS | RxDIS, ioaddr + cr);
-		/* enable loopback */
-		outl(inl(ioaddr + txcfg) | TxMLB, ioaddr + txcfg);
-		outl(inl(ioaddr + rxcfg) | RxATX, ioaddr + rxcfg);
-		/* restore cr */
-		outl(cr_saved, ioaddr + cr);
-	}
-
-	return;
-}
-
 
 /**
