Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'pci/vpd'

- Add pci_read_vpd_any(), pci_write_vpd_any() to access VPD at arbitrary
offsets (Heiner Kallweit)

- Use VPD API to replace custom code in cxgb3 driver (Heiner Kallweit)

* pci/vpd:
cxgb3: Remove seeprom_write and use VPD API
cxgb3: Use VPD API in t3_seeprom_wp()
cxgb3: Remove t3_seeprom_read and use VPD API
PCI/VPD: Use pci_read_vpd_any() in pci_vpd_size()
PCI/VPD: Add pci_read/write_vpd_any()

+92 -141
-2
drivers/net/ethernet/chelsio/cxgb3/common.h
··· 676 676 void t3_link_fault(struct adapter *adapter, int port_id); 677 677 int t3_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc); 678 678 const struct adapter_info *t3_get_adapter_info(unsigned int board_id); 679 - int t3_seeprom_read(struct adapter *adapter, u32 addr, __le32 *data); 680 - int t3_seeprom_write(struct adapter *adapter, u32 addr, __le32 data); 681 679 int t3_seeprom_wp(struct adapter *adapter, int enable); 682 680 int t3_get_tp_version(struct adapter *adapter, u32 *vers); 683 681 int t3_check_tpsram_version(struct adapter *adapter);
+13 -25
drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
··· 2036 2036 { 2037 2037 struct port_info *pi = netdev_priv(dev); 2038 2038 struct adapter *adapter = pi->adapter; 2039 - int i, err = 0; 2040 - 2041 - u8 *buf = kmalloc(EEPROMSIZE, GFP_KERNEL); 2042 - if (!buf) 2043 - return -ENOMEM; 2039 + int cnt; 2044 2040 2045 2041 e->magic = EEPROM_MAGIC; 2046 - for (i = e->offset & ~3; !err && i < e->offset + e->len; i += 4) 2047 - err = t3_seeprom_read(adapter, i, (__le32 *) & buf[i]); 2042 + cnt = pci_read_vpd(adapter->pdev, e->offset, e->len, data); 2043 + if (cnt < 0) 2044 + return cnt; 2048 2045 2049 - if (!err) 2050 - memcpy(data, buf + e->offset, e->len); 2051 - kfree(buf); 2052 - return err; 2046 + e->len = cnt; 2047 + 2048 + return 0; 2053 2049 } 2054 2050 2055 2051 static int set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, ··· 2054 2058 struct port_info *pi = netdev_priv(dev); 2055 2059 struct adapter *adapter = pi->adapter; 2056 2060 u32 aligned_offset, aligned_len; 2057 - __le32 *p; 2058 2061 u8 *buf; 2059 2062 int err; 2060 2063 ··· 2067 2072 buf = kmalloc(aligned_len, GFP_KERNEL); 2068 2073 if (!buf) 2069 2074 return -ENOMEM; 2070 - err = t3_seeprom_read(adapter, aligned_offset, (__le32 *) buf); 2071 - if (!err && aligned_len > 4) 2072 - err = t3_seeprom_read(adapter, 2073 - aligned_offset + aligned_len - 4, 2074 - (__le32 *) & buf[aligned_len - 4]); 2075 - if (err) 2075 + err = pci_read_vpd(adapter->pdev, aligned_offset, aligned_len, 2076 + buf); 2077 + if (err < 0) 2076 2078 goto out; 2077 2079 memcpy(buf + (eeprom->offset & 3), data, eeprom->len); 2078 2080 } else ··· 2079 2087 if (err) 2080 2088 goto out; 2081 2089 2082 - for (p = (__le32 *) buf; !err && aligned_len; aligned_len -= 4, p++) { 2083 - err = t3_seeprom_write(adapter, aligned_offset, *p); 2084 - aligned_offset += 4; 2085 - } 2086 - 2087 - if (!err) 2090 + err = pci_write_vpd(adapter->pdev, aligned_offset, aligned_len, buf); 2091 + if (err >= 0) 2088 2092 err = t3_seeprom_wp(adapter, 1); 2089 2093 out: 2090 2094 if (buf != data) 2091 2095 kfree(buf); 2092 - return err; 2096 + return err < 0 ? err : 0; 2093 2097 } 2094 2098 2095 2099 static void get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+16 -82
drivers/net/ethernet/chelsio/cxgb3/t3_hw.c
··· 595 595 u32 pad; /* for multiple-of-4 sizing and alignment */ 596 596 }; 597 597 598 - #define EEPROM_MAX_POLL 40 599 598 #define EEPROM_STAT_ADDR 0x4000 600 599 #define VPD_BASE 0xc00 601 - 602 - /** 603 - * t3_seeprom_read - read a VPD EEPROM location 604 - * @adapter: adapter to read 605 - * @addr: EEPROM address 606 - * @data: where to store the read data 607 - * 608 - * Read a 32-bit word from a location in VPD EEPROM using the card's PCI 609 - * VPD ROM capability. A zero is written to the flag bit when the 610 - * address is written to the control register. The hardware device will 611 - * set the flag to 1 when 4 bytes have been read into the data register. 612 - */ 613 - int t3_seeprom_read(struct adapter *adapter, u32 addr, __le32 *data) 614 - { 615 - u16 val; 616 - int attempts = EEPROM_MAX_POLL; 617 - u32 v; 618 - unsigned int base = adapter->params.pci.vpd_cap_addr; 619 - 620 - if ((addr >= EEPROMSIZE && addr != EEPROM_STAT_ADDR) || (addr & 3)) 621 - return -EINVAL; 622 - 623 - pci_write_config_word(adapter->pdev, base + PCI_VPD_ADDR, addr); 624 - do { 625 - udelay(10); 626 - pci_read_config_word(adapter->pdev, base + PCI_VPD_ADDR, &val); 627 - } while (!(val & PCI_VPD_ADDR_F) && --attempts); 628 - 629 - if (!(val & PCI_VPD_ADDR_F)) { 630 - CH_ERR(adapter, "reading EEPROM address 0x%x failed\n", addr); 631 - return -EIO; 632 - } 633 - pci_read_config_dword(adapter->pdev, base + PCI_VPD_DATA, &v); 634 - *data = cpu_to_le32(v); 635 - return 0; 636 - } 637 - 638 - /** 639 - * t3_seeprom_write - write a VPD EEPROM location 640 - * @adapter: adapter to write 641 - * @addr: EEPROM address 642 - * @data: value to write 643 - * 644 - * Write a 32-bit word to a location in VPD EEPROM using the card's PCI 645 - * VPD ROM capability. 646 - */ 647 - int t3_seeprom_write(struct adapter *adapter, u32 addr, __le32 data) 648 - { 649 - u16 val; 650 - int attempts = EEPROM_MAX_POLL; 651 - unsigned int base = adapter->params.pci.vpd_cap_addr; 652 - 653 - if ((addr >= EEPROMSIZE && addr != EEPROM_STAT_ADDR) || (addr & 3)) 654 - return -EINVAL; 655 - 656 - pci_write_config_dword(adapter->pdev, base + PCI_VPD_DATA, 657 - le32_to_cpu(data)); 658 - pci_write_config_word(adapter->pdev,base + PCI_VPD_ADDR, 659 - addr | PCI_VPD_ADDR_F); 660 - do { 661 - msleep(1); 662 - pci_read_config_word(adapter->pdev, base + PCI_VPD_ADDR, &val); 663 - } while ((val & PCI_VPD_ADDR_F) && --attempts); 664 - 665 - if (val & PCI_VPD_ADDR_F) { 666 - CH_ERR(adapter, "write to EEPROM address 0x%x failed\n", addr); 667 - return -EIO; 668 - } 669 - return 0; 670 - } 671 600 672 601 /** 673 602 * t3_seeprom_wp - enable/disable EEPROM write protection ··· 607 678 */ 608 679 int t3_seeprom_wp(struct adapter *adapter, int enable) 609 680 { 610 - return t3_seeprom_write(adapter, EEPROM_STAT_ADDR, enable ? 0xc : 0); 681 + u32 data = enable ? 0xc : 0; 682 + int ret; 683 + 684 + /* EEPROM_STAT_ADDR is outside VPD area, use pci_write_vpd_any() */ 685 + ret = pci_write_vpd_any(adapter->pdev, EEPROM_STAT_ADDR, sizeof(u32), 686 + &data); 687 + 688 + return ret < 0 ? ret : 0; 611 689 } 612 690 613 691 static int vpdstrtouint(char *s, u8 len, unsigned int base, unsigned int *val) ··· 644 708 */ 645 709 static int get_vpd_params(struct adapter *adapter, struct vpd_params *p) 646 710 { 647 - int i, addr, ret; 648 711 struct t3_vpd vpd; 712 + u8 base_val = 0; 713 + int addr, ret; 649 714 650 715 /* 651 716 * Card information is normally at VPD_BASE but some early cards had 652 717 * it at 0. 653 718 */ 654 - ret = t3_seeprom_read(adapter, VPD_BASE, (__le32 *)&vpd); 655 - if (ret) 719 + ret = pci_read_vpd(adapter->pdev, VPD_BASE, 1, &base_val); 720 + if (ret < 0) 656 721 return ret; 657 - addr = vpd.id_tag == 0x82 ? VPD_BASE : 0; 722 + addr = base_val == PCI_VPD_LRDT_ID_STRING ? VPD_BASE : 0; 658 723 659 - for (i = 0; i < sizeof(vpd); i += 4) { 660 - ret = t3_seeprom_read(adapter, addr + i, 661 - (__le32 *)((u8 *)&vpd + i)); 662 - if (ret) 663 - return ret; 664 - } 724 + ret = pci_read_vpd(adapter->pdev, addr, sizeof(vpd), &vpd); 725 + if (ret < 0) 726 + return ret; 665 727 666 728 ret = vpdstrtouint(vpd.cclk_data, vpd.cclk_len, 10, &p->cclk); 667 729 if (ret)
+61 -32
drivers/pci/vpd.c
··· 57 57 size_t off = 0, size; 58 58 unsigned char tag, header[1+2]; /* 1 byte tag, 2 bytes length */ 59 59 60 - /* Otherwise the following reads would fail. */ 61 - dev->vpd.len = PCI_VPD_MAX_SIZE; 62 - 63 - while (pci_read_vpd(dev, off, 1, header) == 1) { 60 + while (pci_read_vpd_any(dev, off, 1, header) == 1) { 64 61 size = 0; 65 62 66 63 if (off == 0 && (header[0] == 0x00 || header[0] == 0xff)) ··· 65 68 66 69 if (header[0] & PCI_VPD_LRDT) { 67 70 /* Large Resource Data Type Tag */ 68 - if (pci_read_vpd(dev, off + 1, 2, &header[1]) != 2) { 71 + if (pci_read_vpd_any(dev, off + 1, 2, &header[1]) != 2) { 69 72 pci_warn(dev, "failed VPD read at offset %zu\n", 70 73 off + 1); 71 74 return off ?: PCI_VPD_SZ_INVALID; ··· 96 99 return off ?: PCI_VPD_SZ_INVALID; 97 100 } 98 101 99 - static bool pci_vpd_available(struct pci_dev *dev) 102 + static bool pci_vpd_available(struct pci_dev *dev, bool check_size) 100 103 { 101 104 struct pci_vpd *vpd = &dev->vpd; 102 105 103 106 if (!vpd->cap) 104 107 return false; 105 108 106 - if (vpd->len == 0) { 109 + if (vpd->len == 0 && check_size) { 107 110 vpd->len = pci_vpd_size(dev); 108 111 if (vpd->len == PCI_VPD_SZ_INVALID) { 109 112 vpd->cap = 0; ··· 153 156 } 154 157 155 158 static ssize_t pci_vpd_read(struct pci_dev *dev, loff_t pos, size_t count, 156 - void *arg) 159 + void *arg, bool check_size) 157 160 { 158 161 struct pci_vpd *vpd = &dev->vpd; 162 + unsigned int max_len; 159 163 int ret = 0; 160 164 loff_t end = pos + count; 161 165 u8 *buf = arg; 162 166 163 - if (!pci_vpd_available(dev)) 167 + if (!pci_vpd_available(dev, check_size)) 164 168 return -ENODEV; 165 169 166 170 if (pos < 0) 167 171 return -EINVAL; 168 172 169 - if (pos > vpd->len) 173 + max_len = check_size ? vpd->len : PCI_VPD_MAX_SIZE; 174 + 175 + if (pos >= max_len) 170 176 return 0; 171 177 172 - if (end > vpd->len) { 173 - end = vpd->len; 178 + if (end > max_len) { 179 + end = max_len; 174 180 count = end - pos; 175 181 } 176 182 ··· 217 217 } 218 218 219 219 static ssize_t pci_vpd_write(struct pci_dev *dev, loff_t pos, size_t count, 220 - const void *arg) 220 + const void *arg, bool check_size) 221 221 { 222 222 struct pci_vpd *vpd = &dev->vpd; 223 + unsigned int max_len; 223 224 const u8 *buf = arg; 224 225 loff_t end = pos + count; 225 226 int ret = 0; 226 227 227 - if (!pci_vpd_available(dev)) 228 + if (!pci_vpd_available(dev, check_size)) 228 229 return -ENODEV; 229 230 230 231 if (pos < 0 || (pos & 3) || (count & 3)) 231 232 return -EINVAL; 232 233 233 - if (end > vpd->len) 234 + max_len = check_size ? vpd->len : PCI_VPD_MAX_SIZE; 235 + 236 + if (end > max_len) 234 237 return -EINVAL; 235 238 236 239 if (mutex_lock_killable(&vpd->lock)) ··· 316 313 void *buf; 317 314 int cnt; 318 315 319 - if (!pci_vpd_available(dev)) 316 + if (!pci_vpd_available(dev, true)) 320 317 return ERR_PTR(-ENODEV); 321 318 322 319 len = dev->vpd.len; ··· 384 381 return -ENOENT; 385 382 } 386 383 384 + static ssize_t __pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf, 385 + bool check_size) 386 + { 387 + ssize_t ret; 388 + 389 + if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0) { 390 + dev = pci_get_func0_dev(dev); 391 + if (!dev) 392 + return -ENODEV; 393 + 394 + ret = pci_vpd_read(dev, pos, count, buf, check_size); 395 + pci_dev_put(dev); 396 + return ret; 397 + } 398 + 399 + return pci_vpd_read(dev, pos, count, buf, check_size); 400 + } 401 + 387 402 /** 388 403 * pci_read_vpd - Read one entry from Vital Product Data 389 404 * @dev: PCI device struct ··· 411 390 */ 412 391 ssize_t pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf) 413 392 { 393 + return __pci_read_vpd(dev, pos, count, buf, true); 394 + } 395 + EXPORT_SYMBOL(pci_read_vpd); 396 + 397 + /* Same, but allow to access any address */ 398 + ssize_t pci_read_vpd_any(struct pci_dev *dev, loff_t pos, size_t count, void *buf) 399 + { 400 + return __pci_read_vpd(dev, pos, count, buf, false); 401 + } 402 + EXPORT_SYMBOL(pci_read_vpd_any); 403 + 404 + static ssize_t __pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, 405 + const void *buf, bool check_size) 406 + { 414 407 ssize_t ret; 415 408 416 409 if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0) { ··· 432 397 if (!dev) 433 398 return -ENODEV; 434 399 435 - ret = pci_vpd_read(dev, pos, count, buf); 400 + ret = pci_vpd_write(dev, pos, count, buf, check_size); 436 401 pci_dev_put(dev); 437 402 return ret; 438 403 } 439 404 440 - return pci_vpd_read(dev, pos, count, buf); 405 + return pci_vpd_write(dev, pos, count, buf, check_size); 441 406 } 442 - EXPORT_SYMBOL(pci_read_vpd); 443 407 444 408 /** 445 409 * pci_write_vpd - Write entry to Vital Product Data ··· 449 415 */ 450 416 ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void *buf) 451 417 { 452 - ssize_t ret; 453 - 454 - if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0) { 455 - dev = pci_get_func0_dev(dev); 456 - if (!dev) 457 - return -ENODEV; 458 - 459 - ret = pci_vpd_write(dev, pos, count, buf); 460 - pci_dev_put(dev); 461 - return ret; 462 - } 463 - 464 - return pci_vpd_write(dev, pos, count, buf); 418 + return __pci_write_vpd(dev, pos, count, buf, true); 465 419 } 466 420 EXPORT_SYMBOL(pci_write_vpd); 421 + 422 + /* Same, but allow to access any address */ 423 + ssize_t pci_write_vpd_any(struct pci_dev *dev, loff_t pos, size_t count, const void *buf) 424 + { 425 + return __pci_write_vpd(dev, pos, count, buf, false); 426 + } 427 + EXPORT_SYMBOL(pci_write_vpd_any); 467 428 468 429 int pci_vpd_find_ro_info_keyword(const void *buf, unsigned int len, 469 430 const char *kw, unsigned int *size)
+2
include/linux/pci.h
··· 1352 1352 /* Vital Product Data routines */ 1353 1353 ssize_t pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf); 1354 1354 ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void *buf); 1355 + ssize_t pci_read_vpd_any(struct pci_dev *dev, loff_t pos, size_t count, void *buf); 1356 + ssize_t pci_write_vpd_any(struct pci_dev *dev, loff_t pos, size_t count, const void *buf); 1355 1357 1356 1358 /* Helper functions for low-level code (drivers/pci/setup-[bus,res].c) */ 1357 1359 resource_size_t pcibios_retrieve_fw_addr(struct pci_dev *dev, int idx);