pci: Add large and small resource data type code
authorMatt Carlson <mcarlson@broadcom.com>
Fri, 26 Feb 2010 14:04:40 +0000 (14:04 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 28 Feb 2010 08:43:31 +0000 (00:43 -0800)
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>
drivers/net/bnx2.c
drivers/net/tg3.c
include/linux/pci.h

index bb403887b549cb3342b9b3416e5dc0bad110241e..084ef102b8c42e7626c0d2806fabe1647a7907bd 100644 (file)
@@ -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;
index 5fccbe4599499194dc876200c82539035c565f09..ed57a62b3ac86f0a48cb6a0723ba1ffc14c9a735 100644 (file)
@@ -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]);
 
index 6f62a499023f5473874bd462e78ce0c1b8f5d900..198d062640b71b31759c77601a1dd51f516ff121 100644 (file)
@@ -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
@@ -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 */