diff options
author | Keck, David <david.keck@amd.com> | 2006-01-16 16:22:36 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-31 21:00:12 -0500 |
commit | 53044f357448693f218cc4f053affe92ed414f9d (patch) | |
tree | dabb2a73762270027d72828a055ba1dd243860af /drivers/pci/hotplug/shpchp_ctrl.c | |
parent | 3c0c6441883be7676b795939e268b90d6acab360 (diff) |
[PATCH] PCI Hotplug: shpchp: AMD POGO errata fix
This patch fixes the AMD POGO errata on the hotplug controller where the
platform will lock up or reboot if PERR/SERR generation is enabled and a
slot is sent an enable command. This fix disables PERR/SERR generation
before a slot is sent the enable command by first saving related
registers, turning off SERR/PERR generation, enabling the slot, then
restoring the registers.
Signed-off-by: David Keck <david.keck@amd.com>
Cc: Kristen Accardi <kristen.c.accardi@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/pci/hotplug/shpchp_ctrl.c')
-rw-r--r-- | drivers/pci/hotplug/shpchp_ctrl.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c index 25ccb0e47593..643252d9bf3b 100644 --- a/drivers/pci/hotplug/shpchp_ctrl.c +++ b/drivers/pci/hotplug/shpchp_ctrl.c | |||
@@ -894,7 +894,17 @@ int shpchp_enable_slot (struct slot *p_slot) | |||
894 | dbg("%s: p_slot->pwr_save %x\n", __FUNCTION__, p_slot->pwr_save); | 894 | dbg("%s: p_slot->pwr_save %x\n", __FUNCTION__, p_slot->pwr_save); |
895 | p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); | 895 | p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); |
896 | 896 | ||
897 | rc = board_added(p_slot); | 897 | if(((p_slot->ctrl->pci_dev->vendor == PCI_VENDOR_ID_AMD) || |
898 | (p_slot->ctrl->pci_dev->device == PCI_DEVICE_ID_AMD_POGO_7458)) | ||
899 | && p_slot->ctrl->num_slots == 1) { | ||
900 | /* handle amd pogo errata; this must be done before enable */ | ||
901 | amd_pogo_errata_save_misc_reg(p_slot); | ||
902 | rc = board_added(p_slot); | ||
903 | /* handle amd pogo errata; this must be done after enable */ | ||
904 | amd_pogo_errata_restore_misc_reg(p_slot); | ||
905 | } else | ||
906 | rc = board_added(p_slot); | ||
907 | |||
898 | if (rc) { | 908 | if (rc) { |
899 | p_slot->hpc_ops->get_adapter_status(p_slot, | 909 | p_slot->hpc_ops->get_adapter_status(p_slot, |
900 | &(p_slot->presence_save)); | 910 | &(p_slot->presence_save)); |