|
@@ -12455,31 +12455,20 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
|
|
|
memcpy(&vpd_data[i], &tmp, sizeof(tmp));
|
|
|
}
|
|
|
} else {
|
|
|
- int vpd_cap;
|
|
|
-
|
|
|
- vpd_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_VPD);
|
|
|
- for (i = 0; i < TG3_NVM_VPD_LEN; i += 4) {
|
|
|
- u32 tmp, j = 0;
|
|
|
- __le32 v;
|
|
|
- u16 tmp16;
|
|
|
-
|
|
|
- pci_write_config_word(tp->pdev, vpd_cap + PCI_VPD_ADDR,
|
|
|
- i);
|
|
|
- while (j++ < 100) {
|
|
|
- pci_read_config_word(tp->pdev, vpd_cap +
|
|
|
- PCI_VPD_ADDR, &tmp16);
|
|
|
- if (tmp16 & 0x8000)
|
|
|
- break;
|
|
|
- msleep(1);
|
|
|
- }
|
|
|
- if (!(tmp16 & 0x8000))
|
|
|
+ ssize_t cnt;
|
|
|
+ unsigned int pos = 0, i = 0;
|
|
|
+
|
|
|
+ for (; pos < TG3_NVM_VPD_LEN && i < 3; i++, pos += cnt) {
|
|
|
+ cnt = pci_read_vpd(tp->pdev, pos,
|
|
|
+ TG3_NVM_VPD_LEN - pos,
|
|
|
+ &vpd_data[pos]);
|
|
|
+ if (cnt == -ETIMEDOUT || -EINTR)
|
|
|
+ cnt = 0;
|
|
|
+ else if (cnt < 0)
|
|
|
goto out_not_found;
|
|
|
-
|
|
|
- pci_read_config_dword(tp->pdev, vpd_cap + PCI_VPD_DATA,
|
|
|
- &tmp);
|
|
|
- v = cpu_to_le32(tmp);
|
|
|
- memcpy(&vpd_data[i], &v, sizeof(v));
|
|
|
}
|
|
|
+ if (pos != TG3_NVM_VPD_LEN)
|
|
|
+ goto out_not_found;
|
|
|
}
|
|
|
|
|
|
/* Now parse and find the part number. */
|