i40e: Bypass timeout recovery level 0 so as to not cause MDD
authorAnjali Singhai Jain <anjali.singhai@intel.com>
Wed, 4 Jun 2014 01:23:26 +0000 (01:23 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 25 Jun 2014 01:19:20 +0000 (18:19 -0700)
When a Tx hang happens, usually the Tx queue disable fails. At
this point if we try to recover by a VSI reinit the HW gets
unhappy and we get a Malicious Driver Detect (MDD) event.
HW expects a PF reset if a queue disable fails, if we don't do a PF
reset and restart the queue we get an MDD.  This patch makes sure we
do a PF reset on Tx hang and that way we avoid any MDD because of Tx
queue disable failure.

Change-ID: I665ab6223577c788da857ee2132e733dc9a451e4
Signed-off-by: Anjali Singhai Jain <anjali.singhai@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_main.c

index e2dbe0427cdfab6e89614ec0304e29743d6aa509..50f9ab72c95f53a03962ef837d450b2190c31dc3 100644 (file)
@@ -278,7 +278,7 @@ static void i40e_tx_timeout(struct net_device *netdev)
        pf->tx_timeout_count++;
 
        if (time_after(jiffies, (pf->tx_timeout_last_recovery + HZ*20)))
-               pf->tx_timeout_recovery_level = 0;
+               pf->tx_timeout_recovery_level = 1;
        pf->tx_timeout_last_recovery = jiffies;
        netdev_info(netdev, "tx_timeout recovery level %d\n",
                    pf->tx_timeout_recovery_level);
@@ -6826,6 +6826,8 @@ static int i40e_sw_init(struct i40e_pf *pf)
        pf->irq_pile->num_entries = pf->hw.func_caps.num_msix_vectors;
        pf->irq_pile->search_hint = 0;
 
+       pf->tx_timeout_recovery_level = 1;
+
        mutex_init(&pf->switch_mutex);
 
 sw_init_done: