kerneltest/e32test/dmav2/dma2_sim.cpp
changeset 243 c7a0ce20c48c
parent 199 189ece41fa29
--- a/kerneltest/e32test/dmav2/dma2_sim.cpp	Mon Jul 26 10:52:56 2010 +0100
+++ b/kerneltest/e32test/dmav2/dma2_sim.cpp	Fri Aug 06 16:34:38 2010 +0100
@@ -31,6 +31,12 @@
 static const TInt KMemAlignMask = 0; // memory addresses passed to DMAC must be multiple of 8
 static const TInt KDesCount = 160;				// Initial DMA descriptor count
 
+#define TEST_RETURN(X) if (!(X))\
+	{\
+	__KTRACE_OPT(KPANIC, Kern::Printf("Simulated Dma test failure: " __FILE__ " line %d", __LINE__));\
+	return KErrAbort;\
+	}
+
 class TDmaDesc
 //
 // Hardware DMA descriptor
@@ -101,10 +107,14 @@
 // Simulated channel
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+An interface class to add simulation specific functionallity to any DMA channel
+*/
 class MSimChannel
 	{
 public:
-	virtual void PreOpen() {}
+	virtual TInt PreOpen() =0;
+	virtual TDmaChannel& Channel() =0;
 	};
 
 //////////////////////////////////////////////////////////////////////////////
@@ -168,9 +178,11 @@
 	void DoCancelAll();
 
 	void CallDefaultVirtuals();
+	TInt CheckExtensionStubs();
 
 	// From MSimChannel
-	void PreOpen();
+	TInt PreOpen();
+	TDmaChannel& Channel() {return *this;}
 	};
 
 void TEmptyChannel::DoCancelAll()
@@ -192,9 +204,23 @@
 	QueuedRequestCountChanged();
 	}
 
-void TEmptyChannel::PreOpen()
+TInt TEmptyChannel::CheckExtensionStubs()
+	{
+	DMA_PSL_TRACE("Calling extension stubs");
+
+	TInt r = Extension(0, NULL);
+	TEST_RETURN(r == KErrNotSupported)
+
+	r = StaticExtension(0, NULL);
+	TEST_RETURN(r == KErrNotSupported)
+
+	return KErrNone;
+	}
+
+TInt TEmptyChannel::PreOpen()
 	{
 	CallDefaultVirtuals();
+	return CheckExtensionStubs();
 	}
 
 //////////////////////////////////////////////////////////////////////////////
@@ -258,8 +284,6 @@
 //
 	: TDmac(aInfo)
 	{
-	// TODO remove this once DMAC can be created and destroyed from test LDD entry
-	// point
 	TInt r = Create(aInfo);
 	__NK_ASSERT_ALWAYS(r == KErrNone);
 
@@ -554,8 +578,6 @@
 //
 	: TDmac(KInfo)
 	{
-	// TODO remove this once DMAC can be created and destroyed from test LDD entry
-	// point
 	TInt r = Create();
 	__NK_ASSERT_ALWAYS(r == KErrNone);
 	}
@@ -654,15 +676,15 @@
 
 struct TChanEntry
 	{
-	TChanEntry(TDmac& aController, TDmaChannel& aChannel, const SDmacCaps& aCaps)
+	TChanEntry(TDmac& aController, MSimChannel& aChannel, const SDmacCaps& aCaps)
 		:
 			iController(aController),
-			iChannel(aChannel),
+			iSimChannel(aChannel),
 			iCaps(aCaps)
 	{}
 
 	TDmac& iController;
-	TDmaChannel& iChannel;
+	MSimChannel& iSimChannel;
 	const SDmacCaps& iCaps;
 	};
 
@@ -686,7 +708,7 @@
 	__DMA_ASSERTA(aOpenId < static_cast<TUint32>(KChannelCount));
 
 	const TChanEntry& entry = ChannelTable[aOpenId];
-	TDmaChannel* pC = &entry.iChannel;
+	TDmaChannel* pC = &entry.iSimChannel.Channel();
 	if (pC->IsOpened())
 		{
 		pC = NULL;
@@ -702,9 +724,19 @@
 		// as taken
 		Signal();
 
-		static_cast<TEmptyChannel*>(pC)->PreOpen();
+		TInt r = entry.iSimChannel.PreOpen();
 
 		Wait();
+
+		// If there was an error
+		// Close channel after retaking mutex
+		if(r != KErrNone)
+			{
+			pC->iController = NULL;
+			pC = NULL;
+			}
+
+
 		}
 	return pC;
 	}