kernel/eka/drivers/usbc/usbdma.cpp
changeset 33 0173bcd7697c
parent 0 a41df078684a
child 102 ef2a444a7410
child 256 c1f20ce4abcf
equal deleted inserted replaced
31:56f325a607ea 33:0173bcd7697c
   125 TDmaBuf::~TDmaBuf()
   125 TDmaBuf::~TDmaBuf()
   126 	{
   126 	{
   127 	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::~TDmaBuf()"));
   127 	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::~TDmaBuf()"));
   128 	}
   128 	}
   129 
   129 
   130 
       
   131 TUint8* TDmaBuf::SetBufferBase(TUint8* aBase)
       
   132 	{
       
   133 	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::SetBufferBase base=0x%08x size=0x%08x", aBase, iBufSz));
       
   134 	TUint8* bufPtr = aBase;
       
   135 	iBufBasePtr = aBase;
       
   136 	for (TInt i = 0; i < iNumberofBuffers; i++)
       
   137 		{
       
   138 		iDrainable[i] = iCanBeFreed[i] = EFalse;
       
   139 		iBuffers[i] = bufPtr;
       
   140 		iBufferPhys[i] = Epoc::LinearToPhysical((TLinAddr)bufPtr);
       
   141 		bufPtr += iBufSz;
       
   142 		__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::SetBufferBase() iBuffers[%d]=0x%08x", i, iBuffers[i]));
       
   143 		}
       
   144 	return bufPtr;
       
   145 	}
       
   146 
       
   147 
       
   148 TInt TDmaBuf::BufferTotalSize() const
   130 TInt TDmaBuf::BufferTotalSize() const
   149 	{
   131 	{
   150 	return iBufSz * iNumberofBuffers;
   132 	return iBufSz * iNumberofBuffers;
   151 	}
   133 	}
   152 
   134 
   153 
   135 TInt TDmaBuf::BufferSize() const
   154 TUint8* TDmaBuf::BufferBase() const
   136     {
   155 	{
   137     return iBufSz;
   156 	return iBufBasePtr;
   138     }
   157 	}
   139 
   158 
   140 TInt TDmaBuf::SetBufferAddr(TInt aBufInd, TUint8* aBufAddr)
       
   141     {
       
   142     __ASSERT_DEBUG((aBufInd < iNumberofBuffers),
       
   143                        Kern::Fault(KUsbPanicLdd, __LINE__));
       
   144     iDrainable[aBufInd] = iCanBeFreed[aBufInd] = EFalse;
       
   145     iBuffers[aBufInd] = aBufAddr;
       
   146     iBufferPhys[aBufInd] = Epoc::LinearToPhysical((TLinAddr)aBufAddr);
       
   147     __KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::SetBufferAddr() iBuffers[%d]=0x%08x", aBufInd, iBuffers[aBufInd]));
       
   148     return KErrNone;
       
   149     }
       
   150 
       
   151 TInt TDmaBuf::BufferNumber() const
       
   152     {
       
   153     return iNumberofBuffers;
       
   154     }
   159 
   155 
   160 void TDmaBuf::SetMaxPacketSize(TInt aSize)
   156 void TDmaBuf::SetMaxPacketSize(TInt aSize)
   161 	{
   157 	{
   162 	iMaxPacketSize = aSize;
   158 	iMaxPacketSize = aSize;
   163 	}
   159 	}
   948 	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::TxStoreData 1"));
   944 	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::TxStoreData 1"));
   949 	if (!IsReaderEmpty())
   945 	if (!IsReaderEmpty())
   950 		return KErrInUse;
   946 		return KErrInUse;
   951 
   947 
   952 	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::TxStoreData 2"));
   948 	__KTRACE_OPT(KUSB, Kern::Printf("TDmaBuf::TxStoreData 2"));
   953 	TUint8* logicalDest = iBufBasePtr;
   949 	
   954 	TInt xferSz = Min(aTxLength, BufferTotalSize());
   950 	TInt remainTxLength = aTxLength;
   955 	TPtr8 des(logicalDest, xferSz, xferSz);
   951 	TUint32 bufferOffset = aBufferOffset;
   956 	TInt r = Kern::ThreadBufRead(aThread, aTcb, des, aBufferOffset,KChunkShiftBy0);
   952 	// Store each buffer separately
   957 	if(r != KErrNone)
   953 	for( TInt i=0;(i<iNumberofBuffers)&&(remainTxLength>0);i++)
   958 		Kern::ThreadKill(aThread, EExitPanic, r, KUsbLDDKillCat);
   954 	    {
   959 	return r;
   955 	    TUint8* logicalDest = iBuffers[i];
       
   956 	    TInt xferSz = Min(remainTxLength, iBufSz);
       
   957 	    TPtr8 des(logicalDest, xferSz, xferSz);
       
   958 	    TInt r = Kern::ThreadBufRead(aThread, aTcb, des, bufferOffset, KChunkShiftBy0);
       
   959 	    if(r != KErrNone)
       
   960 	        {
       
   961 	        Kern::ThreadKill(aThread, EExitPanic, r, KUsbLDDKillCat);
       
   962 	        return r;
       
   963 	        }
       
   964 	    remainTxLength -= iBufSz;
       
   965 	    bufferOffset += iBufSz;
       
   966 	    }
       
   967 
       
   968 	return KErrNone;
   960 	}
   969 	}
   961 
   970 
   962 
   971 
   963 TInt TDmaBuf::TxGetNextXfer(TUint8*& aBufferAddr, TInt& aTxLength, TPhysAddr& aBufferPhys)
   972 TInt TDmaBuf::TxGetNextXfer(TUint8*& aBufferAddr, TInt& aTxLength, TPhysAddr& aBufferPhys)
   964 	{
   973 	{