diff options
author | Stephen Hemminger <shemminger@vyatta.com> | 2009-01-06 13:40:43 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-01-06 13:40:43 -0500 |
commit | af0490810cfa159b4894ddecfc5eb2e4432fb976 (patch) | |
tree | 7c5074c11633b5c9cfa1489859d015974be5fe32 | |
parent | 46377bb311a7682f6240c954c48e81a1e4f51e66 (diff) |
irda: convert to internal stats
Convert IRDA drivers to use already existing net_device_stats structure
in network device. This is a pre-cursor to conversion to net_device
ops. Compile tested only.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
26 files changed, 230 insertions, 391 deletions
diff --git a/drivers/net/irda/ali-ircc.c b/drivers/net/irda/ali-ircc.c index 3c58e67ef1e4..17779f9bffc4 100644 --- a/drivers/net/irda/ali-ircc.c +++ b/drivers/net/irda/ali-ircc.c | |||
@@ -109,7 +109,6 @@ static int ali_ircc_net_open(struct net_device *dev); | |||
109 | static int ali_ircc_net_close(struct net_device *dev); | 109 | static int ali_ircc_net_close(struct net_device *dev); |
110 | static int ali_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); | 110 | static int ali_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); |
111 | static void ali_ircc_change_speed(struct ali_ircc_cb *self, __u32 baud); | 111 | static void ali_ircc_change_speed(struct ali_ircc_cb *self, __u32 baud); |
112 | static struct net_device_stats *ali_ircc_net_get_stats(struct net_device *dev); | ||
113 | 112 | ||
114 | /* SIR function */ | 113 | /* SIR function */ |
115 | static int ali_ircc_sir_hard_xmit(struct sk_buff *skb, struct net_device *dev); | 114 | static int ali_ircc_sir_hard_xmit(struct sk_buff *skb, struct net_device *dev); |
@@ -366,7 +365,6 @@ static int ali_ircc_open(int i, chipio_t *info) | |||
366 | dev->open = ali_ircc_net_open; | 365 | dev->open = ali_ircc_net_open; |
367 | dev->stop = ali_ircc_net_close; | 366 | dev->stop = ali_ircc_net_close; |
368 | dev->do_ioctl = ali_ircc_net_ioctl; | 367 | dev->do_ioctl = ali_ircc_net_ioctl; |
369 | dev->get_stats = ali_ircc_net_get_stats; | ||
370 | 368 | ||
371 | err = register_netdev(dev); | 369 | err = register_netdev(dev); |
372 | if (err) { | 370 | if (err) { |
@@ -876,7 +874,7 @@ static void ali_ircc_sir_receive(struct ali_ircc_cb *self) | |||
876 | * async_unwrap_char will deliver all found frames | 874 | * async_unwrap_char will deliver all found frames |
877 | */ | 875 | */ |
878 | do { | 876 | do { |
879 | async_unwrap_char(self->netdev, &self->stats, &self->rx_buff, | 877 | async_unwrap_char(self->netdev, &self->netdev->stats, &self->rx_buff, |
880 | inb(iobase+UART_RX)); | 878 | inb(iobase+UART_RX)); |
881 | 879 | ||
882 | /* Make sure we don't stay here too long */ | 880 | /* Make sure we don't stay here too long */ |
@@ -943,7 +941,7 @@ static void ali_ircc_sir_write_wakeup(struct ali_ircc_cb *self) | |||
943 | netif_wake_queue(self->netdev); | 941 | netif_wake_queue(self->netdev); |
944 | } | 942 | } |
945 | 943 | ||
946 | self->stats.tx_packets++; | 944 | self->netdev->stats.tx_packets++; |
947 | 945 | ||
948 | /* Turn on receive interrupts */ | 946 | /* Turn on receive interrupts */ |
949 | outb(UART_IER_RDI, iobase+UART_IER); | 947 | outb(UART_IER_RDI, iobase+UART_IER); |
@@ -1467,7 +1465,7 @@ static int ali_ircc_fir_hard_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1467 | self->tx_fifo.queue[self->tx_fifo.free].len = skb->len; | 1465 | self->tx_fifo.queue[self->tx_fifo.free].len = skb->len; |
1468 | self->tx_fifo.tail += skb->len; | 1466 | self->tx_fifo.tail += skb->len; |
1469 | 1467 | ||
1470 | self->stats.tx_bytes += skb->len; | 1468 | dev->stats.tx_bytes += skb->len; |
1471 | 1469 | ||
1472 | skb_copy_from_linear_data(skb, self->tx_fifo.queue[self->tx_fifo.free].start, | 1470 | skb_copy_from_linear_data(skb, self->tx_fifo.queue[self->tx_fifo.free].start, |
1473 | skb->len); | 1471 | skb->len); |
@@ -1661,12 +1659,12 @@ static int ali_ircc_dma_xmit_complete(struct ali_ircc_cb *self) | |||
1661 | 1659 | ||
1662 | { | 1660 | { |
1663 | IRDA_ERROR("%s(), ********* LSR_FRAME_ABORT *********\n", __func__); | 1661 | IRDA_ERROR("%s(), ********* LSR_FRAME_ABORT *********\n", __func__); |
1664 | self->stats.tx_errors++; | 1662 | self->netdev->stats.tx_errors++; |
1665 | self->stats.tx_fifo_errors++; | 1663 | self->netdev->stats.tx_fifo_errors++; |
1666 | } | 1664 | } |
1667 | else | 1665 | else |
1668 | { | 1666 | { |
1669 | self->stats.tx_packets++; | 1667 | self->netdev->stats.tx_packets++; |
1670 | } | 1668 | } |
1671 | 1669 | ||
1672 | /* Check if we need to change the speed */ | 1670 | /* Check if we need to change the speed */ |
@@ -1831,35 +1829,35 @@ static int ali_ircc_dma_receive_complete(struct ali_ircc_cb *self) | |||
1831 | IRDA_DEBUG(0,"%s(), ************* RX Errors ************ \n", __func__ ); | 1829 | IRDA_DEBUG(0,"%s(), ************* RX Errors ************ \n", __func__ ); |
1832 | 1830 | ||
1833 | /* Skip frame */ | 1831 | /* Skip frame */ |
1834 | self->stats.rx_errors++; | 1832 | self->netdev->stats.rx_errors++; |
1835 | 1833 | ||
1836 | self->rx_buff.data += len; | 1834 | self->rx_buff.data += len; |
1837 | 1835 | ||
1838 | if (status & LSR_FIFO_UR) | 1836 | if (status & LSR_FIFO_UR) |
1839 | { | 1837 | { |
1840 | self->stats.rx_frame_errors++; | 1838 | self->netdev->stats.rx_frame_errors++; |
1841 | IRDA_DEBUG(0,"%s(), ************* FIFO Errors ************ \n", __func__ ); | 1839 | IRDA_DEBUG(0,"%s(), ************* FIFO Errors ************ \n", __func__ ); |
1842 | } | 1840 | } |
1843 | if (status & LSR_FRAME_ERROR) | 1841 | if (status & LSR_FRAME_ERROR) |
1844 | { | 1842 | { |
1845 | self->stats.rx_frame_errors++; | 1843 | self->netdev->stats.rx_frame_errors++; |
1846 | IRDA_DEBUG(0,"%s(), ************* FRAME Errors ************ \n", __func__ ); | 1844 | IRDA_DEBUG(0,"%s(), ************* FRAME Errors ************ \n", __func__ ); |
1847 | } | 1845 | } |
1848 | 1846 | ||
1849 | if (status & LSR_CRC_ERROR) | 1847 | if (status & LSR_CRC_ERROR) |
1850 | { | 1848 | { |
1851 | self->stats.rx_crc_errors++; | 1849 | self->netdev->stats.rx_crc_errors++; |
1852 | IRDA_DEBUG(0,"%s(), ************* CRC Errors ************ \n", __func__ ); | 1850 | IRDA_DEBUG(0,"%s(), ************* CRC Errors ************ \n", __func__ ); |
1853 | } | 1851 | } |
1854 | 1852 | ||
1855 | if(self->rcvFramesOverflow) | 1853 | if(self->rcvFramesOverflow) |
1856 | { | 1854 | { |
1857 | self->stats.rx_frame_errors++; | 1855 | self->netdev->stats.rx_frame_errors++; |
1858 | IRDA_DEBUG(0,"%s(), ************* Overran DMA buffer ************ \n", __func__ ); | 1856 | IRDA_DEBUG(0,"%s(), ************* Overran DMA buffer ************ \n", __func__ ); |
1859 | } | 1857 | } |
1860 | if(len == 0) | 1858 | if(len == 0) |
1861 | { | 1859 | { |
1862 | self->stats.rx_frame_errors++; | 1860 | self->netdev->stats.rx_frame_errors++; |
1863 | IRDA_DEBUG(0,"%s(), ********** Receive Frame Size = 0 ********* \n", __func__ ); | 1861 | IRDA_DEBUG(0,"%s(), ********** Receive Frame Size = 0 ********* \n", __func__ ); |
1864 | } | 1862 | } |
1865 | } | 1863 | } |
@@ -1910,7 +1908,7 @@ static int ali_ircc_dma_receive_complete(struct ali_ircc_cb *self) | |||
1910 | IRDA_WARNING("%s(), memory squeeze, " | 1908 | IRDA_WARNING("%s(), memory squeeze, " |
1911 | "dropping frame.\n", | 1909 | "dropping frame.\n", |
1912 | __func__); | 1910 | __func__); |
1913 | self->stats.rx_dropped++; | 1911 | self->netdev->stats.rx_dropped++; |
1914 | 1912 | ||
1915 | return FALSE; | 1913 | return FALSE; |
1916 | } | 1914 | } |
@@ -1924,8 +1922,8 @@ static int ali_ircc_dma_receive_complete(struct ali_ircc_cb *self) | |||
1924 | 1922 | ||
1925 | /* Move to next frame */ | 1923 | /* Move to next frame */ |
1926 | self->rx_buff.data += len; | 1924 | self->rx_buff.data += len; |
1927 | self->stats.rx_bytes += len; | 1925 | self->netdev->stats.rx_bytes += len; |
1928 | self->stats.rx_packets++; | 1926 | self->netdev->stats.rx_packets++; |
1929 | 1927 | ||
1930 | skb->dev = self->netdev; | 1928 | skb->dev = self->netdev; |
1931 | skb_reset_mac_header(skb); | 1929 | skb_reset_mac_header(skb); |
@@ -1994,7 +1992,7 @@ static int ali_ircc_sir_hard_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1994 | self->tx_buff.len = async_wrap_skb(skb, self->tx_buff.data, | 1992 | self->tx_buff.len = async_wrap_skb(skb, self->tx_buff.data, |
1995 | self->tx_buff.truesize); | 1993 | self->tx_buff.truesize); |
1996 | 1994 | ||
1997 | self->stats.tx_bytes += self->tx_buff.len; | 1995 | self->netdev->stats.tx_bytes += self->tx_buff.len; |
1998 | 1996 | ||
1999 | /* Turn on transmit finished interrupt. Will fire immediately! */ | 1997 | /* Turn on transmit finished interrupt. Will fire immediately! */ |
2000 | outb(UART_IER_THRI, iobase+UART_IER); | 1998 | outb(UART_IER_THRI, iobase+UART_IER); |
@@ -2111,17 +2109,6 @@ static int ali_ircc_is_receiving(struct ali_ircc_cb *self) | |||
2111 | return status; | 2109 | return status; |
2112 | } | 2110 | } |
2113 | 2111 | ||
2114 | static struct net_device_stats *ali_ircc_net_get_stats(struct net_device *dev) | ||
2115 | { | ||
2116 | struct ali_ircc_cb *self = netdev_priv(dev); | ||
2117 | |||
2118 | IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __func__ ); | ||
2119 | |||
2120 | IRDA_DEBUG(2, "%s(), ----------------- End ------------------\n", __func__ ); | ||
2121 | |||
2122 | return &self->stats; | ||
2123 | } | ||
2124 | |||
2125 | static int ali_ircc_suspend(struct platform_device *dev, pm_message_t state) | 2112 | static int ali_ircc_suspend(struct platform_device *dev, pm_message_t state) |
2126 | { | 2113 | { |
2127 | struct ali_ircc_cb *self = platform_get_drvdata(dev); | 2114 | struct ali_ircc_cb *self = platform_get_drvdata(dev); |
diff --git a/drivers/net/irda/ali-ircc.h b/drivers/net/irda/ali-ircc.h index ed35d99763d5..0c8edb41bd0a 100644 --- a/drivers/net/irda/ali-ircc.h +++ b/drivers/net/irda/ali-ircc.h | |||
@@ -191,7 +191,6 @@ struct ali_ircc_cb { | |||
191 | struct tx_fifo tx_fifo; /* Info about frames to be transmitted */ | 191 | struct tx_fifo tx_fifo; /* Info about frames to be transmitted */ |
192 | 192 | ||
193 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ | 193 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ |
194 | struct net_device_stats stats; | ||
195 | 194 | ||
196 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 195 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
197 | struct qos_info qos; /* QoS capabilities for this device */ | 196 | struct qos_info qos; /* QoS capabilities for this device */ |
diff --git a/drivers/net/irda/au1000_ircc.h b/drivers/net/irda/au1000_ircc.h index b4763f24dded..c072c09a8d91 100644 --- a/drivers/net/irda/au1000_ircc.h +++ b/drivers/net/irda/au1000_ircc.h | |||
@@ -107,7 +107,6 @@ struct au1k_private { | |||
107 | iobuff_t rx_buff; | 107 | iobuff_t rx_buff; |
108 | 108 | ||
109 | struct net_device *netdev; | 109 | struct net_device *netdev; |
110 | struct net_device_stats stats; | ||
111 | 110 | ||
112 | struct timeval stamp; | 111 | struct timeval stamp; |
113 | struct timeval now; | 112 | struct timeval now; |
diff --git a/drivers/net/irda/au1k_ir.c b/drivers/net/irda/au1k_ir.c index 6c4b53ffbcac..75a1d0a86dee 100644 --- a/drivers/net/irda/au1k_ir.c +++ b/drivers/net/irda/au1k_ir.c | |||
@@ -53,7 +53,6 @@ static int au1k_irda_hard_xmit(struct sk_buff *, struct net_device *); | |||
53 | static int au1k_irda_rx(struct net_device *); | 53 | static int au1k_irda_rx(struct net_device *); |
54 | static void au1k_irda_interrupt(int, void *); | 54 | static void au1k_irda_interrupt(int, void *); |
55 | static void au1k_tx_timeout(struct net_device *); | 55 | static void au1k_tx_timeout(struct net_device *); |
56 | static struct net_device_stats *au1k_irda_stats(struct net_device *); | ||
57 | static int au1k_irda_ioctl(struct net_device *, struct ifreq *, int); | 56 | static int au1k_irda_ioctl(struct net_device *, struct ifreq *, int); |
58 | static int au1k_irda_set_speed(struct net_device *dev, int speed); | 57 | static int au1k_irda_set_speed(struct net_device *dev, int speed); |
59 | 58 | ||
@@ -213,7 +212,6 @@ static int au1k_irda_net_init(struct net_device *dev) | |||
213 | dev->open = au1k_irda_start; | 212 | dev->open = au1k_irda_start; |
214 | dev->hard_start_xmit = au1k_irda_hard_xmit; | 213 | dev->hard_start_xmit = au1k_irda_hard_xmit; |
215 | dev->stop = au1k_irda_stop; | 214 | dev->stop = au1k_irda_stop; |
216 | dev->get_stats = au1k_irda_stats; | ||
217 | dev->do_ioctl = au1k_irda_ioctl; | 215 | dev->do_ioctl = au1k_irda_ioctl; |
218 | dev->tx_timeout = au1k_tx_timeout; | 216 | dev->tx_timeout = au1k_tx_timeout; |
219 | 217 | ||
@@ -832,13 +830,6 @@ au1k_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd) | |||
832 | return ret; | 830 | return ret; |
833 | } | 831 | } |
834 | 832 | ||
835 | |||
836 | static struct net_device_stats *au1k_irda_stats(struct net_device *dev) | ||
837 | { | ||
838 | struct au1k_private *aup = netdev_priv(dev); | ||
839 | return &aup->stats; | ||
840 | } | ||
841 | |||
842 | MODULE_AUTHOR("Pete Popov <ppopov@mvista.com>"); | 833 | MODULE_AUTHOR("Pete Popov <ppopov@mvista.com>"); |
843 | MODULE_DESCRIPTION("Au1000 IrDA Device Driver"); | 834 | MODULE_DESCRIPTION("Au1000 IrDA Device Driver"); |
844 | 835 | ||
diff --git a/drivers/net/irda/donauboe.h b/drivers/net/irda/donauboe.h index 1e67720f1066..0dbd1932b72f 100644 --- a/drivers/net/irda/donauboe.h +++ b/drivers/net/irda/donauboe.h | |||
@@ -308,7 +308,6 @@ struct OboeRing | |||
308 | struct toshoboe_cb | 308 | struct toshoboe_cb |
309 | { | 309 | { |
310 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ | 310 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ |
311 | struct net_device_stats stats; | ||
312 | struct tty_driver ttydev; | 311 | struct tty_driver ttydev; |
313 | 312 | ||
314 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 313 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c index 205e4e825a97..29118f58a141 100644 --- a/drivers/net/irda/irda-usb.c +++ b/drivers/net/irda/irda-usb.c | |||
@@ -122,7 +122,6 @@ static int irda_usb_net_open(struct net_device *dev); | |||
122 | static int irda_usb_net_close(struct net_device *dev); | 122 | static int irda_usb_net_close(struct net_device *dev); |
123 | static int irda_usb_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); | 123 | static int irda_usb_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); |
124 | static void irda_usb_net_timeout(struct net_device *dev); | 124 | static void irda_usb_net_timeout(struct net_device *dev); |
125 | static struct net_device_stats *irda_usb_net_get_stats(struct net_device *dev); | ||
126 | 125 | ||
127 | /************************ TRANSMIT ROUTINES ************************/ | 126 | /************************ TRANSMIT ROUTINES ************************/ |
128 | /* | 127 | /* |
@@ -525,13 +524,13 @@ static int irda_usb_hard_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
525 | /* Ask USB to send the packet - Irq disabled -> GFP_ATOMIC */ | 524 | /* Ask USB to send the packet - Irq disabled -> GFP_ATOMIC */ |
526 | if ((res = usb_submit_urb(urb, GFP_ATOMIC))) { | 525 | if ((res = usb_submit_urb(urb, GFP_ATOMIC))) { |
527 | IRDA_WARNING("%s(), failed Tx URB\n", __func__); | 526 | IRDA_WARNING("%s(), failed Tx URB\n", __func__); |
528 | self->stats.tx_errors++; | 527 | netdev->stats.tx_errors++; |
529 | /* Let USB recover : We will catch that in the watchdog */ | 528 | /* Let USB recover : We will catch that in the watchdog */ |
530 | /*netif_start_queue(netdev);*/ | 529 | /*netif_start_queue(netdev);*/ |
531 | } else { | 530 | } else { |
532 | /* Increment packet stats */ | 531 | /* Increment packet stats */ |
533 | self->stats.tx_packets++; | 532 | netdev->stats.tx_packets++; |
534 | self->stats.tx_bytes += skb->len; | 533 | netdev->stats.tx_bytes += skb->len; |
535 | 534 | ||
536 | netdev->trans_start = jiffies; | 535 | netdev->trans_start = jiffies; |
537 | } | 536 | } |
@@ -677,7 +676,7 @@ static void irda_usb_net_timeout(struct net_device *netdev) | |||
677 | IRDA_DEBUG(0, "%s: Tx timed out, urb->status=%d, urb->transfer_flags=0x%04X\n", netdev->name, urb->status, urb->transfer_flags); | 676 | IRDA_DEBUG(0, "%s: Tx timed out, urb->status=%d, urb->transfer_flags=0x%04X\n", netdev->name, urb->status, urb->transfer_flags); |
678 | 677 | ||
679 | /* Increase error count */ | 678 | /* Increase error count */ |
680 | self->stats.tx_errors++; | 679 | netdev->stats.tx_errors++; |
681 | 680 | ||
682 | #ifdef IU_BUG_KICK_TIMEOUT | 681 | #ifdef IU_BUG_KICK_TIMEOUT |
683 | /* Can't be a bad idea to reset the speed ;-) - Jean II */ | 682 | /* Can't be a bad idea to reset the speed ;-) - Jean II */ |
@@ -826,7 +825,7 @@ static void irda_usb_receive(struct urb *urb) | |||
826 | if (urb->status != 0) { | 825 | if (urb->status != 0) { |
827 | switch (urb->status) { | 826 | switch (urb->status) { |
828 | case -EILSEQ: | 827 | case -EILSEQ: |
829 | self->stats.rx_crc_errors++; | 828 | self->netdev->stats.rx_crc_errors++; |
830 | /* Also precursor to a hot-unplug on UHCI. */ | 829 | /* Also precursor to a hot-unplug on UHCI. */ |
831 | /* Fallthrough... */ | 830 | /* Fallthrough... */ |
832 | case -ECONNRESET: | 831 | case -ECONNRESET: |
@@ -839,7 +838,7 @@ static void irda_usb_receive(struct urb *urb) | |||
839 | case -ETIME: | 838 | case -ETIME: |
840 | /* Usually precursor to a hot-unplug on OHCI. */ | 839 | /* Usually precursor to a hot-unplug on OHCI. */ |
841 | default: | 840 | default: |
842 | self->stats.rx_errors++; | 841 | self->netdev->stats.rx_errors++; |
843 | IRDA_DEBUG(0, "%s(), RX status %d, transfer_flags 0x%04X \n", __func__, urb->status, urb->transfer_flags); | 842 | IRDA_DEBUG(0, "%s(), RX status %d, transfer_flags 0x%04X \n", __func__, urb->status, urb->transfer_flags); |
844 | break; | 843 | break; |
845 | } | 844 | } |
@@ -890,7 +889,7 @@ static void irda_usb_receive(struct urb *urb) | |||
890 | IRDA_SKB_MAX_MTU); | 889 | IRDA_SKB_MAX_MTU); |
891 | 890 | ||
892 | if (!newskb) { | 891 | if (!newskb) { |
893 | self->stats.rx_dropped++; | 892 | self->netdev->stats.rx_dropped++; |
894 | /* We could deliver the current skb, but this would stall | 893 | /* We could deliver the current skb, but this would stall |
895 | * the Rx path. Better drop the packet... Jean II */ | 894 | * the Rx path. Better drop the packet... Jean II */ |
896 | goto done; | 895 | goto done; |
@@ -927,8 +926,8 @@ static void irda_usb_receive(struct urb *urb) | |||
927 | netif_rx(dataskb); | 926 | netif_rx(dataskb); |
928 | 927 | ||
929 | /* Keep stats up to date */ | 928 | /* Keep stats up to date */ |
930 | self->stats.rx_bytes += len; | 929 | self->netdev->stats.rx_bytes += len; |
931 | self->stats.rx_packets++; | 930 | self->netdev->stats.rx_packets++; |
932 | 931 | ||
933 | done: | 932 | done: |
934 | /* Note : at this point, the URB we've just received (urb) | 933 | /* Note : at this point, the URB we've just received (urb) |
@@ -1342,14 +1341,6 @@ static int irda_usb_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | |||
1342 | } | 1341 | } |
1343 | 1342 | ||
1344 | /*------------------------------------------------------------------*/ | 1343 | /*------------------------------------------------------------------*/ |
1345 | /* | ||
1346 | * Get device stats (for /proc/net/dev and ifconfig) | ||
1347 | */ | ||
1348 | static struct net_device_stats *irda_usb_net_get_stats(struct net_device *dev) | ||
1349 | { | ||
1350 | struct irda_usb_cb *self = netdev_priv(dev); | ||
1351 | return &self->stats; | ||
1352 | } | ||
1353 | 1344 | ||
1354 | /********************* IRDA CONFIG SUBROUTINES *********************/ | 1345 | /********************* IRDA CONFIG SUBROUTINES *********************/ |
1355 | /* | 1346 | /* |
@@ -1428,7 +1419,6 @@ static inline int irda_usb_open(struct irda_usb_cb *self) | |||
1428 | netdev->watchdog_timeo = 250*HZ/1000; /* 250 ms > USB timeout */ | 1419 | netdev->watchdog_timeo = 250*HZ/1000; /* 250 ms > USB timeout */ |
1429 | netdev->open = irda_usb_net_open; | 1420 | netdev->open = irda_usb_net_open; |
1430 | netdev->stop = irda_usb_net_close; | 1421 | netdev->stop = irda_usb_net_close; |
1431 | netdev->get_stats = irda_usb_net_get_stats; | ||
1432 | netdev->do_ioctl = irda_usb_net_ioctl; | 1422 | netdev->do_ioctl = irda_usb_net_ioctl; |
1433 | 1423 | ||
1434 | return register_netdev(netdev); | 1424 | return register_netdev(netdev); |
diff --git a/drivers/net/irda/irda-usb.h b/drivers/net/irda/irda-usb.h index a0ca9c1fe196..ac0443d52e50 100644 --- a/drivers/net/irda/irda-usb.h +++ b/drivers/net/irda/irda-usb.h | |||
@@ -152,7 +152,6 @@ struct irda_usb_cb { | |||
152 | struct urb *speed_urb; /* URB used to send speed commands */ | 152 | struct urb *speed_urb; /* URB used to send speed commands */ |
153 | 153 | ||
154 | struct net_device *netdev; /* Yes! we are some kind of netdev. */ | 154 | struct net_device *netdev; /* Yes! we are some kind of netdev. */ |
155 | struct net_device_stats stats; | ||
156 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 155 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
157 | struct qos_info qos; | 156 | struct qos_info qos; |
158 | char *speed_buff; /* Buffer for speed changes */ | 157 | char *speed_buff; /* Buffer for speed changes */ |
diff --git a/drivers/net/irda/kingsun-sir.c b/drivers/net/irda/kingsun-sir.c index c747c874d44d..b4a61717254a 100644 --- a/drivers/net/irda/kingsun-sir.c +++ b/drivers/net/irda/kingsun-sir.c | |||
@@ -105,7 +105,7 @@ struct kingsun_cb { | |||
105 | struct usb_device *usbdev; /* init: probe_irda */ | 105 | struct usb_device *usbdev; /* init: probe_irda */ |
106 | struct net_device *netdev; /* network layer */ | 106 | struct net_device *netdev; /* network layer */ |
107 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 107 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
108 | struct net_device_stats stats; /* network statistics */ | 108 | |
109 | struct qos_info qos; | 109 | struct qos_info qos; |
110 | 110 | ||
111 | __u8 *in_buf; /* receive buffer */ | 111 | __u8 *in_buf; /* receive buffer */ |
@@ -186,12 +186,12 @@ static int kingsun_hard_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
186 | case -EPIPE: | 186 | case -EPIPE: |
187 | break; | 187 | break; |
188 | default: | 188 | default: |
189 | kingsun->stats.tx_errors++; | 189 | netdev->stats.tx_errors++; |
190 | netif_start_queue(netdev); | 190 | netif_start_queue(netdev); |
191 | } | 191 | } |
192 | } else { | 192 | } else { |
193 | kingsun->stats.tx_packets++; | 193 | netdev->stats.tx_packets++; |
194 | kingsun->stats.tx_bytes += skb->len; | 194 | netdev->stats.tx_bytes += skb->len; |
195 | } | 195 | } |
196 | 196 | ||
197 | dev_kfree_skb(skb); | 197 | dev_kfree_skb(skb); |
@@ -232,7 +232,7 @@ static void kingsun_rcv_irq(struct urb *urb) | |||
232 | if (bytes[0] >= 1 && bytes[0] < kingsun->max_rx) { | 232 | if (bytes[0] >= 1 && bytes[0] < kingsun->max_rx) { |
233 | for (i = 1; i <= bytes[0]; i++) { | 233 | for (i = 1; i <= bytes[0]; i++) { |
234 | async_unwrap_char(kingsun->netdev, | 234 | async_unwrap_char(kingsun->netdev, |
235 | &kingsun->stats, | 235 | &kingsun->netdev->stats, |
236 | &kingsun->rx_buff, bytes[i]); | 236 | &kingsun->rx_buff, bytes[i]); |
237 | } | 237 | } |
238 | do_gettimeofday(&kingsun->rx_time); | 238 | do_gettimeofday(&kingsun->rx_time); |
@@ -418,15 +418,6 @@ static int kingsun_net_ioctl(struct net_device *netdev, struct ifreq *rq, | |||
418 | return ret; | 418 | return ret; |
419 | } | 419 | } |
420 | 420 | ||
421 | /* | ||
422 | * Get device stats (for /proc/net/dev and ifconfig) | ||
423 | */ | ||
424 | static struct net_device_stats * | ||
425 | kingsun_net_get_stats(struct net_device *netdev) | ||
426 | { | ||
427 | struct kingsun_cb *kingsun = netdev_priv(netdev); | ||
428 | return &kingsun->stats; | ||
429 | } | ||
430 | 421 | ||
431 | /* | 422 | /* |
432 | * This routine is called by the USB subsystem for each new device | 423 | * This routine is called by the USB subsystem for each new device |
@@ -532,7 +523,6 @@ static int kingsun_probe(struct usb_interface *intf, | |||
532 | net->hard_start_xmit = kingsun_hard_xmit; | 523 | net->hard_start_xmit = kingsun_hard_xmit; |
533 | net->open = kingsun_net_open; | 524 | net->open = kingsun_net_open; |
534 | net->stop = kingsun_net_close; | 525 | net->stop = kingsun_net_close; |
535 | net->get_stats = kingsun_net_get_stats; | ||
536 | net->do_ioctl = kingsun_net_ioctl; | 526 | net->do_ioctl = kingsun_net_ioctl; |
537 | 527 | ||
538 | ret = register_netdev(net); | 528 | ret = register_netdev(net); |
diff --git a/drivers/net/irda/ks959-sir.c b/drivers/net/irda/ks959-sir.c index 600d96f9cdb7..55322fb92cf1 100644 --- a/drivers/net/irda/ks959-sir.c +++ b/drivers/net/irda/ks959-sir.c | |||
@@ -174,7 +174,7 @@ struct ks959_cb { | |||
174 | struct usb_device *usbdev; /* init: probe_irda */ | 174 | struct usb_device *usbdev; /* init: probe_irda */ |
175 | struct net_device *netdev; /* network layer */ | 175 | struct net_device *netdev; /* network layer */ |
176 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 176 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
177 | struct net_device_stats stats; /* network statistics */ | 177 | |
178 | struct qos_info qos; | 178 | struct qos_info qos; |
179 | 179 | ||
180 | struct usb_ctrlrequest *tx_setuprequest; | 180 | struct usb_ctrlrequest *tx_setuprequest; |
@@ -366,7 +366,7 @@ static void ks959_send_irq(struct urb *urb) | |||
366 | case -EPIPE: | 366 | case -EPIPE: |
367 | break; | 367 | break; |
368 | default: | 368 | default: |
369 | kingsun->stats.tx_errors++; | 369 | netdev->stats.tx_errors++; |
370 | netif_start_queue(netdev); | 370 | netif_start_queue(netdev); |
371 | } | 371 | } |
372 | } | 372 | } |
@@ -416,12 +416,12 @@ static int ks959_hard_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
416 | case -EPIPE: | 416 | case -EPIPE: |
417 | break; | 417 | break; |
418 | default: | 418 | default: |
419 | kingsun->stats.tx_errors++; | 419 | netdev->stats.tx_errors++; |
420 | netif_start_queue(netdev); | 420 | netif_start_queue(netdev); |
421 | } | 421 | } |
422 | } else { | 422 | } else { |
423 | kingsun->stats.tx_packets++; | 423 | netdev->stats.tx_packets++; |
424 | kingsun->stats.tx_bytes += skb->len; | 424 | netdev->stats.tx_bytes += skb->len; |
425 | 425 | ||
426 | } | 426 | } |
427 | 427 | ||
@@ -469,7 +469,7 @@ static void ks959_rcv_irq(struct urb *urb) | |||
469 | */ | 469 | */ |
470 | if (kingsun->rx_variable_xormask != 0) { | 470 | if (kingsun->rx_variable_xormask != 0) { |
471 | async_unwrap_char(kingsun->netdev, | 471 | async_unwrap_char(kingsun->netdev, |
472 | &kingsun->stats, | 472 | &kingsun->netdev->stats, |
473 | &kingsun->rx_unwrap_buff, | 473 | &kingsun->rx_unwrap_buff, |
474 | bytes[i]); | 474 | bytes[i]); |
475 | } | 475 | } |
@@ -669,15 +669,6 @@ static int ks959_net_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd) | |||
669 | } | 669 | } |
670 | 670 | ||
671 | /* | 671 | /* |
672 | * Get device stats (for /proc/net/dev and ifconfig) | ||
673 | */ | ||
674 | static struct net_device_stats *ks959_net_get_stats(struct net_device *netdev) | ||
675 | { | ||
676 | struct ks959_cb *kingsun = netdev_priv(netdev); | ||
677 | return &kingsun->stats; | ||
678 | } | ||
679 | |||
680 | /* | ||
681 | * This routine is called by the USB subsystem for each new device | 672 | * This routine is called by the USB subsystem for each new device |
682 | * in the system. We need to check if the device is ours, and in | 673 | * in the system. We need to check if the device is ours, and in |
683 | * this case start handling it. | 674 | * this case start handling it. |
@@ -792,7 +783,6 @@ static int ks959_probe(struct usb_interface *intf, | |||
792 | net->hard_start_xmit = ks959_hard_xmit; | 783 | net->hard_start_xmit = ks959_hard_xmit; |
793 | net->open = ks959_net_open; | 784 | net->open = ks959_net_open; |
794 | net->stop = ks959_net_close; | 785 | net->stop = ks959_net_close; |
795 | net->get_stats = ks959_net_get_stats; | ||
796 | net->do_ioctl = ks959_net_ioctl; | 786 | net->do_ioctl = ks959_net_ioctl; |
797 | 787 | ||
798 | ret = register_netdev(net); | 788 | ret = register_netdev(net); |
diff --git a/drivers/net/irda/ksdazzle-sir.c b/drivers/net/irda/ksdazzle-sir.c index 0e7f89337b25..5b327b09acd8 100644 --- a/drivers/net/irda/ksdazzle-sir.c +++ b/drivers/net/irda/ksdazzle-sir.c | |||
@@ -140,7 +140,7 @@ struct ksdazzle_cb { | |||
140 | struct usb_device *usbdev; /* init: probe_irda */ | 140 | struct usb_device *usbdev; /* init: probe_irda */ |
141 | struct net_device *netdev; /* network layer */ | 141 | struct net_device *netdev; /* network layer */ |
142 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 142 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
143 | struct net_device_stats stats; /* network statistics */ | 143 | |
144 | struct qos_info qos; | 144 | struct qos_info qos; |
145 | 145 | ||
146 | struct urb *tx_urb; | 146 | struct urb *tx_urb; |
@@ -278,7 +278,7 @@ static void ksdazzle_send_irq(struct urb *urb) | |||
278 | case -EPIPE: | 278 | case -EPIPE: |
279 | break; | 279 | break; |
280 | default: | 280 | default: |
281 | kingsun->stats.tx_errors++; | 281 | netdev->stats.tx_errors++; |
282 | netif_start_queue(netdev); | 282 | netif_start_queue(netdev); |
283 | } | 283 | } |
284 | } | 284 | } |
@@ -329,12 +329,12 @@ static int ksdazzle_hard_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
329 | case -EPIPE: | 329 | case -EPIPE: |
330 | break; | 330 | break; |
331 | default: | 331 | default: |
332 | kingsun->stats.tx_errors++; | 332 | netdev->stats.tx_errors++; |
333 | netif_start_queue(netdev); | 333 | netif_start_queue(netdev); |
334 | } | 334 | } |
335 | } else { | 335 | } else { |
336 | kingsun->stats.tx_packets++; | 336 | netdev->stats.tx_packets++; |
337 | kingsun->stats.tx_bytes += skb->len; | 337 | netdev->stats.tx_bytes += skb->len; |
338 | 338 | ||
339 | } | 339 | } |
340 | 340 | ||
@@ -348,9 +348,10 @@ static int ksdazzle_hard_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
348 | static void ksdazzle_rcv_irq(struct urb *urb) | 348 | static void ksdazzle_rcv_irq(struct urb *urb) |
349 | { | 349 | { |
350 | struct ksdazzle_cb *kingsun = urb->context; | 350 | struct ksdazzle_cb *kingsun = urb->context; |
351 | struct net_device *netdev = kingsun->netdev; | ||
351 | 352 | ||
352 | /* in process of stopping, just drop data */ | 353 | /* in process of stopping, just drop data */ |
353 | if (!netif_running(kingsun->netdev)) { | 354 | if (!netif_running(netdev)) { |
354 | kingsun->receiving = 0; | 355 | kingsun->receiving = 0; |
355 | return; | 356 | return; |
356 | } | 357 | } |
@@ -368,7 +369,7 @@ static void ksdazzle_rcv_irq(struct urb *urb) | |||
368 | unsigned int i; | 369 | unsigned int i; |
369 | 370 | ||
370 | for (i = 0; i < urb->actual_length; i++) { | 371 | for (i = 0; i < urb->actual_length; i++) { |
371 | async_unwrap_char(kingsun->netdev, &kingsun->stats, | 372 | async_unwrap_char(netdev, &netdev->stats, |
372 | &kingsun->rx_unwrap_buff, bytes[i]); | 373 | &kingsun->rx_unwrap_buff, bytes[i]); |
373 | } | 374 | } |
374 | kingsun->receiving = | 375 | kingsun->receiving = |
@@ -562,16 +563,6 @@ static int ksdazzle_net_ioctl(struct net_device *netdev, struct ifreq *rq, | |||
562 | } | 563 | } |
563 | 564 | ||
564 | /* | 565 | /* |
565 | * Get device stats (for /proc/net/dev and ifconfig) | ||
566 | */ | ||
567 | static struct net_device_stats *ksdazzle_net_get_stats(struct net_device | ||
568 | *netdev) | ||
569 | { | ||
570 | struct ksdazzle_cb *kingsun = netdev_priv(netdev); | ||
571 | return &kingsun->stats; | ||
572 | } | ||
573 | |||
574 | /* | ||
575 | * This routine is called by the USB subsystem for each new device | 566 | * This routine is called by the USB subsystem for each new device |
576 | * in the system. We need to check if the device is ours, and in | 567 | * in the system. We need to check if the device is ours, and in |
577 | * this case start handling it. | 568 | * this case start handling it. |
@@ -696,7 +687,6 @@ static int ksdazzle_probe(struct usb_interface *intf, | |||
696 | net->hard_start_xmit = ksdazzle_hard_xmit; | 687 | net->hard_start_xmit = ksdazzle_hard_xmit; |
697 | net->open = ksdazzle_net_open; | 688 | net->open = ksdazzle_net_open; |
698 | net->stop = ksdazzle_net_close; | 689 | net->stop = ksdazzle_net_close; |
699 | net->get_stats = ksdazzle_net_get_stats; | ||
700 | net->do_ioctl = ksdazzle_net_ioctl; | 690 | net->do_ioctl = ksdazzle_net_ioctl; |
701 | 691 | ||
702 | ret = register_netdev(net); | 692 | ret = register_netdev(net); |
diff --git a/drivers/net/irda/mcs7780.c b/drivers/net/irda/mcs7780.c index 904c9610c0dd..7eafdca19f34 100644 --- a/drivers/net/irda/mcs7780.c +++ b/drivers/net/irda/mcs7780.c | |||
@@ -403,8 +403,8 @@ static void mcs_unwrap_mir(struct mcs_cb *mcs, __u8 *buf, int len) | |||
403 | if(unlikely(new_len <= 0)) { | 403 | if(unlikely(new_len <= 0)) { |
404 | IRDA_ERROR("%s short frame length %d\n", | 404 | IRDA_ERROR("%s short frame length %d\n", |
405 | mcs->netdev->name, new_len); | 405 | mcs->netdev->name, new_len); |
406 | ++mcs->stats.rx_errors; | 406 | ++mcs->netdev->stats.rx_errors; |
407 | ++mcs->stats.rx_length_errors; | 407 | ++mcs->netdev->stats.rx_length_errors; |
408 | return; | 408 | return; |
409 | } | 409 | } |
410 | fcs = 0; | 410 | fcs = 0; |
@@ -413,14 +413,14 @@ static void mcs_unwrap_mir(struct mcs_cb *mcs, __u8 *buf, int len) | |||
413 | if(fcs != GOOD_FCS) { | 413 | if(fcs != GOOD_FCS) { |
414 | IRDA_ERROR("crc error calc 0x%x len %d\n", | 414 | IRDA_ERROR("crc error calc 0x%x len %d\n", |
415 | fcs, new_len); | 415 | fcs, new_len); |
416 | mcs->stats.rx_errors++; | 416 | mcs->netdev->stats.rx_errors++; |
417 | mcs->stats.rx_crc_errors++; | 417 | mcs->netdev->stats.rx_crc_errors++; |
418 | return; | 418 | return; |
419 | } | 419 | } |
420 | 420 | ||
421 | skb = dev_alloc_skb(new_len + 1); | 421 | skb = dev_alloc_skb(new_len + 1); |
422 | if(unlikely(!skb)) { | 422 | if(unlikely(!skb)) { |
423 | ++mcs->stats.rx_dropped; | 423 | ++mcs->netdev->stats.rx_dropped; |
424 | return; | 424 | return; |
425 | } | 425 | } |
426 | 426 | ||
@@ -433,8 +433,8 @@ static void mcs_unwrap_mir(struct mcs_cb *mcs, __u8 *buf, int len) | |||
433 | 433 | ||
434 | netif_rx(skb); | 434 | netif_rx(skb); |
435 | 435 | ||
436 | mcs->stats.rx_packets++; | 436 | mcs->netdev->stats.rx_packets++; |
437 | mcs->stats.rx_bytes += new_len; | 437 | mcs->netdev->stats.rx_bytes += new_len; |
438 | 438 | ||
439 | return; | 439 | return; |
440 | } | 440 | } |
@@ -458,22 +458,22 @@ static void mcs_unwrap_fir(struct mcs_cb *mcs, __u8 *buf, int len) | |||
458 | if(unlikely(new_len <= 0)) { | 458 | if(unlikely(new_len <= 0)) { |
459 | IRDA_ERROR("%s short frame length %d\n", | 459 | IRDA_ERROR("%s short frame length %d\n", |
460 | mcs->netdev->name, new_len); | 460 | mcs->netdev->name, new_len); |
461 | ++mcs->stats.rx_errors; | 461 | ++mcs->netdev->stats.rx_errors; |
462 | ++mcs->stats.rx_length_errors; | 462 | ++mcs->netdev->stats.rx_length_errors; |
463 | return; | 463 | return; |
464 | } | 464 | } |
465 | 465 | ||
466 | fcs = ~(crc32_le(~0, buf, new_len)); | 466 | fcs = ~(crc32_le(~0, buf, new_len)); |
467 | if(fcs != get_unaligned_le32(buf + new_len)) { | 467 | if(fcs != get_unaligned_le32(buf + new_len)) { |
468 | IRDA_ERROR("crc error calc 0x%x len %d\n", fcs, new_len); | 468 | IRDA_ERROR("crc error calc 0x%x len %d\n", fcs, new_len); |
469 | mcs->stats.rx_errors++; | 469 | mcs->netdev->stats.rx_errors++; |
470 | mcs->stats.rx_crc_errors++; | 470 | mcs->netdev->stats.rx_crc_errors++; |
471 | return; | 471 | return; |
472 | } | 472 | } |
473 | 473 | ||
474 | skb = dev_alloc_skb(new_len + 1); | 474 | skb = dev_alloc_skb(new_len + 1); |
475 | if(unlikely(!skb)) { | 475 | if(unlikely(!skb)) { |
476 | ++mcs->stats.rx_dropped; | 476 | ++mcs->netdev->stats.rx_dropped; |
477 | return; | 477 | return; |
478 | } | 478 | } |
479 | 479 | ||
@@ -486,8 +486,8 @@ static void mcs_unwrap_fir(struct mcs_cb *mcs, __u8 *buf, int len) | |||
486 | 486 | ||
487 | netif_rx(skb); | 487 | netif_rx(skb); |
488 | 488 | ||
489 | mcs->stats.rx_packets++; | 489 | mcs->netdev->stats.rx_packets++; |
490 | mcs->stats.rx_bytes += new_len; | 490 | mcs->netdev->stats.rx_bytes += new_len; |
491 | 491 | ||
492 | return; | 492 | return; |
493 | } | 493 | } |
@@ -756,14 +756,6 @@ static int mcs_net_open(struct net_device *netdev) | |||
756 | return ret; | 756 | return ret; |
757 | } | 757 | } |
758 | 758 | ||
759 | |||
760 | /* Get device stats for /proc/net/dev and ifconfig */ | ||
761 | static struct net_device_stats *mcs_net_get_stats(struct net_device *netdev) | ||
762 | { | ||
763 | struct mcs_cb *mcs = netdev_priv(netdev); | ||
764 | return &mcs->stats; | ||
765 | } | ||
766 | |||
767 | /* Receive callback function. */ | 759 | /* Receive callback function. */ |
768 | static void mcs_receive_irq(struct urb *urb) | 760 | static void mcs_receive_irq(struct urb *urb) |
769 | { | 761 | { |
@@ -786,14 +778,14 @@ static void mcs_receive_irq(struct urb *urb) | |||
786 | */ | 778 | */ |
787 | /* SIR speed */ | 779 | /* SIR speed */ |
788 | if(mcs->speed < 576000) { | 780 | if(mcs->speed < 576000) { |
789 | async_unwrap_char(mcs->netdev, &mcs->stats, | 781 | async_unwrap_char(mcs->netdev, &mcs->netdev->stats, |
790 | &mcs->rx_buff, 0xc0); | 782 | &mcs->rx_buff, 0xc0); |
791 | 783 | ||
792 | for (i = 0; i < urb->actual_length; i++) | 784 | for (i = 0; i < urb->actual_length; i++) |
793 | async_unwrap_char(mcs->netdev, &mcs->stats, | 785 | async_unwrap_char(mcs->netdev, &mcs->netdev->stats, |
794 | &mcs->rx_buff, bytes[i]); | 786 | &mcs->rx_buff, bytes[i]); |
795 | 787 | ||
796 | async_unwrap_char(mcs->netdev, &mcs->stats, | 788 | async_unwrap_char(mcs->netdev, &mcs->netdev->stats, |
797 | &mcs->rx_buff, 0xc1); | 789 | &mcs->rx_buff, 0xc1); |
798 | } | 790 | } |
799 | /* MIR speed */ | 791 | /* MIR speed */ |
@@ -868,12 +860,12 @@ static int mcs_hard_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
868 | case -EPIPE: | 860 | case -EPIPE: |
869 | break; | 861 | break; |
870 | default: | 862 | default: |
871 | mcs->stats.tx_errors++; | 863 | mcs->netdev->stats.tx_errors++; |
872 | netif_start_queue(ndev); | 864 | netif_start_queue(ndev); |
873 | } | 865 | } |
874 | } else { | 866 | } else { |
875 | mcs->stats.tx_packets++; | 867 | mcs->netdev->stats.tx_packets++; |
876 | mcs->stats.tx_bytes += skb->len; | 868 | mcs->netdev->stats.tx_bytes += skb->len; |
877 | } | 869 | } |
878 | 870 | ||
879 | dev_kfree_skb(skb); | 871 | dev_kfree_skb(skb); |
@@ -931,7 +923,6 @@ static int mcs_probe(struct usb_interface *intf, | |||
931 | ndev->hard_start_xmit = mcs_hard_xmit; | 923 | ndev->hard_start_xmit = mcs_hard_xmit; |
932 | ndev->open = mcs_net_open; | 924 | ndev->open = mcs_net_open; |
933 | ndev->stop = mcs_net_close; | 925 | ndev->stop = mcs_net_close; |
934 | ndev->get_stats = mcs_net_get_stats; | ||
935 | ndev->do_ioctl = mcs_net_ioctl; | 926 | ndev->do_ioctl = mcs_net_ioctl; |
936 | 927 | ||
937 | if (!intf->cur_altsetting) | 928 | if (!intf->cur_altsetting) |
diff --git a/drivers/net/irda/mcs7780.h b/drivers/net/irda/mcs7780.h index b18148cee638..6bdc621e67c6 100644 --- a/drivers/net/irda/mcs7780.h +++ b/drivers/net/irda/mcs7780.h | |||
@@ -104,7 +104,6 @@ struct mcs_cb { | |||
104 | struct usb_device *usbdev; /* init: probe_irda */ | 104 | struct usb_device *usbdev; /* init: probe_irda */ |
105 | struct net_device *netdev; /* network layer */ | 105 | struct net_device *netdev; /* network layer */ |
106 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 106 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
107 | struct net_device_stats stats; /* network statistics */ | ||
108 | struct qos_info qos; | 107 | struct qos_info qos; |
109 | unsigned int speed; /* Current speed */ | 108 | unsigned int speed; /* Current speed */ |
110 | unsigned int new_speed; /* new speed */ | 109 | unsigned int new_speed; /* new speed */ |
@@ -154,7 +153,6 @@ static int mcs_speed_change(struct mcs_cb *mcs); | |||
154 | static int mcs_net_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd); | 153 | static int mcs_net_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd); |
155 | static int mcs_net_close(struct net_device *netdev); | 154 | static int mcs_net_close(struct net_device *netdev); |
156 | static int mcs_net_open(struct net_device *netdev); | 155 | static int mcs_net_open(struct net_device *netdev); |
157 | static struct net_device_stats *mcs_net_get_stats(struct net_device *netdev); | ||
158 | 156 | ||
159 | static void mcs_receive_irq(struct urb *urb); | 157 | static void mcs_receive_irq(struct urb *urb); |
160 | static void mcs_send_irq(struct urb *urb); | 158 | static void mcs_send_irq(struct urb *urb); |
diff --git a/drivers/net/irda/nsc-ircc.c b/drivers/net/irda/nsc-ircc.c index 2c6bf2d11bb1..61e509cb712a 100644 --- a/drivers/net/irda/nsc-ircc.c +++ b/drivers/net/irda/nsc-ircc.c | |||
@@ -185,7 +185,6 @@ static void nsc_ircc_init_dongle_interface (int iobase, int dongle_id); | |||
185 | static int nsc_ircc_net_open(struct net_device *dev); | 185 | static int nsc_ircc_net_open(struct net_device *dev); |
186 | static int nsc_ircc_net_close(struct net_device *dev); | 186 | static int nsc_ircc_net_close(struct net_device *dev); |
187 | static int nsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); | 187 | static int nsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); |
188 | static struct net_device_stats *nsc_ircc_net_get_stats(struct net_device *dev); | ||
189 | 188 | ||
190 | /* Globals */ | 189 | /* Globals */ |
191 | static int pnp_registered; | 190 | static int pnp_registered; |
@@ -446,7 +445,6 @@ static int __init nsc_ircc_open(chipio_t *info) | |||
446 | dev->open = nsc_ircc_net_open; | 445 | dev->open = nsc_ircc_net_open; |
447 | dev->stop = nsc_ircc_net_close; | 446 | dev->stop = nsc_ircc_net_close; |
448 | dev->do_ioctl = nsc_ircc_net_ioctl; | 447 | dev->do_ioctl = nsc_ircc_net_ioctl; |
449 | dev->get_stats = nsc_ircc_net_get_stats; | ||
450 | 448 | ||
451 | err = register_netdev(dev); | 449 | err = register_netdev(dev); |
452 | if (err) { | 450 | if (err) { |
@@ -1401,7 +1399,7 @@ static int nsc_ircc_hard_xmit_sir(struct sk_buff *skb, struct net_device *dev) | |||
1401 | self->tx_buff.len = async_wrap_skb(skb, self->tx_buff.data, | 1399 | self->tx_buff.len = async_wrap_skb(skb, self->tx_buff.data, |
1402 | self->tx_buff.truesize); | 1400 | self->tx_buff.truesize); |
1403 | 1401 | ||
1404 | self->stats.tx_bytes += self->tx_buff.len; | 1402 | dev->stats.tx_bytes += self->tx_buff.len; |
1405 | 1403 | ||
1406 | /* Add interrupt on tx low level (will fire immediately) */ | 1404 | /* Add interrupt on tx low level (will fire immediately) */ |
1407 | switch_bank(iobase, BANK0); | 1405 | switch_bank(iobase, BANK0); |
@@ -1473,7 +1471,7 @@ static int nsc_ircc_hard_xmit_fir(struct sk_buff *skb, struct net_device *dev) | |||
1473 | self->tx_fifo.queue[self->tx_fifo.free].len = skb->len; | 1471 | self->tx_fifo.queue[self->tx_fifo.free].len = skb->len; |
1474 | self->tx_fifo.tail += skb->len; | 1472 | self->tx_fifo.tail += skb->len; |
1475 | 1473 | ||
1476 | self->stats.tx_bytes += skb->len; | 1474 | dev->stats.tx_bytes += skb->len; |
1477 | 1475 | ||
1478 | skb_copy_from_linear_data(skb, self->tx_fifo.queue[self->tx_fifo.free].start, | 1476 | skb_copy_from_linear_data(skb, self->tx_fifo.queue[self->tx_fifo.free].start, |
1479 | skb->len); | 1477 | skb->len); |
@@ -1652,13 +1650,13 @@ static int nsc_ircc_dma_xmit_complete(struct nsc_ircc_cb *self) | |||
1652 | 1650 | ||
1653 | /* Check for underrrun! */ | 1651 | /* Check for underrrun! */ |
1654 | if (inb(iobase+ASCR) & ASCR_TXUR) { | 1652 | if (inb(iobase+ASCR) & ASCR_TXUR) { |
1655 | self->stats.tx_errors++; | 1653 | self->netdev->stats.tx_errors++; |
1656 | self->stats.tx_fifo_errors++; | 1654 | self->netdev->stats.tx_fifo_errors++; |
1657 | 1655 | ||
1658 | /* Clear bit, by writing 1 into it */ | 1656 | /* Clear bit, by writing 1 into it */ |
1659 | outb(ASCR_TXUR, iobase+ASCR); | 1657 | outb(ASCR_TXUR, iobase+ASCR); |
1660 | } else { | 1658 | } else { |
1661 | self->stats.tx_packets++; | 1659 | self->netdev->stats.tx_packets++; |
1662 | } | 1660 | } |
1663 | 1661 | ||
1664 | /* Finished with this frame, so prepare for next */ | 1662 | /* Finished with this frame, so prepare for next */ |
@@ -1793,28 +1791,28 @@ static int nsc_ircc_dma_receive_complete(struct nsc_ircc_cb *self, int iobase) | |||
1793 | if (status & FRM_ST_ERR_MSK) { | 1791 | if (status & FRM_ST_ERR_MSK) { |
1794 | if (status & FRM_ST_LOST_FR) { | 1792 | if (status & FRM_ST_LOST_FR) { |
1795 | /* Add number of lost frames to stats */ | 1793 | /* Add number of lost frames to stats */ |
1796 | self->stats.rx_errors += len; | 1794 | self->netdev->stats.rx_errors += len; |
1797 | } else { | 1795 | } else { |
1798 | /* Skip frame */ | 1796 | /* Skip frame */ |
1799 | self->stats.rx_errors++; | 1797 | self->netdev->stats.rx_errors++; |
1800 | 1798 | ||
1801 | self->rx_buff.data += len; | 1799 | self->rx_buff.data += len; |
1802 | 1800 | ||
1803 | if (status & FRM_ST_MAX_LEN) | 1801 | if (status & FRM_ST_MAX_LEN) |
1804 | self->stats.rx_length_errors++; | 1802 | self->netdev->stats.rx_length_errors++; |
1805 | 1803 | ||
1806 | if (status & FRM_ST_PHY_ERR) | 1804 | if (status & FRM_ST_PHY_ERR) |
1807 | self->stats.rx_frame_errors++; | 1805 | self->netdev->stats.rx_frame_errors++; |
1808 | 1806 | ||
1809 | if (status & FRM_ST_BAD_CRC) | 1807 | if (status & FRM_ST_BAD_CRC) |
1810 | self->stats.rx_crc_errors++; | 1808 | self->netdev->stats.rx_crc_errors++; |
1811 | } | 1809 | } |
1812 | /* The errors below can be reported in both cases */ | 1810 | /* The errors below can be reported in both cases */ |
1813 | if (status & FRM_ST_OVR1) | 1811 | if (status & FRM_ST_OVR1) |
1814 | self->stats.rx_fifo_errors++; | 1812 | self->netdev->stats.rx_fifo_errors++; |
1815 | 1813 | ||
1816 | if (status & FRM_ST_OVR2) | 1814 | if (status & FRM_ST_OVR2) |
1817 | self->stats.rx_fifo_errors++; | 1815 | self->netdev->stats.rx_fifo_errors++; |
1818 | } else { | 1816 | } else { |
1819 | /* | 1817 | /* |
1820 | * First we must make sure that the frame we | 1818 | * First we must make sure that the frame we |
@@ -1863,7 +1861,7 @@ static int nsc_ircc_dma_receive_complete(struct nsc_ircc_cb *self, int iobase) | |||
1863 | IRDA_WARNING("%s(), memory squeeze, " | 1861 | IRDA_WARNING("%s(), memory squeeze, " |
1864 | "dropping frame.\n", | 1862 | "dropping frame.\n", |
1865 | __func__); | 1863 | __func__); |
1866 | self->stats.rx_dropped++; | 1864 | self->netdev->stats.rx_dropped++; |
1867 | 1865 | ||
1868 | /* Restore bank register */ | 1866 | /* Restore bank register */ |
1869 | outb(bank, iobase+BSR); | 1867 | outb(bank, iobase+BSR); |
@@ -1889,8 +1887,8 @@ static int nsc_ircc_dma_receive_complete(struct nsc_ircc_cb *self, int iobase) | |||
1889 | 1887 | ||
1890 | /* Move to next frame */ | 1888 | /* Move to next frame */ |
1891 | self->rx_buff.data += len; | 1889 | self->rx_buff.data += len; |
1892 | self->stats.rx_bytes += len; | 1890 | self->netdev->stats.rx_bytes += len; |
1893 | self->stats.rx_packets++; | 1891 | self->netdev->stats.rx_packets++; |
1894 | 1892 | ||
1895 | skb->dev = self->netdev; | 1893 | skb->dev = self->netdev; |
1896 | skb_reset_mac_header(skb); | 1894 | skb_reset_mac_header(skb); |
@@ -1920,8 +1918,8 @@ static void nsc_ircc_pio_receive(struct nsc_ircc_cb *self) | |||
1920 | /* Receive all characters in Rx FIFO */ | 1918 | /* Receive all characters in Rx FIFO */ |
1921 | do { | 1919 | do { |
1922 | byte = inb(iobase+RXD); | 1920 | byte = inb(iobase+RXD); |
1923 | async_unwrap_char(self->netdev, &self->stats, &self->rx_buff, | 1921 | async_unwrap_char(self->netdev, &self->netdev->stats, |
1924 | byte); | 1922 | &self->rx_buff, byte); |
1925 | } while (inb(iobase+LSR) & LSR_RXDA); /* Data available */ | 1923 | } while (inb(iobase+LSR) & LSR_RXDA); /* Data available */ |
1926 | } | 1924 | } |
1927 | 1925 | ||
@@ -1952,7 +1950,7 @@ static void nsc_ircc_sir_interrupt(struct nsc_ircc_cb *self, int eir) | |||
1952 | self->ier = IER_TXLDL_IE; | 1950 | self->ier = IER_TXLDL_IE; |
1953 | else { | 1951 | else { |
1954 | 1952 | ||
1955 | self->stats.tx_packets++; | 1953 | self->netdev->stats.tx_packets++; |
1956 | netif_wake_queue(self->netdev); | 1954 | netif_wake_queue(self->netdev); |
1957 | self->ier = IER_TXEMP_IE; | 1955 | self->ier = IER_TXEMP_IE; |
1958 | } | 1956 | } |
@@ -2307,13 +2305,6 @@ static int nsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | |||
2307 | return ret; | 2305 | return ret; |
2308 | } | 2306 | } |
2309 | 2307 | ||
2310 | static struct net_device_stats *nsc_ircc_net_get_stats(struct net_device *dev) | ||
2311 | { | ||
2312 | struct nsc_ircc_cb *self = netdev_priv(dev); | ||
2313 | |||
2314 | return &self->stats; | ||
2315 | } | ||
2316 | |||
2317 | static int nsc_ircc_suspend(struct platform_device *dev, pm_message_t state) | 2308 | static int nsc_ircc_suspend(struct platform_device *dev, pm_message_t state) |
2318 | { | 2309 | { |
2319 | struct nsc_ircc_cb *self = platform_get_drvdata(dev); | 2310 | struct nsc_ircc_cb *self = platform_get_drvdata(dev); |
diff --git a/drivers/net/irda/nsc-ircc.h b/drivers/net/irda/nsc-ircc.h index 71cd3c5a0762..7ba7738759b9 100644 --- a/drivers/net/irda/nsc-ircc.h +++ b/drivers/net/irda/nsc-ircc.h | |||
@@ -251,7 +251,6 @@ struct nsc_ircc_cb { | |||
251 | struct tx_fifo tx_fifo; /* Info about frames to be transmitted */ | 251 | struct tx_fifo tx_fifo; /* Info about frames to be transmitted */ |
252 | 252 | ||
253 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ | 253 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ |
254 | struct net_device_stats stats; | ||
255 | 254 | ||
256 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 255 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
257 | struct qos_info qos; /* QoS capabilities for this device */ | 256 | struct qos_info qos; /* QoS capabilities for this device */ |
diff --git a/drivers/net/irda/pxaficp_ir.c b/drivers/net/irda/pxaficp_ir.c index 004a9aab3a50..31794c2363ec 100644 --- a/drivers/net/irda/pxaficp_ir.c +++ b/drivers/net/irda/pxaficp_ir.c | |||
@@ -108,7 +108,6 @@ struct pxa_irda { | |||
108 | int txdma; | 108 | int txdma; |
109 | int rxdma; | 109 | int rxdma; |
110 | 110 | ||
111 | struct net_device_stats stats; | ||
112 | struct irlap_cb *irlap; | 111 | struct irlap_cb *irlap; |
113 | struct qos_info qos; | 112 | struct qos_info qos; |
114 | 113 | ||
@@ -258,14 +257,15 @@ static irqreturn_t pxa_irda_sir_irq(int irq, void *dev_id) | |||
258 | data = STRBR; | 257 | data = STRBR; |
259 | if (lsr & (LSR_OE | LSR_PE | LSR_FE | LSR_BI)) { | 258 | if (lsr & (LSR_OE | LSR_PE | LSR_FE | LSR_BI)) { |
260 | printk(KERN_DEBUG "pxa_ir: sir receiving error\n"); | 259 | printk(KERN_DEBUG "pxa_ir: sir receiving error\n"); |
261 | si->stats.rx_errors++; | 260 | dev->stats.rx_errors++; |
262 | if (lsr & LSR_FE) | 261 | if (lsr & LSR_FE) |
263 | si->stats.rx_frame_errors++; | 262 | dev->stats.rx_frame_errors++; |
264 | if (lsr & LSR_OE) | 263 | if (lsr & LSR_OE) |
265 | si->stats.rx_fifo_errors++; | 264 | dev->stats.rx_fifo_errors++; |
266 | } else { | 265 | } else { |
267 | si->stats.rx_bytes++; | 266 | dev->stats.rx_bytes++; |
268 | async_unwrap_char(dev, &si->stats, &si->rx_buff, data); | 267 | async_unwrap_char(dev, &dev->stats, |
268 | &si->rx_buff, data); | ||
269 | } | 269 | } |
270 | lsr = STLSR; | 270 | lsr = STLSR; |
271 | } | 271 | } |
@@ -277,8 +277,8 @@ static irqreturn_t pxa_irda_sir_irq(int irq, void *dev_id) | |||
277 | 277 | ||
278 | case 0x0C: /* Character Timeout Indication */ | 278 | case 0x0C: /* Character Timeout Indication */ |
279 | do { | 279 | do { |
280 | si->stats.rx_bytes++; | 280 | dev->stats.rx_bytes++; |
281 | async_unwrap_char(dev, &si->stats, &si->rx_buff, STRBR); | 281 | async_unwrap_char(dev, &dev->stats, &si->rx_buff, STRBR); |
282 | } while (STLSR & LSR_DR); | 282 | } while (STLSR & LSR_DR); |
283 | si->last_oscr = OSCR; | 283 | si->last_oscr = OSCR; |
284 | break; | 284 | break; |
@@ -290,9 +290,8 @@ static irqreturn_t pxa_irda_sir_irq(int irq, void *dev_id) | |||
290 | } | 290 | } |
291 | 291 | ||
292 | if (si->tx_buff.len == 0) { | 292 | if (si->tx_buff.len == 0) { |
293 | si->stats.tx_packets++; | 293 | dev->stats.tx_packets++; |
294 | si->stats.tx_bytes += si->tx_buff.data - | 294 | dev->stats.tx_bytes += si->tx_buff.data - si->tx_buff.head; |
295 | si->tx_buff.head; | ||
296 | 295 | ||
297 | /* We need to ensure that the transmitter has finished. */ | 296 | /* We need to ensure that the transmitter has finished. */ |
298 | while ((STLSR & LSR_TEMT) == 0) | 297 | while ((STLSR & LSR_TEMT) == 0) |
@@ -343,10 +342,10 @@ static void pxa_irda_fir_dma_tx_irq(int channel, void *data) | |||
343 | DCSR(channel) = dcsr & ~DCSR_RUN; | 342 | DCSR(channel) = dcsr & ~DCSR_RUN; |
344 | 343 | ||
345 | if (dcsr & DCSR_ENDINTR) { | 344 | if (dcsr & DCSR_ENDINTR) { |
346 | si->stats.tx_packets++; | 345 | dev->stats.tx_packets++; |
347 | si->stats.tx_bytes += si->dma_tx_buff_len; | 346 | dev->stats.tx_bytes += si->dma_tx_buff_len; |
348 | } else { | 347 | } else { |
349 | si->stats.tx_errors++; | 348 | dev->stats.tx_errors++; |
350 | } | 349 | } |
351 | 350 | ||
352 | while (ICSR1 & ICSR1_TBY) | 351 | while (ICSR1 & ICSR1_TBY) |
@@ -392,14 +391,14 @@ static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev, in | |||
392 | data = ICDR; | 391 | data = ICDR; |
393 | 392 | ||
394 | if (stat & (ICSR1_CRE | ICSR1_ROR)) { | 393 | if (stat & (ICSR1_CRE | ICSR1_ROR)) { |
395 | si->stats.rx_errors++; | 394 | dev->stats.rx_errors++; |
396 | if (stat & ICSR1_CRE) { | 395 | if (stat & ICSR1_CRE) { |
397 | printk(KERN_DEBUG "pxa_ir: fir receive CRC error\n"); | 396 | printk(KERN_DEBUG "pxa_ir: fir receive CRC error\n"); |
398 | si->stats.rx_crc_errors++; | 397 | dev->stats.rx_crc_errors++; |
399 | } | 398 | } |
400 | if (stat & ICSR1_ROR) { | 399 | if (stat & ICSR1_ROR) { |
401 | printk(KERN_DEBUG "pxa_ir: fir receive overrun\n"); | 400 | printk(KERN_DEBUG "pxa_ir: fir receive overrun\n"); |
402 | si->stats.rx_over_errors++; | 401 | dev->stats.rx_over_errors++; |
403 | } | 402 | } |
404 | } else { | 403 | } else { |
405 | si->dma_rx_buff[len++] = data; | 404 | si->dma_rx_buff[len++] = data; |
@@ -415,14 +414,14 @@ static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev, in | |||
415 | 414 | ||
416 | if (icsr0 & ICSR0_FRE) { | 415 | if (icsr0 & ICSR0_FRE) { |
417 | printk(KERN_ERR "pxa_ir: dropping erroneous frame\n"); | 416 | printk(KERN_ERR "pxa_ir: dropping erroneous frame\n"); |
418 | si->stats.rx_dropped++; | 417 | dev->stats.rx_dropped++; |
419 | return; | 418 | return; |
420 | } | 419 | } |
421 | 420 | ||
422 | skb = alloc_skb(len+1,GFP_ATOMIC); | 421 | skb = alloc_skb(len+1,GFP_ATOMIC); |
423 | if (!skb) { | 422 | if (!skb) { |
424 | printk(KERN_ERR "pxa_ir: fir out of memory for receive skb\n"); | 423 | printk(KERN_ERR "pxa_ir: fir out of memory for receive skb\n"); |
425 | si->stats.rx_dropped++; | 424 | dev->stats.rx_dropped++; |
426 | return; | 425 | return; |
427 | } | 426 | } |
428 | 427 | ||
@@ -437,8 +436,8 @@ static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev, in | |||
437 | skb->protocol = htons(ETH_P_IRDA); | 436 | skb->protocol = htons(ETH_P_IRDA); |
438 | netif_rx(skb); | 437 | netif_rx(skb); |
439 | 438 | ||
440 | si->stats.rx_packets++; | 439 | dev->stats.rx_packets++; |
441 | si->stats.rx_bytes += len; | 440 | dev->stats.rx_bytes += len; |
442 | } | 441 | } |
443 | } | 442 | } |
444 | 443 | ||
@@ -457,10 +456,10 @@ static irqreturn_t pxa_irda_fir_irq(int irq, void *dev_id) | |||
457 | if (icsr0 & (ICSR0_FRE | ICSR0_RAB)) { | 456 | if (icsr0 & (ICSR0_FRE | ICSR0_RAB)) { |
458 | if (icsr0 & ICSR0_FRE) { | 457 | if (icsr0 & ICSR0_FRE) { |
459 | printk(KERN_DEBUG "pxa_ir: fir receive frame error\n"); | 458 | printk(KERN_DEBUG "pxa_ir: fir receive frame error\n"); |
460 | si->stats.rx_frame_errors++; | 459 | dev->stats.rx_frame_errors++; |
461 | } else { | 460 | } else { |
462 | printk(KERN_DEBUG "pxa_ir: fir receive abort\n"); | 461 | printk(KERN_DEBUG "pxa_ir: fir receive abort\n"); |
463 | si->stats.rx_errors++; | 462 | dev->stats.rx_errors++; |
464 | } | 463 | } |
465 | ICSR0 = icsr0 & (ICSR0_FRE | ICSR0_RAB); | 464 | ICSR0 = icsr0 & (ICSR0_FRE | ICSR0_RAB); |
466 | } | 465 | } |
@@ -589,12 +588,6 @@ static int pxa_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd) | |||
589 | return ret; | 588 | return ret; |
590 | } | 589 | } |
591 | 590 | ||
592 | static struct net_device_stats *pxa_irda_stats(struct net_device *dev) | ||
593 | { | ||
594 | struct pxa_irda *si = netdev_priv(dev); | ||
595 | return &si->stats; | ||
596 | } | ||
597 | |||
598 | static void pxa_irda_startup(struct pxa_irda *si) | 591 | static void pxa_irda_startup(struct pxa_irda *si) |
599 | { | 592 | { |
600 | /* Disable STUART interrupts */ | 593 | /* Disable STUART interrupts */ |
@@ -857,7 +850,6 @@ static int pxa_irda_probe(struct platform_device *pdev) | |||
857 | dev->open = pxa_irda_start; | 850 | dev->open = pxa_irda_start; |
858 | dev->stop = pxa_irda_stop; | 851 | dev->stop = pxa_irda_stop; |
859 | dev->do_ioctl = pxa_irda_ioctl; | 852 | dev->do_ioctl = pxa_irda_ioctl; |
860 | dev->get_stats = pxa_irda_stats; | ||
861 | 853 | ||
862 | irda_init_max_qos_capabilies(&si->qos); | 854 | irda_init_max_qos_capabilies(&si->qos); |
863 | 855 | ||
diff --git a/drivers/net/irda/sa1100_ir.c b/drivers/net/irda/sa1100_ir.c index d302bcf4c148..7a2b003954ca 100644 --- a/drivers/net/irda/sa1100_ir.c +++ b/drivers/net/irda/sa1100_ir.c | |||
@@ -60,7 +60,6 @@ struct sa1100_irda { | |||
60 | dma_regs_t *txdma; | 60 | dma_regs_t *txdma; |
61 | dma_regs_t *rxdma; | 61 | dma_regs_t *rxdma; |
62 | 62 | ||
63 | struct net_device_stats stats; | ||
64 | struct device *dev; | 63 | struct device *dev; |
65 | struct irda_platform_data *pdata; | 64 | struct irda_platform_data *pdata; |
66 | struct irlap_cb *irlap; | 65 | struct irlap_cb *irlap; |
@@ -375,13 +374,13 @@ static void sa1100_irda_hpsir_irq(struct net_device *dev) | |||
375 | data = Ser2UTDR; | 374 | data = Ser2UTDR; |
376 | 375 | ||
377 | if (stat & (UTSR1_FRE | UTSR1_ROR)) { | 376 | if (stat & (UTSR1_FRE | UTSR1_ROR)) { |
378 | si->stats.rx_errors++; | 377 | dev->stats.rx_errors++; |
379 | if (stat & UTSR1_FRE) | 378 | if (stat & UTSR1_FRE) |
380 | si->stats.rx_frame_errors++; | 379 | dev->stats.rx_frame_errors++; |
381 | if (stat & UTSR1_ROR) | 380 | if (stat & UTSR1_ROR) |
382 | si->stats.rx_fifo_errors++; | 381 | dev->stats.rx_fifo_errors++; |
383 | } else | 382 | } else |
384 | async_unwrap_char(dev, &si->stats, &si->rx_buff, data); | 383 | async_unwrap_char(dev, &dev->stats, &si->rx_buff, data); |
385 | 384 | ||
386 | status = Ser2UTSR0; | 385 | status = Ser2UTSR0; |
387 | } | 386 | } |
@@ -396,9 +395,9 @@ static void sa1100_irda_hpsir_irq(struct net_device *dev) | |||
396 | * There are at least 4 bytes in the FIFO. Read 3 bytes | 395 | * There are at least 4 bytes in the FIFO. Read 3 bytes |
397 | * and leave the rest to the block below. | 396 | * and leave the rest to the block below. |
398 | */ | 397 | */ |
399 | async_unwrap_char(dev, &si->stats, &si->rx_buff, Ser2UTDR); | 398 | async_unwrap_char(dev, &dev->stats, &si->rx_buff, Ser2UTDR); |
400 | async_unwrap_char(dev, &si->stats, &si->rx_buff, Ser2UTDR); | 399 | async_unwrap_char(dev, &dev->stats, &si->rx_buff, Ser2UTDR); |
401 | async_unwrap_char(dev, &si->stats, &si->rx_buff, Ser2UTDR); | 400 | async_unwrap_char(dev, &dev->stats, &si->rx_buff, Ser2UTDR); |
402 | } | 401 | } |
403 | 402 | ||
404 | if (status & (UTSR0_RFS | UTSR0_RID)) { | 403 | if (status & (UTSR0_RFS | UTSR0_RID)) { |
@@ -406,7 +405,7 @@ static void sa1100_irda_hpsir_irq(struct net_device *dev) | |||
406 | * Fifo contains more than 1 character. | 405 | * Fifo contains more than 1 character. |
407 | */ | 406 | */ |
408 | do { | 407 | do { |
409 | async_unwrap_char(dev, &si->stats, &si->rx_buff, | 408 | async_unwrap_char(dev, &dev->stats, &si->rx_buff, |
410 | Ser2UTDR); | 409 | Ser2UTDR); |
411 | } while (Ser2UTSR1 & UTSR1_RNE); | 410 | } while (Ser2UTSR1 & UTSR1_RNE); |
412 | 411 | ||
@@ -422,8 +421,8 @@ static void sa1100_irda_hpsir_irq(struct net_device *dev) | |||
422 | } while (Ser2UTSR1 & UTSR1_TNF && si->tx_buff.len); | 421 | } while (Ser2UTSR1 & UTSR1_TNF && si->tx_buff.len); |
423 | 422 | ||
424 | if (si->tx_buff.len == 0) { | 423 | if (si->tx_buff.len == 0) { |
425 | si->stats.tx_packets++; | 424 | dev->stats.tx_packets++; |
426 | si->stats.tx_bytes += si->tx_buff.data - | 425 | dev->stats.tx_bytes += si->tx_buff.data - |
427 | si->tx_buff.head; | 426 | si->tx_buff.head; |
428 | 427 | ||
429 | /* | 428 | /* |
@@ -482,11 +481,11 @@ static void sa1100_irda_fir_error(struct sa1100_irda *si, struct net_device *dev | |||
482 | data = Ser2HSDR; | 481 | data = Ser2HSDR; |
483 | 482 | ||
484 | if (stat & (HSSR1_CRE | HSSR1_ROR)) { | 483 | if (stat & (HSSR1_CRE | HSSR1_ROR)) { |
485 | si->stats.rx_errors++; | 484 | dev->stats.rx_errors++; |
486 | if (stat & HSSR1_CRE) | 485 | if (stat & HSSR1_CRE) |
487 | si->stats.rx_crc_errors++; | 486 | dev->stats.rx_crc_errors++; |
488 | if (stat & HSSR1_ROR) | 487 | if (stat & HSSR1_ROR) |
489 | si->stats.rx_frame_errors++; | 488 | dev->stats.rx_frame_errors++; |
490 | } else | 489 | } else |
491 | skb->data[len++] = data; | 490 | skb->data[len++] = data; |
492 | 491 | ||
@@ -505,8 +504,8 @@ static void sa1100_irda_fir_error(struct sa1100_irda *si, struct net_device *dev | |||
505 | skb->dev = dev; | 504 | skb->dev = dev; |
506 | skb_reset_mac_header(skb); | 505 | skb_reset_mac_header(skb); |
507 | skb->protocol = htons(ETH_P_IRDA); | 506 | skb->protocol = htons(ETH_P_IRDA); |
508 | si->stats.rx_packets++; | 507 | dev->stats.rx_packets++; |
509 | si->stats.rx_bytes += len; | 508 | dev->stats.rx_bytes += len; |
510 | 509 | ||
511 | /* | 510 | /* |
512 | * Before we pass the buffer up, allocate a new one. | 511 | * Before we pass the buffer up, allocate a new one. |
@@ -545,10 +544,10 @@ static void sa1100_irda_fir_irq(struct net_device *dev) | |||
545 | * from the fifo. | 544 | * from the fifo. |
546 | */ | 545 | */ |
547 | if (Ser2HSSR0 & (HSSR0_FRE | HSSR0_RAB)) { | 546 | if (Ser2HSSR0 & (HSSR0_FRE | HSSR0_RAB)) { |
548 | si->stats.rx_errors++; | 547 | dev->stats.rx_errors++; |
549 | 548 | ||
550 | if (Ser2HSSR0 & HSSR0_FRE) | 549 | if (Ser2HSSR0 & HSSR0_FRE) |
551 | si->stats.rx_frame_errors++; | 550 | dev->stats.rx_frame_errors++; |
552 | 551 | ||
553 | /* | 552 | /* |
554 | * Clear out the DMA... | 553 | * Clear out the DMA... |
@@ -633,8 +632,8 @@ static void sa1100_irda_txdma_irq(void *id) | |||
633 | */ | 632 | */ |
634 | if (skb) { | 633 | if (skb) { |
635 | dma_unmap_single(si->dev, si->txbuf_dma, skb->len, DMA_TO_DEVICE); | 634 | dma_unmap_single(si->dev, si->txbuf_dma, skb->len, DMA_TO_DEVICE); |
636 | si->stats.tx_packets ++; | 635 | dev->stats.tx_packets ++; |
637 | si->stats.tx_bytes += skb->len; | 636 | dev->stats.tx_bytes += skb->len; |
638 | dev_kfree_skb_irq(skb); | 637 | dev_kfree_skb_irq(skb); |
639 | } | 638 | } |
640 | 639 | ||
@@ -762,12 +761,6 @@ sa1100_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd) | |||
762 | return ret; | 761 | return ret; |
763 | } | 762 | } |
764 | 763 | ||
765 | static struct net_device_stats *sa1100_irda_stats(struct net_device *dev) | ||
766 | { | ||
767 | struct sa1100_irda *si = netdev_priv(dev); | ||
768 | return &si->stats; | ||
769 | } | ||
770 | |||
771 | static int sa1100_irda_start(struct net_device *dev) | 764 | static int sa1100_irda_start(struct net_device *dev) |
772 | { | 765 | { |
773 | struct sa1100_irda *si = netdev_priv(dev); | 766 | struct sa1100_irda *si = netdev_priv(dev); |
@@ -924,7 +917,6 @@ static int sa1100_irda_probe(struct platform_device *pdev) | |||
924 | dev->open = sa1100_irda_start; | 917 | dev->open = sa1100_irda_start; |
925 | dev->stop = sa1100_irda_stop; | 918 | dev->stop = sa1100_irda_stop; |
926 | dev->do_ioctl = sa1100_irda_ioctl; | 919 | dev->do_ioctl = sa1100_irda_ioctl; |
927 | dev->get_stats = sa1100_irda_stats; | ||
928 | dev->irq = IRQ_Ser2ICP; | 920 | dev->irq = IRQ_Ser2ICP; |
929 | 921 | ||
930 | irda_init_max_qos_capabilies(&si->qos); | 922 | irda_init_max_qos_capabilies(&si->qos); |
diff --git a/drivers/net/irda/sir-dev.h b/drivers/net/irda/sir-dev.h index 2a57bc67ce35..6d5b1e2b1289 100644 --- a/drivers/net/irda/sir-dev.h +++ b/drivers/net/irda/sir-dev.h | |||
@@ -160,7 +160,6 @@ static inline int sirdev_schedule_mode(struct sir_dev *dev, int mode) | |||
160 | 160 | ||
161 | struct sir_dev { | 161 | struct sir_dev { |
162 | struct net_device *netdev; | 162 | struct net_device *netdev; |
163 | struct net_device_stats stats; | ||
164 | 163 | ||
165 | struct irlap_cb *irlap; | 164 | struct irlap_cb *irlap; |
166 | 165 | ||
diff --git a/drivers/net/irda/sir_dev.c b/drivers/net/irda/sir_dev.c index ceef040aa76d..5b5862499def 100644 --- a/drivers/net/irda/sir_dev.c +++ b/drivers/net/irda/sir_dev.c | |||
@@ -455,8 +455,8 @@ void sirdev_write_complete(struct sir_dev *dev) | |||
455 | if ((skb=dev->tx_skb) != NULL) { | 455 | if ((skb=dev->tx_skb) != NULL) { |
456 | dev->tx_skb = NULL; | 456 | dev->tx_skb = NULL; |
457 | dev_kfree_skb_any(skb); | 457 | dev_kfree_skb_any(skb); |
458 | dev->stats.tx_errors++; | 458 | dev->netdev->stats.tx_errors++; |
459 | dev->stats.tx_dropped++; | 459 | dev->netdev->stats.tx_dropped++; |
460 | } | 460 | } |
461 | dev->tx_buff.len = 0; | 461 | dev->tx_buff.len = 0; |
462 | } | 462 | } |
@@ -493,8 +493,8 @@ void sirdev_write_complete(struct sir_dev *dev) | |||
493 | 493 | ||
494 | if ((skb=dev->tx_skb) != NULL) { | 494 | if ((skb=dev->tx_skb) != NULL) { |
495 | dev->tx_skb = NULL; | 495 | dev->tx_skb = NULL; |
496 | dev->stats.tx_packets++; | 496 | dev->netdev->stats.tx_packets++; |
497 | dev->stats.tx_bytes += skb->len; | 497 | dev->netdev->stats.tx_bytes += skb->len; |
498 | dev_kfree_skb_any(skb); | 498 | dev_kfree_skb_any(skb); |
499 | } | 499 | } |
500 | 500 | ||
@@ -548,7 +548,7 @@ int sirdev_receive(struct sir_dev *dev, const unsigned char *cp, size_t count) | |||
548 | * just update stats and set media busy | 548 | * just update stats and set media busy |
549 | */ | 549 | */ |
550 | irda_device_set_media_busy(dev->netdev, TRUE); | 550 | irda_device_set_media_busy(dev->netdev, TRUE); |
551 | dev->stats.rx_dropped++; | 551 | dev->netdev->stats.rx_dropped++; |
552 | IRDA_DEBUG(0, "%s; rx-drop: %zd\n", __func__, count); | 552 | IRDA_DEBUG(0, "%s; rx-drop: %zd\n", __func__, count); |
553 | return 0; | 553 | return 0; |
554 | } | 554 | } |
@@ -557,7 +557,7 @@ int sirdev_receive(struct sir_dev *dev, const unsigned char *cp, size_t count) | |||
557 | if (likely(atomic_read(&dev->enable_rx))) { | 557 | if (likely(atomic_read(&dev->enable_rx))) { |
558 | while (count--) | 558 | while (count--) |
559 | /* Unwrap and destuff one byte */ | 559 | /* Unwrap and destuff one byte */ |
560 | async_unwrap_char(dev->netdev, &dev->stats, | 560 | async_unwrap_char(dev->netdev, &dev->netdev->stats, |
561 | &dev->rx_buff, *cp++); | 561 | &dev->rx_buff, *cp++); |
562 | } else { | 562 | } else { |
563 | while (count--) { | 563 | while (count--) { |
@@ -582,13 +582,6 @@ EXPORT_SYMBOL(sirdev_receive); | |||
582 | 582 | ||
583 | /* callbacks from network layer */ | 583 | /* callbacks from network layer */ |
584 | 584 | ||
585 | static struct net_device_stats *sirdev_get_stats(struct net_device *ndev) | ||
586 | { | ||
587 | struct sir_dev *dev = netdev_priv(ndev); | ||
588 | |||
589 | return (dev) ? &dev->stats : NULL; | ||
590 | } | ||
591 | |||
592 | static int sirdev_hard_xmit(struct sk_buff *skb, struct net_device *ndev) | 585 | static int sirdev_hard_xmit(struct sk_buff *skb, struct net_device *ndev) |
593 | { | 586 | { |
594 | struct sir_dev *dev = netdev_priv(ndev); | 587 | struct sir_dev *dev = netdev_priv(ndev); |
@@ -654,7 +647,7 @@ static int sirdev_hard_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
654 | */ | 647 | */ |
655 | atomic_set(&dev->enable_rx, 0); | 648 | atomic_set(&dev->enable_rx, 0); |
656 | if (unlikely(sirdev_is_receiving(dev))) | 649 | if (unlikely(sirdev_is_receiving(dev))) |
657 | dev->stats.collisions++; | 650 | dev->netdev->stats.collisions++; |
658 | 651 | ||
659 | actual = dev->drv->do_write(dev, dev->tx_buff.data, dev->tx_buff.len); | 652 | actual = dev->drv->do_write(dev, dev->tx_buff.data, dev->tx_buff.len); |
660 | 653 | ||
@@ -669,8 +662,8 @@ static int sirdev_hard_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
669 | IRDA_ERROR("%s: drv->do_write failed (%d)\n", | 662 | IRDA_ERROR("%s: drv->do_write failed (%d)\n", |
670 | __func__, actual); | 663 | __func__, actual); |
671 | dev_kfree_skb_any(skb); | 664 | dev_kfree_skb_any(skb); |
672 | dev->stats.tx_errors++; | 665 | dev->netdev->stats.tx_errors++; |
673 | dev->stats.tx_dropped++; | 666 | dev->netdev->stats.tx_dropped++; |
674 | netif_wake_queue(ndev); | 667 | netif_wake_queue(ndev); |
675 | } | 668 | } |
676 | spin_unlock_irqrestore(&dev->tx_lock, flags); | 669 | spin_unlock_irqrestore(&dev->tx_lock, flags); |
@@ -918,7 +911,6 @@ struct sir_dev * sirdev_get_instance(const struct sir_driver *drv, const char *n | |||
918 | ndev->hard_start_xmit = sirdev_hard_xmit; | 911 | ndev->hard_start_xmit = sirdev_hard_xmit; |
919 | ndev->open = sirdev_open; | 912 | ndev->open = sirdev_open; |
920 | ndev->stop = sirdev_close; | 913 | ndev->stop = sirdev_close; |
921 | ndev->get_stats = sirdev_get_stats; | ||
922 | ndev->do_ioctl = sirdev_ioctl; | 914 | ndev->do_ioctl = sirdev_ioctl; |
923 | 915 | ||
924 | if (register_netdev(ndev)) { | 916 | if (register_netdev(ndev)) { |
diff --git a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c index 5d09e157e15b..dd73cce10991 100644 --- a/drivers/net/irda/smsc-ircc2.c +++ b/drivers/net/irda/smsc-ircc2.c | |||
@@ -150,7 +150,6 @@ struct smsc_chip_address { | |||
150 | /* Private data for each instance */ | 150 | /* Private data for each instance */ |
151 | struct smsc_ircc_cb { | 151 | struct smsc_ircc_cb { |
152 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ | 152 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ |
153 | struct net_device_stats stats; | ||
154 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 153 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
155 | 154 | ||
156 | chipio_t io; /* IrDA controller information */ | 155 | chipio_t io; /* IrDA controller information */ |
@@ -215,7 +214,6 @@ static int smsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cm | |||
215 | #if SMSC_IRCC2_C_NET_TIMEOUT | 214 | #if SMSC_IRCC2_C_NET_TIMEOUT |
216 | static void smsc_ircc_timeout(struct net_device *dev); | 215 | static void smsc_ircc_timeout(struct net_device *dev); |
217 | #endif | 216 | #endif |
218 | static struct net_device_stats *smsc_ircc_net_get_stats(struct net_device *dev); | ||
219 | static int smsc_ircc_is_receiving(struct smsc_ircc_cb *self); | 217 | static int smsc_ircc_is_receiving(struct smsc_ircc_cb *self); |
220 | static void smsc_ircc_probe_transceiver(struct smsc_ircc_cb *self); | 218 | static void smsc_ircc_probe_transceiver(struct smsc_ircc_cb *self); |
221 | static void smsc_ircc_set_transceiver_for_speed(struct smsc_ircc_cb *self, u32 speed); | 219 | static void smsc_ircc_set_transceiver_for_speed(struct smsc_ircc_cb *self, u32 speed); |
@@ -529,7 +527,6 @@ static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u | |||
529 | dev->open = smsc_ircc_net_open; | 527 | dev->open = smsc_ircc_net_open; |
530 | dev->stop = smsc_ircc_net_close; | 528 | dev->stop = smsc_ircc_net_close; |
531 | dev->do_ioctl = smsc_ircc_net_ioctl; | 529 | dev->do_ioctl = smsc_ircc_net_ioctl; |
532 | dev->get_stats = smsc_ircc_net_get_stats; | ||
533 | 530 | ||
534 | self = netdev_priv(dev); | 531 | self = netdev_priv(dev); |
535 | self->netdev = dev; | 532 | self->netdev = dev; |
@@ -834,13 +831,6 @@ static int smsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd | |||
834 | return ret; | 831 | return ret; |
835 | } | 832 | } |
836 | 833 | ||
837 | static struct net_device_stats *smsc_ircc_net_get_stats(struct net_device *dev) | ||
838 | { | ||
839 | struct smsc_ircc_cb *self = netdev_priv(dev); | ||
840 | |||
841 | return &self->stats; | ||
842 | } | ||
843 | |||
844 | #if SMSC_IRCC2_C_NET_TIMEOUT | 834 | #if SMSC_IRCC2_C_NET_TIMEOUT |
845 | /* | 835 | /* |
846 | * Function smsc_ircc_timeout (struct net_device *dev) | 836 | * Function smsc_ircc_timeout (struct net_device *dev) |
@@ -920,7 +910,7 @@ static int smsc_ircc_hard_xmit_sir(struct sk_buff *skb, struct net_device *dev) | |||
920 | self->tx_buff.len = async_wrap_skb(skb, self->tx_buff.data, | 910 | self->tx_buff.len = async_wrap_skb(skb, self->tx_buff.data, |
921 | self->tx_buff.truesize); | 911 | self->tx_buff.truesize); |
922 | 912 | ||
923 | self->stats.tx_bytes += self->tx_buff.len; | 913 | dev->stats.tx_bytes += self->tx_buff.len; |
924 | 914 | ||
925 | /* Turn on transmit finished interrupt. Will fire immediately! */ | 915 | /* Turn on transmit finished interrupt. Will fire immediately! */ |
926 | outb(UART_IER_THRI, self->io.sir_base + UART_IER); | 916 | outb(UART_IER_THRI, self->io.sir_base + UART_IER); |
@@ -1320,16 +1310,16 @@ static void smsc_ircc_dma_xmit_complete(struct smsc_ircc_cb *self) | |||
1320 | /* Check for underrun! */ | 1310 | /* Check for underrun! */ |
1321 | register_bank(iobase, 0); | 1311 | register_bank(iobase, 0); |
1322 | if (inb(iobase + IRCC_LSR) & IRCC_LSR_UNDERRUN) { | 1312 | if (inb(iobase + IRCC_LSR) & IRCC_LSR_UNDERRUN) { |
1323 | self->stats.tx_errors++; | 1313 | self->netdev->stats.tx_errors++; |
1324 | self->stats.tx_fifo_errors++; | 1314 | self->netdev->stats.tx_fifo_errors++; |
1325 | 1315 | ||
1326 | /* Reset error condition */ | 1316 | /* Reset error condition */ |
1327 | register_bank(iobase, 0); | 1317 | register_bank(iobase, 0); |
1328 | outb(IRCC_MASTER_ERROR_RESET, iobase + IRCC_MASTER); | 1318 | outb(IRCC_MASTER_ERROR_RESET, iobase + IRCC_MASTER); |
1329 | outb(0x00, iobase + IRCC_MASTER); | 1319 | outb(0x00, iobase + IRCC_MASTER); |
1330 | } else { | 1320 | } else { |
1331 | self->stats.tx_packets++; | 1321 | self->netdev->stats.tx_packets++; |
1332 | self->stats.tx_bytes += self->tx_buff.len; | 1322 | self->netdev->stats.tx_bytes += self->tx_buff.len; |
1333 | } | 1323 | } |
1334 | 1324 | ||
1335 | /* Check if it's time to change the speed */ | 1325 | /* Check if it's time to change the speed */ |
@@ -1429,15 +1419,15 @@ static void smsc_ircc_dma_receive_complete(struct smsc_ircc_cb *self) | |||
1429 | 1419 | ||
1430 | /* Look for errors */ | 1420 | /* Look for errors */ |
1431 | if (lsr & (IRCC_LSR_FRAME_ERROR | IRCC_LSR_CRC_ERROR | IRCC_LSR_SIZE_ERROR)) { | 1421 | if (lsr & (IRCC_LSR_FRAME_ERROR | IRCC_LSR_CRC_ERROR | IRCC_LSR_SIZE_ERROR)) { |
1432 | self->stats.rx_errors++; | 1422 | self->netdev->stats.rx_errors++; |
1433 | if (lsr & IRCC_LSR_FRAME_ERROR) | 1423 | if (lsr & IRCC_LSR_FRAME_ERROR) |
1434 | self->stats.rx_frame_errors++; | 1424 | self->netdev->stats.rx_frame_errors++; |
1435 | if (lsr & IRCC_LSR_CRC_ERROR) | 1425 | if (lsr & IRCC_LSR_CRC_ERROR) |
1436 | self->stats.rx_crc_errors++; | 1426 | self->netdev->stats.rx_crc_errors++; |
1437 | if (lsr & IRCC_LSR_SIZE_ERROR) | 1427 | if (lsr & IRCC_LSR_SIZE_ERROR) |
1438 | self->stats.rx_length_errors++; | 1428 | self->netdev->stats.rx_length_errors++; |
1439 | if (lsr & (IRCC_LSR_UNDERRUN | IRCC_LSR_OVERRUN)) | 1429 | if (lsr & (IRCC_LSR_UNDERRUN | IRCC_LSR_OVERRUN)) |
1440 | self->stats.rx_length_errors++; | 1430 | self->netdev->stats.rx_length_errors++; |
1441 | return; | 1431 | return; |
1442 | } | 1432 | } |
1443 | 1433 | ||
@@ -1460,8 +1450,8 @@ static void smsc_ircc_dma_receive_complete(struct smsc_ircc_cb *self) | |||
1460 | skb_reserve(skb, 1); | 1450 | skb_reserve(skb, 1); |
1461 | 1451 | ||
1462 | memcpy(skb_put(skb, len), self->rx_buff.data, len); | 1452 | memcpy(skb_put(skb, len), self->rx_buff.data, len); |
1463 | self->stats.rx_packets++; | 1453 | self->netdev->stats.rx_packets++; |
1464 | self->stats.rx_bytes += len; | 1454 | self->netdev->stats.rx_bytes += len; |
1465 | 1455 | ||
1466 | skb->dev = self->netdev; | 1456 | skb->dev = self->netdev; |
1467 | skb_reset_mac_header(skb); | 1457 | skb_reset_mac_header(skb); |
@@ -1489,7 +1479,7 @@ static void smsc_ircc_sir_receive(struct smsc_ircc_cb *self) | |||
1489 | * async_unwrap_char will deliver all found frames | 1479 | * async_unwrap_char will deliver all found frames |
1490 | */ | 1480 | */ |
1491 | do { | 1481 | do { |
1492 | async_unwrap_char(self->netdev, &self->stats, &self->rx_buff, | 1482 | async_unwrap_char(self->netdev, &self->netdev->stats, &self->rx_buff, |
1493 | inb(iobase + UART_RX)); | 1483 | inb(iobase + UART_RX)); |
1494 | 1484 | ||
1495 | /* Make sure we don't stay here to long */ | 1485 | /* Make sure we don't stay here to long */ |
@@ -1992,7 +1982,7 @@ static void smsc_ircc_sir_write_wakeup(struct smsc_ircc_cb *self) | |||
1992 | /* Tell network layer that we want more frames */ | 1982 | /* Tell network layer that we want more frames */ |
1993 | netif_wake_queue(self->netdev); | 1983 | netif_wake_queue(self->netdev); |
1994 | } | 1984 | } |
1995 | self->stats.tx_packets++; | 1985 | self->netdev->stats.tx_packets++; |
1996 | 1986 | ||
1997 | if (self->io.speed <= 115200) { | 1987 | if (self->io.speed <= 115200) { |
1998 | /* | 1988 | /* |
diff --git a/drivers/net/irda/stir4200.c b/drivers/net/irda/stir4200.c index ca4cd9266e55..8b1658c6c925 100644 --- a/drivers/net/irda/stir4200.c +++ b/drivers/net/irda/stir4200.c | |||
@@ -164,7 +164,7 @@ struct stir_cb { | |||
164 | struct usb_device *usbdev; /* init: probe_irda */ | 164 | struct usb_device *usbdev; /* init: probe_irda */ |
165 | struct net_device *netdev; /* network layer */ | 165 | struct net_device *netdev; /* network layer */ |
166 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 166 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
167 | struct net_device_stats stats; /* network statistics */ | 167 | |
168 | struct qos_info qos; | 168 | struct qos_info qos; |
169 | unsigned speed; /* Current speed */ | 169 | unsigned speed; /* Current speed */ |
170 | 170 | ||
@@ -323,16 +323,16 @@ static void fir_eof(struct stir_cb *stir) | |||
323 | pr_debug("%s: short frame len %d\n", | 323 | pr_debug("%s: short frame len %d\n", |
324 | stir->netdev->name, len); | 324 | stir->netdev->name, len); |
325 | 325 | ||
326 | ++stir->stats.rx_errors; | 326 | ++stir->netdev->stats.rx_errors; |
327 | ++stir->stats.rx_length_errors; | 327 | ++stir->netdev->stats.rx_length_errors; |
328 | return; | 328 | return; |
329 | } | 329 | } |
330 | 330 | ||
331 | fcs = ~(crc32_le(~0, rx_buff->data, len)); | 331 | fcs = ~(crc32_le(~0, rx_buff->data, len)); |
332 | if (fcs != get_unaligned_le32(rx_buff->data + len)) { | 332 | if (fcs != get_unaligned_le32(rx_buff->data + len)) { |
333 | pr_debug("crc error calc 0x%x len %d\n", fcs, len); | 333 | pr_debug("crc error calc 0x%x len %d\n", fcs, len); |
334 | stir->stats.rx_errors++; | 334 | stir->netdev->stats.rx_errors++; |
335 | stir->stats.rx_crc_errors++; | 335 | stir->netdev->stats.rx_crc_errors++; |
336 | return; | 336 | return; |
337 | } | 337 | } |
338 | 338 | ||
@@ -340,7 +340,7 @@ static void fir_eof(struct stir_cb *stir) | |||
340 | if (len < IRDA_RX_COPY_THRESHOLD) { | 340 | if (len < IRDA_RX_COPY_THRESHOLD) { |
341 | nskb = dev_alloc_skb(len + 1); | 341 | nskb = dev_alloc_skb(len + 1); |
342 | if (unlikely(!nskb)) { | 342 | if (unlikely(!nskb)) { |
343 | ++stir->stats.rx_dropped; | 343 | ++stir->netdev->stats.rx_dropped; |
344 | return; | 344 | return; |
345 | } | 345 | } |
346 | skb_reserve(nskb, 1); | 346 | skb_reserve(nskb, 1); |
@@ -349,7 +349,7 @@ static void fir_eof(struct stir_cb *stir) | |||
349 | } else { | 349 | } else { |
350 | nskb = dev_alloc_skb(rx_buff->truesize); | 350 | nskb = dev_alloc_skb(rx_buff->truesize); |
351 | if (unlikely(!nskb)) { | 351 | if (unlikely(!nskb)) { |
352 | ++stir->stats.rx_dropped; | 352 | ++stir->netdev->stats.rx_dropped; |
353 | return; | 353 | return; |
354 | } | 354 | } |
355 | skb_reserve(nskb, 1); | 355 | skb_reserve(nskb, 1); |
@@ -366,8 +366,8 @@ static void fir_eof(struct stir_cb *stir) | |||
366 | 366 | ||
367 | netif_rx(skb); | 367 | netif_rx(skb); |
368 | 368 | ||
369 | stir->stats.rx_packets++; | 369 | stir->netdev->stats.rx_packets++; |
370 | stir->stats.rx_bytes += len; | 370 | stir->netdev->stats.rx_bytes += len; |
371 | 371 | ||
372 | rx_buff->data = rx_buff->head; | 372 | rx_buff->data = rx_buff->head; |
373 | rx_buff->len = 0; | 373 | rx_buff->len = 0; |
@@ -437,7 +437,7 @@ static void stir_fir_chars(struct stir_cb *stir, | |||
437 | if (unlikely(rx_buff->len >= rx_buff->truesize)) { | 437 | if (unlikely(rx_buff->len >= rx_buff->truesize)) { |
438 | pr_debug("%s: fir frame exceeds %d\n", | 438 | pr_debug("%s: fir frame exceeds %d\n", |
439 | stir->netdev->name, rx_buff->truesize); | 439 | stir->netdev->name, rx_buff->truesize); |
440 | ++stir->stats.rx_over_errors; | 440 | ++stir->netdev->stats.rx_over_errors; |
441 | goto error_recovery; | 441 | goto error_recovery; |
442 | } | 442 | } |
443 | 443 | ||
@@ -445,10 +445,10 @@ static void stir_fir_chars(struct stir_cb *stir, | |||
445 | continue; | 445 | continue; |
446 | 446 | ||
447 | frame_error: | 447 | frame_error: |
448 | ++stir->stats.rx_frame_errors; | 448 | ++stir->netdev->stats.rx_frame_errors; |
449 | 449 | ||
450 | error_recovery: | 450 | error_recovery: |
451 | ++stir->stats.rx_errors; | 451 | ++stir->netdev->stats.rx_errors; |
452 | rx_buff->state = OUTSIDE_FRAME; | 452 | rx_buff->state = OUTSIDE_FRAME; |
453 | rx_buff->in_frame = FALSE; | 453 | rx_buff->in_frame = FALSE; |
454 | } | 454 | } |
@@ -461,7 +461,7 @@ static void stir_sir_chars(struct stir_cb *stir, | |||
461 | int i; | 461 | int i; |
462 | 462 | ||
463 | for (i = 0; i < len; i++) | 463 | for (i = 0; i < len; i++) |
464 | async_unwrap_char(stir->netdev, &stir->stats, | 464 | async_unwrap_char(stir->netdev, &stir->netdev->stats, |
465 | &stir->rx_buff, bytes[i]); | 465 | &stir->rx_buff, bytes[i]); |
466 | } | 466 | } |
467 | 467 | ||
@@ -692,7 +692,7 @@ static void receive_stop(struct stir_cb *stir) | |||
692 | usb_kill_urb(stir->rx_urb); | 692 | usb_kill_urb(stir->rx_urb); |
693 | 693 | ||
694 | if (stir->rx_buff.in_frame) | 694 | if (stir->rx_buff.in_frame) |
695 | stir->stats.collisions++; | 695 | stir->netdev->stats.collisions++; |
696 | } | 696 | } |
697 | /* | 697 | /* |
698 | * Wrap data in socket buffer and send it. | 698 | * Wrap data in socket buffer and send it. |
@@ -718,15 +718,15 @@ static void stir_send(struct stir_cb *stir, struct sk_buff *skb) | |||
718 | if (!first_frame) | 718 | if (!first_frame) |
719 | fifo_txwait(stir, wraplen); | 719 | fifo_txwait(stir, wraplen); |
720 | 720 | ||
721 | stir->stats.tx_packets++; | 721 | stir->netdev->stats.tx_packets++; |
722 | stir->stats.tx_bytes += skb->len; | 722 | stir->netdev->stats.tx_bytes += skb->len; |
723 | stir->netdev->trans_start = jiffies; | 723 | stir->netdev->trans_start = jiffies; |
724 | pr_debug("send %d (%d)\n", skb->len, wraplen); | 724 | pr_debug("send %d (%d)\n", skb->len, wraplen); |
725 | 725 | ||
726 | if (usb_bulk_msg(stir->usbdev, usb_sndbulkpipe(stir->usbdev, 1), | 726 | if (usb_bulk_msg(stir->usbdev, usb_sndbulkpipe(stir->usbdev, 1), |
727 | stir->io_buf, wraplen, | 727 | stir->io_buf, wraplen, |
728 | NULL, TRANSMIT_TIMEOUT)) | 728 | NULL, TRANSMIT_TIMEOUT)) |
729 | stir->stats.tx_errors++; | 729 | stir->netdev->stats.tx_errors++; |
730 | } | 730 | } |
731 | 731 | ||
732 | /* | 732 | /* |
@@ -1008,15 +1008,6 @@ static int stir_net_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd) | |||
1008 | } | 1008 | } |
1009 | 1009 | ||
1010 | /* | 1010 | /* |
1011 | * Get device stats (for /proc/net/dev and ifconfig) | ||
1012 | */ | ||
1013 | static struct net_device_stats *stir_net_get_stats(struct net_device *netdev) | ||
1014 | { | ||
1015 | struct stir_cb *stir = netdev_priv(netdev); | ||
1016 | return &stir->stats; | ||
1017 | } | ||
1018 | |||
1019 | /* | ||
1020 | * This routine is called by the USB subsystem for each new device | 1011 | * This routine is called by the USB subsystem for each new device |
1021 | * in the system. We need to check if the device is ours, and in | 1012 | * in the system. We need to check if the device is ours, and in |
1022 | * this case start handling it. | 1013 | * this case start handling it. |
@@ -1066,7 +1057,6 @@ static int stir_probe(struct usb_interface *intf, | |||
1066 | net->hard_start_xmit = stir_hard_xmit; | 1057 | net->hard_start_xmit = stir_hard_xmit; |
1067 | net->open = stir_net_open; | 1058 | net->open = stir_net_open; |
1068 | net->stop = stir_net_close; | 1059 | net->stop = stir_net_close; |
1069 | net->get_stats = stir_net_get_stats; | ||
1070 | net->do_ioctl = stir_net_ioctl; | 1060 | net->do_ioctl = stir_net_ioctl; |
1071 | 1061 | ||
1072 | ret = register_netdev(net); | 1062 | ret = register_netdev(net); |
diff --git a/drivers/net/irda/via-ircc.c b/drivers/net/irda/via-ircc.c index 74c78cf7a333..8b3e545924cc 100644 --- a/drivers/net/irda/via-ircc.c +++ b/drivers/net/irda/via-ircc.c | |||
@@ -101,8 +101,6 @@ static int via_ircc_net_open(struct net_device *dev); | |||
101 | static int via_ircc_net_close(struct net_device *dev); | 101 | static int via_ircc_net_close(struct net_device *dev); |
102 | static int via_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, | 102 | static int via_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, |
103 | int cmd); | 103 | int cmd); |
104 | static struct net_device_stats *via_ircc_net_get_stats(struct net_device | ||
105 | *dev); | ||
106 | static void via_ircc_change_dongle_speed(int iobase, int speed, | 104 | static void via_ircc_change_dongle_speed(int iobase, int speed, |
107 | int dongle_id); | 105 | int dongle_id); |
108 | static int RxTimerHandler(struct via_ircc_cb *self, int iobase); | 106 | static int RxTimerHandler(struct via_ircc_cb *self, int iobase); |
@@ -434,7 +432,6 @@ static __devinit int via_ircc_open(int i, chipio_t * info, unsigned int id) | |||
434 | dev->open = via_ircc_net_open; | 432 | dev->open = via_ircc_net_open; |
435 | dev->stop = via_ircc_net_close; | 433 | dev->stop = via_ircc_net_close; |
436 | dev->do_ioctl = via_ircc_net_ioctl; | 434 | dev->do_ioctl = via_ircc_net_ioctl; |
437 | dev->get_stats = via_ircc_net_get_stats; | ||
438 | 435 | ||
439 | err = register_netdev(dev); | 436 | err = register_netdev(dev); |
440 | if (err) | 437 | if (err) |
@@ -855,7 +852,7 @@ static int via_ircc_hard_xmit_sir(struct sk_buff *skb, | |||
855 | async_wrap_skb(skb, self->tx_buff.data, | 852 | async_wrap_skb(skb, self->tx_buff.data, |
856 | self->tx_buff.truesize); | 853 | self->tx_buff.truesize); |
857 | 854 | ||
858 | self->stats.tx_bytes += self->tx_buff.len; | 855 | dev->stats.tx_bytes += self->tx_buff.len; |
859 | /* Send this frame with old speed */ | 856 | /* Send this frame with old speed */ |
860 | SetBaudRate(iobase, self->io.speed); | 857 | SetBaudRate(iobase, self->io.speed); |
861 | SetPulseWidth(iobase, 12); | 858 | SetPulseWidth(iobase, 12); |
@@ -921,7 +918,7 @@ static int via_ircc_hard_xmit_fir(struct sk_buff *skb, | |||
921 | self->tx_fifo.queue[self->tx_fifo.free].len = skb->len; | 918 | self->tx_fifo.queue[self->tx_fifo.free].len = skb->len; |
922 | 919 | ||
923 | self->tx_fifo.tail += skb->len; | 920 | self->tx_fifo.tail += skb->len; |
924 | self->stats.tx_bytes += skb->len; | 921 | dev->stats.tx_bytes += skb->len; |
925 | skb_copy_from_linear_data(skb, | 922 | skb_copy_from_linear_data(skb, |
926 | self->tx_fifo.queue[self->tx_fifo.free].start, skb->len); | 923 | self->tx_fifo.queue[self->tx_fifo.free].start, skb->len); |
927 | self->tx_fifo.len++; | 924 | self->tx_fifo.len++; |
@@ -990,12 +987,12 @@ static int via_ircc_dma_xmit_complete(struct via_ircc_cb *self) | |||
990 | /* Clear bit, by writing 1 into it */ | 987 | /* Clear bit, by writing 1 into it */ |
991 | Tx_status = GetTXStatus(iobase); | 988 | Tx_status = GetTXStatus(iobase); |
992 | if (Tx_status & 0x08) { | 989 | if (Tx_status & 0x08) { |
993 | self->stats.tx_errors++; | 990 | self->netdev->stats.tx_errors++; |
994 | self->stats.tx_fifo_errors++; | 991 | self->netdev->stats.tx_fifo_errors++; |
995 | hwreset(self); | 992 | hwreset(self); |
996 | // how to clear underrrun ? | 993 | // how to clear underrrun ? |
997 | } else { | 994 | } else { |
998 | self->stats.tx_packets++; | 995 | self->netdev->stats.tx_packets++; |
999 | ResetChip(iobase, 3); | 996 | ResetChip(iobase, 3); |
1000 | ResetChip(iobase, 4); | 997 | ResetChip(iobase, 4); |
1001 | } | 998 | } |
@@ -1119,8 +1116,8 @@ static int via_ircc_dma_receive_complete(struct via_ircc_cb *self, | |||
1119 | } | 1116 | } |
1120 | // Move to next frame | 1117 | // Move to next frame |
1121 | self->rx_buff.data += len; | 1118 | self->rx_buff.data += len; |
1122 | self->stats.rx_bytes += len; | 1119 | self->netdev->stats.rx_bytes += len; |
1123 | self->stats.rx_packets++; | 1120 | self->netdev->stats.rx_packets++; |
1124 | skb->dev = self->netdev; | 1121 | skb->dev = self->netdev; |
1125 | skb_reset_mac_header(skb); | 1122 | skb_reset_mac_header(skb); |
1126 | skb->protocol = htons(ETH_P_IRDA); | 1123 | skb->protocol = htons(ETH_P_IRDA); |
@@ -1180,7 +1177,7 @@ F01_E */ | |||
1180 | */ | 1177 | */ |
1181 | if ((skb == NULL) || (skb->data == NULL) | 1178 | if ((skb == NULL) || (skb->data == NULL) |
1182 | || (self->rx_buff.data == NULL) || (len < 6)) { | 1179 | || (self->rx_buff.data == NULL) || (len < 6)) { |
1183 | self->stats.rx_dropped++; | 1180 | self->netdev->stats.rx_dropped++; |
1184 | return TRUE; | 1181 | return TRUE; |
1185 | } | 1182 | } |
1186 | skb_reserve(skb, 1); | 1183 | skb_reserve(skb, 1); |
@@ -1192,8 +1189,8 @@ F01_E */ | |||
1192 | 1189 | ||
1193 | // Move to next frame | 1190 | // Move to next frame |
1194 | self->rx_buff.data += len; | 1191 | self->rx_buff.data += len; |
1195 | self->stats.rx_bytes += len; | 1192 | self->netdev->stats.rx_bytes += len; |
1196 | self->stats.rx_packets++; | 1193 | self->netdev->stats.rx_packets++; |
1197 | skb->dev = self->netdev; | 1194 | skb->dev = self->netdev; |
1198 | skb_reset_mac_header(skb); | 1195 | skb_reset_mac_header(skb); |
1199 | skb->protocol = htons(ETH_P_IRDA); | 1196 | skb->protocol = htons(ETH_P_IRDA); |
@@ -1220,13 +1217,13 @@ static int upload_rxdata(struct via_ircc_cb *self, int iobase) | |||
1220 | IRDA_DEBUG(2, "%s(): len=%x\n", __func__, len); | 1217 | IRDA_DEBUG(2, "%s(): len=%x\n", __func__, len); |
1221 | 1218 | ||
1222 | if ((len - 4) < 2) { | 1219 | if ((len - 4) < 2) { |
1223 | self->stats.rx_dropped++; | 1220 | self->netdev->stats.rx_dropped++; |
1224 | return FALSE; | 1221 | return FALSE; |
1225 | } | 1222 | } |
1226 | 1223 | ||
1227 | skb = dev_alloc_skb(len + 1); | 1224 | skb = dev_alloc_skb(len + 1); |
1228 | if (skb == NULL) { | 1225 | if (skb == NULL) { |
1229 | self->stats.rx_dropped++; | 1226 | self->netdev->stats.rx_dropped++; |
1230 | return FALSE; | 1227 | return FALSE; |
1231 | } | 1228 | } |
1232 | skb_reserve(skb, 1); | 1229 | skb_reserve(skb, 1); |
@@ -1238,8 +1235,8 @@ static int upload_rxdata(struct via_ircc_cb *self, int iobase) | |||
1238 | st_fifo->tail = 0; | 1235 | st_fifo->tail = 0; |
1239 | // Move to next frame | 1236 | // Move to next frame |
1240 | self->rx_buff.data += len; | 1237 | self->rx_buff.data += len; |
1241 | self->stats.rx_bytes += len; | 1238 | self->netdev->stats.rx_bytes += len; |
1242 | self->stats.rx_packets++; | 1239 | self->netdev->stats.rx_packets++; |
1243 | skb->dev = self->netdev; | 1240 | skb->dev = self->netdev; |
1244 | skb_reset_mac_header(skb); | 1241 | skb_reset_mac_header(skb); |
1245 | skb->protocol = htons(ETH_P_IRDA); | 1242 | skb->protocol = htons(ETH_P_IRDA); |
@@ -1295,7 +1292,7 @@ static int RxTimerHandler(struct via_ircc_cb *self, int iobase) | |||
1295 | */ | 1292 | */ |
1296 | if ((skb == NULL) || (skb->data == NULL) | 1293 | if ((skb == NULL) || (skb->data == NULL) |
1297 | || (self->rx_buff.data == NULL) || (len < 6)) { | 1294 | || (self->rx_buff.data == NULL) || (len < 6)) { |
1298 | self->stats.rx_dropped++; | 1295 | self->netdev->stats.rx_dropped++; |
1299 | continue; | 1296 | continue; |
1300 | } | 1297 | } |
1301 | skb_reserve(skb, 1); | 1298 | skb_reserve(skb, 1); |
@@ -1307,8 +1304,8 @@ static int RxTimerHandler(struct via_ircc_cb *self, int iobase) | |||
1307 | 1304 | ||
1308 | // Move to next frame | 1305 | // Move to next frame |
1309 | self->rx_buff.data += len; | 1306 | self->rx_buff.data += len; |
1310 | self->stats.rx_bytes += len; | 1307 | self->netdev->stats.rx_bytes += len; |
1311 | self->stats.rx_packets++; | 1308 | self->netdev->stats.rx_packets++; |
1312 | skb->dev = self->netdev; | 1309 | skb->dev = self->netdev; |
1313 | skb_reset_mac_header(skb); | 1310 | skb_reset_mac_header(skb); |
1314 | skb->protocol = htons(ETH_P_IRDA); | 1311 | skb->protocol = htons(ETH_P_IRDA); |
@@ -1523,7 +1520,7 @@ static int via_ircc_net_open(struct net_device *dev) | |||
1523 | 1520 | ||
1524 | IRDA_ASSERT(dev != NULL, return -1;); | 1521 | IRDA_ASSERT(dev != NULL, return -1;); |
1525 | self = netdev_priv(dev); | 1522 | self = netdev_priv(dev); |
1526 | self->stats.rx_packets = 0; | 1523 | dev->stats.rx_packets = 0; |
1527 | IRDA_ASSERT(self != NULL, return 0;); | 1524 | IRDA_ASSERT(self != NULL, return 0;); |
1528 | iobase = self->io.fir_base; | 1525 | iobase = self->io.fir_base; |
1529 | if (request_irq(self->io.irq, via_ircc_interrupt, 0, dev->name, dev)) { | 1526 | if (request_irq(self->io.irq, via_ircc_interrupt, 0, dev->name, dev)) { |
@@ -1660,14 +1657,6 @@ static int via_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, | |||
1660 | return ret; | 1657 | return ret; |
1661 | } | 1658 | } |
1662 | 1659 | ||
1663 | static struct net_device_stats *via_ircc_net_get_stats(struct net_device | ||
1664 | *dev) | ||
1665 | { | ||
1666 | struct via_ircc_cb *self = netdev_priv(dev); | ||
1667 | |||
1668 | return &self->stats; | ||
1669 | } | ||
1670 | |||
1671 | MODULE_AUTHOR("VIA Technologies,inc"); | 1660 | MODULE_AUTHOR("VIA Technologies,inc"); |
1672 | MODULE_DESCRIPTION("VIA IrDA Device Driver"); | 1661 | MODULE_DESCRIPTION("VIA IrDA Device Driver"); |
1673 | MODULE_LICENSE("GPL"); | 1662 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/net/irda/via-ircc.h b/drivers/net/irda/via-ircc.h index 403c3f77634c..d9d1db03fa2d 100644 --- a/drivers/net/irda/via-ircc.h +++ b/drivers/net/irda/via-ircc.h | |||
@@ -95,7 +95,6 @@ struct via_ircc_cb { | |||
95 | struct tx_fifo tx_fifo; /* Info about frames to be transmitted */ | 95 | struct tx_fifo tx_fifo; /* Info about frames to be transmitted */ |
96 | 96 | ||
97 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ | 97 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ |
98 | struct net_device_stats stats; | ||
99 | 98 | ||
100 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 99 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
101 | struct qos_info qos; /* QoS capabilities for this device */ | 100 | struct qos_info qos; /* QoS capabilities for this device */ |
diff --git a/drivers/net/irda/vlsi_ir.c b/drivers/net/irda/vlsi_ir.c index 0d30f8d659a1..723c4588c803 100644 --- a/drivers/net/irda/vlsi_ir.c +++ b/drivers/net/irda/vlsi_ir.c | |||
@@ -291,14 +291,14 @@ static void vlsi_proc_ndev(struct seq_file *seq, struct net_device *ndev) | |||
291 | now.tv_sec - idev->last_rx.tv_sec - delta1, delta2); | 291 | now.tv_sec - idev->last_rx.tv_sec - delta1, delta2); |
292 | 292 | ||
293 | seq_printf(seq, "RX: packets=%lu / bytes=%lu / errors=%lu / dropped=%lu", | 293 | seq_printf(seq, "RX: packets=%lu / bytes=%lu / errors=%lu / dropped=%lu", |
294 | idev->stats.rx_packets, idev->stats.rx_bytes, idev->stats.rx_errors, | 294 | ndev->stats.rx_packets, ndev->stats.rx_bytes, ndev->stats.rx_errors, |
295 | idev->stats.rx_dropped); | 295 | ndev->stats.rx_dropped); |
296 | seq_printf(seq, " / overrun=%lu / length=%lu / frame=%lu / crc=%lu\n", | 296 | seq_printf(seq, " / overrun=%lu / length=%lu / frame=%lu / crc=%lu\n", |
297 | idev->stats.rx_over_errors, idev->stats.rx_length_errors, | 297 | ndev->stats.rx_over_errors, ndev->stats.rx_length_errors, |
298 | idev->stats.rx_frame_errors, idev->stats.rx_crc_errors); | 298 | ndev->stats.rx_frame_errors, ndev->stats.rx_crc_errors); |
299 | seq_printf(seq, "TX: packets=%lu / bytes=%lu / errors=%lu / dropped=%lu / fifo=%lu\n", | 299 | seq_printf(seq, "TX: packets=%lu / bytes=%lu / errors=%lu / dropped=%lu / fifo=%lu\n", |
300 | idev->stats.tx_packets, idev->stats.tx_bytes, idev->stats.tx_errors, | 300 | ndev->stats.tx_packets, ndev->stats.tx_bytes, ndev->stats.tx_errors, |
301 | idev->stats.tx_dropped, idev->stats.tx_fifo_errors); | 301 | ndev->stats.tx_dropped, ndev->stats.tx_fifo_errors); |
302 | 302 | ||
303 | } | 303 | } |
304 | 304 | ||
@@ -651,21 +651,21 @@ static void vlsi_rx_interrupt(struct net_device *ndev) | |||
651 | 651 | ||
652 | if (ret < 0) { | 652 | if (ret < 0) { |
653 | ret = -ret; | 653 | ret = -ret; |
654 | idev->stats.rx_errors++; | 654 | ndev->stats.rx_errors++; |
655 | if (ret & VLSI_RX_DROP) | 655 | if (ret & VLSI_RX_DROP) |
656 | idev->stats.rx_dropped++; | 656 | ndev->stats.rx_dropped++; |
657 | if (ret & VLSI_RX_OVER) | 657 | if (ret & VLSI_RX_OVER) |
658 | idev->stats.rx_over_errors++; | 658 | ndev->stats.rx_over_errors++; |
659 | if (ret & VLSI_RX_LENGTH) | 659 | if (ret & VLSI_RX_LENGTH) |
660 | idev->stats.rx_length_errors++; | 660 | ndev->stats.rx_length_errors++; |
661 | if (ret & VLSI_RX_FRAME) | 661 | if (ret & VLSI_RX_FRAME) |
662 | idev->stats.rx_frame_errors++; | 662 | ndev->stats.rx_frame_errors++; |
663 | if (ret & VLSI_RX_CRC) | 663 | if (ret & VLSI_RX_CRC) |
664 | idev->stats.rx_crc_errors++; | 664 | ndev->stats.rx_crc_errors++; |
665 | } | 665 | } |
666 | else if (ret > 0) { | 666 | else if (ret > 0) { |
667 | idev->stats.rx_packets++; | 667 | ndev->stats.rx_packets++; |
668 | idev->stats.rx_bytes += ret; | 668 | ndev->stats.rx_bytes += ret; |
669 | } | 669 | } |
670 | } | 670 | } |
671 | 671 | ||
@@ -686,6 +686,7 @@ static void vlsi_rx_interrupt(struct net_device *ndev) | |||
686 | 686 | ||
687 | static void vlsi_unarm_rx(vlsi_irda_dev_t *idev) | 687 | static void vlsi_unarm_rx(vlsi_irda_dev_t *idev) |
688 | { | 688 | { |
689 | struct net_device *ndev = pci_get_drvdata(idev->pdev); | ||
689 | struct vlsi_ring *r = idev->rx_ring; | 690 | struct vlsi_ring *r = idev->rx_ring; |
690 | struct ring_descr *rd; | 691 | struct ring_descr *rd; |
691 | int ret; | 692 | int ret; |
@@ -711,21 +712,21 @@ static void vlsi_unarm_rx(vlsi_irda_dev_t *idev) | |||
711 | 712 | ||
712 | if (ret < 0) { | 713 | if (ret < 0) { |
713 | ret = -ret; | 714 | ret = -ret; |
714 | idev->stats.rx_errors++; | 715 | ndev->stats.rx_errors++; |
715 | if (ret & VLSI_RX_DROP) | 716 | if (ret & VLSI_RX_DROP) |
716 | idev->stats.rx_dropped++; | 717 | ndev->stats.rx_dropped++; |
717 | if (ret & VLSI_RX_OVER) | 718 | if (ret & VLSI_RX_OVER) |
718 | idev->stats.rx_over_errors++; | 719 | ndev->stats.rx_over_errors++; |
719 | if (ret & VLSI_RX_LENGTH) | 720 | if (ret & VLSI_RX_LENGTH) |
720 | idev->stats.rx_length_errors++; | 721 | ndev->stats.rx_length_errors++; |
721 | if (ret & VLSI_RX_FRAME) | 722 | if (ret & VLSI_RX_FRAME) |
722 | idev->stats.rx_frame_errors++; | 723 | ndev->stats.rx_frame_errors++; |
723 | if (ret & VLSI_RX_CRC) | 724 | if (ret & VLSI_RX_CRC) |
724 | idev->stats.rx_crc_errors++; | 725 | ndev->stats.rx_crc_errors++; |
725 | } | 726 | } |
726 | else if (ret > 0) { | 727 | else if (ret > 0) { |
727 | idev->stats.rx_packets++; | 728 | ndev->stats.rx_packets++; |
728 | idev->stats.rx_bytes += ret; | 729 | ndev->stats.rx_bytes += ret; |
729 | } | 730 | } |
730 | } | 731 | } |
731 | } | 732 | } |
@@ -1050,8 +1051,8 @@ drop_unlock: | |||
1050 | drop: | 1051 | drop: |
1051 | IRDA_WARNING("%s: dropping packet - %s\n", __func__, msg); | 1052 | IRDA_WARNING("%s: dropping packet - %s\n", __func__, msg); |
1052 | dev_kfree_skb_any(skb); | 1053 | dev_kfree_skb_any(skb); |
1053 | idev->stats.tx_errors++; | 1054 | ndev->stats.tx_errors++; |
1054 | idev->stats.tx_dropped++; | 1055 | ndev->stats.tx_dropped++; |
1055 | /* Don't even think about returning NET_XMIT_DROP (=1) here! | 1056 | /* Don't even think about returning NET_XMIT_DROP (=1) here! |
1056 | * In fact any retval!=0 causes the packet scheduler to requeue the | 1057 | * In fact any retval!=0 causes the packet scheduler to requeue the |
1057 | * packet for later retry of transmission - which isn't exactly | 1058 | * packet for later retry of transmission - which isn't exactly |
@@ -1078,15 +1079,15 @@ static void vlsi_tx_interrupt(struct net_device *ndev) | |||
1078 | 1079 | ||
1079 | if (ret < 0) { | 1080 | if (ret < 0) { |
1080 | ret = -ret; | 1081 | ret = -ret; |
1081 | idev->stats.tx_errors++; | 1082 | ndev->stats.tx_errors++; |
1082 | if (ret & VLSI_TX_DROP) | 1083 | if (ret & VLSI_TX_DROP) |
1083 | idev->stats.tx_dropped++; | 1084 | ndev->stats.tx_dropped++; |
1084 | if (ret & VLSI_TX_FIFO) | 1085 | if (ret & VLSI_TX_FIFO) |
1085 | idev->stats.tx_fifo_errors++; | 1086 | ndev->stats.tx_fifo_errors++; |
1086 | } | 1087 | } |
1087 | else if (ret > 0){ | 1088 | else if (ret > 0){ |
1088 | idev->stats.tx_packets++; | 1089 | ndev->stats.tx_packets++; |
1089 | idev->stats.tx_bytes += ret; | 1090 | ndev->stats.tx_bytes += ret; |
1090 | } | 1091 | } |
1091 | } | 1092 | } |
1092 | 1093 | ||
@@ -1122,6 +1123,7 @@ static void vlsi_tx_interrupt(struct net_device *ndev) | |||
1122 | 1123 | ||
1123 | static void vlsi_unarm_tx(vlsi_irda_dev_t *idev) | 1124 | static void vlsi_unarm_tx(vlsi_irda_dev_t *idev) |
1124 | { | 1125 | { |
1126 | struct net_device *ndev = pci_get_drvdata(idev->pdev); | ||
1125 | struct vlsi_ring *r = idev->tx_ring; | 1127 | struct vlsi_ring *r = idev->tx_ring; |
1126 | struct ring_descr *rd; | 1128 | struct ring_descr *rd; |
1127 | int ret; | 1129 | int ret; |
@@ -1145,15 +1147,15 @@ static void vlsi_unarm_tx(vlsi_irda_dev_t *idev) | |||
1145 | 1147 | ||
1146 | if (ret < 0) { | 1148 | if (ret < 0) { |
1147 | ret = -ret; | 1149 | ret = -ret; |
1148 | idev->stats.tx_errors++; | 1150 | ndev->stats.tx_errors++; |
1149 | if (ret & VLSI_TX_DROP) | 1151 | if (ret & VLSI_TX_DROP) |
1150 | idev->stats.tx_dropped++; | 1152 | ndev->stats.tx_dropped++; |
1151 | if (ret & VLSI_TX_FIFO) | 1153 | if (ret & VLSI_TX_FIFO) |
1152 | idev->stats.tx_fifo_errors++; | 1154 | ndev->stats.tx_fifo_errors++; |
1153 | } | 1155 | } |
1154 | else if (ret > 0){ | 1156 | else if (ret > 0){ |
1155 | idev->stats.tx_packets++; | 1157 | ndev->stats.tx_packets++; |
1156 | idev->stats.tx_bytes += ret; | 1158 | ndev->stats.tx_bytes += ret; |
1157 | } | 1159 | } |
1158 | } | 1160 | } |
1159 | 1161 | ||
@@ -1373,13 +1375,6 @@ static int vlsi_stop_hw(vlsi_irda_dev_t *idev) | |||
1373 | 1375 | ||
1374 | /**************************************************************/ | 1376 | /**************************************************************/ |
1375 | 1377 | ||
1376 | static struct net_device_stats * vlsi_get_stats(struct net_device *ndev) | ||
1377 | { | ||
1378 | vlsi_irda_dev_t *idev = netdev_priv(ndev); | ||
1379 | |||
1380 | return &idev->stats; | ||
1381 | } | ||
1382 | |||
1383 | static void vlsi_tx_timeout(struct net_device *ndev) | 1378 | static void vlsi_tx_timeout(struct net_device *ndev) |
1384 | { | 1379 | { |
1385 | vlsi_irda_dev_t *idev = netdev_priv(ndev); | 1380 | vlsi_irda_dev_t *idev = netdev_priv(ndev); |
@@ -1615,7 +1610,6 @@ static int vlsi_irda_init(struct net_device *ndev) | |||
1615 | 1610 | ||
1616 | ndev->open = vlsi_open; | 1611 | ndev->open = vlsi_open; |
1617 | ndev->stop = vlsi_close; | 1612 | ndev->stop = vlsi_close; |
1618 | ndev->get_stats = vlsi_get_stats; | ||
1619 | ndev->hard_start_xmit = vlsi_hard_start_xmit; | 1613 | ndev->hard_start_xmit = vlsi_hard_start_xmit; |
1620 | ndev->do_ioctl = vlsi_ioctl; | 1614 | ndev->do_ioctl = vlsi_ioctl; |
1621 | ndev->tx_timeout = vlsi_tx_timeout; | 1615 | ndev->tx_timeout = vlsi_tx_timeout; |
diff --git a/drivers/net/irda/vlsi_ir.h b/drivers/net/irda/vlsi_ir.h index 9b1884329fba..3050d1a0cccf 100644 --- a/drivers/net/irda/vlsi_ir.h +++ b/drivers/net/irda/vlsi_ir.h | |||
@@ -712,7 +712,6 @@ static inline struct ring_descr *ring_get(struct vlsi_ring *r) | |||
712 | 712 | ||
713 | typedef struct vlsi_irda_dev { | 713 | typedef struct vlsi_irda_dev { |
714 | struct pci_dev *pdev; | 714 | struct pci_dev *pdev; |
715 | struct net_device_stats stats; | ||
716 | 715 | ||
717 | struct irlap_cb *irlap; | 716 | struct irlap_cb *irlap; |
718 | 717 | ||
diff --git a/drivers/net/irda/w83977af_ir.c b/drivers/net/irda/w83977af_ir.c index 30ec9131c5ce..dc0a2e4d830f 100644 --- a/drivers/net/irda/w83977af_ir.c +++ b/drivers/net/irda/w83977af_ir.c | |||
@@ -102,7 +102,6 @@ static int w83977af_is_receiving(struct w83977af_ir *self); | |||
102 | static int w83977af_net_open(struct net_device *dev); | 102 | static int w83977af_net_open(struct net_device *dev); |
103 | static int w83977af_net_close(struct net_device *dev); | 103 | static int w83977af_net_close(struct net_device *dev); |
104 | static int w83977af_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); | 104 | static int w83977af_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); |
105 | static struct net_device_stats *w83977af_net_get_stats(struct net_device *dev); | ||
106 | 105 | ||
107 | /* | 106 | /* |
108 | * Function w83977af_init () | 107 | * Function w83977af_init () |
@@ -237,7 +236,6 @@ static int w83977af_open(int i, unsigned int iobase, unsigned int irq, | |||
237 | dev->open = w83977af_net_open; | 236 | dev->open = w83977af_net_open; |
238 | dev->stop = w83977af_net_close; | 237 | dev->stop = w83977af_net_close; |
239 | dev->do_ioctl = w83977af_net_ioctl; | 238 | dev->do_ioctl = w83977af_net_ioctl; |
240 | dev->get_stats = w83977af_net_get_stats; | ||
241 | 239 | ||
242 | err = register_netdev(dev); | 240 | err = register_netdev(dev); |
243 | if (err) { | 241 | if (err) { |
@@ -702,13 +700,13 @@ static void w83977af_dma_xmit_complete(struct w83977af_ir *self) | |||
702 | if (inb(iobase+AUDR) & AUDR_UNDR) { | 700 | if (inb(iobase+AUDR) & AUDR_UNDR) { |
703 | IRDA_DEBUG(0, "%s(), Transmit underrun!\n", __func__ ); | 701 | IRDA_DEBUG(0, "%s(), Transmit underrun!\n", __func__ ); |
704 | 702 | ||
705 | self->stats.tx_errors++; | 703 | self->netdev->stats.tx_errors++; |
706 | self->stats.tx_fifo_errors++; | 704 | self->netdev->stats.tx_fifo_errors++; |
707 | 705 | ||
708 | /* Clear bit, by writing 1 to it */ | 706 | /* Clear bit, by writing 1 to it */ |
709 | outb(AUDR_UNDR, iobase+AUDR); | 707 | outb(AUDR_UNDR, iobase+AUDR); |
710 | } else | 708 | } else |
711 | self->stats.tx_packets++; | 709 | self->netdev->stats.tx_packets++; |
712 | 710 | ||
713 | 711 | ||
714 | if (self->new_speed) { | 712 | if (self->new_speed) { |
@@ -846,28 +844,28 @@ static int w83977af_dma_receive_complete(struct w83977af_ir *self) | |||
846 | if (status & FS_FO_ERR_MSK) { | 844 | if (status & FS_FO_ERR_MSK) { |
847 | if (status & FS_FO_LST_FR) { | 845 | if (status & FS_FO_LST_FR) { |
848 | /* Add number of lost frames to stats */ | 846 | /* Add number of lost frames to stats */ |
849 | self->stats.rx_errors += len; | 847 | self->netdev->stats.rx_errors += len; |
850 | } else { | 848 | } else { |
851 | /* Skip frame */ | 849 | /* Skip frame */ |
852 | self->stats.rx_errors++; | 850 | self->netdev->stats.rx_errors++; |
853 | 851 | ||
854 | self->rx_buff.data += len; | 852 | self->rx_buff.data += len; |
855 | 853 | ||
856 | if (status & FS_FO_MX_LEX) | 854 | if (status & FS_FO_MX_LEX) |
857 | self->stats.rx_length_errors++; | 855 | self->netdev->stats.rx_length_errors++; |
858 | 856 | ||
859 | if (status & FS_FO_PHY_ERR) | 857 | if (status & FS_FO_PHY_ERR) |
860 | self->stats.rx_frame_errors++; | 858 | self->netdev->stats.rx_frame_errors++; |
861 | 859 | ||
862 | if (status & FS_FO_CRC_ERR) | 860 | if (status & FS_FO_CRC_ERR) |
863 | self->stats.rx_crc_errors++; | 861 | self->netdev->stats.rx_crc_errors++; |
864 | } | 862 | } |
865 | /* The errors below can be reported in both cases */ | 863 | /* The errors below can be reported in both cases */ |
866 | if (status & FS_FO_RX_OV) | 864 | if (status & FS_FO_RX_OV) |
867 | self->stats.rx_fifo_errors++; | 865 | self->netdev->stats.rx_fifo_errors++; |
868 | 866 | ||
869 | if (status & FS_FO_FSF_OV) | 867 | if (status & FS_FO_FSF_OV) |
870 | self->stats.rx_fifo_errors++; | 868 | self->netdev->stats.rx_fifo_errors++; |
871 | 869 | ||
872 | } else { | 870 | } else { |
873 | /* Check if we have transferred all data to memory */ | 871 | /* Check if we have transferred all data to memory */ |
@@ -917,7 +915,7 @@ static int w83977af_dma_receive_complete(struct w83977af_ir *self) | |||
917 | 915 | ||
918 | /* Move to next frame */ | 916 | /* Move to next frame */ |
919 | self->rx_buff.data += len; | 917 | self->rx_buff.data += len; |
920 | self->stats.rx_packets++; | 918 | self->netdev->stats.rx_packets++; |
921 | 919 | ||
922 | skb->dev = self->netdev; | 920 | skb->dev = self->netdev; |
923 | skb_reset_mac_header(skb); | 921 | skb_reset_mac_header(skb); |
@@ -951,7 +949,7 @@ static void w83977af_pio_receive(struct w83977af_ir *self) | |||
951 | /* Receive all characters in Rx FIFO */ | 949 | /* Receive all characters in Rx FIFO */ |
952 | do { | 950 | do { |
953 | byte = inb(iobase+RBR); | 951 | byte = inb(iobase+RBR); |
954 | async_unwrap_char(self->netdev, &self->stats, &self->rx_buff, | 952 | async_unwrap_char(self->netdev, &self->netdev->stats, &self->rx_buff, |
955 | byte); | 953 | byte); |
956 | } while (inb(iobase+USR) & USR_RDR); /* Data available */ | 954 | } while (inb(iobase+USR) & USR_RDR); /* Data available */ |
957 | } | 955 | } |
@@ -994,7 +992,7 @@ static __u8 w83977af_sir_interrupt(struct w83977af_ir *self, int isr) | |||
994 | outb(AUDR_SFEND, iobase+AUDR); | 992 | outb(AUDR_SFEND, iobase+AUDR); |
995 | outb(set, iobase+SSR); | 993 | outb(set, iobase+SSR); |
996 | 994 | ||
997 | self->stats.tx_packets++; | 995 | self->netdev->stats.tx_packets++; |
998 | 996 | ||
999 | /* Feed me more packets */ | 997 | /* Feed me more packets */ |
1000 | netif_wake_queue(self->netdev); | 998 | netif_wake_queue(self->netdev); |
@@ -1336,13 +1334,6 @@ out: | |||
1336 | return ret; | 1334 | return ret; |
1337 | } | 1335 | } |
1338 | 1336 | ||
1339 | static struct net_device_stats *w83977af_net_get_stats(struct net_device *dev) | ||
1340 | { | ||
1341 | struct w83977af_ir *self = netdev_priv(dev); | ||
1342 | |||
1343 | return &self->stats; | ||
1344 | } | ||
1345 | |||
1346 | MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>"); | 1337 | MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>"); |
1347 | MODULE_DESCRIPTION("Winbond W83977AF IrDA Device Driver"); | 1338 | MODULE_DESCRIPTION("Winbond W83977AF IrDA Device Driver"); |
1348 | MODULE_LICENSE("GPL"); | 1339 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/net/irda/w83977af_ir.h b/drivers/net/irda/w83977af_ir.h index 87c3975baf62..fefe9b11e200 100644 --- a/drivers/net/irda/w83977af_ir.h +++ b/drivers/net/irda/w83977af_ir.h | |||
@@ -172,7 +172,6 @@ struct w83977af_ir { | |||
172 | int tx_len; /* Number of frames in tx_buff */ | 172 | int tx_len; /* Number of frames in tx_buff */ |
173 | 173 | ||
174 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ | 174 | struct net_device *netdev; /* Yes! we are some kind of netdevice */ |
175 | struct net_device_stats stats; | ||
176 | 175 | ||
177 | struct irlap_cb *irlap; /* The link layer we are binded to */ | 176 | struct irlap_cb *irlap; /* The link layer we are binded to */ |
178 | struct qos_info qos; /* QoS capabilities for this device */ | 177 | struct qos_info qos; /* QoS capabilities for this device */ |