aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorRajat Jain <rajatxjain@gmail.com>2014-02-18 21:53:19 -0500
committerBjorn Helgaas <bhelgaas@google.com>2014-02-19 17:04:14 -0500
commit2b3940b60626ac4932fa048cc74f2a872cc4bfb4 (patch)
tree290a5e787a7946d6b685bcf98f3017ffe970db01 /drivers/pci
parent50277c8b06d56f2345e1a0693db46db29fc6d063 (diff)
PCI: pciehp: Remove a non-existent card, regardless of "surprise" capability
In case a card is physically yanked out, it should immediately be removed, regardless of the "surprise" capability bit. Thus: - Always handle the physical removal - regardless of the "surprise" bit. - Don't use "surprise" capability when making decisions about enabling presence detect notifications. - Reword the comments to indicate the intent. Signed-off-by: Rajat Jain <rajatxjain@gmail.com> Signed-off-by: Rajat Jain <rajatjain@juniper.net> Signed-off-by: Guenter Roeck <groeck@juniper.net> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/hotplug/pciehp_ctrl.c9
-rw-r--r--drivers/pci/hotplug/pciehp_hpc.c9
2 files changed, 13 insertions, 5 deletions
diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c
index b4a4ac150e61..0c2e524a1cf0 100644
--- a/drivers/pci/hotplug/pciehp_ctrl.c
+++ b/drivers/pci/hotplug/pciehp_ctrl.c
@@ -535,9 +535,16 @@ static void interrupt_event_handler(struct work_struct *work)
535 pciehp_green_led_off(p_slot); 535 pciehp_green_led_off(p_slot);
536 break; 536 break;
537 case INT_PRESENCE_ON: 537 case INT_PRESENCE_ON:
538 case INT_PRESENCE_OFF:
539 if (!HP_SUPR_RM(ctrl)) 538 if (!HP_SUPR_RM(ctrl))
540 break; 539 break;
540 ctrl_dbg(ctrl, "Surprise Insertion\n");
541 handle_surprise_event(p_slot);
542 break;
543 case INT_PRESENCE_OFF:
544 /*
545 * Regardless of surprise capability, we need to
546 * definitely remove a card that has been pulled out!
547 */
541 ctrl_dbg(ctrl, "Surprise Removal\n"); 548 ctrl_dbg(ctrl, "Surprise Removal\n");
542 handle_surprise_event(p_slot); 549 handle_surprise_event(p_slot);
543 break; 550 break;
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c
index da4b0204b4f7..d7d058fa19a4 100644
--- a/drivers/pci/hotplug/pciehp_hpc.c
+++ b/drivers/pci/hotplug/pciehp_hpc.c
@@ -619,9 +619,10 @@ static void pcie_disable_notification(struct controller *ctrl)
619 619
620/* 620/*
621 * pciehp has a 1:1 bus:slot relationship so we ultimately want a secondary 621 * pciehp has a 1:1 bus:slot relationship so we ultimately want a secondary
622 * bus reset of the bridge, but if the slot supports surprise removal (or 622 * bus reset of the bridge, but at the same time we want to ensure that it is
623 * link state change based hotplug), we need to disable presence detection 623 * not seen as a hot-unplug, followed by the hot-plug of the device. Thus,
624 * (or link state notifications) around the bus reset and clear any spurious 624 * disable link state notification and presence detection change notification
625 * momentarily, if we see that they could interfere. Also, clear any spurious
625 * events after. 626 * events after.
626 */ 627 */
627int pciehp_reset_slot(struct slot *slot, int probe) 628int pciehp_reset_slot(struct slot *slot, int probe)
@@ -633,7 +634,7 @@ int pciehp_reset_slot(struct slot *slot, int probe)
633 if (probe) 634 if (probe)
634 return 0; 635 return 0;
635 636
636 if (HP_SUPR_RM(ctrl) && !ATTN_BUTTN(ctrl)) { 637 if (!ATTN_BUTTN(ctrl)) {
637 ctrl_mask |= PCI_EXP_SLTCTL_PDCE; 638 ctrl_mask |= PCI_EXP_SLTCTL_PDCE;
638 stat_mask |= PCI_EXP_SLTSTA_PDC; 639 stat_mask |= PCI_EXP_SLTSTA_PDC;
639 } 640 }