Received: by 10.223.185.116 with SMTP id b49csp6420248wrg; Wed, 28 Feb 2018 09:06:36 -0800 (PST) X-Google-Smtp-Source: AG47ELuzRy0HA9wi4pYrJbD3HLdap8E8M5ojdAEy7X1KoNrRneP1AOoY/WiG7yklYL3bhOYtXp5L X-Received: by 10.99.149.87 with SMTP id t23mr6805075pgn.411.1519837596485; Wed, 28 Feb 2018 09:06:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519837596; cv=none; d=google.com; s=arc-20160816; b=KjnHLHkGAeoZ6Cf3kHMv68tAm56T3VDQnIii/+nPEOyfY/rPTp+oyrfAkIMwCV6mwE Zyp+rc2ild246E3EIzya9y/nNC2uh0FpgpA1IPHalM4n4A8OtrC9QZtfq+twKJCZX77h aIEQozdn7g7DxWbcbaKkR8q0wTH5NgoQyqeMgrWVYaDvp+J+/kINXPMCJdubDWU9fUon nnQ6OiLqvH8z1qPXaS9XhlUmX8YR7Lu0aosiRP0t+DvKyGhyXkFDbFp6mL4Ak5b7r7Oj 1GlRU8P7s05wmkbEJ0c378vEtESQQb6GuDqjD7w0KROSfODxCSE3XVF4HxoZH6NVJwIZ J/vg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dmarc-filter:dkim-signature:dkim-signature :arc-authentication-results; bh=ixDaG35QzZ00T7iGqHadiZIYRBmR84Z/5et5n0u1NAs=; b=wGShTYMsJHBrV23OyIpVyxm06I2RQmyChcmehbhYmtCsSDc9zsNxbhJw2Ba8fAFu97 R9dH9ILWIbWXV60DbJ7E2vml6d4vppYxbp/utns/WH8HwxyW4mblqnj4EMl8N2/5Vh+6 SJ2ac57IY5M0ZQusGXm01/vXqo5Kx/lLjothyYt9WgzG79iYIYHnN8YJRXFQeTGwhc11 zuMZwM71t49Kp2YF3LIwlVkGwig9ePCvs6D46NCxXIRfz9eCnyOyQ42u+HGTGEmqDkWO X1Dro8qLSe9ubAOGeS8zSJ3SpJDT0nCdVestzvKtcvjVfeieHtCzk+jR9arry/JCP4LO G5aA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=Vxo//1gW; dkim=pass header.i=@codeaurora.org header.s=default header.b=Dmb/snwQ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j6-v6si1525520pll.799.2018.02.28.09.06.08; Wed, 28 Feb 2018 09:06:36 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=Vxo//1gW; dkim=pass header.i=@codeaurora.org header.s=default header.b=Dmb/snwQ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932958AbeB1RFG (ORCPT + 99 others); Wed, 28 Feb 2018 12:05:06 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:45278 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932812AbeB1RFB (ORCPT ); Wed, 28 Feb 2018 12:05:01 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id B58D1601CF; Wed, 28 Feb 2018 17:05:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1519837500; bh=JisraO1YpoJAvN+DY3Q1n3NsLRNfYArsNwzSzwbOtN0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Vxo//1gWmI9JWDKXwBoCzr+DHdvOq3G/4Skzxceq/0QSRvUoSdk7ynaihGmaXmViw hAhqevrte+1ab13r7mCsZ4gC/56XOhwvUxmOeDaP0Ow/+kyUAy5YUaUsn7RPZ8ymXp 5T2snDEMh/0CNjjCJomZfuNr22+88ls91gjfc47g= 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,T_FILL_THIS_FORM_SHORT autolearn=no autolearn_force=no version=3.4.0 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 292D2601CF; Wed, 28 Feb 2018 17:04:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1519837499; bh=JisraO1YpoJAvN+DY3Q1n3NsLRNfYArsNwzSzwbOtN0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Dmb/snwQ/cpRl5CpzLcdF+68pu9EZ7Z1y9e5a9HusKVYlPHSRWERxYp+pS+nmbKwd XQ2R6Pzi0wZh4f3q7LUJ7M/GOlwyXiG9hw6Y9XtTza/tRouKYmXtnBEqkmURS2Jp+W /GLU5LoU+JkYuH3m02lrNRweE4BsWARbM2wN3HII= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 292D2601CF 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 v12 6/6] PCI/DPC: Enumerate the devices after DPC trigger event Date: Wed, 28 Feb 2018 22:34:17 +0530 Message-Id: <1519837457-3596-7-git-send-email-poza@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1519837457-3596-1-git-send-email-poza@codeaurora.org> References: <1519837457-3596-1-git-send-email-poza@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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/err.c b/drivers/pci/pcie/err.c index 9f1c983..d439bfd 100644 --- a/drivers/pci/pcie/err.c +++ b/drivers/pci/pcie/err.c @@ -237,7 +237,8 @@ static pci_ers_result_t reset_link(struct pci_dev *dev, int severity) static pci_ers_result_t 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 aer_broadcast_data result_data; @@ -249,6 +250,17 @@ static pci_ers_result_t 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 handler + * because, at this point we can safely assume that + * link recovery has happened, this is only handled if + * callback is resume, as this function can be called + * with multiple callbacks. + */ + if ((severity == DPC_FATAL) && + (cb == 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 @@ -296,7 +308,8 @@ void pcie_do_recovery(struct pci_dev *dev, int severity) status = broadcast_error_message(dev, state, "error_detected", - report_error_detected); + report_error_detected, + severity); if ((severity == AER_FATAL) || (severity == DPC_FATAL)) { @@ -311,7 +324,8 @@ void pcie_do_recovery(struct pci_dev *dev, int severity) status = broadcast_error_message(dev, state, "mmio_enabled", - report_mmio_enabled); + report_mmio_enabled, + severity); if (status == PCI_ERS_RESULT_NEED_RESET) { /* @@ -322,7 +336,8 @@ void pcie_do_recovery(struct pci_dev *dev, int severity) status = broadcast_error_message(dev, state, "slot_reset", - report_slot_reset); + report_slot_reset, + severity); } if (status != PCI_ERS_RESULT_RECOVERED) @@ -332,7 +347,8 @@ void pcie_do_recovery(struct pci_dev *dev, int severity) broadcast_error_message(dev, state, "resume", - report_resume); + report_resume, + severity); dev_info(&dev->dev, "Device recovery successful\n"); return; diff --git a/drivers/pci/pcie/pcie-dpc.c b/drivers/pci/pcie/pcie-dpc.c index 8e1553b..fb6bbd3 100644 --- a/drivers/pci/pcie/pcie-dpc.c +++ b/drivers/pci/pcie/pcie-dpc.c @@ -101,9 +101,24 @@ static void dpc_wait_link_inactive(struct dpc_dev *dpc) } /** - * dpc_reset_link - reset link DPC routine + * dpc_error_resume - enumerate the devices beneath * @pdev: pointer to Root Port's pci_dev data structure * + * Invoked by Port Bus driver during fatal recovery. + */ +static void dpc_error_resume(struct pci_dev *pdev) +{ + if (pcie_wait_for_link(pdev, true)) { + 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 + * * Invoked by Port Bus driver when performing link reset at Root Port. */ static pci_ers_result_t dpc_reset_link(struct pci_dev *pdev) @@ -338,6 +353,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, }; -- Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc., a Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.