From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) by mx.groups.io with SMTP id smtpd.web11.6425.1675145031446216091 for ; Mon, 30 Jan 2023 22:03:51 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@google.com header.s=20210112 header.b=J2TEjh1B; spf=pass (domain: flex--yuanyu.bounces.google.com, ip: 209.85.215.202, mailfrom: 3rq_yywykbs0hdjwhdpxxpun.lxvmnenunmtl.paxdyb.rx@flex--yuanyu.bounces.google.com) Received: by mail-pg1-f202.google.com with SMTP id s76-20020a632c4f000000b0049ceb0f185eso6242623pgs.7 for ; Mon, 30 Jan 2023 22:03:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=tJha1YSCKdienUpwzaV+ayIqPEEbh4b80HmAiMnzBWk=; b=J2TEjh1BgLg1YEaj7Wpe3OFA24HPFusj4ZSMvSUJ5UppJsGAcww2l8jAJo4iROd5sJ BgTZYqPfVJpM/cTIuS+50bDBsAuvhy2J3Flpp2DuAXXLb78j00YAcOBOhNpxx094tvPS lbbW/2+HFQ6+lIIB4QdTH3G9a0/FSFqd+2kFev9Lko8eAGWdrqVzEvV2AhkQzlNpOUoj /8WhpOu5N//9NOiQ/RY/qAfDCWTKfKut/Csaa2+OBpcqir10/1K2gogWokvy0ZOhGIEh Ajy2NsgRPlcpyGNrdKvjxD0bBGOmVgwzK1RJ8/Gg9WQEXRuAc3myrLNgkBjGlZsiD539 k79w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=tJha1YSCKdienUpwzaV+ayIqPEEbh4b80HmAiMnzBWk=; b=1pEmZDnKmq3FDHKGuFx1vokBL4FaLZwLRRVM4KsYEy6fD8uLz7Olj4j7pjJndmLpkW mEEBMK+apKZKV4pkc3VKkz/aXbW2TShC4ZfMxMxcgfiRDb48aj/4MNSsz3qrYYXn/Hhk 2MvgS63CWvOT4Hl31gf4bugmUO0yXQuu4tb5Qr+jX+7v0RCwJMrmInwSuO36nGMcAVXl TMNHEa8E8gd2Y2qGXoJCDyWbsvA1UxNxuUWMjeiCEh7NDqP+5TBJzUIUNRdLrKXwpozf 0BHSsOe4B9FxOVeB1DC4a9w87rPtYRHOWgqMieTFhNXrYzg+gZQyR6Lx3Vlj7hkqBt+p hWpQ== X-Gm-Message-State: AO0yUKWAzHKygF+B1oP0vgPvCx1FLYfdprRTTxZbvBqeJ5pHPE1l2NVl DtSdN4BsDXrDpQptyZDXaLhP7B1KtTsfQsfYWhXqqoWu/78oau2B/ooe0xyfvbXRkaDt+41uCK2 eBRJP+lV7x6r67PTgcNMI/n5N8EsLKQl0cDocgxB/YLG1iOPvKbbX31IcNBs= X-Google-Smtp-Source: AK7set8Gd+dkcgdEBvcFUjaQVYEAf26lgZaLHNJA6EifKaI67UYI3ltA71wcwFMd6pZI+R7l6416pzQqi7g= X-Received: from yuanyu.kir.corp.google.com ([2620:15c:29:204:60e3:dc53:1e92:62f7]) (user=yuanyu job=sendgmr) by 2002:aa7:9acc:0:b0:592:d6c:9729 with SMTP id x12-20020aa79acc000000b005920d6c9729mr3019360pfp.11.1675145030705; Mon, 30 Jan 2023 22:03:50 -0800 (PST) Date: Mon, 30 Jan 2023 22:03:47 -0800 In-Reply-To: <20230131060347.99785-1-yuanyu@google.com> Mime-Version: 1.0 References: <20230131060347.99785-1-yuanyu@google.com> X-Mailer: git-send-email 2.39.1.456.gfc5497dd1b-goog Message-ID: <20230131060347.99785-2-yuanyu@google.com> Subject: [PATCH v2 1/1] MdeModulePkg: ScsiBusDxe: Refactor DiscoverScsiDevice() From: "Yuan Yu" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Liming Gao , Hao A Wu , Ray Ni , Sivaparvathi chellaiah Content-Type: text/plain; charset="UTF-8" Currently DiscoverScsiDevice() returns a boolean which cannot distinguish a "not found" situation from a real problem like memory allocation failures. This patch changes the return value to an EFI_STATUS so that when memory allocation fails, it will return EFI_OUT_OF_RESOURCES. Without this change, any FALSE returned by DiscoverScsiDevice() will result in EFI_OUT_OF_RESOURCES being returned by ScsiScanCreateDevice(), which will cause a while loop in SCSIBusDriverBindingStart() to abort before other possible Puns in the SCSI channel are scanned, which means good devices may not have a chance to be discovered. If this good device is the boot device, boot will fail. Cc: Ard Biesheuvel Cc: Liming Gao Cc: Hao A Wu Cc: Ray Ni Cc: Sivaparvathi chellaiah Signed-off-by: Yuan Yu --- MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h | 10 ++++--- MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c | 30 ++++++++++---------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h index 68c5c02a9161..35a8a46ca7a2 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h +++ b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h @@ -455,7 +455,8 @@ ScsiExecuteSCSICommand ( @retval EFI_SUCCESS Successfully to discover the device and attach ScsiIoProtocol to it. - @retval EFI_OUT_OF_RESOURCES Fail to discover the device. + @retval EFI_NOT_FOUND Fail to discover the device. + @retval EFI_OUT_OF_RESOURCES Fail to allocate memory resources. **/ EFI_STATUS @@ -473,11 +474,12 @@ ScsiScanCreateDevice ( @param ScsiIoDevice The pointer of SCSI_IO_DEV - @retval TRUE Find SCSI Device and verify it. - @retval FALSE Unable to find SCSI Device. + @retval EFI_SUCCESS Find SCSI Device and verify it. + @retval EFI_NOT_FOUND Unable to find SCSI Device. + @retval EFI_OUT_OF_RESOURCES Fail to allocate memory resources. **/ -BOOLEAN +EFI_STATUS DiscoverScsiDevice ( IN OUT SCSI_IO_DEV *ScsiIoDevice ); diff --git a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c index fbe14c772496..4414a65eb1e6 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c +++ b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c @@ -1210,8 +1210,8 @@ ScsiScanCreateDevice ( ScsiBusDev->DevicePath ); - if (!DiscoverScsiDevice (ScsiIoDevice)) { - Status = EFI_OUT_OF_RESOURCES; + Status = DiscoverScsiDevice (ScsiIoDevice); + if (EFI_ERROR (Status)) { goto ErrorExit; } @@ -1276,11 +1276,12 @@ ErrorExit: @param ScsiIoDevice The pointer of SCSI_IO_DEV - @retval TRUE Find SCSI Device and verify it. - @retval FALSE Unable to find SCSI Device. + @retval EFI_SUCCESS Find SCSI Device and verify it. + @retval EFI_NOT_FOUND Unable to find SCSI Device. + @retval EFI_OUT_OF_RESOURCES Fail to allocate memory resources. **/ -BOOLEAN +EFI_STATUS DiscoverScsiDevice ( IN OUT SCSI_IO_DEV *ScsiIoDevice ) @@ -1294,7 +1295,6 @@ DiscoverScsiDevice ( EFI_SCSI_SENSE_DATA *SenseData; UINT8 MaxRetry; UINT8 Index; - BOOLEAN ScsiDeviceFound; HostAdapterStatus = 0; TargetStatus = 0; @@ -1302,7 +1302,7 @@ DiscoverScsiDevice ( InquiryData = AllocateAlignedBuffer (ScsiIoDevice, sizeof (EFI_SCSI_INQUIRY_DATA)); if (InquiryData == NULL) { - ScsiDeviceFound = FALSE; + Status = EFI_OUT_OF_RESOURCES; goto Done; } @@ -1311,7 +1311,7 @@ DiscoverScsiDevice ( sizeof (EFI_SCSI_SENSE_DATA) ); if (SenseData == NULL) { - ScsiDeviceFound = FALSE; + Status = EFI_OUT_OF_RESOURCES; goto Done; } @@ -1342,7 +1342,7 @@ DiscoverScsiDevice ( (SenseData->Error_Code == 0x70) && (SenseData->Sense_Key == EFI_SCSI_SK_ILLEGAL_REQUEST)) { - ScsiDeviceFound = FALSE; + Status = EFI_NOT_FOUND; goto Done; } @@ -1353,13 +1353,13 @@ DiscoverScsiDevice ( (Status == EFI_INVALID_PARAMETER) || (Status == EFI_UNSUPPORTED)) { - ScsiDeviceFound = FALSE; + Status = EFI_NOT_FOUND; goto Done; } } if (Index == MaxRetry) { - ScsiDeviceFound = FALSE; + Status = EFI_NOT_FOUND; goto Done; } @@ -1367,14 +1367,14 @@ DiscoverScsiDevice ( // Retrieved inquiry data successfully // if (InquiryData->Peripheral_Qualifier != 0) { - ScsiDeviceFound = FALSE; + Status = EFI_NOT_FOUND; goto Done; } if ((InquiryData->Peripheral_Type >= EFI_SCSI_TYPE_RESERVED_LOW) && (InquiryData->Peripheral_Type <= EFI_SCSI_TYPE_RESERVED_HIGH)) { - ScsiDeviceFound = FALSE; + Status = EFI_NOT_FOUND; goto Done; } @@ -1392,13 +1392,13 @@ DiscoverScsiDevice ( ScsiIoDevice->ScsiVersion = (UINT8)(InquiryData->Version & 0x07); } - ScsiDeviceFound = TRUE; + Status = EFI_SUCCESS; Done: FreeAlignedBuffer (SenseData, sizeof (EFI_SCSI_SENSE_DATA)); FreeAlignedBuffer (InquiryData, sizeof (EFI_SCSI_INQUIRY_DATA)); - return ScsiDeviceFound; + return Status; } /** -- 2.39.1.456.gfc5497dd1b-goog