From ace354f10ba7ca424a96512b634ebee8225014f1 Mon Sep 17 00:00:00 2001 From: Ruiyu Ni Date: Mon, 10 Nov 2014 08:47:49 +0000 Subject: Fix a bug in DebugAgent that hang happens when the ACK for GO is lost. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni Reviewed-by: Jeff Fan git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16322 6f19259b-4bc3-4df7-8a09-765794883524 --- .../DebugAgent/DebugAgentCommon/DebugAgent.c | 27 +++++++++++----------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'SourceLevelDebugPkg/Library') diff --git a/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugAgent.c b/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugAgent.c index a22494f..9987890 100644 --- a/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugAgent.c +++ b/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugAgent.c @@ -605,19 +605,20 @@ ReadRemainingBreakPacket ( return EFI_CRC_ERROR; } Mailbox = GetMailboxPointer(); - if (((DebugHeader->Command & DEBUG_COMMAND_RESPONSE) == 0) && - (DebugHeader->SequenceNo == (UINT8) (Mailbox->HostSequenceNo + 1))) { - // - // Only updagte HostSequenceNo for new command packet - // - UpdateMailboxContent (Mailbox, DEBUG_MAILBOX_HOST_SEQUENCE_NO_INDEX, DebugHeader->SequenceNo); - return EFI_SUCCESS; - } else { - // - // If one old command or response packet received, skip it - // - return EFI_DEVICE_ERROR; + if (IS_REQUEST (DebugHeader)) { + if (DebugHeader->SequenceNo == (UINT8) (Mailbox->HostSequenceNo + 1)) { + // + // Only updagte HostSequenceNo for new command packet + // + UpdateMailboxContent (Mailbox, DEBUG_MAILBOX_HOST_SEQUENCE_NO_INDEX, DebugHeader->SequenceNo); + return EFI_SUCCESS; + } + if (DebugHeader->SequenceNo == Mailbox->HostSequenceNo) { + return EFI_SUCCESS; + } } + + return EFI_DEVICE_ERROR; } /** @@ -1646,7 +1647,7 @@ CommandCommunication ( DebugAgentMsgPrint (DEBUG_AGENT_INFO, "TARGET: Try to get command from HOST...\n"); Status = ReceivePacket ((UINT8 *)DebugHeader, &BreakReceived, NULL, READ_PACKET_TIMEOUT, TRUE); - if (Status != RETURN_SUCCESS || (DebugHeader->Command & DEBUG_COMMAND_RESPONSE) != 0) { + if (Status != RETURN_SUCCESS || !IS_REQUEST (DebugHeader)) { DebugAgentMsgPrint (DEBUG_AGENT_WARNING, "TARGET: Get command[%x] sequenceno[%x] returned status is [%x] \n", DebugHeader->Command, DebugHeader->SequenceNo, Status); DebugAgentMsgPrint (DEBUG_AGENT_WARNING, "TARGET: Get command failed or it's response packet not expected! \n"); ReleaseMpSpinLock (&mDebugMpContext.DebugPortSpinLock); -- cgit v1.1