| From debb9df311582c83fe369baa35fa4b92e8a9c58a Mon Sep 17 00:00:00 2001 |
| From: Yongxin Liu <yongxin.liu@windriver.com> |
| Date: Mon, 22 Mar 2021 15:14:48 +0800 |
| Subject: ixgbe: fix unbalanced device enable/disable in suspend/resume |
| |
| From: Yongxin Liu <yongxin.liu@windriver.com> |
| |
| commit debb9df311582c83fe369baa35fa4b92e8a9c58a upstream. |
| |
| pci_disable_device() called in __ixgbe_shutdown() decreases |
| dev->enable_cnt by 1. pci_enable_device_mem() which increases |
| dev->enable_cnt by 1, was removed from ixgbe_resume() in commit |
| 6f82b2558735 ("ixgbe: use generic power management"). This caused |
| unbalanced increase/decrease. So add pci_enable_device_mem() back. |
| |
| Fix the following call trace. |
| |
| ixgbe 0000:17:00.1: disabling already-disabled device |
| Call Trace: |
| __ixgbe_shutdown+0x10a/0x1e0 [ixgbe] |
| ixgbe_suspend+0x32/0x70 [ixgbe] |
| pci_pm_suspend+0x87/0x160 |
| ? pci_pm_freeze+0xd0/0xd0 |
| dpm_run_callback+0x42/0x170 |
| __device_suspend+0x114/0x460 |
| async_suspend+0x1f/0xa0 |
| async_run_entry_fn+0x3c/0xf0 |
| process_one_work+0x1dd/0x410 |
| worker_thread+0x34/0x3f0 |
| ? cancel_delayed_work+0x90/0x90 |
| kthread+0x14c/0x170 |
| ? kthread_park+0x90/0x90 |
| ret_from_fork+0x1f/0x30 |
| |
| Fixes: 6f82b2558735 ("ixgbe: use generic power management") |
| Signed-off-by: Yongxin Liu <yongxin.liu@windriver.com> |
| Tested-by: Dave Switzer <david.switzer@intel.com> |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
| +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
| @@ -6903,6 +6903,11 @@ static int __maybe_unused ixgbe_resume(s |
| |
| adapter->hw.hw_addr = adapter->io_addr; |
| |
| + err = pci_enable_device_mem(pdev); |
| + if (err) { |
| + e_dev_err("Cannot enable PCI device from suspend\n"); |
| + return err; |
| + } |
| smp_mb__before_atomic(); |
| clear_bit(__IXGBE_DISABLED, &adapter->state); |
| pci_set_master(pdev); |