amd-xgbe: Add support for the netdev Tx watchdog
authorLendacky, Thomas <Thomas.Lendacky@amd.com>
Thu, 9 Apr 2015 17:12:03 +0000 (12:12 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 9 Apr 2015 21:35:37 +0000 (17:35 -0400)
Add support to be able to detect a hung Tx task by adding the netdev
ndo_tx_timeout function callback. Do not set the watchdog_timeo value
so as to use the system default time (currently 5 seconds).

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/amd/xgbe/xgbe-drv.c
drivers/net/ethernet/amd/xgbe/xgbe-main.c

index e10abc7db447413bd09134eb2d248604c3b557c5..db84ddcfec8464191a3edcccfd87c869ac1c5a7c 100644 (file)
@@ -1600,6 +1600,14 @@ static int xgbe_change_mtu(struct net_device *netdev, int mtu)
        return 0;
 }
 
+static void xgbe_tx_timeout(struct net_device *netdev)
+{
+       struct xgbe_prv_data *pdata = netdev_priv(netdev);
+
+       netdev_warn(netdev, "tx timeout, device restarting\n");
+       schedule_work(&pdata->restart_work);
+}
+
 static struct rtnl_link_stats64 *xgbe_get_stats64(struct net_device *netdev,
                                                  struct rtnl_link_stats64 *s)
 {
@@ -1764,6 +1772,7 @@ static const struct net_device_ops xgbe_netdev_ops = {
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_do_ioctl           = xgbe_ioctl,
        .ndo_change_mtu         = xgbe_change_mtu,
+       .ndo_tx_timeout         = xgbe_tx_timeout,
        .ndo_get_stats64        = xgbe_get_stats64,
        .ndo_vlan_rx_add_vid    = xgbe_vlan_rx_add_vid,
        .ndo_vlan_rx_kill_vid   = xgbe_vlan_rx_kill_vid,
index 2e4c22d94a6bef50e0606b9fce861c29f88c24d4..7149053849008de10da3be7eb054884b4a808f8c 100644 (file)
@@ -491,6 +491,9 @@ static int xgbe_probe(struct platform_device *pdev)
 
        netdev->priv_flags |= IFF_UNICAST_FLT;
 
+       /* Use default watchdog timeout */
+       netdev->watchdog_timeo = 0;
+
        xgbe_init_rx_coalesce(pdata);
        xgbe_init_tx_coalesce(pdata);