mirror of https://github.com/acidanthera/audk.git
[Description]
solve the big file transfer issue using ISCSI [Impaction] change the control flow on IScsiExecuteScsiCommand function [Reference Info] The original design incorrectly uses a timer (its span is usually 2 seconds) to ensure the timely execution of CMD PDU send by initiator. For example: When initiator delivers a CMD PDU(WRITE command) in which the ExpDataXferLength filed is larger than DataSegmentLength field, according to ISCSI protocol spec, the target will respond it with a R2T PDU which is followed by a sequential DATA-OUT PDUs. In this situation, the original code may loop to deal with the arrival packet until initiator receives a RESPONSE PDU or the timer is expired. This way may cause the bigger file is more likely to fail. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5044 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
7b414b4ed6
commit
5c70cb3285
|
@ -2776,6 +2776,7 @@ Returns:
|
|||
Status = EFI_SUCCESS;
|
||||
Tcb = NULL;
|
||||
TimeoutEvent = NULL;
|
||||
Timeout = 0;
|
||||
|
||||
if (Session->State != SESSION_STATE_LOGGED_IN) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
|
@ -2790,15 +2791,6 @@ Returns:
|
|||
|
||||
if (Packet->Timeout != 0) {
|
||||
Timeout = MultU64x32 (Packet->Timeout, 2);
|
||||
//
|
||||
// Start the timeout timer.
|
||||
//
|
||||
Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
TimeoutEvent = Conn->TimeoutEvent;
|
||||
}
|
||||
|
||||
Status = IScsiNewTcb (Conn, &Tcb);
|
||||
|
@ -2854,6 +2846,16 @@ Returns:
|
|||
InBufferContext.InDataLen = Packet->InTransferLength;
|
||||
|
||||
while (!Tcb->StatusXferd) {
|
||||
//
|
||||
// Start the timeout timer.
|
||||
//
|
||||
if (Timeout) {
|
||||
Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto ON_EXIT;
|
||||
}
|
||||
TimeoutEvent = Conn->TimeoutEvent;
|
||||
}
|
||||
//
|
||||
// try to receive PDU from target.
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue