diff --git a/devices/e1000/e1000-4.4-ethercat.h b/devices/e1000/e1000-4.4-ethercat.h index 8abbe43b..1b047b23 100644 --- a/devices/e1000/e1000-4.4-ethercat.h +++ b/devices/e1000/e1000-4.4-ethercat.h @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -331,6 +332,7 @@ struct e1000_adapter { ec_device_t *ecdev; unsigned long ec_watchdog_jiffies; + struct irq_work ec_watchdog_kicker; }; enum e1000_state_t { diff --git a/devices/e1000/e1000-5.10-ethercat.h b/devices/e1000/e1000-5.10-ethercat.h index 87301858..e8281f68 100644 --- a/devices/e1000/e1000-5.10-ethercat.h +++ b/devices/e1000/e1000-5.10-ethercat.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -304,6 +305,7 @@ struct e1000_adapter { ec_device_t *ecdev; unsigned long ec_watchdog_jiffies; + struct irq_work ec_watchdog_kicker; }; enum e1000_state_t { diff --git a/devices/e1000/e1000-5.14-ethercat.h b/devices/e1000/e1000-5.14-ethercat.h index 023fee7b..71aa37ad 100644 --- a/devices/e1000/e1000-5.14-ethercat.h +++ b/devices/e1000/e1000-5.14-ethercat.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -304,6 +305,7 @@ struct e1000_adapter { ec_device_t *ecdev; unsigned long ec_watchdog_jiffies; + struct irq_work ec_watchdog_kicker; }; enum e1000_state_t { diff --git a/devices/e1000/e1000-5.15-ethercat.h b/devices/e1000/e1000-5.15-ethercat.h index b94866b7..17589120 100644 --- a/devices/e1000/e1000-5.15-ethercat.h +++ b/devices/e1000/e1000-5.15-ethercat.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -304,6 +305,7 @@ struct e1000_adapter { ec_device_t *ecdev; unsigned long ec_watchdog_jiffies; + struct irq_work ec_watchdog_kicker; }; enum e1000_state_t { diff --git a/devices/e1000/e1000-6.1-ethercat.h b/devices/e1000/e1000-6.1-ethercat.h index 30546b83..0769b47c 100644 --- a/devices/e1000/e1000-6.1-ethercat.h +++ b/devices/e1000/e1000-6.1-ethercat.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -304,6 +305,7 @@ struct e1000_adapter { ec_device_t *ecdev; unsigned long ec_watchdog_jiffies; + struct irq_work ec_watchdog_kicker; }; enum e1000_state_t { diff --git a/devices/e1000/e1000_main-4.4-ethercat.c b/devices/e1000/e1000_main-4.4-ethercat.c index b3649eb6..18042c1f 100644 --- a/devices/e1000/e1000_main-4.4-ethercat.c +++ b/devices/e1000/e1000_main-4.4-ethercat.c @@ -1253,6 +1253,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) // offer device to EtherCAT master module adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); if (adapter->ecdev) { + init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog); err = ecdev_open(adapter->ecdev); if (err) { ecdev_withdraw(adapter->ecdev); @@ -1332,6 +1333,7 @@ static void e1000_remove(struct pci_dev *pdev) if (adapter->ecdev) { ecdev_close(adapter->ecdev); + irq_work_sync(&adapter->ec_watchdog_kicker); ecdev_withdraw(adapter->ecdev); } else { unregister_netdev(netdev); @@ -3857,12 +3859,20 @@ void e1000_update_stats(struct e1000_adapter *adapter) } } +static void ec_kick_watchdog(struct irq_work *work) +{ + struct e1000_adapter *adapter = + container_of(work, struct e1000_adapter, ec_watchdog_kicker); + + schedule_work(&adapter->watchdog_task); +} + void ec_poll(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) { - e1000_watchdog(&adapter->watchdog_task.work); adapter->ec_watchdog_jiffies = jiffies; + irq_work_queue(&adapter->ec_watchdog_kicker); } e1000_intr(0, netdev); diff --git a/devices/e1000/e1000_main-5.10-ethercat.c b/devices/e1000/e1000_main-5.10-ethercat.c index 03c4bc6a..018f1168 100644 --- a/devices/e1000/e1000_main-5.10-ethercat.c +++ b/devices/e1000/e1000_main-5.10-ethercat.c @@ -1234,6 +1234,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) // offer device to EtherCAT master module adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); if (adapter->ecdev) { + init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog); err = ecdev_open(adapter->ecdev); if (err) { ecdev_withdraw(adapter->ecdev); @@ -1313,6 +1314,7 @@ static void e1000_remove(struct pci_dev *pdev) if (adapter->ecdev) { ecdev_close(adapter->ecdev); + irq_work_sync(&adapter->ec_watchdog_kicker); ecdev_withdraw(adapter->ecdev); } else { unregister_netdev(netdev); @@ -3835,12 +3837,20 @@ void e1000_update_stats(struct e1000_adapter *adapter) } } +static void ec_kick_watchdog(struct irq_work *work) +{ + struct e1000_adapter *adapter = + container_of(work, struct e1000_adapter, ec_watchdog_kicker); + + schedule_work(&adapter->watchdog_task); +} + void ec_poll(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) { - e1000_watchdog(&adapter->watchdog_task.work); adapter->ec_watchdog_jiffies = jiffies; + irq_work_queue(&adapter->ec_watchdog_kicker); } e1000_intr(0, netdev); diff --git a/devices/e1000/e1000_main-5.14-ethercat.c b/devices/e1000/e1000_main-5.14-ethercat.c index 20f154c6..ad3e681b 100644 --- a/devices/e1000/e1000_main-5.14-ethercat.c +++ b/devices/e1000/e1000_main-5.14-ethercat.c @@ -1234,6 +1234,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) // offer device to EtherCAT master module adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); if (adapter->ecdev) { + init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog); err = ecdev_open(adapter->ecdev); if (err) { ecdev_withdraw(adapter->ecdev); @@ -1313,6 +1314,7 @@ static void e1000_remove(struct pci_dev *pdev) if (adapter->ecdev) { ecdev_close(adapter->ecdev); + irq_work_sync(&adapter->ec_watchdog_kicker); ecdev_withdraw(adapter->ecdev); } else { unregister_netdev(netdev); @@ -3834,12 +3836,20 @@ void e1000_update_stats(struct e1000_adapter *adapter) } } +static void ec_kick_watchdog(struct irq_work *work) +{ + struct e1000_adapter *adapter = + container_of(work, struct e1000_adapter, ec_watchdog_kicker); + + schedule_work(&adapter->watchdog_task); +} + void ec_poll(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) { - e1000_watchdog(&adapter->watchdog_task.work); adapter->ec_watchdog_jiffies = jiffies; + irq_work_queue(&adapter->ec_watchdog_kicker); } e1000_intr(0, netdev); diff --git a/devices/e1000/e1000_main-5.15-ethercat.c b/devices/e1000/e1000_main-5.15-ethercat.c index 5f94a2c3..082150e9 100644 --- a/devices/e1000/e1000_main-5.15-ethercat.c +++ b/devices/e1000/e1000_main-5.15-ethercat.c @@ -1234,6 +1234,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) // offer device to EtherCAT master module adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); if (adapter->ecdev) { + init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog); err = ecdev_open(adapter->ecdev); if (err) { ecdev_withdraw(adapter->ecdev); @@ -1313,6 +1314,7 @@ static void e1000_remove(struct pci_dev *pdev) if (adapter->ecdev) { ecdev_close(adapter->ecdev); + irq_work_sync(&adapter->ec_watchdog_kicker); ecdev_withdraw(adapter->ecdev); } else { unregister_netdev(netdev); @@ -3834,12 +3836,20 @@ void e1000_update_stats(struct e1000_adapter *adapter) } } +static void ec_kick_watchdog(struct irq_work *work) +{ + struct e1000_adapter *adapter = + container_of(work, struct e1000_adapter, ec_watchdog_kicker); + + schedule_work(&adapter->watchdog_task); +} + void ec_poll(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) { - e1000_watchdog(&adapter->watchdog_task.work); adapter->ec_watchdog_jiffies = jiffies; + irq_work_queue(&adapter->ec_watchdog_kicker); } e1000_intr(0, netdev); diff --git a/devices/e1000/e1000_main-6.1-ethercat.c b/devices/e1000/e1000_main-6.1-ethercat.c index ce79ffa8..1898e511 100644 --- a/devices/e1000/e1000_main-6.1-ethercat.c +++ b/devices/e1000/e1000_main-6.1-ethercat.c @@ -1234,6 +1234,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) // offer device to EtherCAT master module adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); if (adapter->ecdev) { + init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog); err = ecdev_open(adapter->ecdev); if (err) { ecdev_withdraw(adapter->ecdev); @@ -1313,6 +1314,7 @@ static void e1000_remove(struct pci_dev *pdev) if (adapter->ecdev) { ecdev_close(adapter->ecdev); + irq_work_sync(&adapter->ec_watchdog_kicker); ecdev_withdraw(adapter->ecdev); } else { unregister_netdev(netdev); @@ -3835,12 +3837,20 @@ void e1000_update_stats(struct e1000_adapter *adapter) } } +static void ec_kick_watchdog(struct irq_work *work) +{ + struct e1000_adapter *adapter = + container_of(work, struct e1000_adapter, ec_watchdog_kicker); + + schedule_work(&adapter->watchdog_task); +} + void ec_poll(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) { - e1000_watchdog(&adapter->watchdog_task.work); adapter->ec_watchdog_jiffies = jiffies; + irq_work_queue(&adapter->ec_watchdog_kicker); } e1000_intr(0, netdev);