]>
Commit | Line | Data |
---|---|---|
d996137a GKH |
1 | From foo@baz Wed Feb 28 16:19:30 CET 2018 |
2 | From: Tushar Dave <tushar.n.dave@oracle.com> | |
3 | Date: Wed, 6 Dec 2017 02:26:29 +0530 | |
4 | Subject: e1000: fix disabling already-disabled warning | |
5 | ||
6 | From: Tushar Dave <tushar.n.dave@oracle.com> | |
7 | ||
8 | ||
9 | [ Upstream commit 0b76aae741abb9d16d2c0e67f8b1e766576f897d ] | |
10 | ||
11 | This patch adds check so that driver does not disable already | |
12 | disabled device. | |
13 | ||
14 | [ 44.637743] advantechwdt: Unexpected close, not stopping watchdog! | |
15 | [ 44.997548] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input6 | |
16 | [ 45.013419] e1000 0000:00:03.0: disabling already-disabled device | |
17 | [ 45.013447] ------------[ cut here ]------------ | |
18 | [ 45.014868] WARNING: CPU: 1 PID: 71 at drivers/pci/pci.c:1641 pci_disable_device+0xa1/0x105: | |
19 | pci_disable_device at drivers/pci/pci.c:1640 | |
20 | [ 45.016171] CPU: 1 PID: 71 Comm: rcu_perf_shutdo Not tainted 4.14.0-01330-g3c07399 #1 | |
21 | [ 45.017197] task: ffff88011bee9e40 task.stack: ffffc90000860000 | |
22 | [ 45.017987] RIP: 0010:pci_disable_device+0xa1/0x105: | |
23 | pci_disable_device at drivers/pci/pci.c:1640 | |
24 | [ 45.018603] RSP: 0000:ffffc90000863e30 EFLAGS: 00010286 | |
25 | [ 45.019282] RAX: 0000000000000035 RBX: ffff88013a230008 RCX: 0000000000000000 | |
26 | [ 45.020182] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000203 | |
27 | [ 45.021084] RBP: ffff88013a3f31e8 R08: 0000000000000001 R09: 0000000000000000 | |
28 | [ 45.021986] R10: ffffffff827ec29c R11: 0000000000000002 R12: 0000000000000001 | |
29 | [ 45.022946] R13: ffff88013a230008 R14: ffff880117802b20 R15: ffffc90000863e8f | |
30 | [ 45.023842] FS: 0000000000000000(0000) GS:ffff88013fd00000(0000) knlGS:0000000000000000 | |
31 | [ 45.024863] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 | |
32 | [ 45.025583] CR2: ffffc900006d4000 CR3: 000000000220f000 CR4: 00000000000006a0 | |
33 | [ 45.026478] Call Trace: | |
34 | [ 45.026811] __e1000_shutdown+0x1d4/0x1e2: | |
35 | __e1000_shutdown at drivers/net/ethernet/intel/e1000/e1000_main.c:5162 | |
36 | [ 45.027344] ? rcu_perf_cleanup+0x2a1/0x2a1: | |
37 | rcu_perf_shutdown at kernel/rcu/rcuperf.c:627 | |
38 | [ 45.027883] e1000_shutdown+0x14/0x3a: | |
39 | e1000_shutdown at drivers/net/ethernet/intel/e1000/e1000_main.c:5235 | |
40 | [ 45.028351] device_shutdown+0x110/0x1aa: | |
41 | device_shutdown at drivers/base/core.c:2807 | |
42 | [ 45.028858] kernel_power_off+0x31/0x64: | |
43 | kernel_power_off at kernel/reboot.c:260 | |
44 | [ 45.029343] rcu_perf_shutdown+0x9b/0xa7: | |
45 | rcu_perf_shutdown at kernel/rcu/rcuperf.c:637 | |
46 | [ 45.029852] ? __wake_up_common_lock+0xa2/0xa2: | |
47 | autoremove_wake_function at kernel/sched/wait.c:376 | |
48 | [ 45.030414] kthread+0x126/0x12e: | |
49 | kthread at kernel/kthread.c:233 | |
50 | [ 45.030834] ? __kthread_bind_mask+0x8e/0x8e: | |
51 | kthread at kernel/kthread.c:190 | |
52 | [ 45.031399] ? ret_from_fork+0x1f/0x30: | |
53 | ret_from_fork at arch/x86/entry/entry_64.S:443 | |
54 | [ 45.031883] ? kernel_init+0xa/0xf5: | |
55 | kernel_init at init/main.c:997 | |
56 | [ 45.032325] ret_from_fork+0x1f/0x30: | |
57 | ret_from_fork at arch/x86/entry/entry_64.S:443 | |
58 | [ 45.032777] Code: 00 48 85 ed 75 07 48 8b ab a8 00 00 00 48 8d bb 98 00 00 00 e8 aa d1 11 00 48 89 ea 48 89 c6 48 c7 c7 d8 e4 0b 82 e8 55 7d da ff <0f> ff b9 01 00 00 00 31 d2 be 01 00 00 00 48 c7 c7 f0 b1 61 82 | |
59 | [ 45.035222] ---[ end trace c257137b1b1976ef ]--- | |
60 | [ 45.037838] ACPI: Preparing to enter system sleep state S5 | |
61 | ||
62 | Signed-off-by: Tushar Dave <tushar.n.dave@oracle.com> | |
63 | Tested-by: Fengguang Wu <fengguang.wu@intel.com> | |
64 | Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> | |
65 | Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> | |
66 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
67 | --- | |
68 | drivers/net/ethernet/intel/e1000/e1000.h | 3 +- | |
69 | drivers/net/ethernet/intel/e1000/e1000_main.c | 27 +++++++++++++++++++++----- | |
70 | 2 files changed, 24 insertions(+), 6 deletions(-) | |
71 | ||
72 | --- a/drivers/net/ethernet/intel/e1000/e1000.h | |
73 | +++ b/drivers/net/ethernet/intel/e1000/e1000.h | |
74 | @@ -331,7 +331,8 @@ struct e1000_adapter { | |
75 | enum e1000_state_t { | |
76 | __E1000_TESTING, | |
77 | __E1000_RESETTING, | |
78 | - __E1000_DOWN | |
79 | + __E1000_DOWN, | |
80 | + __E1000_DISABLED | |
81 | }; | |
82 | ||
83 | #undef pr_fmt | |
84 | --- a/drivers/net/ethernet/intel/e1000/e1000_main.c | |
85 | +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c | |
86 | @@ -940,7 +940,7 @@ static int e1000_init_hw_struct(struct e | |
87 | static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |
88 | { | |
89 | struct net_device *netdev; | |
90 | - struct e1000_adapter *adapter; | |
91 | + struct e1000_adapter *adapter = NULL; | |
92 | struct e1000_hw *hw; | |
93 | ||
94 | static int cards_found = 0; | |
95 | @@ -950,6 +950,7 @@ static int e1000_probe(struct pci_dev *p | |
96 | u16 tmp = 0; | |
97 | u16 eeprom_apme_mask = E1000_EEPROM_APME; | |
98 | int bars, need_ioport; | |
99 | + bool disable_dev = false; | |
100 | ||
101 | /* do not allocate ioport bars when not needed */ | |
102 | need_ioport = e1000_is_need_ioport(pdev); | |
103 | @@ -1250,11 +1251,13 @@ err_mdio_ioremap: | |
104 | iounmap(hw->ce4100_gbe_mdio_base_virt); | |
105 | iounmap(hw->hw_addr); | |
106 | err_ioremap: | |
107 | + disable_dev = !test_and_set_bit(__E1000_DISABLED, &adapter->flags); | |
108 | free_netdev(netdev); | |
109 | err_alloc_etherdev: | |
110 | pci_release_selected_regions(pdev, bars); | |
111 | err_pci_reg: | |
112 | - pci_disable_device(pdev); | |
113 | + if (!adapter || disable_dev) | |
114 | + pci_disable_device(pdev); | |
115 | return err; | |
116 | } | |
117 | ||
118 | @@ -1272,6 +1275,7 @@ static void e1000_remove(struct pci_dev | |
119 | struct net_device *netdev = pci_get_drvdata(pdev); | |
120 | struct e1000_adapter *adapter = netdev_priv(netdev); | |
121 | struct e1000_hw *hw = &adapter->hw; | |
122 | + bool disable_dev; | |
123 | ||
124 | e1000_down_and_stop(adapter); | |
125 | e1000_release_manageability(adapter); | |
126 | @@ -1290,9 +1294,11 @@ static void e1000_remove(struct pci_dev | |
127 | iounmap(hw->flash_address); | |
128 | pci_release_selected_regions(pdev, adapter->bars); | |
129 | ||
130 | + disable_dev = !test_and_set_bit(__E1000_DISABLED, &adapter->flags); | |
131 | free_netdev(netdev); | |
132 | ||
133 | - pci_disable_device(pdev); | |
134 | + if (disable_dev) | |
135 | + pci_disable_device(pdev); | |
136 | } | |
137 | ||
138 | /** | |
139 | @@ -5135,7 +5141,8 @@ static int __e1000_shutdown(struct pci_d | |
140 | if (netif_running(netdev)) | |
141 | e1000_free_irq(adapter); | |
142 | ||
143 | - pci_disable_device(pdev); | |
144 | + if (!test_and_set_bit(__E1000_DISABLED, &adapter->flags)) | |
145 | + pci_disable_device(pdev); | |
146 | ||
147 | return 0; | |
148 | } | |
149 | @@ -5179,6 +5186,10 @@ static int e1000_resume(struct pci_dev * | |
150 | pr_err("Cannot enable PCI device from suspend\n"); | |
151 | return err; | |
152 | } | |
153 | + | |
154 | + /* flush memory to make sure state is correct */ | |
155 | + smp_mb__before_atomic(); | |
156 | + clear_bit(__E1000_DISABLED, &adapter->flags); | |
157 | pci_set_master(pdev); | |
158 | ||
159 | pci_enable_wake(pdev, PCI_D3hot, 0); | |
160 | @@ -5253,7 +5264,9 @@ static pci_ers_result_t e1000_io_error_d | |
161 | ||
162 | if (netif_running(netdev)) | |
163 | e1000_down(adapter); | |
164 | - pci_disable_device(pdev); | |
165 | + | |
166 | + if (!test_and_set_bit(__E1000_DISABLED, &adapter->flags)) | |
167 | + pci_disable_device(pdev); | |
168 | ||
169 | /* Request a slot slot reset. */ | |
170 | return PCI_ERS_RESULT_NEED_RESET; | |
171 | @@ -5281,6 +5294,10 @@ static pci_ers_result_t e1000_io_slot_re | |
172 | pr_err("Cannot re-enable PCI device after reset.\n"); | |
173 | return PCI_ERS_RESULT_DISCONNECT; | |
174 | } | |
175 | + | |
176 | + /* flush memory to make sure state is correct */ | |
177 | + smp_mb__before_atomic(); | |
178 | + clear_bit(__E1000_DISABLED, &adapter->flags); | |
179 | pci_set_master(pdev); | |
180 | ||
181 | pci_enable_wake(pdev, PCI_D3hot, 0); |