Save and restore the PCI-X Command register through the per-device saved
capability store instead of a private pci_cap_saved_state buffer.

Reserve the register by its configuration space offset during device setup
so that the save and restore paths no longer have to locate a buffer, and
so that the saved value can be found without knowing how the PCI core
happens to lay its buffers out.

While here, make pci_save_pcix_state() void now that it cannot fail.

No functional change intended.

Assisted-by: LLM
Signed-off-by: David Matlack <[email protected]>
---
 drivers/pci/pci.c | 43 ++++++++++++++-----------------------------
 1 file changed, 14 insertions(+), 29 deletions(-)

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 1c2c572aa49c..9e49806c6891 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1733,40 +1733,26 @@ static void pci_restore_pcie_state(struct pci_dev *dev)
        }
 }
 
-static int pci_save_pcix_state(struct pci_dev *dev)
+static void pci_save_pcix_state(struct pci_dev *dev)
 {
        int pos;
-       struct pci_cap_saved_state *save_state;
 
        pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
        if (!pos)
-               return 0;
-
-       save_state = pci_find_saved_cap(dev, PCI_CAP_ID_PCIX);
-       if (!save_state) {
-               pci_err(dev, "buffer not found in %s\n", __func__);
-               return -ENOMEM;
-       }
-
-       pci_read_config_word(dev, pos + PCI_X_CMD,
-                            (u16 *)save_state->cap.data);
+               return;
 
-       return 0;
+       pci_save_cap_word(dev, pos + PCI_X_CMD);
 }
 
 static void pci_restore_pcix_state(struct pci_dev *dev)
 {
-       int i = 0, pos;
-       struct pci_cap_saved_state *save_state;
-       u16 *cap;
+       int pos;
 
-       save_state = pci_find_saved_cap(dev, PCI_CAP_ID_PCIX);
        pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
-       if (!save_state || !pos)
+       if (!pos)
                return;
-       cap = (u16 *)&save_state->cap.data[0];
 
-       pci_write_config_word(dev, pos + PCI_X_CMD, cap[i++]);
+       pci_restore_cap_word(dev, pos + PCI_X_CMD);
 }
 
 /**
@@ -1786,11 +1772,7 @@ int pci_save_state(struct pci_dev *dev)
        dev->state_saved = true;
 
        pci_save_pcie_state(dev);
-
-       i = pci_save_pcix_state(dev);
-       if (i != 0)
-               return i;
-
+       pci_save_pcix_state(dev);
        pci_save_dpc_state(dev);
        pci_save_aer_state(dev);
        pci_save_ptm_state(dev);
@@ -3579,7 +3561,7 @@ int pci_add_ext_cap_save_buffer(struct pci_dev *dev, u16 
cap, unsigned int size)
 void pci_allocate_cap_save_buffers(struct pci_dev *dev)
 {
        unsigned int i;
-       int error;
+       int error, pos;
 
        for (i = 0; pci_is_pcie(dev) && i < ARRAY_SIZE(pcie_saved_regs); i++) {
                unsigned int off = dev->pcie_cap + pcie_saved_regs[i];
@@ -3591,9 +3573,12 @@ void pci_allocate_cap_save_buffers(struct pci_dev *dev)
                }
        }
 
-       error = pci_add_cap_save_buffer(dev, PCI_CAP_ID_PCIX, sizeof(u16));
-       if (error)
-               pci_err(dev, "unable to preallocate PCI-X save buffer\n");
+       pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
+       if (pos) {
+               error = pci_reserve_saved_cap(dev, pos + PCI_X_CMD, 
sizeof(u16));
+               if (error)
+                       pci_err(dev, "unable to reserve PCI-X save state\n");
+       }
 
        error = pci_add_ext_cap_save_buffer(dev, PCI_EXT_CAP_ID_LTR,
                                            2 * sizeof(u16));
-- 
2.56.0.rc1.315.gc6ed9934b7-goog


Reply via email to