Fix e1000 link detection with xenomai

This commit is contained in:
Bjarne von Horn 2024-02-02 15:04:24 +01:00
parent 34c56eae7d
commit a1a0edb9c4
10 changed files with 65 additions and 5 deletions

View File

@ -59,6 +59,7 @@
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/irq_work.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <net/pkt_sched.h>
@ -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 {

View File

@ -33,6 +33,7 @@
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/irq_work.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <net/pkt_sched.h>
@ -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 {

View File

@ -33,6 +33,7 @@
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/irq_work.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <net/pkt_sched.h>
@ -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 {

View File

@ -33,6 +33,7 @@
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/irq_work.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <net/pkt_sched.h>
@ -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 {

View File

@ -33,6 +33,7 @@
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/irq_work.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <net/pkt_sched.h>
@ -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 {

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);