kernel/eka/drivers/usbc/usbdma.cpp
branchRCL_3
changeset 257 3e88ff8f41d5
parent 256 c1f20ce4abcf
--- a/kernel/eka/drivers/usbc/usbdma.cpp	Tue Aug 31 16:34:26 2010 +0300
+++ b/kernel/eka/drivers/usbc/usbdma.cpp	Wed Sep 01 12:34:56 2010 +0100
@@ -23,11 +23,6 @@
 */
 
 #include <drivers/usbc.h>
-#include "OstTraceDefinitions.h"
-#ifdef OST_TRACE_COMPILER_IN_USE
-#include "usbdmaTraces.h"
-#endif
-
 
 
 #if defined(_DEBUG)
@@ -107,25 +102,20 @@
 		// At most 2 packets (clump of max packet size packets) + possible zlp
 		TUsbcPacketArray* bufPtr = iPacketInfoStorage;
 		// this divides up the packet indexing & packet size array over the number of buffers
-		OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_CONSTRUCT,
-		        "TDmaBuf::Construct() array base=0x%08x", bufPtr );
+		__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::Construct() array base=0x%08x", bufPtr));
 		for (TInt i = 0; i < iNumberofBuffers; i++)
 			{
 			iPacketIndex[i] = bufPtr;
 			bufPtr += KUsbcDmaBufMaxPkts;
 			iPacketSize[i] = bufPtr;
 			bufPtr += KUsbcDmaBufMaxPkts;
-            OstTraceDefExt4( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_CONSTRUCT_DUP1,
-                    "TDmaBuf::Construct() packetIndex[%d]=0x%08x packetSize[%d]=0x%08x",
-                    i, reinterpret_cast<TUint>(iPacketIndex[i]), i, 
-                    reinterpret_cast<TUint>(iPacketSize[i]) );
-
+			__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::Construct() packetIndex[%d]=0x%08x packetSize[%d]=0x%08x",
+											i, iPacketIndex[i], i, iPacketSize[i]));
 			}
 		}
 	else
 		{
-        OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_CONSTRUCT_DUP2,
-                "TDmaBuf::Construct() IN endpoint" );
+		__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::Construct() IN endpoint"));
 		}
 	Flush();
 	return KErrNone;
@@ -134,7 +124,7 @@
 
 TDmaBuf::~TDmaBuf()
 	{
-	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FLOW, TDMABUF_TDMABUF_DES, "TDmaBuf::~TDmaBuf()" );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::~TDmaBuf()"));
 	}
 
 TInt TDmaBuf::BufferTotalSize() const
@@ -154,9 +144,7 @@
     iDrainable[aBufInd] = iCanBeFreed[aBufInd] = EFalse;
     iBuffers[aBufInd] = aBufAddr;
     iBufferPhys[aBufInd] = Epoc::LinearToPhysical((TLinAddr)aBufAddr);
-    OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_SETBUFFERADDR,
-            "TDmaBuf::SetBufferAddr() iBuffers[%d]=0x%08x", aBufInd, 
-            reinterpret_cast<TUint>(iBuffers[aBufInd]) );
+    __KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::SetBufferAddr() iBuffers[%d]=0x%08x", aBufInd, iBuffers[aBufInd]));
     return KErrNone;
     }
 
@@ -173,8 +161,7 @@
 
 void TDmaBuf::Flush()
 	{
-	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_FLUSH,
-	        "TDmaBuf::Flush %x", this );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::Flush %x", this));
 	iRxActive = EFalse;
 	iTxActive = EFalse;
 	iExtractOffset = 0;
@@ -209,16 +196,14 @@
 
 void TDmaBuf::RxSetActive()
 	{
-	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXSETACTIVE, 
-	        "TDmaBuf::RxSetActive %x", this );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::RxSetActive %x", this));
 	iRxActive = ETrue;
 	}
 
 
 void TDmaBuf::RxSetInActive()
 	{
-	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXSETINACTIVE, 
-	        "TDmaBuf::RxSetInActive %x", this );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::RxSetInActive %x", this));
 	iRxActive = EFalse;
 	}
 
@@ -329,8 +314,8 @@
 // used to decide whether a client read can complete straight away
 TBool TDmaBuf::IsReaderEmpty()
 	{
-	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_ISREADEREMPTY, 
-	        "TDmaBuf::IsReaderEmpty iTotalRxPacketsAvail=%d", iTotalRxPacketsAvail);
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::IsReaderEmpty iTotalRxPacketsAvail=%d",
+									iTotalRxPacketsAvail));
 	return (iTotalRxPacketsAvail == 0);
 	}
 
@@ -355,8 +340,8 @@
 	iNumberofPacketsRxRemain[iCurrentFillingBufferIndex] = aNoPacketsRecv;
 #endif
 
-	OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_READXFERCOMPLETE,
-	        "TDmaBuf::ReadXferComplete 2 # of bytes=%d # of packets=%d", iTotalRxBytesAvail, iTotalRxPacketsAvail );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::ReadXferComplete 2 # of bytes=%d # of packets=%d",
+									iTotalRxBytesAvail, iTotalRxPacketsAvail));
 	iDrainable[iCurrentFillingBufferIndex] = ETrue;
 	iError[iCurrentFillingBufferIndex] = aErrorCode;
 	AddToDrainQueue(iCurrentFillingBufferIndex);
@@ -370,17 +355,15 @@
 TInt TDmaBuf::RxGetNextXfer(TUint8*& aBufferAddr, TUsbcPacketArray*& aIndexArray,
 							TUsbcPacketArray*& aSizeArray, TInt& aLength, TPhysAddr& aBufferPhys)
 	{
-	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXGETNEXTXFER,
-	        "TDmaBuf::RxGetNextXfer 1" );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::RxGetNextXfer 1"));
 	if (RxIsActive())
 		{
-        OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXGETNEXTXFER_DUP1,
-                " ---> RxIsActive, returning" );
+		__KTRACE_OPT(KUSB, Kern::Printf(" ---> RxIsActive, returning"));
 		return KErrInUse;
 		}
 
-    OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXGETNEXTXFER_DUP2,
-            "TDmaBuf::RxGetNextXfer Current buffer=%d", iCurrentFillingBufferIndex );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::RxGetNextXfer Current buffer=%d",
+									iCurrentFillingBufferIndex));
 	if (iDrainable[iCurrentFillingBufferIndex])
 		{
 		// If the controller refused the last read request, then the current buffer will still be marked
@@ -392,8 +375,8 @@
 			}
 		}
 
-    OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXGETNEXTXFER_DUP3,
-            "TDmaBuf::RxGetNextXfer New buffer=%d", iCurrentFillingBufferIndex );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::RxGetNextXfer New buffer=%d",
+									iCurrentFillingBufferIndex));
 	aBufferAddr = iBuffers[iCurrentFillingBufferIndex];
 	aBufferPhys = iBufferPhys[iCurrentFillingBufferIndex];
 	aIndexArray = iPacketIndex[iCurrentFillingBufferIndex];
@@ -410,8 +393,7 @@
 
 TInt TDmaBuf::RxCopyPacketToClient(DThread* aThread, TClientBuffer *aTcb, TInt aLength)
 	{
-    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXCOPYPACKETTOCLIENT,
-            "TDmaBuf::RxCopyPacketToClient 1" );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::RxCopyPacketToClient 1"));
 
 #if defined(USBC_LDD_BUFFER_TRACE)
 	const TInt numPkts = NoRxPackets();
@@ -421,26 +403,25 @@
 
 	if (numPkts != numPktsAlt)
 		{
-	    OstTraceExt2( TRACE_NORMAL, TDMABUF_RXCOPYPACKETTOCLIENT_DUP1,
-	            "TDmaBuf::RxCopyPacketToClient: Error: #pkts mismatch global=%d actual=%d",
-	            numPkts, numPktsAlt);
+		Kern::Printf(
+			"TDmaBuf::RxCopyPacketToClient: Error: #pkts mismatch global=%d actual=%d",
+			numPkts, numPktsAlt);
 		}
 	if (numBytes != numBytesAlt)
 		{
-        OstTraceExt2( TRACE_NORMAL, TDMABUF_RXCOPYPACKETTOCLIENT_DUP2,
-                "TDmaBuf::RxCopyPacketToClient: Error: #bytes mismatch global=%d actual=%d",
-                numBytes, numBytesAlt);
-
+		Kern::Printf(
+			"TDmaBuf::RxCopyPacketToClient: Error: #bytes mismatch global=%d actual=%d",
+			numBytes, numBytesAlt);
 		}
 	if ((numPkts == 0) && (numBytes !=0))
 		{
-    OstTraceExt2( TRACE_NORMAL, TDMABUF_RXCOPYPACKETTOCLIENT_DUP3,
+		Kern::Printf(
 			"TDmaBuf::RxCopyPacketToClient: Error: global bytes & pkts mismatch pkts=%d bytes=%d",
 			numPkts, numBytes);
 		}
 	if ((numPktsAlt == 0) && (numBytesAlt !=0))
 		{
-    OstTraceExt2( TRACE_NORMAL, TDMABUF_RXCOPYPACKETTOCLIENT_DUP4,
+		Kern::Printf(
 			"TDmaBuf::RxCopyPacketToClient: Error: actual bytes & pkts mismatch pkts=%d bytes=%d",
 			numPktsAlt, numBytesAlt);
 		}
@@ -449,8 +430,7 @@
 	if (!NoRxPackets())
 		return KErrNotFound;
 
-    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXCOPYPACKETTOCLIENT_DUP5,
-            "TDmaBuf::RxCopyPacketToClient 2" );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::RxCopyPacketToClient 2"));
 	// the next condition should be true because we have some packets available
 	// coverity[var_tested_neg]
 	if (iCurrentDrainingBufferIndex == KUsbcInvalidBufferIndex)
@@ -524,9 +504,7 @@
 		{
 		r = errorCode;
 		}
-    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXCOPYPACKETTOCLIENT_DUP6,
-            "TDmaBuf::RxCopyPacketToClient 3" );
-
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::RxCopyPacketToClient 3"));
 
 	FreeDrainedBuffers();
 
@@ -538,8 +516,7 @@
 TInt TDmaBuf::RxCopyDataToClient(DThread* aThread, TClientBuffer *aTcb, TInt aLength, TUint32& aDestOffset,
 								 TBool aRUS, TBool& aCompleteNow)
 	{
-	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXCOPYDATATOCLIENT,
-	        "TDmaBuf::RxCopyDataToClient 1" );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::RxCopyDataToClient 1"));
 	aCompleteNow = ETrue;
 
 #if defined(USBC_LDD_BUFFER_TRACE)
@@ -550,25 +527,25 @@
 
 	if (numPkts != numPktsAlt)
 		{
-    OstTraceExt2( TRACE_NORMAL, TDMABUF_RXCOPYDATATOCLIENT_DUP1,
+		Kern::Printf(
 			"TDmaBuf::RxCopyDataToClient: Error: #pkts mismatch global=%d actual=%d",
 			numPkts, numPktsAlt);
 		}
 	if (numBytes != numBytesAlt)
 		{
-    OstTraceExt2( TRACE_NORMAL, TDMABUF_RXCOPYDATATOCLIENT_DUP2,
+		Kern::Printf(
 			"TDmaBuf::RxCopyDataToClient: Error: #bytes mismatch global=%d actual=%d",
 			numBytes, numBytesAlt);
 		}
 	if ((numPkts == 0) && (numBytes != 0))
 		{
-    OstTraceExt2( TRACE_NORMAL, TDMABUF_RXCOPYDATATOCLIENT_DUP3,
+		Kern::Printf(
 			"TDmaBuf::RxCopyDataToClient: Error: global bytes & pkts mismatch pkts=%d bytes=%d",
 			numPkts, numBytes);
 		}
 	if ((numPktsAlt == 0) && (numBytesAlt != 0))
 		{
-    OstTraceExt2( TRACE_NORMAL, TDMABUF_RXCOPYDATATOCLIENT_DUP4,
+		Kern::Printf(
 			"TDmaBuf::RxCopyDataToClient: Error: actual bytes & pkts mismatch pkts=%d bytes=%d",
 			numPktsAlt, numBytesAlt);
 		}
@@ -589,9 +566,8 @@
 		if (!NextDrainableBuffer())
 			{
 #if defined(USBC_LDD_BUFFER_TRACE)
-            OstTraceExt2( TRACE_NORMAL, TDMABUF_RXCOPYDATATOCLIENT_DUP5,
-                    "TDmaBuf::RxCopyDataToClient: Error:  No buffer draining=%d, packets=%d",
-				    iCurrentDrainingBufferIndex, iTotalRxPacketsAvail);
+			Kern::Printf("TDmaBuf::RxCopyDataToClient: Error:  No buffer draining=%d, packets=%d",
+						 iCurrentDrainingBufferIndex, iTotalRxPacketsAvail);
 #endif
 			return KErrNotFound;
 			}
@@ -603,13 +579,11 @@
 		
 	if (iDrainingOrder != iFillingOrderArray[iCurrentDrainingBufferIndex])
 		{
-        OstTrace1( TRACE_NORMAL, TDMABUF_RXCOPYDATATOCLIENT_DUP6,
-		        "!!! Out of Order Draining TDmaBuf::RxCopyDataToClient 10 draining=%d",
-			    iCurrentDrainingBufferIndex);
+		Kern::Printf("!!! Out of Order Draining TDmaBuf::RxCopyDataToClient 10 draining=%d",
+					 iCurrentDrainingBufferIndex);
 		}
 #endif
-    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_RXCOPYDATATOCLIENT_DUP7,
-            "TDmaBuf::RxCopyDataToClient 2" );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::RxCopyDataToClient 2"));
 
 	TUint8* blockStartAddr = iCurrentDrainingBuffer + iCurrentPacketIndexArray[iCurrentPacket] + iExtractOffset;
 	TUint8* lastEndAddr = blockStartAddr;					// going to track the contiguity of the memory
@@ -629,9 +603,8 @@
 			bufnum = iCurrentDrainingBufferIndex;
 			if (iDrainingOrder != iFillingOrderArray[iCurrentDrainingBufferIndex])
 				{
-                OstTrace1( TRACE_NORMAL, TDMABUF_RXCOPYDATATOCLIENT_DUP8,
-				        "!!! Out of Order Draining TDmaBuf::RxCopyDataToClient 20 draining=%d",
-					    iCurrentDrainingBufferIndex);
+				Kern::Printf("!!! Out of Order Draining TDmaBuf::RxCopyDataToClient 20 draining=%d",
+							 iCurrentDrainingBufferIndex);
 				}
 			}
 #endif
@@ -646,14 +619,7 @@
 			{
 			if (iEndpointType == KUsbEpTypeBulk)
 				{
-                if(iExtractOffset & maxPacketSizeMask)
-                	{
-                    isShortPacket = ((size+iExtractOffset) < iMaxPacketSize) || ((size+iExtractOffset) & maxPacketSizeMask);
-                	}
-                else
-                	{
-                    isShortPacket = (size < iMaxPacketSize) || (size & maxPacketSizeMask);
-                	}
+				isShortPacket = (size < iMaxPacketSize) || (size & maxPacketSizeMask);
 				}
 			else
 				{
@@ -762,9 +728,9 @@
 		TUint& pktsRemain = iNumberofPacketsRxRemain[iCurrentDrainingBufferIndex];
 		if ((bytesRemain != 0) || (pktsRemain != 0))
 			{
-			OstTraceExt3( TRACE_NORMAL, TDMABUF_NEXTDRAINABLEBUFFER,
-				    "TDmaBuf::NextDrainableBuffer: Error: data discarded buffer=%d pkts=%d bytes=%d",
-				    iCurrentDrainingBufferIndex, pktsRemain, bytesRemain);
+			Kern::Printf(
+				"TDmaBuf::NextDrainableBuffer: Error: data discarded buffer=%d pkts=%d bytes=%d",
+				iCurrentDrainingBufferIndex, pktsRemain, bytesRemain);
 			bytesRemain = 0;
 			pktsRemain = 0;
 			}
@@ -846,8 +812,7 @@
 TBool TDmaBuf::ShortPacketExists()
 	{
 	// Actually, a short packet or residue data
-	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_SHORTPACKETEXISTS,
-	        "TDmaBuf::ShortPacketExists 1" );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::ShortPacketExists 1"));
 	TInt index = iCurrentDrainingBufferIndex;
 	TUsbcPacketArray* pktSizeArray = iCurrentPacketSizeArray;
 
@@ -865,7 +830,17 @@
 		if (iEndpointType == KUsbEpTypeBulk)
 			{
 			const TInt mask = iMaxPacketSize - 1;
+			if (iTotalRxBytesAvail & mask)
+				return ETrue;
 
+			// residue==0; this can be because
+			// zlps exist, or short packets combine to n * max_packet_size
+			// This means spadework
+			const TInt s = iCurrentPacketSizeArray[iCurrentPacket] - iExtractOffset;
+			if ((s == 0) || (s & mask))
+				{
+				return ETrue;
+				}
 
 			for (TInt i = 0; i < iNumberofBuffers; i++)
 				{
@@ -926,7 +901,7 @@
 	if (iDrainQueue[iDrainQueueIndex + 1] != KUsbcInvalidBufferIndex)
 		{
 #if defined(USBC_LDD_BUFFER_TRACE)
-		OstTrace0( TRACE_NORMAL, TDMABUF_ADDTODRAINQUEUE, "TDmaBuf::AddToDrainQueue: Error: invalid iDrainQueue[x]" );
+		Kern::Printf("TDmaBuf::AddToDrainQueue: Error: invalid iDrainQueue[x]");
 #endif
 		}
 	iDrainQueue[++iDrainQueueIndex] = aBufferIndex;
@@ -966,13 +941,12 @@
 // We only store 1 transaction, no other buffering is done
 TInt TDmaBuf::TxStoreData(DThread* aThread, TClientBuffer *aTcb, TInt aTxLength, TUint32 aBufferOffset)
 	{
-	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_TXSTOREDATA,
-	        "TDmaBuf::TxStoreData 1" );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::TxStoreData 1"));
 	if (!IsReaderEmpty())
 		return KErrInUse;
 
-	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TDMABUF_TXSTOREDATA_DUP1,
-	        "TDmaBuf::TxStoreData 2" );
+	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::TxStoreData 2"));
+	
 	TInt remainTxLength = aTxLength;
 	TUint32 bufferOffset = aBufferOffset;
 	// Store each buffer separately