Merge branch 'core-printk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / drivers / net / gianfar.c
index ff60b23..835cd25 100644 (file)
@@ -10,7 +10,7 @@
  * Maintainer: Kumar Gala
  * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com>
  *
- * Copyright 2002-2009 Freescale Semiconductor, Inc.
+ * Copyright 2002-2009, 2011 Freescale Semiconductor, Inc.
  * Copyright 2007 MontaVista Software, Inc.
  *
  * This program is free software; you can redistribute  it and/or modify it
@@ -62,6 +62,9 @@
  *  The driver then cleans up the buffer.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+#define DEBUG
+
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/errno.h>
@@ -137,8 +140,6 @@ int gfar_clean_rx_ring(struct gfar_priv_rx_q *rx_queue, int rx_work_limit);
 static int gfar_clean_tx_ring(struct gfar_priv_tx_q *tx_queue);
 static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb,
                              int amount_pull);
-static void gfar_vlan_rx_register(struct net_device *netdev,
-                               struct vlan_group *grp);
 void gfar_halt(struct net_device *dev);
 static void gfar_halt_nodisable(struct net_device *dev);
 void gfar_start(struct net_device *dev);
@@ -213,8 +214,7 @@ static int gfar_init_bds(struct net_device *ndev)
                        } else {
                                skb = gfar_new_skb(ndev);
                                if (!skb) {
-                                       pr_err("%s: Can't allocate RX buffers\n",
-                                                       ndev->name);
+                                       netdev_err(ndev, "Can't allocate RX buffers\n");
                                        goto err_rxalloc_fail;
                                }
                                rx_queue->rx_skbuff[j] = skb;
@@ -258,15 +258,14 @@ static int gfar_alloc_skb_resources(struct net_device *ndev)
                        sizeof(struct rxbd8) * priv->total_rx_ring_size,
                        &addr, GFP_KERNEL);
        if (!vaddr) {
-               if (netif_msg_ifup(priv))
-                       pr_err("%s: Could not allocate buffer descriptors!\n",
-                              ndev->name);
+               netif_err(priv, ifup, ndev,
+                         "Could not allocate buffer descriptors!\n");
                return -ENOMEM;
        }
 
        for (i = 0; i < priv->num_tx_queues; i++) {
                tx_queue = priv->tx_queue[i];
-               tx_queue->tx_bd_base = (struct txbd8 *) vaddr;
+               tx_queue->tx_bd_base = vaddr;
                tx_queue->tx_bd_dma_base = addr;
                tx_queue->dev = ndev;
                /* enet DMA only understands physical addresses */
@@ -277,7 +276,7 @@ static int gfar_alloc_skb_resources(struct net_device *ndev)
        /* Start the rx descriptor ring where the tx ring leaves off */
        for (i = 0; i < priv->num_rx_queues; i++) {
                rx_queue = priv->rx_queue[i];
-               rx_queue->rx_bd_base = (struct rxbd8 *) vaddr;
+               rx_queue->rx_bd_base = vaddr;
                rx_queue->rx_bd_dma_base = addr;
                rx_queue->dev = ndev;
                addr    += sizeof (struct rxbd8) * rx_queue->rx_ring_size;
@@ -290,9 +289,8 @@ static int gfar_alloc_skb_resources(struct net_device *ndev)
                tx_queue->tx_skbuff = kmalloc(sizeof(*tx_queue->tx_skbuff) *
                                  tx_queue->tx_ring_size, GFP_KERNEL);
                if (!tx_queue->tx_skbuff) {
-                       if (netif_msg_ifup(priv))
-                               pr_err("%s: Could not allocate tx_skbuff\n",
-                                               ndev->name);
+                       netif_err(priv, ifup, ndev,
+                                 "Could not allocate tx_skbuff\n");
                        goto cleanup;
                }
 
@@ -306,9 +304,8 @@ static int gfar_alloc_skb_resources(struct net_device *ndev)
                                  rx_queue->rx_ring_size, GFP_KERNEL);
 
                if (!rx_queue->rx_skbuff) {
-                       if (netif_msg_ifup(priv))
-                               pr_err("%s: Could not allocate rx_skbuff\n",
-                                      ndev->name);
+                       netif_err(priv, ifup, ndev,
+                                 "Could not allocate rx_skbuff\n");
                        goto cleanup;
                }
 
@@ -392,10 +389,11 @@ static void gfar_init_mac(struct net_device *ndev)
                rctrl |= RCTRL_PRSDEP_INIT | RCTRL_TS_ENABLE;
 
        /* keep vlan related bits if it's enabled */
-       if (priv->vlgrp) {
+       if (ndev->features & NETIF_F_HW_VLAN_TX)
                rctrl |= RCTRL_VLEX | RCTRL_PRSDEP_INIT;
+
+       if (ndev->features & NETIF_F_HW_VLAN_RX)
                tctrl |= TCTRL_VLINS;
-       }
 
        /* Init rctrl based on our settings */
        gfar_write(&regs->rctrl, rctrl);
@@ -468,7 +466,6 @@ static const struct net_device_ops gfar_netdev_ops = {
        .ndo_tx_timeout = gfar_timeout,
        .ndo_do_ioctl = gfar_ioctl,
        .ndo_get_stats = gfar_get_stats,
-       .ndo_vlan_rx_register = gfar_vlan_rx_register,
        .ndo_set_mac_address = eth_mac_addr,
        .ndo_validate_addr = eth_validate_addr,
 #ifdef CONFIG_NET_POLL_CONTROLLER
@@ -476,9 +473,6 @@ static const struct net_device_ops gfar_netdev_ops = {
 #endif
 };
 
-unsigned int ftp_rqfpr[MAX_FILER_IDX + 1];
-unsigned int ftp_rqfcr[MAX_FILER_IDX + 1];
-
 void lock_rx_qs(struct gfar_private *priv)
 {
        int i = 0x0;
@@ -511,10 +505,17 @@ void unlock_tx_qs(struct gfar_private *priv)
                spin_unlock(&priv->tx_queue[i]->txlock);
 }
 
+static bool gfar_is_vlan_on(struct gfar_private *priv)
+{
+       return (priv->ndev->features & NETIF_F_HW_VLAN_RX) ||
+              (priv->ndev->features & NETIF_F_HW_VLAN_TX);
+}
+
 /* Returns 1 if incoming frames use an FCB */
 static inline int gfar_uses_fcb(struct gfar_private *priv)
 {
-       return priv->vlgrp || (priv->ndev->features & NETIF_F_RXCSUM) ||
+       return gfar_is_vlan_on(priv) ||
+               (priv->ndev->features & NETIF_F_RXCSUM) ||
                (priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER);
 }
 
@@ -628,9 +629,9 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
        num_tx_qs = tx_queues ? *tx_queues : 1;
 
        if (num_tx_qs > MAX_TX_QS) {
-               printk(KERN_ERR "num_tx_qs(=%d) greater than MAX_TX_QS(=%d)\n",
-                               num_tx_qs, MAX_TX_QS);
-               printk(KERN_ERR "Cannot do alloc_etherdev, aborting\n");
+               pr_err("num_tx_qs(=%d) greater than MAX_TX_QS(=%d)\n",
+                      num_tx_qs, MAX_TX_QS);
+               pr_err("Cannot do alloc_etherdev, aborting\n");
                return -EINVAL;
        }
 
@@ -638,9 +639,9 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
        num_rx_qs = rx_queues ? *rx_queues : 1;
 
        if (num_rx_qs > MAX_RX_QS) {
-               printk(KERN_ERR "num_rx_qs(=%d) greater than MAX_RX_QS(=%d)\n",
-                               num_tx_qs, MAX_TX_QS);
-               printk(KERN_ERR "Cannot do alloc_etherdev, aborting\n");
+               pr_err("num_rx_qs(=%d) greater than MAX_RX_QS(=%d)\n",
+                      num_rx_qs, MAX_RX_QS);
+               pr_err("Cannot do alloc_etherdev, aborting\n");
                return -EINVAL;
        }
 
@@ -658,6 +659,11 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
        priv->num_rx_queues = num_rx_qs;
        priv->num_grps = 0x0;
 
+       /* Init Rx queue filer rule set linked list*/
+       INIT_LIST_HEAD(&priv->rx_list.list);
+       priv->rx_list.count = 0;
+       mutex_init(&priv->rx_queue_access);
+
        model = of_get_property(np, "model", NULL);
 
        for (i = 0; i < MAXGROUPS; i++)
@@ -868,28 +874,28 @@ static u32 cluster_entry_per_class(struct gfar_private *priv, u32 rqfar,
 
        rqfar--;
        rqfcr = RQFCR_CLE | RQFCR_PID_MASK | RQFCR_CMP_EXACT;
-       ftp_rqfpr[rqfar] = rqfpr;
-       ftp_rqfcr[rqfar] = rqfcr;
+       priv->ftp_rqfpr[rqfar] = rqfpr;
+       priv->ftp_rqfcr[rqfar] = rqfcr;
        gfar_write_filer(priv, rqfar, rqfcr, rqfpr);
 
        rqfar--;
        rqfcr = RQFCR_CMP_NOMATCH;
-       ftp_rqfpr[rqfar] = rqfpr;
-       ftp_rqfcr[rqfar] = rqfcr;
+       priv->ftp_rqfpr[rqfar] = rqfpr;
+       priv->ftp_rqfcr[rqfar] = rqfcr;
        gfar_write_filer(priv, rqfar, rqfcr, rqfpr);
 
        rqfar--;
        rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_PARSE | RQFCR_CLE | RQFCR_AND;
        rqfpr = class;
-       ftp_rqfcr[rqfar] = rqfcr;
-       ftp_rqfpr[rqfar] = rqfpr;
+       priv->ftp_rqfcr[rqfar] = rqfcr;
+       priv->ftp_rqfpr[rqfar] = rqfpr;
        gfar_write_filer(priv, rqfar, rqfcr, rqfpr);
 
        rqfar--;
        rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_MASK | RQFCR_AND;
        rqfpr = class;
-       ftp_rqfcr[rqfar] = rqfcr;
-       ftp_rqfpr[rqfar] = rqfpr;
+       priv->ftp_rqfcr[rqfar] = rqfcr;
+       priv->ftp_rqfpr[rqfar] = rqfpr;
        gfar_write_filer(priv, rqfar, rqfcr, rqfpr);
 
        return rqfar;
@@ -904,8 +910,8 @@ static void gfar_init_filer_table(struct gfar_private *priv)
 
        /* Default rule */
        rqfcr = RQFCR_CMP_MATCH;
-       ftp_rqfcr[rqfar] = rqfcr;
-       ftp_rqfpr[rqfar] = rqfpr;
+       priv->ftp_rqfcr[rqfar] = rqfcr;
+       priv->ftp_rqfpr[rqfar] = rqfpr;
        gfar_write_filer(priv, rqfar, rqfcr, rqfpr);
 
        rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV6);
@@ -921,8 +927,8 @@ static void gfar_init_filer_table(struct gfar_private *priv)
        /* Rest are masked rules */
        rqfcr = RQFCR_CMP_NOMATCH;
        for (i = 0; i < rqfar; i++) {
-               ftp_rqfcr[i] = rqfcr;
-               ftp_rqfpr[i] = rqfpr;
+               priv->ftp_rqfcr[i] = rqfcr;
+               priv->ftp_rqfpr[i] = rqfpr;
                gfar_write_filer(priv, i, rqfcr, rqfpr);
        }
 }
@@ -1037,10 +1043,10 @@ static int gfar_probe(struct platform_device *ofdev)
                        NETIF_F_RXCSUM | NETIF_F_HIGHDMA;
        }
 
-       priv->vlgrp = NULL;
-
-       if (priv->device_flags & FSL_GIANFAR_DEV_HAS_VLAN)
+       if (priv->device_flags & FSL_GIANFAR_DEV_HAS_VLAN) {
+               dev->hw_features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
                dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+       }
 
        if (priv->device_flags & FSL_GIANFAR_DEV_HAS_EXTENDED_HASH) {
                priv->extended_hash = 1;
@@ -1151,9 +1157,8 @@ static int gfar_probe(struct platform_device *ofdev)
                priv->rx_queue[i]->rxic = DEFAULT_RXIC;
        }
 
-       /* enable filer if using multiple RX queues*/
-       if(priv->num_rx_queues > 1)
-               priv->rx_filer_enable = 1;
+       /* always enable rx filer*/
+       priv->rx_filer_enable = 1;
        /* Enable most messages by default */
        priv->msg_enable = (NETIF_MSG_IFUP << 1 ) - 1;
 
@@ -1163,8 +1168,7 @@ static int gfar_probe(struct platform_device *ofdev)
        err = register_netdev(dev);
 
        if (err) {
-               printk(KERN_ERR "%s: Cannot register net device, aborting.\n",
-                               dev->name);
+               pr_err("%s: Cannot register net device, aborting\n", dev->name);
                goto register_fail;
        }
 
@@ -1215,17 +1219,17 @@ static int gfar_probe(struct platform_device *ofdev)
        gfar_init_sysfs(dev);
 
        /* Print out the device info */
-       printk(KERN_INFO DEVICE_NAME "%pM\n", dev->name, dev->dev_addr);
+       netdev_info(dev, "mac: %pM\n", dev->dev_addr);
 
        /* Even more device info helps when determining which kernel */
        /* provided which set of benchmarks. */
-       printk(KERN_INFO "%s: Running with NAPI enabled\n", dev->name);
+       netdev_info(dev, "Running with NAPI enabled\n");
        for (i = 0; i < priv->num_rx_queues; i++)
-               printk(KERN_INFO "%s: RX BD ring size for Q[%d]: %d\n",
-                       dev->name, i, priv->rx_queue[i]->rx_ring_size);
+               netdev_info(dev, "RX BD ring size for Q[%d]: %d\n",
+                           i, priv->rx_queue[i]->rx_ring_size);
        for(i = 0; i < priv->num_tx_queues; i++)
-                printk(KERN_INFO "%s: TX BD ring size for Q[%d]: %d\n",
-                       dev->name, i, priv->tx_queue[i]->tx_ring_size);
+               netdev_info(dev, "TX BD ring size for Q[%d]: %d\n",
+                           i, priv->tx_queue[i]->tx_ring_size);
 
        return 0;
 
@@ -1858,34 +1862,30 @@ static int register_grp_irqs(struct gfar_priv_grp *grp)
                 * Transmit, and Receive */
                if ((err = request_irq(grp->interruptError, gfar_error, 0,
                                grp->int_name_er,grp)) < 0) {
-                       if (netif_msg_intr(priv))
-                               printk(KERN_ERR "%s: Can't get IRQ %d\n",
-                                       dev->name, grp->interruptError);
+                       netif_err(priv, intr, dev, "Can't get IRQ %d\n",
+                                 grp->interruptError);
 
                        goto err_irq_fail;
                }
 
                if ((err = request_irq(grp->interruptTransmit, gfar_transmit,
                                0, grp->int_name_tx, grp)) < 0) {
-                       if (netif_msg_intr(priv))
-                               printk(KERN_ERR "%s: Can't get IRQ %d\n",
-                                       dev->name, grp->interruptTransmit);
+                       netif_err(priv, intr, dev, "Can't get IRQ %d\n",
+                                 grp->interruptTransmit);
                        goto tx_irq_fail;
                }
 
                if ((err = request_irq(grp->interruptReceive, gfar_receive, 0,
                                grp->int_name_rx, grp)) < 0) {
-                       if (netif_msg_intr(priv))
-                               printk(KERN_ERR "%s: Can't get IRQ %d\n",
-                                       dev->name, grp->interruptReceive);
+                       netif_err(priv, intr, dev, "Can't get IRQ %d\n",
+                                 grp->interruptReceive);
                        goto rx_irq_fail;
                }
        } else {
                if ((err = request_irq(grp->interruptTransmit, gfar_interrupt, 0,
                                grp->int_name_tx, grp)) < 0) {
-                       if (netif_msg_intr(priv))
-                               printk(KERN_ERR "%s: Can't get IRQ %d\n",
-                                       dev->name, grp->interruptTransmit);
+                       netif_err(priv, intr, dev, "Can't get IRQ %d\n",
+                                 grp->interruptTransmit);
                        goto err_irq_fail;
                }
        }
@@ -2292,10 +2292,25 @@ static int gfar_set_mac_address(struct net_device *dev)
        return 0;
 }
 
+/* Check if rx parser should be activated */
+void gfar_check_rx_parser_mode(struct gfar_private *priv)
+{
+       struct gfar __iomem *regs;
+       u32 tempval;
+
+       regs = priv->gfargrp[0].regs;
+
+       tempval = gfar_read(&regs->rctrl);
+       /* If parse is no longer required, then disable parser */
+       if (tempval & RCTRL_REQ_PARSER)
+               tempval |= RCTRL_PRSDEP_INIT;
+       else
+               tempval &= ~RCTRL_PRSDEP_INIT;
+       gfar_write(&regs->rctrl, tempval);
+}
 
 /* Enables and disables VLAN insertion/extraction */
-static void gfar_vlan_rx_register(struct net_device *dev,
-               struct vlan_group *grp)
+void gfar_vlan_mode(struct net_device *dev, u32 features)
 {
        struct gfar_private *priv = netdev_priv(dev);
        struct gfar __iomem *regs = NULL;
@@ -2306,34 +2321,30 @@ static void gfar_vlan_rx_register(struct net_device *dev,
        local_irq_save(flags);
        lock_rx_qs(priv);
 
-       priv->vlgrp = grp;
-
-       if (grp) {
+       if (features & NETIF_F_HW_VLAN_TX) {
                /* Enable VLAN tag insertion */
                tempval = gfar_read(&regs->tctrl);
                tempval |= TCTRL_VLINS;
-
                gfar_write(&regs->tctrl, tempval);
-
-               /* Enable VLAN tag extraction */
-               tempval = gfar_read(&regs->rctrl);
-               tempval |= (RCTRL_VLEX | RCTRL_PRSDEP_INIT);
-               gfar_write(&regs->rctrl, tempval);
        } else {
                /* Disable VLAN tag insertion */
                tempval = gfar_read(&regs->tctrl);
                tempval &= ~TCTRL_VLINS;
                gfar_write(&regs->tctrl, tempval);
+       }
 
+       if (features & NETIF_F_HW_VLAN_RX) {
+               /* Enable VLAN tag extraction */
+               tempval = gfar_read(&regs->rctrl);
+               tempval |= (RCTRL_VLEX | RCTRL_PRSDEP_INIT);
+               gfar_write(&regs->rctrl, tempval);
+       } else {
                /* Disable VLAN tag extraction */
                tempval = gfar_read(&regs->rctrl);
                tempval &= ~RCTRL_VLEX;
-               /* If parse is no longer required, then disable parser */
-               if (tempval & RCTRL_REQ_PARSER)
-                       tempval |= RCTRL_PRSDEP_INIT;
-               else
-                       tempval &= ~RCTRL_PRSDEP_INIT;
                gfar_write(&regs->rctrl, tempval);
+
+               gfar_check_rx_parser_mode(priv);
        }
 
        gfar_change_mtu(dev, dev->mtu);
@@ -2350,13 +2361,11 @@ static int gfar_change_mtu(struct net_device *dev, int new_mtu)
        int oldsize = priv->rx_buffer_size;
        int frame_size = new_mtu + ETH_HLEN;
 
-       if (priv->vlgrp)
+       if (gfar_is_vlan_on(priv))
                frame_size += VLAN_HLEN;
 
        if ((frame_size < 64) || (frame_size > JUMBO_FRAME_SIZE)) {
-               if (netif_msg_drv(priv))
-                       printk(KERN_ERR "%s: Invalid MTU setting\n",
-                                       dev->name);
+               netif_err(priv, drv, dev, "Invalid MTU setting\n");
                return -EINVAL;
        }
 
@@ -2705,11 +2714,12 @@ static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb,
        /* Tell the skb what kind of packet this is */
        skb->protocol = eth_type_trans(skb, dev);
 
+       /* Set vlan tag */
+       if (fcb->flags & RXFCB_VLN)
+               __vlan_hwaccel_put_tag(skb, fcb->vlctl);
+
        /* Send the packet up the stack */
-       if (unlikely(priv->vlgrp && (fcb->flags & RXFCB_VLN)))
-               ret = vlan_hwaccel_receive_skb(skb, priv->vlgrp, fcb->vlctl);
-       else
-               ret = netif_receive_skb(skb);
+       ret = netif_receive_skb(skb);
 
        if (NET_RX_DROP == ret)
                priv->extra_stats.kernel_dropped++;
@@ -2776,9 +2786,7 @@ int gfar_clean_rx_ring(struct gfar_priv_rx_q *rx_queue, int rx_work_limit)
                                gfar_process_frame(dev, skb, amount_pull);
 
                        } else {
-                               if (netif_msg_rx_err(priv))
-                                       printk(KERN_WARNING
-                                              "%s: Missing skb!\n", dev->name);
+                               netif_warn(priv, rx_err, dev, "Missing skb!\n");
                                rx_queue->stats.rx_dropped++;
                                priv->extra_stats.rx_skbmissing++;
                        }
@@ -2981,10 +2989,9 @@ static void adjust_link(struct net_device *dev)
                                        ecntrl &= ~(ECNTRL_R100);
                                break;
                        default:
-                               if (netif_msg_link(priv))
-                                       printk(KERN_WARNING
-                                               "%s: Ack!  Speed (%d) is not 10/100/1000!\n",
-                                               dev->name, phydev->speed);
+                               netif_warn(priv, link, dev,
+                                          "Ack!  Speed (%d) is not 10/100/1000!\n",
+                                          phydev->speed);
                                break;
                        }
 
@@ -3189,8 +3196,8 @@ static irqreturn_t gfar_error(int irq, void *grp_id)
 
        /* Hmm... */
        if (netif_msg_rx_err(priv) || netif_msg_tx_err(priv))
-               printk(KERN_DEBUG "%s: error interrupt (ievent=0x%08x imask=0x%08x)\n",
-                      dev->name, events, gfar_read(&regs->imask));
+               netdev_dbg(dev, "error interrupt (ievent=0x%08x imask=0x%08x)\n",
+                          events, gfar_read(&regs->imask));
 
        /* Update the error counters */
        if (events & IEVENT_TXE) {
@@ -3203,9 +3210,8 @@ static irqreturn_t gfar_error(int irq, void *grp_id)
                if (events & IEVENT_XFUN) {
                        unsigned long flags;
 
-                       if (netif_msg_tx_err(priv))
-                               printk(KERN_DEBUG "%s: TX FIFO underrun, "
-                                      "packet dropped.\n", dev->name);
+                       netif_dbg(priv, tx_err, dev,
+                                 "TX FIFO underrun, packet dropped\n");
                        dev->stats.tx_dropped++;
                        priv->extra_stats.tx_underrun++;
 
@@ -3218,8 +3224,7 @@ static irqreturn_t gfar_error(int irq, void *grp_id)
                        unlock_tx_qs(priv);
                        local_irq_restore(flags);
                }
-               if (netif_msg_tx_err(priv))
-                       printk(KERN_DEBUG "%s: Transmit Error\n", dev->name);
+               netif_dbg(priv, tx_err, dev, "Transmit Error\n");
        }
        if (events & IEVENT_BSY) {
                dev->stats.rx_errors++;
@@ -3227,29 +3232,25 @@ static irqreturn_t gfar_error(int irq, void *grp_id)
 
                gfar_receive(irq, grp_id);
 
-               if (netif_msg_rx_err(priv))
-                       printk(KERN_DEBUG "%s: busy error (rstat: %x)\n",
-                              dev->name, gfar_read(&regs->rstat));
+               netif_dbg(priv, rx_err, dev, "busy error (rstat: %x)\n",
+                         gfar_read(&regs->rstat));
        }
        if (events & IEVENT_BABR) {
                dev->stats.rx_errors++;
                priv->extra_stats.rx_babr++;
 
-               if (netif_msg_rx_err(priv))
-                       printk(KERN_DEBUG "%s: babbling RX error\n", dev->name);
+               netif_dbg(priv, rx_err, dev, "babbling RX error\n");
        }
        if (events & IEVENT_EBERR) {
                priv->extra_stats.eberr++;
-               if (netif_msg_rx_err(priv))
-                       printk(KERN_DEBUG "%s: bus error\n", dev->name);
+               netif_dbg(priv, rx_err, dev, "bus error\n");
        }
-       if ((events & IEVENT_RXC) && netif_msg_rx_status(priv))
-               printk(KERN_DEBUG "%s: control frame\n", dev->name);
+       if (events & IEVENT_RXC)
+               netif_dbg(priv, rx_status, dev, "control frame\n");
 
        if (events & IEVENT_BABT) {
                priv->extra_stats.tx_babt++;
-               if (netif_msg_tx_err(priv))
-                       printk(KERN_DEBUG "%s: babbling TX error\n", dev->name);
+               netif_dbg(priv, tx_err, dev, "babbling TX error\n");
        }
        return IRQ_HANDLED;
 }