// // TDS 4.5 // EFI_STATUS BBTestPassThruConformanceAutoTest ( IN EFI_BB_TEST_PROTOCOL *This, IN VOID *ClientInterface, IN EFI_TEST_LEVEL TestLevel, IN EFI_HANDLE SupportHandle ) { EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib; EFI_STATUS Status; EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_TEST_ASSERTION AssertionType; UINT32 Target; UINT64 Lun; EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET Packet; UINT8 Cdb[6]; UINT8 Data[100]; //UINT8 Count; // // Get the Standard Library Interface // Status = gtBS->HandleProtocol ( SupportHandle, &gEfiStandardTestLibraryGuid, &StandardLib ); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.HandleProtocol - Handle standard test library", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return Status; } ScsiPassThru = (EFI_SCSI_PASS_THRU_PROTOCOL *)ClientInterface; // // Assertion Point 4.5.2.1 // Call PassThru() with too long TransferLength. // Status = GetScsiDevice (ScsiPassThru, &Target, &Lun); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"Can't Get any Scsi Device", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return EFI_UNSUPPORTED; } // // Initialize the Request Packet. // EfiCommonLibZeroMem (&Packet, sizeof (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET)); EfiCommonLibZeroMem (Cdb, 6); EfiCommonLibZeroMem (Data, 100); // Set to OP_INQUIRY. Cdb[0] = 0x12; Cdb[1] = (UINT8)(((UINT8)Lun << 5) & 0xE0); Cdb[4] = 100; Packet.Timeout = 0; Packet.Cdb = Cdb; Packet.CdbLength = 6; Packet.DataBuffer = Data; Packet.TransferLength = 0xFFFFFFFF; Packet.DataDirection = 0; Status = ScsiPassThru->PassThru (ScsiPassThru, Target, Lun, &Packet, NULL); if (Status == EFI_BAD_BUFFER_SIZE) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid013, L"EFI_SCSI_PASS_THRU_PROTOCOL.PassThru - Call PassThru() with with too long TransferLength", L"%a:%d:Status - %r, Target - %d, Lun - %ld, The max length is %d", __FILE__, __LINE__, Status, Target, Lun, Packet.TransferLength ); // // Assertion Point 4.5.2.3 // Call PassThru() with invalid parameter. // EfiCommonLibZeroMem (&Packet, sizeof (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET)); EfiCommonLibZeroMem (Cdb, 6); EfiCommonLibZeroMem (Data, 100); // Set to OP_INQUIRY. Cdb[0] = 0x12; Cdb[1] = (UINT8)(((UINT8)Lun << 5) & 0xE0); Cdb[4] = 100; Packet.Timeout = 0; Packet.Cdb = Cdb; Packet.CdbLength = 6; Packet.DataBuffer = Data; Packet.TransferLength = 100; Packet.DataDirection = 0; // // Check Point 1. Invalid Target // Status = ScsiPassThru->PassThru (ScsiPassThru, 0xEEEEEEEE, Lun, &Packet, NULL); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid016, L"EFI_SCSI_PASS_THRU_PROTOCOL.PassThru - Call PassThru() with invalid Target", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); // // Check Point 2. Invalid Lun // EfiCommonLibZeroMem (&Packet, sizeof (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET)); EfiCommonLibZeroMem (Cdb, 6); EfiCommonLibZeroMem (Data, 100); // Set to OP_INQUIRY. Cdb[0] = 0x12; Cdb[1] = (UINT8)(((UINT8)Lun << 5) & 0xE0); Cdb[4] = 100; Packet.Timeout = 0; Packet.Cdb = Cdb; Packet.CdbLength = 6; Packet.DataBuffer = Data; Packet.TransferLength = 100; Packet.DataDirection = 0; Status = ScsiPassThru->PassThru (ScsiPassThru, Target, 0xEEEEEEEE, &Packet, NULL); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid017, L"EFI_SCSI_PASS_THRU_PROTOCOL.PassThru - Call PassThru() with invalid Lun", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); // // Check Point 3. Invalid ScsiRequestPacket. // EfiCommonLibZeroMem (&Packet, sizeof (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET)); Status = ScsiPassThru->PassThru (ScsiPassThru, Target, Lun, &Packet, NULL); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid018, L"EFI_SCSI_PASS_THRU_PROTOCOL.PassThru - Call PassThru() with invalid ScsiRequestPacket", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return EFI_SUCCESS; }
// // TDS 4.3 // EFI_STATUS BBTestGetTargetLunConformanceAutoTest ( IN EFI_BB_TEST_PROTOCOL *This, IN VOID *ClientInterface, IN EFI_TEST_LEVEL TestLevel, IN EFI_HANDLE SupportHandle ) { EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib; EFI_STATUS Status; EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_TEST_ASSERTION AssertionType; UINT32 Target; UINT64 Lun; EFI_DEVICE_PATH_PROTOCOL *DevicePath; // // Get the Standard Library Interface // Status = gtBS->HandleProtocol ( SupportHandle, &gEfiStandardTestLibraryGuid, &StandardLib ); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.HandleProtocol - Handle standard test library", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return Status; } ScsiPassThru = (EFI_SCSI_PASS_THRU_PROTOCOL *)ClientInterface; // // Assertion Point 4.3.2.1 // Call GetTargetLun()with NULL DevicePath, NULL Target and NULL Lun. // Status = GetScsiDevice (ScsiPassThru, &Target, &Lun); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"Can't Get any Scsi Device", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return EFI_UNSUPPORTED; } // // Get the valid Device Path Node. // Status = ScsiPassThru->BuildDevicePath (ScsiPassThru, Target, Lun, &DevicePath); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"EFI_SCSI_PASS_THRU_PROTOCOL.BuildDevicePath", L"%a:%d:Status - %r, Target - %d, Lun - %ld", __FILE__, __LINE__, Status, Target, Lun ); return EFI_UNSUPPORTED; } // // Check Point 1. NULL Device Path. // Status = ScsiPassThru->GetTargetLun (ScsiPassThru, NULL, &Target, &Lun); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid007, L"EFI_SCSI_PASS_THRU_PROTOCOL.GetTargetLun - Invoke GetTargetLun() with NULL Device Path", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); // // Check Point 2. NULL Target. // Status = ScsiPassThru->GetTargetLun (ScsiPassThru, DevicePath, NULL, &Lun); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid008, L"EFI_SCSI_PASS_THRU_PROTOCOL.GetTargetLun - Invoke GetTargetLun() with NULL Target", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); // // Check Point 3. NULL Lun. // Status = ScsiPassThru->GetTargetLun (ScsiPassThru, DevicePath, &Target, NULL); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid009, L"EFI_SCSI_PASS_THRU_PROTOCOL.GetTargetLun - Invoke GetTargetLun() with NULL Lun", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); // // Assertion Point 4.3.2.2 // Call GetTargetLun()with unsupported DevicePath. // // // Set the Device Path to Non Scsi Device Path. // DevicePath->Type = 5; DevicePath->SubType = 1; Status = ScsiPassThru->GetTargetLun (ScsiPassThru, DevicePath, &Target, &Lun); if (Status == EFI_UNSUPPORTED) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } //Free the DevicePath. gtBS->FreePool (DevicePath); StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid010, L"EFI_SCSI_PASS_THRU_PROTOCOL.GetTargetLun - Invoke GetTargetLun() with unsupported Device Path", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return EFI_SUCCESS; }
// // TDS 4.4 // EFI_STATUS BBTestResetTargetConformanceAutoTest ( IN EFI_BB_TEST_PROTOCOL *This, IN VOID *ClientInterface, IN EFI_TEST_LEVEL TestLevel, IN EFI_HANDLE SupportHandle ) { EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib; EFI_STATUS Status; EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_TEST_ASSERTION AssertionType; UINT32 Target; UINT64 Lun; UINT32 NewTarget; UINT64 NewLun; // // Get the Standard Library Interface // Status = gtBS->HandleProtocol ( SupportHandle, &gEfiStandardTestLibraryGuid, &StandardLib ); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.HandleProtocol - Handle standard test library", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return Status; } ScsiPassThru = (EFI_SCSI_PASS_THRU_PROTOCOL *)ClientInterface; // // Assertion Point 4.4.2.1 // Call ResetTarget() with invalid Target and invalid Lun. // Status = GetScsiDevice (ScsiPassThru, &NewTarget, &NewLun); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"Can't Get any Scsi Device", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return EFI_UNSUPPORTED; } // // Check point 1, call GetNextDevice with invalid Target. // Target = 0xEEEEEEEE; Lun = NewLun; Status = ScsiPassThru->ResetTarget (ScsiPassThru, Target, Lun); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid011, L"EFI_SCSI_PASS_THRU_PROTOCOL.ResetTarget - call ResetTarget with invalid Target.", L"%a:%d:Status - %r, Target - %d, Lun - %ld", __FILE__, __LINE__, Status, Target, Lun ); // // Check point 2, call GetNextDevice with invalid Lun. // Target = NewTarget; Lun = 0xEEEEEEEE; Status = ScsiPassThru->ResetTarget (ScsiPassThru, Target, Lun); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid012, L"EFI_SCSI_PASS_THRU_PROTOCOL.ResetTarget - call ResetTarget with invalid Lun.", L"%a:%d:Status - %r, Target - %d, Lun - %ld", __FILE__, __LINE__, Status, Target, Lun ); return EFI_SUCCESS; }
/** Test to see if this driver supports ControllerHandle. This service is called by the EFI boot service ConnectController(). In order to make drivers as small as possible, there are a few calling restrictions for this service. ConnectController() must follow these calling restrictions. If any other agent wishes to call Supported() it must also follow these calling restrictions. @param This Protocol instance pointer. @param ControllerHandle Handle of device to test @param RemainingDevicePath Optional parameter use to pick a specific child device to start. @retval EFI_SUCCESS This driver supports this device @retval EFI_ALREADY_STARTED This driver is already running on this device @retval other This driver does not support this device **/ EFI_STATUS EFIAPI SCSIBusDriverBindingSupported ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) { EFI_STATUS Status; EFI_SCSI_PASS_THRU_PROTOCOL *PassThru; EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtPassThru; UINT64 Lun; UINT8 *TargetId; SCSI_TARGET_ID ScsiTargetId; TargetId = &ScsiTargetId.ScsiId.ExtScsi[0]; SetMem (TargetId, TARGET_MAX_BYTES, 0xFF); // // To keep backward compatibility, UEFI ExtPassThru Protocol is supported as well as // EFI PassThru Protocol. From priority perspective, ExtPassThru Protocol is firstly // tried to open on host controller handle. If fails, then PassThru Protocol is tried instead. // Status = gBS->OpenProtocol ( Controller, &gEfiExtScsiPassThruProtocolGuid, (VOID **)&ExtPassThru, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); if (Status == EFI_ALREADY_STARTED) { return EFI_SUCCESS; } else if (!EFI_ERROR(Status)) { // // Check if RemainingDevicePath is NULL or the End of Device Path Node, // if yes, return EFI_SUCCESS. // if ((RemainingDevicePath == NULL) || IsDevicePathEnd (RemainingDevicePath)) { // // Close protocol regardless of RemainingDevicePath validation // gBS->CloseProtocol ( Controller, &gEfiExtScsiPassThruProtocolGuid, This->DriverBindingHandle, Controller ); return EFI_SUCCESS; } else { // // If RemainingDevicePath isn't the End of Device Path Node, check its validation // Status = ExtPassThru->GetTargetLun (ExtPassThru, RemainingDevicePath, &TargetId, &Lun); // // Close protocol regardless of RemainingDevicePath validation // gBS->CloseProtocol ( Controller, &gEfiExtScsiPassThruProtocolGuid, This->DriverBindingHandle, Controller ); if (!EFI_ERROR(Status)) { return EFI_SUCCESS; } } } // // Come here in 2 condition: // 1. ExtPassThru doesn't exist. // 2. ExtPassThru exists but RemainingDevicePath is invalid. // Status = gBS->OpenProtocol ( Controller, &gEfiScsiPassThruProtocolGuid, (VOID **)&PassThru, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); if (Status == EFI_ALREADY_STARTED) { return EFI_SUCCESS; } if (EFI_ERROR (Status)) { return Status; } // // Test RemainingDevicePath is valid or not. // if ((RemainingDevicePath != NULL) && !IsDevicePathEnd (RemainingDevicePath)) { Status = PassThru->GetTargetLun (PassThru, RemainingDevicePath, &ScsiTargetId.ScsiId.Scsi, &Lun); } gBS->CloseProtocol ( Controller, &gEfiScsiPassThruProtocolGuid, This->DriverBindingHandle, Controller ); return Status; }
// // TDS 4.1 // EFI_STATUS BBTestGetNextDeviceConformanceAutoTest ( IN EFI_BB_TEST_PROTOCOL *This, IN VOID *ClientInterface, IN EFI_TEST_LEVEL TestLevel, IN EFI_HANDLE SupportHandle ) { EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib; EFI_STATUS Status; EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_TEST_ASSERTION AssertionType; UINT32 Target; UINT64 Lun; UINT32 NewTarget; UINT64 NewLun; // // Get the Standard Library Interface // Status = gtBS->HandleProtocol ( SupportHandle, &gEfiStandardTestLibraryGuid, &StandardLib ); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.HandleProtocol - Handle standard test library", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return Status; } ScsiPassThru = (EFI_SCSI_PASS_THRU_PROTOCOL *)ClientInterface; // // Assertion Point 4.1.2.1 // Call GetNextDevice() with invalid parameter. // NewTarget = 0xFFFFFFFF; // // Get First Device Target and Lun. // Status = ScsiPassThru->GetNextDevice (ScsiPassThru, &NewTarget, &NewLun); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"EFI_SCSI_PASS_THRU_PROTOCOL.GetNextDevice", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return EFI_UNSUPPORTED; } // // Check point 1, call GetNextDevice with invalid Target. // Target = 0xEEEEEEEE; Lun = NewLun; Status = ScsiPassThru->GetNextDevice (ScsiPassThru, &Target, &Lun); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid002, L"EFI_SCSI_PASS_THRU_PROTOCOL.GetNextDevice - call GetNextDevice with invalid Target.", L"%a:%d:Status - %r, Target - %d, Lun - %ld", __FILE__, __LINE__, Status, Target, Lun ); // // Check point 2, call GetNextDevice with invalid Lun. // Target = NewTarget; Lun = 0xEEEEEEEE; Status = ScsiPassThru->GetNextDevice (ScsiPassThru, &Target, &Lun); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid003, L"EFI_SCSI_PASS_THRU_PROTOCOL.GetNextDevice - call GetNextDevice with invalid Lun.", L"%a:%d:Status - %r, Target - %d, Lun - %ld", __FILE__, __LINE__, Status, Target, Lun ); // // Check point 3, Call GetNextDevice() with Target=0xFFFFFFFF to get the // first device. Then call it again to get the next device. // Use the Target and Lun return from the first call to call // the function. // Target = NewTarget; Lun = NewLun; // // Get the second Device Target and Lun. // Status = ScsiPassThru->GetNextDevice (ScsiPassThru, &NewTarget, &NewLun); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"EFI_SCSI_PASS_THRU_PROTOCOL.GetNextDevice", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return EFI_UNSUPPORTED; } return EFI_SUCCESS; }
// // TDS 4.2 // EFI_STATUS BBTestBuildDevicePathConformanceAutoTest ( IN EFI_BB_TEST_PROTOCOL *This, IN VOID *ClientInterface, IN EFI_TEST_LEVEL TestLevel, IN EFI_HANDLE SupportHandle ) { EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib; EFI_STATUS Status; EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_TEST_ASSERTION AssertionType; UINT32 Target; UINT64 Lun; UINT32 NewTarget; UINT64 NewLun; EFI_DEVICE_PATH_PROTOCOL *DevicePath; // // Verify whether it is one of IHV interfaces // if (! IsIhvInterface (ClientInterface, SupportHandle)) { return EFI_UNSUPPORTED; } // // Get the Standard Library Interface // Status = gtBS->HandleProtocol ( SupportHandle, &gEfiStandardTestLibraryGuid, &StandardLib ); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.HandleProtocol - Handle standard test library", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return Status; } ScsiPassThru = (EFI_SCSI_PASS_THRU_PROTOCOL *)ClientInterface; // // Assertion Point 4.2.2.1 // Call BuildDevicePath() with invalid Target and invalid Lun. // Status = GetScsiDevice (ScsiPassThru, &NewTarget, &NewLun); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"Can't Get any Scsi Device", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return EFI_UNSUPPORTED; } // // Check point 1, call BuildDevicePath with invalid Target. // Target = 0xEEEEEEEE; Lun = NewLun; Status = ScsiPassThru->BuildDevicePath (ScsiPassThru, Target, Lun, &DevicePath); if (Status == EFI_NOT_FOUND) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid004, L"EFI_SCSI_PASS_THRU_PROTOCOL.BuildDevicePath - call BuildDevicePath with invalid Target.", L"%a:%d:Status - %r, Target - %d, Lun - %ld", __FILE__, __LINE__, Status, Target, Lun ); // // Check point 2, call BuildDevicePath with invalid Lun. // Target = NewTarget; Lun = 0xEEEEEEEE; Status = ScsiPassThru->BuildDevicePath (ScsiPassThru, Target, Lun, &DevicePath); if (Status == EFI_NOT_FOUND) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid005, L"EFI_SCSI_PASS_THRU_PROTOCOL.BuildDevicePath - call BuildDevicePath with invalid Lun.", L"%a:%d:Status - %r, Target - %d, Lun - %ld", __FILE__, __LINE__, Status, Target, Lun ); // // Assertion Point 4.2.2.2 // Call BuildDevicePath() with NULL DevicePath. // Target = NewTarget; Lun = NewLun; Status = ScsiPassThru->BuildDevicePath (ScsiPassThru, Target, Lun, NULL); if (Status == EFI_INVALID_PARAMETER) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestConformanceAssertionGuid006, L"EFI_SCSI_PASS_THRU_PROTOCOL.BuildDevicePath - call BuildDevicePath with NULL DevicePath.", L"%a:%d:Status - %r, Target - %d, Lun - %d", __FILE__, __LINE__, Status, Target, Lun ); return EFI_SUCCESS; }
// // TDS 3.1 // EFI_STATUS BBTestGetNextDeviceFunctionAutoTest ( IN EFI_BB_TEST_PROTOCOL *This, IN VOID *ClientInterface, IN EFI_TEST_LEVEL TestLevel, IN EFI_HANDLE SupportHandle ) { EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib; EFI_STATUS Status; EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_TEST_ASSERTION AssertionType; UINT32 Target; UINT64 Lun; // // Get the Standard Library Interface // Status = gtBS->HandleProtocol ( SupportHandle, &gEfiStandardTestLibraryGuid, &StandardLib ); if ( EFI_ERROR(Status) ) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.HandleProtocol - Handle standard test library", L"%a:%d:Status - %r\n", __FILE__, (UINTN)__LINE__, Status ); return Status; } ScsiPassThru = (EFI_SCSI_PASS_THRU_PROTOCOL *)ClientInterface; // // Assertion Point 3.1.2.1 // Retrieve the list of legal Target IDs and LUNs for SCSI devices on a SCSI channel. // Target = 0xFFFFFFFF; Status = EFI_SUCCESS; while (!EFI_ERROR(Status)) { Status = ScsiPassThru->GetNextDevice (ScsiPassThru, &Target, &Lun); if (!EFI_ERROR(Status )) { StandardLib->RecordMessage ( StandardLib, EFI_VERBOSE_LEVEL_QUIET, L"SCSI device: Target - %d, Lun - %ld\n", Target, Lun ); } } if (Status == EFI_NOT_FOUND) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestFunctionAssertionGuid001, L"EFI_SCSI_PASS_THRU_PROTOCOL.GetNextDevice - Invoke GetNextDevice() and verify interface correctness within test case", L"%a:%d:Status - %r\n", __FILE__, (UINTN)__LINE__, Status ); return EFI_SUCCESS; }
// // TDS 3.6 // EFI_STATUS BBTestPassThruFunctionAutoTest ( IN EFI_BB_TEST_PROTOCOL *This, IN VOID *ClientInterface, IN EFI_TEST_LEVEL TestLevel, IN EFI_HANDLE SupportHandle ) { EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib; EFI_STATUS Status; EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_TEST_ASSERTION AssertionType; UINT32 Target; UINT64 Lun; EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET Packet; UINT8 Cdb[6]; UINT8 *Data; EFI_EVENT Event; // // Get the Standard Library Interface // Status = gtBS->HandleProtocol ( SupportHandle, &gEfiStandardTestLibraryGuid, &StandardLib ); if ( EFI_ERROR(Status) ) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.HandleProtocol - Handle standard test library", L"%a:%d:Status - %r\n", __FILE__, (UINTN)__LINE__, Status ); return Status; } ScsiPassThru = (EFI_SCSI_PASS_THRU_PROTOCOL *)ClientInterface; // // Assertion Point 3.6.2.1 // Call PassThru() with NULL Event. // Target = 0xFFFFFFFF; Status = GetPresentTargetLun(ScsiPassThru, &Target, &Lun); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"Can't Get any Scsi Device", L"%a:%d:Status - %r\n", __FILE__, (UINTN)__LINE__, Status ); return EFI_UNSUPPORTED; } // // Initialize the Request Packet. // Data = (UINT8 *)AllocatePool (ScsiPassThru->Mode->IoAlign + 96); EfiCommonLibZeroMem (&Packet,sizeof (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET)); EfiCommonLibZeroMem (Cdb,6); EfiCommonLibZeroMem (Data, ScsiPassThru->Mode->IoAlign + 96); // Set to OP_INQUIRY. Cdb[0] = 0x12; Cdb[1] = (UINT8)(((UINT8)Lun << 5) & 0xE0); Cdb[4] = 96; Packet.Timeout = EfiScsiStallSeconds (2); Packet.Cdb = Cdb; Packet.CdbLength = 6; if ((ScsiPassThru->Mode->IoAlign == 0) || (ScsiPassThru->Mode->IoAlign == 1)){ Packet.DataBuffer = (VOID *)Data; } else { Packet.DataBuffer = (VOID *)(((UINTN)Data + ScsiPassThru->Mode->IoAlign - 1) & ~(ScsiPassThru->Mode->IoAlign - 1)); } Packet.TransferLength = 96; Packet.DataDirection = 0; Status = ScsiPassThru->PassThru (ScsiPassThru, Target, Lun, &Packet, NULL); if (EFI_ERROR(Status)) { AssertionType = EFI_TEST_ASSERTION_FAILED; } else { AssertionType = EFI_TEST_ASSERTION_PASSED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestFunctionAssertionGuid006, L"EFI_SCSI_PASS_THRU_PROTOCOL.PassThru - Call PassThru() with NULL Event", L"%a:%d:Status - %r, Target - %d, Lun - %ld, TransferLen - %d\n", __FILE__, (UINTN)__LINE__, Status, Target, Lun, Packet.TransferLength ); // // Assertion Point 3.6.2.2 // Call PassThru() with Event. // // // Create Event // Status = gtBS->CreateEvent ( EFI_EVENT_NOTIFY_SIGNAL, EFI_TPL_CALLBACK, NotifyFunction, NULL, &Event ); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.CreateEvent", L"%a:%d:Status - %r\n", __FILE__, (UINTN)__LINE__, Status ); return Status; } EnterEvent = 0; // // Initialize the Request Packet. // EfiCommonLibZeroMem (&Packet,sizeof (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET)); EfiCommonLibZeroMem (Cdb,6); EfiCommonLibZeroMem (Data, ScsiPassThru->Mode->IoAlign + 96); // Set to OP_INQUIRY. Cdb[0] = 0x12; Cdb[1] = (UINT8)(((UINT8)Lun << 5) & 0xE0); Cdb[4] = 96; Packet.Timeout = EfiScsiStallSeconds (2); Packet.Cdb = Cdb; Packet.CdbLength = 6; if ((ScsiPassThru->Mode->IoAlign == 0) || (ScsiPassThru->Mode->IoAlign == 1)){ Packet.DataBuffer = (VOID *)Data; } else { Packet.DataBuffer = (VOID *)(((UINTN)Data + ScsiPassThru->Mode->IoAlign - 1) & ~(ScsiPassThru->Mode->IoAlign - 1)); } Packet.TransferLength = 96; Packet.DataDirection = 0; Status = ScsiPassThru->PassThru (ScsiPassThru, Target, Lun, &Packet, Event); if (!(ScsiPassThru->Mode->Attributes & EFI_SCSI_PASS_THRU_ATTRIBUTES_NONBLOCKIO)) { if (!EFI_ERROR(Status) && (EnterEvent == 0)) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } } else { // // wait for event being signaled. // gtBS->Stall(EfiScsiStallSeconds (3)); if (!EFI_ERROR(Status) && (EnterEvent == 1)) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestFunctionAssertionGuid007, L"EFI_SCSI_PASS_THRU_PROTOCOL.PassThru - Call PassThru() with Event", L"%a:%d:Status - %r, Target - %d, Lun - %ld\n", __FILE__, (UINTN)__LINE__, Status, Target, Lun ); // Close the event Status = gtBS->CloseEvent (Event); if (EFI_ERROR(Status)) { return EFI_UNSUPPORTED; } FreePool (Data); return EFI_SUCCESS; }
// // TDS 3.5 // EFI_STATUS BBTestResetTargetFunctionAutoTest ( IN EFI_BB_TEST_PROTOCOL *This, IN VOID *ClientInterface, IN EFI_TEST_LEVEL TestLevel, IN EFI_HANDLE SupportHandle ) { EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib; EFI_STATUS Status; EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_TEST_ASSERTION AssertionType; UINT32 Target; UINT64 Lun; // // Get the Standard Library Interface // Status = gtBS->HandleProtocol ( SupportHandle, &gEfiStandardTestLibraryGuid, &StandardLib ); if ( EFI_ERROR(Status) ) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.HandleProtocol - Handle standard test library", L"%a:%d:Status - %r\n", __FILE__, (UINTN)__LINE__, Status ); return Status; } ScsiPassThru = (EFI_SCSI_PASS_THRU_PROTOCOL *)ClientInterface; // // Assertion Point 3.5.2.1 // Call ResetTarget(). // Target = 0xFFFFFFFF; Status = GetPresentTargetLun(ScsiPassThru, &Target, &Lun); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"Can't Get any Scsi Device", L"%a:%d:Status - %r\n", __FILE__, (UINTN)__LINE__, Status ); return EFI_UNSUPPORTED; } Status = ScsiPassThru->ResetTarget (ScsiPassThru, Target, Lun); if (Status == EFI_SUCCESS || Status == EFI_UNSUPPORTED) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestFunctionAssertionGuid005, L"EFI_SCSI_PASS_THRU_PROTOCOL.ResetTarget - Invoke ResetTarget() and verify interface correctness within test case", L"%a:%d:Status - %r, Target - %d, Lun - %ld\n", __FILE__, (UINTN)__LINE__, Status, Target, Lun ); return EFI_SUCCESS; }
// // TDS 3.3 // EFI_STATUS BBTestGetTargetLunFunctionAutoTest ( IN EFI_BB_TEST_PROTOCOL *This, IN VOID *ClientInterface, IN EFI_TEST_LEVEL TestLevel, IN EFI_HANDLE SupportHandle ) { EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib; EFI_STATUS Status; EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_TEST_ASSERTION AssertionType; UINT32 Target; UINT64 Lun; UINT32 NewTarget; UINT64 NewLun; EFI_DEVICE_PATH_PROTOCOL *DevicePath; // // Get the Standard Library Interface // Status = gtBS->HandleProtocol ( SupportHandle, &gEfiStandardTestLibraryGuid, &StandardLib ); if ( EFI_ERROR(Status) ) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.HandleProtocol - Handle standard test library", L"%a:%d:Status - %r\n", __FILE__, (UINTN)__LINE__, Status ); return Status; } ScsiPassThru = (EFI_SCSI_PASS_THRU_PROTOCOL *)ClientInterface; // // Assertion Point 3.3.2.1 // Call GetTargetLun(). // Target = 0xFFFFFFFF; Status = GetPresentTargetLun(ScsiPassThru, &Target, &Lun); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"Can't Get any Scsi Device", L"%a:%d:Status - %r\n", __FILE__, (UINTN)__LINE__, Status ); return EFI_UNSUPPORTED; } // // Get the valid Device Path Node. // Status = ScsiPassThru->BuildDevicePath (ScsiPassThru, Target, Lun, &DevicePath); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"EFI_SCSI_PASS_THRU_PROTOCOL.BuildDevicePath", L"%a:%d:Status - %r, Target - %d, Lun - %ld\n", __FILE__, (UINTN)__LINE__, Status, Target, Lun ); return EFI_UNSUPPORTED; } Status = ScsiPassThru->GetTargetLun (ScsiPassThru, DevicePath, &NewTarget, &NewLun); //Free the DevicePath. gtBS->FreePool (DevicePath); if ((!EFI_ERROR(Status)) && (NewTarget == Target) && (NewLun == Lun)) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gScsiPassThruBBTestFunctionAssertionGuid003, L"EFI_SCSI_PASS_THRU_PROTOCOL.GetTargetLun - Invoke GetTargetLun() and verify interface correctness within test case", L"%a:%d:Status - %r, Target - %d, Lun - %ld, NewTarget - %d, NewLun - %ld\n", __FILE__, (UINTN)__LINE__, Status, Target, Lun, NewTarget, NewLun ); return EFI_SUCCESS; }