diff options
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r-- | drivers/net/tg3.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 5fccbe459949..ed57a62b3ac8 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -12589,15 +12589,26 @@ static void __devinit tg3_read_partno(struct tg3 *tp) | |||
12589 | unsigned char val = vpd_data[i]; | 12589 | unsigned char val = vpd_data[i]; |
12590 | unsigned int block_end; | 12590 | unsigned int block_end; |
12591 | 12591 | ||
12592 | if (val == 0x82 || val == 0x91) { | 12592 | if (val & PCI_VPD_LRDT) { |
12593 | i += PCI_VPD_LRDT_TAG_SIZE + | 12593 | if (i + PCI_VPD_LRDT_TAG_SIZE > TG3_NVM_VPD_LEN) |
12594 | pci_vpd_lrdt_size(&vpd_data[i]); | 12594 | break; |
12595 | |||
12596 | if (val != PCI_VPD_LRDT_RO_DATA) { | ||
12597 | i += PCI_VPD_LRDT_TAG_SIZE + | ||
12598 | pci_vpd_lrdt_size(&vpd_data[i]); | ||
12599 | |||
12600 | continue; | ||
12601 | } | ||
12602 | } else { | ||
12603 | if ((val & PCI_VPD_SRDT_TIN_MASK) == PCI_VPD_STIN_END) | ||
12604 | break; | ||
12605 | |||
12606 | i += PCI_VPD_SRDT_TAG_SIZE + | ||
12607 | pci_vpd_srdt_size(&vpd_data[i]); | ||
12608 | |||
12595 | continue; | 12609 | continue; |
12596 | } | 12610 | } |
12597 | 12611 | ||
12598 | if (val != 0x90) | ||
12599 | goto out_not_found; | ||
12600 | |||
12601 | block_end = i + PCI_VPD_LRDT_TAG_SIZE + | 12612 | block_end = i + PCI_VPD_LRDT_TAG_SIZE + |
12602 | pci_vpd_lrdt_size(&vpd_data[i]); | 12613 | pci_vpd_lrdt_size(&vpd_data[i]); |
12603 | 12614 | ||