Commit 20f24208f631141bafe57ce5bcc8f2e7f3c41aae
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
Merge branch 'pci/konstantin-runtime-pm' into next
* pci/konstantin-runtime-pm: PCI/PM: Clear state_saved during suspend PCI: Use atomic_inc_return() rather than atomic_add_return() PCI: Catch attempts to disable already-disabled devices PCI: Disable Bus Master unconditionally in pci_device_shutdown()
Showing 2 changed files Side-by-side Diff
drivers/pci/pci-driver.c
... | ... | @@ -392,7 +392,7 @@ |
392 | 392 | * Turn off Bus Master bit on the device to tell it to not |
393 | 393 | * continue to do DMA |
394 | 394 | */ |
395 | - pci_disable_device(pci_dev); | |
395 | + pci_clear_master(pci_dev); | |
396 | 396 | } |
397 | 397 | |
398 | 398 | #ifdef CONFIG_PM |
... | ... | @@ -628,6 +628,7 @@ |
628 | 628 | goto Fixup; |
629 | 629 | } |
630 | 630 | |
631 | + pci_dev->state_saved = false; | |
631 | 632 | if (pm->suspend) { |
632 | 633 | pci_power_t prev = pci_dev->current_state; |
633 | 634 | int error; |
... | ... | @@ -774,6 +775,7 @@ |
774 | 775 | return 0; |
775 | 776 | } |
776 | 777 | |
778 | + pci_dev->state_saved = false; | |
777 | 779 | if (pm->freeze) { |
778 | 780 | int error; |
779 | 781 | |
... | ... | @@ -862,6 +864,7 @@ |
862 | 864 | goto Fixup; |
863 | 865 | } |
864 | 866 | |
867 | + pci_dev->state_saved = false; | |
865 | 868 | if (pm->poweroff) { |
866 | 869 | int error; |
867 | 870 | |
... | ... | @@ -987,6 +990,7 @@ |
987 | 990 | if (!pm || !pm->runtime_suspend) |
988 | 991 | return -ENOSYS; |
989 | 992 | |
993 | + pci_dev->state_saved = false; | |
990 | 994 | pci_dev->no_d3cold = false; |
991 | 995 | error = pm->runtime_suspend(dev); |
992 | 996 | suspend_report_result(pm->runtime_suspend, error); |
drivers/pci/pci.c
... | ... | @@ -1168,7 +1168,7 @@ |
1168 | 1168 | dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK); |
1169 | 1169 | } |
1170 | 1170 | |
1171 | - if (atomic_add_return(1, &dev->enable_cnt) > 1) | |
1171 | + if (atomic_inc_return(&dev->enable_cnt) > 1) | |
1172 | 1172 | return 0; /* already enabled */ |
1173 | 1173 | |
1174 | 1174 | /* only skip sriov related */ |
... | ... | @@ -1395,7 +1395,10 @@ |
1395 | 1395 | if (dr) |
1396 | 1396 | dr->enabled = 0; |
1397 | 1397 | |
1398 | - if (atomic_sub_return(1, &dev->enable_cnt) != 0) | |
1398 | + dev_WARN_ONCE(&dev->dev, atomic_read(&dev->enable_cnt) <= 0, | |
1399 | + "disabling already-disabled device"); | |
1400 | + | |
1401 | + if (atomic_dec_return(&dev->enable_cnt) != 0) | |
1399 | 1402 | return; |
1400 | 1403 | |
1401 | 1404 | do_pci_disable_device(dev); |