// // 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 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; }