.ndo_vlan_rx_kill_vid   = qlge_vlan_rx_kill_vid,
 };
 
+static void ql_timer(unsigned long data)
+{
+       struct ql_adapter *qdev = (struct ql_adapter *)data;
+       u32 var = 0;
+
+       var = ql_read32(qdev, STS);
+       if (pci_channel_offline(qdev->pdev)) {
+               QPRINTK(qdev, IFUP, ERR, "EEH STS = 0x%.08x.\n", var);
+               return;
+       }
+
+       qdev->timer.expires = jiffies + (5*HZ);
+       add_timer(&qdev->timer);
+}
+
 static int __devinit qlge_probe(struct pci_dev *pdev,
                                const struct pci_device_id *pci_entry)
 {
                pci_disable_device(pdev);
                return err;
        }
+       /* Start up the timer to trigger EEH if
+        * the bus goes dead
+        */
+       init_timer_deferrable(&qdev->timer);
+       qdev->timer.data = (unsigned long)qdev;
+       qdev->timer.function = ql_timer;
+       qdev->timer.expires = jiffies + (5*HZ);
+       add_timer(&qdev->timer);
        ql_link_off(qdev);
        ql_display_dev_info(ndev);
        atomic_set(&qdev->lb_count, 0);
 static void __devexit qlge_remove(struct pci_dev *pdev)
 {
        struct net_device *ndev = pci_get_drvdata(pdev);
+       struct ql_adapter *qdev = netdev_priv(ndev);
+       del_timer_sync(&qdev->timer);
        unregister_netdev(ndev);
        ql_release_all(pdev);
        pci_disable_device(pdev);
                QPRINTK(qdev, IFUP, ERR,
                        "Device was not running prior to EEH.\n");
        }
+       qdev->timer.expires = jiffies + (5*HZ);
+       add_timer(&qdev->timer);
        netif_device_attach(ndev);
 }
 
        int err;
 
        netif_device_detach(ndev);
+       del_timer_sync(&qdev->timer);
 
        if (netif_running(ndev)) {
                err = ql_adapter_down(qdev);
                        return err;
        }
 
+       qdev->timer.expires = jiffies + (5*HZ);
+       add_timer(&qdev->timer);
        netif_device_attach(ndev);
 
        return 0;