From 2cb307c7d583d71d7533bf46a6054292ca98d137 Mon Sep 17 00:00:00 2001 From: Andrei-Liviu Simion Date: Mon, 9 Feb 2015 14:53:36 -0700 Subject: [PATCH] dp: tx: Ensure that for AUX transactions, the received bytes matches. Verify that the AUX transaction replied with the expected number of bytes. Signed-off-by: Andrei-Liviu Simion --- XilinxProcessorIPLib/drivers/dp/src/xdp.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/XilinxProcessorIPLib/drivers/dp/src/xdp.c b/XilinxProcessorIPLib/drivers/dp/src/xdp.c index 25a7354b..7ce9d974 100644 --- a/XilinxProcessorIPLib/drivers/dp/src/xdp.c +++ b/XilinxProcessorIPLib/drivers/dp/src/xdp.c @@ -2963,6 +2963,7 @@ static u32 XDp_TxAuxRequest(XDp *InstancePtr, XDp_AuxTransaction *Request) *******************************************************************************/ static u32 XDp_TxAuxRequestSend(XDp *InstancePtr, XDp_AuxTransaction *Request) { + u32 TimeoutCount; u32 Status; u8 Index; @@ -3012,6 +3013,20 @@ static u32 XDp_TxAuxRequestSend(XDp *InstancePtr, XDp_AuxTransaction *Request) if ((Request->CmdCode == XDP_TX_AUX_CMD_READ) || (Request->CmdCode == XDP_TX_AUX_CMD_I2C_READ) || (Request->CmdCode == XDP_TX_AUX_CMD_I2C_READ_MOT)) { + + /* Wait until all data has been received. */ + TimeoutCount = 0; + do { + Status = XDp_ReadReg(InstancePtr->Config.BaseAddr, + XDP_TX_REPLY_DATA_COUNT); + + XDp_WaitUs(InstancePtr, 100); + TimeoutCount++; + if (TimeoutCount >= XDP_AUX_MAX_TIMEOUT_COUNT) { + return XST_ERROR_COUNT_MAX; + } + } while (Status != Request->NumBytes); + /* Obtain the read data from the reply FIFO. */ for (Index = 0; Index < Request->NumBytes; Index++) { Request->Data[Index] = XDp_ReadReg(