diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/net/hamachi.c | 63 |
1 files changed, 37 insertions, 26 deletions
diff --git a/drivers/net/hamachi.c b/drivers/net/hamachi.c index 61f2b1cfcd46..49aac7027fbb 100644 --- a/drivers/net/hamachi.c +++ b/drivers/net/hamachi.c | |||
| @@ -492,7 +492,6 @@ struct hamachi_private { | |||
| 492 | struct sk_buff* tx_skbuff[TX_RING_SIZE]; | 492 | struct sk_buff* tx_skbuff[TX_RING_SIZE]; |
| 493 | dma_addr_t tx_ring_dma; | 493 | dma_addr_t tx_ring_dma; |
| 494 | dma_addr_t rx_ring_dma; | 494 | dma_addr_t rx_ring_dma; |
| 495 | struct net_device_stats stats; | ||
| 496 | struct timer_list timer; /* Media selection timer. */ | 495 | struct timer_list timer; /* Media selection timer. */ |
| 497 | /* Frequently used and paired value: keep adjacent for cache effect. */ | 496 | /* Frequently used and paired value: keep adjacent for cache effect. */ |
| 498 | spinlock_t lock; | 497 | spinlock_t lock; |
| @@ -1036,7 +1035,7 @@ static inline int hamachi_tx(struct net_device *dev) | |||
| 1036 | if (entry >= TX_RING_SIZE-1) | 1035 | if (entry >= TX_RING_SIZE-1) |
| 1037 | hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= | 1036 | hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= |
| 1038 | cpu_to_le32(DescEndRing); | 1037 | cpu_to_le32(DescEndRing); |
| 1039 | hmp->stats.tx_packets++; | 1038 | dev->stats.tx_packets++; |
| 1040 | } | 1039 | } |
| 1041 | 1040 | ||
| 1042 | return 0; | 1041 | return 0; |
| @@ -1167,7 +1166,7 @@ static void hamachi_tx_timeout(struct net_device *dev) | |||
| 1167 | 1166 | ||
| 1168 | /* Trigger an immediate transmit demand. */ | 1167 | /* Trigger an immediate transmit demand. */ |
| 1169 | dev->trans_start = jiffies; /* prevent tx timeout */ | 1168 | dev->trans_start = jiffies; /* prevent tx timeout */ |
| 1170 | hmp->stats.tx_errors++; | 1169 | dev->stats.tx_errors++; |
| 1171 | 1170 | ||
| 1172 | /* Restart the chip's Tx/Rx processes . */ | 1171 | /* Restart the chip's Tx/Rx processes . */ |
| 1173 | writew(0x0002, ioaddr + TxCmd); /* STOP Tx */ | 1172 | writew(0x0002, ioaddr + TxCmd); /* STOP Tx */ |
| @@ -1434,7 +1433,7 @@ static irqreturn_t hamachi_interrupt(int irq, void *dev_instance) | |||
| 1434 | if (entry >= TX_RING_SIZE-1) | 1433 | if (entry >= TX_RING_SIZE-1) |
| 1435 | hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= | 1434 | hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= |
| 1436 | cpu_to_le32(DescEndRing); | 1435 | cpu_to_le32(DescEndRing); |
| 1437 | hmp->stats.tx_packets++; | 1436 | dev->stats.tx_packets++; |
| 1438 | } | 1437 | } |
| 1439 | if (hmp->cur_tx - hmp->dirty_tx < TX_RING_SIZE - 4){ | 1438 | if (hmp->cur_tx - hmp->dirty_tx < TX_RING_SIZE - 4){ |
| 1440 | /* The ring is no longer full */ | 1439 | /* The ring is no longer full */ |
| @@ -1525,18 +1524,22 @@ static int hamachi_rx(struct net_device *dev) | |||
| 1525 | le32_to_cpu(hmp->rx_ring[(hmp->cur_rx+1) % RX_RING_SIZE].status_n_length) & 0xffff0000, | 1524 | le32_to_cpu(hmp->rx_ring[(hmp->cur_rx+1) % RX_RING_SIZE].status_n_length) & 0xffff0000, |
| 1526 | le32_to_cpu(hmp->rx_ring[(hmp->cur_rx+1) % RX_RING_SIZE].status_n_length) & 0x0000ffff, | 1525 | le32_to_cpu(hmp->rx_ring[(hmp->cur_rx+1) % RX_RING_SIZE].status_n_length) & 0x0000ffff, |
| 1527 | le32_to_cpu(hmp->rx_ring[(hmp->cur_rx-1) % RX_RING_SIZE].status_n_length)); | 1526 | le32_to_cpu(hmp->rx_ring[(hmp->cur_rx-1) % RX_RING_SIZE].status_n_length)); |
| 1528 | hmp->stats.rx_length_errors++; | 1527 | dev->stats.rx_length_errors++; |
| 1529 | } /* else Omit for prototype errata??? */ | 1528 | } /* else Omit for prototype errata??? */ |
| 1530 | if (frame_status & 0x00380000) { | 1529 | if (frame_status & 0x00380000) { |
| 1531 | /* There was an error. */ | 1530 | /* There was an error. */ |
| 1532 | if (hamachi_debug > 2) | 1531 | if (hamachi_debug > 2) |
| 1533 | printk(KERN_DEBUG " hamachi_rx() Rx error was %8.8x.\n", | 1532 | printk(KERN_DEBUG " hamachi_rx() Rx error was %8.8x.\n", |
| 1534 | frame_status); | 1533 | frame_status); |
| 1535 | hmp->stats.rx_errors++; | 1534 | dev->stats.rx_errors++; |
| 1536 | if (frame_status & 0x00600000) hmp->stats.rx_length_errors++; | 1535 | if (frame_status & 0x00600000) |
| 1537 | if (frame_status & 0x00080000) hmp->stats.rx_frame_errors++; | 1536 | dev->stats.rx_length_errors++; |
| 1538 | if (frame_status & 0x00100000) hmp->stats.rx_crc_errors++; | 1537 | if (frame_status & 0x00080000) |
| 1539 | if (frame_status < 0) hmp->stats.rx_dropped++; | 1538 | dev->stats.rx_frame_errors++; |
| 1539 | if (frame_status & 0x00100000) | ||
| 1540 | dev->stats.rx_crc_errors++; | ||
| 1541 | if (frame_status < 0) | ||
| 1542 | dev->stats.rx_dropped++; | ||
| 1540 | } else { | 1543 | } else { |
| 1541 | struct sk_buff *skb; | 1544 | struct sk_buff *skb; |
| 1542 | /* Omit CRC */ | 1545 | /* Omit CRC */ |
| @@ -1654,7 +1657,7 @@ static int hamachi_rx(struct net_device *dev) | |||
| 1654 | #endif /* RX_CHECKSUM */ | 1657 | #endif /* RX_CHECKSUM */ |
| 1655 | 1658 | ||
| 1656 | netif_rx(skb); | 1659 | netif_rx(skb); |
| 1657 | hmp->stats.rx_packets++; | 1660 | dev->stats.rx_packets++; |
| 1658 | } | 1661 | } |
| 1659 | entry = (++hmp->cur_rx) % RX_RING_SIZE; | 1662 | entry = (++hmp->cur_rx) % RX_RING_SIZE; |
| 1660 | } | 1663 | } |
| @@ -1724,9 +1727,9 @@ static void hamachi_error(struct net_device *dev, int intr_status) | |||
| 1724 | dev->name, intr_status); | 1727 | dev->name, intr_status); |
| 1725 | /* Hmmmmm, it's not clear how to recover from PCI faults. */ | 1728 | /* Hmmmmm, it's not clear how to recover from PCI faults. */ |
| 1726 | if (intr_status & (IntrTxPCIErr | IntrTxPCIFault)) | 1729 | if (intr_status & (IntrTxPCIErr | IntrTxPCIFault)) |
| 1727 | hmp->stats.tx_fifo_errors++; | 1730 | dev->stats.tx_fifo_errors++; |
| 1728 | if (intr_status & (IntrRxPCIErr | IntrRxPCIFault)) | 1731 | if (intr_status & (IntrRxPCIErr | IntrRxPCIFault)) |
| 1729 | hmp->stats.rx_fifo_errors++; | 1732 | dev->stats.rx_fifo_errors++; |
| 1730 | } | 1733 | } |
| 1731 | 1734 | ||
| 1732 | static int hamachi_close(struct net_device *dev) | 1735 | static int hamachi_close(struct net_device *dev) |
| @@ -1828,19 +1831,27 @@ static struct net_device_stats *hamachi_get_stats(struct net_device *dev) | |||
| 1828 | so I think I'll comment it out here and see if better things | 1831 | so I think I'll comment it out here and see if better things |
| 1829 | happen. | 1832 | happen. |
| 1830 | */ | 1833 | */ |
| 1831 | /* hmp->stats.tx_packets = readl(ioaddr + 0x000); */ | 1834 | /* dev->stats.tx_packets = readl(ioaddr + 0x000); */ |
| 1832 | 1835 | ||
| 1833 | hmp->stats.rx_bytes = readl(ioaddr + 0x330); /* Total Uni+Brd+Multi */ | 1836 | /* Total Uni+Brd+Multi */ |
| 1834 | hmp->stats.tx_bytes = readl(ioaddr + 0x3B0); /* Total Uni+Brd+Multi */ | 1837 | dev->stats.rx_bytes = readl(ioaddr + 0x330); |
| 1835 | hmp->stats.multicast = readl(ioaddr + 0x320); /* Multicast Rx */ | 1838 | /* Total Uni+Brd+Multi */ |
| 1836 | 1839 | dev->stats.tx_bytes = readl(ioaddr + 0x3B0); | |
| 1837 | hmp->stats.rx_length_errors = readl(ioaddr + 0x368); /* Over+Undersized */ | 1840 | /* Multicast Rx */ |
| 1838 | hmp->stats.rx_over_errors = readl(ioaddr + 0x35C); /* Jabber */ | 1841 | dev->stats.multicast = readl(ioaddr + 0x320); |
| 1839 | hmp->stats.rx_crc_errors = readl(ioaddr + 0x360); /* Jabber */ | 1842 | |
| 1840 | hmp->stats.rx_frame_errors = readl(ioaddr + 0x364); /* Symbol Errs */ | 1843 | /* Over+Undersized */ |
| 1841 | hmp->stats.rx_missed_errors = readl(ioaddr + 0x36C); /* Dropped */ | 1844 | dev->stats.rx_length_errors = readl(ioaddr + 0x368); |
| 1842 | 1845 | /* Jabber */ | |
| 1843 | return &hmp->stats; | 1846 | dev->stats.rx_over_errors = readl(ioaddr + 0x35C); |
| 1847 | /* Jabber */ | ||
| 1848 | dev->stats.rx_crc_errors = readl(ioaddr + 0x360); | ||
| 1849 | /* Symbol Errs */ | ||
| 1850 | dev->stats.rx_frame_errors = readl(ioaddr + 0x364); | ||
| 1851 | /* Dropped */ | ||
| 1852 | dev->stats.rx_missed_errors = readl(ioaddr + 0x36C); | ||
| 1853 | |||
| 1854 | return &dev->stats; | ||
| 1844 | } | 1855 | } |
| 1845 | 1856 | ||
| 1846 | static void set_rx_mode(struct net_device *dev) | 1857 | static void set_rx_mode(struct net_device *dev) |
