Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- _Unofficial_ e1000e 'disconnect' patch for Kernel 5.4.13, created/modified from earlier patch on linux/netdev, and tested with Kernel 5.4.13.
- Usual disclaimers apply, use at your own risk. RG. January 21, 2020.
- -------------------------- CUT HERE -------------------------------------------------------
- diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h
- --- a/drivers/net/ethernet/intel/e1000e/e1000.h
- +++ b/drivers/net/ethernet/intel/e1000e/e1000.h
- @@ -185,13 +185,12 @@
- /* board specific private data structure */
- struct e1000_adapter {
- + struct timer_list watchdog_timer;
- struct timer_list phy_info_timer;
- struct timer_list blink_timer;
- struct work_struct reset_task;
- - struct delayed_work watchdog_task;
- -
- - struct workqueue_struct *e1000_workqueue;
- + struct work_struct watchdog_task;
- const struct e1000_info *ei;
- diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
- --- a/drivers/net/ethernet/intel/e1000e/netdev.c
- +++ b/drivers/net/ethernet/intel/e1000e/netdev.c
- @@ -1780,8 +1780,7 @@
- }
- /* guard against interrupt when we're going down */
- if (!test_bit(__E1000_DOWN, &adapter->state))
- - mod_delayed_work(adapter->e1000_workqueue,
- - &adapter->watchdog_task, HZ);
- + mod_timer(&adapter->watchdog_timer, jiffies + 1);
- }
- /* Reset on uncorrectable ECC error */
- @@ -1861,8 +1860,7 @@
- }
- /* guard against interrupt when we're going down */
- if (!test_bit(__E1000_DOWN, &adapter->state))
- - mod_delayed_work(adapter->e1000_workqueue,
- - &adapter->watchdog_task, HZ);
- + mod_timer(&adapter->watchdog_timer, jiffies + 1);
- }
- /* Reset on uncorrectable ECC error */
- @@ -1907,8 +1905,7 @@
- hw->mac.get_link_status = true;
- /* guard against interrupt when we're going down */
- if (!test_bit(__E1000_DOWN, &adapter->state))
- - mod_delayed_work(adapter->e1000_workqueue,
- - &adapter->watchdog_task, HZ);
- + mod_timer(&adapter->watchdog_timer, jiffies + 1);
- }
- if (!test_bit(__E1000_DOWN, &adapter->state))
- @@ -4281,6 +4278,7 @@
- napi_synchronize(&adapter->napi);
- + del_timer_sync(&adapter->watchdog_timer);
- del_timer_sync(&adapter->phy_info_timer);
- spin_lock(&adapter->stats64_lock);
- @@ -5152,11 +5150,25 @@
- }
- }
- +/**
- + * e1000_watchdog - Timer Call-back
- + * @data: pointer to adapter cast into an unsigned long
- + **/
- +static void e1000_watchdog(struct timer_list *t)
- +{
- + struct e1000_adapter *adapter = from_timer(adapter, t, watchdog_timer);
- +
- + /* Do the rest outside of interrupt context */
- + schedule_work(&adapter->watchdog_task);
- +
- + /* TODO: make this use queue_delayed_work() */
- +}
- +
- static void e1000_watchdog_task(struct work_struct *work)
- {
- struct e1000_adapter *adapter = container_of(work,
- struct e1000_adapter,
- - watchdog_task.work);
- + watchdog_task);
- struct net_device *netdev = adapter->netdev;
- struct e1000_mac_info *mac = &adapter->hw.mac;
- struct e1000_phy_info *phy = &adapter->hw.phy;
- @@ -5404,9 +5416,8 @@
- /* Reset the timer */
- if (!test_bit(__E1000_DOWN, &adapter->state))
- - queue_delayed_work(adapter->e1000_workqueue,
- - &adapter->watchdog_task,
- - round_jiffies(2 * HZ));
- + mod_timer(&adapter->watchdog_timer,
- + round_jiffies(jiffies + 2 * HZ));
- }
- #define E1000_TX_FLAGS_CSUM 0x00000001
- @@ -7259,21 +7270,11 @@
- goto err_eeprom;
- }
- - adapter->e1000_workqueue = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0,
- - e1000e_driver_name);
- -
- - if (!adapter->e1000_workqueue) {
- - err = -ENOMEM;
- - goto err_workqueue;
- - }
- -
- - INIT_DELAYED_WORK(&adapter->watchdog_task, e1000_watchdog_task);
- - queue_delayed_work(adapter->e1000_workqueue, &adapter->watchdog_task,
- - 0);
- -
- + timer_setup(&adapter->watchdog_timer, e1000_watchdog, 0);
- timer_setup(&adapter->phy_info_timer, e1000_update_phy_info, 0);
- INIT_WORK(&adapter->reset_task, e1000_reset_task);
- + INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task);
- INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround);
- INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task);
- INIT_WORK(&adapter->print_hang_task, e1000_print_hw_hang);
- @@ -7367,9 +7368,6 @@
- return 0;
- err_register:
- - flush_workqueue(adapter->e1000_workqueue);
- - destroy_workqueue(adapter->e1000_workqueue);
- -err_workqueue:
- if (!(adapter->flags & FLAG_HAS_AMT))
- e1000e_release_hw_control(adapter);
- err_eeprom:
- @@ -7416,17 +7414,15 @@
- */
- if (!down)
- set_bit(__E1000_DOWN, &adapter->state);
- + del_timer_sync(&adapter->watchdog_timer);
- del_timer_sync(&adapter->phy_info_timer);
- cancel_work_sync(&adapter->reset_task);
- + cancel_work_sync(&adapter->watchdog_task);
- cancel_work_sync(&adapter->downshift_task);
- cancel_work_sync(&adapter->update_phy_task);
- cancel_work_sync(&adapter->print_hang_task);
- - cancel_delayed_work(&adapter->watchdog_task);
- - flush_workqueue(adapter->e1000_workqueue);
- - destroy_workqueue(adapter->e1000_workqueue);
- -
- if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) {
- cancel_work_sync(&adapter->tx_hwtstamp_work);
- if (adapter->tx_hwtstamp_skb) {
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement