linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / net / au1000_eth.c
index 14dbad1..cd0b1dc 100644 (file)
@@ -52,7 +52,6 @@
 #include <linux/mii.h>
 #include <linux/skbuff.h>
 #include <linux/delay.h>
-#include <linux/crc32.h>
 #include <asm/mipsregs.h>
 #include <asm/irq.h>
 #include <asm/io.h>
@@ -91,6 +90,8 @@ static void au1000_tx_timeout(struct net_device *);
 static int au1000_set_config(struct net_device *dev, struct ifmap *map);
 static void set_rx_mode(struct net_device *);
 static struct net_device_stats *au1000_get_stats(struct net_device *);
+static inline void update_tx_stats(struct net_device *, u32, u32);
+static inline void update_rx_stats(struct net_device *, u32);
 static void au1000_timer(unsigned long);
 static int au1000_ioctl(struct net_device *, struct ifreq *, int);
 static int mdio_read(struct net_device *, int, int);
@@ -1824,11 +1825,16 @@ static void __exit au1000_cleanup_module(void)
        }
 }
 
-static void update_tx_stats(struct net_device *dev, u32 status)
+
+static inline void 
+update_tx_stats(struct net_device *dev, u32 status, u32 pkt_len)
 {
        struct au1000_private *aup = (struct au1000_private *) dev->priv;
        struct net_device_stats *ps = &aup->stats;
 
+       ps->tx_packets++;
+       ps->tx_bytes += pkt_len;
+
        if (status & TX_FRAME_ABORTED) {
                if (dev->if_port == IF_PORT_100BASEFX) {
                        if (status & (TX_JAB_TIMEOUT | TX_UNDERRUN)) {
@@ -1861,7 +1867,7 @@ static void au1000_tx_ack(struct net_device *dev)
        ptxd = aup->tx_dma_ring[aup->tx_tail];
 
        while (ptxd->buff_stat & TX_T_DONE) {
-               update_tx_stats(dev, ptxd->status);
+               update_tx_stats(dev, ptxd->status, ptxd->len & 0x3ff);
                ptxd->buff_stat &= ~TX_T_DONE;
                ptxd->len = 0;
                au_sync();
@@ -1883,7 +1889,6 @@ static void au1000_tx_ack(struct net_device *dev)
 static int au1000_tx(struct sk_buff *skb, struct net_device *dev)
 {
        struct au1000_private *aup = (struct au1000_private *) dev->priv;
-       struct net_device_stats *ps = &aup->stats;
        volatile tx_dma_t *ptxd;
        u32 buff_stat;
        db_dest_t *pDB;
@@ -1903,7 +1908,7 @@ static int au1000_tx(struct sk_buff *skb, struct net_device *dev)
                return 1;
        }
        else if (buff_stat & TX_T_DONE) {
-               update_tx_stats(dev, ptxd->status);
+               update_tx_stats(dev, ptxd->status, ptxd->len & 0x3ff);
                ptxd->len = 0;
        }
 
@@ -1923,9 +1928,6 @@ static int au1000_tx(struct sk_buff *skb, struct net_device *dev)
        else
                ptxd->len = skb->len;
 
-       ps->tx_packets++;
-       ps->tx_bytes += ptxd->len;
-
        ptxd->buff_stat = pDB->dma_addr | TX_DMA_ENABLE;
        au_sync();
        dev_kfree_skb(skb);
@@ -1934,6 +1936,7 @@ static int au1000_tx(struct sk_buff *skb, struct net_device *dev)
        return 0;
 }
 
+
 static inline void update_rx_stats(struct net_device *dev, u32 status)
 {
        struct au1000_private *aup = (struct au1000_private *) dev->priv;
@@ -2071,6 +2074,23 @@ static void au1000_tx_timeout(struct net_device *dev)
        netif_wake_queue(dev);
 }
 
+
+static unsigned const ethernet_polynomial = 0x04c11db7U;
+static inline u32 ether_crc(int length, unsigned char *data)
+{
+    int crc = -1;
+
+    while(--length >= 0) {
+               unsigned char current_octet = *data++;
+               int bit;
+               for (bit = 0; bit < 8; bit++, current_octet >>= 1)
+                       crc = (crc << 1) ^
+                               ((crc < 0) ^ (current_octet & 1) ? 
+                                ethernet_polynomial : 0);
+    }
+    return crc;
+}
+
 static void set_rx_mode(struct net_device *dev)
 {
        struct au1000_private *aup = (struct au1000_private *) dev->priv;