aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/hotplug
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2014-06-14 12:56:31 -0400
committerBjorn Helgaas <bhelgaas@google.com>2014-06-17 17:26:20 -0400
commit2cc56f3028091578dcf0093cd00f1fee7a21515d (patch)
tree0117db43a6bf505968d1d894fab9626173cfaa98 /drivers/pci/hotplug
parent40b960831cfa8ee34d4b1035ddd7074bc5b01ecf (diff)
PCI: pciehp: Remove assumptions about which commands cause completion events
We use incorrect logic to decide whether a PCIe hotplug controller generates command completion events. 5808639bfa98 ("pciehp: fix slow probing") assumed that the Slot Status "Command Completed" bit was set only for commands affecting slot power, indicators, or electromechanical interlock. That assumption is false: per sec. 6.7.3.2 of PCIe spec r3.0, a write targeting any portion of the Slot Control register is a command, and (if command completed events are supported) software must wait for a command to complete before issuing the next command. 5808639bfa98 was to fix boot-time timeouts (see bugzilla below) on a Lenovo Thinkpad R61 with an Intel hotplug controller. The controller probably has the Intel CF118 erratum, which means it doesn't report Command Completed unless the Slot Control power, indicator, or interlock bits are changed. This causes a timeout because pciehp always waits for Command Complete (if supported), regardless of which bits are changed. Remove the incorrect logic because the timeouts have been addressed differently by these changes: PCI: pciehp: Wait for hotplug command completion lazily PCI: pciehp: Compute timeout from hotplug command start time Link: https://bugzilla.kernel.org/show_bug.cgi?id=10751 Tested-by: Rajat Jain <rajatxjain@gmail.com> (IDT 807a controller) Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Yinghai Lu <yinghai@kernel.org>
Diffstat (limited to 'drivers/pci/hotplug')
-rw-r--r--drivers/pci/hotplug/pciehp_hpc.c35
1 files changed, 5 insertions, 30 deletions
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c
index 720dfe5fc48a..a3a5c65def1c 100644
--- a/drivers/pci/hotplug/pciehp_hpc.c
+++ b/drivers/pci/hotplug/pciehp_hpc.c
@@ -185,7 +185,6 @@ static void pcie_wait_cmd(struct controller *ctrl)
185static void pcie_write_cmd(struct controller *ctrl, u16 cmd, u16 mask) 185static void pcie_write_cmd(struct controller *ctrl, u16 cmd, u16 mask)
186{ 186{
187 struct pci_dev *pdev = ctrl_dev(ctrl); 187 struct pci_dev *pdev = ctrl_dev(ctrl);
188 u16 slot_status;
189 u16 slot_ctrl; 188 u16 slot_ctrl;
190 189
191 mutex_lock(&ctrl->ctrl_lock); 190 mutex_lock(&ctrl->ctrl_lock);
@@ -193,30 +192,6 @@ static void pcie_write_cmd(struct controller *ctrl, u16 cmd, u16 mask)
193 /* Wait for any previous command that might still be in progress */ 192 /* Wait for any previous command that might still be in progress */
194 pcie_wait_cmd(ctrl); 193 pcie_wait_cmd(ctrl);
195 194
196 pcie_capability_read_word(pdev, PCI_EXP_SLTSTA, &slot_status);
197 if (slot_status & PCI_EXP_SLTSTA_CC) {
198 pcie_capability_write_word(pdev, PCI_EXP_SLTSTA,
199 PCI_EXP_SLTSTA_CC);
200 if (!ctrl->no_cmd_complete) {
201 /*
202 * After 1 sec and CMD_COMPLETED still not set, just
203 * proceed forward to issue the next command according
204 * to spec. Just print out the error message.
205 */
206 ctrl_dbg(ctrl, "CMD_COMPLETED not clear after 1 sec\n");
207 } else if (!NO_CMD_CMPL(ctrl)) {
208 /*
209 * This controller seems to notify of command completed
210 * event even though it supports none of power
211 * controller, attention led, power led and EMI.
212 */
213 ctrl_dbg(ctrl, "Unexpected CMD_COMPLETED. Need to wait for command completed event\n");
214 ctrl->no_cmd_complete = 0;
215 } else {
216 ctrl_dbg(ctrl, "Unexpected CMD_COMPLETED. Maybe the controller is broken\n");
217 }
218 }
219
220 pcie_capability_read_word(pdev, PCI_EXP_SLTCTL, &slot_ctrl); 195 pcie_capability_read_word(pdev, PCI_EXP_SLTCTL, &slot_ctrl);
221 slot_ctrl &= ~mask; 196 slot_ctrl &= ~mask;
222 slot_ctrl |= (cmd & mask); 197 slot_ctrl |= (cmd & mask);
@@ -796,14 +771,14 @@ struct controller *pcie_init(struct pcie_device *dev)
796 mutex_init(&ctrl->ctrl_lock); 771 mutex_init(&ctrl->ctrl_lock);
797 init_waitqueue_head(&ctrl->queue); 772 init_waitqueue_head(&ctrl->queue);
798 dbg_ctrl(ctrl); 773 dbg_ctrl(ctrl);
774
799 /* 775 /*
800 * Controller doesn't notify of command completion if the "No 776 * Controller doesn't notify of command completion if the "No
801 * Command Completed Support" bit is set in Slot Capability 777 * Command Completed Support" bit is set in Slot Capabilities.
802 * register or the controller supports none of power 778 * If set, it means the controller can accept hotplug commands
803 * controller, attention led, power led and EMI. 779 * with no delay between them.
804 */ 780 */
805 if (NO_CMD_CMPL(ctrl) || 781 if (NO_CMD_CMPL(ctrl))
806 !(POWER_CTRL(ctrl) | ATTN_LED(ctrl) | PWR_LED(ctrl) | EMI(ctrl)))
807 ctrl->no_cmd_complete = 1; 782 ctrl->no_cmd_complete = 1;
808 783
809 /* Check if Data Link Layer Link Active Reporting is implemented */ 784 /* Check if Data Link Layer Link Active Reporting is implemented */