From patchwork Tue Jan 16 09:58:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oza Pawandeep X-Patchwork-Id: 10166295 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 31D2F601E7 for ; Tue, 16 Jan 2018 09:59:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3A6ED283A5 for ; Tue, 16 Jan 2018 09:59:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2D1B3283B0; Tue, 16 Jan 2018 09:59:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 98DA8283A5 for ; Tue, 16 Jan 2018 09:59:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751407AbeAPJ7b (ORCPT ); Tue, 16 Jan 2018 04:59:31 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:57640 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750816AbeAPJ7Q (ORCPT ); Tue, 16 Jan 2018 04:59:16 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 93D55608BF; Tue, 16 Jan 2018 09:59:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1516096755; bh=VDuPKUw8QXwn22aoU/1eTmeVSQTSkT9XzmpzrvwtA44=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KNxHfdjlBfSMbb9NvD3mXJVtjpZsg/LtFWKS3z9L6TSnB1QQjfKjFE6ctUEUQ7Zld kvmZkJYQVaqV4xtVnpiDOCExJqJlAod0C3bWjDOTfFWqn1AlJYXKLOVjwYeDksRFBU i4XE6K1oaayBpysU+nhjJl8LEmyRVquEjJV/qxQ4= Received: from blr-ubuntu-poza.qualcomm.com (blr-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.18.19]) (using TLSv1.1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: poza@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 4271D602BA; Tue, 16 Jan 2018 09:59:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1516096754; bh=VDuPKUw8QXwn22aoU/1eTmeVSQTSkT9XzmpzrvwtA44=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nSl6BoDqye/d7z5Q5aLthlgc7ypV+CkKjjVMVKwUQX7MM7pMlEB4wMAzsrJxVNFmW If0CZg1BivycPmoK2NploSOTASH+BoQBfDLsPXJjaZpE1BbV7wHud6ikCAjai0kX55 3TEVV+5A8fK0l4km3FNfbgPzHnaewc/5m9XOhqoc= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 4271D602BA 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=poza@codeaurora.org From: Oza Pawandeep To: Bjorn Helgaas , Philippe Ombredanne , Thomas Gleixner , Greg Kroah-Hartman , Kate Stewart , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Dongdong Liu , Keith Busch , Wei Zhang , Sinan Kaya , Timur Tabi Cc: Oza Pawandeep Subject: [PATCH v4 5/5] PCI/DPC: Enumerate the devices after DPC trigger event Date: Tue, 16 Jan 2018 15:28:43 +0530 Message-Id: <1516096723-8013-6-git-send-email-poza@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1516096723-8013-1-git-send-email-poza@codeaurora.org> References: <1516096723-8013-1-git-send-email-poza@codeaurora.org> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Implement error_resume callback in DPC so, after DPC trigger event enumerates the devices beneath. Signed-off-by: Oza Pawandeep diff --git a/drivers/pci/pcie/pcie-dpc.c b/drivers/pci/pcie/pcie-dpc.c index 31799f6..185dbc6 100644 --- a/drivers/pci/pcie/pcie-dpc.c +++ b/drivers/pci/pcie/pcie-dpc.c @@ -162,6 +162,43 @@ static void dpc_wait_link_inactive(struct dpc_dev *dpc) dev_warn(dev, "Link state not disabled for DPC event\n"); } +static bool dpc_wait_link_active(struct pci_dev *pdev) +{ + unsigned long timeout = jiffies + HZ; + u16 lnk_status; + bool ret = true; + + pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lnk_status); + + while (!(lnk_status & PCI_EXP_LNKSTA_DLLLA) && + !time_after(jiffies, timeout)) { + msleep(10); + pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lnk_status); + } + + if (!(lnk_status & PCI_EXP_LNKSTA_DLLLA)) { + dev_warn(&pdev->dev, "Link state not enabled after DPC event\n"); + ret = false; + } + + return ret; +} + +/** + * dpc_error_resume - enumerate the devices beneath + * @dev: pointer to Root Port's pci_dev data structure + * + * Invoked by Port Bus driver during nonfatal recovery. + */ +static void dpc_error_resume(struct pci_dev *pdev) +{ + if (dpc_wait_link_active(pdev)) { + pci_lock_rescan_remove(); + pci_rescan_bus(pdev->bus); + pci_unlock_rescan_remove(); + } +} + /** * dpc_reset_link - reset link DPC routine * @dev: pointer to Root Port's pci_dev data structure @@ -420,6 +457,7 @@ static void dpc_remove(struct pcie_device *dev) .service = PCIE_PORT_SERVICE_DPC, .probe = dpc_probe, .remove = dpc_remove, + .error_resume = dpc_error_resume, .reset_link = dpc_reset_link, }; diff --git a/drivers/pci/pcie/pcie-err.c b/drivers/pci/pcie/pcie-err.c index 14b9153..95950f6 100644 --- a/drivers/pci/pcie/pcie-err.c +++ b/drivers/pci/pcie/pcie-err.c @@ -236,6 +236,7 @@ pci_ers_result_t pci_reset_link(struct pci_dev *dev, int severity) * @state: error state * @error_mesg: message to print * @cb: callback to be broadcasted + * @severity: error severity * * Invoked during error recovery process. Once being invoked, the content * of error severity will be broadcasted to all downstream drivers in a @@ -244,7 +245,8 @@ pci_ers_result_t pci_reset_link(struct pci_dev *dev, int severity) pci_ers_result_t pci_broadcast_error_message(struct pci_dev *dev, enum pci_channel_state state, char *error_mesg, - int (*cb)(struct pci_dev *, void *)) + int (*cb)(struct pci_dev *, void *), + int severity) { struct pci_err_broadcast_data result_data; @@ -256,6 +258,15 @@ pci_ers_result_t pci_broadcast_error_message(struct pci_dev *dev, result_data.result = PCI_ERS_RESULT_RECOVERED; if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { + /* If DPC is triggered, call resume error hanlder + * because, at this point we can safely assume that + * link recovery has happened. + */ + if ((severity == PCI_ERR_DPC_FATAL) && + (cb == pci_report_resume)) { + cb(dev, NULL); + return PCI_ERS_RESULT_RECOVERED; + } /* * If the error is reported by a bridge, we think this error * is related to the downstream link of the bridge, so we @@ -305,7 +316,8 @@ void pci_do_recovery(struct pci_dev *dev, int severity) status = pci_broadcast_error_message(dev, state, "error_detected", - pci_report_error_detected); + pci_report_error_detected, + severity); if ((severity == PCI_ERR_AER_FATAL) || (severity == PCI_ERR_DPC_FATAL)) { @@ -314,11 +326,15 @@ void pci_do_recovery(struct pci_dev *dev, int severity) goto failed; } + if (severity == PCI_ERR_DPC_FATAL) + goto resume; + if (status == PCI_ERS_RESULT_CAN_RECOVER) status = pci_broadcast_error_message(dev, state, "mmio_enabled", - pci_report_mmio_enabled); + pci_report_mmio_enabled, + severity); if (status == PCI_ERS_RESULT_NEED_RESET) { /* @@ -329,19 +345,22 @@ void pci_do_recovery(struct pci_dev *dev, int severity) status = pci_broadcast_error_message(dev, state, "slot_reset", - pci_report_slot_reset); + pci_report_slot_reset, + severity); } if (status != PCI_ERS_RESULT_RECOVERED) goto failed; +resume: pci_broadcast_error_message(dev, state, "resume", - pci_report_resume); + pci_report_resume, + severity); - dev_info(&dev->dev, "Device recovery successful\n"); mutex_unlock(&pci_err_recovery_lock); + dev_info(&dev->dev, "Device recovery successful\n"); return; failed: