[OpenBIOS] r369 - openbios-devel/drivers

svn at openbios.org svn at openbios.org
Wed Jan 7 16:57:08 CET 2009


Author: blueswirl
Date: 2009-01-07 16:57:07 +0100 (Wed, 07 Jan 2009)
New Revision: 369

Modified:
   openbios-devel/drivers/pci.c
   openbios-devel/drivers/pci_database.c
Log:
Don't hang if we discover an unknown device (Laurent Vivier)

Modified: openbios-devel/drivers/pci.c
===================================================================
--- openbios-devel/drivers/pci.c	2009-01-07 15:55:19 UTC (rev 368)
+++ openbios-devel/drivers/pci.c	2009-01-07 15:57:07 UTC (rev 369)
@@ -510,38 +510,43 @@
 	set_int_property(dev, "cache-line-size",
 			pci_config_read16(addr, PCI_CACHE_LINE_SIZE));
 
-	if (pci_dev->type) {
-		push_str(pci_dev->type);
-		fword("encode-string");
-		push_str("device_type");
-		fword("property");
+	if (pci_dev) {
+		if (pci_dev->type) {
+			push_str(pci_dev->type);
+			fword("encode-string");
+			push_str("device_type");
+			fword("property");
+		}
+		if (pci_dev->model) {
+			push_str(pci_dev->model);
+			fword("encode-string");
+			push_str("model");
+			fword("property");
+		}
+		if (pci_dev->compat)
+			set_property(dev, "compatible",
+				     pci_dev->compat, pci_compat_len(pci_dev));
+
+		if (pci_dev->acells)
+			set_int_property(dev, "#address-cells",
+					      pci_dev->acells);
+		if (pci_dev->scells)
+			set_int_property(dev, "#size-cells",
+					       pci_dev->scells);
+		if (pci_dev->icells)
+			set_int_property(dev, "#interrupt-cells",
+					      pci_dev->icells);
 	}
-	if (pci_dev->model) {
-		push_str(pci_dev->model);
-		fword("encode-string");
-		push_str("model");
-		fword("property");
-	}
-	if (pci_dev->compat)
-		set_property(dev, "compatible",
-			     pci_dev->compat, pci_compat_len(pci_dev));
 
 	pci_set_reg(config);
 	pci_set_assigned_addresses(config);
 	pci_set_interrupt_map(config);
 
-	if (pci_dev->acells)
-		set_int_property(dev, "#address-cells", pci_dev->acells);
-	if (pci_dev->scells)
-		set_int_property(dev, "#size-cells", pci_dev->scells);
-	if (pci_dev->icells)
-		set_int_property(dev, "#interrupt-cells", pci_dev->icells);
-
 #ifdef CONFIG_DEBUG_PCI
 	printk("\n");
 #endif
 
-	if (pci_dev->config_cb)
+	if (pci_dev && pci_dev->config_cb)
 		pci_dev->config_cb(config);
 }
 

Modified: openbios-devel/drivers/pci_database.c
===================================================================
--- openbios-devel/drivers/pci_database.c	2009-01-07 15:55:19 UTC (rev 368)
+++ openbios-devel/drivers/pci_database.c	2009-01-07 15:57:07 UTC (rev 369)
@@ -1022,7 +1022,9 @@
             break;
         }
     }
-    find_device:
+find_device:
+    if (dev == NULL)
+	goto bad_device;
     for (;; dev++) {
         if (dev->vendor == 0xFFFF && dev->product == 0xFFFF) {
             goto bad_device;
@@ -1055,7 +1057,7 @@
             return new;
         }
     }
- bad_device:
+bad_device:
     printk("Cannot manage '%s' PCI device type '%s':\n %x %x (%x %x %x)\n",
            name, type, vendor, product, class, subclass, iface);
 




More information about the OpenBIOS mailing list