|
@@ -2497,6 +2497,57 @@ static void efx_pci_remove(struct pci_dev *pci_dev)
|
|
|
free_netdev(efx->net_dev);
|
|
|
};
|
|
|
|
|
|
+/* NIC VPD information
|
|
|
+ * Called during probe to display the part number of the
|
|
|
+ * installed NIC. VPD is potentially very large but this should
|
|
|
+ * always appear within the first 512 bytes.
|
|
|
+ */
|
|
|
+#define SFC_VPD_LEN 512
|
|
|
+static void efx_print_product_vpd(struct efx_nic *efx)
|
|
|
+{
|
|
|
+ struct pci_dev *dev = efx->pci_dev;
|
|
|
+ char vpd_data[SFC_VPD_LEN];
|
|
|
+ ssize_t vpd_size;
|
|
|
+ int i, j;
|
|
|
+
|
|
|
+ /* Get the vpd data from the device */
|
|
|
+ vpd_size = pci_read_vpd(dev, 0, sizeof(vpd_data), vpd_data);
|
|
|
+ if (vpd_size <= 0) {
|
|
|
+ netif_err(efx, drv, efx->net_dev, "Unable to read VPD\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Get the Read only section */
|
|
|
+ i = pci_vpd_find_tag(vpd_data, 0, vpd_size, PCI_VPD_LRDT_RO_DATA);
|
|
|
+ if (i < 0) {
|
|
|
+ netif_err(efx, drv, efx->net_dev, "VPD Read-only not found\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ j = pci_vpd_lrdt_size(&vpd_data[i]);
|
|
|
+ i += PCI_VPD_LRDT_TAG_SIZE;
|
|
|
+ if (i + j > vpd_size)
|
|
|
+ j = vpd_size - i;
|
|
|
+
|
|
|
+ /* Get the Part number */
|
|
|
+ i = pci_vpd_find_info_keyword(vpd_data, i, j, "PN");
|
|
|
+ if (i < 0) {
|
|
|
+ netif_err(efx, drv, efx->net_dev, "Part number not found\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ j = pci_vpd_info_field_size(&vpd_data[i]);
|
|
|
+ i += PCI_VPD_INFO_FLD_HDR_SIZE;
|
|
|
+ if (i + j > vpd_size) {
|
|
|
+ netif_err(efx, drv, efx->net_dev, "Incomplete part number\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ netif_info(efx, drv, efx->net_dev,
|
|
|
+ "Part Number : %.*s\n", j, &vpd_data[i]);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/* Main body of NIC initialisation
|
|
|
* This is called at module load (or hotplug insertion, theoretically).
|
|
|
*/
|
|
@@ -2586,6 +2637,8 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
|
|
|
netif_info(efx, probe, efx->net_dev,
|
|
|
"Solarflare NIC detected\n");
|
|
|
|
|
|
+ efx_print_product_vpd(efx);
|
|
|
+
|
|
|
/* Set up basic I/O (BAR mappings etc) */
|
|
|
rc = efx_init_io(efx);
|
|
|
if (rc)
|