Commit f900e444 authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

Merge branch 'pci/aer'

- Configure ECRC only if AER is native (Vidya Sagar)

- Stop enabling device error reporting for the downstream hierarchy when
  the AER service driver probes a Root Port because we've already done that
  when enumerating those downstream devices (Bjorn Helgaas)

* pci/aer:
  PCI/AER: Remove redundant Device Control Error Reporting Enable
  PCI/AER: Configure ECRC only if AER is native
parents 1b929c02 6b985af5
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -4296,7 +4296,9 @@
				specified, e.g., 12@pci:8086:9c22:103c:198f
				for 4096-byte alignment.
		ecrc=		Enable/disable PCIe ECRC (transaction layer
				end-to-end CRC checking).
				end-to-end CRC checking). Only effective if
				OS has native AER control (either granted by
				ACPI _OSC or forced via "pcie_ports=native")
				bios: Use BIOS/firmware settings. This is the
				the default.
				off: Turn ECRC off
+3 −48
Original line number Diff line number Diff line
@@ -184,6 +184,9 @@ static int disable_ecrc_checking(struct pci_dev *dev)
 */
void pcie_set_ecrc_checking(struct pci_dev *dev)
{
	if (!pcie_aer_is_native(dev))
		return;

	switch (ecrc_policy) {
	case ECRC_POLICY_DEFAULT:
		return;
@@ -1224,42 +1227,6 @@ static irqreturn_t aer_irq(int irq, void *context)
	return IRQ_WAKE_THREAD;
}

static int set_device_error_reporting(struct pci_dev *dev, void *data)
{
	bool enable = *((bool *)data);
	int type = pci_pcie_type(dev);

	if ((type == PCI_EXP_TYPE_ROOT_PORT) ||
	    (type == PCI_EXP_TYPE_RC_EC) ||
	    (type == PCI_EXP_TYPE_UPSTREAM) ||
	    (type == PCI_EXP_TYPE_DOWNSTREAM)) {
		if (enable)
			pci_enable_pcie_error_reporting(dev);
		else
			pci_disable_pcie_error_reporting(dev);
	}

	return 0;
}

/**
 * set_downstream_devices_error_reporting - enable/disable the error reporting  bits on the root port and its downstream ports.
 * @dev: pointer to root port's pci_dev data structure
 * @enable: true = enable error reporting, false = disable error reporting.
 */
static void set_downstream_devices_error_reporting(struct pci_dev *dev,
						   bool enable)
{
	set_device_error_reporting(dev, &enable);

	if (pci_pcie_type(dev) == PCI_EXP_TYPE_RC_EC)
		pcie_walk_rcec(dev, set_device_error_reporting, &enable);
	else if (dev->subordinate)
		pci_walk_bus(dev->subordinate, set_device_error_reporting,
			     &enable);

}

/**
 * aer_enable_rootport - enable Root Port's interrupts when receiving messages
 * @rpc: pointer to a Root Port data structure
@@ -1289,12 +1256,6 @@ static void aer_enable_rootport(struct aer_rpc *rpc)
	pci_read_config_dword(pdev, aer + PCI_ERR_UNCOR_STATUS, &reg32);
	pci_write_config_dword(pdev, aer + PCI_ERR_UNCOR_STATUS, reg32);

	/*
	 * Enable error reporting for the root port device and downstream port
	 * devices.
	 */
	set_downstream_devices_error_reporting(pdev, true);

	/* Enable Root Port's interrupt in response to error messages */
	pci_read_config_dword(pdev, aer + PCI_ERR_ROOT_COMMAND, &reg32);
	reg32 |= ROOT_PORT_INTR_ON_MESG_MASK;
@@ -1313,12 +1274,6 @@ static void aer_disable_rootport(struct aer_rpc *rpc)
	int aer = pdev->aer_cap;
	u32 reg32;

	/*
	 * Disable error reporting for the root port device and downstream port
	 * devices.
	 */
	set_downstream_devices_error_reporting(pdev, false);

	/* Disable Root's interrupt in response to error messages */
	pci_read_config_dword(pdev, aer + PCI_ERR_ROOT_COMMAND, &reg32);
	reg32 &= ~ROOT_PORT_INTR_ON_MESG_MASK;