|
@@ -1585,12 +1585,31 @@ static void piix_ignore_devices_quirk(struct ata_host *host)
|
|
|
},
|
|
|
{ } /* terminate list */
|
|
|
};
|
|
|
- const struct dmi_system_id *dmi = dmi_first_match(ignore_hyperv);
|
|
|
+ static const struct dmi_system_id allow_virtual_pc[] = {
|
|
|
+ {
|
|
|
+ /* In MS Virtual PC guests the DMI ident is nearly
|
|
|
+ * identical to a Hyper-V guest. One difference is the
|
|
|
+ * product version which is used here to identify
|
|
|
+ * a Virtual PC guest. This entry allows ata_piix to
|
|
|
+ * drive the emulated hardware.
|
|
|
+ */
|
|
|
+ .ident = "MS Virtual PC 2007",
|
|
|
+ .matches = {
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR,
|
|
|
+ "Microsoft Corporation"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ { } /* terminate list */
|
|
|
+ };
|
|
|
+ const struct dmi_system_id *ignore = dmi_first_match(ignore_hyperv);
|
|
|
+ const struct dmi_system_id *allow = dmi_first_match(allow_virtual_pc);
|
|
|
|
|
|
- if (dmi && prefer_ms_hyperv) {
|
|
|
+ if (ignore && !allow && prefer_ms_hyperv) {
|
|
|
host->flags |= ATA_HOST_IGNORE_ATA;
|
|
|
dev_info(host->dev, "%s detected, ATA device ignore set\n",
|
|
|
- dmi->ident);
|
|
|
+ ignore->ident);
|
|
|
}
|
|
|
#endif
|
|
|
}
|