Skip to content

Commit

Permalink
pci: Add large and small resource data type code
Browse files Browse the repository at this point in the history
This patch introduces more VPD preprocessor definitions to identify some
small and large resource data type item names.  The patch then continues
to correct how the tg3 and bnx2 drivers search for the "read-only data"
large resource data type.

Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Matt Carlson authored and David S. Miller committed Feb 28, 2010
1 parent a2ce766 commit 7ad506f
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 13 deletions.
23 changes: 17 additions & 6 deletions 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 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 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 7ad506f

Please sign in to comment.