Example #1
0
static void handle_error_source(struct pcie_device *aerdev,
	struct pci_dev *dev,
	struct aer_err_info *info)
{
	pci_ers_result_t status = 0;
	int pos;

	if (info->severity == AER_CORRECTABLE) {
		
		pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
		if (pos)
			pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS,
					info->status);
	} else {
		status = do_recovery(aerdev, dev, info->severity);
		if (status == PCI_ERS_RESULT_RECOVERED) {
			dev_printk(KERN_DEBUG, &dev->dev, "AER driver "
				   "successfully recovered\n");
		} else {
			
			dev_printk(KERN_DEBUG, &dev->dev, "AER driver didn't "
				   "recover\n");
		}
	}
}
Example #2
0
/**
 * handle_error_source - handle logging error into an event log
 * @aerdev: pointer to pcie_device data structure of the root port
 * @dev: pointer to pci_dev data structure of error source device
 * @info: comprehensive error information
 *
 * Invoked when an error being detected by Root Port.
 */
static void handle_error_source(struct pcie_device *aerdev,
                                struct pci_dev *dev,
                                struct aer_err_info *info)
{
    pci_ers_result_t status = 0;
    int pos;

    if (info->severity == AER_CORRECTABLE) {
        /*
         * Correctable error does not need software intevention.
         * No need to go through error recovery process.
         */
        pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
        if (pos)
            pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS,
                                   info->status);
    } else {
        status = do_recovery(aerdev, dev, info->severity);
        if (status == PCI_ERS_RESULT_RECOVERED) {
            dev_printk(KERN_DEBUG, &dev->dev, "AER driver "
                       "successfully recovered\n");
        } else {
            /* TODO: Should kernel panic here? */
            dev_printk(KERN_DEBUG, &dev->dev, "AER driver didn't "
                       "recover\n");
        }
    }
}
Example #3
0
/**
 * handle_error_source - handle logging error into an event log
 * @aerdev: pointer to pcie_device data structure of the root port
 * @dev: pointer to pci_dev data structure of error source device
 * @info: comprehensive error information
 *
 * Invoked when an error being detected by Root Port.
 */
static void handle_error_source(struct pcie_device *aerdev,
	struct pci_dev *dev,
	struct aer_err_info *info)
{
	int pos;

	if (info->severity == AER_CORRECTABLE) {
		/*
		 * Correctable error does not need software intervention.
		 * No need to go through error recovery process.
		 */
		pos = dev->aer_cap;
		if (pos)
			pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS,
					info->status);
	} else
		do_recovery(dev, info->severity);
}
Example #4
0
void check_recovery_mode(void)
{
    if (recovery_mode_flag) {
        do_recovery(NULL, 0, 0, NULL);
    }
}