Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 408641e9 authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

PCI: Fold struct pci_vpd_pci22 into struct pci_vpd



We only support one flavor of VPD, so there's no need to complicate things
by having a "generic" struct pci_vpd and a more specific struct
pci_vpd_pci22.

Fold struct pci_vpd_pci22 directly into struct pci_vpd.

[bhelgaas: remove NULL check before kfree of dev->vpd (per kfreeaddr.cocci)]
Tested-by: default avatarShane Seymour <shane.seymour@hpe.com>
Tested-by: default avatarBabu Moger <babu.moger@oracle.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
parent f1cd93f9
Loading
Loading
Loading
Loading
+17 −30
Original line number Diff line number Diff line
@@ -277,15 +277,6 @@ EXPORT_SYMBOL(pci_write_vpd);

#define PCI_VPD_MAX_SIZE (PCI_VPD_ADDR_MASK + 1)

struct pci_vpd_pci22 {
	struct pci_vpd base;
	struct mutex lock;
	u16	flag;
	u8	cap;
	u8	busy:1;
	u8	valid:1;
};

/**
 * pci_vpd_size - determine actual size of Vital Product Data
 * @dev:	pci device struct
@@ -350,8 +341,7 @@ static size_t pci_vpd_size(struct pci_dev *dev, size_t old_size)
 */
static int pci_vpd_wait(struct pci_dev *dev)
{
	struct pci_vpd_pci22 *vpd =
		container_of(dev->vpd, struct pci_vpd_pci22, base);
	struct pci_vpd *vpd = dev->vpd;
	unsigned long timeout = jiffies + HZ/20 + 2;
	u16 status;
	int ret;
@@ -384,8 +374,7 @@ static int pci_vpd_wait(struct pci_dev *dev)
static ssize_t pci_vpd_read(struct pci_dev *dev, loff_t pos, size_t count,
			    void *arg)
{
	struct pci_vpd_pci22 *vpd =
		container_of(dev->vpd, struct pci_vpd_pci22, base);
	struct pci_vpd *vpd = dev->vpd;
	int ret;
	loff_t end = pos + count;
	u8 *buf = arg;
@@ -395,17 +384,17 @@ static ssize_t pci_vpd_read(struct pci_dev *dev, loff_t pos, size_t count,

	if (!vpd->valid) {
		vpd->valid = 1;
		vpd->base.len = pci_vpd_size(dev, vpd->base.len);
		vpd->len = pci_vpd_size(dev, vpd->len);
	}

	if (vpd->base.len == 0)
	if (vpd->len == 0)
		return -EIO;

	if (pos >= vpd->base.len)
	if (pos > vpd->len)
		return 0;

	if (end > vpd->base.len) {
		end = vpd->base.len;
	if (end > vpd->len) {
		end = vpd->len;
		count = end - pos;
	}

@@ -452,8 +441,7 @@ static ssize_t pci_vpd_read(struct pci_dev *dev, loff_t pos, size_t count,
static ssize_t pci_vpd_write(struct pci_dev *dev, loff_t pos, size_t count,
			     const void *arg)
{
	struct pci_vpd_pci22 *vpd =
		container_of(dev->vpd, struct pci_vpd_pci22, base);
	struct pci_vpd *vpd = dev->vpd;
	const u8 *buf = arg;
	loff_t end = pos + count;
	int ret = 0;
@@ -463,13 +451,13 @@ static ssize_t pci_vpd_write(struct pci_dev *dev, loff_t pos, size_t count,

	if (!vpd->valid) {
		vpd->valid = 1;
		vpd->base.len = pci_vpd_size(dev, vpd->base.len);
		vpd->len = pci_vpd_size(dev, vpd->len);
	}

	if (vpd->base.len == 0)
	if (vpd->len == 0)
		return -EIO;

	if (end > vpd->base.len)
	if (end > vpd->len)
		return -EINVAL;

	if (mutex_lock_killable(&vpd->lock))
@@ -550,7 +538,7 @@ static const struct pci_vpd_ops pci_vpd_f0_ops = {

int pci_vpd_init(struct pci_dev *dev)
{
	struct pci_vpd_pci22 *vpd;
	struct pci_vpd *vpd;
	u8 cap;

	cap = pci_find_capability(dev, PCI_CAP_ID_VPD);
@@ -561,23 +549,22 @@ int pci_vpd_init(struct pci_dev *dev)
	if (!vpd)
		return -ENOMEM;

	vpd->base.len = PCI_VPD_MAX_SIZE;
	vpd->len = PCI_VPD_MAX_SIZE;
	if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0)
		vpd->base.ops = &pci_vpd_f0_ops;
		vpd->ops = &pci_vpd_f0_ops;
	else
		vpd->base.ops = &pci_vpd_ops;
		vpd->ops = &pci_vpd_ops;
	mutex_init(&vpd->lock);
	vpd->cap = cap;
	vpd->busy = 0;
	vpd->valid = 0;
	dev->vpd = &vpd->base;
	dev->vpd = vpd;
	return 0;
}

void pci_vpd_release(struct pci_dev *dev)
{
	if (dev->vpd)
		kfree(container_of(dev->vpd, struct pci_vpd_pci22, base));
	kfree(dev->vpd);
}

/**
+6 −1
Original line number Diff line number Diff line
@@ -100,9 +100,14 @@ struct pci_vpd_ops {
};

struct pci_vpd {
	unsigned int len;
	const struct pci_vpd_ops *ops;
	struct bin_attribute *attr; /* descriptor for sysfs VPD entry */
	struct mutex	lock;
	unsigned int	len;
	u16		flag;
	u8		cap;
	u8		busy:1;
	u8		valid:1;
};

int pci_vpd_init(struct pci_dev *dev);