diff -ru linux-2.6.22-vsgrsec.orig/drivers/message/fusion/mptbase.c linux-2.6.22-vsgrsec/drivers/message/fusion/mptbase.c --- linux-2.6.22-vsgrsec.orig/drivers/message/fusion/mptbase.c 2007-09-05 21:35:35 +0000 +++ linux-2.6.22-vsgrsec/drivers/message/fusion/mptbase.c 2007-09-06 13:26:07 +0000 @@ -2567,6 +2567,15 @@ 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 you program IOC Init 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);