With this patch we avoid some unnecessary looping and make the code better readable. Signed-off-by: Heiner Kallweit <hkallweit1@xxxxxxxxx> --- drivers/pci/vpd.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/pci/vpd.c b/drivers/pci/vpd.c index 741e7a505..0752505d7 100644 --- a/drivers/pci/vpd.c +++ b/drivers/pci/vpd.c @@ -163,12 +163,11 @@ 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) + void *buf) { struct pci_vpd *vpd = dev->vpd; int ret; loff_t end = pos + count; - u8 *buf = arg; if (pos < 0) return -EINVAL; @@ -197,8 +196,8 @@ static ssize_t pci_vpd_read(struct pci_dev *dev, loff_t pos, size_t count, goto out; while (pos < end) { + unsigned int len, skip; u32 val; - unsigned int i, skip; ret = pci_user_write_config_word(dev, vpd->cap + PCI_VPD_ADDR, pos & ~3); @@ -215,14 +214,19 @@ static ssize_t pci_vpd_read(struct pci_dev *dev, loff_t pos, size_t count, break; skip = pos & 3; - for (i = 0; i < sizeof(u32); i++) { - if (i >= skip) { - *buf++ = val; - if (++pos == end) - break; - } - val >>= 8; + len = min_t(unsigned int, 4 - skip, end - pos); + + if (len == 4) { + put_unaligned_le32(val, buf); + } else { + u8 tmpbuf[4]; + + put_unaligned_le32(val, tmpbuf); + memcpy(buf, tmpbuf + skip, len); } + + buf += len; + pos += len; } out: mutex_unlock(&vpd->lock); -- 2.31.1