From: Petr Vandrovec Subject: Installation in VMware-Server fails References: 263883 Installation in VMware-Server fails as the VMware mpt emulation is broken; it does not (or wrongly) set the MaxDevices field to '0'. Signed-off-by: Hannes Reinecke diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 97471af..b3eb367 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c @@ -2567,6 +2567,16 @@ GetPortFacts(MPT_ADAPTER *ioc, int portn pfacts->IOCStatus = le16_to_cpu(pfacts->IOCStatus); pfacts->IOCLogInfo = le32_to_cpu(pfacts->IOCLogInfo); pfacts->MaxDevices = le16_to_cpu(pfacts->MaxDevices); + /* + * VMware emulation is broken, its PortFact's MaxDevices reports value + * programmed by IOC Init, so if IOC Init is programmed to 256 (which + * is 0, as that field is only 8 bit), it reports back 0 in port facts, + * instead of 256... And unfortunately using 256 triggers another bug + * in the code (parallel SCSI can have only 16 devices). + */ + if (pfacts->MaxDevices == 0) { + pfacts->MaxDevices = 16; + } pfacts->PortSCSIID = le16_to_cpu(pfacts->PortSCSIID); pfacts->ProtocolFlags = le16_to_cpu(pfacts->ProtocolFlags); pfacts->MaxPostedCmdBuffers = le16_to_cpu(pfacts->MaxPostedCmdBuffers); @@ -2574,7 +2584,7 @@ GetPortFacts(MPT_ADAPTER *ioc, int portn pfacts->MaxLanBuckets = le16_to_cpu(pfacts->MaxLanBuckets); max_id = (ioc->bus_type == SAS) ? pfacts->PortSCSIID : - pfacts->MaxDevices; + pfacts->MaxDevices; ioc->devices_per_bus = (max_id > 255) ? 256 : max_id; ioc->number_of_buses = (ioc->devices_per_bus < 256) ? 1 : max_id/256;