diff -r a232af6b0b1f -r a5496987b1da kernel/eka/drivers/dma/dma2_pil.cpp --- a/kernel/eka/drivers/dma/dma2_pil.cpp Wed Jun 23 12:58:21 2010 +0100 +++ b/kernel/eka/drivers/dma/dma2_pil.cpp Thu Jul 01 17:57:33 2010 +0100 @@ -1708,6 +1708,7 @@ // Revert any previous fragmentation attempt FreeSrcDesList(); FreeDstDesList(); + __DMA_ASSERTD(iSrcDesCount == iDstDesCount); do { // Allocate fragment @@ -1721,6 +1722,7 @@ { break; } + __DMA_ASSERTD(iSrcDesCount == iDstDesCount); // Compute fragment size TUint c = Min(aMaxTransferLen, aCount); __KTRACE_OPT(KDMA, Kern::Printf("c = Min(aMaxTransferLen, aCount) = %d", c)); @@ -1851,7 +1853,7 @@ // Not configured? Call Fragment() first! if (iChannel.iDmacCaps->iAsymHwDescriptors) { - __DMA_ASSERTD((iSrcDesCount < 0) && (iDstDesCount < 0)); + __DMA_ASSERTD((iSrcDesCount > 0) && (iDstDesCount > 0)); } else { @@ -2213,22 +2215,26 @@ (0 <= iDstDesCount) && (iDstDesCount <= iChannel.iMaxDesCount)); if (iSrcDesCount == 0) { + // Not fragmented yet __DMA_ASSERTD(iDstDesCount == 0); __DMA_ASSERTD(!iQueued); __DMA_ASSERTD(!iSrcFirstHdr && !iSrcLastHdr && !iDstFirstHdr && !iDstLastHdr); } + else if (iDstDesCount == 0) + { + // Src side only fragmented yet + __DMA_ASSERTD(iChannel.iController->IsValidHdr(iSrcFirstHdr)); + __DMA_ASSERTD(iChannel.iController->IsValidHdr(iSrcLastHdr)); + } else { + // Src & Dst sides fragmented __DMA_ASSERTD(iChannel.iController->IsValidHdr(iSrcFirstHdr)); __DMA_ASSERTD(iChannel.iController->IsValidHdr(iSrcLastHdr)); __DMA_ASSERTD(iChannel.iController->IsValidHdr(iDstFirstHdr)); __DMA_ASSERTD(iChannel.iController->IsValidHdr(iDstLastHdr)); } - if (iChannel.iDmacCaps->iBalancedAsymSegments) - { - __DMA_ASSERTD(iSrcDesCount == iDstDesCount); - } } else {