aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wan
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-07-20 20:43:29 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-20 20:43:29 -0400
commitdb6d8c7a4027b48d797b369a53f8470aaeed7063 (patch)
treee140c104a89abc2154e1f41a7db8ebecbb6fa0b4 /drivers/net/wan
parent3a533374283aea50eab3976d8a6d30532175f009 (diff)
parentfb65a7c091529bfffb1262515252c0d0f6241c5c (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (1232 commits) iucv: Fix bad merging. net_sched: Add size table for qdiscs net_sched: Add accessor function for packet length for qdiscs net_sched: Add qdisc_enqueue wrapper highmem: Export totalhigh_pages. ipv6 mcast: Omit redundant address family checks in ip6_mc_source(). net: Use standard structures for generic socket address structures. ipv6 netns: Make several "global" sysctl variables namespace aware. netns: Use net_eq() to compare net-namespaces for optimization. ipv6: remove unused macros from net/ipv6.h ipv6: remove unused parameter from ip6_ra_control tcp: fix kernel panic with listening_get_next tcp: Remove redundant checks when setting eff_sacks tcp: options clean up tcp: Fix MD5 signatures for non-linear skbs sctp: Update sctp global memory limit allocations. sctp: remove unnecessary byteshifting, calculate directly in big-endian sctp: Allow only 1 listening socket with SO_REUSEADDR sctp: Do not leak memory on multiple listen() calls sctp: Support ipv6only AF_INET6 sockets. ...
Diffstat (limited to 'drivers/net/wan')
-rw-r--r--drivers/net/wan/Kconfig3
-rw-r--r--drivers/net/wan/c101.c6
-rw-r--r--drivers/net/wan/dscc4.c22
-rw-r--r--drivers/net/wan/farsync.c70
-rw-r--r--drivers/net/wan/hd6457x.c33
-rw-r--r--drivers/net/wan/hdlc.c2
-rw-r--r--drivers/net/wan/hdlc_cisco.c4
-rw-r--r--drivers/net/wan/hdlc_fr.c54
-rw-r--r--drivers/net/wan/hdlc_raw_eth.c2
-rw-r--r--drivers/net/wan/hdlc_x25.c6
-rw-r--r--drivers/net/wan/pc300_drv.c71
-rw-r--r--drivers/net/wan/pc300_tty.c6
-rw-r--r--drivers/net/wan/wanxl.c26
13 files changed, 130 insertions, 175 deletions
diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig
index d5140aed7b79..846be60e7821 100644
--- a/drivers/net/wan/Kconfig
+++ b/drivers/net/wan/Kconfig
@@ -390,8 +390,7 @@ config WAN_ROUTER_DRIVERS
390 390
391 Select driver your card and remember to say Y to "Wan Router." 391 Select driver your card and remember to say Y to "Wan Router."
392 You will need the wan-tools package which is available from 392 You will need the wan-tools package which is available from
393 <ftp://ftp.sangoma.com/>. For more information read: 393 <ftp://ftp.sangoma.com/>.
394 <file:Documentation/networking/wan-router.txt>.
395 394
396 Note that the answer to this question won't directly affect the 395 Note that the answer to this question won't directly affect the
397 kernel except for how subordinate drivers may be built: 396 kernel except for how subordinate drivers may be built:
diff --git a/drivers/net/wan/c101.c b/drivers/net/wan/c101.c
index c2cc42f723d5..c8e563106a4a 100644
--- a/drivers/net/wan/c101.c
+++ b/drivers/net/wan/c101.c
@@ -133,9 +133,9 @@ static void sca_msci_intr(port_t *port)
133 sca_out(stat & (ST1_UDRN | ST1_CDCD), MSCI0_OFFSET + ST1, port); 133 sca_out(stat & (ST1_UDRN | ST1_CDCD), MSCI0_OFFSET + ST1, port);
134 134
135 if (stat & ST1_UDRN) { 135 if (stat & ST1_UDRN) {
136 struct net_device_stats *stats = hdlc_stats(port_to_dev(port)); 136 /* TX Underrun error detected */
137 stats->tx_errors++; /* TX Underrun error detected */ 137 port_to_dev(port)->stats.tx_errors++;
138 stats->tx_fifo_errors++; 138 port_to_dev(port)->stats.tx_fifo_errors++;
139 } 139 }
140 140
141 stat = sca_in(MSCI1_OFFSET + ST1, port); /* read MSCI1 ST1 status */ 141 stat = sca_in(MSCI1_OFFSET + ST1, port); /* read MSCI1 ST1 status */
diff --git a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c
index c6f26e28e376..50ef5b4efd6d 100644
--- a/drivers/net/wan/dscc4.c
+++ b/drivers/net/wan/dscc4.c
@@ -642,7 +642,6 @@ static inline void dscc4_rx_skb(struct dscc4_dev_priv *dpriv,
642 struct net_device *dev) 642 struct net_device *dev)
643{ 643{
644 struct RxFD *rx_fd = dpriv->rx_fd + dpriv->rx_current%RX_RING_SIZE; 644 struct RxFD *rx_fd = dpriv->rx_fd + dpriv->rx_current%RX_RING_SIZE;
645 struct net_device_stats *stats = hdlc_stats(dev);
646 struct pci_dev *pdev = dpriv->pci_priv->pdev; 645 struct pci_dev *pdev = dpriv->pci_priv->pdev;
647 struct sk_buff *skb; 646 struct sk_buff *skb;
648 int pkt_len; 647 int pkt_len;
@@ -656,8 +655,8 @@ static inline void dscc4_rx_skb(struct dscc4_dev_priv *dpriv,
656 pci_unmap_single(pdev, le32_to_cpu(rx_fd->data), 655 pci_unmap_single(pdev, le32_to_cpu(rx_fd->data),
657 RX_MAX(HDLC_MAX_MRU), PCI_DMA_FROMDEVICE); 656 RX_MAX(HDLC_MAX_MRU), PCI_DMA_FROMDEVICE);
658 if ((skb->data[--pkt_len] & FrameOk) == FrameOk) { 657 if ((skb->data[--pkt_len] & FrameOk) == FrameOk) {
659 stats->rx_packets++; 658 dev->stats.rx_packets++;
660 stats->rx_bytes += pkt_len; 659 dev->stats.rx_bytes += pkt_len;
661 skb_put(skb, pkt_len); 660 skb_put(skb, pkt_len);
662 if (netif_running(dev)) 661 if (netif_running(dev))
663 skb->protocol = hdlc_type_trans(skb, dev); 662 skb->protocol = hdlc_type_trans(skb, dev);
@@ -665,13 +664,13 @@ static inline void dscc4_rx_skb(struct dscc4_dev_priv *dpriv,
665 netif_rx(skb); 664 netif_rx(skb);
666 } else { 665 } else {
667 if (skb->data[pkt_len] & FrameRdo) 666 if (skb->data[pkt_len] & FrameRdo)
668 stats->rx_fifo_errors++; 667 dev->stats.rx_fifo_errors++;
669 else if (!(skb->data[pkt_len] | ~FrameCrc)) 668 else if (!(skb->data[pkt_len] | ~FrameCrc))
670 stats->rx_crc_errors++; 669 dev->stats.rx_crc_errors++;
671 else if (!(skb->data[pkt_len] | ~(FrameVfr | FrameRab))) 670 else if (!(skb->data[pkt_len] | ~(FrameVfr | FrameRab)))
672 stats->rx_length_errors++; 671 dev->stats.rx_length_errors++;
673 else 672 else
674 stats->rx_errors++; 673 dev->stats.rx_errors++;
675 dev_kfree_skb_irq(skb); 674 dev_kfree_skb_irq(skb);
676 } 675 }
677refill: 676refill:
@@ -1569,7 +1568,6 @@ try:
1569 1568
1570 if (state & SccEvt) { 1569 if (state & SccEvt) {
1571 if (state & Alls) { 1570 if (state & Alls) {
1572 struct net_device_stats *stats = hdlc_stats(dev);
1573 struct sk_buff *skb; 1571 struct sk_buff *skb;
1574 struct TxFD *tx_fd; 1572 struct TxFD *tx_fd;
1575 1573
@@ -1586,8 +1584,8 @@ try:
1586 pci_unmap_single(ppriv->pdev, le32_to_cpu(tx_fd->data), 1584 pci_unmap_single(ppriv->pdev, le32_to_cpu(tx_fd->data),
1587 skb->len, PCI_DMA_TODEVICE); 1585 skb->len, PCI_DMA_TODEVICE);
1588 if (tx_fd->state & FrameEnd) { 1586 if (tx_fd->state & FrameEnd) {
1589 stats->tx_packets++; 1587 dev->stats.tx_packets++;
1590 stats->tx_bytes += skb->len; 1588 dev->stats.tx_bytes += skb->len;
1591 } 1589 }
1592 dev_kfree_skb_irq(skb); 1590 dev_kfree_skb_irq(skb);
1593 dpriv->tx_skbuff[cur] = NULL; 1591 dpriv->tx_skbuff[cur] = NULL;
@@ -1698,7 +1696,7 @@ try:
1698 } 1696 }
1699 if (state & Err) { 1697 if (state & Err) {
1700 printk(KERN_INFO "%s: Tx ERR\n", dev->name); 1698 printk(KERN_INFO "%s: Tx ERR\n", dev->name);
1701 hdlc_stats(dev)->tx_errors++; 1699 dev->stats.tx_errors++;
1702 state &= ~Err; 1700 state &= ~Err;
1703 } 1701 }
1704 } 1702 }
@@ -1834,7 +1832,7 @@ try:
1834 if (!(rx_fd->state2 & DataComplete)) 1832 if (!(rx_fd->state2 & DataComplete))
1835 break; 1833 break;
1836 if (rx_fd->state2 & FrameAborted) { 1834 if (rx_fd->state2 & FrameAborted) {
1837 hdlc_stats(dev)->rx_over_errors++; 1835 dev->stats.rx_over_errors++;
1838 rx_fd->state1 |= Hold; 1836 rx_fd->state1 |= Hold;
1839 rx_fd->state2 = 0x00000000; 1837 rx_fd->state2 = 0x00000000;
1840 rx_fd->end = cpu_to_le32(0xbabeface); 1838 rx_fd->end = cpu_to_le32(0xbabeface);
diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c
index 547368e9633d..754f00809e3e 100644
--- a/drivers/net/wan/farsync.c
+++ b/drivers/net/wan/farsync.c
@@ -845,7 +845,6 @@ fst_tx_dma_complete(struct fst_card_info *card, struct fst_port_info *port,
845 int len, int txpos) 845 int len, int txpos)
846{ 846{
847 struct net_device *dev = port_to_dev(port); 847 struct net_device *dev = port_to_dev(port);
848 struct net_device_stats *stats = hdlc_stats(dev);
849 848
850 /* 849 /*
851 * Everything is now set, just tell the card to go 850 * Everything is now set, just tell the card to go
@@ -853,8 +852,8 @@ fst_tx_dma_complete(struct fst_card_info *card, struct fst_port_info *port,
853 dbg(DBG_TX, "fst_tx_dma_complete\n"); 852 dbg(DBG_TX, "fst_tx_dma_complete\n");
854 FST_WRB(card, txDescrRing[port->index][txpos].bits, 853 FST_WRB(card, txDescrRing[port->index][txpos].bits,
855 DMA_OWN | TX_STP | TX_ENP); 854 DMA_OWN | TX_STP | TX_ENP);
856 stats->tx_packets++; 855 dev->stats.tx_packets++;
857 stats->tx_bytes += len; 856 dev->stats.tx_bytes += len;
858 dev->trans_start = jiffies; 857 dev->trans_start = jiffies;
859} 858}
860 859
@@ -876,7 +875,6 @@ fst_rx_dma_complete(struct fst_card_info *card, struct fst_port_info *port,
876 int len, struct sk_buff *skb, int rxp) 875 int len, struct sk_buff *skb, int rxp)
877{ 876{
878 struct net_device *dev = port_to_dev(port); 877 struct net_device *dev = port_to_dev(port);
879 struct net_device_stats *stats = hdlc_stats(dev);
880 int pi; 878 int pi;
881 int rx_status; 879 int rx_status;
882 880
@@ -888,8 +886,8 @@ fst_rx_dma_complete(struct fst_card_info *card, struct fst_port_info *port,
888 FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN); 886 FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN);
889 887
890 /* Update stats */ 888 /* Update stats */
891 stats->rx_packets++; 889 dev->stats.rx_packets++;
892 stats->rx_bytes += len; 890 dev->stats.rx_bytes += len;
893 891
894 /* Push upstream */ 892 /* Push upstream */
895 dbg(DBG_RX, "Pushing the frame up the stack\n"); 893 dbg(DBG_RX, "Pushing the frame up the stack\n");
@@ -900,7 +898,7 @@ fst_rx_dma_complete(struct fst_card_info *card, struct fst_port_info *port,
900 rx_status = netif_rx(skb); 898 rx_status = netif_rx(skb);
901 fst_process_rx_status(rx_status, port_to_dev(port)->name); 899 fst_process_rx_status(rx_status, port_to_dev(port)->name);
902 if (rx_status == NET_RX_DROP) 900 if (rx_status == NET_RX_DROP)
903 stats->rx_dropped++; 901 dev->stats.rx_dropped++;
904 dev->last_rx = jiffies; 902 dev->last_rx = jiffies;
905} 903}
906 904
@@ -1163,29 +1161,28 @@ fst_log_rx_error(struct fst_card_info *card, struct fst_port_info *port,
1163 unsigned char dmabits, int rxp, unsigned short len) 1161 unsigned char dmabits, int rxp, unsigned short len)
1164{ 1162{
1165 struct net_device *dev = port_to_dev(port); 1163 struct net_device *dev = port_to_dev(port);
1166 struct net_device_stats *stats = hdlc_stats(dev);
1167 1164
1168 /* 1165 /*
1169 * Increment the appropriate error counter 1166 * Increment the appropriate error counter
1170 */ 1167 */
1171 stats->rx_errors++; 1168 dev->stats.rx_errors++;
1172 if (dmabits & RX_OFLO) { 1169 if (dmabits & RX_OFLO) {
1173 stats->rx_fifo_errors++; 1170 dev->stats.rx_fifo_errors++;
1174 dbg(DBG_ASS, "Rx fifo error on card %d port %d buffer %d\n", 1171 dbg(DBG_ASS, "Rx fifo error on card %d port %d buffer %d\n",
1175 card->card_no, port->index, rxp); 1172 card->card_no, port->index, rxp);
1176 } 1173 }
1177 if (dmabits & RX_CRC) { 1174 if (dmabits & RX_CRC) {
1178 stats->rx_crc_errors++; 1175 dev->stats.rx_crc_errors++;
1179 dbg(DBG_ASS, "Rx crc error on card %d port %d\n", 1176 dbg(DBG_ASS, "Rx crc error on card %d port %d\n",
1180 card->card_no, port->index); 1177 card->card_no, port->index);
1181 } 1178 }
1182 if (dmabits & RX_FRAM) { 1179 if (dmabits & RX_FRAM) {
1183 stats->rx_frame_errors++; 1180 dev->stats.rx_frame_errors++;
1184 dbg(DBG_ASS, "Rx frame error on card %d port %d\n", 1181 dbg(DBG_ASS, "Rx frame error on card %d port %d\n",
1185 card->card_no, port->index); 1182 card->card_no, port->index);
1186 } 1183 }
1187 if (dmabits == (RX_STP | RX_ENP)) { 1184 if (dmabits == (RX_STP | RX_ENP)) {
1188 stats->rx_length_errors++; 1185 dev->stats.rx_length_errors++;
1189 dbg(DBG_ASS, "Rx length error (%d) on card %d port %d\n", 1186 dbg(DBG_ASS, "Rx length error (%d) on card %d port %d\n",
1190 len, card->card_no, port->index); 1187 len, card->card_no, port->index);
1191 } 1188 }
@@ -1242,7 +1239,6 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port)
1242 unsigned short len; 1239 unsigned short len;
1243 struct sk_buff *skb; 1240 struct sk_buff *skb;
1244 struct net_device *dev = port_to_dev(port); 1241 struct net_device *dev = port_to_dev(port);
1245 struct net_device_stats *stats = hdlc_stats(dev);
1246 1242
1247 /* Check we have a buffer to process */ 1243 /* Check we have a buffer to process */
1248 pi = port->index; 1244 pi = port->index;
@@ -1291,7 +1287,7 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port)
1291 if ((skb = dev_alloc_skb(len)) == NULL) { 1287 if ((skb = dev_alloc_skb(len)) == NULL) {
1292 dbg(DBG_RX, "intr_rx: can't allocate buffer\n"); 1288 dbg(DBG_RX, "intr_rx: can't allocate buffer\n");
1293 1289
1294 stats->rx_dropped++; 1290 dev->stats.rx_dropped++;
1295 1291
1296 /* Return descriptor to card */ 1292 /* Return descriptor to card */
1297 FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN); 1293 FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN);
@@ -1316,8 +1312,8 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port)
1316 FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN); 1312 FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN);
1317 1313
1318 /* Update stats */ 1314 /* Update stats */
1319 stats->rx_packets++; 1315 dev->stats.rx_packets++;
1320 stats->rx_bytes += len; 1316 dev->stats.rx_bytes += len;
1321 1317
1322 /* Push upstream */ 1318 /* Push upstream */
1323 dbg(DBG_RX, "Pushing frame up the stack\n"); 1319 dbg(DBG_RX, "Pushing frame up the stack\n");
@@ -1327,9 +1323,8 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port)
1327 skb->protocol = hdlc_type_trans(skb, dev); 1323 skb->protocol = hdlc_type_trans(skb, dev);
1328 rx_status = netif_rx(skb); 1324 rx_status = netif_rx(skb);
1329 fst_process_rx_status(rx_status, port_to_dev(port)->name); 1325 fst_process_rx_status(rx_status, port_to_dev(port)->name);
1330 if (rx_status == NET_RX_DROP) { 1326 if (rx_status == NET_RX_DROP)
1331 stats->rx_dropped++; 1327 dev->stats.rx_dropped++;
1332 }
1333 dev->last_rx = jiffies; 1328 dev->last_rx = jiffies;
1334 } else { 1329 } else {
1335 card->dma_skb_rx = skb; 1330 card->dma_skb_rx = skb;
@@ -1361,7 +1356,6 @@ do_bottom_half_tx(struct fst_card_info *card)
1361 struct sk_buff *skb; 1356 struct sk_buff *skb;
1362 unsigned long flags; 1357 unsigned long flags;
1363 struct net_device *dev; 1358 struct net_device *dev;
1364 struct net_device_stats *stats;
1365 1359
1366 /* 1360 /*
1367 * Find a free buffer for the transmit 1361 * Find a free buffer for the transmit
@@ -1373,12 +1367,10 @@ do_bottom_half_tx(struct fst_card_info *card)
1373 if (!port->run) 1367 if (!port->run)
1374 continue; 1368 continue;
1375 1369
1376 dev = port_to_dev(port); 1370 dev = port_to_dev(port);
1377 stats = hdlc_stats(dev); 1371 while (!(FST_RDB(card, txDescrRing[pi][port->txpos].bits) &
1378 while (! 1372 DMA_OWN)
1379 (FST_RDB(card, txDescrRing[pi][port->txpos].bits) & 1373 && !(card->dmatx_in_progress)) {
1380 DMA_OWN)
1381 && !(card->dmatx_in_progress)) {
1382 /* 1374 /*
1383 * There doesn't seem to be a txdone event per-se 1375 * There doesn't seem to be a txdone event per-se
1384 * We seem to have to deduce it, by checking the DMA_OWN 1376 * We seem to have to deduce it, by checking the DMA_OWN
@@ -1422,8 +1414,8 @@ do_bottom_half_tx(struct fst_card_info *card)
1422 txDescrRing[pi][port->txpos]. 1414 txDescrRing[pi][port->txpos].
1423 bits, 1415 bits,
1424 DMA_OWN | TX_STP | TX_ENP); 1416 DMA_OWN | TX_STP | TX_ENP);
1425 stats->tx_packets++; 1417 dev->stats.tx_packets++;
1426 stats->tx_bytes += skb->len; 1418 dev->stats.tx_bytes += skb->len;
1427 dev->trans_start = jiffies; 1419 dev->trans_start = jiffies;
1428 } else { 1420 } else {
1429 /* Or do it through dma */ 1421 /* Or do it through dma */
@@ -1628,8 +1620,8 @@ fst_intr(int dummy, void *dev_id)
1628 * always load up the entire packet for DMA. 1620 * always load up the entire packet for DMA.
1629 */ 1621 */
1630 dbg(DBG_TX, "Tx underflow port %d\n", port->index); 1622 dbg(DBG_TX, "Tx underflow port %d\n", port->index);
1631 hdlc_stats(port_to_dev(port))->tx_errors++; 1623 port_to_dev(port)->stats.tx_errors++;
1632 hdlc_stats(port_to_dev(port))->tx_fifo_errors++; 1624 port_to_dev(port)->stats.tx_fifo_errors++;
1633 dbg(DBG_ASS, "Tx underflow on card %d port %d\n", 1625 dbg(DBG_ASS, "Tx underflow on card %d port %d\n",
1634 card->card_no, port->index); 1626 card->card_no, port->index);
1635 break; 1627 break;
@@ -2292,12 +2284,11 @@ fst_tx_timeout(struct net_device *dev)
2292{ 2284{
2293 struct fst_port_info *port; 2285 struct fst_port_info *port;
2294 struct fst_card_info *card; 2286 struct fst_card_info *card;
2295 struct net_device_stats *stats = hdlc_stats(dev);
2296 2287
2297 port = dev_to_port(dev); 2288 port = dev_to_port(dev);
2298 card = port->card; 2289 card = port->card;
2299 stats->tx_errors++; 2290 dev->stats.tx_errors++;
2300 stats->tx_aborted_errors++; 2291 dev->stats.tx_aborted_errors++;
2301 dbg(DBG_ASS, "Tx timeout card %d port %d\n", 2292 dbg(DBG_ASS, "Tx timeout card %d port %d\n",
2302 card->card_no, port->index); 2293 card->card_no, port->index);
2303 fst_issue_cmd(port, ABORTTX); 2294 fst_issue_cmd(port, ABORTTX);
@@ -2312,7 +2303,6 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev)
2312{ 2303{
2313 struct fst_card_info *card; 2304 struct fst_card_info *card;
2314 struct fst_port_info *port; 2305 struct fst_port_info *port;
2315 struct net_device_stats *stats = hdlc_stats(dev);
2316 unsigned long flags; 2306 unsigned long flags;
2317 int txq_length; 2307 int txq_length;
2318 2308
@@ -2323,8 +2313,8 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev)
2323 /* Drop packet with error if we don't have carrier */ 2313 /* Drop packet with error if we don't have carrier */
2324 if (!netif_carrier_ok(dev)) { 2314 if (!netif_carrier_ok(dev)) {
2325 dev_kfree_skb(skb); 2315 dev_kfree_skb(skb);
2326 stats->tx_errors++; 2316 dev->stats.tx_errors++;
2327 stats->tx_carrier_errors++; 2317 dev->stats.tx_carrier_errors++;
2328 dbg(DBG_ASS, 2318 dbg(DBG_ASS,
2329 "Tried to transmit but no carrier on card %d port %d\n", 2319 "Tried to transmit but no carrier on card %d port %d\n",
2330 card->card_no, port->index); 2320 card->card_no, port->index);
@@ -2336,7 +2326,7 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev)
2336 dbg(DBG_ASS, "Packet too large %d vs %d\n", skb->len, 2326 dbg(DBG_ASS, "Packet too large %d vs %d\n", skb->len,
2337 LEN_TX_BUFFER); 2327 LEN_TX_BUFFER);
2338 dev_kfree_skb(skb); 2328 dev_kfree_skb(skb);
2339 stats->tx_errors++; 2329 dev->stats.tx_errors++;
2340 return 0; 2330 return 0;
2341 } 2331 }
2342 2332
@@ -2368,7 +2358,7 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev)
2368 * This shouldn't have happened but such is life 2358 * This shouldn't have happened but such is life
2369 */ 2359 */
2370 dev_kfree_skb(skb); 2360 dev_kfree_skb(skb);
2371 stats->tx_errors++; 2361 dev->stats.tx_errors++;
2372 dbg(DBG_ASS, "Tx queue overflow card %d port %d\n", 2362 dbg(DBG_ASS, "Tx queue overflow card %d port %d\n",
2373 card->card_no, port->index); 2363 card->card_no, port->index);
2374 return 0; 2364 return 0;
diff --git a/drivers/net/wan/hd6457x.c b/drivers/net/wan/hd6457x.c
index 8d0a1f2f00e5..591fb45a7c68 100644
--- a/drivers/net/wan/hd6457x.c
+++ b/drivers/net/wan/hd6457x.c
@@ -271,9 +271,9 @@ static inline void sca_msci_intr(port_t *port)
271 sca_out(stat & (ST1_UDRN | ST1_CDCD), msci + ST1, card); 271 sca_out(stat & (ST1_UDRN | ST1_CDCD), msci + ST1, card);
272 272
273 if (stat & ST1_UDRN) { 273 if (stat & ST1_UDRN) {
274 struct net_device_stats *stats = hdlc_stats(port_to_dev(port)); 274 /* TX Underrun error detected */
275 stats->tx_errors++; /* TX Underrun error detected */ 275 port_to_dev(port)->stats.tx_errors++;
276 stats->tx_fifo_errors++; 276 port_to_dev(port)->stats.tx_fifo_errors++;
277 } 277 }
278 278
279 if (stat & ST1_CDCD) 279 if (stat & ST1_CDCD)
@@ -286,7 +286,6 @@ static inline void sca_msci_intr(port_t *port)
286static inline void sca_rx(card_t *card, port_t *port, pkt_desc __iomem *desc, u16 rxin) 286static inline void sca_rx(card_t *card, port_t *port, pkt_desc __iomem *desc, u16 rxin)
287{ 287{
288 struct net_device *dev = port_to_dev(port); 288 struct net_device *dev = port_to_dev(port);
289 struct net_device_stats *stats = hdlc_stats(dev);
290 struct sk_buff *skb; 289 struct sk_buff *skb;
291 u16 len; 290 u16 len;
292 u32 buff; 291 u32 buff;
@@ -298,7 +297,7 @@ static inline void sca_rx(card_t *card, port_t *port, pkt_desc __iomem *desc, u1
298 len = readw(&desc->len); 297 len = readw(&desc->len);
299 skb = dev_alloc_skb(len); 298 skb = dev_alloc_skb(len);
300 if (!skb) { 299 if (!skb) {
301 stats->rx_dropped++; 300 dev->stats.rx_dropped++;
302 return; 301 return;
303 } 302 }
304 303
@@ -327,8 +326,8 @@ static inline void sca_rx(card_t *card, port_t *port, pkt_desc __iomem *desc, u1
327 printk(KERN_DEBUG "%s RX(%i):", dev->name, skb->len); 326 printk(KERN_DEBUG "%s RX(%i):", dev->name, skb->len);
328 debug_frame(skb); 327 debug_frame(skb);
329#endif 328#endif
330 stats->rx_packets++; 329 dev->stats.rx_packets++;
331 stats->rx_bytes += skb->len; 330 dev->stats.rx_bytes += skb->len;
332 dev->last_rx = jiffies; 331 dev->last_rx = jiffies;
333 skb->protocol = hdlc_type_trans(skb, dev); 332 skb->protocol = hdlc_type_trans(skb, dev);
334 netif_rx(skb); 333 netif_rx(skb);
@@ -339,17 +338,18 @@ static inline void sca_rx(card_t *card, port_t *port, pkt_desc __iomem *desc, u1
339/* Receive DMA interrupt service */ 338/* Receive DMA interrupt service */
340static inline void sca_rx_intr(port_t *port) 339static inline void sca_rx_intr(port_t *port)
341{ 340{
341 struct net_device *dev = port_to_dev(port);
342 u16 dmac = get_dmac_rx(port); 342 u16 dmac = get_dmac_rx(port);
343 card_t *card = port_to_card(port); 343 card_t *card = port_to_card(port);
344 u8 stat = sca_in(DSR_RX(phy_node(port)), card); /* read DMA Status */ 344 u8 stat = sca_in(DSR_RX(phy_node(port)), card); /* read DMA Status */
345 struct net_device_stats *stats = hdlc_stats(port_to_dev(port));
346 345
347 /* Reset DSR status bits */ 346 /* Reset DSR status bits */
348 sca_out((stat & (DSR_EOT | DSR_EOM | DSR_BOF | DSR_COF)) | DSR_DWE, 347 sca_out((stat & (DSR_EOT | DSR_EOM | DSR_BOF | DSR_COF)) | DSR_DWE,
349 DSR_RX(phy_node(port)), card); 348 DSR_RX(phy_node(port)), card);
350 349
351 if (stat & DSR_BOF) 350 if (stat & DSR_BOF)
352 stats->rx_over_errors++; /* Dropped one or more frames */ 351 /* Dropped one or more frames */
352 dev->stats.rx_over_errors++;
353 353
354 while (1) { 354 while (1) {
355 u32 desc_off = desc_offset(port, port->rxin, 0); 355 u32 desc_off = desc_offset(port, port->rxin, 0);
@@ -364,12 +364,14 @@ static inline void sca_rx_intr(port_t *port)
364 if (!(stat & ST_RX_EOM)) 364 if (!(stat & ST_RX_EOM))
365 port->rxpart = 1; /* partial frame received */ 365 port->rxpart = 1; /* partial frame received */
366 else if ((stat & ST_ERROR_MASK) || port->rxpart) { 366 else if ((stat & ST_ERROR_MASK) || port->rxpart) {
367 stats->rx_errors++; 367 dev->stats.rx_errors++;
368 if (stat & ST_RX_OVERRUN) stats->rx_fifo_errors++; 368 if (stat & ST_RX_OVERRUN)
369 dev->stats.rx_fifo_errors++;
369 else if ((stat & (ST_RX_SHORT | ST_RX_ABORT | 370 else if ((stat & (ST_RX_SHORT | ST_RX_ABORT |
370 ST_RX_RESBIT)) || port->rxpart) 371 ST_RX_RESBIT)) || port->rxpart)
371 stats->rx_frame_errors++; 372 dev->stats.rx_frame_errors++;
372 else if (stat & ST_RX_CRC) stats->rx_crc_errors++; 373 else if (stat & ST_RX_CRC)
374 dev->stats.rx_crc_errors++;
373 if (stat & ST_RX_EOM) 375 if (stat & ST_RX_EOM)
374 port->rxpart = 0; /* received last fragment */ 376 port->rxpart = 0; /* received last fragment */
375 } else 377 } else
@@ -390,7 +392,6 @@ static inline void sca_rx_intr(port_t *port)
390static inline void sca_tx_intr(port_t *port) 392static inline void sca_tx_intr(port_t *port)
391{ 393{
392 struct net_device *dev = port_to_dev(port); 394 struct net_device *dev = port_to_dev(port);
393 struct net_device_stats *stats = hdlc_stats(dev);
394 u16 dmac = get_dmac_tx(port); 395 u16 dmac = get_dmac_tx(port);
395 card_t* card = port_to_card(port); 396 card_t* card = port_to_card(port);
396 u8 stat; 397 u8 stat;
@@ -412,8 +413,8 @@ static inline void sca_tx_intr(port_t *port)
412 break; /* Transmitter is/will_be sending this frame */ 413 break; /* Transmitter is/will_be sending this frame */
413 414
414 desc = desc_address(port, port->txlast, 1); 415 desc = desc_address(port, port->txlast, 1);
415 stats->tx_packets++; 416 dev->stats.tx_packets++;
416 stats->tx_bytes += readw(&desc->len); 417 dev->stats.tx_bytes += readw(&desc->len);
417 writeb(0, &desc->stat); /* Free descriptor */ 418 writeb(0, &desc->stat); /* Free descriptor */
418 port->txlast = next_desc(port, port->txlast, 1); 419 port->txlast = next_desc(port, port->txlast, 1);
419 } 420 }
diff --git a/drivers/net/wan/hdlc.c b/drivers/net/wan/hdlc.c
index 7f984895b0d5..e3a536477c7e 100644
--- a/drivers/net/wan/hdlc.c
+++ b/drivers/net/wan/hdlc.c
@@ -57,7 +57,7 @@ static int hdlc_change_mtu(struct net_device *dev, int new_mtu)
57 57
58static struct net_device_stats *hdlc_get_stats(struct net_device *dev) 58static struct net_device_stats *hdlc_get_stats(struct net_device *dev)
59{ 59{
60 return hdlc_stats(dev); 60 return &dev->stats;
61} 61}
62 62
63 63
diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c
index 762d21c1c703..849819c2552d 100644
--- a/drivers/net/wan/hdlc_cisco.c
+++ b/drivers/net/wan/hdlc_cisco.c
@@ -252,8 +252,8 @@ static int cisco_rx(struct sk_buff *skb)
252 dev_kfree_skb_any(skb); 252 dev_kfree_skb_any(skb);
253 return NET_RX_DROP; 253 return NET_RX_DROP;
254 254
255 rx_error: 255rx_error:
256 dev_to_hdlc(dev)->stats.rx_errors++; /* Mark error */ 256 dev->stats.rx_errors++; /* Mark error */
257 dev_kfree_skb_any(skb); 257 dev_kfree_skb_any(skb);
258 return NET_RX_DROP; 258 return NET_RX_DROP;
259} 259}
diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c
index 6d35155c7145..62e93dac6b13 100644
--- a/drivers/net/wan/hdlc_fr.c
+++ b/drivers/net/wan/hdlc_fr.c
@@ -135,11 +135,6 @@ typedef struct pvc_device_struct {
135 }state; 135 }state;
136}pvc_device; 136}pvc_device;
137 137
138struct pvc_desc {
139 struct net_device_stats stats;
140 pvc_device *pvc;
141};
142
143struct frad_state { 138struct frad_state {
144 fr_proto settings; 139 fr_proto settings;
145 pvc_device *first_pvc; 140 pvc_device *first_pvc;
@@ -179,15 +174,6 @@ static inline struct frad_state* state(hdlc_device *hdlc)
179 return(struct frad_state *)(hdlc->state); 174 return(struct frad_state *)(hdlc->state);
180} 175}
181 176
182static inline struct pvc_desc* pvcdev_to_desc(struct net_device *dev)
183{
184 return dev->priv;
185}
186
187static inline struct net_device_stats* pvc_get_stats(struct net_device *dev)
188{
189 return &pvcdev_to_desc(dev)->stats;
190}
191 177
192static inline pvc_device* find_pvc(hdlc_device *hdlc, u16 dlci) 178static inline pvc_device* find_pvc(hdlc_device *hdlc, u16 dlci)
193{ 179{
@@ -357,7 +343,7 @@ static int fr_hard_header(struct sk_buff **skb_p, u16 dlci)
357 343
358static int pvc_open(struct net_device *dev) 344static int pvc_open(struct net_device *dev)
359{ 345{
360 pvc_device *pvc = pvcdev_to_desc(dev)->pvc; 346 pvc_device *pvc = dev->priv;
361 347
362 if ((pvc->frad->flags & IFF_UP) == 0) 348 if ((pvc->frad->flags & IFF_UP) == 0)
363 return -EIO; /* Frad must be UP in order to activate PVC */ 349 return -EIO; /* Frad must be UP in order to activate PVC */
@@ -377,7 +363,7 @@ static int pvc_open(struct net_device *dev)
377 363
378static int pvc_close(struct net_device *dev) 364static int pvc_close(struct net_device *dev)
379{ 365{
380 pvc_device *pvc = pvcdev_to_desc(dev)->pvc; 366 pvc_device *pvc = dev->priv;
381 367
382 if (--pvc->open_count == 0) { 368 if (--pvc->open_count == 0) {
383 hdlc_device *hdlc = dev_to_hdlc(pvc->frad); 369 hdlc_device *hdlc = dev_to_hdlc(pvc->frad);
@@ -396,7 +382,7 @@ static int pvc_close(struct net_device *dev)
396 382
397static int pvc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 383static int pvc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
398{ 384{
399 pvc_device *pvc = pvcdev_to_desc(dev)->pvc; 385 pvc_device *pvc = dev->priv;
400 fr_proto_pvc_info info; 386 fr_proto_pvc_info info;
401 387
402 if (ifr->ifr_settings.type == IF_GET_PROTO) { 388 if (ifr->ifr_settings.type == IF_GET_PROTO) {
@@ -424,8 +410,7 @@ static int pvc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
424 410
425static int pvc_xmit(struct sk_buff *skb, struct net_device *dev) 411static int pvc_xmit(struct sk_buff *skb, struct net_device *dev)
426{ 412{
427 pvc_device *pvc = pvcdev_to_desc(dev)->pvc; 413 pvc_device *pvc = dev->priv;
428 struct net_device_stats *stats = pvc_get_stats(dev);
429 414
430 if (pvc->state.active) { 415 if (pvc->state.active) {
431 if (dev->type == ARPHRD_ETHER) { 416 if (dev->type == ARPHRD_ETHER) {
@@ -435,7 +420,7 @@ static int pvc_xmit(struct sk_buff *skb, struct net_device *dev)
435 if (skb_tailroom(skb) < pad) 420 if (skb_tailroom(skb) < pad)
436 if (pskb_expand_head(skb, 0, pad, 421 if (pskb_expand_head(skb, 0, pad,
437 GFP_ATOMIC)) { 422 GFP_ATOMIC)) {
438 stats->tx_dropped++; 423 dev->stats.tx_dropped++;
439 dev_kfree_skb(skb); 424 dev_kfree_skb(skb);
440 return 0; 425 return 0;
441 } 426 }
@@ -445,17 +430,17 @@ static int pvc_xmit(struct sk_buff *skb, struct net_device *dev)
445 skb->protocol = __constant_htons(ETH_P_802_3); 430 skb->protocol = __constant_htons(ETH_P_802_3);
446 } 431 }
447 if (!fr_hard_header(&skb, pvc->dlci)) { 432 if (!fr_hard_header(&skb, pvc->dlci)) {
448 stats->tx_bytes += skb->len; 433 dev->stats.tx_bytes += skb->len;
449 stats->tx_packets++; 434 dev->stats.tx_packets++;
450 if (pvc->state.fecn) /* TX Congestion counter */ 435 if (pvc->state.fecn) /* TX Congestion counter */
451 stats->tx_compressed++; 436 dev->stats.tx_compressed++;
452 skb->dev = pvc->frad; 437 skb->dev = pvc->frad;
453 dev_queue_xmit(skb); 438 dev_queue_xmit(skb);
454 return 0; 439 return 0;
455 } 440 }
456 } 441 }
457 442
458 stats->tx_dropped++; 443 dev->stats.tx_dropped++;
459 dev_kfree_skb(skb); 444 dev_kfree_skb(skb);
460 return 0; 445 return 0;
461} 446}
@@ -955,7 +940,7 @@ static int fr_rx(struct sk_buff *skb)
955 940
956 941
957 if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) { 942 if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) {
958 dev_to_hdlc(frad)->stats.rx_dropped++; 943 frad->stats.rx_dropped++;
959 return NET_RX_DROP; 944 return NET_RX_DROP;
960 } 945 }
961 946
@@ -1003,11 +988,10 @@ static int fr_rx(struct sk_buff *skb)
1003 } 988 }
1004 989
1005 if (dev) { 990 if (dev) {
1006 struct net_device_stats *stats = pvc_get_stats(dev); 991 dev->stats.rx_packets++; /* PVC traffic */
1007 stats->rx_packets++; /* PVC traffic */ 992 dev->stats.rx_bytes += skb->len;
1008 stats->rx_bytes += skb->len;
1009 if (pvc->state.becn) 993 if (pvc->state.becn)
1010 stats->rx_compressed++; 994 dev->stats.rx_compressed++;
1011 skb->dev = dev; 995 skb->dev = dev;
1012 netif_rx(skb); 996 netif_rx(skb);
1013 return NET_RX_SUCCESS; 997 return NET_RX_SUCCESS;
@@ -1017,7 +1001,7 @@ static int fr_rx(struct sk_buff *skb)
1017 } 1001 }
1018 1002
1019 rx_error: 1003 rx_error:
1020 dev_to_hdlc(frad)->stats.rx_errors++; /* Mark error */ 1004 frad->stats.rx_errors++; /* Mark error */
1021 dev_kfree_skb_any(skb); 1005 dev_kfree_skb_any(skb);
1022 return NET_RX_DROP; 1006 return NET_RX_DROP;
1023} 1007}
@@ -1088,7 +1072,7 @@ static void pvc_setup(struct net_device *dev)
1088static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type) 1072static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)
1089{ 1073{
1090 hdlc_device *hdlc = dev_to_hdlc(frad); 1074 hdlc_device *hdlc = dev_to_hdlc(frad);
1091 pvc_device *pvc = NULL; 1075 pvc_device *pvc;
1092 struct net_device *dev; 1076 struct net_device *dev;
1093 int result, used; 1077 int result, used;
1094 1078
@@ -1104,10 +1088,9 @@ static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)
1104 used = pvc_is_used(pvc); 1088 used = pvc_is_used(pvc);
1105 1089
1106 if (type == ARPHRD_ETHER) 1090 if (type == ARPHRD_ETHER)
1107 dev = alloc_netdev(sizeof(struct pvc_desc), "pvceth%d", 1091 dev = alloc_netdev(0, "pvceth%d", ether_setup);
1108 ether_setup);
1109 else 1092 else
1110 dev = alloc_netdev(sizeof(struct pvc_desc), "pvc%d", pvc_setup); 1093 dev = alloc_netdev(0, "pvc%d", pvc_setup);
1111 1094
1112 if (!dev) { 1095 if (!dev) {
1113 printk(KERN_WARNING "%s: Memory squeeze on fr_pvc()\n", 1096 printk(KERN_WARNING "%s: Memory squeeze on fr_pvc()\n",
@@ -1123,14 +1106,13 @@ static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)
1123 dlci_to_q922(dev->broadcast, dlci); 1106 dlci_to_q922(dev->broadcast, dlci);
1124 } 1107 }
1125 dev->hard_start_xmit = pvc_xmit; 1108 dev->hard_start_xmit = pvc_xmit;
1126 dev->get_stats = pvc_get_stats;
1127 dev->open = pvc_open; 1109 dev->open = pvc_open;
1128 dev->stop = pvc_close; 1110 dev->stop = pvc_close;
1129 dev->do_ioctl = pvc_ioctl; 1111 dev->do_ioctl = pvc_ioctl;
1130 dev->change_mtu = pvc_change_mtu; 1112 dev->change_mtu = pvc_change_mtu;
1131 dev->mtu = HDLC_MAX_MTU; 1113 dev->mtu = HDLC_MAX_MTU;
1132 dev->tx_queue_len = 0; 1114 dev->tx_queue_len = 0;
1133 pvcdev_to_desc(dev)->pvc = pvc; 1115 dev->priv = pvc;
1134 1116
1135 result = dev_alloc_name(dev, dev->name); 1117 result = dev_alloc_name(dev, dev->name);
1136 if (result < 0) { 1118 if (result < 0) {
diff --git a/drivers/net/wan/hdlc_raw_eth.c b/drivers/net/wan/hdlc_raw_eth.c
index d20c685f6711..26dee600506f 100644
--- a/drivers/net/wan/hdlc_raw_eth.c
+++ b/drivers/net/wan/hdlc_raw_eth.c
@@ -33,7 +33,7 @@ static int eth_tx(struct sk_buff *skb, struct net_device *dev)
33 int len = skb->len; 33 int len = skb->len;
34 if (skb_tailroom(skb) < pad) 34 if (skb_tailroom(skb) < pad)
35 if (pskb_expand_head(skb, 0, pad, GFP_ATOMIC)) { 35 if (pskb_expand_head(skb, 0, pad, GFP_ATOMIC)) {
36 hdlc_stats(dev)->tx_dropped++; 36 dev->stats.tx_dropped++;
37 dev_kfree_skb(skb); 37 dev_kfree_skb(skb);
38 return 0; 38 return 0;
39 } 39 }
diff --git a/drivers/net/wan/hdlc_x25.c b/drivers/net/wan/hdlc_x25.c
index c15cc11e399b..e808720030ef 100644
--- a/drivers/net/wan/hdlc_x25.c
+++ b/drivers/net/wan/hdlc_x25.c
@@ -164,17 +164,15 @@ static void x25_close(struct net_device *dev)
164 164
165static int x25_rx(struct sk_buff *skb) 165static int x25_rx(struct sk_buff *skb)
166{ 166{
167 struct hdlc_device *hdlc = dev_to_hdlc(skb->dev);
168
169 if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) { 167 if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) {
170 hdlc->stats.rx_dropped++; 168 skb->dev->stats.rx_dropped++;
171 return NET_RX_DROP; 169 return NET_RX_DROP;
172 } 170 }
173 171
174 if (lapb_data_received(skb->dev, skb) == LAPB_OK) 172 if (lapb_data_received(skb->dev, skb) == LAPB_OK)
175 return NET_RX_SUCCESS; 173 return NET_RX_SUCCESS;
176 174
177 hdlc->stats.rx_errors++; 175 skb->dev->stats.rx_errors++;
178 dev_kfree_skb_any(skb); 176 dev_kfree_skb_any(skb);
179 return NET_RX_DROP; 177 return NET_RX_DROP;
180} 178}
diff --git a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c
index 57914fbd41d3..334170527755 100644
--- a/drivers/net/wan/pc300_drv.c
+++ b/drivers/net/wan/pc300_drv.c
@@ -285,7 +285,6 @@ static void rx_dma_buf_init(pc300_t *, int);
285static void tx_dma_buf_check(pc300_t *, int); 285static void tx_dma_buf_check(pc300_t *, int);
286static void rx_dma_buf_check(pc300_t *, int); 286static void rx_dma_buf_check(pc300_t *, int);
287static irqreturn_t cpc_intr(int, void *); 287static irqreturn_t cpc_intr(int, void *);
288static struct net_device_stats *cpc_get_stats(struct net_device *);
289static int clock_rate_calc(uclong, uclong, int *); 288static int clock_rate_calc(uclong, uclong, int *);
290static uclong detect_ram(pc300_t *); 289static uclong detect_ram(pc300_t *);
291static void plx_init(pc300_t *); 290static void plx_init(pc300_t *);
@@ -1775,13 +1774,12 @@ static void cpc_tx_timeout(struct net_device *dev)
1775 pc300dev_t *d = (pc300dev_t *) dev->priv; 1774 pc300dev_t *d = (pc300dev_t *) dev->priv;
1776 pc300ch_t *chan = (pc300ch_t *) d->chan; 1775 pc300ch_t *chan = (pc300ch_t *) d->chan;
1777 pc300_t *card = (pc300_t *) chan->card; 1776 pc300_t *card = (pc300_t *) chan->card;
1778 struct net_device_stats *stats = hdlc_stats(dev);
1779 int ch = chan->channel; 1777 int ch = chan->channel;
1780 unsigned long flags; 1778 unsigned long flags;
1781 ucchar ilar; 1779 ucchar ilar;
1782 1780
1783 stats->tx_errors++; 1781 dev->stats.tx_errors++;
1784 stats->tx_aborted_errors++; 1782 dev->stats.tx_aborted_errors++;
1785 CPC_LOCK(card, flags); 1783 CPC_LOCK(card, flags);
1786 if ((ilar = cpc_readb(card->hw.scabase + ILAR)) != 0) { 1784 if ((ilar = cpc_readb(card->hw.scabase + ILAR)) != 0) {
1787 printk("%s: ILAR=0x%x\n", dev->name, ilar); 1785 printk("%s: ILAR=0x%x\n", dev->name, ilar);
@@ -1803,7 +1801,6 @@ static int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev)
1803 pc300dev_t *d = (pc300dev_t *) dev->priv; 1801 pc300dev_t *d = (pc300dev_t *) dev->priv;
1804 pc300ch_t *chan = (pc300ch_t *) d->chan; 1802 pc300ch_t *chan = (pc300ch_t *) d->chan;
1805 pc300_t *card = (pc300_t *) chan->card; 1803 pc300_t *card = (pc300_t *) chan->card;
1806 struct net_device_stats *stats = hdlc_stats(dev);
1807 int ch = chan->channel; 1804 int ch = chan->channel;
1808 unsigned long flags; 1805 unsigned long flags;
1809#ifdef PC300_DEBUG_TX 1806#ifdef PC300_DEBUG_TX
@@ -1817,13 +1814,13 @@ static int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev)
1817 } else if (!netif_carrier_ok(dev)) { 1814 } else if (!netif_carrier_ok(dev)) {
1818 /* DCD must be OFF: drop packet */ 1815 /* DCD must be OFF: drop packet */
1819 dev_kfree_skb(skb); 1816 dev_kfree_skb(skb);
1820 stats->tx_errors++; 1817 dev->stats.tx_errors++;
1821 stats->tx_carrier_errors++; 1818 dev->stats.tx_carrier_errors++;
1822 return 0; 1819 return 0;
1823 } else if (cpc_readb(card->hw.scabase + M_REG(ST3, ch)) & ST3_DCD) { 1820 } else if (cpc_readb(card->hw.scabase + M_REG(ST3, ch)) & ST3_DCD) {
1824 printk("%s: DCD is OFF. Going administrative down.\n", dev->name); 1821 printk("%s: DCD is OFF. Going administrative down.\n", dev->name);
1825 stats->tx_errors++; 1822 dev->stats.tx_errors++;
1826 stats->tx_carrier_errors++; 1823 dev->stats.tx_carrier_errors++;
1827 dev_kfree_skb(skb); 1824 dev_kfree_skb(skb);
1828 netif_carrier_off(dev); 1825 netif_carrier_off(dev);
1829 CPC_LOCK(card, flags); 1826 CPC_LOCK(card, flags);
@@ -1843,8 +1840,8 @@ static int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev)
1843// printk("%s: write error. Dropping TX packet.\n", dev->name); 1840// printk("%s: write error. Dropping TX packet.\n", dev->name);
1844 netif_stop_queue(dev); 1841 netif_stop_queue(dev);
1845 dev_kfree_skb(skb); 1842 dev_kfree_skb(skb);
1846 stats->tx_errors++; 1843 dev->stats.tx_errors++;
1847 stats->tx_dropped++; 1844 dev->stats.tx_dropped++;
1848 return 0; 1845 return 0;
1849 } 1846 }
1850#ifdef PC300_DEBUG_TX 1847#ifdef PC300_DEBUG_TX
@@ -1886,7 +1883,6 @@ static void cpc_net_rx(struct net_device *dev)
1886 pc300dev_t *d = (pc300dev_t *) dev->priv; 1883 pc300dev_t *d = (pc300dev_t *) dev->priv;
1887 pc300ch_t *chan = (pc300ch_t *) d->chan; 1884 pc300ch_t *chan = (pc300ch_t *) d->chan;
1888 pc300_t *card = (pc300_t *) chan->card; 1885 pc300_t *card = (pc300_t *) chan->card;
1889 struct net_device_stats *stats = hdlc_stats(dev);
1890 int ch = chan->channel; 1886 int ch = chan->channel;
1891#ifdef PC300_DEBUG_RX 1887#ifdef PC300_DEBUG_RX
1892 int i; 1888 int i;
@@ -1922,24 +1918,24 @@ static void cpc_net_rx(struct net_device *dev)
1922#endif 1918#endif
1923 if ((skb == NULL) && (rxb > 0)) { 1919 if ((skb == NULL) && (rxb > 0)) {
1924 /* rxb > dev->mtu */ 1920 /* rxb > dev->mtu */
1925 stats->rx_errors++; 1921 dev->stats.rx_errors++;
1926 stats->rx_length_errors++; 1922 dev->stats.rx_length_errors++;
1927 continue; 1923 continue;
1928 } 1924 }
1929 1925
1930 if (rxb < 0) { /* Invalid frame */ 1926 if (rxb < 0) { /* Invalid frame */
1931 rxb = -rxb; 1927 rxb = -rxb;
1932 if (rxb & DST_OVR) { 1928 if (rxb & DST_OVR) {
1933 stats->rx_errors++; 1929 dev->stats.rx_errors++;
1934 stats->rx_fifo_errors++; 1930 dev->stats.rx_fifo_errors++;
1935 } 1931 }
1936 if (rxb & DST_CRC) { 1932 if (rxb & DST_CRC) {
1937 stats->rx_errors++; 1933 dev->stats.rx_errors++;
1938 stats->rx_crc_errors++; 1934 dev->stats.rx_crc_errors++;
1939 } 1935 }
1940 if (rxb & (DST_RBIT | DST_SHRT | DST_ABT)) { 1936 if (rxb & (DST_RBIT | DST_SHRT | DST_ABT)) {
1941 stats->rx_errors++; 1937 dev->stats.rx_errors++;
1942 stats->rx_frame_errors++; 1938 dev->stats.rx_frame_errors++;
1943 } 1939 }
1944 } 1940 }
1945 if (skb) { 1941 if (skb) {
@@ -1948,7 +1944,7 @@ static void cpc_net_rx(struct net_device *dev)
1948 continue; 1944 continue;
1949 } 1945 }
1950 1946
1951 stats->rx_bytes += rxb; 1947 dev->stats.rx_bytes += rxb;
1952 1948
1953#ifdef PC300_DEBUG_RX 1949#ifdef PC300_DEBUG_RX
1954 printk("%s R:", dev->name); 1950 printk("%s R:", dev->name);
@@ -1959,7 +1955,7 @@ static void cpc_net_rx(struct net_device *dev)
1959 if (d->trace_on) { 1955 if (d->trace_on) {
1960 cpc_trace(dev, skb, 'R'); 1956 cpc_trace(dev, skb, 'R');
1961 } 1957 }
1962 stats->rx_packets++; 1958 dev->stats.rx_packets++;
1963 skb->protocol = hdlc_type_trans(skb, dev); 1959 skb->protocol = hdlc_type_trans(skb, dev);
1964 netif_rx(skb); 1960 netif_rx(skb);
1965 } 1961 }
@@ -1974,16 +1970,15 @@ static void sca_tx_intr(pc300dev_t *dev)
1974 pc300_t *card = (pc300_t *)chan->card; 1970 pc300_t *card = (pc300_t *)chan->card;
1975 int ch = chan->channel; 1971 int ch = chan->channel;
1976 volatile pcsca_bd_t __iomem * ptdescr; 1972 volatile pcsca_bd_t __iomem * ptdescr;
1977 struct net_device_stats *stats = hdlc_stats(dev->dev);
1978 1973
1979 /* Clean up descriptors from previous transmission */ 1974 /* Clean up descriptors from previous transmission */
1980 ptdescr = (card->hw.rambase + 1975 ptdescr = (card->hw.rambase +
1981 TX_BD_ADDR(ch,chan->tx_first_bd)); 1976 TX_BD_ADDR(ch,chan->tx_first_bd));
1982 while ((cpc_readl(card->hw.scabase + DTX_REG(CDAL,ch)) != 1977 while ((cpc_readl(card->hw.scabase + DTX_REG(CDAL,ch)) !=
1983 TX_BD_ADDR(ch,chan->tx_first_bd)) && 1978 TX_BD_ADDR(ch,chan->tx_first_bd)) &&
1984 (cpc_readb(&ptdescr->status) & DST_OSB)) { 1979 (cpc_readb(&ptdescr->status) & DST_OSB)) {
1985 stats->tx_packets++; 1980 dev->dev->stats.tx_packets++;
1986 stats->tx_bytes += cpc_readw(&ptdescr->len); 1981 dev->dev->stats.tx_bytes += cpc_readw(&ptdescr->len);
1987 cpc_writeb(&ptdescr->status, DST_OSB); 1982 cpc_writeb(&ptdescr->status, DST_OSB);
1988 cpc_writew(&ptdescr->len, 0); 1983 cpc_writew(&ptdescr->len, 0);
1989 chan->nfree_tx_bd++; 1984 chan->nfree_tx_bd++;
@@ -2048,8 +2043,8 @@ static void sca_intr(pc300_t * card)
2048 } 2043 }
2049 cpc_net_rx(dev); 2044 cpc_net_rx(dev);
2050 /* Discard invalid frames */ 2045 /* Discard invalid frames */
2051 hdlc_stats(dev)->rx_errors++; 2046 dev->stats.rx_errors++;
2052 hdlc_stats(dev)->rx_over_errors++; 2047 dev->stats.rx_over_errors++;
2053 chan->rx_first_bd = 0; 2048 chan->rx_first_bd = 0;
2054 chan->rx_last_bd = N_DMA_RX_BUF - 1; 2049 chan->rx_last_bd = N_DMA_RX_BUF - 1;
2055 rx_dma_start(card, ch); 2050 rx_dma_start(card, ch);
@@ -2115,8 +2110,8 @@ static void sca_intr(pc300_t * card)
2115 card->hw.cpld_reg2) & 2110 card->hw.cpld_reg2) &
2116 ~ (CPLD_REG2_FALC_LED1 << (2 * ch))); 2111 ~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
2117 } 2112 }
2118 hdlc_stats(dev)->tx_errors++; 2113 dev->stats.tx_errors++;
2119 hdlc_stats(dev)->tx_fifo_errors++; 2114 dev->stats.tx_fifo_errors++;
2120 sca_tx_intr(d); 2115 sca_tx_intr(d);
2121 } 2116 }
2122 } 2117 }
@@ -2604,7 +2599,7 @@ static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2604 case SIOCGPC300UTILSTATS: 2599 case SIOCGPC300UTILSTATS:
2605 { 2600 {
2606 if (!arg) { /* clear statistics */ 2601 if (!arg) { /* clear statistics */
2607 memset(hdlc_stats(dev), 0, sizeof(struct net_device_stats)); 2602 memset(&dev->stats, 0, sizeof(dev->stats));
2608 if (card->hw.type == PC300_TE) { 2603 if (card->hw.type == PC300_TE) {
2609 memset(&chan->falc, 0, sizeof(falc_t)); 2604 memset(&chan->falc, 0, sizeof(falc_t));
2610 } 2605 }
@@ -2615,8 +2610,8 @@ static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2615 pc300stats.hw_type = card->hw.type; 2610 pc300stats.hw_type = card->hw.type;
2616 pc300stats.line_on = card->chan[ch].d.line_on; 2611 pc300stats.line_on = card->chan[ch].d.line_on;
2617 pc300stats.line_off = card->chan[ch].d.line_off; 2612 pc300stats.line_off = card->chan[ch].d.line_off;
2618 memcpy(&pc300stats.gen_stats, hdlc_stats(dev), 2613 memcpy(&pc300stats.gen_stats, &dev->stats,
2619 sizeof(struct net_device_stats)); 2614 sizeof(dev->stats));
2620 if (card->hw.type == PC300_TE) 2615 if (card->hw.type == PC300_TE)
2621 memcpy(&pc300stats.te_stats,&chan->falc,sizeof(falc_t)); 2616 memcpy(&pc300stats.te_stats,&chan->falc,sizeof(falc_t));
2622 if (copy_to_user(arg, &pc300stats, sizeof(pc300stats_t))) 2617 if (copy_to_user(arg, &pc300stats, sizeof(pc300stats_t)))
@@ -2823,11 +2818,6 @@ static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2823 } 2818 }
2824} 2819}
2825 2820
2826static struct net_device_stats *cpc_get_stats(struct net_device *dev)
2827{
2828 return hdlc_stats(dev);
2829}
2830
2831static int clock_rate_calc(uclong rate, uclong clock, int *br_io) 2821static int clock_rate_calc(uclong rate, uclong clock, int *br_io)
2832{ 2822{
2833 int br, tc; 2823 int br, tc;
@@ -3394,7 +3384,6 @@ static void cpc_init_card(pc300_t * card)
3394 dev->stop = cpc_close; 3384 dev->stop = cpc_close;
3395 dev->tx_timeout = cpc_tx_timeout; 3385 dev->tx_timeout = cpc_tx_timeout;
3396 dev->watchdog_timeo = PC300_TX_TIMEOUT; 3386 dev->watchdog_timeo = PC300_TX_TIMEOUT;
3397 dev->get_stats = cpc_get_stats;
3398 dev->set_multicast_list = NULL; 3387 dev->set_multicast_list = NULL;
3399 dev->set_mac_address = NULL; 3388 dev->set_mac_address = NULL;
3400 dev->change_mtu = cpc_change_mtu; 3389 dev->change_mtu = cpc_change_mtu;
diff --git a/drivers/net/wan/pc300_tty.c b/drivers/net/wan/pc300_tty.c
index c2c10c632260..4518d0aa2480 100644
--- a/drivers/net/wan/pc300_tty.c
+++ b/drivers/net/wan/pc300_tty.c
@@ -458,7 +458,7 @@ static int cpc_tty_write(struct tty_struct *tty, const unsigned char *buf, int c
458 CPC_TTY_DBG("%s: cpc_tty_write data len=%i\n",cpc_tty->name,count); 458 CPC_TTY_DBG("%s: cpc_tty_write data len=%i\n",cpc_tty->name,count);
459 459
460 pc300chan = (pc300ch_t *)((pc300dev_t*)cpc_tty->pc300dev)->chan; 460 pc300chan = (pc300ch_t *)((pc300dev_t*)cpc_tty->pc300dev)->chan;
461 stats = hdlc_stats(((pc300dev_t*)cpc_tty->pc300dev)->dev); 461 stats = &cpc_tty->pc300dev->dev->stats;
462 card = (pc300_t *) pc300chan->card; 462 card = (pc300_t *) pc300chan->card;
463 ch = pc300chan->channel; 463 ch = pc300chan->channel;
464 464
@@ -743,7 +743,7 @@ void cpc_tty_receive(pc300dev_t *pc300dev)
743 pc300_t *card = (pc300_t *)pc300chan->card; 743 pc300_t *card = (pc300_t *)pc300chan->card;
744 int ch = pc300chan->channel; 744 int ch = pc300chan->channel;
745 volatile pcsca_bd_t __iomem * ptdescr; 745 volatile pcsca_bd_t __iomem * ptdescr;
746 struct net_device_stats *stats = hdlc_stats(pc300dev->dev); 746 struct net_device_stats *stats = &pc300dev->dev->stats;
747 int rx_len, rx_aux; 747 int rx_len, rx_aux;
748 volatile unsigned char status; 748 volatile unsigned char status;
749 unsigned short first_bd = pc300chan->rx_first_bd; 749 unsigned short first_bd = pc300chan->rx_first_bd;
@@ -917,7 +917,7 @@ static int cpc_tty_send_to_card(pc300dev_t *dev,void* buf, int len)
917 pc300ch_t *chan = (pc300ch_t *)dev->chan; 917 pc300ch_t *chan = (pc300ch_t *)dev->chan;
918 pc300_t *card = (pc300_t *)chan->card; 918 pc300_t *card = (pc300_t *)chan->card;
919 int ch = chan->channel; 919 int ch = chan->channel;
920 struct net_device_stats *stats = hdlc_stats(dev->dev); 920 struct net_device_stats *stats = &dev->dev->stats;
921 unsigned long flags; 921 unsigned long flags;
922 volatile pcsca_bd_t __iomem *ptdescr; 922 volatile pcsca_bd_t __iomem *ptdescr;
923 int i, nchar; 923 int i, nchar;
diff --git a/drivers/net/wan/wanxl.c b/drivers/net/wan/wanxl.c
index d4aab8a28b61..a8a5ca0ee6c2 100644
--- a/drivers/net/wan/wanxl.c
+++ b/drivers/net/wan/wanxl.c
@@ -161,7 +161,6 @@ static inline void wanxl_cable_intr(port_t *port)
161static inline void wanxl_tx_intr(port_t *port) 161static inline void wanxl_tx_intr(port_t *port)
162{ 162{
163 struct net_device *dev = port->dev; 163 struct net_device *dev = port->dev;
164 struct net_device_stats *stats = hdlc_stats(dev);
165 while (1) { 164 while (1) {
166 desc_t *desc = &get_status(port)->tx_descs[port->tx_in]; 165 desc_t *desc = &get_status(port)->tx_descs[port->tx_in];
167 struct sk_buff *skb = port->tx_skbs[port->tx_in]; 166 struct sk_buff *skb = port->tx_skbs[port->tx_in];
@@ -173,13 +172,13 @@ static inline void wanxl_tx_intr(port_t *port)
173 return; 172 return;
174 173
175 case PACKET_UNDERRUN: 174 case PACKET_UNDERRUN:
176 stats->tx_errors++; 175 dev->stats.tx_errors++;
177 stats->tx_fifo_errors++; 176 dev->stats.tx_fifo_errors++;
178 break; 177 break;
179 178
180 default: 179 default:
181 stats->tx_packets++; 180 dev->stats.tx_packets++;
182 stats->tx_bytes += skb->len; 181 dev->stats.tx_bytes += skb->len;
183 } 182 }
184 desc->stat = PACKET_EMPTY; /* Free descriptor */ 183 desc->stat = PACKET_EMPTY; /* Free descriptor */
185 pci_unmap_single(port->card->pdev, desc->address, skb->len, 184 pci_unmap_single(port->card->pdev, desc->address, skb->len,
@@ -205,10 +204,9 @@ static inline void wanxl_rx_intr(card_t *card)
205 port_t *port = &card->ports[desc->stat & 204 port_t *port = &card->ports[desc->stat &
206 PACKET_PORT_MASK]; 205 PACKET_PORT_MASK];
207 struct net_device *dev = port->dev; 206 struct net_device *dev = port->dev;
208 struct net_device_stats *stats = hdlc_stats(dev);
209 207
210 if (!skb) 208 if (!skb)
211 stats->rx_dropped++; 209 dev->stats.rx_dropped++;
212 else { 210 else {
213 pci_unmap_single(card->pdev, desc->address, 211 pci_unmap_single(card->pdev, desc->address,
214 BUFFER_LENGTH, 212 BUFFER_LENGTH,
@@ -220,8 +218,8 @@ static inline void wanxl_rx_intr(card_t *card)
220 skb->len); 218 skb->len);
221 debug_frame(skb); 219 debug_frame(skb);
222#endif 220#endif
223 stats->rx_packets++; 221 dev->stats.rx_packets++;
224 stats->rx_bytes += skb->len; 222 dev->stats.rx_bytes += skb->len;
225 dev->last_rx = jiffies; 223 dev->last_rx = jiffies;
226 skb->protocol = hdlc_type_trans(skb, dev); 224 skb->protocol = hdlc_type_trans(skb, dev);
227 netif_rx(skb); 225 netif_rx(skb);
@@ -468,13 +466,13 @@ static int wanxl_close(struct net_device *dev)
468 466
469static struct net_device_stats *wanxl_get_stats(struct net_device *dev) 467static struct net_device_stats *wanxl_get_stats(struct net_device *dev)
470{ 468{
471 struct net_device_stats *stats = hdlc_stats(dev);
472 port_t *port = dev_to_port(dev); 469 port_t *port = dev_to_port(dev);
473 470
474 stats->rx_over_errors = get_status(port)->rx_overruns; 471 dev->stats.rx_over_errors = get_status(port)->rx_overruns;
475 stats->rx_frame_errors = get_status(port)->rx_frame_errors; 472 dev->stats.rx_frame_errors = get_status(port)->rx_frame_errors;
476 stats->rx_errors = stats->rx_over_errors + stats->rx_frame_errors; 473 dev->stats.rx_errors = dev->stats.rx_over_errors +
477 return stats; 474 dev->stats.rx_frame_errors;
475 return &dev->stats;
478} 476}
479 477
480 478