Commit 20f24208f631141bafe57ce5bcc8f2e7f3c41aae

Authored by Bjorn Helgaas

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);
... ... @@ -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);