Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 184556
b: refs/heads/master
c: 7ad506f
h: refs/heads/master
v: v3
  • Loading branch information
Matt Carlson authored and David S. Miller committed Feb 28, 2010
1 parent cfa728f commit 9d993a3
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a2ce766238f72ff7337606c0bc96803c30c9e05c
refs/heads/master: 7ad506fa1adc2da3d394c562f09b8e1b3026c402
23 changes: 17 additions & 6 deletions trunk/drivers/net/bnx2.c
Original file line number Diff line number Diff line change
Expand Up @@ -7772,15 +7772,26 @@ bnx2_read_vpd_fw_ver(struct bnx2 *bp)
unsigned char val = data[i];
unsigned int block_end;

if (val == 0x82 || val == 0x91) {
i += PCI_VPD_LRDT_TAG_SIZE +
pci_vpd_lrdt_size(&data[i]);
if (val & PCI_VPD_LRDT) {
if (i + PCI_VPD_LRDT_TAG_SIZE > BNX2_VPD_LEN)
break;

if (val != PCI_VPD_LRDT_RO_DATA) {
i += PCI_VPD_LRDT_TAG_SIZE +
pci_vpd_lrdt_size(&data[i]);

continue;
}
} else {
if ((val & PCI_VPD_SRDT_TIN_MASK) == PCI_VPD_STIN_END)
break;

i += PCI_VPD_SRDT_TAG_SIZE +
pci_vpd_srdt_size(&data[i]);

continue;
}

if (val != 0x90)
goto vpd_done;

block_end = (i + PCI_VPD_LRDT_TAG_SIZE +
pci_vpd_lrdt_size(&data[i]));
i += PCI_VPD_LRDT_TAG_SIZE;
Expand Down
23 changes: 17 additions & 6 deletions trunk/drivers/net/tg3.c
Original file line number Diff line number Diff line change
Expand Up @@ -12589,15 +12589,26 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
unsigned char val = vpd_data[i];
unsigned int block_end;

if (val == 0x82 || val == 0x91) {
i += PCI_VPD_LRDT_TAG_SIZE +
pci_vpd_lrdt_size(&vpd_data[i]);
if (val & PCI_VPD_LRDT) {
if (i + PCI_VPD_LRDT_TAG_SIZE > TG3_NVM_VPD_LEN)
break;

if (val != PCI_VPD_LRDT_RO_DATA) {
i += PCI_VPD_LRDT_TAG_SIZE +
pci_vpd_lrdt_size(&vpd_data[i]);

continue;
}
} else {
if ((val & PCI_VPD_SRDT_TIN_MASK) == PCI_VPD_STIN_END)
break;

i += PCI_VPD_SRDT_TAG_SIZE +
pci_vpd_srdt_size(&vpd_data[i]);

continue;
}

if (val != 0x90)
goto out_not_found;

block_end = i + PCI_VPD_LRDT_TAG_SIZE +
pci_vpd_lrdt_size(&vpd_data[i]);

Expand Down
34 changes: 33 additions & 1 deletion trunk/include/linux/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -1350,7 +1350,28 @@ static inline bool pci_is_pcie(struct pci_dev *dev)
void pci_request_acs(void);


#define PCI_VPD_LRDT_TAG_SIZE 3
#define PCI_VPD_LRDT 0x80 /* Large Resource Data Type */
#define PCI_VPD_LRDT_ID(x) (x | PCI_VPD_LRDT)

/* Large Resource Data Type Tag Item Names */
#define PCI_VPD_LTIN_ID_STRING 0x02 /* Identifier String */
#define PCI_VPD_LTIN_RO_DATA 0x10 /* Read-Only Data */
#define PCI_VPD_LTIN_RW_DATA 0x11 /* Read-Write Data */

#define PCI_VPD_LRDT_ID_STRING PCI_VPD_LRDT_ID(PCI_VPD_LTIN_ID_STRING)
#define PCI_VPD_LRDT_RO_DATA PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RO_DATA)
#define PCI_VPD_LRDT_RW_DATA PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RW_DATA)

/* Small Resource Data Type Tag Item Names */
#define PCI_VPD_STIN_END 0x78 /* End */

#define PCI_VPD_SRDT_END PCI_VPD_STIN_END

#define PCI_VPD_SRDT_TIN_MASK 0x78
#define PCI_VPD_SRDT_LEN_MASK 0x07

#define PCI_VPD_LRDT_TAG_SIZE 3
#define PCI_VPD_SRDT_TAG_SIZE 1

/**
* pci_vpd_lrdt_size - Extracts the Large Resource Data Type length
Expand All @@ -1363,5 +1384,16 @@ static inline u16 pci_vpd_lrdt_size(const u8 *lrdt)
return (u16)lrdt[1] + ((u16)lrdt[2] << 8);
}

/**
* pci_vpd_srdt_size - Extracts the Small Resource Data Type length
* @lrdt: Pointer to the beginning of the Small Resource Data Type tag
*
* Returns the extracted Small Resource Data Type length.
*/
static inline u8 pci_vpd_srdt_size(const u8 *srdt)
{
return (*srdt) & PCI_VPD_SRDT_LEN_MASK;
}

#endif /* __KERNEL__ */
#endif /* LINUX_PCI_H */

0 comments on commit 9d993a3

Please sign in to comment.