Fix spurious invocations of the watchdog reset handler.
Unified · Split
| @@ -177,6 +177,7 @@ struct myri10ge_priv { · 176 unmodified lines | ||
| 177 | 177 | struct work_struct watchdog_work; |
| 178 | 178 | struct timer_list watchdog_timer; |
| 179 | 179 | int watchdog_tx_done; |
| 180 | + int watchdog_tx_req; | |
| 180 | 181 | int watchdog_resets; |
| 181 | 182 | int tx_linearized; |
| 182 | 183 | int pause; |
| @@ -2542,7 +2543,8 @@ static void myri10ge_watchdog_timer(unsigned long arg) · 2359 unmodified lines | ||
| 2542 | 2543 | |
| 2543 | 2544 | mgp = (struct myri10ge_priv *)arg; |
| 2544 | 2545 | if (mgp->tx.req != mgp->tx.done && |
| 2545 | − mgp->tx.done == mgp->watchdog_tx_done) | |
| 2546 | + mgp->tx.done == mgp->watchdog_tx_done && | |
| 2547 | + mgp->watchdog_tx_req != mgp->watchdog_tx_done) | |
| 2546 | 2548 | /* nic seems like it might be stuck.. */ |
| 2547 | 2549 | schedule_work(&mgp->watchdog_work); |
| 2548 | 2550 | else |
| @@ -2551,6 +2553,7 @@ static void myri10ge_watchdog_timer(unsigned long arg) · 2 unmodified lines | ||
| 2551 | 2553 | jiffies + myri10ge_watchdog_timeout * HZ); |
| 2552 | 2554 | |
| 2553 | 2555 | mgp->watchdog_tx_done = mgp->tx.done; |
| 2556 | + mgp->watchdog_tx_req = mgp->tx.req; | |
| 2554 | 2557 | } |
| 2555 | 2558 | |
| 2556 | 2559 | static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |