sky2: display product info on boot.
authorStephen Hemminger <shemminger@linux-foundation.org>
Thu, 28 Aug 2008 03:48:23 +0000 (20:48 -0700)
committerJeff Garzik <jgarzik@redhat.com>
Wed, 3 Sep 2008 14:23:58 +0000 (10:23 -0400)
Change bootup messages to print more information. This is to help users
who may have old buggy EEPROM image.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/net/sky2.c

index 4e3e2a37c3d14c162cb95bf775ae1eb10cb8ec40..3805b9318be725c8292bd86bc962a15ffe1b8486 100644 (file)
@@ -4191,6 +4191,69 @@ static int __devinit pci_wake_enabled(struct pci_dev *dev)
        return value & PCI_PM_CTRL_PME_ENABLE;
 }
 
+/*
+ * Read and parse the first part of Vital Product Data
+ */
+#define VPD_SIZE       128
+#define VPD_MAGIC      0x82
+
+static void __devinit sky2_vpd_info(struct sky2_hw *hw)
+{
+       int cap = pci_find_capability(hw->pdev, PCI_CAP_ID_VPD);
+       const u8 *p;
+       u8 *vpd_buf = NULL;
+       u16 len;
+       static struct vpd_tag {
+               char tag[2];
+               char *label;
+       } vpd_tags[] = {
+               { "PN", "Part Number" },
+               { "EC", "Engineering Level" },
+               { "MN", "Manufacturer" },
+       };
+
+       if (!cap)
+               goto out;
+
+       vpd_buf = kmalloc(VPD_SIZE, GFP_KERNEL);
+       if (!vpd_buf)
+               goto out;
+
+       if (sky2_vpd_read(hw, cap, vpd_buf, 0, VPD_SIZE))
+               goto out;
+
+       if (vpd_buf[0] != VPD_MAGIC)
+               goto out;
+       len = vpd_buf[1];
+       if (len == 0 || len > VPD_SIZE - 4)
+               goto out;
+       p = vpd_buf + 3;
+       dev_info(&hw->pdev->dev, "%.*s\n", len, p);
+       p += len;
+
+       while (p < vpd_buf + VPD_SIZE - 4) {
+               int i;
+
+               if (!memcmp("RW", p, 2))        /* end marker */
+                       break;
+
+               len = p[2];
+               if (len > (p - vpd_buf) - 4)
+                       break;
+
+               for (i = 0; i < ARRAY_SIZE(vpd_tags); i++) {
+                       if (!memcmp(vpd_tags[i].tag, p, 2)) {
+                               printk(KERN_DEBUG " %s: %.*s\n",
+                                      vpd_tags[i].label, len, p + 3);
+                               break;
+                       }
+               }
+               p += len + 3;
+       }
+out:
+       kfree(vpd_buf);
+}
+
 /* This driver supports yukon2 chipset only */
 static const char *sky2_name(u8 chipid, char *buf, int sz)
 {
@@ -4289,13 +4352,13 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
        if (err)
                goto err_out_iounmap;
 
-       dev_info(&pdev->dev, "v%s addr 0x%llx irq %d Yukon-2 %s rev %d\n",
-                DRV_VERSION, (unsigned long long)pci_resource_start(pdev, 0),
-                pdev->irq, sky2_name(hw->chip_id, buf1, sizeof(buf1)),
-                hw->chip_rev);
+       dev_info(&pdev->dev, "Yukon-2 %s chip revision %d\n",
+                sky2_name(hw->chip_id, buf1, sizeof(buf1)), hw->chip_rev);
 
        sky2_reset(hw);
 
+       sky2_vpd_info(hw);
+
        dev = sky2_init_netdev(hw, 0, using_dac, wol_default);
        if (!dev) {
                err = -ENOMEM;
@@ -4546,6 +4609,8 @@ static struct pci_driver sky2_driver = {
 
 static int __init sky2_init_module(void)
 {
+       pr_info(PFX "driver version " DRV_VERSION "\n");
+
        sky2_debug_init();
        return pci_register_driver(&sky2_driver);
 }