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