]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c
MdeModulePkg/ScsiBusDxe: don't produce ScsiIo for nonexistent LUNs, part 2
[mirror_edk2.git] / MdeModulePkg / Bus / Scsi / ScsiBusDxe / ScsiBus.c
index 1068770cd87f02903ca28e31b4ae94da09487fcc..21034aab19f7266fb37a255dff451f0cacb3ff40 100644 (file)
@@ -1298,12 +1298,14 @@ DiscoverScsiDevice (
   UINT8                 HostAdapterStatus;\r
   UINT8                 TargetStatus;\r
   EFI_SCSI_INQUIRY_DATA *InquiryData;\r
+  EFI_SCSI_SENSE_DATA   *SenseData;\r
   UINT8                 MaxRetry;\r
   UINT8                 Index;\r
   BOOLEAN               ScsiDeviceFound;\r
 \r
   HostAdapterStatus = 0;\r
   TargetStatus      = 0;\r
+  SenseData         = NULL;\r
 \r
   InquiryData = AllocateAlignedBuffer (ScsiIoDevice, sizeof (EFI_SCSI_INQUIRY_DATA));\r
   if (InquiryData == NULL) {\r
@@ -1311,19 +1313,29 @@ DiscoverScsiDevice (
     goto Done;\r
   }\r
 \r
+  SenseData = AllocateAlignedBuffer (\r
+                ScsiIoDevice,\r
+                sizeof (EFI_SCSI_SENSE_DATA)\r
+                );\r
+  if (SenseData == NULL) {\r
+    ScsiDeviceFound = FALSE;\r
+    goto Done;\r
+  }\r
+\r
   //\r
   // Using Inquiry command to scan for the device\r
   //\r
   InquiryDataLength = sizeof (EFI_SCSI_INQUIRY_DATA);\r
-  SenseDataLength   = 0;\r
+  SenseDataLength   = sizeof (EFI_SCSI_SENSE_DATA);\r
   ZeroMem (InquiryData, InquiryDataLength);\r
+  ZeroMem (SenseData, SenseDataLength);\r
 \r
   MaxRetry = 2;\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
     Status = ScsiInquiryCommand (\r
               &ScsiIoDevice->ScsiIo,\r
               SCSI_BUS_TIMEOUT,\r
-              NULL,\r
+              SenseData,\r
               &SenseDataLength,\r
               &HostAdapterStatus,\r
               &TargetStatus,\r
@@ -1332,6 +1344,13 @@ DiscoverScsiDevice (
               FALSE\r
               );\r
     if (!EFI_ERROR (Status)) {\r
+      if ((HostAdapterStatus == EFI_SCSI_IO_STATUS_HOST_ADAPTER_OK) &&\r
+          (TargetStatus == EFI_SCSI_IO_STATUS_TARGET_CHECK_CONDITION) &&\r
+          (SenseData->Error_Code == 0x70) &&\r
+          (SenseData->Sense_Key == EFI_SCSI_SK_ILLEGAL_REQUEST)) {\r
+        ScsiDeviceFound = FALSE;\r
+        goto Done;\r
+      }\r
       break;\r
     }\r
     if ((Status == EFI_BAD_BUFFER_SIZE) ||\r
@@ -1377,6 +1396,7 @@ DiscoverScsiDevice (
   ScsiDeviceFound = TRUE;\r
 \r
 Done:\r
+  FreeAlignedBuffer (SenseData, sizeof (EFI_SCSI_SENSE_DATA));\r
   FreeAlignedBuffer (InquiryData, sizeof (EFI_SCSI_INQUIRY_DATA));\r
 \r
   return ScsiDeviceFound;\r