|
@@ -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);
|