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 { |