vserver 1.9.3
[linux-2.6.git] / drivers / pnp / pnpbios / core.c
index dd1bbb8..1a2fe19 100644 (file)
@@ -59,6 +59,7 @@
 #include <linux/kmod.h>
 #include <linux/completion.h>
 #include <linux/spinlock.h>
+#include <linux/dmi.h>
 
 #include <asm/page.h>
 #include <asm/desc.h>
@@ -129,7 +130,7 @@ static int pnp_dock_event(int dock, struct pnp_docking_station_info *info)
        /* only one standardized param to hotplug command: type */
        argv [0] = hotplug_path;
        argv [1] = "dock";
-       argv [2] = 0;
+       argv [2] = NULL;
 
        /* minimal command environment */
        envp [i++] = "HOME=/";
@@ -152,7 +153,7 @@ static int pnp_dock_event(int dock, struct pnp_docking_station_info *info)
        envp [i++] = scratch;
        scratch += sprintf (scratch, "DOCK=%x/%x/%x",
                info->location_id, info->serial, info->capabilities);
-       envp[i] = 0;
+       envp[i] = NULL;
        
        value = call_usermodehelper (argv [0], argv, envp, 0);
        kfree (buf);
@@ -251,8 +252,10 @@ static int pnpbios_set_resources(struct pnp_dev * dev, struct pnp_resource_table
        node = pnpbios_kmalloc(node_info.max_node_size, GFP_KERNEL);
        if (!node)
                return -1;
-       if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_DYNAMIC, node))
+       if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_DYNAMIC, node)) {
+               kfree(node);
                return -ENODEV;
+       }
        if(pnpbios_write_resources_to_node(res, node)<0) {
                kfree(node);
                return -1;
@@ -498,10 +501,39 @@ int __init pnpbios_probe_system(void)
        return 0;
 }
 
+static int __init exploding_pnp_bios(struct dmi_system_id *d)
+{
+       printk(KERN_WARNING "%s detected. Disabling PnPBIOS\n", d->ident);
+       return 0;
+}
+
+static struct dmi_system_id pnpbios_dmi_table[] = {
+       {       /* PnPBIOS GPF on boot */
+               .callback = exploding_pnp_bios,
+               .ident = "Higraded P14H",
+               .matches = {
+                       DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
+                       DMI_MATCH(DMI_BIOS_VERSION, "07.00T"),
+                       DMI_MATCH(DMI_SYS_VENDOR, "Higraded"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "P14H"),
+               },
+       },
+       {       /* PnPBIOS GPF on boot */
+               .callback = exploding_pnp_bios,
+               .ident = "ASUS P4P800",
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
+                       DMI_MATCH(DMI_BOARD_NAME, "P4P800"),
+               },
+       },
+       { }
+};
+
 int __init pnpbios_init(void)
 {
        int ret;
-       if(pnpbios_disabled || (dmi_broken & BROKEN_PNP_BIOS)) {
+
+       if (pnpbios_disabled || dmi_check_system(pnpbios_dmi_table)) {
                printk(KERN_INFO "PnPBIOS: Disabled\n");
                return -ENODEV;
        }