From patchwork Mon Jul 2 22:52:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sinan Kaya X-Patchwork-Id: 938264 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=codeaurora.org header.i=@codeaurora.org header.b="hzi0AWIu"; dkim=pass (1024-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="KT/FICQd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41KMwg5NlJz9s2R for ; Tue, 3 Jul 2018 08:53:07 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932219AbeGBWxG (ORCPT ); Mon, 2 Jul 2018 18:53:06 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:60474 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932100AbeGBWxF (ORCPT ); Mon, 2 Jul 2018 18:53:05 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id B644B60B23; Mon, 2 Jul 2018 22:53:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1530571984; bh=RTtqANtiw+9us5A2G10gOXKgoQLMAb4TTs2B1EkUJ24=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hzi0AWIuoJeQN3lXD5MomIf2mUq1TeeTWVjmv89TA0sNLEqLTX7czpEdKUbncX6t9 Y5biYJ/WR189DXuYD5gm9jPaacPK8G3fv48pmnDuuTbM+CYwCweZX4t6SD6SqPJ836 rWN5C/90+61x3oOwdRrFuJQzWY6OdQ2NtQkAImrs= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED, T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from drakthul.qualcomm.com (global_nat1_iad_fw.qualcomm.com [129.46.232.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: okaya@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 0221D60B13; Mon, 2 Jul 2018 22:53:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1530571983; bh=RTtqANtiw+9us5A2G10gOXKgoQLMAb4TTs2B1EkUJ24=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KT/FICQdgI1746yD3ZN3nIujf/PDGlD+jc9TDjqjnvkNDhPuG3/41EcHXwAFr76hW iVpXxnZ21G+dS3f/kRA/x6M3sG2u61ILnSR2NGM2JhxHj27n2LCyxsIU8wqTT3gBnQ 8np8auVShN4aiWzaHFrttjzJgmDeLWbIGdpPc7XE= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 0221D60B13 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=okaya@codeaurora.org From: Sinan Kaya To: linux-pci@vger.kernel.org Cc: linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Sinan Kaya , Bjorn Helgaas , Andy Shevchenko , Greg Kroah-Hartman , Mika Westerberg , Frederick Lawler , "Rafael J. Wysocki" , Keith Busch , Lukas Wunner , Oza Pawandeep , Markus Elfring , Kees Cook , linux-kernel@vger.kernel.org (open list) Subject: [PATCH V5 1/3] PCI: pciehp: implement mask and unmask interrupt functions Date: Mon, 2 Jul 2018 18:52:45 -0400 Message-Id: <1530571967-19099-2-git-send-email-okaya@codeaurora.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1530571967-19099-1-git-send-email-okaya@codeaurora.org> References: <1530571967-19099-1-git-send-email-okaya@codeaurora.org> MIME-Version: 1.0 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Adding pciehp_mask_irq() and pciehp_unmask_irq() to be called from struct pcie_device as mask_irq() and unmask_irq() callbacks. Signed-off-by: Sinan Kaya --- drivers/pci/hotplug/pciehp.h | 2 ++ drivers/pci/hotplug/pciehp_core.c | 19 +++++++++++++++++++ drivers/pci/hotplug/pciehp_hpc.c | 39 +++++++++++++++++++++++++++++++++++++++ drivers/pci/pcie/portdrv.h | 2 ++ 4 files changed, 62 insertions(+) diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index 5f89206..c579d03 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h @@ -138,6 +138,8 @@ int pciehp_check_link_status(struct controller *ctrl); bool pciehp_check_link_active(struct controller *ctrl); void pciehp_release_ctrl(struct controller *ctrl); int pciehp_reset_slot(struct slot *slot, int probe); +void pciehp_mask_irq(struct slot *slot); +void pciehp_unmask_irq(struct slot *slot); int pciehp_set_raw_indicator_status(struct hotplug_slot *h_slot, u8 status); int pciehp_get_raw_indicator_status(struct hotplug_slot *h_slot, u8 *status); diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c index 44a6a63..ca2faa1 100644 --- a/drivers/pci/hotplug/pciehp_core.c +++ b/drivers/pci/hotplug/pciehp_core.c @@ -299,6 +299,22 @@ static int pciehp_resume(struct pcie_device *dev) } #endif /* PM */ +static void pciehp_mask_int(struct pcie_device *dev) +{ + struct controller *ctrl = get_service_data(dev); + struct slot *slot = ctrl->slot; + + pciehp_mask_irq(slot); +} + +static void pciehp_unmask_int(struct pcie_device *dev) +{ + struct controller *ctrl = get_service_data(dev); + struct slot *slot = ctrl->slot; + + pciehp_unmask_irq(slot); +} + static struct pcie_port_service_driver hpdriver_portdrv = { .name = PCIE_MODULE_NAME, .port_type = PCIE_ANY_PORT, @@ -311,6 +327,9 @@ static struct pcie_port_service_driver hpdriver_portdrv = { .suspend = pciehp_suspend, .resume = pciehp_resume, #endif /* PM */ + + .mask_irq = pciehp_mask_int, + .unmask_irq = pciehp_unmask_int, }; static int __init pcied_init(void) diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 8dae232..d44e2c6 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c @@ -757,6 +757,45 @@ int pciehp_reset_slot(struct slot *slot, int probe) return rc; } +void pciehp_mask_irq(struct slot *slot) +{ + struct controller *ctrl = slot->ctrl; + u16 ctrl_mask = 0; + + if (!ATTN_BUTTN(ctrl)) + ctrl_mask |= PCI_EXP_SLTCTL_PDCE; + + ctrl_mask |= PCI_EXP_SLTCTL_DLLSCE; + + pcie_write_cmd(ctrl, 0, ctrl_mask); + ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, + pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, 0); + if (pciehp_poll_mode) + del_timer_sync(&ctrl->poll_timer); +} + +void pciehp_unmask_irq(struct slot *slot) +{ + struct controller *ctrl = slot->ctrl; + struct pci_dev *pdev = ctrl_dev(ctrl); + u16 stat_mask = 0, ctrl_mask = 0; + + if (!ATTN_BUTTN(ctrl)) { + ctrl_mask |= PCI_EXP_SLTCTL_PDCE; + stat_mask |= PCI_EXP_SLTSTA_PDC; + } + ctrl_mask |= PCI_EXP_SLTCTL_DLLSCE; + stat_mask |= PCI_EXP_SLTSTA_DLLSC; + + pcie_capability_write_word(pdev, PCI_EXP_SLTSTA, stat_mask); + pcie_write_cmd_nowait(ctrl, ctrl_mask, ctrl_mask); + ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, + pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, ctrl_mask); + if (pciehp_poll_mode) + int_poll_timeout(&ctrl->poll_timer); +} + + int pcie_init_notification(struct controller *ctrl) { if (pciehp_request_irq(ctrl)) diff --git a/drivers/pci/pcie/portdrv.h b/drivers/pci/pcie/portdrv.h index 6ffc797..40bb6f2 100644 --- a/drivers/pci/pcie/portdrv.h +++ b/drivers/pci/pcie/portdrv.h @@ -51,6 +51,8 @@ struct pcie_port_service_driver { void (*remove) (struct pcie_device *dev); int (*suspend) (struct pcie_device *dev); int (*resume) (struct pcie_device *dev); + void (*mask_irq)(struct pcie_device *dev); + void (*unmask_irq)(struct pcie_device *dev); /* Device driver may resume normal operations */ void (*error_resume)(struct pci_dev *dev); From patchwork Mon Jul 2 22:52:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sinan Kaya X-Patchwork-Id: 938266 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=codeaurora.org header.i=@codeaurora.org header.b="XjuI4aGz"; dkim=pass (1024-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="VEdkraly"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41KMx23VXDz9s2g for ; Tue, 3 Jul 2018 08:53:26 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932361AbeGBWxK (ORCPT ); Mon, 2 Jul 2018 18:53:10 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:60600 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932100AbeGBWxI (ORCPT ); Mon, 2 Jul 2018 18:53:08 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id B84FA60B3B; Mon, 2 Jul 2018 22:53:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1530571987; bh=cghsNNqcVbuCBkI4WhSV76kRpbS6n544RnT2zRlX1Ro=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XjuI4aGzGtKXINKv29OgoJcCD9+MNnhaJ7iResJDmdVuCfIiU5A6miY6ggL7DeHgA kXZjVl2/dXuNqMpzgKHoGSVrdNJvJu20Mu3artKRpZOwnqofMi/4Z65HBz4ZLWT4mq RHxQa6+chcjMuHrhCM6SZKR5AO6DjdgvzNOp6Yx0= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED, T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from drakthul.qualcomm.com (global_nat1_iad_fw.qualcomm.com [129.46.232.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: okaya@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id B1934607EB; Mon, 2 Jul 2018 22:53:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1530571986; bh=cghsNNqcVbuCBkI4WhSV76kRpbS6n544RnT2zRlX1Ro=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VEdkralyPtDityh9M+kQYKT7s6lO/vjMqBWvaWJPtNSx0vQTyURdHkujqO9ouB9px mLGl95ax8jSPiOl5ridvf5b0L1RgD5I1BNNKNNNHrvaIdEPBl8YcNr6XUj6W0c0gm0 ynOOt8OFNwWU/ublH4vPT01O+p0B6k0pRbjMjlk0= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org B1934607EB Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=okaya@codeaurora.org From: Sinan Kaya To: linux-pci@vger.kernel.org Cc: linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Sinan Kaya , Bjorn Helgaas , Mika Westerberg , Keith Busch , Markus Elfring , Kees Cook , Lukas Wunner , Oza Pawandeep , linux-kernel@vger.kernel.org (open list) Subject: [PATCH V5 2/3] PCI: pciehp: reuse pciehp_mask/unmask_irq() in reset_slot() Date: Mon, 2 Jul 2018 18:52:46 -0400 Message-Id: <1530571967-19099-3-git-send-email-okaya@codeaurora.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1530571967-19099-1-git-send-email-okaya@codeaurora.org> References: <1530571967-19099-1-git-send-email-okaya@codeaurora.org> MIME-Version: 1.0 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Now that we have individual functions to mask/unmask hotplug interrupts avoid code duplication and reuse the new API in multiple places. Signed-off-by: Sinan Kaya --- drivers/pci/hotplug/pciehp_hpc.c | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index d44e2c6..ebf9b3b 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c @@ -726,34 +726,15 @@ static void pcie_disable_notification(struct controller *ctrl) int pciehp_reset_slot(struct slot *slot, int probe) { struct controller *ctrl = slot->ctrl; - struct pci_dev *pdev = ctrl_dev(ctrl); - u16 stat_mask = 0, ctrl_mask = 0; int rc; if (probe) return 0; - if (!ATTN_BUTTN(ctrl)) { - ctrl_mask |= PCI_EXP_SLTCTL_PDCE; - stat_mask |= PCI_EXP_SLTSTA_PDC; - } - ctrl_mask |= PCI_EXP_SLTCTL_DLLSCE; - stat_mask |= PCI_EXP_SLTSTA_DLLSC; - - pcie_write_cmd(ctrl, 0, ctrl_mask); - ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, - pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, 0); - if (pciehp_poll_mode) - del_timer_sync(&ctrl->poll_timer); - + pciehp_mask_irq(slot); rc = pci_bridge_secondary_bus_reset(ctrl->pcie->port); + pciehp_unmask_irq(slot); - pcie_capability_write_word(pdev, PCI_EXP_SLTSTA, stat_mask); - pcie_write_cmd_nowait(ctrl, ctrl_mask, ctrl_mask); - ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, - pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, ctrl_mask); - if (pciehp_poll_mode) - int_poll_timeout(&ctrl->poll_timer); return rc; } From patchwork Mon Jul 2 22:52:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sinan Kaya X-Patchwork-Id: 938267 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=codeaurora.org header.i=@codeaurora.org header.b="obNYgi+6"; dkim=pass (1024-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="RtC4njDK"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41KMxk3d3qz9s2R for ; Tue, 3 Jul 2018 08:54:02 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753555AbeGBWxr (ORCPT ); Mon, 2 Jul 2018 18:53:47 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:34944 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753500AbeGBWxq (ORCPT ); Mon, 2 Jul 2018 18:53:46 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 062C960B72; Mon, 2 Jul 2018 22:53:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1530572026; bh=pYHQTxnahFexmpL0lQMGi2zFFobmcYwl9fUxyeMG0/s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=obNYgi+69uFQK8/CA/GVTO9zgspjE6gW3YlRZHFOje6DZoNAJpKUjMkKGb9d3Aa+P MwtvhW88bih6XY2AHenyg+kl5LJLQGmhpLQeyJRh9C6wB9gboksmZogVvARuVdw3+M ubGEpGtkPxBvU9UeUxqj/9fdZX0VNFbtFijtoAiU= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED, T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from drakthul.qualcomm.com (global_nat1_iad_fw.qualcomm.com [129.46.232.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: okaya@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 7692260B7E; Mon, 2 Jul 2018 22:53:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1530572025; bh=pYHQTxnahFexmpL0lQMGi2zFFobmcYwl9fUxyeMG0/s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RtC4njDKHyVHGvive42vHZS2h2QVXs+5smq5x9HQBtLyvoejuO27wQCn3EB/qolPT vG1pf2X5tXL9ArF6sh5s/8zhu/F0cDUbUiXqdNKCG5kwv048YwaAQx5mgQdgzmr60k uVQ1KHt28JUBFBQ6iMfhGVYPPDN+M33Bm1XKg17M= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 7692260B7E Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=okaya@codeaurora.org From: Sinan Kaya To: linux-pci@vger.kernel.org Cc: linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Sinan Kaya , Bjorn Helgaas , Oza Pawandeep , Keith Busch , linux-kernel@vger.kernel.org (open list) Subject: [PATCH V5 3/3] PCI: Mask and unmask hotplug interrupts during reset Date: Mon, 2 Jul 2018 18:52:47 -0400 Message-Id: <1530571967-19099-4-git-send-email-okaya@codeaurora.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1530571967-19099-1-git-send-email-okaya@codeaurora.org> References: <1530571967-19099-1-git-send-email-okaya@codeaurora.org> MIME-Version: 1.0 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org If a bridge supports hotplug and observes a PCIe fatal error, the following events happen: 1. AER driver removes the devices from PCI tree on fatal error 2. AER driver brings down the link by issuing a secondary bus reset waits for the link to come up. 3. Hotplug driver observes a link down interrupt 4. Hotplug driver tries to remove the devices waiting for the rescan lock but devices are already removed by the AER driver and AER driver is waiting for the link to come back up. 5. AER driver tries to re-enumerate devices after polling for the link state to go up. 6. Hotplug driver obtains the lock and tries to remove the devices again. If a bridge is a hotplug capable bridge, mask hotplug interrupts before the reset and unmask afterwards. Signed-off-by: Sinan Kaya --- drivers/pci/pcie/err.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/pci/pcie/err.c b/drivers/pci/pcie/err.c index ae72f88..5a2d410 100644 --- a/drivers/pci/pcie/err.c +++ b/drivers/pci/pcie/err.c @@ -285,10 +285,12 @@ static pci_ers_result_t broadcast_error_message(struct pci_dev *dev, */ void pcie_do_fatal_recovery(struct pci_dev *dev, u32 service) { + struct pcie_port_service_driver *hpsvc; struct pci_dev *udev; struct pci_bus *parent; struct pci_dev *pdev, *temp; pci_ers_result_t result; + struct device *hpdev; if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) udev = dev; @@ -308,8 +310,17 @@ void pcie_do_fatal_recovery(struct pci_dev *dev, u32 service) pci_dev_put(pdev); } + hpsvc = pcie_port_find_service(udev, PCIE_PORT_SERVICE_HP); + hpdev = pcie_port_find_device(udev, PCIE_PORT_SERVICE_HP); + + if (hpdev && hpsvc) + hpsvc->mask_irq(to_pcie_device(hpdev)); + result = reset_link(udev, service); + if (hpdev && hpsvc) + hpsvc->unmask_irq(to_pcie_device(hpdev)); + if ((service == PCIE_PORT_SERVICE_AER) && (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)) { /*