aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShaohua Li <shaohua.li@intel.com>2007-12-17 20:57:09 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2008-02-01 18:04:27 -0500
commit017fc480cc8cc0594dc250951d78e814667ae4c2 (patch)
tree04efdbe646e8333be11ba6e9a0fc867109d22245
parentec0a3a27fbb5792980b8c3ce4a93bc2ee93d0b35 (diff)
PCI: avoid save the same type of cap multiple times
Avoid adding the same type of cap multiple times, otherwise we will see dead loop. Signed-off-by: Shaohua Li <shaohua.li@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/pci/pci.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 342857c555de..7248e9fb12bd 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -569,6 +569,7 @@ static int pci_save_pcie_state(struct pci_dev *dev)
569 int pos, i = 0; 569 int pos, i = 0;
570 struct pci_cap_saved_state *save_state; 570 struct pci_cap_saved_state *save_state;
571 u16 *cap; 571 u16 *cap;
572 int found = 0;
572 573
573 pos = pci_find_capability(dev, PCI_CAP_ID_EXP); 574 pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
574 if (pos <= 0) 575 if (pos <= 0)
@@ -577,6 +578,8 @@ static int pci_save_pcie_state(struct pci_dev *dev)
577 save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP); 578 save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP);
578 if (!save_state) 579 if (!save_state)
579 save_state = kzalloc(sizeof(*save_state) + sizeof(u16) * 4, GFP_KERNEL); 580 save_state = kzalloc(sizeof(*save_state) + sizeof(u16) * 4, GFP_KERNEL);
581 else
582 found = 1;
580 if (!save_state) { 583 if (!save_state) {
581 dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); 584 dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n");
582 return -ENOMEM; 585 return -ENOMEM;
@@ -588,7 +591,8 @@ static int pci_save_pcie_state(struct pci_dev *dev)
588 pci_read_config_word(dev, pos + PCI_EXP_SLTCTL, &cap[i++]); 591 pci_read_config_word(dev, pos + PCI_EXP_SLTCTL, &cap[i++]);
589 pci_read_config_word(dev, pos + PCI_EXP_RTCTL, &cap[i++]); 592 pci_read_config_word(dev, pos + PCI_EXP_RTCTL, &cap[i++]);
590 save_state->cap_nr = PCI_CAP_ID_EXP; 593 save_state->cap_nr = PCI_CAP_ID_EXP;
591 pci_add_saved_cap(dev, save_state); 594 if (!found)
595 pci_add_saved_cap(dev, save_state);
592 return 0; 596 return 0;
593} 597}
594 598
@@ -616,6 +620,7 @@ static int pci_save_pcix_state(struct pci_dev *dev)
616 int pos, i = 0; 620 int pos, i = 0;
617 struct pci_cap_saved_state *save_state; 621 struct pci_cap_saved_state *save_state;
618 u16 *cap; 622 u16 *cap;
623 int found = 0;
619 624
620 pos = pci_find_capability(dev, PCI_CAP_ID_PCIX); 625 pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
621 if (pos <= 0) 626 if (pos <= 0)
@@ -624,6 +629,8 @@ static int pci_save_pcix_state(struct pci_dev *dev)
624 save_state = pci_find_saved_cap(dev, PCI_CAP_ID_PCIX); 629 save_state = pci_find_saved_cap(dev, PCI_CAP_ID_PCIX);
625 if (!save_state) 630 if (!save_state)
626 save_state = kzalloc(sizeof(*save_state) + sizeof(u16), GFP_KERNEL); 631 save_state = kzalloc(sizeof(*save_state) + sizeof(u16), GFP_KERNEL);
632 else
633 found = 1;
627 if (!save_state) { 634 if (!save_state) {
628 dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); 635 dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n");
629 return -ENOMEM; 636 return -ENOMEM;
@@ -632,7 +639,8 @@ static int pci_save_pcix_state(struct pci_dev *dev)
632 639
633 pci_read_config_word(dev, pos + PCI_X_CMD, &cap[i++]); 640 pci_read_config_word(dev, pos + PCI_X_CMD, &cap[i++]);
634 save_state->cap_nr = PCI_CAP_ID_PCIX; 641 save_state->cap_nr = PCI_CAP_ID_PCIX;
635 pci_add_saved_cap(dev, save_state); 642 if (!found)
643 pci_add_saved_cap(dev, save_state);
636 return 0; 644 return 0;
637} 645}
638 646