aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/pcmcia/3c574_cs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/pcmcia/3c574_cs.c')
-rw-r--r--drivers/net/pcmcia/3c574_cs.c47
1 files changed, 21 insertions, 26 deletions
diff --git a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c
index 3b78a3819bb3..7112fd5e0e1b 100644
--- a/drivers/net/pcmcia/3c574_cs.c
+++ b/drivers/net/pcmcia/3c574_cs.c
@@ -208,7 +208,6 @@ enum Window4 { /* Window 4: Xcvr/media bits. */
208struct el3_private { 208struct el3_private {
209 struct pcmcia_device *p_dev; 209 struct pcmcia_device *p_dev;
210 dev_node_t node; 210 dev_node_t node;
211 struct net_device_stats stats;
212 u16 advertising, partner; /* NWay media advertisement */ 211 u16 advertising, partner; /* NWay media advertisement */
213 unsigned char phys; /* MII device address */ 212 unsigned char phys; /* MII device address */
214 unsigned int autoselect:1, default_media:3; /* Read from the EEPROM/Wn3_Config. */ 213 unsigned int autoselect:1, default_media:3; /* Read from the EEPROM/Wn3_Config. */
@@ -741,12 +740,11 @@ static int el3_open(struct net_device *dev)
741 740
742static void el3_tx_timeout(struct net_device *dev) 741static void el3_tx_timeout(struct net_device *dev)
743{ 742{
744 struct el3_private *lp = netdev_priv(dev);
745 unsigned int ioaddr = dev->base_addr; 743 unsigned int ioaddr = dev->base_addr;
746 744
747 printk(KERN_NOTICE "%s: Transmit timed out!\n", dev->name); 745 printk(KERN_NOTICE "%s: Transmit timed out!\n", dev->name);
748 dump_status(dev); 746 dump_status(dev);
749 lp->stats.tx_errors++; 747 dev->stats.tx_errors++;
750 dev->trans_start = jiffies; 748 dev->trans_start = jiffies;
751 /* Issue TX_RESET and TX_START commands. */ 749 /* Issue TX_RESET and TX_START commands. */
752 tc574_wait_for_completion(dev, TxReset); 750 tc574_wait_for_completion(dev, TxReset);
@@ -756,7 +754,6 @@ static void el3_tx_timeout(struct net_device *dev)
756 754
757static void pop_tx_status(struct net_device *dev) 755static void pop_tx_status(struct net_device *dev)
758{ 756{
759 struct el3_private *lp = netdev_priv(dev);
760 unsigned int ioaddr = dev->base_addr; 757 unsigned int ioaddr = dev->base_addr;
761 int i; 758 int i;
762 759
@@ -772,7 +769,7 @@ static void pop_tx_status(struct net_device *dev)
772 DEBUG(1, "%s: transmit error: status 0x%02x\n", 769 DEBUG(1, "%s: transmit error: status 0x%02x\n",
773 dev->name, tx_status); 770 dev->name, tx_status);
774 outw(TxEnable, ioaddr + EL3_CMD); 771 outw(TxEnable, ioaddr + EL3_CMD);
775 lp->stats.tx_aborted_errors++; 772 dev->stats.tx_aborted_errors++;
776 } 773 }
777 outb(0x00, ioaddr + TxStatus); /* Pop the status stack. */ 774 outb(0x00, ioaddr + TxStatus); /* Pop the status stack. */
778 } 775 }
@@ -987,7 +984,7 @@ static struct net_device_stats *el3_get_stats(struct net_device *dev)
987 update_stats(dev); 984 update_stats(dev);
988 spin_unlock_irqrestore(&lp->window_lock, flags); 985 spin_unlock_irqrestore(&lp->window_lock, flags);
989 } 986 }
990 return &lp->stats; 987 return &dev->stats;
991} 988}
992 989
993/* Update statistics. 990/* Update statistics.
@@ -996,7 +993,6 @@ static struct net_device_stats *el3_get_stats(struct net_device *dev)
996 */ 993 */
997static void update_stats(struct net_device *dev) 994static void update_stats(struct net_device *dev)
998{ 995{
999 struct el3_private *lp = netdev_priv(dev);
1000 unsigned int ioaddr = dev->base_addr; 996 unsigned int ioaddr = dev->base_addr;
1001 u8 rx, tx, up; 997 u8 rx, tx, up;
1002 998
@@ -1008,15 +1004,15 @@ static void update_stats(struct net_device *dev)
1008 /* Unlike the 3c509 we need not turn off stats updates while reading. */ 1004 /* Unlike the 3c509 we need not turn off stats updates while reading. */
1009 /* Switch to the stats window, and read everything. */ 1005 /* Switch to the stats window, and read everything. */
1010 EL3WINDOW(6); 1006 EL3WINDOW(6);
1011 lp->stats.tx_carrier_errors += inb(ioaddr + 0); 1007 dev->stats.tx_carrier_errors += inb(ioaddr + 0);
1012 lp->stats.tx_heartbeat_errors += inb(ioaddr + 1); 1008 dev->stats.tx_heartbeat_errors += inb(ioaddr + 1);
1013 /* Multiple collisions. */ inb(ioaddr + 2); 1009 /* Multiple collisions. */ inb(ioaddr + 2);
1014 lp->stats.collisions += inb(ioaddr + 3); 1010 dev->stats.collisions += inb(ioaddr + 3);
1015 lp->stats.tx_window_errors += inb(ioaddr + 4); 1011 dev->stats.tx_window_errors += inb(ioaddr + 4);
1016 lp->stats.rx_fifo_errors += inb(ioaddr + 5); 1012 dev->stats.rx_fifo_errors += inb(ioaddr + 5);
1017 lp->stats.tx_packets += inb(ioaddr + 6); 1013 dev->stats.tx_packets += inb(ioaddr + 6);
1018 up = inb(ioaddr + 9); 1014 up = inb(ioaddr + 9);
1019 lp->stats.tx_packets += (up&0x30) << 4; 1015 dev->stats.tx_packets += (up&0x30) << 4;
1020 /* Rx packets */ inb(ioaddr + 7); 1016 /* Rx packets */ inb(ioaddr + 7);
1021 /* Tx deferrals */ inb(ioaddr + 8); 1017 /* Tx deferrals */ inb(ioaddr + 8);
1022 rx = inw(ioaddr + 10); 1018 rx = inw(ioaddr + 10);
@@ -1026,14 +1022,13 @@ static void update_stats(struct net_device *dev)
1026 /* BadSSD */ inb(ioaddr + 12); 1022 /* BadSSD */ inb(ioaddr + 12);
1027 up = inb(ioaddr + 13); 1023 up = inb(ioaddr + 13);
1028 1024
1029 lp->stats.tx_bytes += tx + ((up & 0xf0) << 12); 1025 dev->stats.tx_bytes += tx + ((up & 0xf0) << 12);
1030 1026
1031 EL3WINDOW(1); 1027 EL3WINDOW(1);
1032} 1028}
1033 1029
1034static int el3_rx(struct net_device *dev, int worklimit) 1030static int el3_rx(struct net_device *dev, int worklimit)
1035{ 1031{
1036 struct el3_private *lp = netdev_priv(dev);
1037 unsigned int ioaddr = dev->base_addr; 1032 unsigned int ioaddr = dev->base_addr;
1038 short rx_status; 1033 short rx_status;
1039 1034
@@ -1043,14 +1038,14 @@ static int el3_rx(struct net_device *dev, int worklimit)
1043 (--worklimit >= 0)) { 1038 (--worklimit >= 0)) {
1044 if (rx_status & 0x4000) { /* Error, update stats. */ 1039 if (rx_status & 0x4000) { /* Error, update stats. */
1045 short error = rx_status & 0x3800; 1040 short error = rx_status & 0x3800;
1046 lp->stats.rx_errors++; 1041 dev->stats.rx_errors++;
1047 switch (error) { 1042 switch (error) {
1048 case 0x0000: lp->stats.rx_over_errors++; break; 1043 case 0x0000: dev->stats.rx_over_errors++; break;
1049 case 0x0800: lp->stats.rx_length_errors++; break; 1044 case 0x0800: dev->stats.rx_length_errors++; break;
1050 case 0x1000: lp->stats.rx_frame_errors++; break; 1045 case 0x1000: dev->stats.rx_frame_errors++; break;
1051 case 0x1800: lp->stats.rx_length_errors++; break; 1046 case 0x1800: dev->stats.rx_length_errors++; break;
1052 case 0x2000: lp->stats.rx_frame_errors++; break; 1047 case 0x2000: dev->stats.rx_frame_errors++; break;
1053 case 0x2800: lp->stats.rx_crc_errors++; break; 1048 case 0x2800: dev->stats.rx_crc_errors++; break;
1054 } 1049 }
1055 } else { 1050 } else {
1056 short pkt_len = rx_status & 0x7ff; 1051 short pkt_len = rx_status & 0x7ff;
@@ -1067,12 +1062,12 @@ static int el3_rx(struct net_device *dev, int worklimit)
1067 skb->protocol = eth_type_trans(skb, dev); 1062 skb->protocol = eth_type_trans(skb, dev);
1068 netif_rx(skb); 1063 netif_rx(skb);
1069 dev->last_rx = jiffies; 1064 dev->last_rx = jiffies;
1070 lp->stats.rx_packets++; 1065 dev->stats.rx_packets++;
1071 lp->stats.rx_bytes += pkt_len; 1066 dev->stats.rx_bytes += pkt_len;
1072 } else { 1067 } else {
1073 DEBUG(1, "%s: couldn't allocate a sk_buff of" 1068 DEBUG(1, "%s: couldn't allocate a sk_buff of"
1074 " size %d.\n", dev->name, pkt_len); 1069 " size %d.\n", dev->name, pkt_len);
1075 lp->stats.rx_dropped++; 1070 dev->stats.rx_dropped++;
1076 } 1071 }
1077 } 1072 }
1078 tc574_wait_for_completion(dev, RxDiscard); 1073 tc574_wait_for_completion(dev, RxDiscard);