kernel/eka/drivers/usbcsc/d_usbcsc.cpp
branchRCL_3
changeset 257 3e88ff8f41d5
parent 256 c1f20ce4abcf
equal deleted inserted replaced
256:c1f20ce4abcf 257:3e88ff8f41d5
     1 // Copyright (c) 2000-2010 Nokia Corporation and/or its subsidiary(-ies).
     1 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "Eclipse Public License v1.0"
     4 // under the terms of the License "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
    19 
    19 
    20 /**
    20 /**
    21  @file d_usbcsc.cpp
    21  @file d_usbcsc.cpp
    22  @internalTechnology
    22  @internalTechnology
    23 */
    23 */
       
    24 
    24 #include <drivers/usbcsc.h>
    25 #include <drivers/usbcsc.h>
    25 #include "platform.h"
    26 #include "platform.h"
    26 #include "OstTraceDefinitions.h"
       
    27 #ifdef OST_TRACE_COMPILER_IN_USE
       
    28 #include "d_usbcscTraces.h"
       
    29 #endif
       
    30 
       
    31 
    27 
    32 /*****************************************************************************\
    28 /*****************************************************************************\
    33 *   DUsbcScLogDevice                                                          *
    29 *   DUsbcScLogDevice                                                          *
    34 *                                                                             *
    30 *                                                                             *
    35 *   Inherits from DLogicalDevice, the USB Shared Chunk LDD factory class      *
    31 *   Inherits from DLogicalDevice, the USB Shared Chunk LDD factory class      *
    69 TInt DUsbcScLogDevice::Install()
    65 TInt DUsbcScLogDevice::Install()
    70 	{
    66 	{
    71 	// Only proceed if we have the Controller underneath us
    67 	// Only proceed if we have the Controller underneath us
    72 	if (!DUsbClientController::UsbcControllerPointer())
    68 	if (!DUsbClientController::UsbcControllerPointer())
    73 		{
    69 		{
    74 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DUSBCSCLOGDEVICE_INSTALL, "LDD Install: USB Controller Not Present" );
    70 		__KTRACE_OPT(KPANIC, Kern::Printf("LDD Install: USB Controller Not Present"));
    75 		
       
    76 		return KErrGeneral;
    71 		return KErrGeneral;
    77 		}
    72 		}
    78 	return SetName(&KUsbScLddName);
    73 	return SetName(&KUsbScLddName);
    79 	}
    74 	}
    80 
    75 
   101 
    96 
   102 void DfcChunkCleanup(TAny*);
    97 void DfcChunkCleanup(TAny*);
   103 
    98 
   104 TUsbcScChunkInfo::TUsbcScChunkInfo(DLogicalDevice* aLdd)
    99 TUsbcScChunkInfo::TUsbcScChunkInfo(DLogicalDevice* aLdd)
   105 	: 	iChunk(NULL),
   100 	: 	iChunk(NULL),
       
   101 		iCleanup((TDfcFn)&DfcChunkCleanup,this,Kern::SvMsgQue(),0),
   106 		iChunkMem(NULL),
   102 		iChunkMem(NULL),
   107 		iLdd(aLdd)
   103 		iLdd(aLdd)
   108 	{
   104 	{
   109 	iPageNtz = (TInt8)__e32_find_ls1_32(Kern::RoundToPageSize(1));
   105 	iPageNtz = (TInt8)__e32_find_ls1_32(Kern::RoundToPageSize(1));
   110 	}
   106 	}
   123 		TChunkCreateInfo chunkInfo;
   119 		TChunkCreateInfo chunkInfo;
   124 		chunkInfo.iType = TChunkCreateInfo::ESharedKernelMultiple;
   120 		chunkInfo.iType = TChunkCreateInfo::ESharedKernelMultiple;
   125 		chunkInfo.iMaxSize = aTotalSize;
   121 		chunkInfo.iMaxSize = aTotalSize;
   126 		chunkInfo.iMapAttr = EMapAttrCachedMax;
   122 		chunkInfo.iMapAttr = EMapAttrCachedMax;
   127 		chunkInfo.iOwnsMemory = EFalse;
   123 		chunkInfo.iOwnsMemory = EFalse;
   128 		chunkInfo.iDestroyedDfc = NULL;
   124 		chunkInfo.iDestroyedDfc = &iCleanup;
   129 
   125 
   130 		TLinAddr chunkMem;
   126 		TLinAddr chunkMem;
   131 		r = Kern::ChunkCreate(chunkInfo, iChunk, chunkMem, iChunkMapAttr);
   127 		r = Kern::ChunkCreate(chunkInfo, iChunk, chunkMem, iChunkMapAttr);
   132 		iChunkMem = (TInt8*) chunkMem;
   128 		iChunkMem = (TInt8*) chunkMem;
   133 		if (r==KErrNone)
   129 		if (r==KErrNone)
   140 
   136 
   141 // This method requests closing the chunk.
   137 // This method requests closing the chunk.
   142 // Note that nothing may happen immediately, as something else may have the chunk open.
   138 // Note that nothing may happen immediately, as something else may have the chunk open.
   143 void TUsbcScChunkInfo::Close()
   139 void TUsbcScChunkInfo::Close()
   144 {
   140 {
   145 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CLOSE, "TUsbcScChunkInfo::Close %d", iChunk->AccessCount());
   141 	Kern::ChunkClose(iChunk);	
   146 	if (Kern::ChunkClose(iChunk))
       
   147         {
       
   148 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CLOSE_DUP1, "TUsbcScChunkInfo::Close1");
       
   149         ChunkCleanup();    
       
   150 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CLOSE_DUP2, "TUsbcScChunkInfo::Close2");
       
   151         }
       
   152 }
   142 }
   153 
   143 
   154 
   144 
   155 TInt TUsbcScChunkInfo::ChunkAlloc(TInt aOffset, TInt aSize)
   145 TInt TUsbcScChunkInfo::ChunkAlloc(TInt aOffset, TInt aSize)
   156 	{
   146 	{
   158 	TUint rleMask = ~pageMask;
   148 	TUint rleMask = ~pageMask;
   159 	TUint pageSize = rleMask+1;
   149 	TUint pageSize = rleMask+1;
   160 	TInt r;
   150 	TInt r;
   161 	TLinAddr physAddr;
   151 	TLinAddr physAddr;
   162 
   152 
   163 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CHUNKALLOC, "::chunkalloc  AllocPhysicalRam aSize %d", aSize);
   153 	__KTRACE_OPT(KUSB, Kern::Printf("::chunkalloc  AllocPhysicalRam aSize %d", aSize));
   164 
   154 
   165 	r = Epoc::AllocPhysicalRam(aSize, physAddr);
   155 	r = Epoc::AllocPhysicalRam(aSize, physAddr);
   166 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CHUNKALLOC_DUP1, "::chunkalloc AllocPhysicalRam r=%d  (Error!)", r);
   156 	__KTRACE_OPT(KUSB, if (r!=KErrNone) Kern::Printf("::chunkalloc AllocPhysicalRam r=%d  (Error!)", r));
   167 	
       
   168 	if (r==KErrNone)
   157 	if (r==KErrNone)
   169 		{	
   158 		{	
   170 		OstTraceDefExt5(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CHUNKALLOC_DUP2, "T::chunkalloc ChunkCommitPhysical iChunk 0x%x size(%d), aOffset 0x%x, aSize 0x%x phsAddr 0x%x", (TUint)iChunk, sizeof(DChunk), aOffset, aSize,(TUint)physAddr);
   159 		__KTRACE_OPT(KUSB, Kern::Printf("::chunkalloc ChunkCommitPhysical iChunk 0x%x size(%d), aOffset 0x%x, aSize 0x%x phsAddr 0x%x",
       
   160 																	 				iChunk, sizeof(DChunk), aOffset, aSize,physAddr ));
       
   161 
   171 		r = Kern::ChunkCommitPhysical(iChunk, aOffset, aSize, physAddr);
   162 		r = Kern::ChunkCommitPhysical(iChunk, aOffset, aSize, physAddr);
   172 		if (r!=KErrNone)
   163 		__KTRACE_OPT(KUSB, if (r!=KErrNone) Kern::Printf("::chunkalloc ChunkCommitPhysical r=%d  (Error!)", r));
   173 		    OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CHUNKALLOC_DUP3, "::chunkalloc ChunkCommitPhysical r=%d  (Error!)", r);
       
   174 		
       
   175 
   164 
   176 		if (r!=KErrNone)
   165 		if (r!=KErrNone)
   177 				Epoc::FreePhysicalRam(physAddr, aSize);
   166 				Epoc::FreePhysicalRam(physAddr, aSize);
   178 		else 
   167 		else 
   179 			{ // record physical address and length in physical map
   168 			{ // record physical address and length in physical map
   180 			TInt rle;
   169 			TInt rle;
   181 			TInt i=0;
   170 			TInt i=0;
   182 			for (rle=(aSize>>iPageNtz); rle>0; rle--, i++,physAddr+=pageSize) 
   171 			for (rle=(aSize>>iPageNtz); rle>0; rle--, i++,physAddr+=pageSize) 
   183 				{
   172 				{
   184 	            OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CHUNKALLOC_DUP4, "::phys offset 0x%x = 0x%x",
   173 				__KTRACE_OPT(KUSB, Kern::Printf("::phys offset 0x%x = 0x%x",
   185                                                 (TInt32)((aOffset>>iPageNtz)+i), (TUint32)( (physAddr & pageMask) | ((rle>(TInt)rleMask)?(TInt)rleMask:rle)));
   174 												(aOffset>>iPageNtz)+i,  (physAddr & pageMask) | ((rle>(TInt)rleMask)?(TInt)rleMask:rle)));
   186 				iPhysicalMap[(aOffset>>iPageNtz)+i] = (physAddr & pageMask) | ((rle>(TInt)rleMask)?(TInt)rleMask:rle);
   175 				iPhysicalMap[(aOffset>>iPageNtz)+i] = (physAddr & pageMask) | ((rle>(TInt)rleMask)?(TInt)rleMask:rle);
   187 				}
   176 				}
   188 			}
   177 			}
   189 		}
   178 		}
   190 	else if (r==KErrNoMemory)
   179 	else if (r==KErrNoMemory)
   221 	}
   210 	}
   222 
   211 
   223 
   212 
   224 void TUsbcScChunkInfo::ChunkCleanup()
   213 void TUsbcScChunkInfo::ChunkCleanup()
   225 {
   214 {
   226 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCCHUNKINFO_CHUNKCLEANUP, "TUsbcScChunkInfo::ChunkCleanup()" );
   215 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChunkInfo::ChunkCleanup()"));
   227 	
       
   228 	TUint physAddr;
   216 	TUint physAddr;
   229 	TInt length;
   217 	TInt length;
   230 	TInt offset = 0;
   218 	TInt offset = 0;
   231 	
   219 	
   232 	// The part of the field used for the physical page address.
   220 	// The part of the field used for the physical page address.
   253 	ldd->Close(NULL);
   241 	ldd->Close(NULL);
   254 }
   242 }
   255 
   243 
   256 TInt TUsbcScChunkInfo::New(TUsbcScChunkInfo*& aChunk, TInt aSize, DLogicalDevice* aLdd)
   244 TInt TUsbcScChunkInfo::New(TUsbcScChunkInfo*& aChunk, TInt aSize, DLogicalDevice* aLdd)
   257 {
   245 {
   258     OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_NEW, "TUsbcScChunkInfo::New totalSize %d", aSize);
   246 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChunkInfo::New totalSize %d", aSize));
   259     
   247 
   260 	aChunk = new TUsbcScChunkInfo(aLdd);
   248 	aChunk = new TUsbcScChunkInfo(aLdd);
   261 	if (aChunk==NULL)
   249 	if (aChunk==NULL)
   262 		{
   250 		{
   263 		return KErrNoMemory;
   251 		return KErrNoMemory;
   264 		}
   252 		}
   269 		delete aChunk;
   257 		delete aChunk;
   270 		aChunk=NULL;
   258 		aChunk=NULL;
   271 		return r;
   259 		return r;
   272 		}
   260 		}
   273 
   261 
   274 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_NEW_DUP1, "TUsbcScChunkInfo::New Created at 0x%x", aChunk->iChunkMem);
   262 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChunkInfo::New Created at 0x%x",  aChunk->iChunkMem  ));
   275 	
       
   276 	return KErrNone;
   263 	return KErrNone;
   277 }
   264 }
   278 
   265 
   279 // End TUsbcScChunkInfo
   266 // End TUsbcScChunkInfo
   280 
   267 
   347 	if ((iDirection&1)==KUsbcScOut)
   334 	if ((iDirection&1)==KUsbcScOut)
   348 		{
   335 		{
   349 		iBufferStart->iHead= iHead;
   336 		iBufferStart->iHead= iHead;
   350 		iBufferStart->iTail= iHead; // Initially no data!
   337 		iBufferStart->iTail= iHead; // Initially no data!
   351 		iBufferStart->iBilTail=iHead;
   338 		iBufferStart->iBilTail=iHead;
   352 		OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_CREATECHUNKBUFFERHEADER, "Realize:  iHead 0x%x  bufferHeader 0x%x", iHead,(TUint)iBufferStart);
   339 		__KTRACE_OPT(KUSB, Kern::Printf("Realize:  iHead 0x%x  bufferHeader 0x%x", iHead,iBufferStart ));
       
   340 
   353 		// Dont need to round here, as we will round it up on endpoint change. (configuration)
   341 		// Dont need to round here, as we will round it up on endpoint change. (configuration)
   354 		}
   342 		}
   355 }
   343 }
   356 
       
   357 
       
   358 TBool TUsbcScBuffer::IsRequestPending()
       
   359 	{
       
   360 		return iStatusList.IsRequestPending();
       
   361 	}
       
   362 
       
   363 TBool TUsbcScStatusList::IsRequestPending()
       
   364 	{
       
   365 		return (iLength != 0);
       
   366 	}
       
   367 
       
   368 
       
   369 
   344 
   370 /*
   345 /*
   371 TUsbcScBuffer::StartEndpoint
   346 TUsbcScBuffer::StartEndpoint
   372 
   347 
   373 This method sets the nessesary paramenters to the buffer, for use for a particular endpoint.
   348 This method sets the nessesary paramenters to the buffer, for use for a particular endpoint.
   374 
   349 
   375 */
   350 */
   376 void TUsbcScBuffer::StartEndpoint(TUsbcRequestCallback* aRequestInfo, TUint aFlags)
   351 void TUsbcScBuffer::StartEndpoint(TUsbcRequestCallback* aRequestInfo, TUint aFlags)
   377 	{
   352 	{
   378 	OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTENDPOINT, "TUsbcScBuffer::StartEndpoint (0x%x) : ep %d(%d)", (TUint)this,aRequestInfo->iEndpointNum, aRequestInfo->iRealEpNum);
   353 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartEndpoint (0x%x) : ep %d(%d)",this,aRequestInfo->iEndpointNum, aRequestInfo->iRealEpNum));
   379 	
   354 	
   380 	iCallback=aRequestInfo;
   355 	iCallback=aRequestInfo;
   381 	iMaxPacketSize =  iLdd->iController->EndpointPacketSize(iLdd, aRequestInfo->iRealEpNum);
   356 	iMaxPacketSize =  iLdd->iController->EndpointPacketSize(iLdd, aRequestInfo->iRealEpNum);
   382 	iAlignMask = ~(((iMaxPacketSize+1) & 0xFFFFFFF8)-1);
   357 	iAlignMask = ~(((iMaxPacketSize+1) & 0xFFFFFFF8)-1);
   383 	iMode = aFlags;
   358 	iMode = aFlags;
   384 	OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTENDPOINT_DUP1, "TUsbcScBuffer::StartEndpoint : max Packets %d, mask 0x%x flags 0x%x", iMaxPacketSize, iAlignMask, (TUint)iMode);
   359     __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartEndpoint : max Packets %d, mask 0x%x flags 0x%x", iMaxPacketSize, iAlignMask, iMode));
   385 	
       
   386 	if ((iDirection&1)==KUsbcScOut)
   360 	if ((iDirection&1)==KUsbcScOut)
   387 		{
   361 		{
   388 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTENDPOINT_DUP2, "TUsbcScBuffer::UsbcScOut\n" );
   362 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UsbcScOut\n"));
   389 		
       
   390 		// Add dummy packet (doesnt have to be aligned, which avoids what if it changes issue)
   363 		// Add dummy packet (doesnt have to be aligned, which avoids what if it changes issue)
   391 		// And Start next read.
   364 		// And Start next read.
   392 		iNeedsPacket=KEpIsStarting;
   365 		iNeedsPacket=KEpIsStarting;
   393 		}
   366 		}
   394 	}
   367 	}
   395 
   368 
   396 
   369 
   397 
   370 
   398 void TUsbcScBuffer::Destroy()
   371 void TUsbcScBuffer::Destroy()
   399 {
   372 {
   400     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCBUFFER_DESTROY, "TUsbcScBuffer::Destroy()" );
   373 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::Destroy()"));
   401     
       
   402 	Cancel(KErrCancel);
   374 	Cancel(KErrCancel);
   403 	if (iLdd->iController && ((iDirection&1)==KUsbcScOut))  
   375 	if (iLdd->iController && ((iDirection&1)==KUsbcScOut))  
   404 		{  // Me must cancel reads to LDD to, an there will be no list for the callbacks to look into.
   376 		{  // Me must cancel reads to LDD to, an there will be no list for the callbacks to look into.
   405 		iLdd->iController->CancelReadBuffer(iLdd, iCallback->iRealEpNum);
   377 		iLdd->iController->CancelReadBuffer(iLdd, iCallback->iRealEpNum);
   406 		}
   378 		}
   411 
   383 
   412 TInt TUsbcScBuffer::StartDataRead()
   384 TInt TUsbcScBuffer::StartDataRead()
   413 {
   385 {
   414 	if (!iMaxPacketSize)
   386 	if (!iMaxPacketSize)
   415 	{
   387 	{
   416         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD, "TUsbcScBuffer::StartDataRead() - Not Configured" );
   388 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataRead() - Not Configured"));
   417 	
       
   418 		return KErrNone;
   389 		return KErrNone;
   419 	}
   390 	}
   420 	if (iStatusList.iState!=ENotRunning) 
   391 	if (iStatusList.iState!=ENotRunning) 
   421 		{
   392 		{
   422 	    OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD_DUP1, "TUsbcScBuffer::StartDataRead() - Already Stated! (%d)", iStatusList.iState );
   393 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataRead() - Already Stated! (%d)",iStatusList.iState));
   423 	    
       
   424 		return KErrNone;
   394 		return KErrNone;
   425 		}
   395 		}
   426 
   396 
   427 	TInt maxLength;
   397 	TInt maxLength;
   428 	TInt freeSpace;
   398 	TInt freeSpace;
   430 
   400 
   431 	// get next request
   401 	// get next request
   432 	TUsbcScStatusElement* nextJob = iStatusList.Next();
   402 	TUsbcScStatusElement* nextJob = iStatusList.Next();
   433 	if (nextJob == NULL)
   403 	if (nextJob == NULL)
   434 		{
   404 		{
   435 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD_DUP2, "No more jobs");
   405 		__KTRACE_OPT(KUSB, Kern::Printf("No more jobs"));
   436 		
       
   437 		if (iMode && KUsbScCoupledRead)
   406 		if (iMode && KUsbScCoupledRead)
   438 			return KErrEof;
   407 			return KErrEof;
   439 		iStatusList.iState=EReadingAhead;
   408 		iStatusList.iState=EReadingAhead;
   440 		}
   409 		}
   441 	else
   410 	else
   442 		iStatusList.iState=EInProgress;
   411 		iStatusList.iState=EInProgress;
   443 
   412 
   444 	TInt tail = iBufferStart->iTail;
   413 	TInt tail = iBufferStart->iTail;
   445 	TInt headerSize =  sizeof(TUsbcScTransferHeader)-4; // TransferHeader includes 4 bytes of data.
   414 	TInt headerSize =  sizeof(TUsbcScTransferHeader)-4; // TransferHeader includes 4 bytes of data.
   446 	maxLength = iChunkInfo->GetPhysical(iHead + headerSize, &physAddr); //returns all the bytes available after iHead + headerSize)
   415 	maxLength = iChunkInfo->GetPhysical(iHead + headerSize, &physAddr); //returns all the bytes available after iHead + headerSize)
       
   416 
   447 	__ASSERT_DEBUG(maxLength>0,Kern::Fault("TUsbcScBuffer::StartDataRead(", __LINE__)); 
   417 	__ASSERT_DEBUG(maxLength>0,Kern::Fault("TUsbcScBuffer::StartDataRead(", __LINE__)); 
   448 
   418 
   449 
   419 
   450 	if (tail>iHead)  //  # # # H _ _ _ T # # # #
   420 	if (tail>iHead)  //  # # # H _ _ _ T # # # #
   451 		{
   421 		{
   452         OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD_DUP3, "TUsbcScBuffer::StartDataRead() - tail 0x%x>head 0x%x, maxlength 0x%x", (TUint)tail, iHead, maxLength);
   422 		__KTRACE_OPT(KUSB,Kern::Printf("TUsbcScBuffer::StartDataRead() - tail 0x%x>head 0x%x, maxlength 0x%x", tail, iHead, maxLength));
   453         
   423 
   454 		freeSpace = (tail & iAlignMask) - (iHead +headerSize + (~iAlignMask+1) );  // Cant read right up to last buffer, or head/tail will cross.
   424 		freeSpace = (tail & iAlignMask) - (iHead +headerSize + (~iAlignMask+1) );  // Cant read right up to last buffer, or head/tail will cross.
   455 
   425 
   456 		if (freeSpace<iMinReadSize)
   426 		if (freeSpace<iMinReadSize)
   457 			{
   427 			{
   458 			iStatusList.iState=ENotRunning;
   428 			iStatusList.iState=ENotRunning;
   459 			OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD_DUP4, "TUsbcScBuffer::StartDataRead() - Stall!!");
   429 			__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataRead() - Stall!!"));
   460 			
       
   461 			return KErrOverflow; 				// Read STALL !! !! !!
   430 			return KErrOverflow; 				// Read STALL !! !! !!
   462 			}
   431 			}
   463 
   432 
   464 		if (freeSpace<maxLength)
   433 		if (freeSpace<maxLength)
   465 			maxLength = freeSpace;
   434 			maxLength = freeSpace;
   466 		}
   435 		}
   467 	if (maxLength> iMaxReadSize) 
   436 	if (maxLength> iMaxReadSize) 
   468 		maxLength =  iMaxReadSize;
   437 		maxLength =  iMaxReadSize;
   469 	// else  tail<iHead (or empty)      _ _ _ T # # # H _ _ _ _
   438 	// else  tail<iHead (or empty)      _ _ _ T # # # H _ _ _ _
   470 	// We would not have set iHead here if too small. So must be ok.
   439 	// We would not have set iHead here if too small. So must be ok.
       
   440 		
   471 	__ASSERT_DEBUG(maxLength>=iMinReadSize,Kern::Fault("TUsbcScBuffer::StartDataRead(", __LINE__)); 
   441 	__ASSERT_DEBUG(maxLength>=iMinReadSize,Kern::Fault("TUsbcScBuffer::StartDataRead(", __LINE__)); 
   472 
   442 
   473 	TUint8* data = ((TUsbcScTransferHeader *) (iHead + iChunkAddr))->iData.b;
   443 	TUint8* data = ((TUsbcScTransferHeader *) (iHead + iChunkAddr))->iData.b;
   474 	// set up callback stucture
   444 	// set up callback stucture
   475 
   445 
   477 	TInt r;
   447 	TInt r;
   478 	// Go!!
   448 	// Go!!
   479 	r = iLdd->iController->SetupReadBuffer(*iCallback);
   449 	r = iLdd->iController->SetupReadBuffer(*iCallback);
   480 	if (r!=KErrNone)
   450 	if (r!=KErrNone)
   481 		{
   451 		{
   482 	    OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD_DUP5, "SetupReadBuffer Error: %d, RT %d",r, iStatusList.iState);
   452 		__KTRACE_OPT(KUSB,Kern::Printf("SetupReadBuffer Error: %d, RT %d",r, iStatusList.iState));
   483 		iStatusList.Complete(r);
   453 		iStatusList.Complete(r);
   484 		}
   454 		}
   485 	// After this, TUsbcScEndpoint::RequestCallback is called in a DFC.
   455 	// After this, TUsbcScEndpoint::RequestCallback is called in a DFC.
   486 	// This in turn calls either TUsbcScBuffer::CompleteRead.
   456 	// This in turn calls either TUsbcScBuffer::CompleteRead.
   487 	return KErrNone;
   457 	return KErrNone;
   488 }
   458 }
   489 
   459 
   490 
   460 
   491 void TUsbcScBuffer::CompleteRead(TBool aStartNextRead)
   461 void TUsbcScBuffer::CompleteRead(TBool aStartNextRead)
   492 {
   462 {
   493     OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_COMPLETEREAD, "TUsbcScBuffer::CompleteRead buff=%x",this);
   463 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::CompleteRead buff=%x",this));
   494     
   464 
   495     // The first packet always contains the total #of bytes
   465     // The first packet always contains the total #of bytes
   496 	const TInt byteCount = iCallback->iPacketSize[0];
   466 	const TInt byteCount = iCallback->iPacketSize[0];
   497 	const TInt packetCount = iCallback->iRxPackets;
   467 	const TInt packetCount = iCallback->iRxPackets;
   498  	iCallback->iRxPackets=0;
   468  	iCallback->iRxPackets=0;
   499 	TUint flags = 0;
   469 	TUint flags = 0;
   508 // This method "submits" the current transfer, and starts off the next read.
   478 // This method "submits" the current transfer, and starts off the next read.
   509 
   479 
   510 void TUsbcScBuffer::UpdateBufferList(TInt aByteCount,TUint aFlags, TBool aStartNextRead)
   480 void TUsbcScBuffer::UpdateBufferList(TInt aByteCount,TUint aFlags, TBool aStartNextRead)
   511 	{
   481 	{
   512 
   482 
   513     OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST, "TUsbcScBuffer::UpdateBUfferLIst aByteCount %d, flags 0x%x iHead 0x%x", aByteCount, aFlags, (TUint)iHead);
   483 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst aByteCount %d, flags 0x%x iHead 0x%x", aByteCount, aFlags, iHead));
   514     
   484 
   515 	TInt headerSize =  sizeof(TUsbcScTransferHeader)-4; // TransferHeader includes 4 bytes of data.
   485 	TInt headerSize =  sizeof(TUsbcScTransferHeader)-4; // TransferHeader includes 4 bytes of data.
   516 	TLinAddr dummy;
   486 	TLinAddr dummy;
   517 	OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP1, "iHead 0x%x headerSize 0x%x",iHead, headerSize);
   487 	__KTRACE_OPT(KUSB, Kern::Printf("iHead 0x%x headerSize 0x%x",iHead, headerSize));
       
   488 
   518 	// Find iNext
   489 	// Find iNext
   519 
   490 
   520 	TInt next =  iHead +  headerSize + aByteCount; // next unused byte in buffer.
   491 	TInt next =  iHead +  headerSize + aByteCount; // next unused byte in buffer.
   521 	TInt maxLength; 
   492 	TInt maxLength; 
   522 
   493 
   525 		{
   496 		{
   526 		// round up.
   497 		// round up.
   527 		next = (next + headerSize + ~iAlignMask) & iAlignMask;
   498 		next = (next + headerSize + ~iAlignMask) & iAlignMask;
   528 		maxLength = iChunkInfo->GetPhysical(next, &dummy);
   499 		maxLength = iChunkInfo->GetPhysical(next, &dummy);
   529 
   500 
   530 		OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP2, "TUsbcScBuffer::UpdateBUfferLIst  next %x  buffer end %x min-read: %x  maxRun %x", next, iBufferEnd, (TUint)iMinReadSize, (TUint)maxLength);
   501 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst  next %x  buffer end %x min-read: %x  maxRun %x", next, iBufferEnd, iMinReadSize, maxLength));
   531 		    
       
   532 		// At the end of the buffer - wrap it if needbe.
   502 		// At the end of the buffer - wrap it if needbe.
   533 		if ((TUint)(next + iMinReadSize) > iBufferEnd)
   503 		if ((TUint)(next + iMinReadSize) > iBufferEnd)
   534 			{
   504 			{
   535 			next = iFirstPacket;
   505 			next = iFirstPacket;
   536 			continue;
   506 			continue;
   537 			}
   507 			}
   538 		// Not enough space, move onto next block.
   508 		// Not enough space, move onto next block.
   539 		if (maxLength<iMinReadSize) 
   509 		if (maxLength<iMinReadSize) 
   540 			{
   510 			{
   541 			next+=maxLength;
   511 			next+=maxLength;
   542 			OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP3, "TUsbcScBuffer::UpdateBUfferLIst Skip exhausted block. next %x max %d", next, maxLength);
   512 			__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst Skip exhausted block. next %x max %d", next, maxLength));
   543 			        
       
   544 			continue;
   513 			continue;
   545 			}
   514 			}
   546 		}
   515 		}
   547 	while (EFalse);
   516 	while (EFalse);
   548 
   517 
   549 	OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP4, "TUsbcScBuffer::UpdateBUfferLIst next (pre deduct): %x, Fill in header at head: 0x%x,  BuffStart: 0x%x.", next, (TUint)iHead, (TUint)iBufferStart);
   518 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst next (pre deduct): %x, Fill in header at head: 0x%x,  BuffStart: 0x%x.", next, iHead, iBufferStart));
   550 	              
   519 	
   551 	next -=  headerSize;  // Move next back from the data start position, to the header start.
   520 	next -=  headerSize;  // Move next back from the data start position, to the header start.
   552 
   521 
   553 	TUsbcScTransferHeader* header = (TUsbcScTransferHeader*) (iHead + iChunkAddr);
   522 	TUsbcScTransferHeader* header = (TUsbcScTransferHeader*) (iHead + iChunkAddr);
   554 	
   523 	
   555 // Create Header
   524 // Create Header
   561 	header->iBytes=aByteCount;
   530 	header->iBytes=aByteCount;
   562 	header->iNext=next;
   531 	header->iNext=next;
   563 	header->iAltSettingSeq=iLdd->iAsSeq;
   532 	header->iAltSettingSeq=iLdd->iAsSeq;
   564 	header->iAltSetting=iLdd->iAlternateSetting;
   533 	header->iAltSetting=iLdd->iAlternateSetting;
   565 	header->iFlags=aFlags;
   534 	header->iFlags=aFlags;
   566 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP5, "We set next to 0x%x", next);
   535 	__KTRACE_OPT(KUSB, Kern::Printf("We set next to 0x%x", next));
   567 	       
   536 
   568 	iStatusList.iState=ENotRunning;
   537 	iStatusList.iState=ENotRunning;
   569 	if (next==iBufferStart->iTail) //or (othwise is as good as full)
   538 	if (next==iBufferStart->iTail) //or (othwise is as good as full)
   570 		{
   539 		{
   571 			iStalled=next;
   540 			iStalled=next;
   572 		}
   541 		}
   573 	else
   542 	else
   574 		{
   543 		{
   575 
   544 
   576 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP6, "TUsbcScBuffer::UpdateBUfferLIst StartRead?? ");
   545 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst StartRead?? "));
   577 		TInt oldHead=iHead;
   546 		TInt oldHead=iHead;
   578 		iHead = next;
   547 		iHead = next;
   579 
   548 
   580 		if ((aStartNextRead) && (StartDataRead() == KErrOverflow))
   549 		if ((aStartNextRead) && (StartDataRead() == KErrOverflow))
   581 			{ // Oh crumbs, set state as slalled.
   550 			{ // Oh crumbs, set state as slalled.
   593 				}
   562 				}
   594 			}
   563 			}
   595 		else
   564 		else
   596 			{
   565 			{
   597 			iBufferStart->iHead = next;
   566 			iBufferStart->iHead = next;
   598 			OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP7, "TUsbcScBuffer::UpdateBUfferLIst Compleating\n");
   567 			__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst Compleating\n"));
   599 			        
       
   600 			}
   568 			}
   601 		// Complete userside
   569 		// Complete userside
   602 		iStatusList.Complete();
   570 		iStatusList.Complete();
   603 		}  
   571 		}  
   604 	}
   572 	}
   618 	// Add alt setting change packet.
   586 	// Add alt setting change packet.
   619 
   587 
   620 
   588 
   621 	if (StartDataRead() == KErrOverflow)
   589 	if (StartDataRead() == KErrOverflow)
   622 	{
   590 	{
   623         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_POPSTALL, "TUsbcScBuffer::PopStall Warning: Transfer was freed, but still no space!\n");
   591 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::PopStall Warning: Transfer was freed, but still no space!\n"));
   624         
       
   625 	}
   592 	}
   626 
   593 
   627 	iBufferStart->iHead = iHead;
   594 	iBufferStart->iHead = iHead;
   628 	}
   595 	}
   629 
   596 
   630 
   597 
   631 
   598 
   632 void TUsbcScBuffer::StartDataWrite()
   599 void TUsbcScBuffer::StartDataWrite()
   633 	{
   600 	{
   634 	
   601 	
   635 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCBUFFER_STARTDATAWRITE, "TUsbcScBuffer::StartDataWrite()");
   602 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataWrite()"));
   636 	
       
   637 	TUsbcScStatusElement* nextJob = iStatusList.Next();
   603 	TUsbcScStatusElement* nextJob = iStatusList.Next();
   638 	TBool zlpReqd;
   604 	TBool zlpReqd;
   639 	TInt length;
   605 	TInt length;
   640 	TUint start;
   606 	TUint start;
   641 	TUint8* startAddr;
   607 	TUint8* startAddr;
   642 	TInt maxLength;
   608 	TInt maxLength;
   643 	TPhysAddr physAddr;
   609 	TPhysAddr physAddr;
   644 	TInt r;
   610 	TInt r;
   645 	if (!iMaxPacketSize)
   611 	if (!iMaxPacketSize)
   646 	{
   612 	{
   647         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAWRITE_DUP1, "TUsbcScBuffer::StartDataWrite() - Not Configured");
   613 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataWrite() - Not Configured"));
   648 		return;
   614 		return;
   649 	}
   615 	}
   650 
   616 
   651 	if (nextJob == NULL)
   617 	if (nextJob == NULL)
   652 		{
   618 		{
   653 		OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAWRITE_DUP2, "TUsbcScBuffer::StartDataWrite() - No more jobs d=%d", iDirection);
   619 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataWrite() - No more jobs d=%d", iDirection));
   654 		if (iDirection==KUsbcScBiIn) // assume this is EP0, if this is true.
   620 		if (iDirection==KUsbcScBiIn) // assume this is EP0, if this is true.
   655 			{
   621 			{
   656             OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAWRITE_DUP3, "TUsbcScBuffer::StartDataWrite() Queue Read on EP0.");
   622 			__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataWrite() Queue Read on EP0."));	
   657 			// Start other read again.
   623 			// Start other read again.
   658 			iLdd->iBuffers[iLdd->iEP0OutBuff].StartDataRead();
   624 			iLdd->iBuffers[iLdd->iEP0OutBuff].StartDataRead();
   659 			}
   625 			}
   660 		}
   626 		}
   661 	else
   627 	else
   692 		iCallback->SetTxBufferInfo(startAddr, physAddr, length);
   658 		iCallback->SetTxBufferInfo(startAddr, physAddr, length);
   693 		iCallback->iZlpReqd = zlpReqd;
   659 		iCallback->iZlpReqd = zlpReqd;
   694 		r = iLdd->iController->SetupWriteBuffer(*iCallback);
   660 		r = iLdd->iController->SetupWriteBuffer(*iCallback);
   695 		if (r!=KErrNone)
   661 		if (r!=KErrNone)
   696 			{
   662 			{
   697 			OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAWRITE_DUP4, "SetupWriteBUffer Error: %d",r);
   663 			__KTRACE_OPT(KUSB, Kern::Printf("SetupWriteBUffer Error: %d",r));
   698 			            
       
   699 			iStatusList.Complete(r);
   664 			iStatusList.Complete(r);
   700 			}
   665 			}
   701 		}
   666 		}
   702 
   667 
   703 	}
   668 	}
   704 
   669 
   705 void TUsbcScBuffer::CompleteWrite()
   670 void TUsbcScBuffer::CompleteWrite()
   706 	{
   671 	{
   707 	TInt error = iCallback->iError;
   672 	TInt error = iCallback->iError;
   708 	OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_COMPLETEWRITE, "TUsbcScBuffer::CompleteWrite buff=%x, err=%d",(TUint)this, error);
   673 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::CompleteWrite buff=%x, err=%d",this, error));
   709 	iSent+= iCallback->iTxBytes;
   674 	iSent+= iCallback->iTxBytes;
   710 
   675 
   711 	// More to send?
   676 	// More to send?
   712 	if (error || iStatusList.iState!=EFramgementInProgress)
   677 	if (error || iStatusList.iState!=EFramgementInProgress)
   713 		{
   678 		{
   753 		}
   718 		}
   754 	}
   719 	}
   755 
   720 
   756 void TUsbcScBuffer::SendEp0StatusPacket(TInt aState)
   721 void TUsbcScBuffer::SendEp0StatusPacket(TInt aState)
   757 {
   722 {
   758     OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_SENDEP0STATUSPACKET, " TUsbcScBuffer::SendEp0StatusPacket(%d)", aState);
   723 	__KTRACE_OPT(KUSB, Kern::Printf(" TUsbcScBuffer::SendEp0StatusPacket(%d)", aState));
   759     
   724 
   760 	// We need to add a packet to the buffer, so we must stop the pending read, and start
   725 	// We need to add a packet to the buffer, so we must stop the pending read, and start
   761 	// another after we have added out packet.  
   726 	// another after we have added out packet.  
   762 	Ep0CancelLddRead();
   727 	Ep0CancelLddRead();
   763 
   728 
   764 	TUint* state = ((TUsbcScTransferHeader *) (iHead + iChunkAddr))->iData.i;
   729 	TUint* state = ((TUsbcScTransferHeader *) (iHead + iChunkAddr))->iData.i;
   823 	return (iLength==0)?NULL:&(iElements[iHead]);
   788 	return (iLength==0)?NULL:&(iElements[iHead]);
   824 	}
   789 	}
   825 
   790 
   826 TInt TUsbcScStatusList ::Add(TRequestStatus* aStatus, TInt aLength, TUint aStart, TUint aFlags)
   791 TInt TUsbcScStatusList ::Add(TRequestStatus* aStatus, TInt aLength, TUint aStart, TUint aFlags)
   827 	{
   792 	{
   828     OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCSTATUSLIST_ADD, "Adding request.  iLength %d  iSize %d", iLength, iSize);
   793 	__KTRACE_OPT(KUSB,Kern::Printf("Adding request.  iLength %d  iSize %d", iLength, iSize));
   829     
       
   830 	if (iLength<iSize)
   794 	if (iLength<iSize)
   831 		{
   795 		{
   832 		TUsbcScStatusElement& e = iElements[((iHead+iLength) & (iSize-1))];
   796 		TUsbcScStatusElement& e = iElements[((iHead+iLength) & (iSize-1))];
   833 		e.iStatus = aStatus;
   797 		e.iStatus = aStatus;
   834 		e.iLength = aLength;
   798 		e.iLength = aLength;
   835 		e.iStart = aStart;
   799 		e.iStart = aStart;
   836 		e.iFlags = aFlags;
   800 		e.iFlags = aFlags;
   837 		iLength++;
   801 		iLength++;
   838 		OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCSTATUSLIST_ADD_DUP1, "Adding request.  new iLength %d", iLength);
   802 		__KTRACE_OPT(KUSB,Kern::Printf("Adding request.  new iLength %d", iLength));
   839 		    
   803 
   840 		return KErrNone;
   804 		return KErrNone;
   841 		}
   805 		}
   842 	else
   806 	else
   843 		return KErrInUse;
   807 		return KErrInUse;
   844 	}
   808 	}
   881 
   845 
   882 TInt TUsbcScStatusList::Complete(TInt aError)
   846 TInt TUsbcScStatusList::Complete(TInt aError)
   883 	{
   847 	{
   884 	if (iState==ENotRunning)
   848 	if (iState==ENotRunning)
   885 		{
   849 		{
   886         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCSTATUSLIST_COMPLETE_TINT, "TUsbcScStatusList::Complete() - iState == ENotRunning!" );
   850 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScStatusList::Complete() - iState == ENotRunning!"));
   887         
       
   888 		}
   851 		}
   889  	else
   852  	else
   890 		{
   853 		{
   891 		iState=ENotRunning;
   854 		iState=ENotRunning;
   892 		if (iLength==0)
   855 		if (iLength==0)
   908 
   871 
   909 void TUsbcScStatusList::Complete()
   872 void TUsbcScStatusList::Complete()
   910 	{
   873 	{
   911 	if (iLength==0)
   874 	if (iLength==0)
   912 		return;
   875 		return;
   913 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCSTATUSLIST_COMPLETE, "Completing request.  iLength %d", iLength);
   876 	__KTRACE_OPT(KUSB, Kern::Printf("Completing request.  iLength %d", iLength));
   914 	
   877 
   915 	Kern::RequestComplete(iClient, iElements[iHead].iStatus, KErrNone);
   878 	Kern::RequestComplete(iClient, iElements[iHead].iStatus, KErrNone);
   916 
   879 
   917 	iLength--;
   880 	iLength--;
   918 	iHead = ((iHead+1) & (iSize-1));
   881 	iHead = ((iHead+1) & (iSize-1));
   919 	}
       
   920 void TUsbcScStatusList::SetClient(DThread& aThread)
       
   921 	{
       
   922 	iClient = &aThread;
       
   923 	}
   882 	}
   924 
   883 
   925 // End TUsbcScStatusList
   884 // End TUsbcScStatusList
   926 
   885 
   927 /*****************************************************************************\
   886 /*****************************************************************************\
   946 	iAlternateSettingList = aAlternateSettingList;
   905 	iAlternateSettingList = aAlternateSettingList;
   947 	iMaxEndpoints=0;
   906 	iMaxEndpoints=0;
   948 	iTotalSize   =0;
   907 	iTotalSize   =0;
   949 	iTotalBuffers=0;
   908 	iTotalBuffers=0;
   950 	iAltSettings =0;
   909 	iAltSettings =0;
   951 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_INIT, "Realize: work out max endpoint" );
   910 	__KTRACE_OPT(KUSB, Kern::Printf("Realize: work out max endpoint"));
   952 	
       
   953 	// Work out max endpoints and number of alternate settings.
   911 	// Work out max endpoints and number of alternate settings.
   954 
   912 
   955 	if (iAlternateSettingList)
   913 	if (iAlternateSettingList)
   956 		{
   914 		{
   957 		TUsbcScAlternateSetting* alt = iAlternateSettingList->iHead;
   915 		TUsbcScAlternateSetting* alt = iAlternateSettingList->iHead;
   964 			alt = alt->iNext;
   922 			alt = alt->iNext;
   965 			};
   923 			};
   966 		}
   924 		}
   967 	
   925 	
   968 	// Alloc some temporary working space for temp endpoint metadata 
   926 	// Alloc some temporary working space for temp endpoint metadata 
   969 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_INIT_DUP1, "Realize: Alloc temp.  Maxendpoints %d", iMaxEndpoints);
   927 	__KTRACE_OPT(KUSB, Kern::Printf("Realize: Alloc temp.  Maxendpoints %d", iMaxEndpoints));
   970 	    
       
   971 	TInt inout;
   928 	TInt inout;
   972 	for (inout=KUsbcScIn; inout<KUsbcScDirections; inout++)
   929 	for (inout=KUsbcScIn; inout<KUsbcScDirections; inout++)
   973 		{
   930 		{
   974 		iBufs[inout].iEp = (TUsbcScEndpoint **) Kern::AllocZ(iAltSettings*iMaxEndpoints*sizeof(TUsbcScEndpoint *));
   931 		iBufs[inout].iEp = (TUsbcScEndpoint **) Kern::AllocZ(iAltSettings*iMaxEndpoints*sizeof(TUsbcScEndpoint *));
   975 		iBufs[inout].iSizes = (TInt *) Kern::AllocZ(iMaxEndpoints*sizeof(TInt));
   932 		iBufs[inout].iSizes = (TInt *) Kern::AllocZ(iMaxEndpoints*sizeof(TInt));
   987 // Return KErrArgument if the direction field is neither In or Out.
   944 // Return KErrArgument if the direction field is neither In or Out.
   988 //
   945 //
   989 
   946 
   990 TInt TRealizeInfo::CopyAndSortEndpoints()
   947 TInt TRealizeInfo::CopyAndSortEndpoints()
   991 	{
   948 	{
   992     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TREALIZEINFO_COPYANDSORTENDPOINTS, "Realize: copy And sort");
   949 	__KTRACE_OPT(KUSB, Kern::Printf("Realize: copy And sort"));
   993 
   950 
   994 	TInt altSetting = 0;
   951 	TInt altSetting = 0;
   995 	TInt endpointOffs;
   952 	TInt endpointOffs;
   996 	TInt endpoint;
   953 	TInt endpoint;
   997 	TInt altEp;
   954 	TInt altEp;
  1002 
   959 
  1003 	if (iAlternateSettingList)
   960 	if (iAlternateSettingList)
  1004 		{
   961 		{
  1005 		for (alt = iAlternateSettingList->iHead;alt!=NULL;alt = alt->iNext )
   962 		for (alt = iAlternateSettingList->iHead;alt!=NULL;alt = alt->iNext )
  1006 			{		
   963 			{		
  1007             OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP1, "Realize:   AlternateSetting %x", alt);
   964 			__KTRACE_OPT(KUSB, Kern::Printf("Realize:   AlternateSetting %x", alt));
  1008             
   965 
  1009 			iBufs[KUsbcScIn].iEps =0;
   966 			iBufs[KUsbcScIn].iEps =0;
  1010 			iBufs[KUsbcScOut].iEps =0;
   967 			iBufs[KUsbcScOut].iEps =0;
  1011 
   968 
  1012 			// For alt setting, iterate eps
   969 			// For alt setting, iterate eps
  1013 			for (altEp=1; altEp <= alt->iNumberOfEndpoints; altEp++)
   970 			for (altEp=1; altEp <= alt->iNumberOfEndpoints; altEp++)
  1014 				{
   971 				{
  1015                 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP2, "Realize:     Endpoint to add: %d", altEp);
   972 				__KTRACE_OPT(KUSB, Kern::Printf("Realize:     Endpoint to add: %d",altEp));
       
   973 
  1016 				TUsbcScEndpoint* nextEp = alt->iEndpoint[altEp];
   974 				TUsbcScEndpoint* nextEp = alt->iEndpoint[altEp];
  1017 
   975 
  1018 				OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP3, "Realize:      ep Buffer Size: %d",nextEp->EndpointInfo()->iBufferSize);
   976 				__KTRACE_OPT(KUSB, Kern::Printf("Realize:      ep Buffer Size: %d",nextEp->EndpointInfo()->iBufferSize));
  1019 				                
   977 				
  1020 				inout = (nextEp->EndpointInfo()->iDir==KUsbEpDirIn)?KUsbcScIn:
   978 				inout = (nextEp->EndpointInfo()->iDir==KUsbEpDirIn)?KUsbcScIn:
  1021 						(nextEp->EndpointInfo()->iDir==KUsbEpDirOut)?KUsbcScOut:KUsbcScUnknown;
   979 						(nextEp->EndpointInfo()->iDir==KUsbEpDirOut)?KUsbcScOut:KUsbcScUnknown;
  1022 				if (inout==KUsbcScUnknown)
   980 				if (inout==KUsbcScUnknown)
  1023 					{
   981 					{
  1024                     OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP4, "Realize:     KUsbcScUnknown %x",nextEp->EndpointInfo()->iDir);
   982 					__KTRACE_OPT(KUSB, Kern::Printf("Realize:     KUsbcScUnknown %x",nextEp->EndpointInfo()->iDir));
  1025 				                 
       
  1026 					return KErrArgument;
   983 					return KErrArgument;
  1027 					}
   984 					}
  1028 
   985 
  1029 				bufsd = &(iBufs[inout]);
   986 				bufsd = &(iBufs[inout]);
  1030 				OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP5, "Realize:      ep direction: %x # endpoints %d", inout, bufsd->iEps);
   987 				__KTRACE_OPT(KUSB, Kern::Printf("Realize:      ep direction: %x # endpoints %d", inout, bufsd->iEps));
       
   988 
  1031 
   989 
  1032 				// find and position ep, and insert.
   990 				// find and position ep, and insert.
  1033 
   991 
  1034 				if (bufsd->iEps==0) // First entry.
   992 				if (bufsd->iEps==0) // First entry.
  1035 					{
   993 					{
  1036 				    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP6, "Realize:       Add first endpoint");
   994 					__KTRACE_OPT(KUSB, Kern::Printf("Realize:       Add first endpoint"));
  1037 
       
  1038 					endpointOffs = altSetting*iMaxEndpoints;
   995 					endpointOffs = altSetting*iMaxEndpoints;
  1039 					bufsd->iEp[endpointOffs] = nextEp;
   996 					bufsd->iEp[endpointOffs] = nextEp;
  1040 					}
   997 					}
  1041 				else
   998 				else
  1042 					{
   999 					{
  1045 					for (endpoint=bufsd->iEps-1; endpoint>-1; endpoint--)
  1002 					for (endpoint=bufsd->iEps-1; endpoint>-1; endpoint--)
  1046 						{
  1003 						{
  1047 						endpointOffs = altSetting*iMaxEndpoints + endpoint;
  1004 						endpointOffs = altSetting*iMaxEndpoints + endpoint;
  1048 						if (bufsd->iEp[endpointOffs]->EndpointInfo()->iBufferSize < nextEp->EndpointInfo()->iBufferSize)
  1005 						if (bufsd->iEp[endpointOffs]->EndpointInfo()->iBufferSize < nextEp->EndpointInfo()->iBufferSize)
  1049 							{
  1006 							{
  1050                             OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP7, "Realize:       Shift Endpoint %d", endpoint);
  1007 							__KTRACE_OPT(KUSB, Kern::Printf("Realize:       Shift Endpoint %d", endpoint));
       
  1008 		
  1051 							bufsd->iEp[endpointOffs+1] = bufsd->iEp[endpointOffs];
  1009 							bufsd->iEp[endpointOffs+1] = bufsd->iEp[endpointOffs];
  1052 							}
  1010 							}
  1053 						else
  1011 						else
  1054 							{
  1012 							{
  1055                             OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP8, "Realize:       Insert After Endpoint %d", endpoint);
  1013 							__KTRACE_OPT(KUSB, Kern::Printf("Realize:       Insert After Endpoint %d", endpoint));
       
  1014 
  1056 							bufsd->iEp[endpointOffs+1] = nextEp;
  1015 							bufsd->iEp[endpointOffs+1] = nextEp;
  1057 							placed = ETrue;
  1016 							placed = ETrue;
  1058 							break;
  1017 							break;
  1059 							}
  1018 							}
  1060 						} // end for endpoint
  1019 						} // end for endpoint
  1076 // Realize_CopyAndSortEndpoints is used to fill the structure with the informaition
  1035 // Realize_CopyAndSortEndpoints is used to fill the structure with the informaition
  1077 // required.
  1036 // required.
  1078 
  1037 
  1079 void TRealizeInfo::CalcBuffSizes()
  1038 void TRealizeInfo::CalcBuffSizes()
  1080 	{
  1039 	{
  1081     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TREALIZEINFO_CALCBUFFSIZES, "Realize: Calculate Buffers" );
  1040 	__KTRACE_OPT(KUSB, Kern::Printf("Realize: Calculate Buffers"));
  1082     
  1041 
  1083 	TInt endpoint;
  1042 	TInt endpoint;
  1084 	TInt inout;
  1043 	TInt inout;
  1085 	TInt altSetting;
  1044 	TInt altSetting;
  1086 	TUsbcScEndpoint* nextEp;
  1045 	TUsbcScEndpoint* nextEp;
  1087 	TInt bufferSize;
  1046 	TInt bufferSize;
  1088 	TEndpointSortBufs* bufsd;
  1047 	TEndpointSortBufs* bufsd;
  1089 
  1048 
  1090 	for (inout=KUsbcScIn; inout<KUsbcScDirections; inout++)
  1049 	for (inout=KUsbcScIn; inout<KUsbcScDirections; inout++)
  1091 		{
  1050 		{
  1092         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_CALCBUFFSIZES_DUP1, "Realize:   Direction: %d", inout);
  1051 		__KTRACE_OPT(KUSB, Kern::Printf("Realize:   Direction: %d", inout));
       
  1052 
  1093 
  1053 
  1094 		bufsd = &(iBufs[inout]);
  1054 		bufsd = &(iBufs[inout]);
  1095 		// for each row, ie, buffer, find largest buffer need.
  1055 		// for each row, ie, buffer, find largest buffer need.
  1096 		for (endpoint=0; endpoint<iMaxEndpoints; endpoint++)
  1056 		for (endpoint=0; endpoint<iMaxEndpoints; endpoint++)
  1097 			{
  1057 			{
  1098             OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_CALCBUFFSIZES_DUP2, "Realize:     endpoint %d", endpoint);
  1058 			__KTRACE_OPT(KUSB, Kern::Printf("Realize:     endpoint %d", endpoint));
  1099 			TInt bufMaxSize=0;
  1059 			TInt bufMaxSize=0;
  1100 			for (altSetting=0; altSetting< iAltSettings; altSetting++)
  1060 			for (altSetting=0; altSetting< iAltSettings; altSetting++)
  1101 				{
  1061 				{
  1102                 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_CALCBUFFSIZES_DUP3, "Realize:       altSetting %d", altSetting);
  1062 				__KTRACE_OPT(KUSB, Kern::Printf("Realize:       altSetting %d", altSetting));
  1103 				nextEp= bufsd->iEp[altSetting* iMaxEndpoints + endpoint];
  1063 				nextEp= bufsd->iEp[altSetting* iMaxEndpoints + endpoint];
  1104 				if (nextEp!=NULL)
  1064 				if (nextEp!=NULL)
  1105 					{
  1065 					{
  1106 					bufferSize = nextEp->EndpointInfo()->iBufferSize;
  1066 					bufferSize = nextEp->EndpointInfo()->iBufferSize;
  1107 					OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_CALCBUFFSIZES_DUP4, "Realize:       comparing size %d", bufferSize);
  1067 					__KTRACE_OPT(KUSB, Kern::Printf("Realize:       comparing size %d", bufferSize));
  1108 					if (bufferSize> bufMaxSize)
  1068 					if (bufferSize> bufMaxSize)
  1109 						 bufMaxSize = bufferSize;
  1069 						 bufMaxSize = bufferSize;
  1110 					}
  1070 					}
  1111 				} // for altsetting
  1071 				} // for altsetting
  1112 			OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_CALCBUFFSIZES_DUP5, "Realize:     bufMaxSize %d", bufMaxSize);
  1072 			__KTRACE_OPT(KUSB, Kern::Printf("Realize:     bufMaxSize %d", bufMaxSize));
  1113 			bufsd->iSizes[endpoint] = bufMaxSize;
  1073 			bufsd->iSizes[endpoint] = bufMaxSize;
  1114 			if (bufMaxSize>0) 
  1074 			if (bufMaxSize>0) 
  1115 				{
  1075 				{
  1116 				iTotalSize += bufsd->iSizes[endpoint];
  1076 				iTotalSize += bufsd->iSizes[endpoint];
  1117 				iTotalBuffers++;
  1077 				iTotalBuffers++;
  1160 	iAltSettingsTbl->iEpRecordSize = sizeof(TUint);
  1120 	iAltSettingsTbl->iEpRecordSize = sizeof(TUint);
  1161 	iAltSettingsTbl->iNumOfAltSettings = iAltSettings;
  1121 	iAltSettingsTbl->iNumOfAltSettings = iAltSettings;
  1162 
  1122 
  1163 
  1123 
  1164 	TInt tableOffset  = (TUint) iAltSettingsTbl->iAltTableOffset - (TUint) aChunkInfo->iChunkMem + iAltSettings*sizeof(TInt);
  1124 	TInt tableOffset  = (TUint) iAltSettingsTbl->iAltTableOffset - (TUint) aChunkInfo->iChunkMem + iAltSettings*sizeof(TInt);
  1165 	OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_LAYOUTCHUNKHEADER, "Realize: table offset: 0x%x, altTble %x iChnkMem %x altSettings %x",tableOffset, (TUint)iAltSettingsTbl, (TUint)aChunkInfo->iChunkMem, iAltSettings);
  1125 	__KTRACE_OPT(KUSB, Kern::Printf("Realize: table offset: 0x%x, altTble %x iChnkMem %x altSettings %x",tableOffset, iAltSettingsTbl, aChunkInfo->iChunkMem, iAltSettings ));
  1166 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_LAYOUTCHUNKHEADER_DUP1, "Realize: populate chunk - create alt settings table");
  1126 
       
  1127 	__KTRACE_OPT(KUSB, Kern::Printf("Realize: populate chunk - create alt settings table"));
       
  1128 
  1167 	// Create alt settings table.  Set each element of altsettings table, to each induivatual alt setting table.
  1129 	// Create alt settings table.  Set each element of altsettings table, to each induivatual alt setting table.
  1168 	// then fill in the number of endpoints for that alt setting, in the table.
  1130 	// then fill in the number of endpoints for that alt setting, in the table.
  1169 
  1131 
  1170 	TInt* noEpForAlt;
  1132 	TInt* noEpForAlt;
  1171 	TInt altSetting;
  1133 	TInt altSetting;
  1173 	if (iAlternateSettingList)
  1135 	if (iAlternateSettingList)
  1174 		{
  1136 		{
  1175 		alt = iAlternateSettingList->iHead;
  1137 		alt = iAlternateSettingList->iHead;
  1176 		for (altSetting=0; altSetting<iAltSettings; altSetting++) 
  1138 		for (altSetting=0; altSetting<iAltSettings; altSetting++) 
  1177 			{
  1139 			{
  1178                 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_LAYOUTCHUNKHEADER_DUP2, "Realize:   altSetting %d, tableOffset %d", altSetting, tableOffset);
  1140 				__KTRACE_OPT(KUSB, Kern::Printf("Realize:   altSetting %d, tableOffset %d", altSetting, tableOffset));
       
  1141 
  1179 				iAltSettingsTbl->iAltTableOffset[altSetting] = tableOffset;
  1142 				iAltSettingsTbl->iAltTableOffset[altSetting] = tableOffset;
  1180 				noEpForAlt = (TInt*) &aChunkInfo->iChunkMem[tableOffset];
  1143 				noEpForAlt = (TInt*) &aChunkInfo->iChunkMem[tableOffset];
  1181 			 
  1144 			 
  1182 				*noEpForAlt = alt->iNumberOfEndpoints;  // Set NumberofEndpoints field in Altsetting table
  1145 				*noEpForAlt = alt->iNumberOfEndpoints;  // Set NumberofEndpoints field in Altsetting table
  1183 				tableOffset+= sizeof(TInt)+ alt->iNumberOfEndpoints*sizeof(TUsbcScHdrEndpointRecord);
  1146 				tableOffset+= sizeof(TInt)+ alt->iNumberOfEndpoints*sizeof(TUsbcScHdrEndpointRecord);
  1224 	  iChunkInfo(NULL),
  1187 	  iChunkInfo(NULL),
  1225 	  iNumBuffers(-1),
  1188 	  iNumBuffers(-1),
  1226 	  iBuffers(NULL),
  1189 	  iBuffers(NULL),
  1227 	  iEp0Endpoint(NULL)
  1190 	  iEp0Endpoint(NULL)
  1228 	{
  1191 	{
  1229     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_CONS, "DLddUsbcScChannel::DLddUsbcScChannel()" );
  1192 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DLddUsbcScChannel()"));
  1230     
       
  1231 	iClient = &Kern::CurrentThread();
  1193 	iClient = &Kern::CurrentThread();
  1232 	iClient->Open();
  1194 	iClient->Open();
  1233 	for (TInt i = 1; i < KUsbcMaxRequests; i++)
  1195 	for (TInt i = 1; i < KUsbcMaxRequests; i++)
  1234 		{
  1196 		{
  1235 		iRequestStatus[i] = NULL;
  1197 		iRequestStatus[i] = NULL;
  1241 // Destructor
  1203 // Destructor
  1242 //
  1204 //
  1243 
  1205 
  1244 DLddUsbcScChannel::~DLddUsbcScChannel()
  1206 DLddUsbcScChannel::~DLddUsbcScChannel()
  1245 	{
  1207 	{
  1246     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_DES, "DLddUsbcScChannel::~DLddUsbcScChannel()" );
  1208 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::~DLddUsbcScChannel()"));
  1247 	if (iController)
  1209 	if (iController)
  1248 		{
  1210 		{
  1249 		iController->DeRegisterClient(this);
  1211 		iController->DeRegisterClient(this);
  1250 		iStatusCallbackInfo.Cancel();
  1212 		iStatusCallbackInfo.Cancel();
  1251 		iEndpointStatusCallbackInfo.Cancel();
  1213 		iEndpointStatusCallbackInfo.Cancel();
  1262 		if (iStatusFifo!=NULL)
  1224 		if (iStatusFifo!=NULL)
  1263 			{
  1225 			{
  1264 			delete iStatusFifo;
  1226 			delete iStatusFifo;
  1265 			}
  1227 			}
  1266 		}
  1228 		}
  1267 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_DES_DUP1, "Closing buffers" );
  1229 	__KTRACE_OPT(KUSB, Kern::Printf("Closing buffers"));
  1268 	if (iBuffers)
  1230 	if (iBuffers)
  1269 		{
  1231 		{
  1270 		TInt i;
  1232 		TInt i;
  1271 		for (i=0; i<(iNumBuffers+2); i++) 
  1233 		for (i=0; i<(iNumBuffers+2); i++) 
  1272 			{
  1234 			{
  1276 		}
  1238 		}
  1277 
  1239 
  1278 	if (iRealizeCalled)
  1240 	if (iRealizeCalled)
  1279 		{
  1241 		{
  1280 		// Close Chunk
  1242 		// Close Chunk
  1281 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_DES_DUP2, "iChunkInfo->Close()" );
       
  1282 		iChunkInfo->Close();
  1243 		iChunkInfo->Close();
  1283 		// ChunkInfo will delete itself with DFC, but the pointer here is no longer needed.		
  1244 		// ChunkInfo will delete itself with DFC, but the pointer here is no longer needed.		
  1284 		iChunkInfo=NULL;
  1245 		iChunkInfo=NULL;
  1285 		}
  1246 		}
  1286 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_DES_DUP3, "about to SafeClose" );
  1247 	__KTRACE_OPT(KUSB, Kern::Printf("about to SafeClose"));
  1287 	Kern::SafeClose((DObject*&)iClient, NULL);
  1248 	Kern::SafeClose((DObject*&)iClient, NULL);
  1288 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_DES_DUP4, "about to SafeClose1" );
       
  1289 	}
  1249 	}
  1290 
  1250 
  1291 
  1251 
  1292 //
  1252 //
  1293 // DoCreate - Create channel
  1253 // DoCreate - Create channel
  1294 //
  1254 //
  1295 
  1255 
  1296 TInt DLddUsbcScChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer)
  1256 TInt DLddUsbcScChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer)
  1297 	{
  1257 	{
  1298 	OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCREATE, "LDD DoCreateL 1 Ver = %02d %02d %02d",
  1258 	__KTRACE_OPT(KUSB, Kern::Printf("LDD DoCreateL 1 Ver = %02d %02d %02d",
  1299                                     aVer.iMajor, aVer.iMinor, aVer.iBuild);
  1259 									aVer.iMajor, aVer.iMinor, aVer.iBuild));
  1300 	
       
  1301 	if (!Kern::CurrentThreadHasCapability(ECapabilityCommDD,
  1260 	if (!Kern::CurrentThreadHasCapability(ECapabilityCommDD,
  1302 										  __PLATSEC_DIAGNOSTIC_STRING("Checked by USBCSC.LDD (USB Driver)")))
  1261 										  __PLATSEC_DIAGNOSTIC_STRING("Checked by USBCSC.LDD (USB Driver)")))
  1303 		{
  1262 		{
  1304 		return KErrPermissionDenied;
  1263 		return KErrPermissionDenied;
  1305 		}
  1264 		}
  1355 
  1314 
  1356 void DLddUsbcScChannel::HandleMsg(TMessageBase* aMsg)
  1315 void DLddUsbcScChannel::HandleMsg(TMessageBase* aMsg)
  1357 	{
  1316 	{
  1358 	TThreadMessage& m = *(TThreadMessage*)aMsg;
  1317 	TThreadMessage& m = *(TThreadMessage*)aMsg;
  1359 	TInt id = m.iValue;
  1318 	TInt id = m.iValue;
  1360 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_HANDLEMSG, "HandleMsg 0x%x", id);
  1319 	__KTRACE_OPT(KUSB, Kern::Printf("HandleMsg 0x%x", id));
  1361 	
  1320 
  1362 	if (id == (TInt) ECloseMsg)
  1321 	if (id == (TInt) ECloseMsg)
  1363 		{
  1322 		{
  1364 		iChannelClosing = ETrue;
  1323 		iChannelClosing = ETrue;
  1365 		m.Complete(KErrNone, EFalse);
  1324 		m.Complete(KErrNone, EFalse);
  1366 		return;
  1325 		return;
  1367 		}
  1326 		}
  1368 
  1327 
  1369 	TInt r;
  1328 	TInt r;
  1370 	if (aMsg->Client() != iClient)
       
  1371 		{
       
  1372 		m.Complete(KErrAccessDenied, ETrue);
       
  1373 		return;
       
  1374 		}
       
  1375 	if (id < 0)
  1329 	if (id < 0)
  1376 		{
  1330 		{
  1377 		// DoRequest
  1331 		// DoRequest
  1378 		TRequestStatus* pS = (TRequestStatus*) m.Ptr0();
  1332 		TRequestStatus* pS = (TRequestStatus*) m.Ptr0();
  1379 		r = DoRequest(~id, pS, m.Ptr1(), m.Ptr2());
  1333 		r = DoRequest(~id, pS, m.Ptr1(), m.Ptr2());
  1393 		}
  1347 		}
  1394 	}
  1348 	}
  1395 // end HandleMsg.
  1349 // end HandleMsg.
  1396 
  1350 
  1397 
  1351 
       
  1352 #define BREAK_IF_NULL_ARG(a,r) if (a==NULL) { r = KErrArgument; __KTRACE_OPT(KUSB,Kern::Printf("NULL Argument")); break; }
       
  1353 
  1398 //
  1354 //
  1399 // DoRequest - Asynchronous requests
  1355 // DoRequest - Asynchronous requests
  1400 //
  1356 //
  1401 // Overrides pure virtual, called by HandleMsg. (Above)
  1357 // Overrides pure virtual, called by HandleMsg. (Above)
  1402 //
  1358 //
  1404 	{
  1360 	{
  1405 	TInt reqNo = aReqNo & RDevUsbcScClient::KFieldIdMask;
  1361 	TInt reqNo = aReqNo & RDevUsbcScClient::KFieldIdMask;
  1406 	TInt r = KErrNone;  // return via request notify
  1362 	TInt r = KErrNone;  // return via request notify
  1407 	TBool needsCompletion =EFalse;
  1363 	TBool needsCompletion =EFalse;
  1408 
  1364 
  1409 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST, "DoRequest 0x%08x", aReqNo);
  1365 	__KTRACE_OPT(KUSB, Kern::Printf("DoRequest 0x%08x", aReqNo));
  1410 	
  1366 
  1411 	if ((reqNo>RDevUsbcScClient::ERequestReadDataNotify) &&
  1367 	if ((reqNo>RDevUsbcScClient::ERequestReadDataNotify) &&
  1412 		(reqNo<RDevUsbcScClient::ERequestMaxRequests))
  1368 		(reqNo<RDevUsbcScClient::ERequestMaxRequests))
  1413 		{
  1369 		{
  1414 		if (iRequestStatus[reqNo])
  1370 		if (iRequestStatus[reqNo])
  1415 			{
  1371 			{
  1422 	switch (reqNo)
  1378 	switch (reqNo)
  1423 		{
  1379 		{
  1424 	case RDevUsbcScClient::ERequestWriteData:
  1380 	case RDevUsbcScClient::ERequestWriteData:
  1425 		{
  1381 		{
  1426 		TInt buffer =  (aReqNo>>RDevUsbcScClient::KFieldBuffPos)&RDevUsbcScClient::KFieldBuffMask;
  1382 		TInt buffer =  (aReqNo>>RDevUsbcScClient::KFieldBuffPos)&RDevUsbcScClient::KFieldBuffMask;
  1427 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP1, "ERequestWriteData");
  1383 		__KTRACE_OPT(KUSB, Kern::Printf("ERequestWriteData"));
  1428 		if (a2 == NULL)
  1384 		BREAK_IF_NULL_ARG(a2,r);
  1429                 {
       
  1430                 r = KErrArgument;
       
  1431                 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP2, "NULL Argument");
       
  1432                 break;
       
  1433                 }
       
  1434 
  1385 
  1435 		r = DoWriteData( aStatus, buffer, (TInt) a1 /*Start*/, (TInt) a2 /* Length */,
  1386 		r = DoWriteData( aStatus, buffer, (TInt) a1 /*Start*/, (TInt) a2 /* Length */,
  1436 						 aReqNo>>RDevUsbcScClient::KFieldFlagsPos ); // Flags
  1387 						 aReqNo>>RDevUsbcScClient::KFieldFlagsPos ); // Flags
  1437 		break;
  1388 		break;
  1438 		}
  1389 		}
  1439 	case RDevUsbcScClient::ERequestReadDataNotify:
  1390 	case RDevUsbcScClient::ERequestReadDataNotify:
  1440 		{
  1391 		{
  1441 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP3, "ERequestReadDataNotify");
  1392 		__KTRACE_OPT(KUSB, Kern::Printf("ERequestReadDataNotify"));
  1442 		return DoReadDataNotify(aStatus, (TInt) a1, (TInt) a2); // a1 = aBufferNumber, a2 - aLength;
  1393 		return DoReadDataNotify(aStatus, (TInt) a1, (TInt) a2); // a1 = aBufferNumber, a2 - aLength;
  1443 		} 
  1394 		} 
  1444 
  1395 
  1445 	case RDevUsbcScClient::ERequestAlternateDeviceStatusNotify:
  1396 	case RDevUsbcScClient::ERequestAlternateDeviceStatusNotify:
  1446 		{
  1397 		{
  1447 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP4, "ERequestAlternateDeviceStatusNotify");
  1398 		__KTRACE_OPT(KUSB, Kern::Printf("ERequestAlternateDeviceStatusNotify"));
  1448 		if (a1 == NULL)
  1399 		BREAK_IF_NULL_ARG(a1,r);
  1449                 {
       
  1450                 r = KErrArgument;
       
  1451                 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP5, "NULL Argument");
       
  1452                 break;
       
  1453                 }
       
  1454 		iDeviceStatusNeeded = ETrue;
  1400 		iDeviceStatusNeeded = ETrue;
  1455 		iStatusChangePtr = a1;
  1401 		iStatusChangePtr = a1;
  1456 		needsCompletion = AlternateDeviceStateTestComplete();
  1402 		needsCompletion = AlternateDeviceStateTestComplete();
  1457 		break;
  1403 		break;
  1458 		}
  1404 		}
  1459 	case RDevUsbcScClient::ERequestReEnumerate:
  1405 	case RDevUsbcScClient::ERequestReEnumerate:
  1460 		{
  1406 		{
  1461 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP6, "ERequestReEnumerate");
  1407 		__KTRACE_OPT(KUSB, Kern::Printf("ERequestReEnumerate"));
  1462 		// If successful, this will complete via the status notification.
  1408 		// If successful, this will complete via the status notification.
  1463 		r = iController->ReEnumerate();
  1409 		r = iController->ReEnumerate();
  1464 		break;
  1410 		break;
  1465 		}
  1411 		}
  1466 	case RDevUsbcScClient::ERequestEndpointStatusNotify:
  1412 	case RDevUsbcScClient::ERequestEndpointStatusNotify:
  1467 		{
  1413 		{
  1468 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP7, "ERequestEndpointStatusNotify");
  1414 		__KTRACE_OPT(KUSB, Kern::Printf("ERequestEndpointStatusNotify"));
  1469 		if (a1 == NULL)
  1415 		BREAK_IF_NULL_ARG(a1,r);
  1470                 {
  1416 		
  1471                 r = KErrArgument;
       
  1472                 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP8, "NULL Argument");
       
  1473                 break;
       
  1474                 }
       
  1475 		iEndpointStatusChangePtr = a1;
  1417 		iEndpointStatusChangePtr = a1;
  1476 		break;
  1418 		break;
  1477 		}
  1419 		}
  1478 	case RDevUsbcScClient::ERequestOtgFeaturesNotify:
  1420 	case RDevUsbcScClient::ERequestOtgFeaturesNotify:
  1479 		{
  1421 		{
  1480 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP9, "ERequestOtgFeaturesNotify");
  1422 		__KTRACE_OPT(KUSB, Kern::Printf("ERequestOtgFeaturesNotify"));
  1481 		if (a1 == NULL)
  1423 		BREAK_IF_NULL_ARG(a1,r);
  1482                 {
  1424 			
  1483                 r = KErrArgument;
       
  1484                 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP10, "NULL Argument");
       
  1485                 break;
       
  1486                 }	
       
  1487 		iOtgFeatureChangePtr = a1;
  1425 		iOtgFeatureChangePtr = a1;
  1488 		break;
  1426 		break;
  1489 		}
  1427 		}
  1490     default:
  1428     default:
  1491 		r = KErrNotSupported;
  1429 		r = KErrNotSupported;
  1506 //
  1444 //
  1507 // This method sets up the request to facilitate the userside being notifed when new data has been read.
  1445 // This method sets up the request to facilitate the userside being notifed when new data has been read.
  1508 //
  1446 //
  1509 TInt DLddUsbcScChannel::DoReadDataNotify(TRequestStatus* aStatus, TInt aBufferNum, TInt aLength)
  1447 TInt DLddUsbcScChannel::DoReadDataNotify(TRequestStatus* aStatus, TInt aBufferNum, TInt aLength)
  1510 	{
  1448 	{
  1511     OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREADDATANOTIFY, " DLddUsbcScChannel::DoReadDataNotify(x, %d, 0x%x)", aBufferNum, aLength);
  1449 	__KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoReadDataNotify(x, %d, 0x%x)", aBufferNum, aLength));
  1512     
       
  1513 	TInt r = KErrNone;
  1450 	TInt r = KErrNone;
  1514 	// check range
  1451 	// check range
  1515 	if ((aBufferNum<0) ||  (aBufferNum>=iNumBuffers))  // Indirectly checks that we are set up.
  1452 	if ((aBufferNum<0) ||  (aBufferNum>=iNumBuffers))  // Indirectly checks that we are set up.
  1516 		{
  1453 		{
  1517 		if (aBufferNum!=KUsbcScEndpointZero)
  1454 		if (aBufferNum!=KUsbcScEndpointZero)
  1518 			{
  1455 			{
  1519             OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREADDATANOTIFY_DUP1, " DLddUsbcScChannel::DoReadDataNotify : Bad Buffer Number!");
  1456 	        __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoReadDataNotify : Bad Buffer Number!"));
  1520 		    
       
  1521 			return KErrArgument;
  1457 			return KErrArgument;
  1522 			}
  1458 			}
  1523 		else
  1459 		else
  1524 			{
  1460 			{
  1525 			aBufferNum = iEP0OutBuff;
  1461 			aBufferNum = iEP0OutBuff;
  1528 	else
  1464 	else
  1529 		{
  1465 		{
  1530 		// check direction
  1466 		// check direction
  1531 		if (iBuffers[aBufferNum].iDirection!=KUsbcScOut)
  1467 		if (iBuffers[aBufferNum].iDirection!=KUsbcScOut)
  1532 			{
  1468 			{
  1533             OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREADDATANOTIFY_DUP2, " DLddUsbcScChannel::DoReadDataNotify : Bad Buffer Direction!");
  1469    		     __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoReadDataNotify : Bad Buffer Direction!"));
  1534 			return KErrNotSupported;
  1470 			return KErrNotSupported;
  1535 			}
  1471 			}
  1536 		if (!Configured())
  1472 		if (!Configured())
  1537 			return KErrUsbInterfaceNotReady;
  1473 			return KErrUsbInterfaceNotReady;
  1538 		}
  1474 		}
  1539 	SUsbcScBufferHeader* scBuffer = (SUsbcScBufferHeader*) iBuffers[aBufferNum].iBufferStart;
  1475 	SUsbcScBufferHeader* scBuffer = (SUsbcScBufferHeader*) iBuffers[aBufferNum].iBufferStart;
  1540 
  1476 
  1541 	OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREADDATANOTIFY_DUP3, " DLddUsbcScChannel::DoReadDataNotify  head %x tail %x", iBuffers[aBufferNum].iHead , scBuffer->iTail);
  1477 	__KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoReadDataNotify  head %x tail %x", iBuffers[aBufferNum].iHead , scBuffer->iTail ));
       
  1478 
  1542 	if (iBuffers[aBufferNum].iHead != scBuffer->iBilTail)
  1479 	if (iBuffers[aBufferNum].iHead != scBuffer->iBilTail)
  1543 		r = KErrCompletion;
  1480 		r = KErrCompletion;
  1544 	else
  1481 	else
  1545 		if (iBuffers[aBufferNum].iStalled)
  1482 		if (iBuffers[aBufferNum].iStalled)
  1546 			{
  1483 			{
  1554 		{
  1491 		{
  1555 		iBuffers[aBufferNum].StartDataRead();
  1492 		iBuffers[aBufferNum].StartDataRead();
  1556 		}
  1493 		}
  1557 	else
  1494 	else
  1558 		{
  1495 		{
  1559 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREADDATANOTIFY_DUP4, "Job in Progress!");
  1496 		__KTRACE_OPT(KUSB, Kern::Printf("Job in Progress!"));
  1560 		}
  1497 		}
  1561 	return r;
  1498 	return r;
  1562 	}
  1499 	}
  1563 // end DoReadDataNotify.
  1500 // end DoReadDataNotify.
  1564 
  1501 
  1569 //
  1506 //
  1570 // This method sets up the request to write data to USB from userside.
  1507 // This method sets up the request to write data to USB from userside.
  1571 //
  1508 //
  1572 TInt DLddUsbcScChannel::DoWriteData(TRequestStatus* aStatus,TInt aBufferNum, TUint aStart, TUint aLength, TUint aFlags)
  1509 TInt DLddUsbcScChannel::DoWriteData(TRequestStatus* aStatus,TInt aBufferNum, TUint aStart, TUint aLength, TUint aFlags)
  1573 	{
  1510 	{
  1574     OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA, " DLddUsbcScChannel::DoWriteData(%d, 0x%x, 0x%x, 0x%x)",  aBufferNum, aStart, aLength, aFlags);
  1511 	__KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoWriteData(%d, 0x%x, 0x%x, 0x%x)",  aBufferNum, aStart, aLength, aFlags));
  1575     
       
  1576 	if (!iUserKnowsAltSetting)
  1512 	if (!iUserKnowsAltSetting)
  1577 		return KErrEof;
  1513 		return KErrEof;
  1578 	// Check Buffer Number
  1514 	// Check Buffer Number
  1579 	if ((aBufferNum<0) ||  (aBufferNum>=iNumBuffers))
  1515 	if ((aBufferNum<0) ||  (aBufferNum>=iNumBuffers))
  1580 		{
  1516 		{
  1581 		if ((TUint)aBufferNum!=RDevUsbcScClient::KFieldBuffMask)  // KUsbcScEndpointZero & KFieldBuffMas = KFieldBuffMas;
  1517 		if ((TUint)aBufferNum!=RDevUsbcScClient::KFieldBuffMask)  // KUsbcScEndpointZero & KFieldBuffMas = KFieldBuffMas;
  1582 			{
  1518 			{
  1583             OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA_DUP1, " DLddUsbcScChannel::DoWriteData : Bad Buffer Number!"); 
  1519 	        __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoWriteData : Bad Buffer Number!"));
  1584 			return KErrArgument;
  1520 			return KErrArgument;
  1585 			}
  1521 			}
  1586 		else
  1522 		else
  1587 			{
  1523 			{
  1588 			aBufferNum = iEP0InBuff;
  1524 			aBufferNum = iEP0InBuff;
  1591 	else
  1527 	else
  1592 		{
  1528 		{
  1593 		// check direction
  1529 		// check direction
  1594 		if (iBuffers[aBufferNum].iDirection!=KUsbcScIn)
  1530 		if (iBuffers[aBufferNum].iDirection!=KUsbcScIn)
  1595 			{
  1531 			{
  1596                 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA_DUP2, " DLddUsbcScChannel::DoWriteData Bad endpoint Direction"); 
  1532 	    	    __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoWriteData Bad endpoint Direction"));
  1597 				return KErrArgument;
  1533 				return KErrArgument;
  1598 			}
  1534 			}
  1599 		}
  1535 		}
  1600 
  1536 
  1601 	TUsbcScBuffer& buf=iBuffers[aBufferNum];
  1537 	TUsbcScBuffer& buf=iBuffers[aBufferNum];
  1602 
  1538 
  1603 	if ((aStart< (((TLinAddr) buf.iBufferStart)-buf.iChunkAddr)) || ((aStart+aLength)>iBuffers[aBufferNum].iBufferEnd))
  1539 	if ((aStart< (((TLinAddr) buf.iBufferStart)-buf.iChunkAddr)) || ((aStart+aLength)>iBuffers[aBufferNum].iBufferEnd))
  1604 		{
  1540 		{
  1605         OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA_DUP3, "DLddUsbcScChannel::DoWriteData Bad Range aStart or aLength 0x%x > 0x%x + 0x%x < 0x%x", (TInt)(((TLinAddr) buf.iBufferStart)-buf.iChunkAddr),aStart, aLength, iBuffers[aBufferNum].iBufferEnd);
  1541 		__KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoWriteData Bad Range aStart or aLength 0x%x > 0x%x + 0x%x < 0x%x", (((TLinAddr) buf.iBufferStart)-buf.iChunkAddr),aStart, aLength, iBuffers[aBufferNum].iBufferEnd ));
  1606 		return KErrArgument;
  1542 		return KErrArgument;
  1607 		}
  1543 		}
  1608 
  1544 
  1609 	if ( (aBufferNum != iEP0InBuff) && !Configured())
  1545 	if ( (aBufferNum != iEP0InBuff) && !Configured())
  1610 		return KErrUsbInterfaceNotReady;
  1546 		return KErrUsbInterfaceNotReady;
  1611 
  1547 
  1612 	if (aStart & ~buf.iAlignMask)
  1548 	if (aStart & ~buf.iAlignMask)
  1613 		{
  1549 		{
  1614         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA_DUP4, "TUsbcScBuffer::DoDataWrite: address 0x%x unaligned.",aStart);
  1550 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::DoDataWrite: address 0x%x unaligned.",aStart));
  1615 	        
       
  1616 		return KErrArgument;
  1551 		return KErrArgument;
  1617 		}
  1552 		}
  1618 			
  1553 			
  1619 	TInt r = iBuffers[aBufferNum].iStatusList.Add(aStatus, aLength, aStart, aFlags); //update
  1554 	TInt r = iBuffers[aBufferNum].iStatusList.Add(aStatus, aLength, aStart, aFlags); //update
  1620 
  1555 
  1622 		{
  1557 		{
  1623 			iBuffers[aBufferNum].StartDataWrite();
  1558 			iBuffers[aBufferNum].StartDataWrite();
  1624 		}
  1559 		}
  1625 	else
  1560 	else
  1626 		{	
  1561 		{	
  1627         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA_DUP5, "Job in Progress!");
  1562 		__KTRACE_OPT(KUSB, Kern::Printf("Job in Progress!"));
  1628 		}
  1563 		}
  1629 
  1564 
  1630 
  1565 
  1631 	return r;
  1566 	return r;
  1632 	}
  1567 	}
  1639 TInt DLddUsbcScChannel::DoCancel(TInt aReqNo, TUint aBuff, TUint aSpair)
  1574 TInt DLddUsbcScChannel::DoCancel(TInt aReqNo, TUint aBuff, TUint aSpair)
  1640 	{
  1575 	{
  1641 	TInt r = KErrNone;
  1576 	TInt r = KErrNone;
  1642 	TInt direction=KUsbcScOut;
  1577 	TInt direction=KUsbcScOut;
  1643 
  1578 
  1644 	OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL, "DoCancel: 0x%x aBuff 0x%x", aReqNo, aBuff);
  1579 	__KTRACE_OPT(KUSB, Kern::Printf("DoCancel: 0x%x aBuff 0x%x", aReqNo, aBuff));
  1645 	
       
  1646 	switch (aReqNo)
  1580 	switch (aReqNo)
  1647 		{
  1581 		{
  1648 	case RDevUsbcScClient::ERequestCancel:
  1582 	case RDevUsbcScClient::ERequestCancel:
  1649 		TInt buffer;
  1583 		TInt buffer;
  1650 		TInt mask;
  1584 		TInt mask;
  1657 
  1591 
  1658 	// coverity[missing_break]
  1592 	// coverity[missing_break]
  1659 	case RDevUsbcScClient::ERequestWriteDataCancel:
  1593 	case RDevUsbcScClient::ERequestWriteDataCancel:
  1660 		direction = KUsbcScIn;
  1594 		direction = KUsbcScIn;
  1661 	case RDevUsbcScClient::ERequestReadDataNotifyCancel:
  1595 	case RDevUsbcScClient::ERequestReadDataNotifyCancel:
  1662 	    OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP1, "DoCancel Direction %d endpoints: 0x%x", direction, aReqNo);
  1596 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel Direction %d endpoints: 0x%x",direction, aReqNo));
       
  1597 
  1663 		if (((TInt)aBuff)==KUsbcScEndpointZero) // EP0 is bi-directional, so pick correct buffer for call type
  1598 		if (((TInt)aBuff)==KUsbcScEndpointZero) // EP0 is bi-directional, so pick correct buffer for call type
  1664 			{
  1599 			{
  1665             OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP2, "DoCancel Cancel Endpoint 0/%d",direction);
  1600 			__KTRACE_OPT(KUSB, Kern::Printf("DoCancel Cancel Endpoint 0/%d",direction));
  1666 			iEp0Endpoint->AbortTransfer();
  1601 			iEp0Endpoint->AbortTransfer();
  1667 			if (direction==KUsbcScIn)
  1602 			if (direction==KUsbcScIn)
  1668 				aBuff=iEP0InBuff;
  1603 				aBuff=iEP0InBuff;
  1669 			else
  1604 			else
  1670 				aBuff=iEP0OutBuff;
  1605 				aBuff=iEP0OutBuff;
  1671 			} 
  1606 			} 
  1672 		else if ((TInt)aBuff >= iNumBuffers) // check buff no range.
  1607 		else if ((TInt)aBuff >= iNumBuffers) // check buff no range.
  1673 			{
  1608 			{
  1674             OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP3, "DoCancel Error: Bad buffer number");
  1609 			__KTRACE_OPT(KUSB, Kern::Printf("DoCancel Error: Bad buffer number"));
  1675 			return KErrArgument;
  1610 			return KErrArgument;
  1676 			}
  1611 			}
  1677 
  1612 
  1678 		if ((iBuffers[aBuff].iDirection&1)!=direction) // Does direction match call type?
  1613 		if ((iBuffers[aBuff].iDirection&1)!=direction) // Does direction match call type?
  1679 			{
  1614 			{
  1680             OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP4, "DoCancel Error: Bad buffer direction");
  1615 			__KTRACE_OPT(KUSB, Kern::Printf("DoCancel Error: Bad buffer direction"));
  1681 			return KErrArgument;
  1616 			return KErrArgument;
  1682 			}	
  1617 			}	
  1683 		iBuffers[aBuff].iStatusList.CancelQueued();
  1618 		iBuffers[aBuff].iStatusList.CancelQueued();
  1684 		iBuffers[aBuff].Cancel(KErrCancel);
  1619 		iBuffers[aBuff].Cancel(KErrCancel);
  1685 		
  1620 		
  1686 		return KErrNone;
  1621 		return KErrNone;
  1687 
  1622 
  1688 	case RDevUsbcScClient::ERequestAlternateDeviceStatusNotifyCancel:
  1623 	case RDevUsbcScClient::ERequestAlternateDeviceStatusNotifyCancel:
  1689 	    OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP5, "DoCancel: ERequestAlternateDeviceStatusNotify 0x%x", aReqNo);
  1624 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel: ERequestAlternateDeviceStatusNotify 0x%x", aReqNo));
  1690 		iDeviceStatusNeeded = EFalse;
  1625 		iDeviceStatusNeeded = EFalse;
  1691 		iStatusFifo->FlushQueue();
  1626 		iStatusFifo->FlushQueue();
  1692 		if (iStatusChangePtr)
  1627 		if (iStatusChangePtr)
  1693 			{
  1628 			{
  1694 			TInt deviceState = iController->GetDeviceStatus();
  1629 			TInt deviceState = iController->GetDeviceStatus();
  1698 			iStatusChangePtr = NULL; 
  1633 			iStatusChangePtr = NULL; 
  1699 			}
  1634 			}
  1700 	break;
  1635 	break;
  1701 
  1636 
  1702 	case RDevUsbcScClient::ERequestReEnumerateCancel:
  1637 	case RDevUsbcScClient::ERequestReEnumerateCancel:
  1703 	    OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP6, "DoCancel ERequestReEnumerate: 0x%x", aReqNo);
  1638 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestReEnumerate: 0x%x", aReqNo));
  1704 	break;
  1639 	break;
  1705 
  1640 
  1706 	case RDevUsbcScClient::ERequestEndpointStatusNotifyCancel:
  1641 	case RDevUsbcScClient::ERequestEndpointStatusNotifyCancel:
  1707 	    OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP7, "DoCancel ERequestEndpointStatusNotify: 0x%x", aReqNo);
  1642 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestEndpointStatusNotify: 0x%x", aReqNo));
  1708 		CancelNotifyEndpointStatus();
  1643 		CancelNotifyEndpointStatus();
  1709 	break;
  1644 	break;
  1710 
  1645 
  1711  	case RDevUsbcScClient::ERequestOtgFeaturesNotifyCancel:
  1646  	case RDevUsbcScClient::ERequestOtgFeaturesNotifyCancel:
  1712  	   OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP8, "DoCancel ERequestOtgFeaturesNotify: 0x%x", aReqNo);
  1647 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestOtgFeaturesNotify: 0x%x", aReqNo));
  1713 		CancelNotifyOtgFeatures();
  1648 		CancelNotifyOtgFeatures();
  1714 	break;
  1649 	break;
  1715 
  1650 
  1716 	default:
  1651 	default:
  1717 		OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP9, "DoCancel Unknown! 0x%x", aReqNo);
  1652 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel Unknown! 0x%x", aReqNo));
  1718 		return KErrArgument;
  1653 		return KErrArgument;
  1719 		}
  1654 		}
  1720 
  1655 
  1721 	Kern::RequestComplete(iClient,iRequestStatus[aReqNo & ~RDevUsbcScClient::ERequestCancel], KErrCancel);
  1656 	Kern::RequestComplete(iClient,iRequestStatus[aReqNo & ~RDevUsbcScClient::ERequestCancel], KErrCancel);
  1722 	return r;
  1657 	return r;
  1762 //
  1697 //
  1763 // Called from HandleMsg.
  1698 // Called from HandleMsg.
  1764 
  1699 
  1765 TInt DLddUsbcScChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
  1700 TInt DLddUsbcScChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
  1766 	{
  1701 	{
  1767     OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL, "DoControl: %d", aFunction);
  1702 	__KTRACE_OPT(KUSB, Kern::Printf("DoControl: %d", aFunction));
  1768     
  1703 
  1769 	TInt r = KErrNone;
  1704 	TInt r = KErrNone;
  1770 	TInt ep, param;
  1705 	TInt ep, param;
  1771 	TUsbcScEndpoint* pEndpoint;
  1706 	TUsbcScEndpoint* pEndpoint;
  1772 	TPtrC8 pZeroDesc(NULL, 0);
  1707 	TPtrC8 pZeroDesc(NULL, 0);
  1773 	TEndpointDescriptorInfo epInfo;
  1708 	TEndpointDescriptorInfo epInfo;
  1776 	TUsbcEndpointResource epRes;
  1711 	TUsbcEndpointResource epRes;
  1777 
  1712 
  1778 	switch (aFunction)
  1713 	switch (aFunction)
  1779 		{
  1714 		{
  1780 	case RDevUsbcScClient::EControlEndpointZeroRequestError:
  1715 	case RDevUsbcScClient::EControlEndpointZeroRequestError:
  1781 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP1, "EControlEndpointZeroRequestError");
  1716 		__KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointZeroRequestError"));
  1782 		r = KErrNone;
  1717 		r = KErrNone;
  1783 		if (iOwnsDeviceControl || (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured))
  1718 		if (iOwnsDeviceControl || (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured))
  1784 			{
  1719 			{
  1785 			iController->Ep0Stall(this);
  1720 			iController->Ep0Stall(this);
  1786 			}
  1721 			}
  1792 				r = KErrUsbInterfaceNotReady;
  1727 				r = KErrUsbInterfaceNotReady;
  1793 			}
  1728 			}
  1794 		break;
  1729 		break;
  1795 
  1730 
  1796 	case RDevUsbcScClient::EControlGetAlternateSetting:
  1731 	case RDevUsbcScClient::EControlGetAlternateSetting:
  1797 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP2, "EControlGetAlternateSetting");
  1732 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetAlternateSetting"));
  1798 		if (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured)
  1733 		if (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured)
  1799 			{
  1734 			{
  1800 			r = iController->GetInterfaceNumber(this, param);
  1735 			r = iController->GetInterfaceNumber(this, param);
  1801 			if (r == KErrNone)
  1736 			if (r == KErrNone)
  1802 				{
  1737 				{
  1813 				r = KErrUsbInterfaceNotReady;
  1748 				r = KErrUsbInterfaceNotReady;
  1814 			}
  1749 			}
  1815 		break;
  1750 		break;
  1816 
  1751 
  1817 	case RDevUsbcScClient::EControlDeviceStatus:
  1752 	case RDevUsbcScClient::EControlDeviceStatus:
  1818 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP3, "EControlDeviceStatus");
  1753 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceStatus"));
  1819 		param = iController->GetDeviceStatus();
  1754 		param = iController->GetDeviceStatus();
  1820 		r = Kern::ThreadRawWrite(iClient, a1, &param, sizeof(param), iClient);
  1755 		r = Kern::ThreadRawWrite(iClient, a1, &param, sizeof(param), iClient);
  1821 		if (r != KErrNone)
  1756 		if (r != KErrNone)
  1822 			PanicClientThread(r);
  1757 			PanicClientThread(r);
  1823 		break;
  1758 		break;
  1824 
  1759 
  1825 	case RDevUsbcScClient::EControlEndpointStatus:
  1760 	case RDevUsbcScClient::EControlEndpointStatus:
  1826 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP4, "EControlEndpointStatus");
  1761 		__KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointStatus"));
  1827 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1762 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1828 			{
  1763 			{
  1829 			pEndpoint = iEndpoint[(TInt)a1];
  1764 			pEndpoint = iEndpoint[(TInt)a1];
  1830 			if (pEndpoint == NULL)
  1765 			if (pEndpoint == NULL)
  1831 				r = KErrNotSupported;
  1766 				r = KErrNotSupported;
  1845 				r = KErrUsbInterfaceNotReady;
  1780 				r = KErrUsbInterfaceNotReady;
  1846 			}
  1781 			}
  1847 		break;
  1782 		break;
  1848 
  1783 
  1849 	case RDevUsbcScClient::EControlEndpointCaps:
  1784 	case RDevUsbcScClient::EControlEndpointCaps:
  1850 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP5, "EControlEndpointCaps");
  1785 		__KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointCaps"));
  1851 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1786 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1852 		if (r != KErrNone)
  1787 		if (r != KErrNone)
  1853 			PanicClientThread(r);
  1788 			PanicClientThread(r);
  1854 		iController->EndpointCaps(this, *((TDes8*) a1));
  1789 		iController->EndpointCaps(this, *((TDes8*) a1));
  1855 		break;
  1790 		break;
  1856 
  1791 
  1857 	case RDevUsbcScClient::EControlDeviceCaps:
  1792 	case RDevUsbcScClient::EControlDeviceCaps:
  1858 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP6, "EControlDeviceCaps");
  1793 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceCaps"));
  1859 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1794 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1860 		if (r != KErrNone)
  1795 		if (r != KErrNone)
  1861 			PanicClientThread(r);
  1796 			PanicClientThread(r);
  1862 		iController->DeviceCaps(this, *((TDes8*) a1));
  1797 		iController->DeviceCaps(this, *((TDes8*) a1));
  1863 		break;
  1798 		break;
  1864 
  1799 
  1865 	case RDevUsbcScClient::EControlSendEp0StatusPacket:
  1800 	case RDevUsbcScClient::EControlSendEp0StatusPacket:
  1866 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP7, "EControlSendEp0StatusPacket");
  1801 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSendEp0StatusPacket"));
  1867 		iController->SendEp0StatusPacket(this);
  1802 		iController->SendEp0StatusPacket(this);
  1868 		break;
  1803 		break;
  1869 
  1804 
  1870 	case RDevUsbcScClient::EControlHaltEndpoint:
  1805 	case RDevUsbcScClient::EControlHaltEndpoint:
  1871 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP8, "EControlHaltEndpoint");
  1806 		__KTRACE_OPT(KUSB, Kern::Printf("EControlHaltEndpoint"));
  1872 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1807 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1873 			{
  1808 			{
  1874 			r = iController->HaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber());
  1809 			r = iController->HaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber());
  1875 			}
  1810 			}
  1876 		else
  1811 		else
  1881 				r = KErrUsbInterfaceNotReady;
  1816 				r = KErrUsbInterfaceNotReady;
  1882 			}
  1817 			}
  1883 		break;
  1818 		break;
  1884 
  1819 
  1885 	case RDevUsbcScClient::EControlClearHaltEndpoint:
  1820 	case RDevUsbcScClient::EControlClearHaltEndpoint:
  1886 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP9, "EControlClearHaltEndpoint");
  1821 		__KTRACE_OPT(KUSB, Kern::Printf("EControlClearHaltEndpoint"));
  1887 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1822 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1888 			{
  1823 			{
  1889 			r = iController->ClearHaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber());
  1824 			r = iController->ClearHaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber());
  1890 			}
  1825 			}
  1891 		else
  1826 		else
  1896 				r = KErrUsbInterfaceNotReady;
  1831 				r = KErrUsbInterfaceNotReady;
  1897 			}
  1832 			}
  1898 		break;
  1833 		break;
  1899 
  1834 
  1900 	case RDevUsbcScClient::EControlDumpRegisters:
  1835 	case RDevUsbcScClient::EControlDumpRegisters:
  1901 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP10, "EControlDumpRegisters");
  1836 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDumpRegisters"));
  1902 		iController->DumpRegisters();
  1837 		iController->DumpRegisters();
  1903 		break;
  1838 		break;
  1904 
  1839 
  1905 	case RDevUsbcScClient::EControlReleaseDeviceControl:
  1840 	case RDevUsbcScClient::EControlReleaseDeviceControl:
  1906 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP11, "EControlReleaseDeviceControl");
  1841 		__KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseDeviceControl"));
  1907 		iController->ReleaseDeviceControl(this);
  1842 		iController->ReleaseDeviceControl(this);
  1908 		iOwnsDeviceControl = EFalse;
  1843 		iOwnsDeviceControl = EFalse;
  1909 		break;
  1844 		break;
  1910 
  1845 
  1911 	case RDevUsbcScClient::EControlEndpointZeroMaxPacketSizes:
  1846 	case RDevUsbcScClient::EControlEndpointZeroMaxPacketSizes:
  1912 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP12, "EControlEndpointZeroMaxPacketSizes");
  1847 		__KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointZeroMaxPacketSizes"));
  1913 		r = iController->EndpointZeroMaxPacketSizes();
  1848 		r = iController->EndpointZeroMaxPacketSizes();
  1914 		break;
  1849 		break;
  1915 
  1850 
  1916 	case RDevUsbcScClient::EControlSetEndpointZeroMaxPacketSize:
  1851 	case RDevUsbcScClient::EControlSetEndpointZeroMaxPacketSize:
  1917 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP13, "EControlSetEndpointZeroMaxPacketSize");
  1852 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetEndpointZeroMaxPacketSize"));
  1918 		r = iController->SetEndpointZeroMaxPacketSize(reinterpret_cast<TInt>(a1));
  1853 		r = iController->SetEndpointZeroMaxPacketSize(reinterpret_cast<TInt>(a1));
  1919 		break;
  1854 		break;
  1920 
  1855 
  1921 	case RDevUsbcScClient::EControlGetEndpointZeroMaxPacketSize:
  1856 	case RDevUsbcScClient::EControlGetEndpointZeroMaxPacketSize:
  1922 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP14, "EControlGetEndpointZeroMaxPacketSize");
  1857 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointZeroMaxPacketSize"));
  1923 		r = iController->Ep0PacketSize();
  1858 		r = iController->Ep0PacketSize();
  1924 		break;
  1859 		break;
  1925 
  1860 
  1926 	case RDevUsbcScClient::EControlGetDeviceDescriptor:
  1861 	case RDevUsbcScClient::EControlGetDeviceDescriptor:
  1927 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP15, "EControlGetDeviceDescriptor");
  1862 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceDescriptor"));
  1928 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1863 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1929 		if (r != KErrNone)
  1864 		if (r != KErrNone)
  1930 			PanicClientThread(r);
  1865 			PanicClientThread(r);
  1931 		r = iController->GetDeviceDescriptor(iClient, *((TDes8*) a1));
  1866 		r = iController->GetDeviceDescriptor(iClient, *((TDes8*) a1));
  1932 		break;
  1867 		break;
  1933 
  1868 
  1934 	case RDevUsbcScClient::EControlSetDeviceDescriptor:
  1869 	case RDevUsbcScClient::EControlSetDeviceDescriptor:
  1935 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP16, "EControlSetDeviceDescriptor");
  1870 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceDescriptor"));
  1936 		if (a1 == NULL)
  1871 		BREAK_IF_NULL_ARG(a1,r);
  1937                 {
       
  1938                 r = KErrArgument;
       
  1939                 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP17, "NULL Argument");
       
  1940                 break;
       
  1941                 }   
       
  1942 		r = iController->SetDeviceDescriptor(iClient, *((TDes8*) a1));
  1872 		r = iController->SetDeviceDescriptor(iClient, *((TDes8*) a1));
  1943 		break;
  1873 		break;
  1944 
  1874 
  1945 	case RDevUsbcScClient::EControlGetDeviceDescriptorSize:
  1875 	case RDevUsbcScClient::EControlGetDeviceDescriptorSize:
  1946 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP18, "EControlGetDeviceDescriptorSize");
  1876 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceDescriptorSize"));
  1947 		if (a1 == NULL)
  1877 		BREAK_IF_NULL_ARG(a1,r);
  1948                 {
       
  1949                 r = KErrArgument;
       
  1950                 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP19, "NULL Argument");
       
  1951                 break;
       
  1952                 }   
       
  1953 		r = iController->GetDeviceDescriptorSize(iClient, *((TDes8*) a1));
  1878 		r = iController->GetDeviceDescriptorSize(iClient, *((TDes8*) a1));
  1954 		break;
  1879 		break;
  1955 
  1880 
  1956 	case RDevUsbcScClient::EControlGetConfigurationDescriptor:
  1881 	case RDevUsbcScClient::EControlGetConfigurationDescriptor:
  1957 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP20, "EControlGetConfigurationDescriptor");
  1882 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationDescriptor"));
  1958 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient);
  1883 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient);
  1959 		if (r != KErrNone)
  1884 		if (r != KErrNone)
  1960 			PanicClientThread(r);
  1885 			PanicClientThread(r);
  1961 		r = iController->GetConfigurationDescriptor(iClient, *((TDes8*) a1));
  1886 		r = iController->GetConfigurationDescriptor(iClient, *((TDes8*) a1));
  1962 		break;
  1887 		break;
  1963 
  1888 
  1964 	case RDevUsbcScClient::EControlGetConfigurationDescriptorSize:
  1889 	case RDevUsbcScClient::EControlGetConfigurationDescriptorSize:
  1965 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP21, "EControlGetConfigurationDescriptorSize");
  1890 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationDescriptorSize"));
  1966 		if (a1 != NULL)
  1891 		if (a1 != NULL)
  1967 			{
  1892 			{
  1968 			r = iController->GetConfigurationDescriptorSize(iClient, *((TDes8*) a1));
  1893 			r = iController->GetConfigurationDescriptorSize(iClient, *((TDes8*) a1));
  1969 			}
  1894 			}
  1970 		else
  1895 		else
  1971 			r = KErrArgument;
  1896 			r = KErrArgument;
  1972 		break;
  1897 		break;
  1973 
  1898 
  1974 	case RDevUsbcScClient::EControlSetConfigurationDescriptor:
  1899 	case RDevUsbcScClient::EControlSetConfigurationDescriptor:
  1975 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP22, "EControlSetConfigurationDescriptor");
  1900 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetConfigurationDescriptor"));
  1976 		r = iController->SetConfigurationDescriptor(iClient, *((TDes8*) a1));
  1901 		r = iController->SetConfigurationDescriptor(iClient, *((TDes8*) a1));
  1977 		break;
  1902 		break;
  1978 
  1903 
  1979 	case RDevUsbcScClient::EControlGetInterfaceDescriptor:
  1904 	case RDevUsbcScClient::EControlGetInterfaceDescriptor:
  1980 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP23, "EControlGetInterfaceDescriptor");
  1905 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetInterfaceDescriptor"));
  1981 		r = iController->GetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2));
  1906 		r = iController->GetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2));
  1982 		break;
  1907 		break;
  1983 
  1908 
  1984 	case RDevUsbcScClient::EControlGetInterfaceDescriptorSize:
  1909 	case RDevUsbcScClient::EControlGetInterfaceDescriptorSize:
  1985 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP24, "EControlGetInterfaceDescriptorSize");
  1910 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetInterfaceDescriptorSize"));
  1986 		r = iController->GetInterfaceDescriptorSize(iClient, this, (TInt) a1, *(TDes8*) a2);
  1911 		r = iController->GetInterfaceDescriptorSize(iClient, this, (TInt) a1, *(TDes8*) a2);
  1987 		break;
  1912 		break;
  1988 
  1913 
  1989 	case RDevUsbcScClient::EControlSetInterfaceDescriptor:
  1914 	case RDevUsbcScClient::EControlSetInterfaceDescriptor:
  1990 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP25, "EControlSetInterfaceDescriptor");
  1915 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetInterfaceDescriptor"));
  1991 		r = iController->SetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2));
  1916 		r = iController->SetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2));
  1992 		break;
  1917 		break;
  1993 
  1918 
  1994 	case RDevUsbcScClient::EControlGetEndpointDescriptor:
  1919 	case RDevUsbcScClient::EControlGetEndpointDescriptor:
  1995 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP26, "EControlGetEndpointDescriptor");
  1920 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointDescriptor"));
  1996 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1921 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1997 		if (r != KErrNone)
  1922 		if (r != KErrNone)
  1998 			PanicClientThread(r);
  1923 			PanicClientThread(r);
  1999 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1924 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  2000 		r = (ep<0)?ep:iController->GetEndpointDescriptor(iClient, this, epInfo.iSetting,
  1925 		r = (ep<0)?ep:iController->GetEndpointDescriptor(iClient, this, epInfo.iSetting,
  2001 											   ep, *(TDes8*) epInfo.iArg);
  1926 											   ep, *(TDes8*) epInfo.iArg);
  2002 		break;
  1927 		break;
  2003 
  1928 
  2004 	case RDevUsbcScClient::EControlGetEndpointDescriptorSize:
  1929 	case RDevUsbcScClient::EControlGetEndpointDescriptorSize:
  2005 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP27, "EControlGetEndpointDescriptorSize");
  1930 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointDescriptorSize"));
  2006 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1931 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  2007 		if (r != KErrNone)
  1932 		if (r != KErrNone)
  2008 			PanicClientThread(r);
  1933 			PanicClientThread(r);
  2009 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1934 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  2010 		r = iController->GetEndpointDescriptorSize(iClient, this, epInfo.iSetting,
  1935 		r = iController->GetEndpointDescriptorSize(iClient, this, epInfo.iSetting,
  2011 												   ep, *(TDes8*) epInfo.iArg);
  1936 												   ep, *(TDes8*) epInfo.iArg);
  2012 		break;
  1937 		break;
  2013 
  1938 
  2014 	case RDevUsbcScClient::EControlSetEndpointDescriptor:
  1939 	case RDevUsbcScClient::EControlSetEndpointDescriptor:
  2015 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP28, "EControlSetEndpointDescriptor");
  1940 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetEndpointDescriptor"));
  2016 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1941 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  2017 		if (r != KErrNone)
  1942 		if (r != KErrNone)
  2018 			PanicClientThread(r);
  1943 			PanicClientThread(r);
  2019 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1944 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  2020 		r = iController->SetEndpointDescriptor(iClient, this, epInfo.iSetting,
  1945 		r = iController->SetEndpointDescriptor(iClient, this, epInfo.iSetting,
  2021 											   ep, *(TDes8*)epInfo.iArg);
  1946 											   ep, *(TDes8*)epInfo.iArg);
  2022 		break;
  1947 		break;
  2023 
  1948 
  2024 	case RDevUsbcScClient::EControlGetDeviceQualifierDescriptor:
  1949 	case RDevUsbcScClient::EControlGetDeviceQualifierDescriptor:
  2025 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP29, "EControlGetDeviceQualifierDescriptor");
  1950 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceQualifierDescriptor"));
  2026 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1951 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  2027 		if (r != KErrNone)
  1952 		if (r != KErrNone)
  2028 			PanicClientThread(r);
  1953 			PanicClientThread(r);
  2029 		r = iController->GetDeviceQualifierDescriptor(iClient, *((TDes8*) a1));
  1954 		r = iController->GetDeviceQualifierDescriptor(iClient, *((TDes8*) a1));
  2030 		break;
  1955 		break;
  2031 
  1956 
  2032 	case RDevUsbcScClient::EControlSetDeviceQualifierDescriptor:
  1957 	case RDevUsbcScClient::EControlSetDeviceQualifierDescriptor:
  2033 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP30, "EControlSetDeviceQualifierDescriptor");
  1958 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceQualifierDescriptor"));
  2034 		if (a1 == NULL)
  1959 		BREAK_IF_NULL_ARG(a1,r);
  2035                 {
       
  2036                 r = KErrArgument;
       
  2037                 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP31, "NULL Argument");
       
  2038                 break;
       
  2039                 }   
       
  2040 		r = iController->SetDeviceQualifierDescriptor(iClient, *((TDes8*) a1));
  1960 		r = iController->SetDeviceQualifierDescriptor(iClient, *((TDes8*) a1));
  2041 		break;
  1961 		break;
  2042 
  1962 
  2043 	case RDevUsbcScClient::EControlGetOtherSpeedConfigurationDescriptor:
  1963 	case RDevUsbcScClient::EControlGetOtherSpeedConfigurationDescriptor:
  2044 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP32, "EControlGetOtherSpeedConfigurationDescriptor");
  1964 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetOtherSpeedConfigurationDescriptor"));
  2045 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient);
  1965 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient);
  2046 		if (r != KErrNone)
  1966 		if (r != KErrNone)
  2047 			PanicClientThread(r);
  1967 			PanicClientThread(r);
  2048 		r = iController->GetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1));
  1968 		r = iController->GetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1));
  2049 		break;
  1969 		break;
  2050 
  1970 
  2051 	case RDevUsbcScClient::EControlSetOtherSpeedConfigurationDescriptor:
  1971 	case RDevUsbcScClient::EControlSetOtherSpeedConfigurationDescriptor:
  2052 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP33, "EControlSetOtherSpeedConfigurationDescriptor");
  1972 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetOtherSpeedConfigurationDescriptor"));
  2053 		r = iController->SetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1));
  1973 		r = iController->SetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1));
  2054 		break;
  1974 		break;
  2055 
  1975 
  2056 
  1976 
  2057 	case RDevUsbcScClient::EControlGetCSInterfaceDescriptor:
  1977 	case RDevUsbcScClient::EControlGetCSInterfaceDescriptor:
  2058 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP34, "EControlGetCSInterfaceDescriptor");
  1978 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSInterfaceDescriptor"));
  2059 		r = iController->GetCSInterfaceDescriptorBlock(iClient, this, (TInt) a1, *((TDes8*) a2));
  1979 		r = iController->GetCSInterfaceDescriptorBlock(iClient, this, (TInt) a1, *((TDes8*) a2));
  2060 		break;
  1980 		break;
  2061 
  1981 
  2062 	case RDevUsbcScClient::EControlGetCSInterfaceDescriptorSize:
  1982 	case RDevUsbcScClient::EControlGetCSInterfaceDescriptorSize:
  2063 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP35, "EControlGetCSInterfaceDescriptorSize");
  1983 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSInterfaceDescriptorSize"));
  2064 		r = iController->GetCSInterfaceDescriptorBlockSize(iClient, this, (TInt) a1, *(TDes8*) a2);
  1984 		r = iController->GetCSInterfaceDescriptorBlockSize(iClient, this, (TInt) a1, *(TDes8*) a2);
  2065 		break;
  1985 		break;
  2066 
  1986 
  2067 	case RDevUsbcScClient::EControlGetCSEndpointDescriptor:
  1987 	case RDevUsbcScClient::EControlGetCSEndpointDescriptor:
  2068 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP36, "EControlGetCSEndpointDescriptor");
  1988 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSEndpointDescriptor"));
  2069 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1989 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  2070 		if (r != KErrNone)
  1990 		if (r != KErrNone)
  2071 			PanicClientThread(r);
  1991 			PanicClientThread(r);
  2072 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1992 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  2073 		r = iController->GetCSEndpointDescriptorBlock(iClient, this, epInfo.iSetting,
  1993 		r = iController->GetCSEndpointDescriptorBlock(iClient, this, epInfo.iSetting,
  2074 													  ep, *(TDes8*) epInfo.iArg);
  1994 													  ep, *(TDes8*) epInfo.iArg);
  2075 		break;
  1995 		break;
  2076 
  1996 
  2077 	case RDevUsbcScClient::EControlGetCSEndpointDescriptorSize:
  1997 	case RDevUsbcScClient::EControlGetCSEndpointDescriptorSize:
  2078 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP37, "EControlGetCSEndpointDescriptorSize");
  1998 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSEndpointDescriptorSize"));
  2079 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1999 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  2080 		if (r != KErrNone)
  2000 		if (r != KErrNone)
  2081 			PanicClientThread(r);
  2001 			PanicClientThread(r);
  2082 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  2002 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  2083 		r = iController->GetCSEndpointDescriptorBlockSize(iClient, this, epInfo.iSetting,
  2003 		r = iController->GetCSEndpointDescriptorBlockSize(iClient, this, epInfo.iSetting,
  2084 														  ep, *(TDes8*) epInfo.iArg);
  2004 														  ep, *(TDes8*) epInfo.iArg);
  2085 		break;
  2005 		break;
  2086 
  2006 
  2087 	case RDevUsbcScClient::EControlSignalRemoteWakeup:
  2007 	case RDevUsbcScClient::EControlSignalRemoteWakeup:
  2088 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP38, "EControlSignalRemoteWakeup");
  2008 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSignalRemoteWakeup"));
  2089 		r = iController->SignalRemoteWakeup();
  2009 		r = iController->SignalRemoteWakeup();
  2090 		break;
  2010 		break;
  2091 
  2011 
  2092 	case RDevUsbcScClient::EControlDeviceDisconnectFromHost:
  2012 	case RDevUsbcScClient::EControlDeviceDisconnectFromHost:
  2093 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP39, "EControlDeviceDisconnectFromHost");
  2013 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceDisconnectFromHost"));
  2094 		r = iController->UsbDisconnect();
  2014 		r = iController->UsbDisconnect();
  2095 		break;
  2015 		break;
  2096 
  2016 
  2097 	case RDevUsbcScClient::EControlDeviceConnectToHost:
  2017 	case RDevUsbcScClient::EControlDeviceConnectToHost:
  2098 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP40, "EControlDeviceConnectToHost");
  2018 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceConnectToHost"));
  2099 		r = iController->UsbConnect();
  2019 		r = iController->UsbConnect();
  2100 		break;
  2020 		break;
  2101 
  2021 
  2102 	case RDevUsbcScClient::EControlDevicePowerUpUdc:
  2022 	case RDevUsbcScClient::EControlDevicePowerUpUdc:
  2103 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP41, "EControlDevicePowerUpUdc");
  2023 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDevicePowerUpUdc"));
  2104 		r = iController->PowerUpUdc();
  2024 		r = iController->PowerUpUdc();
  2105 		break;
  2025 		break;
  2106 
  2026 
  2107 	case RDevUsbcScClient::EControlSetDeviceControl:
  2027 	case RDevUsbcScClient::EControlSetDeviceControl:
  2108 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP42, "EControlSetDeviceControl");
  2028 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceControl"));
  2109 		r = iController->SetDeviceControl(this);
  2029 		r = iController->SetDeviceControl(this);
  2110 		if (r == KErrNone)
  2030 		if (r == KErrNone)
  2111 			{
  2031 			{
  2112 			iOwnsDeviceControl = ETrue;
  2032 			iOwnsDeviceControl = ETrue;
  2113 			if (iEp0Endpoint == NULL)
  2033 			if (iEp0Endpoint == NULL)
  2114 				{
  2034 				{
  2115 			    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP43, "EControlSetDeviceControl");
  2035 				__KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceControl"));
  2116 				r = SetupEp0();
  2036 				r = SetupEp0();
  2117 				if (r != KErrNone)
  2037 				if (r != KErrNone)
  2118 					{
  2038 					{
  2119 				    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP44, "  Error: SetupEp0() failed");
  2039 					__KTRACE_OPT(KPANIC, Kern::Printf("  Error: SetupEp0() failed"));
  2120 					iController->ReleaseDeviceControl(this);
  2040 					iController->ReleaseDeviceControl(this);
  2121 					iOwnsDeviceControl=EFalse;
  2041 					iOwnsDeviceControl=EFalse;
  2122 					DestroyEp0();
  2042 					DestroyEp0();
  2123 					}
  2043 					}
  2124 				}
  2044 				}
  2126 		else
  2046 		else
  2127 			r = KErrInUse;
  2047 			r = KErrInUse;
  2128 		break;
  2048 		break;
  2129 
  2049 
  2130 	case RDevUsbcScClient::EControlCurrentlyUsingHighSpeed:
  2050 	case RDevUsbcScClient::EControlCurrentlyUsingHighSpeed:
  2131 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP45, "EControlCurrentlyUsingHighSpeed");
  2051 		__KTRACE_OPT(KUSB, Kern::Printf("EControlCurrentlyUsingHighSpeed"));
  2132 		r = iController->CurrentlyUsingHighSpeed();
  2052 		r = iController->CurrentlyUsingHighSpeed();
  2133 		break;
  2053 		break;
  2134 
  2054 
  2135 	case RDevUsbcScClient::EControlSetInterface:
  2055 	case RDevUsbcScClient::EControlSetInterface:
  2136 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP46, "EControlSetInterface");
  2056 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetInterface"));
  2137 		r = Kern::ThreadRawRead(iClient, a2, &ifcInfo, sizeof(ifcInfo));
  2057 		r = Kern::ThreadRawRead(iClient, a2, &ifcInfo, sizeof(ifcInfo));
  2138 		if (r != KErrNone)
  2058 		if (r != KErrNone)
  2139 			PanicClientThread(r);
  2059 			PanicClientThread(r);
  2140 		r = SetInterface((TInt) a1, &ifcInfo);
  2060 		r = SetInterface((TInt) a1, &ifcInfo);
  2141 		break;
  2061 		break;
  2142 
  2062 
  2143 	case RDevUsbcScClient::EControlReleaseInterface: 
  2063 	case RDevUsbcScClient::EControlReleaseInterface: 
  2144 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP47, "EControlReleaseInterface");
  2064 		__KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseInterface"));
  2145 		if (!iRealizeCalled)
  2065 		if (!iRealizeCalled)
  2146 			{
  2066 			{
  2147 			r = iController->ReleaseInterface(this, (TInt) a1);
  2067 			r = iController->ReleaseInterface(this, (TInt) a1);
  2148 			if (r == KErrNone)
  2068 			if (r == KErrNone)
  2149 				{
  2069 				{
  2150 				DestroyInterface((TUint) a1);
  2070 				DestroyInterface((TUint) a1);
  2151 				}
  2071 				}
  2152 			else
  2072 			else
  2153 				{
  2073 				{
  2154                 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP48, "  Error in PIL: LDD interface won't be released.");
  2074 				__KTRACE_OPT(KPANIC, Kern::Printf("  Error in PIL: LDD interface won't be released."));
  2155 				}
  2075 				}
  2156 			}
  2076 			}
  2157 		else
  2077 		else
  2158 			r = KErrUsbAlreadyRealized;
  2078 			r = KErrUsbAlreadyRealized;
  2159 		break;
  2079 		break;
  2160 
  2080 
  2161 	case RDevUsbcScClient::EControlSetCSInterfaceDescriptor:
  2081 	case RDevUsbcScClient::EControlSetCSInterfaceDescriptor:
  2162 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP49, "EControlSetCSInterfaceDescriptor");
  2082 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetCSInterfaceDescriptor"));
  2163 		r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo));
  2083 		r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo));
  2164 		if (r != KErrNone)
  2084 		if (r != KErrNone)
  2165 			PanicClientThread(r);
  2085 			PanicClientThread(r);
  2166 		r = iController->SetCSInterfaceDescriptorBlock(iClient, this, desInfo.iSetting,
  2086 		r = iController->SetCSInterfaceDescriptorBlock(iClient, this, desInfo.iSetting,
  2167 													   *reinterpret_cast<const TDes8*>(desInfo.iArg),
  2087 													   *reinterpret_cast<const TDes8*>(desInfo.iArg),
  2168 													   desInfo.iSize);
  2088 													   desInfo.iSize);
  2169 		break;
  2089 		break;
  2170 
  2090 
  2171 	case RDevUsbcScClient::EControlSetCSEndpointDescriptor:
  2091 	case RDevUsbcScClient::EControlSetCSEndpointDescriptor:
  2172 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP50, "EControlSetCSEndpointDescriptor");
  2092 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetCSEndpointDescriptor"));
  2173 		r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo));
  2093 		r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo));
  2174 		if (r != KErrNone)
  2094 		if (r != KErrNone)
  2175 			PanicClientThread(r);
  2095 			PanicClientThread(r);
  2176 		ep = EpFromAlternateSetting(desInfo.iSetting, desInfo.iEndpoint);
  2096 		ep = EpFromAlternateSetting(desInfo.iSetting, desInfo.iEndpoint);
  2177 		r = iController->SetCSEndpointDescriptorBlock(iClient, this, desInfo.iSetting, ep,
  2097 		r = iController->SetCSEndpointDescriptorBlock(iClient, this, desInfo.iSetting, ep,
  2178 													  *reinterpret_cast<const TDes8*>(desInfo.iArg),
  2098 													  *reinterpret_cast<const TDes8*>(desInfo.iArg),
  2179 													  desInfo.iSize);
  2099 													  desInfo.iSize);
  2180 		break;
  2100 		break;
  2181 
  2101 
  2182 	case RDevUsbcScClient::EControlGetStringDescriptorLangId:
  2102 	case RDevUsbcScClient::EControlGetStringDescriptorLangId:
  2183 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP51, "EControlGetStringDescriptorLangId");
  2103 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetStringDescriptorLangId"));
  2184 		r = iController->GetStringDescriptorLangId(iClient, *((TDes8*) a1));
  2104 		r = iController->GetStringDescriptorLangId(iClient, *((TDes8*) a1));
  2185 		break;
  2105 		break;
  2186 
  2106 
  2187 	case RDevUsbcScClient::EControlSetStringDescriptorLangId:
  2107 	case RDevUsbcScClient::EControlSetStringDescriptorLangId:
  2188 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP52, "EControlSetStringDescriptorLangId");
  2108 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetStringDescriptorLangId"));
  2189 		r = iController->SetStringDescriptorLangId(reinterpret_cast<TUint>(a1));
  2109 		r = iController->SetStringDescriptorLangId(reinterpret_cast<TUint>(a1));
  2190 		break;
  2110 		break;
  2191 
  2111 
  2192 	case RDevUsbcScClient::EControlGetManufacturerStringDescriptor:
  2112 	case RDevUsbcScClient::EControlGetManufacturerStringDescriptor:
  2193 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP53, "EControlGetManufacturerStringDescriptor");
  2113 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetManufacturerStringDescriptor"));
  2194 		r = iController->GetManufacturerStringDescriptor(iClient, *((TPtr8*) a1));
  2114 		r = iController->GetManufacturerStringDescriptor(iClient, *((TPtr8*) a1));
  2195 		break;
  2115 		break;
  2196 
  2116 
  2197 	case RDevUsbcScClient::EControlSetManufacturerStringDescriptor:
  2117 	case RDevUsbcScClient::EControlSetManufacturerStringDescriptor:
  2198 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP54, "EControlSetManufacturerStringDescriptor");
  2118 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetManufacturerStringDescriptor"));
  2199 		r = iController->SetManufacturerStringDescriptor(iClient, *((TPtr8*) a1));
  2119 		r = iController->SetManufacturerStringDescriptor(iClient, *((TPtr8*) a1));
  2200 		break;
  2120 		break;
  2201 
  2121 
  2202 	case RDevUsbcScClient::EControlRemoveManufacturerStringDescriptor:
  2122 	case RDevUsbcScClient::EControlRemoveManufacturerStringDescriptor:
  2203 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP55, "EControlRemoveManufacturerStringDescriptor");
  2123 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveManufacturerStringDescriptor"));
  2204 		r = iController->RemoveManufacturerStringDescriptor();
  2124 		r = iController->RemoveManufacturerStringDescriptor();
  2205 		break;
  2125 		break;
  2206 
  2126 
  2207 	case RDevUsbcScClient::EControlGetProductStringDescriptor:
  2127 	case RDevUsbcScClient::EControlGetProductStringDescriptor:
  2208 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP56, "EControlGetProductStringDescriptor");
  2128 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetProductStringDescriptor"));
  2209 		r = iController->GetProductStringDescriptor(iClient, *((TPtr8*) a1));
  2129 		r = iController->GetProductStringDescriptor(iClient, *((TPtr8*) a1));
  2210 		break;
  2130 		break;
  2211 
  2131 
  2212 	case RDevUsbcScClient::EControlSetProductStringDescriptor:
  2132 	case RDevUsbcScClient::EControlSetProductStringDescriptor:
  2213 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP57, "EControlSetProductStringDescriptor");
  2133 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetProductStringDescriptor"));
  2214 		r = iController->SetProductStringDescriptor(iClient, *((TPtr8*) a1));
  2134 		r = iController->SetProductStringDescriptor(iClient, *((TPtr8*) a1));
  2215 		break;
  2135 		break;
  2216 
  2136 
  2217 	case RDevUsbcScClient::EControlRemoveProductStringDescriptor:
  2137 	case RDevUsbcScClient::EControlRemoveProductStringDescriptor:
  2218 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP58, "EControlRemoveProductStringDescriptor");
  2138 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveProductStringDescriptor"));
  2219 		r = iController->RemoveProductStringDescriptor();
  2139 		r = iController->RemoveProductStringDescriptor();
  2220 		break;
  2140 		break;
  2221 
  2141 
  2222 	case RDevUsbcScClient::EControlGetSerialNumberStringDescriptor:
  2142 	case RDevUsbcScClient::EControlGetSerialNumberStringDescriptor:
  2223 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP59, "EControlGetSerialNumberStringDescriptor");
  2143 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetSerialNumberStringDescriptor"));
  2224 		r = iController->GetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1));
  2144 		r = iController->GetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1));
  2225 		break;
  2145 		break;
  2226 
  2146 
  2227 	case RDevUsbcScClient::EControlSetSerialNumberStringDescriptor:
  2147 	case RDevUsbcScClient::EControlSetSerialNumberStringDescriptor:
  2228 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP60, "EControlSetSerialNumberStringDescriptor");
  2148 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetSerialNumberStringDescriptor"));
  2229 		r = iController->SetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1));
  2149 		r = iController->SetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1));
  2230 		break;
  2150 		break;
  2231 
  2151 
  2232 	case RDevUsbcScClient::EControlRemoveSerialNumberStringDescriptor:
  2152 	case RDevUsbcScClient::EControlRemoveSerialNumberStringDescriptor:
  2233 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP61, "EControlRemoveSerialNumberStringDescriptor");
  2153 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveSerialNumberStringDescriptor"));
  2234 		r = iController->RemoveSerialNumberStringDescriptor();
  2154 		r = iController->RemoveSerialNumberStringDescriptor();
  2235 		break;
  2155 		break;
  2236 
  2156 
  2237 	case RDevUsbcScClient::EControlGetConfigurationStringDescriptor:
  2157 	case RDevUsbcScClient::EControlGetConfigurationStringDescriptor:
  2238 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP62, "EControlGetConfigurationStringDescriptor");
  2158 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationStringDescriptor"));
  2239 		r = iController->GetConfigurationStringDescriptor(iClient, *((TPtr8*) a1));
  2159 		r = iController->GetConfigurationStringDescriptor(iClient, *((TPtr8*) a1));
  2240 		break;
  2160 		break;
  2241 
  2161 
  2242 	case RDevUsbcScClient::EControlSetConfigurationStringDescriptor:
  2162 	case RDevUsbcScClient::EControlSetConfigurationStringDescriptor:
  2243 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP63, "EControlSetConfigurationStringDescriptor");
  2163 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetConfigurationStringDescriptor"));
  2244 		r = iController->SetConfigurationStringDescriptor(iClient, *((TPtr8*) a1));
  2164 		r = iController->SetConfigurationStringDescriptor(iClient, *((TPtr8*) a1));
  2245 		break;
  2165 		break;
  2246 
  2166 
  2247 	case RDevUsbcScClient::EControlRemoveConfigurationStringDescriptor:
  2167 	case RDevUsbcScClient::EControlRemoveConfigurationStringDescriptor:
  2248 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP64, "EControlRemoveConfigurationStringDescriptor");
  2168 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveConfigurationStringDescriptor"));
  2249 		r = iController->RemoveConfigurationStringDescriptor();
  2169 		r = iController->RemoveConfigurationStringDescriptor();
  2250 		break;
  2170 		break;
  2251 
  2171 
  2252 	case RDevUsbcScClient::EControlGetStringDescriptor:
  2172 	case RDevUsbcScClient::EControlGetStringDescriptor:
  2253 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP65, "EControlGetStringDescriptor");
  2173 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetStringDescriptor"));
  2254 		r = iController->GetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2));
  2174 		r = iController->GetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2));
  2255 		break;
  2175 		break;
  2256 
  2176 
  2257 	case RDevUsbcScClient::EControlSetStringDescriptor:
  2177 	case RDevUsbcScClient::EControlSetStringDescriptor:
  2258 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP66, "EControlSetStringDescriptor");
  2178 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetStringDescriptor"));
  2259 		r = iController->SetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2));
  2179 		r = iController->SetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2));
  2260 		break;
  2180 		break;
  2261 
  2181 
  2262 	case RDevUsbcScClient::EControlRemoveStringDescriptor:
  2182 	case RDevUsbcScClient::EControlRemoveStringDescriptor:
  2263 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP67, "EControlRemoveStringDescriptor");
  2183 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveStringDescriptor"));
  2264 		r = iController->RemoveStringDescriptor((TUint8) (TInt) a1);
  2184 		r = iController->RemoveStringDescriptor((TUint8) (TInt) a1);
  2265 		break;
  2185 		break;
  2266 
  2186 
  2267 	case RDevUsbcScClient::EControlAllocateEndpointResource:
  2187 	case RDevUsbcScClient::EControlAllocateEndpointResource:
  2268 		{
  2188 		{
  2269 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP68, "EControlAllocateEndpointResource");
  2189 		__KTRACE_OPT(KUSB, Kern::Printf("EControlAllocateEndpointResource"));
  2270 		epRes = (TUsbcEndpointResource)((TInt) a2);
  2190 		epRes = (TUsbcEndpointResource)((TInt) a2);
  2271 		TInt realEp=-1;
  2191 		TInt realEp=-1;
  2272 		r = GetRealEpForEpResource((TInt)a1, realEp);
  2192 		r = GetRealEpForEpResource((TInt)a1, realEp);
  2273 		if (r==KErrNone)
  2193 		if (r==KErrNone)
  2274 			r = iController->AllocateEndpointResource(this, realEp, epRes);
  2194 			r = iController->AllocateEndpointResource(this, realEp, epRes);
  2275 		break;
  2195 		break;
  2276 		}
  2196 		}
  2277 	case RDevUsbcScClient::EControlDeAllocateEndpointResource:
  2197 	case RDevUsbcScClient::EControlDeAllocateEndpointResource:
  2278 		{
  2198 		{
  2279 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP69, "EControlDeAllocateEndpointResource");
  2199 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDeAllocateEndpointResource"));
  2280 		epRes = (TUsbcEndpointResource)((TInt) a2);
  2200 		epRes = (TUsbcEndpointResource)((TInt) a2);
  2281 		TInt realEp=-1;
  2201 		TInt realEp=-1;
  2282 		r = GetRealEpForEpResource((TInt)a1, realEp);
  2202 		r = GetRealEpForEpResource((TInt)a1, realEp);
  2283 		if (r==KErrNone)
  2203 		if (r==KErrNone)
  2284 			r = iController->DeAllocateEndpointResource(this, realEp, epRes);
  2204 			r = iController->DeAllocateEndpointResource(this, realEp, epRes);
  2285 		break;
  2205 		break;
  2286 		}
  2206 		}
  2287 	case RDevUsbcScClient::EControlQueryEndpointResourceUse:
  2207 	case RDevUsbcScClient::EControlQueryEndpointResourceUse:
  2288 		{
  2208 		{
  2289 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP70, "EControlQueryEndpointResourceUse");
  2209 		__KTRACE_OPT(KUSB, Kern::Printf("EControlQueryEndpointResourceUse"));
  2290 		epRes = (TUsbcEndpointResource)((TInt) a2);
  2210 		epRes = (TUsbcEndpointResource)((TInt) a2);
  2291 		TInt realEp=-1;
  2211 		TInt realEp=-1;
  2292 		r = GetRealEpForEpResource((TInt)a1, realEp);
  2212 		r = GetRealEpForEpResource((TInt)a1, realEp);
  2293 		if (r==KErrNone)
  2213 		if (r==KErrNone)
  2294 			r = iController->QueryEndpointResource(this, realEp, epRes);
  2214 			r = iController->QueryEndpointResource(this, realEp, epRes);
  2295 		break;
  2215 		break;
  2296 		}
  2216 		}
  2297 	case RDevUsbcScClient::EControlSetOtgDescriptor:
  2217 	case RDevUsbcScClient::EControlSetOtgDescriptor:
  2298 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP71, "EControlSetOtgDescriptor");
  2218 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetOtgDescriptor"));
  2299 		r = iController->SetOtgDescriptor(iClient, *((const TDesC8*)a1));
  2219 		r = iController->SetOtgDescriptor(iClient, *((const TDesC8*)a1));
  2300 		break;
  2220 		break;
  2301 
  2221 
  2302 	case RDevUsbcScClient::EControlGetOtgDescriptor:
  2222 	case RDevUsbcScClient::EControlGetOtgDescriptor:
  2303 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP72, "EControlGetOtgDescriptor");
  2223 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetOtgDescriptor"));
  2304 		r = iController->GetOtgDescriptor(iClient, *((TDes8*)a1));
  2224 		r = iController->GetOtgDescriptor(iClient, *((TDes8*)a1));
  2305 		break;
  2225 		break;
  2306 
  2226 
  2307 	case RDevUsbcScClient::EControlGetOtgFeatures:
  2227 	case RDevUsbcScClient::EControlGetOtgFeatures:
  2308 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP73, "EControlGetOtgFeatures");
  2228 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetOtgFeatures"));
  2309 		r = iController->GetOtgFeatures(iClient, *((TDes8*)a1));
  2229 		r = iController->GetOtgFeatures(iClient, *((TDes8*)a1));
  2310 		break;
  2230 		break;
  2311 
  2231 
  2312 	case RDevUsbcScClient::EControlRealizeInterface:
  2232 	case RDevUsbcScClient::EControlRealizeInterface:
  2313 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP74, "EControlRealizeInterface");
  2233 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRealizeInterface"));
  2314 		r = RealizeInterface();
  2234 		r = RealizeInterface();
  2315 		break;
  2235 		break;
  2316 	case RDevUsbcScClient::EControlStartNextInAlternateSetting:
  2236 	case RDevUsbcScClient::EControlStartNextInAlternateSetting:
  2317 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP75, "EControlStartNextInAlternateSetting");
  2237 		__KTRACE_OPT(KUSB, Kern::Printf("EControlStartNextInAlternateSetting"));
  2318 		r = StartNextInAlternateSetting();
  2238 		r = StartNextInAlternateSetting();
  2319 		break;
  2239 		break;
  2320 
  2240 
  2321     default:
  2241     default:
  2322         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP76, "Function code not supported");
  2242 		__KTRACE_OPT(KUSB, Kern::Printf("Function code not supported"));
  2323 		r = KErrNotSupported;
  2243 		r = KErrNotSupported;
  2324 		}
  2244 		}
  2325 
  2245 
  2326 	return r;
  2246 	return r;
  2327 	}
  2247 	}
  2332 //
  2252 //
  2333 // Overriding DObject virtual
  2253 // Overriding DObject virtual
  2334 //
  2254 //
  2335 TInt DLddUsbcScChannel::RequestUserHandle(DThread* aThread, TOwnerType /*aType*/)
  2255 TInt DLddUsbcScChannel::RequestUserHandle(DThread* aThread, TOwnerType /*aType*/)
  2336 	{
  2256 	{
  2337     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_REQUESTUSERHANDLE, "DLddUsbcScChannel::RequestUserHandle" );
  2257 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::RequestUserHandle"));
  2338     
       
  2339 	// The USB client LDD is not designed for a channel to be shared between
  2258 	// The USB client LDD is not designed for a channel to be shared between
  2340 	// threads. It saves a pointer to the current thread when it is opened, and
  2259 	// threads. It saves a pointer to the current thread when it is opened, and
  2341 	// uses this to complete any asynchronous requests.
  2260 	// uses this to complete any asynchronous requests.
  2342 	// It is therefore not acceptable for the handle to be duplicated and used
  2261 	// It is therefore not acceptable for the handle to be duplicated and used
  2343 	// by another thread:
  2262 	// by another thread:
  2345 		{
  2264 		{
  2346 		return KErrNone;
  2265 		return KErrNone;
  2347 		}
  2266 		}
  2348 	else
  2267 	else
  2349 		{
  2268 		{
  2350 		//check if async request has been called
  2269 		return KErrAccessDenied;
  2351 		for (TInt i = 1; i < KUsbcMaxRequests; i++)
       
  2352 			{
       
  2353 			if (iRequestStatus[i] != NULL)
       
  2354 				{
       
  2355 				return KErrAccessDenied;
       
  2356 				}
       
  2357 			}
       
  2358 
       
  2359 		if (iBuffers)
       
  2360 			{
       
  2361 			for (TInt i=0; i<(iNumBuffers+2); i++) 
       
  2362 				{
       
  2363 				if (iBuffers[i].IsRequestPending())
       
  2364 					{
       
  2365 					return KErrAccessDenied;	
       
  2366 					}
       
  2367 				}
       
  2368 			}
       
  2369 		
       
  2370 		
       
  2371 		Kern::SafeClose((DObject*&)iClient, NULL);
       
  2372 		iClient = aThread;
       
  2373 		iClient->Open();
       
  2374 		if (iBuffers)
       
  2375 			{
       
  2376 			for (TInt i=0; i<(iNumBuffers+2); i++) 
       
  2377 				{
       
  2378 				iBuffers[i].iStatusList.SetClient(*iClient);
       
  2379 				}
       
  2380 			}
       
  2381 		OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REQUESTUSERHANDLE_DUP1, "DLddUsbcScChannel::handle %d", iChunkInfo->iChunk->AccessCount());
       
  2382 		return KErrNone;
       
  2383 		}
  2270 		}
  2384 	}
  2271 	}
  2385 
  2272 
  2386 inline TInt DLddUsbcScChannel::GetRealEpForEpResource(TInt aEndpoint, TInt& aRealEp)
  2273 inline TInt DLddUsbcScChannel::GetRealEpForEpResource(TInt aEndpoint, TInt& aRealEp)
  2387 	{
  2274 	{
  2446 	// Read descriptor in
  2333 	// Read descriptor in
  2447 	TUsbcScInterfaceInfoBuf ifc_info_buf;
  2334 	TUsbcScInterfaceInfoBuf ifc_info_buf;
  2448 	TUsbcScInterfaceInfoBuf* const ifc_info_buf_ptr = aInfoBuf->iInterfaceData;
  2335 	TUsbcScInterfaceInfoBuf* const ifc_info_buf_ptr = aInfoBuf->iInterfaceData;
  2449 	const TInt srcLen = Kern::ThreadGetDesLength(iClient, ifc_info_buf_ptr);
  2336 	const TInt srcLen = Kern::ThreadGetDesLength(iClient, ifc_info_buf_ptr);
  2450 
  2337 
  2451 	OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE, "SetInterface srcLen = %d len = %d", srcLen, ifc_info_buf.Length());
  2338 	__KTRACE_OPT(KUSB, Kern::Printf("SetInterface srcLen = %d len = %d", srcLen, ifc_info_buf.Length() ));
  2452 	
  2339 
  2453 	if (srcLen < ifc_info_buf.Length())
  2340 	if (srcLen < ifc_info_buf.Length())
  2454 		{
  2341 		{
  2455         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP1, "SetInterface can't copy");
  2342 		__KTRACE_OPT(KUSB, Kern::Printf("SetInterface can't copy"));
  2456 		PanicClientThread(EDesOverflow);
  2343 		PanicClientThread(EDesOverflow);
  2457 		}
  2344 		}
  2458 
  2345 
  2459 	TInt r = Kern::ThreadDesRead(iClient, ifc_info_buf_ptr, ifc_info_buf, 0, KChunkShiftBy0);
  2346 	TInt r = Kern::ThreadDesRead(iClient, ifc_info_buf_ptr, ifc_info_buf, 0, KChunkShiftBy0);
  2460 	if (r != KErrNone)
  2347 	if (r != KErrNone)
  2461 		{
  2348 		{
  2462         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP2, "SetInterface Copy failed reason=%d", r);
  2349 		__KTRACE_OPT(KUSB, Kern::Printf("SetInterface Copy failed reason=%d", r));
  2463 		PanicClientThread(r);
  2350 		PanicClientThread(r);
  2464 		}
  2351 		}
  2465 
  2352 
  2466 	// The list of endpoints is within the interface info.
  2353 	// The list of endpoints is within the interface info.
  2467 	TUsbcScEndpointInfo* pEndpointData = ifc_info_buf().iEndpointData;
  2354 	TUsbcScEndpointInfo* pEndpointData = ifc_info_buf().iEndpointData;
  2468 
  2355 
  2469 	const TInt num_endpoints = ifc_info_buf().iTotalEndpointsUsed;
  2356 	const TInt num_endpoints = ifc_info_buf().iTotalEndpointsUsed;
  2470 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP3, "SetInterface num_endpoints=%d", num_endpoints);
  2357 	__KTRACE_OPT(KUSB, Kern::Printf("SetInterface num_endpoints=%d", num_endpoints));
  2471 	if (num_endpoints>KMaxEndpointsPerClient)
  2358 	if (num_endpoints>KMaxEndpointsPerClient)
  2472 		return KErrOverflow;
  2359 		return KErrOverflow;
  2473 
  2360 
  2474 
  2361 
  2475 	// Initialize real ep numbers list.
  2362 	// Initialize real ep numbers list.
  2478 	for (i=0; i<=KMaxEndpointsPerClient; i++)
  2365 	for (i=0; i<=KMaxEndpointsPerClient; i++)
  2479 		real_ep_numbers[i] = -1;
  2366 		real_ep_numbers[i] = -1;
  2480 
  2367 
  2481 
  2368 
  2482 	// See if PIL will accept this interface
  2369 	// See if PIL will accept this interface
  2483 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP4, "SetInterface Calling controller");
  2370 	__KTRACE_OPT(KUSB, Kern::Printf("SetInterface Calling controller"));
  2484 	TUsbcEndpointInfoArray endpointData = TUsbcEndpointInfoArray(ifc_info_buf().iEndpointData);
  2371 	TUsbcEndpointInfoArray endpointData = TUsbcEndpointInfoArray(ifc_info_buf().iEndpointData);
  2485 
  2372 
  2486 	r = iController->SetInterface(this,
  2373 	r = iController->SetInterface(this,
  2487 								  iClient,
  2374 								  iClient,
  2488 								  aInterfaceNumber,
  2375 								  aInterfaceNumber,
  2491 								  (TInt) ifc_info_buf().iTotalEndpointsUsed,
  2378 								  (TInt) ifc_info_buf().iTotalEndpointsUsed,
  2492 								  endpointData,
  2379 								  endpointData,
  2493 								  &real_ep_numbers[0],
  2380 								  &real_ep_numbers[0],
  2494 								  ifc_info_buf().iFeatureWord);
  2381 								  ifc_info_buf().iFeatureWord);
  2495 
  2382 
  2496 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP5, "SetInterface controller returned %d", r);
  2383 	__KTRACE_OPT(KUSB, Kern::Printf("SetInterface controller returned %d", r));
  2497 	if (r != KErrNone)
  2384 	if (r != KErrNone)
  2498 		{
  2385 		{
  2499         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP6, "SetInterface failed reason=%d", r);
  2386 		__KTRACE_OPT(KPANIC, Kern::Printf("SetInterface failed reason=%d", r));
  2500 		return r;
  2387 		return r;
  2501 		}
  2388 		}
  2502 
  2389 
  2503 	// create alternate setting record
  2390 	// create alternate setting record
  2504     TUsbcScAlternateSetting* alternateSettingListRec = new TUsbcScAlternateSetting;
  2391     TUsbcScAlternateSetting* alternateSettingListRec = new TUsbcScAlternateSetting;
  2509 		}
  2396 		}
  2510 	
  2397 	
  2511 	// other endpoints
  2398 	// other endpoints
  2512 	for (TInt i = 1; i <= num_endpoints; i++, pEndpointData++)
  2399 	for (TInt i = 1; i <= num_endpoints; i++, pEndpointData++)
  2513 		{
  2400 		{
  2514         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP7, "SetInterface for ep=%d", i);
  2401 		__KTRACE_OPT(KUSB, Kern::Printf("SetInterface for ep=%d", i));
       
  2402 
  2515 		if ((pEndpointData->iType==KUsbEpTypeControl)
  2403 		if ((pEndpointData->iType==KUsbEpTypeControl)
  2516 			|| (pEndpointData->iDir != KUsbEpDirIn && pEndpointData->iDir != KUsbEpDirOut)
  2404 			|| (pEndpointData->iDir != KUsbEpDirIn && pEndpointData->iDir != KUsbEpDirOut)
  2517 			|| (pEndpointData->iSize > 1024) || (pEndpointData->iSize<=0))
  2405 			|| (pEndpointData->iSize > 1024) || (pEndpointData->iSize<=0))
  2518 			{
  2406 			{
  2519 			r = KErrUsbBadEndpoint;
  2407 			r = KErrUsbBadEndpoint;
  2540 			{
  2428 			{
  2541 			r = KErrNoMemory;
  2429 			r = KErrNoMemory;
  2542 			goto CleanUp;
  2430 			goto CleanUp;
  2543 			}
  2431 			}
  2544 
  2432 
  2545 		OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP8, "SetInterface for ep=%d rec=0x%08x ep==0x%08x",
  2433 	
  2546                                         i, (TUint)alternateSettingListRec, (TUint)ep);                              
  2434 		__KTRACE_OPT(KUSB, Kern::Printf("SetInterface for ep=%d rec=0x%08x ep==0x%08x",
       
  2435 										i, alternateSettingListRec, ep));
  2547 		}
  2436 		}
  2548 
  2437 
  2549 	if (iAlternateSettingList->iHead)
  2438 	if (iAlternateSettingList->iHead)
  2550 		{
  2439 		{
  2551 		iAlternateSettingList->iTail->iNext = alternateSettingListRec;
  2440 		iAlternateSettingList->iTail->iNext = alternateSettingListRec;
  2575 	delete alternateSettingListRec;
  2464 	delete alternateSettingListRec;
  2576 	//Fall Through
  2465 	//Fall Through
  2577 
  2466 
  2578  ReleaseInterface:
  2467  ReleaseInterface:
  2579 #if _DEBUG
  2468 #if _DEBUG
  2580 #ifdef OST_TRACE_COMPILER_IN_USE
       
  2581 	TInt r1 = iController->ReleaseInterface(this, aInterfaceNumber);
  2469 	TInt r1 = iController->ReleaseInterface(this, aInterfaceNumber);
  2582 #else
  2470 	__KTRACE_OPT(KUSB, Kern::Printf("Release Interface controller returned %d", r1));
  2583 	(void)  iController->ReleaseInterface(this, aInterfaceNumber);
       
  2584 #endif
       
  2585 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP9, "Release Interface controller returned %d", r1);
       
  2586 #else
  2471 #else
  2587 	(void)	iController->ReleaseInterface(this, aInterfaceNumber);
  2472 	(void)	iController->ReleaseInterface(this, aInterfaceNumber);
  2588 #endif
  2473 #endif
  2589 	return r;
  2474 	return r;
  2590 	}
  2475 	}
  2598 	TUint *mem= NULL;
  2483 	TUint *mem= NULL;
  2599 	__KTRACE_OPT(KUSB, mem = aMem);
  2484 	__KTRACE_OPT(KUSB, mem = aMem);
  2600 	if (mem!=NULL)
  2485 	if (mem!=NULL)
  2601 		{
  2486 		{
  2602 		TInt j;
  2487 		TInt j;
  2603 		OstTraceDef0(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, _REALIZEINTERFACE_DUMP, "Final chunk header State:" );
  2488  		Kern::Printf("Final chunk header State:");
  2604 		
  2489 		for (j=0; j<30; j+=8)
  2605 		for (j=0; j<30; j+=8) 
  2490  			Kern::Printf("%2x: %8x %8x %8x %8x %8x %8x %8x %8x", j, mem[j], mem[j+1], mem[j+2], mem[j+3], mem[j+4], mem[j+5], mem[j+6], mem[j+7] );
  2606 		    {
       
  2607 		    OstTrace1(TRACE_NORMAL, _REALIZEINTERFACE_DUMP_DUP1, "%2x", j);
       
  2608 		    OstTraceExt1(TRACE_NORMAL, _REALIZEINTERFACE_DUMP_DUP2, "%{uint32[]}", TOstArray<TUint>(&mem[j], 8));
       
  2609 		    }
       
  2610 		};
  2491 		};
  2611 	};
  2492 	};
  2612 #endif
  2493 #endif
  2613 
  2494 
  2614 
  2495 
  2695 	// Create K-side buffer table
  2576 	// Create K-side buffer table
  2696 	if (!iBuffers)
  2577 	if (!iBuffers)
  2697 		iBuffers = (TUsbcScBuffer *) Kern::AllocZ(sizeof(TUsbcScBuffer) * (bufInfo.iTotalBuffers+2)); // +2 is for ep0.
  2578 		iBuffers = (TUsbcScBuffer *) Kern::AllocZ(sizeof(TUsbcScBuffer) * (bufInfo.iTotalBuffers+2)); // +2 is for ep0.
  2698 	if (!iBuffers)
  2579 	if (!iBuffers)
  2699 		{
  2580 		{
  2700         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE, "Realize: Error: Alloc iBufers failed!" );
  2581 		__KTRACE_OPT(KUSB, Kern::Printf("Realize: Error: Alloc iBufers failed!"));
  2701         
       
  2702 		errorOrChunk = KErrNoMemory;
  2582 		errorOrChunk = KErrNoMemory;
  2703 		goto realize_end;
  2583 		goto realize_end;
  2704 		}
  2584 		}
  2705 
  2585 
  2706 
  2586 
  2707 	errorOrChunk = SetupEp0();
  2587 	errorOrChunk = SetupEp0();
  2708 	if (errorOrChunk)
  2588 	if (errorOrChunk)
  2709 		{
  2589 		{
  2710         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP1, "Realize: SetupEp0 . ERROR %d",errorOrChunk);
  2590 		__KTRACE_OPT(KUSB, Kern::Printf("Realize: SetupEp0 . ERROR %d",errorOrChunk));
  2711 		goto realize_end;
  2591 		goto realize_end;
  2712 		}
  2592 		}
  2713 
  2593 
  2714 	ep0Size = iEp0Endpoint->EndpointInfo()->iSize;
  2594 	ep0Size = iEp0Endpoint->EndpointInfo()->iSize;
  2715 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP2, "Realize: Setup EP0. max packet size %d", ep0Size);
  2595 	__KTRACE_OPT(KUSB, Kern::Printf("Realize: Setup EP0. max packet size %d", ep0Size));
       
  2596 
  2716 	// Create EP0 buffers
  2597 	// Create EP0 buffers
  2717 	iEP0OutBuff=bufInfo.iTotalBuffers;
  2598 	iEP0OutBuff=bufInfo.iTotalBuffers;
  2718 	errorOrChunk = iBuffers[iEP0OutBuff].Construct(KUsbcScBiOut,  this,   KUsbScEP0OutBufPos, KUsbScEP0OutBufEnd, ep0Size, ep0Size, ep0Size);
  2599 	errorOrChunk = iBuffers[iEP0OutBuff].Construct(KUsbcScBiOut,  this,   KUsbScEP0OutBufPos, KUsbScEP0OutBufEnd, ep0Size, ep0Size, ep0Size);
  2719 	if (errorOrChunk)
  2600 	if (errorOrChunk)
  2720 		{
  2601 		{
  2721         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP3, "Realize: Setup EP0 Out. ERROR %d",errorOrChunk);
  2602 		__KTRACE_OPT(KUSB, Kern::Printf("Realize: Setup EP0 Out. ERROR %d",errorOrChunk));
  2722 		goto realize_end;
  2603 		goto realize_end;
  2723 		}
  2604 		}
  2724 
  2605 
  2725 	iBuffers[iEP0OutBuff].CreateChunkBufferHeader();
  2606 	iBuffers[iEP0OutBuff].CreateChunkBufferHeader();
  2726 	iBuffers[iEP0OutBuff].iCallback =  iEp0Endpoint->iRequestCallbackInfo;
  2607 	iBuffers[iEP0OutBuff].iCallback =  iEp0Endpoint->iRequestCallbackInfo;
  2731 
  2612 
  2732 	iEP0InBuff=bufInfo.iTotalBuffers+1;
  2613 	iEP0InBuff=bufInfo.iTotalBuffers+1;
  2733 	errorOrChunk = iBuffers[iEP0InBuff].Construct( KUsbcScBiIn ,  this,   KUsbScEP0InBufPos , KUsbScEP0InBufEnd , ep0Size, ep0Size, ep0Size);	
  2614 	errorOrChunk = iBuffers[iEP0InBuff].Construct( KUsbcScBiIn ,  this,   KUsbScEP0InBufPos , KUsbScEP0InBufEnd , ep0Size, ep0Size, ep0Size);	
  2734 	if (errorOrChunk)
  2615 	if (errorOrChunk)
  2735 		{
  2616 		{
  2736         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP4, "Realize: Setup EP0 In. ERROR %d",errorOrChunk);
  2617 		__KTRACE_OPT(KUSB, Kern::Printf("Realize: Setup EP0 In. ERROR %d",errorOrChunk));
  2737 		goto realize_end;
  2618 		goto realize_end;
  2738 		}
  2619 		}
  2739 	
  2620 	
  2740 	iBuffers[iEP0InBuff].iCallback =  iEp0Endpoint->iRequestCallbackInfo;
  2621 	iBuffers[iEP0InBuff].iCallback =  iEp0Endpoint->iRequestCallbackInfo;
  2741 
  2622 
  2745 
  2626 
  2746 
  2627 
  2747 	} // end ep0Size scope
  2628 	} // end ep0Size scope
  2748 
  2629 
  2749 	// Create resources and tables.  .   .   .   .   .
  2630 	// Create resources and tables.  .   .   .   .   .
  2750 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP5, "Realize: Create resources tables");
  2631 	__KTRACE_OPT(KUSB, Kern::Printf("Realize: Create resources tables"));
       
  2632 
  2751 	{ // scope of bufNum
  2633 	{ // scope of bufNum
  2752 	// For each EP buffer
  2634 	// For each EP buffer
  2753 	TInt buffNum=0;
  2635 	TInt buffNum=0;
  2754 	TInt buffMinSize;
  2636 	TInt buffMinSize;
  2755 	TInt endpointNumber;
  2637 	TInt endpointNumber;
  2767 			TInt needed =  bufInfo.iBufs[inout].iSizes[endpoint];
  2649 			TInt needed =  bufInfo.iBufs[inout].iSizes[endpoint];
  2768 			if (needed) 
  2650 			if (needed) 
  2769 				{
  2651 				{
  2770 				TInt bufStart = offset;
  2652 				TInt bufStart = offset;
  2771 
  2653 
  2772 				OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP6, "Realize:    buf row:%d inout %d, iBufferOffset[%d+2]=%x",endpoint, (TUint)inout, (TUint)buffNum, (TUint)bufStart);
  2654 				__KTRACE_OPT(KUSB, Kern::Printf("Realize:    buf row:%d inout %d, iBufferOffset[%d+2]=%x",endpoint, inout, buffNum, bufStart));
       
  2655 
  2773 				bufsd =  &(bufInfo.iBufs[inout]);
  2656 				bufsd =  &(bufInfo.iBufs[inout]);
  2774 				// and then point all endpoints that use it, towards it.
  2657 				// and then point all endpoints that use it, towards it.
  2775 				TInt altSetting;	
  2658 				TInt altSetting;	
  2776 				TUint maxReadSize = ~0;
  2659 				TUint maxReadSize = ~0;
  2777 				for (altSetting=0; altSetting < bufInfo.iAltSettings; altSetting++)
  2660 				for (altSetting=0; altSetting < bufInfo.iAltSettings; altSetting++)
  2797 
  2680 
  2798 					epRecord->iType = (inout+1) | (epType<<2);
  2681 					epRecord->iType = (inout+1) | (epType<<2);
  2799 
  2682 
  2800 					if (endpointRecord->EndpointInfo()->iReadSize)
  2683 					if (endpointRecord->EndpointInfo()->iReadSize)
  2801 						maxReadSize = (maxReadSize <= endpointRecord->EndpointInfo()->iReadSize) ? maxReadSize : endpointRecord->EndpointInfo()->iReadSize;
  2684 						maxReadSize = (maxReadSize <= endpointRecord->EndpointInfo()->iReadSize) ? maxReadSize : endpointRecord->EndpointInfo()->iReadSize;
  2802                         OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP7, "Realize:      endpointNum %d in altSetting %d, alt table @ %d",
  2685 					
  2803                                                      endpointNumber, (TUint)altSetting,bufInfo.iAltSettingsTbl->iAltTableOffset[altSetting]);
  2686 					__KTRACE_OPT(KUSB, Kern::Printf("Realize:      endpointNum %d in altSetting %d, alt table @ %d",
  2804                                                    
  2687 													 endpointNumber, altSetting,bufInfo.iAltSettingsTbl->iAltTableOffset[altSetting]));
  2805 						}
  2688 						}
  2806 					else
  2689 					else
  2807 						{
  2690 						{
  2808                         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP8, "Realize:      endpointNum NA in altSetting %d", altSetting);
  2691 						__KTRACE_OPT(KUSB, Kern::Printf("Realize:      endpointNum NA in altSetting %d", altSetting));
  2809 						}
  2692 						}
  2810 
  2693 
  2811 					} // end for
  2694 					} // end for
  2812 
  2695 
  2813 
  2696 
  2875 #ifdef _DEBUG
  2758 #ifdef _DEBUG
  2876  RealizeInterface_Dump((TUint*) iChunkInfo->iChunkMem); // Debug only tracing
  2759  RealizeInterface_Dump((TUint*) iChunkInfo->iChunkMem); // Debug only tracing
  2877 #endif
  2760 #endif
  2878 
  2761 
  2879 realize_end:
  2762 realize_end:
  2880     OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP9, "Realize: cleanup.  Err=%d", errorOrChunk);
  2763 	__KTRACE_OPT(KUSB, Kern::Printf("Realize: cleanup.  Err=%d", errorOrChunk));
  2881 	// Here we clean up after either success, or after bailing out early.
  2764 	// Here we clean up after either success, or after bailing out early.
  2882 
  2765 
  2883 	bufInfo.Free();
  2766 	bufInfo.Free();
  2884 	
  2767 	
  2885 	if (iChunkInfo)
  2768 	if (iChunkInfo)
  2918 
  2801 
  2919 		} // endif iChunkInfo
  2802 		} // endif iChunkInfo
  2920 	if (openedCS)
  2803 	if (openedCS)
  2921 		NKern::ThreadLeaveCS();
  2804 		NKern::ThreadLeaveCS();
  2922 
  2805 
  2923 	OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP10, "Realize: returning %x (%d)", errorOrChunk, errorOrChunk);
  2806 	__KTRACE_OPT(KUSB, Kern::Printf("Realize: returning %x (%d)", errorOrChunk, errorOrChunk));
  2924 	return errorOrChunk;
  2807 	return errorOrChunk;
  2925 } // End RealizeInterface
  2808 } // End RealizeInterface
  2926 
  2809 
  2927 
  2810 
  2928 //
  2811 //
  2929 // DestroyAllInterfaces
  2812 // DestroyAllInterfaces
  2930 //
  2813 //
  2931 
  2814 
  2932 void DLddUsbcScChannel::DestroyAllInterfaces()
  2815 void DLddUsbcScChannel::DestroyAllInterfaces()
  2933 	{
  2816 	{
  2934     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DESTROYALLINTERFACES, "DLddUsbcScChannel::DestroyAllInterfaces" );
  2817 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DestroyAllInterfaces"));
  2935     
       
  2936 	// Removes all interfaces
  2818 	// Removes all interfaces
  2937 	if (iAlternateSettingList)
  2819 	if (iAlternateSettingList)
  2938 		{
  2820 		{
  2939 		if (iAlternateSettingList->iHead != NULL)
  2821 		if (iAlternateSettingList->iHead != NULL)
  2940 			{
  2822 			{
  2941 			TUsbcScAlternateSetting* alternateSettingListRec = iAlternateSettingList->iTail;
  2823 			TUsbcScAlternateSetting* alternateSettingListRec = iAlternateSettingList->iTail;
  2942 			while (alternateSettingListRec)
  2824 			while (alternateSettingListRec)
  2943 				{
  2825 				{
  2944 				iAlternateSettingList->iTail = alternateSettingListRec->iPrevious; 
  2826 				iAlternateSettingList->iTail = alternateSettingListRec->iPrevious; 
  2945 				// If this contains NULL now that is only possible if the record to be deleted was at the head
  2827 				// If this contains NULL now that is only possible if the record to be deleted was at the head
  2946 				OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DESTROYALLINTERFACES_DUP1, "Release interface %d \n", alternateSettingListRec->iSetting);
  2828 				__KTRACE_OPT(KUSB, Kern::Printf("Release interface %d \n", alternateSettingListRec->iSetting));
  2947 				iController->ReleaseInterface(this, alternateSettingListRec->iSetting);
  2829 				iController->ReleaseInterface(this, alternateSettingListRec->iSetting);
  2948 				delete alternateSettingListRec;
  2830 				delete alternateSettingListRec;
  2949 				if (iAlternateSettingList->iTail == NULL) //No more interfaces left 
  2831 				if (iAlternateSettingList->iTail == NULL) //No more interfaces left 
  2950 					break;
  2832 					break;
  2951 				else
  2833 				else
  2960 
  2842 
  2961 	iNumberOfEndpoints = 0;
  2843 	iNumberOfEndpoints = 0;
  2962 	iAlternateSettingList = NULL;
  2844 	iAlternateSettingList = NULL;
  2963 	iValidInterface = EFalse;
  2845 	iValidInterface = EFalse;
  2964 
  2846 
  2965 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DESTROYALLINTERFACES_DUP2, "DLddUsbcScChannel::DestroyAllInterfaces done");
  2847 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DestroyAllInterfaces done"));
  2966 	}
  2848 	}
  2967 
  2849 
  2968 
  2850 
  2969 		
  2851 		
  2970 
  2852 
  2973 // DestroyInterface
  2855 // DestroyInterface
  2974 //
  2856 //
  2975 
  2857 
  2976 void DLddUsbcScChannel::DestroyInterface(TUint aInterfaceNumber)
  2858 void DLddUsbcScChannel::DestroyInterface(TUint aInterfaceNumber)
  2977 	{
  2859 	{
  2978 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DESTROYINTERFACE, "DLddUsbcScChannel::DestroyInterface \n" );
  2860 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DestroyInterface \n"));
  2979 	
  2861 	
  2980 	if (iAlternateSetting == aInterfaceNumber)
  2862 	if (iAlternateSetting == aInterfaceNumber)
  2981 		{
  2863 		{
  2982 		ResetInterface(KErrUsbInterfaceNotReady);
  2864 		ResetInterface(KErrUsbInterfaceNotReady);
  2983 		iValidInterface = EFalse;
  2865 		iValidInterface = EFalse;
  3003 					iAlternateSettingList->iTail = alternateSettingListRecFound->iPrevious;
  2885 					iAlternateSettingList->iTail = alternateSettingListRecFound->iPrevious;
  3004 					iAlternateSettingList->iTail->iNext = NULL;
  2886 					iAlternateSettingList->iTail->iNext = NULL;
  3005 					}
  2887 					}
  3006 				else	//Somewhere in the middle (would not expect this in normal operation, but here for completeness)
  2888 				else	//Somewhere in the middle (would not expect this in normal operation, but here for completeness)
  3007 					{
  2889 					{
  3008                     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DESTROYINTERFACE_DUP1, "DLddUsbcScChannel::DestroyInterface Middle interface!\n" );
  2890 					__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DestroyInterface Middle interface!\n"));
  3009 					alternateSettingListRec->iPrevious->iNext = alternateSettingListRec->iNext;
  2891 					alternateSettingListRec->iPrevious->iNext = alternateSettingListRec->iNext;
  3010 					alternateSettingListRec->iNext->iPrevious = alternateSettingListRec->iPrevious;
  2892 					alternateSettingListRec->iNext->iPrevious = alternateSettingListRec->iPrevious;
  3011 					}	
  2893 					}	
  3012 
  2894 
  3013 				delete alternateSettingListRecFound;
  2895 				delete alternateSettingListRecFound;
  3053 // DestroyEp0
  2935 // DestroyEp0
  3054 //
  2936 //
  3055 
  2937 
  3056 void DLddUsbcScChannel::DestroyEp0()
  2938 void DLddUsbcScChannel::DestroyEp0()
  3057 	{
  2939 	{
  3058     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DESTROYEP0, "DLddUsbcScChannel::DestroyEp0" );
  2940 	__KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DestroyEp0"));
  3059     
       
  3060 	delete iEp0Endpoint;
  2941 	delete iEp0Endpoint;
  3061 	iEp0Endpoint = NULL;
  2942 	iEp0Endpoint = NULL;
  3062 	}
  2943 	}
  3063 
  2944 
  3064 
  2945 
  3065 void DLddUsbcScChannel::RequestCallbackEp0(TAny* aDLddUsbcScChannel)
  2946 void DLddUsbcScChannel::RequestCallbackEp0(TAny* aDLddUsbcScChannel)
  3066     {
  2947     {
  3067 	DLddUsbcScChannel* channel = (DLddUsbcScChannel*) aDLddUsbcScChannel;
  2948 	DLddUsbcScChannel* channel = (DLddUsbcScChannel*) aDLddUsbcScChannel;
  3068 
  2949 
  3069 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_REQUESTCALLBACKEP0, "DLddUsbcScChannel::RequestCallbackEp0" );
  2950 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::RequestCallbackEp0"));
  3070 	
       
  3071 
  2951 
  3072 	if (channel->ChannelClosing())
  2952 	if (channel->ChannelClosing())
  3073 		{
  2953 		{
  3074         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REQUESTCALLBACKEP0_DUP1, "Channel Closing: Completion not accepted!" );
  2954 		__KTRACE_OPT(KUSB, Kern::Printf("Channel Closing: Completion not accepted!"));
  3075 		return;
  2955 		return;
  3076 		}
  2956 		}
  3077 
  2957 
  3078 	switch (channel->iEp0Endpoint->iRequestCallbackInfo->iTransferDir)
  2958 	switch (channel->iEp0Endpoint->iRequestCallbackInfo->iTransferDir)
  3079 		{
  2959 		{
  3082 		return;
  2962 		return;
  3083 	case EControllerRead:
  2963 	case EControllerRead:
  3084 		channel->iBuffers[channel->iEP0OutBuff].CompleteRead();
  2964 		channel->iBuffers[channel->iEP0OutBuff].CompleteRead();
  3085 		return;
  2965 		return;
  3086 	default:
  2966 	default:
  3087 	    OstTrace1(TRACE_NORMAL, DLDDUSBCSCCHANNEL_REQUESTCALLBACKEP0_DUP2, "DLddUsbcScChannel::RequestCallbackEp0 - Unexpected completion direction %d",channel->iEp0Endpoint->iRequestCallbackInfo->iTransferDir);
  2967 		Kern::Printf("DLddUsbcScChannel::RequestCallbackEp0 - Unexpected completion direction %d",channel->iEp0Endpoint->iRequestCallbackInfo->iTransferDir);
  3088 		Kern::Fault("DLddUsbcScChannel::RequestCallbackEp0", __LINE__);
  2968 		Kern::Fault("DLddUsbcScChannel::RequestCallbackEp0", __LINE__);
  3089 		} 
  2969 		} 
  3090 	}
  2970 	}
  3091 
  2971 
  3092 
  2972 
  3098 // EndpointStatusChangeCallback
  2978 // EndpointStatusChangeCallback
  3099 //
  2979 //
  3100 
  2980 
  3101 void DLddUsbcScChannel::EndpointStatusChangeCallback(TAny* aDLddUsbcScChannel)
  2981 void DLddUsbcScChannel::EndpointStatusChangeCallback(TAny* aDLddUsbcScChannel)
  3102     {
  2982     {
  3103     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_ENDPOINTSTATUSCHANGECALLBACK, "DLddUsbcScChannel::EndpointStatusChangeCallback" );
  2983 	__KTRACE_OPT(KUSB, Kern::Printf("EndpointStatusChangeCallback"));
  3104     
       
  3105     DLddUsbcScChannel* dUsbc = (DLddUsbcScChannel*) aDLddUsbcScChannel;
  2984     DLddUsbcScChannel* dUsbc = (DLddUsbcScChannel*) aDLddUsbcScChannel;
  3106 	if (dUsbc->iChannelClosing)
  2985 	if (dUsbc->iChannelClosing)
  3107 		return;
  2986 		return;
  3108 	TUint endpointState = dUsbc->iEndpointStatusCallbackInfo.State();
  2987 	TUint endpointState = dUsbc->iEndpointStatusCallbackInfo.State();
  3109 	const TInt reqNo = (TInt) RDevUsbcScClient::ERequestEndpointStatusNotify;
  2988 	const TInt reqNo = (TInt) RDevUsbcScClient::ERequestEndpointStatusNotify;
  3110 	if (dUsbc->iRequestStatus[reqNo])
  2989 	if (dUsbc->iRequestStatus[reqNo])
  3111 		{
  2990 		{
  3112 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_ENDPOINTSTATUSCHANGECALLBACK_DUP1, "EndpointStatusChangeCallback Notify status" );
  2991 		__KTRACE_OPT(KUSB, Kern::Printf("EndpointStatusChangeCallback Notify status"));
  3113 		DThread* client = dUsbc->iClient;
  2992 		DThread* client = dUsbc->iClient;
  3114 		// set client descriptor length to zero
  2993 		// set client descriptor length to zero
  3115 		TInt r = Kern::ThreadRawWrite(client, dUsbc->iEndpointStatusChangePtr, &endpointState,
  2994 		TInt r = Kern::ThreadRawWrite(client, dUsbc->iEndpointStatusChangePtr, &endpointState,
  3116 									  sizeof(TUint), client);
  2995 									  sizeof(TUint), client);
  3117 		if (r != KErrNone)
  2996 		if (r != KErrNone)
  3136     TInt i;
  3015     TInt i;
  3137  	for (i = 0;
  3016  	for (i = 0;
  3138  		 (i < KUsbcDeviceStateRequests) && ((deviceState = dUsbc->iStatusCallbackInfo.State(i)) != EUsbcNoState);
  3017  		 (i < KUsbcDeviceStateRequests) && ((deviceState = dUsbc->iStatusCallbackInfo.State(i)) != EUsbcNoState);
  3139  		 ++i)
  3018  		 ++i)
  3140 		{
  3019 		{
  3141         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_STATUSCHANGECALLBACK, "StatusChangeCallBack status=%d", deviceState);
  3020  		__KTRACE_OPT(KUSB, Kern::Printf("StatusChangeCallBack status=%d", deviceState));
  3142         
       
  3143 		if (deviceState & KUsbAlternateSetting)
  3021 		if (deviceState & KUsbAlternateSetting)
  3144 			{
  3022 			{
  3145 			dUsbc->ProcessAlternateSetting(deviceState);
  3023 			dUsbc->ProcessAlternateSetting(deviceState);
  3146 			}
  3024 			}
  3147 		else
  3025 		else
  3148 			{
  3026 			{
  3149 			dUsbc->ProcessDeviceState(deviceState);
  3027 			dUsbc->ProcessDeviceState(deviceState);
  3150 			// Send Status to EP0 buffer.		
  3028 			// Send Status to EP0 buffer.		
  3151 			dUsbc->iBuffers[dUsbc->iEP0OutBuff].SendEp0StatusPacket(deviceState);
  3029 			// Before the client calls RDevUsbcScClient::FinalizeInterface(),
       
  3030 			// this function might be called.
       
  3031 			// So we add a guard for dUsbc->iBuffers
       
  3032 			if( dUsbc->iBuffers )
       
  3033 				{
       
  3034 				dUsbc->iBuffers[dUsbc->iEP0OutBuff].SendEp0StatusPacket(deviceState);
       
  3035 				}
  3152 			}
  3036 			}
  3153 
  3037 
  3154 		// Only queue if userside is interested
  3038 		// Only queue if userside is interested
  3155 		if (dUsbc->iDeviceStatusNeeded)
  3039 		if (dUsbc->iDeviceStatusNeeded)
  3156 			{
  3040 			{
  3167 	}
  3051 	}
  3168 
  3052 
  3169 
  3053 
  3170 void DLddUsbcScChannel::OtgFeatureChangeCallback(TAny* aDLddUsbcScChannel)
  3054 void DLddUsbcScChannel::OtgFeatureChangeCallback(TAny* aDLddUsbcScChannel)
  3171     {
  3055     {
  3172     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_OTGFEATURECHANGECALLBACK, "DLddUsbcScChannel::OtgFeatureChangeCallback" );
  3056 	__KTRACE_OPT(KUSB, Kern::Printf("OtgFeatureChangeCallback"));
  3173     
       
  3174     DLddUsbcScChannel* dUsbc = (DLddUsbcScChannel*) aDLddUsbcScChannel;
  3057     DLddUsbcScChannel* dUsbc = (DLddUsbcScChannel*) aDLddUsbcScChannel;
  3175 	if (dUsbc->iChannelClosing)
  3058 	if (dUsbc->iChannelClosing)
  3176 		return;
  3059 		return;
  3177 
  3060 
  3178     TUint8 features;
  3061     TUint8 features;
  3180     dUsbc->iController->GetCurrentOtgFeatures(features);
  3063     dUsbc->iController->GetCurrentOtgFeatures(features);
  3181 
  3064 
  3182     const TInt reqNo = (TInt) RDevUsbcScClient::ERequestOtgFeaturesNotify;
  3065     const TInt reqNo = (TInt) RDevUsbcScClient::ERequestOtgFeaturesNotify;
  3183 	if (dUsbc->iRequestStatus[reqNo])
  3066 	if (dUsbc->iRequestStatus[reqNo])
  3184 		{
  3067 		{
  3185         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_OTGFEATURECHANGECALLBACK_DUP1, "OtgFeatureChangeCallback Notify status" );
  3068 		__KTRACE_OPT(KUSB, Kern::Printf("OtgFeatureChangeCallback Notify status"));
  3186 		TInt r = Kern::ThreadRawWrite(dUsbc->iClient, dUsbc->iOtgFeatureChangePtr,
  3069 		TInt r = Kern::ThreadRawWrite(dUsbc->iClient, dUsbc->iOtgFeatureChangePtr,
  3187                                       &features, sizeof(TUint8), dUsbc->iClient);
  3070                                       &features, sizeof(TUint8), dUsbc->iClient);
  3188 		if (r != KErrNone)
  3071 		if (r != KErrNone)
  3189 			dUsbc->PanicClientThread(r);
  3072 			dUsbc->PanicClientThread(r);
  3190 		Kern::RequestComplete(dUsbc->iClient, dUsbc->iRequestStatus[reqNo], r);
  3073 		Kern::RequestComplete(dUsbc->iClient, dUsbc->iRequestStatus[reqNo], r);
  3258 				{
  3141 				{
  3259 				return alternateSettingListRec->iEndpoint[aEndpoint]->RealEpNumber();
  3142 				return alternateSettingListRec->iEndpoint[aEndpoint]->RealEpNumber();
  3260 				}
  3143 				}
  3261 			else
  3144 			else
  3262 				{
  3145 				{
  3263                 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCSCCHANNEL_EPFROMALTERNATESETTING, "  Error: aEndpoint %d wrong for aAlternateSetting %d",
  3146 				__KTRACE_OPT(KPANIC, Kern::Printf("  Error: aEndpoint %d wrong for aAlternateSetting %d",
  3264                                                   aEndpoint, aAlternateSetting);
  3147 												  aEndpoint, aAlternateSetting));
  3265                 
       
  3266 				return KErrNotFound;
  3148 				return KErrNotFound;
  3267 				}
  3149 				}
  3268 			}
  3150 			}
  3269 		alternateSettingListRec = alternateSettingListRec->iNext;
  3151 		alternateSettingListRec = alternateSettingListRec->iNext;
  3270 		}
  3152 		}
  3271 	OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCSCCHANNEL_EPFROMALTERNATESETTING_DUP1, "  Error: no aAlternateSetting %d found", aAlternateSetting);
  3153 	__KTRACE_OPT(KPANIC, Kern::Printf("  Error: no aAlternateSetting %d found", aAlternateSetting));
  3272 	return KErrNotFound;
  3154 	return KErrNotFound;
  3273 	}
  3155 	}
  3274 
  3156 
  3275 //
  3157 //
  3276 // ProcessAlternateSetting
  3158 // ProcessAlternateSetting
  3278 
  3160 
  3279 TInt DLddUsbcScChannel::ProcessAlternateSetting(TUint aAlternateSetting)
  3161 TInt DLddUsbcScChannel::ProcessAlternateSetting(TUint aAlternateSetting)
  3280 	{
  3162 	{
  3281 
  3163 
  3282 	TUint newSetting = aAlternateSetting&(~KUsbAlternateSetting);
  3164 	TUint newSetting = aAlternateSetting&(~KUsbAlternateSetting);
  3283 	OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSALTERNATESETTING, "ProcessAlternateSetting 0x%08x selecting alternate setting 0x%08x", aAlternateSetting, newSetting);
  3165 	__KTRACE_OPT(KUSB, Kern::Printf("ProcessAlternateSetting 0x%08x selecting alternate setting 0x%08x", aAlternateSetting, newSetting));
  3284 	
       
  3285 	iUserKnowsAltSetting=EFalse;
  3166 	iUserKnowsAltSetting=EFalse;
  3286 	iAlternateSetting = newSetting;
  3167 	iAlternateSetting = newSetting;
  3287 	iAsSeq++; 
  3168 	iAsSeq++; 
  3288 	
  3169 	
  3289 	ResetInterface(KErrUsbInterfaceChange);					// kill any outstanding IN transfers
  3170 	ResetInterface(KErrUsbInterfaceChange);					// kill any outstanding IN transfers
  3303 //
  3184 //
  3304 // Called from StatusChangeCallback.
  3185 // Called from StatusChangeCallback.
  3305 
  3186 
  3306 TInt DLddUsbcScChannel::ProcessDeviceState(TUsbcDeviceState aDeviceState)
  3187 TInt DLddUsbcScChannel::ProcessDeviceState(TUsbcDeviceState aDeviceState)
  3307 	{
  3188 	{
  3308     OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE, "DLddUsbcScChannel::ProcessDeviceState(%d -> %d)", iDeviceState, aDeviceState);
  3189 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::ProcessDeviceState(%d -> %d)", iDeviceState, aDeviceState));
  3309     
       
  3310 	if (iDeviceState == aDeviceState)
  3190 	if (iDeviceState == aDeviceState)
  3311 		{
  3191 		{
  3312         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP1, "  No state change => nothing to be done.");
  3192 		__KTRACE_OPT(KUSB, Kern::Printf("  No state change => nothing to be done."));
  3313 		return KErrNone;
  3193 		return KErrNone;
  3314 		}
  3194 		}
  3315 	if (iDeviceState == EUsbcDeviceStateSuspended)
  3195 	if (iDeviceState == EUsbcDeviceStateSuspended)
  3316 		{
  3196 		{
  3317         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP2, "  Coming out of Suspend: old state = %d", iOldDeviceState);
  3197 		__KTRACE_OPT(KUSB, Kern::Printf("  Coming out of Suspend: old state = %d", iOldDeviceState));
  3318 		iDeviceState = iOldDeviceState;
  3198 		iDeviceState = iOldDeviceState;
  3319 		if (iDeviceState == aDeviceState)
  3199 		if (iDeviceState == aDeviceState)
  3320 			{
  3200 			{
  3321             OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP3, "  New state same as before Suspend => nothing to be done.");
  3201 			__KTRACE_OPT(KUSB, Kern::Printf("  New state same as before Suspend => nothing to be done."));
  3322 			return KErrNone;
  3202 			return KErrNone;
  3323 			}
  3203 			}
  3324 		}
  3204 		}
  3325 	TBool renumerateState = (aDeviceState == EUsbcDeviceStateConfigured);
  3205 	TBool renumerateState = (aDeviceState == EUsbcDeviceStateConfigured);
  3326 	TBool deconfigured = EFalse;
  3206 	TBool deconfigured = EFalse;
  3327 	TInt cancellationCode = KErrNone;
  3207 	TInt cancellationCode = KErrNone;
  3328 	if (aDeviceState == EUsbcDeviceStateSuspended)
  3208 	if (aDeviceState == EUsbcDeviceStateSuspended)
  3329 		{
  3209 		{
  3330         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP4, "  Suspending...");
  3210 		__KTRACE_OPT(KUSB, Kern::Printf("  Suspending..."));
  3331 		iOldDeviceState = iDeviceState;
  3211 		iOldDeviceState = iDeviceState;
  3332 		// Put PSL into low power mode here
  3212 		// Put PSL into low power mode here
  3333 		}
  3213 		}
  3334 	else
  3214 	else
  3335 		{
  3215 		{
  3357 			{
  3237 			{
  3358 		    DeConfigure(cancellationCode);
  3238 		    DeConfigure(cancellationCode);
  3359 			}
  3239 			}
  3360 		else if (renumerateState)
  3240 		else if (renumerateState)
  3361 			{
  3241 			{
  3362             OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP5, "TUsbcScChannel:: Reumerated!");
  3242  			__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChannel:: Reumerated!"));
  3363 			// Select main interface & latch in new endpoint set
  3243 			// Select main interface & latch in new endpoint set
  3364 			SelectAlternateSetting(0);
  3244 			SelectAlternateSetting(0);
  3365 			OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP6, "TUsbcScChannel:: StartReads!");
  3245 			__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChannel:: StartReads!"));
  3366 			StartEpReads();
  3246 			StartEpReads();
  3367 			}
  3247 			}
  3368 		}
  3248 		}
  3369 
  3249 
  3370 	const TInt reqNo = (TInt) RDevUsbcScClient::ERequestReEnumerate;
  3250 	const TInt reqNo = (TInt) RDevUsbcScClient::ERequestReEnumerate;
  3388 		TUint32 deviceState;
  3268 		TUint32 deviceState;
  3389 		if (iStatusFifo->GetDeviceQueuedStatus(deviceState) == KErrNone)
  3269 		if (iStatusFifo->GetDeviceQueuedStatus(deviceState) == KErrNone)
  3390 			{
  3270 			{
  3391 			// Device state waiting to be sent userside
  3271 			// Device state waiting to be sent userside
  3392 			completeNow = ETrue;
  3272 			completeNow = ETrue;
  3393 			OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_ALTERNATEDEVICESTATETESTCOMPLETE, "StatusChangeCallback Notify status" );
  3273 			__KTRACE_OPT(KUSB, Kern::Printf("StatusChangeCallback Notify status"));
  3394 			
       
  3395 			// set client descriptor length to zero
  3274 			// set client descriptor length to zero
  3396 			TInt r = Kern::ThreadRawWrite(iClient, iStatusChangePtr, &deviceState,
  3275 			TInt r = Kern::ThreadRawWrite(iClient, iStatusChangePtr, &deviceState,
  3397 										  sizeof(TUint32), iClient);
  3276 										  sizeof(TUint32), iClient);
  3398 			if (r != KErrNone)
  3277 			if (r != KErrNone)
  3399 				PanicClientThread(r);
  3278 				PanicClientThread(r);
  3404 	}
  3283 	}
  3405 
  3284 
  3406 
  3285 
  3407 void DLddUsbcScChannel::DeConfigure(TInt aErrorCode)
  3286 void DLddUsbcScChannel::DeConfigure(TInt aErrorCode)
  3408 	{
  3287 	{
  3409     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DECONFIGURE, "DLddUsbcScChannel::DeConfigure()" );
  3288 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DeConfigure()"));
  3410     
       
  3411 	// Called after deconfiguration. Cancels transfers on all endpoints.
  3289 	// Called after deconfiguration. Cancels transfers on all endpoints.
  3412 	ResetInterface(aErrorCode);
  3290 	ResetInterface(aErrorCode);
  3413 	// Cancel the endpoint status notify request if it is outstanding.
  3291 	// Cancel the endpoint status notify request if it is outstanding.
  3414 	const TInt KEpNotReq = RDevUsbcScClient::ERequestEndpointStatusNotify;
  3292 	const TInt KEpNotReq = RDevUsbcScClient::ERequestEndpointStatusNotify;
  3415 	if (iRequestStatus[KEpNotReq])
  3293 	if (iRequestStatus[KEpNotReq])
  3425 
  3303 
  3426 void DLddUsbcScChannel::StartEpReads()
  3304 void DLddUsbcScChannel::StartEpReads()
  3427 	{
  3305 	{
  3428 	// Queued after enumeration. Starts reads on all endpoints.
  3306 	// Queued after enumeration. Starts reads on all endpoints.
  3429 	// The endpoint itself decides if it can do a read
  3307 	// The endpoint itself decides if it can do a read
  3430 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_STARTEPREADS, "DLddUsbcScChannel::StartEpReads - 1" );
  3308 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::StartEpReads - 1"));
  3431 	
  3309 	
  3432 	TInt i;
  3310 	TInt i;
  3433 	TInt8 needsPacket;
  3311 	TInt8 needsPacket;
  3434 
  3312 
  3435 	for (i=0; i<iNumBuffers; i++)
  3313 	for (i=0; i<iNumBuffers; i++)
  3436 		{
  3314 		{
  3437         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_STARTEPREADS_DUP1, "DLddUsbcScChannel::StartEpReads - 2 %d", i);
  3315 		__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::StartEpReads - 2 %d",i));
       
  3316 
  3438 		needsPacket = iBuffers[i].iNeedsPacket;
  3317 		needsPacket = iBuffers[i].iNeedsPacket;
  3439 		if (needsPacket)
  3318 		if (needsPacket)
  3440 			{
  3319 			{
  3441             OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_STARTEPREADS_DUP2, "DLddUsbcScChannel::StartEpReads - 3");
  3320 			__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::StartEpReads - 3"));
  3442 			iBuffers[i].UpdateBufferList(0,0,(needsPacket==TUsbcScBuffer::KEpIsStarting));
  3321 			iBuffers[i].UpdateBufferList(0,0,(needsPacket==TUsbcScBuffer::KEpIsStarting));
  3443 			}
  3322 			}
  3444 		}
  3323 		}
  3445 
  3324 
  3446 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_STARTEPREADS_DUP3, "DLddUsbcScChannel::StartEpReads - 4");
  3325 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::StartEpReads - 4"));
       
  3326 
  3447 		// now update ep0
  3327 		// now update ep0
  3448 		iBuffers[iEP0OutBuff].Ep0CancelLddRead();
  3328 		iBuffers[iEP0OutBuff].Ep0CancelLddRead();
  3449 		iBuffers[iEP0OutBuff].UpdateBufferList(0,0);
  3329 		iBuffers[iEP0OutBuff].UpdateBufferList(0,0);
  3450 	    OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_STARTEPREADS_DUP4, "DLddUsbcScChannel::StartEpReads - 5");
  3330 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::StartEpReads - 5"));
  3451 
  3331 
  3452 	}
  3332 	}
  3453 
  3333 
  3454 
  3334 
  3455 void DLddUsbcScChannel::ResetInterface(TInt aErrorCode)
  3335 void DLddUsbcScChannel::ResetInterface(TInt aErrorCode)
  3467 
  3347 
  3468 	for (i = 1; i <= iNumberOfEndpoints; i++)
  3348 	for (i = 1; i <= iNumberOfEndpoints; i++)
  3469 		{
  3349 		{
  3470 		// Firstly, cancel ('garbge collect') any stale reads/writes into PIL.
  3350 		// Firstly, cancel ('garbge collect') any stale reads/writes into PIL.
  3471 
  3351 
  3472         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_RESETINTERFACE, "Cancelling transfer ep=%d", i);
  3352 		__KTRACE_OPT(KUSB, Kern::Printf("Cancelling transfer ep=%d", i));
  3473         
       
  3474 		iEndpoint[i]->AbortTransfer();
  3353 		iEndpoint[i]->AbortTransfer();
  3475 
  3354 
  3476 		// All OUT endpoints need a packet sent, to indicate the termination of the current ep 'pipe'.
  3355 		// All OUT endpoints need a packet sent, to indicate the termination of the current ep 'pipe'.
  3477 		// This will complete any current read, or will be read later.
  3356 		// This will complete any current read, or will be read later.
  3478 		// All IN endpoints must be simply cancelled, including anything queued.
  3357 		// All IN endpoints must be simply cancelled, including anything queued.
  3497 	((DLddUsbcScChannel*) aDLddUsbcScChannel)->DoEmergencyComplete();
  3376 	((DLddUsbcScChannel*) aDLddUsbcScChannel)->DoEmergencyComplete();
  3498 	}
  3377 	}
  3499 
  3378 
  3500 TInt DLddUsbcScChannel::DoEmergencyComplete()
  3379 TInt DLddUsbcScChannel::DoEmergencyComplete()
  3501 	{
  3380 	{
  3502     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DOEMERGENCYCOMPLETE, "DLddUsbcScChannel::DoEmergencyComplete" );
  3381 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DoEmergencyComplete"));
  3503     
       
  3504 	// cancel any pending DFCs
  3382 	// cancel any pending DFCs
  3505 	// complete all client requests
  3383 	// complete all client requests
  3506 
  3384 
  3507 	TUsbcScBuffer* buffer;
  3385 	TUsbcScBuffer* buffer;
  3508 	TInt i;	
  3386 	TInt i;	
  3521 		}
  3399 		}
  3522 		
  3400 		
  3523 	// Complete other Eps request
  3401 	// Complete other Eps request
  3524 	for (i = 1; i <= iNumberOfEndpoints; i++)
  3402 	for (i = 1; i <= iNumberOfEndpoints; i++)
  3525 		{
  3403 		{
  3526         OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOEMERGENCYCOMPLETE_DUP1, "Cancelling transfer ep=%d", i);
  3404 		__KTRACE_OPT(KUSB, Kern::Printf("Cancelling transfer ep=%d", i));
  3527 		buffer=iEndpoint[i]->GetBuffer();
  3405 		buffer=iEndpoint[i]->GetBuffer();
  3528 		buffer->iStatusList.CancelQueued();
  3406 		buffer->iStatusList.CancelQueued();
  3529 		buffer->iStatusList.Complete(KErrDisconnected);
  3407 		buffer->iStatusList.Complete(KErrDisconnected);
  3530 		}
  3408 		}
  3531 
  3409 
  3533 
  3411 
  3534     for (TInt i = 0; i < KUsbcMaxRequests; i++)
  3412     for (TInt i = 0; i < KUsbcMaxRequests; i++)
  3535         {
  3413         {
  3536         if (iRequestStatus[i])
  3414         if (iRequestStatus[i])
  3537             {
  3415             {
  3538             OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOEMERGENCYCOMPLETE_DUP2, "Complete request 0x%x", iRequestStatus[i]);
  3416             __KTRACE_OPT(KUSB, Kern::Printf("Complete request 0x%x", iRequestStatus[i]));
  3539             Kern::RequestComplete(iClient, iRequestStatus[i], KErrDisconnected);
  3417             Kern::RequestComplete(iClient, iRequestStatus[i], KErrDisconnected);
  3540             }
  3418             }
  3541         }
  3419         }
  3542     iStatusCallbackInfo.Cancel();
  3420     iStatusCallbackInfo.Cancel();
  3543     iEndpointStatusCallbackInfo.Cancel();
  3421     iEndpointStatusCallbackInfo.Cancel();
  3576 	  iLdd(aLDD),
  3454 	  iLdd(aLDD),
  3577 	  iError(KErrNone),
  3455 	  iError(KErrNone),
  3578 	  iBytesTransferred(0),
  3456 	  iBytesTransferred(0),
  3579 	  iBuffer(NULL)
  3457 	  iBuffer(NULL)
  3580 	{
  3458 	{
  3581     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCENDPOINT_TUSBCSCENDPOINT_CONS, "TUsbcScEndpoint::TUsbcScEndpoint" );
  3459 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint::TUsbcScEndpoint"));
  3582     
       
  3583 	}
  3460 	}
  3584 
  3461 
  3585 
  3462 
  3586 TInt TUsbcScEndpoint::Construct()
  3463 TInt TUsbcScEndpoint::Construct()
  3587 	{
  3464 	{
  3588     OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_CONSTRUCT, "TUsbcScEndpoint::TUsbcScEndpoint iEndpointNumber %d\n",iEndpointNumber);
  3465 	__KTRACE_OPT(KUSB,Kern::Printf("TUsbcScEndpoint::TUsbcScEndpoint iEndpointNumber %d\n",iEndpointNumber));
  3589     
  3466 
  3590 	iRequestCallbackInfo = new TUsbcRequestCallback(iLdd,
  3467 	iRequestCallbackInfo = new TUsbcRequestCallback(iLdd,
  3591 													iEndpointNumber,
  3468 													iEndpointNumber,
  3592 													(iEndpointNumber==0)?DLddUsbcScChannel::RequestCallbackEp0:TUsbcScEndpoint::RequestCallback,
  3469 													(iEndpointNumber==0)?DLddUsbcScChannel::RequestCallbackEp0:TUsbcScEndpoint::RequestCallback,
  3593 													(iEndpointNumber==0)?  (TAny*) iLdd:  (TAny*) this,
  3470 													(iEndpointNumber==0)?  (TAny*) iLdd:  (TAny*) this,
  3594 													iLdd->iDfcQ,
  3471 													iLdd->iDfcQ,
  3598 	}
  3475 	}
  3599 
  3476 
  3600 
  3477 
  3601 TUsbcScEndpoint::~TUsbcScEndpoint()
  3478 TUsbcScEndpoint::~TUsbcScEndpoint()
  3602 	{
  3479 	{
  3603     OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCENDPOINT_TUSBCSCENDPOINT_DES, "TUsbcScEndpoint::~TUsbcScEndpoint(%d)", iEndpointNumber);
  3480 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint::~TUsbcScEndpoint(%d)", iEndpointNumber));
  3604     
       
  3605 	AbortTransfer();
  3481 	AbortTransfer();
  3606 	delete iRequestCallbackInfo;
  3482 	delete iRequestCallbackInfo;
  3607 	}
  3483 	}
  3608 
  3484 
  3609 // This is called by the PIL, on return from a read or write.
  3485 // This is called by the PIL, on return from a read or write.
  3610 // Inturn it calls either the read or write function for that buffer.
  3486 // Inturn it calls either the read or write function for that buffer.
  3611 
  3487 
  3612 void TUsbcScEndpoint::RequestCallback(TAny* aTUsbcScEndpoint)
  3488 void TUsbcScEndpoint::RequestCallback(TAny* aTUsbcScEndpoint)
  3613 	{
  3489 	{
  3614     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCENDPOINT_REQUESTCALLBACK, "TUsbcScEndpoint::RequestCallback" );
  3490 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint::RequestCallback"));
  3615     
  3491 
  3616 	if (((TUsbcScEndpoint*)aTUsbcScEndpoint)->iLdd->ChannelClosing())
  3492 	if (((TUsbcScEndpoint*)aTUsbcScEndpoint)->iLdd->ChannelClosing())
  3617 		{
  3493 		{
  3618 		OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_REQUESTCALLBACK_DUP1, "Channel Closing: Completion not accepted!" );
  3494 		__KTRACE_OPT(KUSB, Kern::Printf("Channel Closing: Completion not accepted!"));
  3619 		return;
  3495 		return;
  3620 		}
  3496 		}
  3621 
  3497 
  3622 	switch (((TUsbcScEndpoint*) aTUsbcScEndpoint)->iRequestCallbackInfo->iTransferDir)
  3498 	switch (((TUsbcScEndpoint*) aTUsbcScEndpoint)->iRequestCallbackInfo->iTransferDir)
  3623 	{
  3499 	{
  3626 		return;
  3502 		return;
  3627 	case EControllerRead:
  3503 	case EControllerRead:
  3628 		((TUsbcScEndpoint*) aTUsbcScEndpoint)->iBuffer->CompleteRead();
  3504 		((TUsbcScEndpoint*) aTUsbcScEndpoint)->iBuffer->CompleteRead();
  3629 		return;
  3505 		return;
  3630 	default:
  3506 	default:
  3631 	    OstTrace1(TRACE_NORMAL, TUSBCSCENDPOINT_REQUESTCALLBACK_DUP2, "TUsbcScEndpoint::RequestCallback - Unexpected compleation direction %d",((TUsbcScEndpoint*) aTUsbcScEndpoint)->iRequestCallbackInfo->iTransferDir);
  3507 		Kern::Printf("TUsbcScEndpoint::RequestCallback - Unexpected compleation direction %d",((TUsbcScEndpoint*) aTUsbcScEndpoint)->iRequestCallbackInfo->iTransferDir);
  3632 		Kern::Fault("TUsbcScEndpoint::RequestCallback", __LINE__);
  3508 		Kern::Fault("TUsbcScEndpoint::RequestCallback", __LINE__);
  3633 	} 
  3509 	} 
  3634 	}
  3510 	}
  3635 
  3511 
  3636 
  3512 
  3642 
  3518 
  3643 void TUsbcScEndpoint::AbortTransfer()
  3519 void TUsbcScEndpoint::AbortTransfer()
  3644 	{
  3520 	{
  3645 	if (!iLdd->iRealizeCalled)
  3521 	if (!iLdd->iRealizeCalled)
  3646 		{
  3522 		{
  3647         OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER, "TUsbcScEndpoint::AbortTransfer Ep# %d Real Ep # %d - N.R.",iEndpointNumber, iRealEpNumber);
  3523 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint::AbortTransfer Ep# %d Real Ep # %d - N.R.",iEndpointNumber, iRealEpNumber));
  3648         
       
  3649 		return;
  3524 		return;
  3650 		} 
  3525 		} 
  3651 	else
  3526 	else
  3652 		{
  3527 		{
  3653         OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP1, "TUsbcScEndpoint::AbortTransfer Ep# %d Real Ep # %d",iEndpointNumber, iRealEpNumber);
  3528 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint::AbortTransfer Ep# %d Real Ep # %d",iEndpointNumber, iRealEpNumber));
  3654 		}
  3529 		}
  3655 
  3530 
  3656 	
  3531 	
  3657 	if (iBuffer && (iBuffer->iStatusList.iState) || (!iRealEpNumber))
  3532 	if (iBuffer && (iBuffer->iStatusList.iState) || (!iRealEpNumber))
  3658 		{
  3533 		{
  3662 			iController->CancelReadBuffer(iLdd, iRealEpNumber);
  3537 			iController->CancelReadBuffer(iLdd, iRealEpNumber);
  3663 		else
  3538 		else
  3664 			{
  3539 			{
  3665 			if (iEndpointNumber!=0) // endpoint zero starts off not sent in any direction, then keeps changing.
  3540 			if (iEndpointNumber!=0) // endpoint zero starts off not sent in any direction, then keeps changing.
  3666 				{
  3541 				{
  3667                 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP2, "\nTUsbcScEndpoint::AbortTransfer WARNING: Invalid Direction %d on (%d,%d)!\n",iRequestCallbackInfo->iTransferDir,iEndpointNumber, iRealEpNumber);
  3542 				__KTRACE_OPT(KUSB,Kern::Printf("\nTUsbcScEndpoint::AbortTransfer WARNING: Invalid Direction %d on (%d,%d)!\n",iRequestCallbackInfo->iTransferDir,iEndpointNumber, iRealEpNumber));
  3668 				}
  3543 				}
  3669 			else
  3544 			else
  3670 				{
  3545 				{
  3671                 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP3, "\nTUsbcScEndpoint::AbortTransfer Can't stop direction %d on (%d,%d)!\n",iRequestCallbackInfo->iTransferDir,iEndpointNumber, iRealEpNumber);
  3546 				__KTRACE_OPT(KUSB, Kern::Printf("\nTUsbcScEndpoint::AbortTransfer Can't stop direction %d on (%d,%d)!\n",iRequestCallbackInfo->iTransferDir,iEndpointNumber, iRealEpNumber));
  3672 				}
  3547 				}
  3673 			}
  3548 			}
  3674 		}
  3549 		}
  3675 	else if (!iBuffer)
  3550 	else if (!iBuffer)
  3676 		{
  3551 		{
  3677         OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP4, "\nTUsbcScEndpoint::AbortTransfer WARNING: iBuffer is NULL on (%d,%d)\n",iEndpointNumber, iRealEpNumber);
  3552 		__KTRACE_OPT(KUSB,Kern::Printf("\nTUsbcScEndpoint::AbortTransfer WARNING: iBuffer is NULL on (%d,%d)\n",iEndpointNumber, iRealEpNumber));
  3678 
       
  3679 		return;
  3553 		return;
  3680 		}
  3554 		}
  3681 	
  3555 	
  3682 	if (iRequestCallbackInfo)
  3556 	if (iRequestCallbackInfo)
  3683 		iRequestCallbackInfo->iDfc.Cancel();
  3557 		iRequestCallbackInfo->iDfc.Cancel();
  3684 	else
  3558 	else
  3685 		{
  3559 		{
  3686         OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP5, "\nTUsbcScEndpoint::AbortTransfer WARNING: iRequestCallbackInfo is NULL\n");
  3560 		__KTRACE_OPT(KUSB,Kern::Printf("\nTUsbcScEndpoint::AbortTransfer WARNING: iRequestCallbackInfo is NULL\n"));
  3687 
       
  3688 		}
  3561 		}
  3689 		
  3562 		
  3690 	OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP6, "TUsbcScEndpoint Done.");
  3563 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint Done."));
  3691 	}
  3564 	}
  3692 
  3565 
  3693 // End TUsbcScEndpoint
  3566 // End TUsbcScEndpoint
  3694 
  3567 
  3695 
  3568 
  3714 	}
  3587 	}
  3715 
  3588 
  3716 
  3589 
  3717 TUsbcScAlternateSetting::~TUsbcScAlternateSetting()
  3590 TUsbcScAlternateSetting::~TUsbcScAlternateSetting()
  3718 	{
  3591 	{
  3719     OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCALTERNATESETTING_TUSBCSCALTERNATESETTING_DES, "TUsbcScAlternateSetting::~TUsbcScAlternateSetting()" );
  3592 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcScAlternateSetting::~TUsbcScAlternateSetting()"));
  3720     
       
  3721 	for (TInt i = 0; i <= KMaxEndpointsPerClient; i++)
  3593 	for (TInt i = 0; i <= KMaxEndpointsPerClient; i++)
  3722 		{
  3594 		{
  3723 		delete iEndpoint[i];
  3595 		delete iEndpoint[i];
  3724 		}
  3596 		}
  3725 	}
  3597 	}