net: fec: add support for dumping transmit ring on timeout
[pandora-kernel.git] / drivers / net / ethernet / freescale / fec_main.c
index c6b1bf7..09fcdc7 100644 (file)
@@ -320,6 +320,27 @@ static void *swap_buffer(void *bufaddr, int len)
        return bufaddr;
 }
 
+static void fec_dump(struct net_device *ndev)
+{
+       struct fec_enet_private *fep = netdev_priv(ndev);
+       struct bufdesc *bdp = fep->tx_bd_base;
+       unsigned int index = 0;
+
+       netdev_info(ndev, "TX ring dump\n");
+       pr_info("Nr     SC     addr       len  SKB\n");
+
+       do {
+               pr_info("%3u %c%c 0x%04x 0x%08lx %4u %p\n",
+                       index,
+                       bdp == fep->cur_tx ? 'S' : ' ',
+                       bdp == fep->dirty_tx ? 'H' : ' ',
+                       bdp->cbd_sc, bdp->cbd_bufaddr, bdp->cbd_datlen,
+                       fep->tx_skbuff[index]);
+               bdp = fec_enet_get_nextdesc(bdp, fep);
+               index++;
+       } while (bdp != fep->tx_bd_base);
+}
+
 static inline bool is_ipv4_pkt(struct sk_buff *skb)
 {
        return skb->protocol == htons(ETH_P_IP) && ip_hdr(skb)->version == 4;
@@ -1018,6 +1039,8 @@ fec_timeout(struct net_device *ndev)
 {
        struct fec_enet_private *fep = netdev_priv(ndev);
 
+       fec_dump(ndev);
+
        ndev->stats.tx_errors++;
 
        schedule_work(&fep->tx_timeout_work);