Commit 80ba77dfbce85f2d1be54847de3c866de1b18a9a
1 parent
b5031ed1be
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
xen/pciback: Fix proper FLR steps.
When we do FLR and save PCI config we did it in the wrong order. The end result was that if a PCI device was unbind from its driver, then binded to xen-pciback, and then back to its driver we would get: > lspci -s 04:00.0 04:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection 13:42:12 # 4 :~/ > echo "0000:04:00.0" > /sys/bus/pci/drivers/pciback/unbind > modprobe e1000e e1000e: Intel(R) PRO/1000 Network Driver - 2.0.0-k e1000e: Copyright(c) 1999 - 2012 Intel Corporation. e1000e 0000:04:00.0: Disabling ASPM L0s L1 e1000e 0000:04:00.0: enabling device (0000 -> 0002) xen: registering gsi 48 triggering 0 polarity 1 Already setup the GSI :48 e1000e 0000:04:00.0: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode e1000e: probe of 0000:04:00.0 failed with error -2 This fixes it by first saving the PCI configuration space, then doing the FLR. Reported-by: Ren, Yongjie <yongjie.ren@intel.com> Reported-and-Tested-by: Tobias Geiger <tobias.geiger@vido.info> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> CC: stable@vger.kernel.org
Showing 1 changed file with 4 additions and 4 deletions Side-by-side Diff
drivers/xen/xen-pciback/pci_stub.c
... | ... | @@ -353,16 +353,16 @@ |
353 | 353 | if (err) |
354 | 354 | goto config_release; |
355 | 355 | |
356 | - dev_dbg(&dev->dev, "reseting (FLR, D3, etc) the device\n"); | |
357 | - __pci_reset_function_locked(dev); | |
358 | - | |
359 | 356 | /* We need the device active to save the state. */ |
360 | 357 | dev_dbg(&dev->dev, "save state of device\n"); |
361 | 358 | pci_save_state(dev); |
362 | 359 | dev_data->pci_saved_state = pci_store_saved_state(dev); |
363 | 360 | if (!dev_data->pci_saved_state) |
364 | 361 | dev_err(&dev->dev, "Could not store PCI conf saved state!\n"); |
365 | - | |
362 | + else { | |
363 | + dev_dbg(&dev->dev, "reseting (FLR, D3, etc) the device\n"); | |
364 | + __pci_reset_function_locked(dev); | |
365 | + } | |
366 | 366 | /* Now disable the device (this also ensures some private device |
367 | 367 | * data is setup before we export) |
368 | 368 | */ |