diff mbox

[v9,7/7] PCI/DPC: Enumerate the devices after DPC trigger event

Message ID 1519285571-5634-8-git-send-email-poza@codeaurora.org (mailing list archive)
State New, archived
Delegated to: Bjorn Helgaas
Headers show

Commit Message

Oza Pawandeep Feb. 22, 2018, 7:46 a.m. UTC
Implement error_resume callback in DPC so, after DPC trigger event
enumerates the devices beneath.

Signed-off-by: Oza Pawandeep <poza@codeaurora.org>

Comments

Randy Dunlap Feb. 22, 2018, 7:23 p.m. UTC | #1
On 02/21/2018 11:46 PM, Oza Pawandeep wrote:
> Implement error_resume callback in DPC so, after DPC trigger event
> enumerates the devices beneath.
> 
> Signed-off-by: Oza Pawandeep <poza@codeaurora.org>
> 
> diff --git a/drivers/pci/pcie/pcie-dpc.c b/drivers/pci/pcie/pcie-dpc.c
> index fce4518..59c01c7 100644
> --- a/drivers/pci/pcie/pcie-dpc.c
> +++ b/drivers/pci/pcie/pcie-dpc.c
> @@ -129,6 +129,23 @@ static void dpc_wait_link_inactive(struct dpc_dev *dpc)
>  }
>  
>  /**
> + * dpc_error_resume - enumerate the devices beneath
> + * @dev: pointer to Root Port's pci_dev data structure

    * @pdev: ...

> + *
> + * Invoked by Port Bus driver during nonfatal recovery.
> + */
> +static void dpc_error_resume(struct pci_dev *pdev)
> +{
> +	bool active = true;
> +
> +	if (pci_wait_for_link(pdev, active)) {
> +		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
>   *
> diff --git a/drivers/pci/pcie/pcie-err.c b/drivers/pci/pcie/pcie-err.c
> index 6844347..4950f49 100644
> --- a/drivers/pci/pcie/pcie-err.c
> +++ b/drivers/pci/pcie/pcie-err.c
> @@ -256,6 +258,15 @@ 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 hanlder

		                                          handler

Kernel multi-line comment style is:
		/*
		 * Begin comment here.
		 * foo bar blah
		 */

> +		 * because, at this point we can safely assume that
> +		 * link recovery has happened.
> +		 */
> +		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

thanks,
Oza Pawandeep Feb. 23, 2018, 5:22 a.m. UTC | #2
On 2018-02-23 00:53, Randy Dunlap wrote:
> On 02/21/2018 11:46 PM, Oza Pawandeep wrote:
>> Implement error_resume callback in DPC so, after DPC trigger event
>> enumerates the devices beneath.
>> 
>> Signed-off-by: Oza Pawandeep <poza@codeaurora.org>
>> 
>> diff --git a/drivers/pci/pcie/pcie-dpc.c b/drivers/pci/pcie/pcie-dpc.c
>> index fce4518..59c01c7 100644
>> --- a/drivers/pci/pcie/pcie-dpc.c
>> +++ b/drivers/pci/pcie/pcie-dpc.c
>> @@ -129,6 +129,23 @@ static void dpc_wait_link_inactive(struct dpc_dev 
>> *dpc)
>>  }
>> 
>>  /**
>> + * dpc_error_resume - enumerate the devices beneath
>> + * @dev: pointer to Root Port's pci_dev data structure
> 
>     * @pdev: ...
> 
>> + *
>> + * Invoked by Port Bus driver during nonfatal recovery.
>> + */
>> +static void dpc_error_resume(struct pci_dev *pdev)
>> +{
>> +	bool active = true;
>> +
>> +	if (pci_wait_for_link(pdev, active)) {
>> +		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
>>   *
>> diff --git a/drivers/pci/pcie/pcie-err.c b/drivers/pci/pcie/pcie-err.c
>> index 6844347..4950f49 100644
>> --- a/drivers/pci/pcie/pcie-err.c
>> +++ b/drivers/pci/pcie/pcie-err.c
>> @@ -256,6 +258,15 @@ 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 hanlder
> 
> 		                                          handler
> 
> Kernel multi-line comment style is:
> 		/*
> 		 * Begin comment here.
> 		 * foo bar blah
> 		 */
> 
>> +		 * because, at this point we can safely assume that
>> +		 * link recovery has happened.
>> +		 */
>> +		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
> 
> thanks,

Thanks for the comments,
All your comments are taken care in v10, though I will post v11.
diff mbox

Patch

diff --git a/drivers/pci/pcie/pcie-dpc.c b/drivers/pci/pcie/pcie-dpc.c
index fce4518..59c01c7 100644
--- a/drivers/pci/pcie/pcie-dpc.c
+++ b/drivers/pci/pcie/pcie-dpc.c
@@ -129,6 +129,23 @@  static void dpc_wait_link_inactive(struct dpc_dev *dpc)
 }
 
 /**
+ * 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)
+{
+	bool active = true;
+
+	if (pci_wait_for_link(pdev, active)) {
+		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
  *
@@ -366,6 +383,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 6844347..4950f49 100644
--- a/drivers/pci/pcie/pcie-err.c
+++ b/drivers/pci/pcie/pcie-err.c
@@ -236,6 +236,7 @@  static pci_ers_result_t 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 @@  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;
 
@@ -256,6 +258,15 @@  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 hanlder
+		 * because, at this point we can safely assume that
+		 * link recovery has happened.
+		 */
+		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
@@ -305,7 +316,8 @@  void pci_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)) {
@@ -321,7 +333,8 @@  void pci_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) {
 		/*
@@ -332,7 +345,8 @@  void pci_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)
@@ -342,7 +356,8 @@  void pci_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");
 	mutex_unlock(&pci_err_recovery_lock);