Commit 4e59b754 authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

cxl: Factor out common dev->driver expressions



Save the struct pci_driver and struct pci_error_handlers pointers from
pdev->driver instead of chasing the pointers several times.  No functional
change intended.

Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 43e85554
Loading
Loading
Loading
Loading
+17 −13
Original line number Diff line number Diff line
@@ -20,33 +20,37 @@ static void pci_error_handlers(struct cxl_afu *afu,
				pci_channel_state_t state)
{
	struct pci_dev *afu_dev;
	struct pci_driver *afu_drv;
	const struct pci_error_handlers *err_handler;

	if (afu->phb == NULL)
		return;

	list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) {
		if (!afu_dev->driver)
		afu_drv = afu_dev->driver;
		if (!afu_drv)
			continue;

		err_handler = afu_drv->err_handler;
		switch (bus_error_event) {
		case CXL_ERROR_DETECTED_EVENT:
			afu_dev->error_state = state;

			if (afu_dev->driver->err_handler &&
			    afu_dev->driver->err_handler->error_detected)
				afu_dev->driver->err_handler->error_detected(afu_dev, state);
			if (err_handler &&
			    err_handler->error_detected)
				err_handler->error_detected(afu_dev, state);
			break;
		case CXL_SLOT_RESET_EVENT:
			afu_dev->error_state = state;

			if (afu_dev->driver->err_handler &&
			    afu_dev->driver->err_handler->slot_reset)
				afu_dev->driver->err_handler->slot_reset(afu_dev);
			if (err_handler &&
			    err_handler->slot_reset)
				err_handler->slot_reset(afu_dev);
			break;
		case CXL_RESUME_EVENT:
			if (afu_dev->driver->err_handler &&
			    afu_dev->driver->err_handler->resume)
				afu_dev->driver->err_handler->resume(afu_dev);
			if (err_handler &&
			    err_handler->resume)
				err_handler->resume(afu_dev);
			break;
		}
	}
+24 −11
Original line number Diff line number Diff line
@@ -1795,6 +1795,8 @@ static pci_ers_result_t cxl_vphb_error_detected(struct cxl_afu *afu,
						pci_channel_state_t state)
{
	struct pci_dev *afu_dev;
	struct pci_driver *afu_drv;
	const struct pci_error_handlers *err_handler;
	pci_ers_result_t result = PCI_ERS_RESULT_NEED_RESET;
	pci_ers_result_t afu_result = PCI_ERS_RESULT_NEED_RESET;

@@ -1805,13 +1807,15 @@ static pci_ers_result_t cxl_vphb_error_detected(struct cxl_afu *afu,
		return result;

	list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) {
		if (!afu_dev->driver)
		afu_drv = afu_dev->driver;
		if (!afu_drv)
			continue;

		afu_dev->error_state = state;

		if (afu_dev->driver->err_handler)
			afu_result = afu_dev->driver->err_handler->error_detected(afu_dev,
		err_handler = afu_drv->err_handler;
		if (err_handler)
			afu_result = err_handler->error_detected(afu_dev,
								 state);
		/* Disconnect trumps all, NONE trumps NEED_RESET */
		if (afu_result == PCI_ERS_RESULT_DISCONNECT)
@@ -1972,6 +1976,8 @@ static pci_ers_result_t cxl_pci_slot_reset(struct pci_dev *pdev)
	struct cxl_afu *afu;
	struct cxl_context *ctx;
	struct pci_dev *afu_dev;
	struct pci_driver *afu_drv;
	const struct pci_error_handlers *err_handler;
	pci_ers_result_t afu_result = PCI_ERS_RESULT_RECOVERED;
	pci_ers_result_t result = PCI_ERS_RESULT_RECOVERED;
	int i;
@@ -2028,12 +2034,13 @@ static pci_ers_result_t cxl_pci_slot_reset(struct pci_dev *pdev)
			 * shouldn't start new work until we call
			 * their resume function.
			 */
			if (!afu_dev->driver)
			afu_drv = afu_dev->driver;
			if (!afu_drv)
				continue;

			if (afu_dev->driver->err_handler &&
			    afu_dev->driver->err_handler->slot_reset)
				afu_result = afu_dev->driver->err_handler->slot_reset(afu_dev);
			err_handler = afu_drv->err_handler;
			if (err_handler && err_handler->slot_reset)
				afu_result = err_handler->slot_reset(afu_dev);

			if (afu_result == PCI_ERS_RESULT_DISCONNECT)
				result = PCI_ERS_RESULT_DISCONNECT;
@@ -2060,6 +2067,8 @@ static void cxl_pci_resume(struct pci_dev *pdev)
	struct cxl *adapter = pci_get_drvdata(pdev);
	struct cxl_afu *afu;
	struct pci_dev *afu_dev;
	struct pci_driver *afu_drv;
	const struct pci_error_handlers *err_handler;
	int i;

	/* Everything is back now. Drivers should restart work now.
@@ -2074,9 +2083,13 @@ static void cxl_pci_resume(struct pci_dev *pdev)
			continue;

		list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) {
			if (afu_dev->driver && afu_dev->driver->err_handler &&
			    afu_dev->driver->err_handler->resume)
				afu_dev->driver->err_handler->resume(afu_dev);
			afu_drv = afu_dev->driver;
			if (!afu_drv)
				continue;

			err_handler = afu_drv->err_handler;
			if (err_handler && err_handler->resume)
				err_handler->resume(afu_dev);
		}
	}
	spin_unlock(&adapter->afu_list_lock);