clocksource: improve sh_cmt clocksource overflow handling
[linux-2.6.git] / drivers / net / ifb.c
index 448e618..60a2630 100644 (file)
@@ -40,7 +40,6 @@
 
 #define TX_Q_LIMIT    32
 struct ifb_private {
-       struct net_device_stats stats;
        struct tasklet_struct   ifb_tasklet;
        int     tasklet_pending;
        /* mostly debug stats leave in for now */
@@ -61,7 +60,6 @@ static int numifbs = 2;
 
 static void ri_tasklet(unsigned long dev);
 static int ifb_xmit(struct sk_buff *skb, struct net_device *dev);
-static struct net_device_stats *ifb_get_stats(struct net_device *dev);
 static int ifb_open(struct net_device *dev);
 static int ifb_close(struct net_device *dev);
 
@@ -70,19 +68,21 @@ static void ri_tasklet(unsigned long dev)
 
        struct net_device *_dev = (struct net_device *)dev;
        struct ifb_private *dp = netdev_priv(_dev);
-       struct net_device_stats *stats = &dp->stats;
+       struct net_device_stats *stats = &_dev->stats;
+       struct netdev_queue *txq;
        struct sk_buff *skb;
 
+       txq = netdev_get_tx_queue(_dev, 0);
        dp->st_task_enter++;
        if ((skb = skb_peek(&dp->tq)) == NULL) {
                dp->st_txq_refl_try++;
-               if (netif_tx_trylock(_dev)) {
+               if (__netif_tx_trylock(txq)) {
                        dp->st_rxq_enter++;
                        while ((skb = skb_dequeue(&dp->rq)) != NULL) {
                                skb_queue_tail(&dp->tq, skb);
                                dp->st_rx2tx_tran++;
                        }
-                       netif_tx_unlock(_dev);
+                       __netif_tx_unlock(txq);
                } else {
                        /* reschedule */
                        dp->st_rxq_notenter++;
@@ -117,7 +117,7 @@ static void ri_tasklet(unsigned long dev)
                        BUG();
        }
 
-       if (netif_tx_trylock(_dev)) {
+       if (__netif_tx_trylock(txq)) {
                dp->st_rxq_check++;
                if ((skb = skb_peek(&dp->rq)) == NULL) {
                        dp->tasklet_pending = 0;
@@ -125,10 +125,10 @@ static void ri_tasklet(unsigned long dev)
                                netif_wake_queue(_dev);
                } else {
                        dp->st_rxq_rsch++;
-                       netif_tx_unlock(_dev);
+                       __netif_tx_unlock(txq);
                        goto resched;
                }
-               netif_tx_unlock(_dev);
+               __netif_tx_unlock(txq);
        } else {
 resched:
                dp->tasklet_pending = 1;
@@ -137,19 +137,23 @@ resched:
 
 }
 
+static const struct net_device_ops ifb_netdev_ops = {
+       .ndo_open       = ifb_open,
+       .ndo_stop       = ifb_close,
+       .ndo_start_xmit = ifb_xmit,
+       .ndo_validate_addr = eth_validate_addr,
+};
+
 static void ifb_setup(struct net_device *dev)
 {
        /* Initialize the device structure. */
-       dev->get_stats = ifb_get_stats;
-       dev->hard_start_xmit = ifb_xmit;
-       dev->open = &ifb_open;
-       dev->stop = &ifb_close;
        dev->destructor = free_netdev;
+       dev->netdev_ops = &ifb_netdev_ops;
 
        /* Fill in device structure with ethernet-generic values. */
        ether_setup(dev);
        dev->tx_queue_len = TX_Q_LIMIT;
-       dev->change_mtu = NULL;
+
        dev->flags |= IFF_NOARP;
        dev->flags &= ~IFF_MULTICAST;
        random_ether_addr(dev->dev_addr);
@@ -158,7 +162,7 @@ static void ifb_setup(struct net_device *dev)
 static int ifb_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct ifb_private *dp = netdev_priv(dev);
-       struct net_device_stats *stats = &dp->stats;
+       struct net_device_stats *stats = &dev->stats;
        int ret = 0;
        u32 from = G_TC_FROM(skb->tc_verd);
 
@@ -185,19 +189,6 @@ static int ifb_xmit(struct sk_buff *skb, struct net_device *dev)
        return ret;
 }
 
-static struct net_device_stats *ifb_get_stats(struct net_device *dev)
-{
-       struct ifb_private *dp = netdev_priv(dev);
-       struct net_device_stats *stats = &dp->stats;
-
-       pr_debug("tasklets stats %ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld \n",
-               dp->st_task_enter, dp->st_txq_refl_try, dp->st_rxq_enter,
-               dp->st_rx2tx_tran, dp->st_rxq_notenter, dp->st_rx_frm_egr,
-               dp->st_rx_frm_ing, dp->st_rxq_check, dp->st_rxq_rsch);
-
-       return stats;
-}
-
 static int ifb_close(struct net_device *dev)
 {
        struct ifb_private *dp = netdev_priv(dev);
@@ -262,6 +253,7 @@ static int __init ifb_init_one(int index)
        err = register_netdevice(dev_ifb);
        if (err < 0)
                goto err;
+
        return 0;
 
 err: