Commit e51cd9ce authored by Keith Busch's avatar Keith Busch Committed by Bjorn Helgaas
Browse files

PCI/AER: Refactor error injection fallbacks



Move the bus ops fallback into separate functions.  No functional change
here.

Signed-off-by: default avatarKeith Busch <keith.busch@intel.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 390e2db8
Loading
Loading
Loading
Loading
+38 −28
Original line number Original line Diff line number Diff line
@@ -176,14 +176,48 @@ static u32 *find_pci_config_dword(struct aer_error *err, int where,
	return target;
	return target;
}
}


static int aer_inj_read(struct pci_bus *bus, unsigned int devfn, int where,
			int size, u32 *val)
{
	struct pci_ops *ops, *my_ops;
	int rv;

	ops = __find_pci_bus_ops(bus);
	if (!ops)
		return -1;

	my_ops = bus->ops;
	bus->ops = ops;
	rv = ops->read(bus, devfn, where, size, val);
	bus->ops = my_ops;

	return rv;
}

static int aer_inj_write(struct pci_bus *bus, unsigned int devfn, int where,
			 int size, u32 val)
{
	struct pci_ops *ops, *my_ops;
	int rv;

	ops = __find_pci_bus_ops(bus);
	if (!ops)
		return -1;

	my_ops = bus->ops;
	bus->ops = ops;
	rv = ops->write(bus, devfn, where, size, val);
	bus->ops = my_ops;

	return rv;
}

static int aer_inj_read_config(struct pci_bus *bus, unsigned int devfn,
static int aer_inj_read_config(struct pci_bus *bus, unsigned int devfn,
			       int where, int size, u32 *val)
			       int where, int size, u32 *val)
{
{
	u32 *sim;
	u32 *sim;
	struct aer_error *err;
	struct aer_error *err;
	unsigned long flags;
	unsigned long flags;
	struct pci_ops *ops;
	struct pci_ops *my_ops;
	int domain;
	int domain;
	int rv;
	int rv;


@@ -204,18 +238,7 @@ static int aer_inj_read_config(struct pci_bus *bus, unsigned int devfn,
		return 0;
		return 0;
	}
	}
out:
out:
	ops = __find_pci_bus_ops(bus);
	rv = aer_inj_read(bus, devfn, where, size, val);
	/*
	 * pci_lock must already be held, so we can directly
	 * manipulate bus->ops.  Many config access functions,
	 * including pci_generic_config_read() require the original
	 * bus->ops be installed to function, so temporarily put them
	 * back.
	 */
	my_ops = bus->ops;
	bus->ops = ops;
	rv = ops->read(bus, devfn, where, size, val);
	bus->ops = my_ops;
	spin_unlock_irqrestore(&inject_lock, flags);
	spin_unlock_irqrestore(&inject_lock, flags);
	return rv;
	return rv;
}
}
@@ -227,8 +250,6 @@ static int aer_inj_write_config(struct pci_bus *bus, unsigned int devfn,
	struct aer_error *err;
	struct aer_error *err;
	unsigned long flags;
	unsigned long flags;
	int rw1cs;
	int rw1cs;
	struct pci_ops *ops;
	struct pci_ops *my_ops;
	int domain;
	int domain;
	int rv;
	int rv;


@@ -252,18 +273,7 @@ static int aer_inj_write_config(struct pci_bus *bus, unsigned int devfn,
		return 0;
		return 0;
	}
	}
out:
out:
	ops = __find_pci_bus_ops(bus);
	rv = aer_inj_write(bus, devfn, where, size, val);
	/*
	 * pci_lock must already be held, so we can directly
	 * manipulate bus->ops.  Many config access functions,
	 * including pci_generic_config_write() require the original
	 * bus->ops be installed to function, so temporarily put them
	 * back.
	 */
	my_ops = bus->ops;
	bus->ops = ops;
	rv = ops->write(bus, devfn, where, size, val);
	bus->ops = my_ops;
	spin_unlock_irqrestore(&inject_lock, flags);
	spin_unlock_irqrestore(&inject_lock, flags);
	return rv;
	return rv;
}
}