kernel/eka/drivers/usbc/d_usbc.cpp
branchRCL_3
changeset 257 3e88ff8f41d5
parent 256 c1f20ce4abcf
equal deleted inserted replaced
256:c1f20ce4abcf 257:3e88ff8f41d5
     1 // Copyright (c) 2000-2010 Nokia Corporation and/or its subsidiary(-ies).
     1 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "Eclipse Public License v1.0"
     4 // under the terms of the License "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
    21  @file d_usbc.cpp
    21  @file d_usbc.cpp
    22  @internalTechnology
    22  @internalTechnology
    23 */
    23 */
    24 
    24 
    25 #include <drivers/usbc.h>
    25 #include <drivers/usbc.h>
    26 #include "OstTraceDefinitions.h"
       
    27 #ifdef OST_TRACE_COMPILER_IN_USE
       
    28 #include "d_usbcTraces.h"
       
    29 #endif
       
    30 
       
    31 
    26 
    32 
    27 
    33 _LIT(KUsbLddName, "Usbc");
    28 _LIT(KUsbLddName, "Usbc");
    34 
    29 
    35 static const TInt KUsbRequestCallbackPriority = 2;
    30 static const TInt KUsbRequestCallbackPriority = 2;
    98 TInt DUsbcLogDevice::Install()
    93 TInt DUsbcLogDevice::Install()
    99 	{
    94 	{
   100 	// Only proceed if we have the Controller underneath us
    95 	// Only proceed if we have the Controller underneath us
   101 	if (!DUsbClientController::UsbcControllerPointer())
    96 	if (!DUsbClientController::UsbcControllerPointer())
   102 		{
    97 		{
   103 		OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DUSBCLOGDEVICE_INSTALL,
    98 		__KTRACE_OPT(KPANIC, Kern::Printf("LDD Install: USB Controller Not Present"));
   104 		        "LDD Install: USB Controller Not Present" );
       
   105 		
       
   106 		return KErrGeneral;
    99 		return KErrGeneral;
   107 		}
   100 		}
   108 	return SetName(&KUsbLddName);
   101 	return SetName(&KUsbLddName);
   109 	}
   102 	}
   110 
   103 
   139 	  iOwnsDeviceControl(EFalse),
   132 	  iOwnsDeviceControl(EFalse),
   140 	  iAlternateSetting(0),
   133 	  iAlternateSetting(0),
   141 	  iDeviceStatusNeeded(EFalse),
   134 	  iDeviceStatusNeeded(EFalse),
   142 	  iChannelClosing(EFalse)
   135 	  iChannelClosing(EFalse)
   143 	{
   136 	{
   144 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCCHANNEL_DLDDUSBCCHANNEL_CONS, 
   137 	__KTRACE_OPT(KUSB, Kern::Printf("*** DLddUsbcChannel::DLddUsbcChannel CTOR"));
   145 	        "*** DLddUsbcChannel::DLddUsbcChannel CTOR" );
       
   146 	
       
   147 	iClient = &Kern::CurrentThread();
   138 	iClient = &Kern::CurrentThread();
   148 	iClient->Open();
   139 	iClient->Open();
   149 	for (TInt i = 1; i <= KMaxEndpointsPerClient; i++)
   140 	for (TInt i = 1; i <= KMaxEndpointsPerClient; i++)
   150 		{
   141 		{
   151 		iEndpoint[i] = NULL;
   142 		iEndpoint[i] = NULL;
   157 	}
   148 	}
   158 
   149 
   159 
   150 
   160 DLddUsbcChannel::~DLddUsbcChannel()
   151 DLddUsbcChannel::~DLddUsbcChannel()
   161 	{
   152 	{
   162 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCCHANNEL_DLDDUSBCCHANNEL_DES, 
   153 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcChannel::~DLddUsbcChannel()"));
   163 	        "DLddUsbcChannel::~DLddUsbcChannel()" );
       
   164 	
       
   165 	if (iController)
   154 	if (iController)
   166 		{
   155 		{
   167 		iController->DeRegisterClient(this);
   156 		iController->DeRegisterClient(this);
   168 		iStatusCallbackInfo.Cancel();
   157 		iStatusCallbackInfo.Cancel();
   169 		iEndpointStatusCallbackInfo.Cancel();
   158 		iEndpointStatusCallbackInfo.Cancel();
   205 //
   194 //
   206 // Create channel
   195 // Create channel
   207 //
   196 //
   208 TInt DLddUsbcChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer)
   197 TInt DLddUsbcChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer)
   209 	{
   198 	{
   210 	OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCREATE, 
   199 	__KTRACE_OPT(KUSB, Kern::Printf("LDD DoCreateL 1 Ver = %02d %02d %02d",
   211 	        "LDD DoCreateL 1 Ver = %02d %02d %02d", aVer.iMajor, aVer.iMinor, aVer.iBuild );
   200 									aVer.iMajor, aVer.iMinor, aVer.iBuild));
   212 	
       
   213 	if (!Kern::CurrentThreadHasCapability(ECapabilityCommDD,
   201 	if (!Kern::CurrentThreadHasCapability(ECapabilityCommDD,
   214 										  __PLATSEC_DIAGNOSTIC_STRING("Checked by USBC.LDD (USB Driver)")))
   202 										  __PLATSEC_DIAGNOSTIC_STRING("Checked by USBC.LDD (USB Driver)")))
   215 		{
   203 		{
   216 		return KErrPermissionDenied;
   204 		return KErrPermissionDenied;
   217 		}
   205 		}
   437 //
   425 //
   438 // Overriding DObject virtual
   426 // Overriding DObject virtual
   439 //
   427 //
   440 TInt DLddUsbcChannel::RequestUserHandle(DThread* aThread, TOwnerType /*aType*/)
   428 TInt DLddUsbcChannel::RequestUserHandle(DThread* aThread, TOwnerType /*aType*/)
   441 	{
   429 	{
   442 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_REQUESTUSERHANDLE,
   430 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcChannel::RequestUserHandle"));
   443 	        "DLddUsbcChannel::RequestUserHandle" );
       
   444 	// The USB client LDD is not designed for a channel to be shared between
   431 	// The USB client LDD is not designed for a channel to be shared between
   445 	// threads. It saves a pointer to the current thread when it is opened, and
   432 	// threads. It saves a pointer to the current thread when it is opened, and
   446 	// uses this to complete any asynchronous requests.
   433 	// uses this to complete any asynchronous requests.
   447 	// It is therefore not acceptable for the handle to be duplicated and used
   434 	// It is therefore not acceptable for the handle to be duplicated and used
   448 	// by another thread:
   435 	// by another thread:
   461 // Asynchronous requests - overriding pure virtual
   448 // Asynchronous requests - overriding pure virtual
   462 //
   449 //
   463 void DLddUsbcChannel::DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2)
   450 void DLddUsbcChannel::DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2)
   464 	{
   451 	{
   465 	// Check on request status
   452 	// Check on request status
   466 	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOREQUEST, 
   453 	__KTRACE_OPT(KUSB, Kern::Printf("DoRequest 0x%08x", aReqNo));
   467 	        "DoRequest 0x%08x", aReqNo );
       
   468 		TInt r = KErrNone;
   454 		TInt r = KErrNone;
   469 		if (iRequestStatus[aReqNo] != NULL)
   455 		if (iRequestStatus[aReqNo] != NULL)
   470 			{
   456 			{
   471 			DestroyAllInterfaces();
   457 			DestroyAllInterfaces();
   472 			PanicClientThread(ERequestAlreadyPending);
   458 			PanicClientThread(ERequestAlreadyPending);
   531 
   517 
   532 	switch (aReqNo)
   518 	switch (aReqNo)
   533 		{
   519 		{
   534 	case RDevUsbcClient::ERequestAlternateDeviceStatusNotify:
   520 	case RDevUsbcClient::ERequestAlternateDeviceStatusNotify:
   535 		{
   521 		{
   536 		OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOOTHERASYNCREQ, 
   522 		__KTRACE_OPT(KUSB, Kern::Printf("EControlReqDeviceStatusNotify"));
   537 		        "EControlReqDeviceStatusNotify" );
       
   538 		if (a1 != NULL)
   523 		if (a1 != NULL)
   539 			{
   524 			{
   540 			iDeviceStatusNeeded = ETrue;
   525 			iDeviceStatusNeeded = ETrue;
   541 			iStatusChangePtr = a1;
   526 			iStatusChangePtr = a1;
   542 			aNeedsCompletion = AlternateDeviceStateTestComplete();
   527 			aNeedsCompletion = AlternateDeviceStateTestComplete();
   545 			r = KErrArgument;
   530 			r = KErrArgument;
   546 		break;
   531 		break;
   547 		}
   532 		}
   548 	case RDevUsbcClient::ERequestReEnumerate:
   533 	case RDevUsbcClient::ERequestReEnumerate:
   549 		{
   534 		{
   550 	    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOOTHERASYNCREQ_DUP1, 
   535 		__KTRACE_OPT(KUSB, Kern::Printf("ERequestReEnumerate"));
   551 	            "ERequestReEnumerate" );
       
   552 		// If successful, this will complete via the status notification.
   536 		// If successful, this will complete via the status notification.
   553 		r = iController->ReEnumerate();
   537 		r = iController->ReEnumerate();
   554 		break;
   538 		break;
   555 		}
   539 		}
   556 	case RDevUsbcClient::ERequestEndpointStatusNotify:
   540 	case RDevUsbcClient::ERequestEndpointStatusNotify:
   557 		{
   541 		{
   558 	    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOOTHERASYNCREQ_DUP2, 
   542 		__KTRACE_OPT(KUSB, Kern::Printf("ERequestEndpointStatusNotify"));
   559 	            "ERequestEndpointStatusNotify" );
       
   560 		if (a1 != NULL)
   543 		if (a1 != NULL)
   561 			{
   544 			{
   562 			iEndpointStatusChangePtr = a1;
   545 			iEndpointStatusChangePtr = a1;
   563 			}
   546 			}
   564 		else
   547 		else
   565 			r = KErrArgument;
   548 			r = KErrArgument;
   566 		break;
   549 		break;
   567 			}
   550 			}
   568 	case RDevUsbcClient::ERequestOtgFeaturesNotify:
   551 	case RDevUsbcClient::ERequestOtgFeaturesNotify:
   569 		{
   552 		{
   570 		OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOOTHERASYNCREQ_DUP3, 
   553 		__KTRACE_OPT(KUSB, Kern::Printf("ERequestOtgFeaturesNotify"));
   571 		        "ERequestOtgFeaturesNotify" );
       
   572 		if (a1 != NULL)
   554 		if (a1 != NULL)
   573 			{
   555 			{
   574             iOtgFeatureChangePtr = a1;
   556             iOtgFeatureChangePtr = a1;
   575             }
   557             }
   576 		else
   558 		else
   605 	if (aEndpointNum == 0)
   587 	if (aEndpointNum == 0)
   606 		{
   588 		{
   607 		// ep0 requests
   589 		// ep0 requests
   608 		if (!(iValidInterface || iOwnsDeviceControl))
   590 		if (!(iValidInterface || iOwnsDeviceControl))
   609 			{
   591 			{
   610 			OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ,
   592 			__KTRACE_OPT(KUSB, Kern::Printf("DoRequest rejected: not configured (Ep0)"));
   611 			        "DoRequest rejected: not configured (Ep0)" );
       
   612 			r = KErrUsbInterfaceNotReady;
   593 			r = KErrUsbInterfaceNotReady;
   613 			goto exit;
   594 			goto exit;
   614 			}
   595 			}
   615 		}
   596 		}
   616 	else
   597 	else
   618 		// other eps
   599 		// other eps
   619 		if (!(iValidInterface && (iDeviceState == EUsbcDeviceStateConfigured ||
   600 		if (!(iValidInterface && (iDeviceState == EUsbcDeviceStateConfigured ||
   620 		                          iDeviceState == EUsbcDeviceStateSuspended))
   601 		                          iDeviceState == EUsbcDeviceStateSuspended))
   621 		   )
   602 		   )
   622 			{
   603 			{
   623 			OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP1,
   604 			__KTRACE_OPT(KUSB, Kern::Printf("DoRequest rejected not configured (Ep %d)", aEndpointNum));
   624 			        "DoRequest rejected not configured (Ep %d)", aEndpointNum );
       
   625 			r = KErrUsbInterfaceNotReady;
   605 			r = KErrUsbInterfaceNotReady;
   626 			goto exit;
   606 			goto exit;
   627 			}
   607 			}
   628 		}
   608 		}
   629 
   609 
   630 	if (!ValidEndpoint(aEndpointNum))
   610 	if (!ValidEndpoint(aEndpointNum))
   631 		{
   611 		{
   632 		OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP2,
   612 		__KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Read: in error complete"));
   633 		        "  Error: DoRequest Read: in error complete" );
       
   634 		r = KErrUsbEpNotInInterface;
   613 		r = KErrUsbEpNotInInterface;
   635 		goto exit;
   614 		goto exit;
   636  		}
   615  		}
   637 
   616 
   638 	if (a1 == NULL)
   617 	if (a1 == NULL)
   648 		goto exit;
   627 		goto exit;
   649 		}
   628 		}
   650 	pEndpoint = iEndpoint[aEndpointNum];
   629 	pEndpoint = iEndpoint[aEndpointNum];
   651 	if (!pEndpoint)
   630 	if (!pEndpoint)
   652 		{
   631 		{
   653 		OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP3,
   632 		__KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Read: in error complete"));
   654 		        "  Error: DoRequest Read: in error complete" );
       
   655 		r = KErrUsbEpNotInInterface;
   633 		r = KErrUsbEpNotInInterface;
   656 		goto exit;
   634 		goto exit;
   657 		}
   635 		}
   658 
   636 
   659 	pEndpointInfo = pEndpoint->EndpointInfo();
   637 	pEndpointInfo = pEndpoint->EndpointInfo();
   660 	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP4,
   638 	__KTRACE_OPT(KUSB, Kern::Printf("DoRequest %d", aEndpointNum));
   661 	        "DoRequest %d", aEndpointNum );
       
   662 
   639 
   663 	switch (pTfr->iTransferType)
   640 	switch (pTfr->iTransferType)
   664 		{
   641 		{
   665 
   642 
   666 	case ETransferTypeReadData:
   643 	case ETransferTypeReadData:
   667 	case ETransferTypeReadPacket:
   644 	case ETransferTypeReadPacket:
   668 	case ETransferTypeReadUntilShort:
   645 	case ETransferTypeReadUntilShort:
   669 	case ETransferTypeReadOneOrMore:
   646 	case ETransferTypeReadOneOrMore:
   670 		{
   647 		{
   671 		OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP5,
   648 		__KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read"));
   672 		        "DoRequest Read" );
       
   673 		if (pEndpoint->iDmaBuffers->RxIsActive())
   649 		if (pEndpoint->iDmaBuffers->RxIsActive())
   674 			{
   650 			{
   675 			OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP6,
   651 			__KTRACE_OPT(KUSB, Kern::Printf("**** ReadReq ep%d RxActive", aEndpointNum));
   676 			        "**** ReadReq ep%d RxActive", aEndpointNum );
       
   677 			}
   652 			}
   678 		else
   653 		else
   679 			{
   654 			{
   680 			OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP7,
   655 			__KTRACE_OPT(KUSB, Kern::Printf("**** ReadReq ep%d RxInActive", aEndpointNum));
   681 			        "**** ReadReq ep%d RxInActive", aEndpointNum );
       
   682 			}
   656 			}
   683 
   657 
   684 		if (pEndpointInfo->iDir != KUsbEpDirOut &&
   658 		if (pEndpointInfo->iDir != KUsbEpDirOut &&
   685 			pEndpointInfo->iDir != KUsbEpDirBidirect)
   659 			pEndpointInfo->iDir != KUsbEpDirBidirect)
   686 			{
   660 			{
   687 			// Trying to do the wrong thing
   661 			// Trying to do the wrong thing
   688 			OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP8,
   662 			__KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Read: in error complete"));
   689 			        "  Error: DoRequest Read: in error complete" );
       
   690 			r = KErrUsbEpBadDirection;
   663 			r = KErrUsbEpBadDirection;
   691 			break;
   664 			break;
   692 			}
   665 			}
   693 		// Set the length of data to zero now to catch all cases
   666 		// Set the length of data to zero now to catch all cases
   694 		TPtrC8 pZeroDesc(NULL, 0);
   667 		TPtrC8 pZeroDesc(NULL, 0);
   702 			}
   675 			}
   703 		else
   676 		else
   704 			{
   677 			{
   705 			if (pTfr->iTransferType == ETransferTypeReadPacket)
   678 			if (pTfr->iTransferType == ETransferTypeReadPacket)
   706 				{
   679 				{
   707 				OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP9,
   680 				__KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read packet: data available complete"));
   708 				        "DoRequest Read packet: data available complete" );
       
   709 				r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
   681 				r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
   710 				aNeedsCompletion = ETrue;
   682 				aNeedsCompletion = ETrue;
   711 				break;
   683 				break;
   712 				}
   684 				}
   713 			else if (pTfr->iTransferType == ETransferTypeReadData)
   685 			else if (pTfr->iTransferType == ETransferTypeReadData)
   714 				{
   686 				{
   715 				if (pTfr->iTransferSize <= pEndpoint->RxBytesAvailable())
   687 				if (pTfr->iTransferSize <= pEndpoint->RxBytesAvailable())
   716 					{
   688 					{
   717 					OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP10,
   689 					__KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read data: data available complete"));
   718 					        "DoRequest Read data: data available complete");
       
   719 					r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
   690 					r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
   720 					aNeedsCompletion = ETrue;
   691 					aNeedsCompletion = ETrue;
   721 					break;
   692 					break;
   722 					}
   693 					}
   723 				else
   694 				else
   727 				}
   698 				}
   728 			else if (pTfr->iTransferType == ETransferTypeReadOneOrMore)
   699 			else if (pTfr->iTransferType == ETransferTypeReadOneOrMore)
   729 				{
   700 				{
   730 				if (pEndpoint->RxBytesAvailable() > 0)
   701 				if (pEndpoint->RxBytesAvailable() > 0)
   731 					{
   702 					{
   732 					OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP11,
   703 					__KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read data: data available complete"));
   733 					        "DoRequest Read data: data available complete" );
       
   734 					r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
   704 					r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
   735 					aNeedsCompletion = ETrue;
   705 					aNeedsCompletion = ETrue;
   736 					break;
   706 					break;
   737 					}
   707 					}
   738 				else
   708 				else
   746 				TInt maxPacketSize = pEndpoint->EndpointInfo()->iSize;
   716 				TInt maxPacketSize = pEndpoint->EndpointInfo()->iSize;
   747 				if( (pTfr->iTransferSize <= nRx) ||
   717 				if( (pTfr->iTransferSize <= nRx) ||
   748 					(nRx < maxPacketSize) ||
   718 					(nRx < maxPacketSize) ||
   749 					pEndpoint->iDmaBuffers->ShortPacketExists())
   719 					pEndpoint->iDmaBuffers->ShortPacketExists())
   750 					{
   720 					{
   751                     OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP12,
   721 					__KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read data: data available complete"));
   752                             "DoRequest Read data: data available complete" );
       
   753 
       
   754 					r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
   722 					r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
   755 					aNeedsCompletion = ETrue;
   723 					aNeedsCompletion = ETrue;
   756 					}
   724 					}
   757 				else
   725 				else
   758 					{
   726 					{
   761 				}
   729 				}
   762 			}
   730 			}
   763 		r = pEndpoint->TryToStartRead(EFalse);
   731 		r = pEndpoint->TryToStartRead(EFalse);
   764 		if (r != KErrNone)
   732 		if (r != KErrNone)
   765 			{
   733 			{
   766             OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP13,
   734 			__KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read: couldn't start read"));
   767                     "DoRequest Read: couldn't start read" );
       
   768 
       
   769 			r = KErrNone;									// Reader full isn't a userside error;
   735 			r = KErrNone;									// Reader full isn't a userside error;
   770 			}
   736 			}
   771 		break;
   737 		break;
   772 		}
   738 		}
   773 
   739 
   774 	case ETransferTypeWrite:
   740 	case ETransferTypeWrite:
   775 		{
   741 		{
   776         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP14,
   742 		__KTRACE_OPT(KUSB, Kern::Printf("DoRequest Write 1"));
   777                 "DoRequest Write 1" );
       
   778 		if (pEndpointInfo->iDir != KUsbEpDirIn &&
   743 		if (pEndpointInfo->iDir != KUsbEpDirIn &&
   779 			pEndpointInfo->iDir != KUsbEpDirBidirect)
   744 			pEndpointInfo->iDir != KUsbEpDirBidirect)
   780 			{
   745 			{
   781 			OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP15,
   746 			__KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Write: wrong direction complete"));
   782 			        "  Error: DoRequest Write: wrong direction complete" );
       
   783 			r = KErrUsbEpBadDirection;
   747 			r = KErrUsbEpBadDirection;
   784 			break;
   748 			break;
   785 			}
   749 			}
   786 		OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP16,
   750 		__KTRACE_OPT(KUSB, Kern::Printf("DoRequest Write 2"));
   787 		        "DoRequest Write 2" );
       
   788 
   751 
   789 
   752 
   790 		TInt desLength=iClientAsynchNotify[aEndpointNum]->iClientBuffer->Length();
   753 		TInt desLength=iClientAsynchNotify[aEndpointNum]->iClientBuffer->Length();
   791 		
   754 		
   792 		if (desLength < pTfr->iTransferSize)
   755 		if (desLength < pTfr->iTransferSize)
   793 			{
   756 			{
   794 			OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP17,
   757 			__KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Write: user buffer too short"));
   795 			        "  Error: DoRequest Write: user buffer too short" );
       
   796 			r = KErrUsbTransferSize;
   758 			r = KErrUsbTransferSize;
   797 			break;
   759 			break;
   798 			}
   760 			}
   799 
   761 
   800 		OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP18,
   762 		__KTRACE_OPT(KUSB, Kern::Printf("DoRequest Write 3 length=%d maxlength=%d",
   801 		        "DoRequest Write 3 length=%d maxlength=%d", pTfr->iTransferSize, desLength);
   763 										pTfr->iTransferSize, desLength));
   802 		// Zero length writes are acceptable
   764 		// Zero length writes are acceptable
   803 		pEndpoint->SetClientWritePending(ETrue);
   765 		pEndpoint->SetClientWritePending(ETrue);
   804 		r = pEndpoint->TryToStartWrite(pTfr);
   766 		r = pEndpoint->TryToStartWrite(pTfr);
   805 		if (r != KErrNone)
   767 		if (r != KErrNone)
   806 			{
   768 			{
   807 			OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP19,
   769 			__KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Write: couldn't start write"));
   808 			        "  Error: DoRequest Write: couldn't start write" );
       
   809 			pEndpoint->SetClientWritePending(EFalse);
   770 			pEndpoint->SetClientWritePending(EFalse);
   810 			}
   771 			}
   811 		break;
   772 		break;
   812 		}
   773 		}
   813 
   774 
   814 	default:
   775 	default:
   815         OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_DOTRANSFERASYNCREQ_DUP20,
   776 		__KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoTransferAsyncReq: pTfr->iTransferType = %d not supported",
   816                 "  Error: DoTransferAsyncReq: pTfr->iTransferType = %d not supported", pTfr->iTransferType);
   777 										  pTfr->iTransferType));
   817 
       
   818 		r = KErrNotSupported;
   778 		r = KErrNotSupported;
   819 		break;
   779 		break;
   820 		}
   780 		}
   821  exit:
   781  exit:
   822 	aNeedsCompletion = aNeedsCompletion || (r != KErrNone);
   782 	aNeedsCompletion = aNeedsCompletion || (r != KErrNone);
   828 // Cancel an outstanding request - overriding pure virtual
   788 // Cancel an outstanding request - overriding pure virtual
   829 //
   789 //
   830 TInt DLddUsbcChannel::DoCancel(TInt aReqNo)
   790 TInt DLddUsbcChannel::DoCancel(TInt aReqNo)
   831 	{
   791 	{
   832 	TInt r = KErrNone;
   792 	TInt r = KErrNone;
   833 	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCANCEL, 
   793 	__KTRACE_OPT(KUSB, Kern::Printf("DoCancel: 0x%x", aReqNo));
   834 	        "DoCancel: 0x%x", aReqNo );
       
   835 	if (aReqNo <= iNumberOfEndpoints)
   794 	if (aReqNo <= iNumberOfEndpoints)
   836 		{
   795 		{
   837 		OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCANCEL_DUP1, 
   796 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel endpoint: 0x%x", aReqNo));
   838 		        "DoCancel endpoint: 0x%x", aReqNo );
       
   839 
       
   840 		iEndpoint[aReqNo]->CancelTransfer(iClient,iClientAsynchNotify[aReqNo]->iClientBuffer);
   797 		iEndpoint[aReqNo]->CancelTransfer(iClient,iClientAsynchNotify[aReqNo]->iClientBuffer);
   841 		}
   798 		}
   842 	else if (aReqNo == RDevUsbcClient::ERequestAlternateDeviceStatusNotify)
   799 	else if (aReqNo == RDevUsbcClient::ERequestAlternateDeviceStatusNotify)
   843 		{
   800 		{
   844 		OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCANCEL_DUP2, 
   801 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel: ERequestAlternateDeviceStatusNotify 0x%x", aReqNo));
   845 		        "DoCancel: ERequestAlternateDeviceStatusNotify 0x%x", aReqNo );
       
   846 
       
   847 		iDeviceStatusNeeded = EFalse;
   802 		iDeviceStatusNeeded = EFalse;
   848 		iStatusFifo->FlushQueue();
   803 		iStatusFifo->FlushQueue();
   849 		if (iStatusChangePtr)
   804 		if (iStatusChangePtr)
   850 			{
   805 			{
   851 			iStatusChangeReq->Data()=iController->GetDeviceStatus();
   806 			iStatusChangeReq->Data()=iController->GetDeviceStatus();
   859 				return KErrNone;
   814 				return KErrNone;
   860 			}
   815 			}
   861 		}
   816 		}
   862 	else if (aReqNo == RDevUsbcClient::ERequestReEnumerate)
   817 	else if (aReqNo == RDevUsbcClient::ERequestReEnumerate)
   863 		{
   818 		{
   864         OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCANCEL_DUP3, 
   819 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestReEnumerate: 0x%x", aReqNo));
   865                 "DoCancel ERequestReEnumerate: 0x%x", aReqNo );
       
   866 
       
   867 		}
   820 		}
   868 	else if (aReqNo == RDevUsbcClient::ERequestEndpointStatusNotify)
   821 	else if (aReqNo == RDevUsbcClient::ERequestEndpointStatusNotify)
   869 		{
   822 		{
   870         OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCANCEL_DUP4,
   823 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestEndpointStatusNotify: 0x%x", aReqNo));
   871                 "DoCancel ERequestEndpointStatusNotify: 0x%x", aReqNo );
       
   872 
       
   873 		CancelNotifyEndpointStatus();
   824 		CancelNotifyEndpointStatus();
   874 		if (iEndpointStatusChangeReq->IsReady())
   825 		if (iEndpointStatusChangeReq->IsReady())
   875 			{
   826 			{
   876 			iRequestStatus[aReqNo] = NULL;
   827 			iRequestStatus[aReqNo] = NULL;
   877 			Kern::QueueRequestComplete(iClient, iEndpointStatusChangeReq, KErrCancel);
   828 			Kern::QueueRequestComplete(iClient, iEndpointStatusChangeReq, KErrCancel);
   878 			}
   829 			}
   879 		return KErrNone;
   830 		return KErrNone;
   880 		}
   831 		}
   881 	else if (aReqNo == RDevUsbcClient::ERequestOtgFeaturesNotify)
   832 	else if (aReqNo == RDevUsbcClient::ERequestOtgFeaturesNotify)
   882 		{
   833 		{
   883         OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCANCEL_DUP5,
   834 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestOtgFeaturesNotify: 0x%x", aReqNo));
   884                 "DoCancel ERequestOtgFeaturesNotify: 0x%x", aReqNo );
       
   885 
       
   886 		CancelNotifyOtgFeatures();
   835 		CancelNotifyOtgFeatures();
   887 		if (iOtgFeatureChangeReq->IsReady())
   836 		if (iOtgFeatureChangeReq->IsReady())
   888 			{
   837 			{
   889 			iRequestStatus[aReqNo] = NULL;
   838 			iRequestStatus[aReqNo] = NULL;
   890 			Kern::QueueRequestComplete(iClient, iOtgFeatureChangeReq, KErrCancel);
   839 			Kern::QueueRequestComplete(iClient, iOtgFeatureChangeReq, KErrCancel);
   891 			}
   840 			}
   892 		}
   841 		}
   893 	else
   842 	else
   894 		{
   843 		{
   895         OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCANCEL_DUP6,
   844 		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel Unknown! 0x%x", aReqNo));
   896                 "DoCancel Unknown! 0x%x", aReqNo );
       
   897 
       
   898 		}
   845 		}
   899 
   846 
   900 		if (r == KErrNone)
   847 		if (r == KErrNone)
   901 			r = KErrCancel;
   848 			r = KErrCancel;
   902 
   849 
  1169     }
  1116     }
  1170 
  1117 
  1171 
  1118 
  1172 TInt DLddUsbcChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
  1119 TInt DLddUsbcChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
  1173 	{
  1120 	{
  1174     OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL, 
  1121 	__KTRACE_OPT(KUSB, Kern::Printf("DoControl: %d", aFunction));
  1175             "DoControl: %d", aFunction );
       
  1176 
  1122 
  1177 	TInt r = KErrNone;
  1123 	TInt r = KErrNone;
  1178 	TInt ep;
  1124 	TInt ep;
  1179 	TUsbcEndpoint* pEndpoint;
  1125 	TUsbcEndpoint* pEndpoint;
  1180 	TPtrC8 pZeroDesc(NULL, 0);
  1126 	TPtrC8 pZeroDesc(NULL, 0);
  1185 	TInt bandwidthPriority;
  1131 	TInt bandwidthPriority;
  1186 
  1132 
  1187 	switch (aFunction)
  1133 	switch (aFunction)
  1188 		{
  1134 		{
  1189 	case RDevUsbcClient::EControlEndpointZeroRequestError:
  1135 	case RDevUsbcClient::EControlEndpointZeroRequestError:
  1190 	    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP1, 
  1136 		__KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointZeroRequestError"));
  1191 	            "EControlEndpointZeroRequestError" );
       
  1192 
       
  1193 		r = KErrNone;
  1137 		r = KErrNone;
  1194 		if (iOwnsDeviceControl || (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured))
  1138 		if (iOwnsDeviceControl || (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured))
  1195 			{
  1139 			{
  1196 			iController->Ep0Stall(this);
  1140 			iController->Ep0Stall(this);
  1197 			}
  1141 			}
  1203 				r = KErrUsbInterfaceNotReady;
  1147 				r = KErrUsbInterfaceNotReady;
  1204 			}
  1148 			}
  1205 		break;
  1149 		break;
  1206 
  1150 
  1207 	case RDevUsbcClient::EControlGetAlternateSetting:
  1151 	case RDevUsbcClient::EControlGetAlternateSetting:
  1208         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP2,
  1152 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetAlternateSetting"));
  1209                 "EControlGetAlternateSetting" );
       
  1210 
       
  1211 		if (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured)
  1153 		if (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured)
  1212 			{
  1154 			{
  1213 			r = iController->GetInterfaceNumber(this, *(TInt*)a1);
  1155 			r = iController->GetInterfaceNumber(this, *(TInt*)a1);
  1214 			}
  1156 			}
  1215 		else
  1157 		else
  1220 				r = KErrUsbInterfaceNotReady;
  1162 				r = KErrUsbInterfaceNotReady;
  1221 			}
  1163 			}
  1222 		break;
  1164 		break;
  1223 
  1165 
  1224 	case RDevUsbcClient::EControlDeviceStatus:
  1166 	case RDevUsbcClient::EControlDeviceStatus:
  1225         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP3,
  1167 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceStatus"));
  1226                 "EControlDeviceStatus" );
       
  1227 
       
  1228 		*(TInt*)a1 = iController->GetDeviceStatus();
  1168 		*(TInt*)a1 = iController->GetDeviceStatus();
  1229 		break;
  1169 		break;
  1230 
  1170 
  1231 	case RDevUsbcClient::EControlEndpointStatus:
  1171 	case RDevUsbcClient::EControlEndpointStatus:
  1232         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP4,
  1172 		__KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointStatus"));
  1233                 "EControlEndpointStatus" );
       
  1234 
       
  1235 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1173 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1236 			{
  1174 			{
  1237 			pEndpoint = iEndpoint[(TInt)a1];
  1175 			pEndpoint = iEndpoint[(TInt)a1];
  1238 			if (pEndpoint == NULL)
  1176 			if (pEndpoint == NULL)
  1239 				r = KErrNotSupported;
  1177 				r = KErrNotSupported;
  1250 				r = KErrUsbInterfaceNotReady;
  1188 				r = KErrUsbInterfaceNotReady;
  1251 			}
  1189 			}
  1252 		break;
  1190 		break;
  1253 
  1191 
  1254 	case RDevUsbcClient::EControlQueryReceiveBuffer:
  1192 	case RDevUsbcClient::EControlQueryReceiveBuffer:
  1255         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP5,
  1193 		__KTRACE_OPT(KUSB, Kern::Printf("EControlQueryReceiveBuffer"));
  1256                 "EControlQueryReceiveBuffer" );
       
  1257 
       
  1258 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1194 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1259 			{
  1195 			{
  1260 			pEndpoint=iEndpoint[(TInt) a1];
  1196 			pEndpoint=iEndpoint[(TInt) a1];
  1261 			if (pEndpoint == NULL)
  1197 			if (pEndpoint == NULL)
  1262 				r = KErrNotSupported;
  1198 				r = KErrNotSupported;
  1263 			else if (pEndpoint->EndpointInfo()->iDir != KUsbEpDirIn)
  1199 			else if (pEndpoint->EndpointInfo()->iDir != KUsbEpDirIn)
  1264 				{
  1200 				{
  1265 		        OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP6,
  1201 				__KTRACE_OPT(KUSB, Kern::Printf("  bytes = %d", pEndpoint->RxBytesAvailable()));
  1266 		                "  bytes = %d", pEndpoint->RxBytesAvailable());
       
  1267 				*(TInt*)a2 = pEndpoint->RxBytesAvailable();
  1202 				*(TInt*)a2 = pEndpoint->RxBytesAvailable();
  1268 				}
  1203 				}
  1269 			}
  1204 			}
  1270 		else
  1205 		else
  1271 			{
  1206 			{
  1275 				r = KErrUsbInterfaceNotReady;
  1210 				r = KErrUsbInterfaceNotReady;
  1276 			}
  1211 			}
  1277 		break;
  1212 		break;
  1278 
  1213 
  1279 	case RDevUsbcClient::EControlEndpointCaps:
  1214 	case RDevUsbcClient::EControlEndpointCaps:
  1280         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP7,
  1215 		__KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointCaps"));
  1281                 "EControlEndpointCaps" );
       
  1282 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1216 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1283 		if (r != KErrNone)
  1217 		if (r != KErrNone)
  1284 			PanicClientThread(r);
  1218 			PanicClientThread(r);
  1285 		iController->EndpointCaps(this, *((TDes8*) a1));
  1219 		iController->EndpointCaps(this, *((TDes8*) a1));
  1286 		break;
  1220 		break;
  1287 
  1221 
  1288 	case RDevUsbcClient::EControlDeviceCaps:
  1222 	case RDevUsbcClient::EControlDeviceCaps:
  1289         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP8,
  1223 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceCaps"));
  1290                 "EControlDeviceCaps" );
       
  1291 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1224 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1292 		if (r != KErrNone)
  1225 		if (r != KErrNone)
  1293 			PanicClientThread(r);
  1226 			PanicClientThread(r);
  1294 		iController->DeviceCaps(this, *((TDes8*) a1));
  1227 		iController->DeviceCaps(this, *((TDes8*) a1));
  1295 		break;
  1228 		break;
  1296 
  1229 
  1297 	case RDevUsbcClient::EControlSendEp0StatusPacket:
  1230 	case RDevUsbcClient::EControlSendEp0StatusPacket:
  1298         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP9,
  1231 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSendEp0StatusPacket"));
  1299                 "EControlSendEp0StatusPacket" );
       
  1300 		iController->SendEp0StatusPacket(this);
  1232 		iController->SendEp0StatusPacket(this);
  1301 		break;
  1233 		break;
  1302 
  1234 
  1303 	case RDevUsbcClient::EControlHaltEndpoint:
  1235 	case RDevUsbcClient::EControlHaltEndpoint:
  1304         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP10,
  1236 		__KTRACE_OPT(KUSB, Kern::Printf("EControlHaltEndpoint"));
  1305                 "EControlHaltEndpoint" );
       
  1306 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1237 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1307 			{
  1238 			{
  1308 			r = iController->HaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber());
  1239 			r = iController->HaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber());
  1309 			}
  1240 			}
  1310 		else
  1241 		else
  1315 				r = KErrUsbInterfaceNotReady;
  1246 				r = KErrUsbInterfaceNotReady;
  1316 			}
  1247 			}
  1317 		break;
  1248 		break;
  1318 
  1249 
  1319 	case RDevUsbcClient::EControlClearHaltEndpoint:
  1250 	case RDevUsbcClient::EControlClearHaltEndpoint:
  1320         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP11,
  1251 		__KTRACE_OPT(KUSB, Kern::Printf("EControlClearHaltEndpoint"));
  1321                 "EControlClearHaltEndpoint" );
       
  1322 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1252 		if (iValidInterface && ValidEndpoint((TInt) a1))
  1323 			{
  1253 			{
  1324 			r = iController->ClearHaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber());
  1254 			r = iController->ClearHaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber());
  1325 			}
  1255 			}
  1326 		else
  1256 		else
  1331 				r = KErrUsbInterfaceNotReady;
  1261 				r = KErrUsbInterfaceNotReady;
  1332 			}
  1262 			}
  1333 		break;
  1263 		break;
  1334 
  1264 
  1335 	case RDevUsbcClient::EControlDumpRegisters:
  1265 	case RDevUsbcClient::EControlDumpRegisters:
  1336         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP12,
  1266 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDumpRegisters"));
  1337                 "EControlDumpRegisters" );
       
  1338 		iController->DumpRegisters();
  1267 		iController->DumpRegisters();
  1339 		break;
  1268 		break;
  1340 
  1269 
  1341 	case RDevUsbcClient::EControlReleaseDeviceControl:
  1270 	case RDevUsbcClient::EControlReleaseDeviceControl:
  1342         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP13,
  1271 		__KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseDeviceControl"));
  1343                 "EControlReleaseDeviceControl" );
       
  1344 		iController->ReleaseDeviceControl(this);
  1272 		iController->ReleaseDeviceControl(this);
  1345 		iOwnsDeviceControl = EFalse;
  1273 		iOwnsDeviceControl = EFalse;
  1346 		break;
  1274 		break;
  1347 
  1275 
  1348 	case RDevUsbcClient::EControlEndpointZeroMaxPacketSizes:
  1276 	case RDevUsbcClient::EControlEndpointZeroMaxPacketSizes:
  1349         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP14,
  1277 		__KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointZeroMaxPacketSizes"));
  1350                 "EControlEndpointZeroMaxPacketSizes" );
       
  1351 		r = iController->EndpointZeroMaxPacketSizes();
  1278 		r = iController->EndpointZeroMaxPacketSizes();
  1352 		break;
  1279 		break;
  1353 
  1280 
  1354 	case RDevUsbcClient::EControlSetEndpointZeroMaxPacketSize:
  1281 	case RDevUsbcClient::EControlSetEndpointZeroMaxPacketSize:
  1355         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP15,
  1282 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetEndpointZeroMaxPacketSize"));
  1356                 "EControlSetEndpointZeroMaxPacketSize" );
       
  1357 		r = iController->SetEndpointZeroMaxPacketSize(reinterpret_cast<TInt>(a1));
  1283 		r = iController->SetEndpointZeroMaxPacketSize(reinterpret_cast<TInt>(a1));
  1358 		break;
  1284 		break;
  1359 
  1285 
  1360 	case RDevUsbcClient::EControlGetEndpointZeroMaxPacketSize:
  1286 	case RDevUsbcClient::EControlGetEndpointZeroMaxPacketSize:
  1361         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP16,
  1287 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointZeroMaxPacketSize"));
  1362                 "EControlGetEndpointZeroMaxPacketSize" );
       
  1363 		r = iController->Ep0PacketSize();
  1288 		r = iController->Ep0PacketSize();
  1364 		break;
  1289 		break;
  1365 
  1290 
  1366 	case RDevUsbcClient::EControlGetDeviceDescriptor:
  1291 	case RDevUsbcClient::EControlGetDeviceDescriptor:
  1367         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP17,
  1292 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceDescriptor"));
  1368                 "EControlGetDeviceDescriptor" );
       
  1369 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1293 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1370 		if (r != KErrNone)
  1294 		if (r != KErrNone)
  1371 			PanicClientThread(r);
  1295 			PanicClientThread(r);
  1372 		r = iController->GetDeviceDescriptor(iClient, *((TDes8*) a1));
  1296 		r = iController->GetDeviceDescriptor(iClient, *((TDes8*) a1));
  1373 		break;
  1297 		break;
  1374 
  1298 
  1375 	case RDevUsbcClient::EControlSetDeviceDescriptor:
  1299 	case RDevUsbcClient::EControlSetDeviceDescriptor:
  1376         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP18,
  1300 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceDescriptor"));
  1377                 "EControlSetDeviceDescriptor" );
       
  1378 		if (a1 != NULL)
  1301 		if (a1 != NULL)
  1379 			r = iController->SetDeviceDescriptor(iClient, *((TDes8*) a1));
  1302 			r = iController->SetDeviceDescriptor(iClient, *((TDes8*) a1));
  1380 		else
  1303 		else
  1381 			r = KErrArgument;
  1304 			r = KErrArgument;
  1382 		break;
  1305 		break;
  1383 
  1306 
  1384 	case RDevUsbcClient::EControlGetDeviceDescriptorSize:
  1307 	case RDevUsbcClient::EControlGetDeviceDescriptorSize:
  1385         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP19,
  1308 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceDescriptorSize"));
  1386                 "EControlGetDeviceDescriptorSize" );
       
  1387 		if (a1 != NULL)
  1309 		if (a1 != NULL)
  1388 			r = iController->GetDeviceDescriptorSize(iClient, *((TDes8*) a1));
  1310 			r = iController->GetDeviceDescriptorSize(iClient, *((TDes8*) a1));
  1389 		else
  1311 		else
  1390 			r = KErrArgument;
  1312 			r = KErrArgument;
  1391 		break;
  1313 		break;
  1392 
  1314 
  1393 	case RDevUsbcClient::EControlGetConfigurationDescriptor:
  1315 	case RDevUsbcClient::EControlGetConfigurationDescriptor:
  1394         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP20,
  1316 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationDescriptor"));
  1395                 "EControlGetConfigurationDescriptor" );
       
  1396 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient);
  1317 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient);
  1397 		if (r != KErrNone)
  1318 		if (r != KErrNone)
  1398 			PanicClientThread(r);
  1319 			PanicClientThread(r);
  1399 		r = iController->GetConfigurationDescriptor(iClient, *((TDes8*) a1));
  1320 		r = iController->GetConfigurationDescriptor(iClient, *((TDes8*) a1));
  1400 		break;
  1321 		break;
  1401 
  1322 
  1402 	case RDevUsbcClient::EControlGetConfigurationDescriptorSize:
  1323 	case RDevUsbcClient::EControlGetConfigurationDescriptorSize:
  1403         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP21,
  1324 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationDescriptorSize"));
  1404                 "EControlGetConfigurationDescriptorSize" );
       
  1405 		if (a1 != NULL)
  1325 		if (a1 != NULL)
  1406 			{
  1326 			{
  1407 			r = iController->GetConfigurationDescriptorSize(iClient, *((TDes8*) a1));
  1327 			r = iController->GetConfigurationDescriptorSize(iClient, *((TDes8*) a1));
  1408 			}
  1328 			}
  1409 		else
  1329 		else
  1410 			r = KErrArgument;
  1330 			r = KErrArgument;
  1411 		break;
  1331 		break;
  1412 
  1332 
  1413 	case RDevUsbcClient::EControlSetConfigurationDescriptor:
  1333 	case RDevUsbcClient::EControlSetConfigurationDescriptor:
  1414         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP22,
  1334 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetConfigurationDescriptor"));
  1415                 "EControlSetConfigurationDescriptor" );
       
  1416 		r = iController->SetConfigurationDescriptor(iClient, *((TDes8*) a1));
  1335 		r = iController->SetConfigurationDescriptor(iClient, *((TDes8*) a1));
  1417 		break;
  1336 		break;
  1418 
  1337 
  1419 	case RDevUsbcClient::EControlGetInterfaceDescriptor:
  1338 	case RDevUsbcClient::EControlGetInterfaceDescriptor:
  1420         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP23,
  1339 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetInterfaceDescriptor"));
  1421                 "EControlGetInterfaceDescriptor" );
       
  1422 		r = iController->GetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2));
  1340 		r = iController->GetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2));
  1423 		break;
  1341 		break;
  1424 
  1342 
  1425 	case RDevUsbcClient::EControlGetInterfaceDescriptorSize:
  1343 	case RDevUsbcClient::EControlGetInterfaceDescriptorSize:
  1426         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP24,
  1344 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetInterfaceDescriptorSize"));
  1427                 "EControlGetInterfaceDescriptorSize" );
       
  1428 		r = iController->GetInterfaceDescriptorSize(iClient, this, (TInt) a1, *(TDes8*) a2);
  1345 		r = iController->GetInterfaceDescriptorSize(iClient, this, (TInt) a1, *(TDes8*) a2);
  1429 		break;
  1346 		break;
  1430 
  1347 
  1431 	case RDevUsbcClient::EControlSetInterfaceDescriptor:
  1348 	case RDevUsbcClient::EControlSetInterfaceDescriptor:
  1432         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP25,
  1349 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetInterfaceDescriptor"));
  1433                 "EControlSetInterfaceDescriptor" );
       
  1434 		r = iController->SetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2));
  1350 		r = iController->SetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2));
  1435 		break;
  1351 		break;
  1436 
  1352 
  1437 	case RDevUsbcClient::EControlGetEndpointDescriptor:
  1353 	case RDevUsbcClient::EControlGetEndpointDescriptor:
  1438         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP26,
  1354 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointDescriptor"));
  1439                 "EControlGetEndpointDescriptor" );
       
  1440 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1355 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1441 		if (r != KErrNone)
  1356 		if (r != KErrNone)
  1442 			PanicClientThread(r);
  1357 			PanicClientThread(r);
  1443 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1358 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1444 		r = iController->GetEndpointDescriptor(iClient, this, epInfo.iSetting,
  1359 		r = iController->GetEndpointDescriptor(iClient, this, epInfo.iSetting,
  1445 											   ep, *(TDes8*) epInfo.iArg);
  1360 											   ep, *(TDes8*) epInfo.iArg);
  1446 		break;
  1361 		break;
  1447 
  1362 
  1448 	case RDevUsbcClient::EControlGetEndpointDescriptorSize:
  1363 	case RDevUsbcClient::EControlGetEndpointDescriptorSize:
  1449         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP27,
  1364 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointDescriptorSize"));
  1450                 "EControlGetEndpointDescriptorSize" );
       
  1451 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1365 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1452 		if (r != KErrNone)
  1366 		if (r != KErrNone)
  1453 			PanicClientThread(r);
  1367 			PanicClientThread(r);
  1454 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1368 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1455 		r = iController->GetEndpointDescriptorSize(iClient, this, epInfo.iSetting,
  1369 		r = iController->GetEndpointDescriptorSize(iClient, this, epInfo.iSetting,
  1456 												   ep, *(TDes8*) epInfo.iArg);
  1370 												   ep, *(TDes8*) epInfo.iArg);
  1457 		break;
  1371 		break;
  1458 
  1372 
  1459 	case RDevUsbcClient::EControlSetEndpointDescriptor:
  1373 	case RDevUsbcClient::EControlSetEndpointDescriptor:
  1460         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP28,
  1374 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetEndpointDescriptor"));
  1461                 "EControlSetEndpointDescriptor" );
       
  1462 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1375 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1463 		if (r != KErrNone)
  1376 		if (r != KErrNone)
  1464 			PanicClientThread(r);
  1377 			PanicClientThread(r);
  1465 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1378 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1466 		r = iController->SetEndpointDescriptor(iClient, this, epInfo.iSetting,
  1379 		r = iController->SetEndpointDescriptor(iClient, this, epInfo.iSetting,
  1467 											   ep, *(TDes8*)epInfo.iArg);
  1380 											   ep, *(TDes8*)epInfo.iArg);
  1468 		break;
  1381 		break;
  1469 
  1382 
  1470 	case RDevUsbcClient::EControlGetDeviceQualifierDescriptor:
  1383 	case RDevUsbcClient::EControlGetDeviceQualifierDescriptor:
  1471         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP29,
  1384 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceQualifierDescriptor"));
  1472                 "EControlGetDeviceQualifierDescriptor" );
       
  1473 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1385 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
  1474 		if (r != KErrNone)
  1386 		if (r != KErrNone)
  1475 			PanicClientThread(r);
  1387 			PanicClientThread(r);
  1476 		r = iController->GetDeviceQualifierDescriptor(iClient, *((TDes8*) a1));
  1388 		r = iController->GetDeviceQualifierDescriptor(iClient, *((TDes8*) a1));
  1477 		break;
  1389 		break;
  1478 
  1390 
  1479 	case RDevUsbcClient::EControlSetDeviceQualifierDescriptor:
  1391 	case RDevUsbcClient::EControlSetDeviceQualifierDescriptor:
  1480         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP30,
  1392 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceQualifierDescriptor"));
  1481                 "EControlSetDeviceQualifierDescriptor" );
       
  1482 		if (a1 != NULL)
  1393 		if (a1 != NULL)
  1483 			r = iController->SetDeviceQualifierDescriptor(iClient, *((TDes8*) a1));
  1394 			r = iController->SetDeviceQualifierDescriptor(iClient, *((TDes8*) a1));
  1484 		else
  1395 		else
  1485 			r = KErrArgument;
  1396 			r = KErrArgument;
  1486 		break;
  1397 		break;
  1487 
  1398 
  1488 	case RDevUsbcClient::EControlGetOtherSpeedConfigurationDescriptor:
  1399 	case RDevUsbcClient::EControlGetOtherSpeedConfigurationDescriptor:
  1489         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP31,
  1400 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetOtherSpeedConfigurationDescriptor"));
  1490                 "EControlGetOtherSpeedConfigurationDescriptor" );
       
  1491 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient);
  1401 		r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient);
  1492 		if (r != KErrNone)
  1402 		if (r != KErrNone)
  1493 			PanicClientThread(r);
  1403 			PanicClientThread(r);
  1494 		r = iController->GetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1));
  1404 		r = iController->GetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1));
  1495 		break;
  1405 		break;
  1496 
  1406 
  1497 	case RDevUsbcClient::EControlSetOtherSpeedConfigurationDescriptor:
  1407 	case RDevUsbcClient::EControlSetOtherSpeedConfigurationDescriptor:
  1498         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP32,
  1408 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetOtherSpeedConfigurationDescriptor"));
  1499                 "EControlSetOtherSpeedConfigurationDescriptor" );
       
  1500 		r = iController->SetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1));
  1409 		r = iController->SetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1));
  1501 		break;
  1410 		break;
  1502 
  1411 
  1503 
  1412 
  1504 	case RDevUsbcClient::EControlGetCSInterfaceDescriptor:
  1413 	case RDevUsbcClient::EControlGetCSInterfaceDescriptor:
  1505         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP33,
  1414 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSInterfaceDescriptor"));
  1506                 "EControlGetCSInterfaceDescriptor" );
       
  1507 		r = iController->GetCSInterfaceDescriptorBlock(iClient, this, (TInt) a1, *((TDes8*) a2));
  1415 		r = iController->GetCSInterfaceDescriptorBlock(iClient, this, (TInt) a1, *((TDes8*) a2));
  1508 		break;
  1416 		break;
  1509 
  1417 
  1510 	case RDevUsbcClient::EControlGetCSInterfaceDescriptorSize:
  1418 	case RDevUsbcClient::EControlGetCSInterfaceDescriptorSize:
  1511         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP34,
  1419 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSInterfaceDescriptorSize"));
  1512                 "EControlGetCSInterfaceDescriptorSize" );
       
  1513 		r = iController->GetCSInterfaceDescriptorBlockSize(iClient, this, (TInt) a1, *(TDes8*) a2);
  1420 		r = iController->GetCSInterfaceDescriptorBlockSize(iClient, this, (TInt) a1, *(TDes8*) a2);
  1514 		break;
  1421 		break;
  1515 
  1422 
  1516 	case RDevUsbcClient::EControlGetCSEndpointDescriptor:
  1423 	case RDevUsbcClient::EControlGetCSEndpointDescriptor:
  1517         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP35,
  1424 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSEndpointDescriptor"));
  1518                 "EControlGetCSEndpointDescriptor" );
       
  1519 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1425 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1520 		if (r != KErrNone)
  1426 		if (r != KErrNone)
  1521 			PanicClientThread(r);
  1427 			PanicClientThread(r);
  1522 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1428 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1523 		r = iController->GetCSEndpointDescriptorBlock(iClient, this, epInfo.iSetting,
  1429 		r = iController->GetCSEndpointDescriptorBlock(iClient, this, epInfo.iSetting,
  1524 													  ep, *(TDes8*) epInfo.iArg);
  1430 													  ep, *(TDes8*) epInfo.iArg);
  1525 		break;
  1431 		break;
  1526 
  1432 
  1527 	case RDevUsbcClient::EControlGetCSEndpointDescriptorSize:
  1433 	case RDevUsbcClient::EControlGetCSEndpointDescriptorSize:
  1528         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP36,
  1434 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSEndpointDescriptorSize"));
  1529                 "EControlGetCSEndpointDescriptorSize" );
       
  1530 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1435 		r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
  1531 		if (r != KErrNone)
  1436 		if (r != KErrNone)
  1532 			PanicClientThread(r);
  1437 			PanicClientThread(r);
  1533 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1438 		ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
  1534 		r = iController->GetCSEndpointDescriptorBlockSize(iClient, this, epInfo.iSetting,
  1439 		r = iController->GetCSEndpointDescriptorBlockSize(iClient, this, epInfo.iSetting,
  1535 														  ep, *(TDes8*) epInfo.iArg);
  1440 														  ep, *(TDes8*) epInfo.iArg);
  1536 		break;
  1441 		break;
  1537 
  1442 
  1538 	case RDevUsbcClient::EControlSignalRemoteWakeup:
  1443 	case RDevUsbcClient::EControlSignalRemoteWakeup:
  1539         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP37,
  1444 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSignalRemoteWakeup"));
  1540                 "EControlSignalRemoteWakeup" );
       
  1541 		r = iController->SignalRemoteWakeup();
  1445 		r = iController->SignalRemoteWakeup();
  1542 		break;
  1446 		break;
  1543 
  1447 
  1544 	case RDevUsbcClient::EControlDeviceDisconnectFromHost:
  1448 	case RDevUsbcClient::EControlDeviceDisconnectFromHost:
  1545         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP38,
  1449 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceDisconnectFromHost"));
  1546                 "EControlDeviceDisconnectFromHost" );
       
  1547 		r = iController->UsbDisconnect();
  1450 		r = iController->UsbDisconnect();
  1548 		break;
  1451 		break;
  1549 
  1452 
  1550 	case RDevUsbcClient::EControlDeviceConnectToHost:
  1453 	case RDevUsbcClient::EControlDeviceConnectToHost:
  1551         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP39,
  1454 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceConnectToHost"));
  1552                 "EControlDeviceConnectToHost" );
       
  1553 		r = iController->UsbConnect();
  1455 		r = iController->UsbConnect();
  1554 		break;
  1456 		break;
  1555 
  1457 
  1556 	case RDevUsbcClient::EControlDevicePowerUpUdc:
  1458 	case RDevUsbcClient::EControlDevicePowerUpUdc:
  1557         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP40,
  1459 		__KTRACE_OPT(KUSB, Kern::Printf("EControlDevicePowerUpUdc"));
  1558                 "EControlDevicePowerUpUdc" );
       
  1559 		r = iController->PowerUpUdc();
  1460 		r = iController->PowerUpUdc();
  1560 		break;
  1461 		break;
  1561 
  1462 
  1562 	case RDevUsbcClient::EControlSetDeviceControl:
  1463 	case RDevUsbcClient::EControlSetDeviceControl:
  1563         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP41,
  1464 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceControl"));
  1564                 "EControlSetDeviceControl" );
       
  1565 		r = iController->SetDeviceControl(this);
  1465 		r = iController->SetDeviceControl(this);
  1566 		if (r == KErrNone)
  1466 		if (r == KErrNone)
  1567 			{
  1467 			{
  1568 			iOwnsDeviceControl = ETrue;
  1468 			iOwnsDeviceControl = ETrue;
  1569 			if (iEndpoint[0] == NULL)
  1469 			if (iEndpoint[0] == NULL)
  1570 				{
  1470 				{
  1571 		        OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP42,
  1471 				__KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceControl 11"));
  1572 		                "EControlSetDeviceControl 11" );
       
  1573 				r = SetupEp0();
  1472 				r = SetupEp0();
  1574 				if (r != KErrNone)
  1473 				if (r != KErrNone)
  1575 					{
  1474 					{
  1576 	               OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_DOCONTROL_DUP43,
  1475 					__KTRACE_OPT(KPANIC, Kern::Printf("  Error: SetupEp0() failed"));
  1577 	                       "  Error: SetupEp0() failed" );
       
  1578 
       
  1579 					iController->ReleaseDeviceControl(this);
  1476 					iController->ReleaseDeviceControl(this);
  1580 					DestroyEp0();
  1477 					DestroyEp0();
  1581 					iOwnsDeviceControl = EFalse;
  1478 					iOwnsDeviceControl = EFalse;
  1582 					}
  1479 					}
  1583 				iEndpoint[0]->TryToStartRead(EFalse);
  1480 				iEndpoint[0]->TryToStartRead(EFalse);
  1586 		else
  1483 		else
  1587 			r = KErrInUse;
  1484 			r = KErrInUse;
  1588 		break;
  1485 		break;
  1589 
  1486 
  1590 	case RDevUsbcClient::EControlCurrentlyUsingHighSpeed:
  1487 	case RDevUsbcClient::EControlCurrentlyUsingHighSpeed:
  1591         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP44,
  1488 		__KTRACE_OPT(KUSB, Kern::Printf("EControlCurrentlyUsingHighSpeed"));
  1592                 "EControlCurrentlyUsingHighSpeed" );
       
  1593 		r = iController->CurrentlyUsingHighSpeed();
  1489 		r = iController->CurrentlyUsingHighSpeed();
  1594 		break;
  1490 		break;
  1595 
  1491 
  1596 	case RDevUsbcClient::EControlSetInterface:
  1492 	case RDevUsbcClient::EControlSetInterface:
  1597         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP45,
  1493 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetInterface"));
  1598                 "EControlSetInterface" );
       
  1599 		r = Kern::ThreadRawRead(iClient, a2, &ifcInfo, sizeof(ifcInfo));
  1494 		r = Kern::ThreadRawRead(iClient, a2, &ifcInfo, sizeof(ifcInfo));
  1600 		if (r != KErrNone)
  1495 		if (r != KErrNone)
  1601 			PanicClientThread(r);
  1496 			PanicClientThread(r);
  1602 		if (iValidInterface && (iDeviceState == EUsbcDeviceStateConfigured))
  1497 		if (iValidInterface && (iDeviceState == EUsbcDeviceStateConfigured))
  1603 			{
  1498 			{
  1619 			}
  1514 			}
  1620 			
  1515 			
  1621 		break;
  1516 		break;
  1622 
  1517 
  1623 	case RDevUsbcClient::EControlReleaseInterface:
  1518 	case RDevUsbcClient::EControlReleaseInterface:
  1624         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP46,
  1519 		__KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseInterface"));
  1625                 "EControlReleaseInterface" );
       
  1626 		r = iController->ReleaseInterface(this, (TInt) a1);
  1520 		r = iController->ReleaseInterface(this, (TInt) a1);
  1627 		if (r == KErrNone)
  1521 		if (r == KErrNone)
  1628 			{
  1522 			{
  1629 			DestroyInterface((TUint) a1);
  1523 			DestroyInterface((TUint) a1);
  1630 			}
  1524 			}
  1631 		else
  1525 		else
  1632 			{
  1526 			{
  1633 	        OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_DOCONTROL_DUP47,
  1527 			__KTRACE_OPT(KPANIC, Kern::Printf("  Error in PIL: LDD interface won't be released."));
  1634 	                "  Error in PIL: LDD interface won't be released." );
       
  1635 			}
  1528 			}
  1636 		break;
  1529 		break;
  1637 
  1530 
  1638 	case RDevUsbcClient::EControlSetCSInterfaceDescriptor:
  1531 	case RDevUsbcClient::EControlSetCSInterfaceDescriptor:
  1639         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP48,
  1532 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetCSInterfaceDescriptor"));
  1640                 "EControlSetCSInterfaceDescriptor" );
       
  1641 		r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo));
  1533 		r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo));
  1642 		if (r != KErrNone)
  1534 		if (r != KErrNone)
  1643 			PanicClientThread(r);
  1535 			PanicClientThread(r);
  1644 		r = iController->SetCSInterfaceDescriptorBlock(iClient, this, desInfo.iSetting,
  1536 		r = iController->SetCSInterfaceDescriptorBlock(iClient, this, desInfo.iSetting,
  1645 													   *reinterpret_cast<const TDes8*>(desInfo.iArg),
  1537 													   *reinterpret_cast<const TDes8*>(desInfo.iArg),
  1646 													   desInfo.iSize);
  1538 													   desInfo.iSize);
  1647 		break;
  1539 		break;
  1648 
  1540 
  1649 	case RDevUsbcClient::EControlSetCSEndpointDescriptor:
  1541 	case RDevUsbcClient::EControlSetCSEndpointDescriptor:
  1650         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP49,
  1542 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetCSEndpointDescriptor"));
  1651                 "EControlSetCSEndpointDescriptor" );
       
  1652 		r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo));
  1543 		r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo));
  1653 		if (r != KErrNone)
  1544 		if (r != KErrNone)
  1654 			PanicClientThread(r);
  1545 			PanicClientThread(r);
  1655 		ep = EpFromAlternateSetting(desInfo.iSetting, desInfo.iEndpoint);
  1546 		ep = EpFromAlternateSetting(desInfo.iSetting, desInfo.iEndpoint);
  1656 		r = iController->SetCSEndpointDescriptorBlock(iClient, this, desInfo.iSetting, ep,
  1547 		r = iController->SetCSEndpointDescriptorBlock(iClient, this, desInfo.iSetting, ep,
  1657 													  *reinterpret_cast<const TDes8*>(desInfo.iArg),
  1548 													  *reinterpret_cast<const TDes8*>(desInfo.iArg),
  1658 													  desInfo.iSize);
  1549 													  desInfo.iSize);
  1659 		break;
  1550 		break;
  1660 
  1551 
  1661 	case RDevUsbcClient::EControlGetStringDescriptorLangId:
  1552 	case RDevUsbcClient::EControlGetStringDescriptorLangId:
  1662         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP50,
  1553 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetStringDescriptorLangId"));
  1663                 "EControlGetStringDescriptorLangId" );
       
  1664 		r = iController->GetStringDescriptorLangId(iClient, *((TDes8*) a1));
  1554 		r = iController->GetStringDescriptorLangId(iClient, *((TDes8*) a1));
  1665 		break;
  1555 		break;
  1666 
  1556 
  1667 	case RDevUsbcClient::EControlSetStringDescriptorLangId:
  1557 	case RDevUsbcClient::EControlSetStringDescriptorLangId:
  1668         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP51,
  1558 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetStringDescriptorLangId"));
  1669                 "EControlSetStringDescriptorLangId" );
       
  1670 		r = iController->SetStringDescriptorLangId(reinterpret_cast<TUint>(a1));
  1559 		r = iController->SetStringDescriptorLangId(reinterpret_cast<TUint>(a1));
  1671 		break;
  1560 		break;
  1672 
  1561 
  1673 	case RDevUsbcClient::EControlGetManufacturerStringDescriptor:
  1562 	case RDevUsbcClient::EControlGetManufacturerStringDescriptor:
  1674         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP52,
  1563 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetManufacturerStringDescriptor"));
  1675                 "EControlGetManufacturerStringDescriptor" );
       
  1676 		r = iController->GetManufacturerStringDescriptor(iClient, *((TPtr8*) a1));
  1564 		r = iController->GetManufacturerStringDescriptor(iClient, *((TPtr8*) a1));
  1677 		break;
  1565 		break;
  1678 
  1566 
  1679 	case RDevUsbcClient::EControlSetManufacturerStringDescriptor:
  1567 	case RDevUsbcClient::EControlSetManufacturerStringDescriptor:
  1680         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP53,
  1568 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetManufacturerStringDescriptor"));
  1681                 "EControlSetManufacturerStringDescriptor" );
       
  1682 		r = iController->SetManufacturerStringDescriptor(iClient, *((TPtr8*) a1));
  1569 		r = iController->SetManufacturerStringDescriptor(iClient, *((TPtr8*) a1));
  1683 		break;
  1570 		break;
  1684 
  1571 
  1685 	case RDevUsbcClient::EControlRemoveManufacturerStringDescriptor:
  1572 	case RDevUsbcClient::EControlRemoveManufacturerStringDescriptor:
  1686         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP54,
  1573 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveManufacturerStringDescriptor"));
  1687                 "EControlRemoveManufacturerStringDescriptor" );
       
  1688 		r = iController->RemoveManufacturerStringDescriptor();
  1574 		r = iController->RemoveManufacturerStringDescriptor();
  1689 		break;
  1575 		break;
  1690 
  1576 
  1691 	case RDevUsbcClient::EControlGetProductStringDescriptor:
  1577 	case RDevUsbcClient::EControlGetProductStringDescriptor:
  1692         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP55,
  1578 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetProductStringDescriptor"));
  1693                 "EControlGetProductStringDescriptor" );
       
  1694 		r = iController->GetProductStringDescriptor(iClient, *((TPtr8*) a1));
  1579 		r = iController->GetProductStringDescriptor(iClient, *((TPtr8*) a1));
  1695 		break;
  1580 		break;
  1696 
  1581 
  1697 	case RDevUsbcClient::EControlSetProductStringDescriptor:
  1582 	case RDevUsbcClient::EControlSetProductStringDescriptor:
  1698         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP56,
  1583 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetProductStringDescriptor"));
  1699                 "EControlSetProductStringDescriptor" );
       
  1700 		r = iController->SetProductStringDescriptor(iClient, *((TPtr8*) a1));
  1584 		r = iController->SetProductStringDescriptor(iClient, *((TPtr8*) a1));
  1701 		break;
  1585 		break;
  1702 
  1586 
  1703 	case RDevUsbcClient::EControlRemoveProductStringDescriptor:
  1587 	case RDevUsbcClient::EControlRemoveProductStringDescriptor:
  1704         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP57,
  1588 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveProductStringDescriptor"));
  1705                 "EControlRemoveProductStringDescriptor" );
       
  1706 		r = iController->RemoveProductStringDescriptor();
  1589 		r = iController->RemoveProductStringDescriptor();
  1707 		break;
  1590 		break;
  1708 
  1591 
  1709 	case RDevUsbcClient::EControlGetSerialNumberStringDescriptor:
  1592 	case RDevUsbcClient::EControlGetSerialNumberStringDescriptor:
  1710         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP58,
  1593 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetSerialNumberStringDescriptor"));
  1711                 "EControlGetSerialNumberStringDescriptor" );
       
  1712 		r = iController->GetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1));
  1594 		r = iController->GetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1));
  1713 		break;
  1595 		break;
  1714 
  1596 
  1715 	case RDevUsbcClient::EControlSetSerialNumberStringDescriptor:
  1597 	case RDevUsbcClient::EControlSetSerialNumberStringDescriptor:
  1716         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP59,
  1598 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetSerialNumberStringDescriptor"));
  1717                 "EControlSetSerialNumberStringDescriptor" );
       
  1718 		r = iController->SetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1));
  1599 		r = iController->SetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1));
  1719 		break;
  1600 		break;
  1720 
  1601 
  1721 	case RDevUsbcClient::EControlRemoveSerialNumberStringDescriptor:
  1602 	case RDevUsbcClient::EControlRemoveSerialNumberStringDescriptor:
  1722         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP60,
  1603 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveSerialNumberStringDescriptor"));
  1723                 "EControlRemoveSerialNumberStringDescriptor" );
       
  1724 		r = iController->RemoveSerialNumberStringDescriptor();
  1604 		r = iController->RemoveSerialNumberStringDescriptor();
  1725 		break;
  1605 		break;
  1726 
  1606 
  1727 	case RDevUsbcClient::EControlGetConfigurationStringDescriptor:
  1607 	case RDevUsbcClient::EControlGetConfigurationStringDescriptor:
  1728         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP61,
  1608 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationStringDescriptor"));
  1729                 "EControlGetConfigurationStringDescriptor" );
       
  1730 		r = iController->GetConfigurationStringDescriptor(iClient, *((TPtr8*) a1));
  1609 		r = iController->GetConfigurationStringDescriptor(iClient, *((TPtr8*) a1));
  1731 		break;
  1610 		break;
  1732 
  1611 
  1733 	case RDevUsbcClient::EControlSetConfigurationStringDescriptor:
  1612 	case RDevUsbcClient::EControlSetConfigurationStringDescriptor:
  1734         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP62,
  1613 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetConfigurationStringDescriptor"));
  1735                 "EControlSetConfigurationStringDescriptor" );
       
  1736 		r = iController->SetConfigurationStringDescriptor(iClient, *((TPtr8*) a1));
  1614 		r = iController->SetConfigurationStringDescriptor(iClient, *((TPtr8*) a1));
  1737 		break;
  1615 		break;
  1738 
  1616 
  1739 	case RDevUsbcClient::EControlRemoveConfigurationStringDescriptor:
  1617 	case RDevUsbcClient::EControlRemoveConfigurationStringDescriptor:
  1740         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP63,
  1618 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveConfigurationStringDescriptor"));
  1741                 "EControlRemoveConfigurationStringDescriptor" );
       
  1742 		r = iController->RemoveConfigurationStringDescriptor();
  1619 		r = iController->RemoveConfigurationStringDescriptor();
  1743 		break;
  1620 		break;
  1744 
  1621 
  1745 	case RDevUsbcClient::EControlGetStringDescriptor:
  1622 	case RDevUsbcClient::EControlGetStringDescriptor:
  1746         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP64,
  1623 		__KTRACE_OPT(KUSB, Kern::Printf("EControlGetStringDescriptor"));
  1747                 "EControlGetStringDescriptor" );
       
  1748 		r = iController->GetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2));
  1624 		r = iController->GetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2));
  1749 		break;
  1625 		break;
  1750 
  1626 
  1751 	case RDevUsbcClient::EControlSetStringDescriptor:
  1627 	case RDevUsbcClient::EControlSetStringDescriptor:
  1752         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP65,
  1628 		__KTRACE_OPT(KUSB, Kern::Printf("EControlSetStringDescriptor"));
  1753                 "EControlSetStringDescriptor" );
       
  1754 		r = iController->SetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2));
  1629 		r = iController->SetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2));
  1755 		break;
  1630 		break;
  1756 
  1631 
  1757 	case RDevUsbcClient::EControlRemoveStringDescriptor:
  1632 	case RDevUsbcClient::EControlRemoveStringDescriptor:
  1758         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP66,
  1633 		__KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveStringDescriptor"));
  1759                 "EControlRemoveStringDescriptor" );
       
  1760 		r = iController->RemoveStringDescriptor((TUint8) (TInt) a1);
  1634 		r = iController->RemoveStringDescriptor((TUint8) (TInt) a1);
  1761 		break;
  1635 		break;
  1762 
  1636 
  1763 	case RDevUsbcClient::EControlAllocateEndpointResource:
  1637 	case RDevUsbcClient::EControlAllocateEndpointResource:
  1764 		epRes = (TUsbcEndpointResource)((TInt) a2);
  1638 		epRes = (TUsbcEndpointResource)((TInt) a2);
  1813 		r = iController->GetOtgFeatures(iClient, *((TDes8*)a1));
  1687 		r = iController->GetOtgFeatures(iClient, *((TDes8*)a1));
  1814 		}
  1688 		}
  1815 		break;
  1689 		break;
  1816 
  1690 
  1817     default:
  1691     default:
  1818         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOCONTROL_DUP67,
  1692 		__KTRACE_OPT(KUSB, Kern::Printf("Function code not supported"));
  1819                 "Function code not supported" );
       
  1820 		r = KErrNotSupported;
  1693 		r = KErrNotSupported;
  1821 		}
  1694 		}
  1822 
  1695 
  1823 	return r;
  1696 	return r;
  1824 	}
  1697 	}
  1829 	TUsbcInterfaceInfoBuf ifc_info_buf;
  1702 	TUsbcInterfaceInfoBuf ifc_info_buf;
  1830 	TUsbcInterfaceInfoBuf* const ifc_info_buf_ptr = aInfoBuf->iInterfaceData;
  1703 	TUsbcInterfaceInfoBuf* const ifc_info_buf_ptr = aInfoBuf->iInterfaceData;
  1831 	const TInt srcLen = Kern::ThreadGetDesLength(iClient, ifc_info_buf_ptr);
  1704 	const TInt srcLen = Kern::ThreadGetDesLength(iClient, ifc_info_buf_ptr);
  1832 	if (srcLen < ifc_info_buf.Length())
  1705 	if (srcLen < ifc_info_buf.Length())
  1833 		{
  1706 		{
  1834 		OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE, 
  1707 		__KTRACE_OPT(KUSB, Kern::Printf("SetInterface can't copy"));
  1835 		        "SetInterface can't copy" );
       
  1836 		PanicClientThread(EDesOverflow);
  1708 		PanicClientThread(EDesOverflow);
  1837 		}
  1709 		}
  1838 
  1710 
  1839 	TInt r = Kern::ThreadDesRead(iClient, ifc_info_buf_ptr, ifc_info_buf, 0, KChunkShiftBy0);
  1711 	TInt r = Kern::ThreadDesRead(iClient, ifc_info_buf_ptr, ifc_info_buf, 0, KChunkShiftBy0);
  1840 	if (r != KErrNone)
  1712 	if (r != KErrNone)
  1841 		{
  1713 		{
  1842 	    OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP1,
  1714 		__KTRACE_OPT(KUSB, Kern::Printf("SetInterface Copy failed reason=%d", r));
  1843 	            "SetInterface Copy failed reason=%d", r );
       
  1844 		PanicClientThread(r);
  1715 		PanicClientThread(r);
  1845 		}
  1716 		}
  1846 
  1717 
  1847 	TUsbcEndpointInfo* pEndpointData = ifc_info_buf().iEndpointData;
  1718 	TUsbcEndpointInfo* pEndpointData = ifc_info_buf().iEndpointData;
  1848 
  1719 
  1849 	// If an alternate interface is being asked for then do nothing,
  1720 	// If an alternate interface is being asked for then do nothing,
  1850 	// just pass it down to the Controller.
  1721 	// just pass it down to the Controller.
  1851 	const TInt num_endpoints = ifc_info_buf().iTotalEndpointsUsed;
  1722 	const TInt num_endpoints = ifc_info_buf().iTotalEndpointsUsed;
  1852     OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP2,
  1723 	__KTRACE_OPT(KUSB, Kern::Printf("SetInterface num_endpoints=%d", num_endpoints));
  1853             "SetInterface num_endpoints=%d", num_endpoints );
       
  1854 
  1724 
  1855 	// [The next 4 variables have to be initialized here because of the goto's that follow.]
  1725 	// [The next 4 variables have to be initialized here because of the goto's that follow.]
  1856 	// Both IN and OUT buffers will be fully cached:
  1726 	// Both IN and OUT buffers will be fully cached:
  1857 	const TUint32 cacheAttribs = EMapAttrSupRw | EMapAttrCachedMax;
  1727 	const TUint32 cacheAttribs = EMapAttrSupRw | EMapAttrCachedMax;
  1858 	const TUint32 bandwidthPriority = aInfoBuf->iBandwidthPriority;
  1728 	const TUint32 bandwidthPriority = aInfoBuf->iBandwidthPriority;
  1859 
  1729 
  1860 	// Supports ep0+5 endpoints
  1730 	// Supports ep0+5 endpoints
  1861 	TInt real_ep_numbers[6] = {-1, -1, -1, -1, -1, -1};
  1731 	TInt real_ep_numbers[6] = {-1, -1, -1, -1, -1, -1};
  1862 
  1732 
  1863     // See if PIL will accept this interface
  1733     // See if PIL will accept this interface
  1864     OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP3,
  1734 	__KTRACE_OPT(KUSB, Kern::Printf("SetInterface Calling controller"));
  1865             "SetInterface Calling controller" );
       
  1866 	r = iController->SetInterface(this,
  1735 	r = iController->SetInterface(this,
  1867 								  iClient,
  1736 								  iClient,
  1868 								  aInterfaceNumber,
  1737 								  aInterfaceNumber,
  1869 								  ifc_info_buf().iClass,
  1738 								  ifc_info_buf().iClass,
  1870 								  aInfoBuf->iString,
  1739 								  aInfoBuf->iString,
  1871 								  ifc_info_buf().iTotalEndpointsUsed,
  1740 								  ifc_info_buf().iTotalEndpointsUsed,
  1872 								  ifc_info_buf().iEndpointData,
  1741 								  ifc_info_buf().iEndpointData,
  1873 								  &real_ep_numbers,
  1742 								  &real_ep_numbers,
  1874 								  ifc_info_buf().iFeatureWord);
  1743 								  ifc_info_buf().iFeatureWord);
  1875 
  1744 
  1876     OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP4,
  1745 	__KTRACE_OPT(KUSB, Kern::Printf("SetInterface controller returned %d", r));
  1877             "SetInterface controller returned %d", r );
       
  1878 	if (r != KErrNone)
  1746 	if (r != KErrNone)
  1879 		{
  1747 		{
  1880 	    OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP5, 
  1748 		__KTRACE_OPT(KPANIC, Kern::Printf("SetInterface failed reason=%d", r));
  1881 	            "SetInterface failed reason=%d", r );
       
  1882 		return r;
  1749 		return r;
  1883 		}
  1750 		}
  1884 
  1751 
  1885 	// [The next variable has to be initialized here because of the goto's that follow.]
  1752 	// [The next variable has to be initialized here because of the goto's that follow.]
  1886 	TUsbcAlternateSettingList* alternateSettingListRec;
  1753 	TUsbcAlternateSettingList* alternateSettingListRec;
  1887 
  1754 
  1888 	// ep0
  1755 	// ep0
  1889 	if (iEndpoint[0] == NULL)
  1756 	if (iEndpoint[0] == NULL)
  1890 		{
  1757 		{
  1891 	    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP6,
  1758 		__KTRACE_OPT(KUSB, Kern::Printf("SetInterface 11"));
  1892 	            "SetInterface 11" );
       
  1893 		r = SetupEp0();
  1759 		r = SetupEp0();
  1894 		if (r != KErrNone)
  1760 		if (r != KErrNone)
  1895 			{
  1761 			{
  1896 		    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP7,
  1762 			__KTRACE_OPT(KPANIC, Kern::Printf("  Error: SetupEp0() failed"));
  1897 		            "  Error: SetupEp0() failed" );
       
  1898 			DestroyEp0();
  1763 			DestroyEp0();
  1899 			goto F1;
  1764 			goto F1;
  1900 			}
  1765 			}
  1901 		}
  1766 		}
  1902 
  1767 
  1905 		{
  1770 		{
  1906 		r = KErrNoMemory;
  1771 		r = KErrNoMemory;
  1907 		goto F1;
  1772 		goto F1;
  1908 		}
  1773 		}
  1909 
  1774 
  1910     OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP8,
  1775 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcChannel::SetInterface num_endpoints=%d", num_endpoints));
  1911             "DLddUsbcChannel::SetInterface num_endpoints=%d", num_endpoints );
       
  1912 
  1776 
  1913 	// other endpoints
  1777 	// other endpoints
  1914 	// calculate the total buffer size
  1778 	// calculate the total buffer size
  1915 	for (TInt i = 1; i <= num_endpoints; i++, pEndpointData++)
  1779 	for (TInt i = 1; i <= num_endpoints; i++, pEndpointData++)
  1916 		{
  1780 		{
  1917 	    OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP9,
  1781 		__KTRACE_OPT(KUSB, Kern::Printf("SetInterface for ep=%d", i));
  1918 	            "SetInterface for ep=%d", i );
       
  1919 		if (!ValidateEndpoint(pEndpointData))
  1782 		if (!ValidateEndpoint(pEndpointData))
  1920 			{
  1783 			{
  1921 			r = KErrUsbBadEndpoint;
  1784 			r = KErrUsbBadEndpoint;
  1922 			goto F2;
  1785 			goto F2;
  1923 			}
  1786 			}
  1933 			{
  1796 			{
  1934 			r = KErrNoMemory;
  1797 			r = KErrNoMemory;
  1935 			goto F2;
  1798 			goto F2;
  1936 			}
  1799 			}
  1937 
  1800 
  1938 	    OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP10,
  1801 		__KTRACE_OPT(KUSB, Kern::Printf("SetInterface for ep=%d rec=0x%08x ep==0x%08x",
  1939 	            "SetInterface for ep=%d rec=0x%08x ep==0x%08x", i, 
  1802 										i, alternateSettingListRec, ep));
  1940 	            reinterpret_cast<TUint>(alternateSettingListRec), reinterpret_cast<TUint>(ep) );
       
  1941 		}
  1803 		}
  1942 
  1804 
  1943 	// buf size of each endpoint
  1805 	// buf size of each endpoint
  1944 	TInt bufSizes[KMaxEndpointsPerClient + 1];
  1806 	TInt bufSizes[KMaxEndpointsPerClient + 1];
  1945 	TInt epNum[KMaxEndpointsPerClient + 1];
  1807 	TInt epNum[KMaxEndpointsPerClient + 1];
  1955 	for( TInt i=1;i<=num_endpoints;i++ )
  1817 	for( TInt i=1;i<=num_endpoints;i++ )
  1956 	    {
  1818 	    {
  1957 	    bufSizes[i] = alternateSettingListRec->iEndpoint[i]->BufferSize();
  1819 	    bufSizes[i] = alternateSettingListRec->iEndpoint[i]->BufferSize();
  1958 	    }
  1820 	    }
  1959 
  1821 
  1960     OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP11,
  1822 	__KTRACE_OPT(KUSB, Kern::Printf("Sort the endpoints:"));
  1961             "Sort the endpoints:" );
       
  1962 
  1823 
  1963     // sort the endpoint number by the bufsize decreasely
  1824     // sort the endpoint number by the bufsize decreasely
  1964 	for( TInt i=1;i<num_endpoints;i++ )
  1825 	for( TInt i=1;i<num_endpoints;i++ )
  1965 	    {
  1826 	    {
  1966 	    TInt epMaxBuf = i;
  1827 	    TInt epMaxBuf = i;
  1979         epNum[i] = epNum[epMaxBuf];
  1840         epNum[i] = epNum[epMaxBuf];
  1980         epNum[epMaxBuf] = temp;
  1841         epNum[epMaxBuf] = temp;
  1981 
  1842 
  1982 	    alternateSettingListRec->iEpNumDeOrderedByBufSize[i] = epNum[i];
  1843 	    alternateSettingListRec->iEpNumDeOrderedByBufSize[i] = epNum[i];
  1983 
  1844 
  1984 	    OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP12,
  1845 	    __KTRACE_OPT(KUSB, Kern::Printf(" %d:%d", epNum[i], bufSizes[i]));
  1985 	            " %d:%d", epNum[i], bufSizes[i] );
       
  1986 	    }
  1846 	    }
  1987     alternateSettingListRec->iEpNumDeOrderedByBufSize[num_endpoints] = epNum[num_endpoints];
  1847     alternateSettingListRec->iEpNumDeOrderedByBufSize[num_endpoints] = epNum[num_endpoints];
  1988     OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP13,
  1848     __KTRACE_OPT(KUSB, Kern::Printf(" %d:%d", epNum[num_endpoints], bufSizes[num_endpoints]));
  1989             " %d:%d", epNum[num_endpoints], bufSizes[num_endpoints] );
  1849     __KTRACE_OPT(KUSB, Kern::Printf("\n"));
  1990     OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP14, "\n" );
       
  1991 
  1850 
  1992 	// chain in this alternate setting
  1851 	// chain in this alternate setting
  1993 	alternateSettingListRec->iNext = iAlternateSettingList;
  1852 	alternateSettingListRec->iNext = iAlternateSettingList;
  1994 	iAlternateSettingList = alternateSettingListRec;
  1853 	iAlternateSettingList = alternateSettingListRec;
  1995 	alternateSettingListRec->iSetting = aInterfaceNumber;
  1854 	alternateSettingListRec->iSetting = aInterfaceNumber;
  2003 		}
  1862 		}
  2004 
  1863 
  2005 	r = SetupInterfaceMemory(iHwChunks, cacheAttribs );
  1864 	r = SetupInterfaceMemory(iHwChunks, cacheAttribs );
  2006 	if( r==KErrNone )
  1865 	if( r==KErrNone )
  2007 	    {
  1866 	    {
  2008         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP15,
  1867         __KTRACE_OPT(KUSB, Kern::Printf("SetInterface ready to exit"));
  2009                 "SetInterface ready to exit" );
       
  2010     
  1868     
  2011         if (aInterfaceNumber == 0)
  1869         if (aInterfaceNumber == 0)
  2012             {
  1870             {
  2013             // make sure we're ready to go with the main interface
  1871             // make sure we're ready to go with the main interface
  2014             iValidInterface = ETrue;
  1872             iValidInterface = ETrue;
  2015             OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP16,
  1873             __KTRACE_OPT(KUSB, Kern::Printf("SetInterface SelectAlternateSetting"));
  2016                     "SetInterface SelectAlternateSetting" );
       
  2017             SelectAlternateSetting(0);
  1874             SelectAlternateSetting(0);
  2018             }
  1875             }
  2019         return KErrNone;
  1876         return KErrNone;
  2020 	    }
  1877 	    }
  2021 	else
  1878 	else
  2022 	    {
  1879 	    {
  2023         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP17,
  1880         __KTRACE_OPT(KUSB, Kern::Printf("Destroying all interfaces"));
  2024                 "Destroying all interfaces" );
       
  2025         DestroyAllInterfaces();
  1881         DestroyAllInterfaces();
  2026         DestroyEp0();
  1882         DestroyEp0();
  2027         return r;
  1883         return r;
  2028 	    }
  1884 	    }
  2029 
  1885 
  2031 	delete alternateSettingListRec;
  1887 	delete alternateSettingListRec;
  2032 	//Fall through
  1888 	//Fall through
  2033  
  1889  
  2034  F1:
  1890  F1:
  2035 #if _DEBUG
  1891 #if _DEBUG
  2036 #ifdef OST_TRACE_COMPILER_IN_USE
       
  2037 	TInt r1 = iController->ReleaseInterface(this, aInterfaceNumber);
  1892 	TInt r1 = iController->ReleaseInterface(this, aInterfaceNumber);
  2038 #else
  1893 	__KTRACE_OPT(KUSB, Kern::Printf("Release Interface controller returned %d", r1));
  2039 	(void)  iController->ReleaseInterface(this, aInterfaceNumber);
       
  2040 #endif
       
  2041     OstTraceDef1( OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, DLDDUSBCCHANNEL_SETINTERFACE_DUP18,
       
  2042             "Release Interface controller returned %d", r1 );
       
  2043 #else
  1894 #else
  2044 	(void)	iController->ReleaseInterface(this, aInterfaceNumber);
  1895 	(void)	iController->ReleaseInterface(this, aInterfaceNumber);
  2045 #endif
  1896 #endif
  2046 	return r;
  1897 	return r;
  2047 	}
  1898 	}
  2056     TBool chunkChanged = EFalse;
  1907     TBool chunkChanged = EFalse;
  2057     TInt numOfEp = asRec->iNumberOfEndpoints;
  1908     TInt numOfEp = asRec->iNumberOfEndpoints;
  2058  
  1909  
  2059     // 1, collect all bufs' sizes for the current interface
  1910     // 1, collect all bufs' sizes for the current interface
  2060     //    to realloc all the chunks
  1911     //    to realloc all the chunks
  2061     OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY, 
  1912     __KTRACE_OPT(KUSB, Kern::Printf("Collect all buffer sizes:"));
  2062             "Collect all buffer sizes:" );
       
  2063     RArray<TInt> bufSizes;
  1913     RArray<TInt> bufSizes;
  2064     for(TInt i=1;i<=numOfEp;i++)
  1914     for(TInt i=1;i<=numOfEp;i++)
  2065         {
  1915         {
  2066         TInt nextEp = asRec->iEpNumDeOrderedByBufSize[i];
  1916         TInt nextEp = asRec->iEpNumDeOrderedByBufSize[i];
  2067         TInt epBufCount = asRec->iEndpoint[nextEp]->BufferNumber();
  1917         TInt epBufCount = asRec->iEndpoint[nextEp]->BufferNumber();
  2068         OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP1,
  1918         __KTRACE_OPT(KUSB, Kern::Printf(" ep %d, buf count %d", nextEp, epBufCount ));
  2069                 " ep %d, buf count %d", nextEp, epBufCount );
       
  2070         for(TInt k=0;k<epBufCount;k++)
  1919         for(TInt k=0;k<epBufCount;k++)
  2071             {
  1920             {
  2072             TInt epBufSize = asRec->iEndpoint[nextEp]->BufferSize();
  1921             TInt epBufSize = asRec->iEndpoint[nextEp]->BufferSize();
  2073             TInt r = bufSizes.Append(epBufSize);
  1922             TInt r = bufSizes.Append(epBufSize);
  2074             if(r!=KErrNone)
  1923             if(r!=KErrNone)
  2075                 {
  1924                 {
  2076                 iController->DeRegisterClient(this);
  1925                 iController->DeRegisterClient(this);
  2077                 bufSizes.Close();
  1926                 bufSizes.Close();
  2078                 return r;
  1927                 return r;
  2079                 }
  1928                 }
  2080             OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP2,
  1929             __KTRACE_OPT(KUSB,Kern::Printf(" %d", epBufSize ));
  2081                     " %d", epBufSize );
       
  2082             }
  1930             }
  2083         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP3, "\n" );
  1931         __KTRACE_OPT(KUSB, Kern::Printf("\n"));
  2084 
  1932 
  2085         }
  1933         }
  2086    
  1934    
  2087     // 2, alloc the buffer decreasely, biggest-->smallest
  1935     // 2, alloc the buffer decreasely, biggest-->smallest
  2088     //   2.1 check the existing chunks
  1936     //   2.1 check the existing chunks
  2089     TInt bufCount = bufSizes.Count();
  1937     TInt bufCount = bufSizes.Count();
  2090     OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP4,
  1938     __KTRACE_OPT(KUSB, Kern::Printf(" ep buf number needed %d", bufCount ));
  2091             " ep buf number needed %d", bufCount );
  1939     __KTRACE_OPT(KUSB, Kern::Printf(" chunks available %d", aHwChunks.Count() ));
  2092     OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP5,
       
  2093             " chunks available %d", aHwChunks.Count() );
       
  2094 
  1940 
  2095     TInt chunkInd = 0;
  1941     TInt chunkInd = 0;
  2096     while( (chunkInd<aHwChunks.Count())&& (chunkInd<bufCount))
  1942     while( (chunkInd<aHwChunks.Count())&& (chunkInd<bufCount))
  2097         {
  1943         {
  2098         TUint8* oldAddr = NULL;
  1944         TUint8* oldAddr = NULL;
  2099         oldAddr = reinterpret_cast<TUint8*>(aHwChunks[chunkInd]->LinearAddress());
  1945         oldAddr = reinterpret_cast<TUint8*>(aHwChunks[chunkInd]->LinearAddress());
  2100 
  1946 
  2101         DPlatChunkHw* chunk = ReAllocate(bufSizes[chunkInd], aHwChunks[chunkInd], aCacheAttribs);
  1947         DPlatChunkHw* chunk = ReAllocate(bufSizes[chunkInd], aHwChunks[chunkInd], aCacheAttribs);
  2102         if (chunk == NULL)
  1948         if (chunk == NULL)
  2103             {
  1949             {
  2104             OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP6,
  1950             __KTRACE_OPT(KUSB, Kern::Printf("Failed to alloc chunks size %d!", bufSizes[chunkInd]));
  2105                     "Failed to alloc chunks size %d!", bufSizes[chunkInd] );
       
  2106             // lost all interfaces:
  1951             // lost all interfaces:
  2107             // Tell Controller to release Interface and h/w resources associated with this
  1952             // Tell Controller to release Interface and h/w resources associated with this
  2108             iController->DeRegisterClient(this);
  1953             iController->DeRegisterClient(this);
  2109             bufSizes.Close();
  1954             bufSizes.Close();
  2110             return KErrNoMemory;
  1955             return KErrNoMemory;
  2111             }
  1956             }
  2112         else
  1957         else
  2113             {
  1958             {
  2114             // Parcel out the memory between endpoints
  1959             // Parcel out the memory between endpoints
  2115             TUint8* newAddr = reinterpret_cast<TUint8*>(chunk->LinearAddress());
  1960             TUint8* newAddr = reinterpret_cast<TUint8*>(chunk->LinearAddress());
  2116             OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP7,
  1961             __KTRACE_OPT(KUSB, Kern::Printf("SetupInterfaceMemory alloc new chunk=0x%x, size=%d", newAddr,bufSizes[chunkInd]));
  2117                     "SetupInterfaceMemory alloc new chunk=0x%x, size=%d", 
       
  2118                     reinterpret_cast<TUint>(newAddr), bufSizes[chunkInd] );
       
  2119             // The check is important to avoid chunkChanged to be corrupted.
  1962             // The check is important to avoid chunkChanged to be corrupted.
  2120             // This code change is to fix the problem that one chunk is used by multiple interfaces.
  1963             // This code change is to fix the problem that one chunk is used by multiple interfaces.
  2121             if(!chunkChanged)
  1964             if(!chunkChanged)
  2122             	{
  1965             	{
  2123             	chunkChanged = (newAddr != oldAddr);
  1966             	chunkChanged = (newAddr != oldAddr);
  2132         {
  1975         {
  2133         DPlatChunkHw* chunk = NULL;
  1976         DPlatChunkHw* chunk = NULL;
  2134         chunk = Allocate( bufSizes[chunkInd], aCacheAttribs);
  1977         chunk = Allocate( bufSizes[chunkInd], aCacheAttribs);
  2135         if (chunk == NULL)
  1978         if (chunk == NULL)
  2136             {
  1979             {
  2137             OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP8,
  1980             __KTRACE_OPT(KUSB, Kern::Printf("Failed to alloc chunk, size %d!", bufSizes[chunkInd]));
  2138                     "Failed to alloc chunk, size %d!", bufSizes[chunkInd] );
       
  2139             // lost all interfaces:
  1981             // lost all interfaces:
  2140             // Tell Controller to release Interface and h/w resources associated with this
  1982             // Tell Controller to release Interface and h/w resources associated with this
  2141             iController->DeRegisterClient(this);
  1983             iController->DeRegisterClient(this);
  2142             bufSizes.Close();
  1984             bufSizes.Close();
  2143             return KErrNoMemory;
  1985             return KErrNoMemory;
  2144             }
  1986             }
  2145         else
  1987         else
  2146             {
  1988             {
  2147             // Parcel out the memory between endpoints
  1989             // Parcel out the memory between endpoints
  2148             OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP9,
  1990             __KTRACE_OPT(KUSB, Kern::Printf("SetupInterfaceMemory alloc new chunk=0x%x, size=%d",
  2149                     "SetupInterfaceMemory alloc new chunk=0x%x, size=%d",
  1991             						reinterpret_cast<TUint8*>(chunk->LinearAddress()), bufSizes[chunkInd]));
  2150                     static_cast<TUint>(chunk->LinearAddress()), bufSizes[chunkInd]);
       
  2151 
       
  2152             TInt r = aHwChunks.Append(chunk);
  1992             TInt r = aHwChunks.Append(chunk);
  2153             if(r!=KErrNone)
  1993             if(r!=KErrNone)
  2154                 {
  1994                 {
  2155                 ClosePhysicalChunk(chunk);
  1995                 ClosePhysicalChunk(chunk);
  2156                 iController->DeRegisterClient(this);
  1996                 iController->DeRegisterClient(this);
  2165     
  2005     
  2166     ReSetInterfaceMemory(asRec, aHwChunks);
  2006     ReSetInterfaceMemory(asRec, aHwChunks);
  2167 
  2007 
  2168     if(chunkChanged)
  2008     if(chunkChanged)
  2169         {
  2009         {
  2170         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP10,
  2010         __KTRACE_OPT(KUSB, Kern::Printf("SetupInterfaceMemory readdressing."));
  2171                 "SetupInterfaceMemory readdressing." );
       
  2172         asRec = asRec->iNext;
  2011         asRec = asRec->iNext;
  2173         while (asRec)
  2012         while (asRec)
  2174             {
  2013             {
  2175             // Interfaces are not concurrent so they can all start at the same logical address
  2014             // Interfaces are not concurrent so they can all start at the same logical address
  2176             OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPINTERFACEMEMORY_DUP11,
  2015             __KTRACE_OPT(KUSB, Kern::Printf("SetupInterfaceMemory readdressing setting=%d", asRec->iSetting));
  2177                     "SetupInterfaceMemory readdressing setting=%d", asRec->iSetting );
       
  2178             ReSetInterfaceMemory(asRec, aHwChunks);
  2016             ReSetInterfaceMemory(asRec, aHwChunks);
  2179             asRec = asRec->iNext;
  2017             asRec = asRec->iNext;
  2180             }
  2018             }
  2181         }
  2019         }
  2182     return KErrNone;
  2020     return KErrNone;
  2183     }
  2021     }
  2184 
  2022 
  2185 TInt DLddUsbcChannel::SetupEp0()
  2023 TInt DLddUsbcChannel::SetupEp0()
  2186 	{
  2024 	{
  2187 	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPEP0, 
  2025 	__KTRACE_OPT(KUSB, Kern::Printf("SetupEp0 entry %x", this));
  2188 	        "SetupEp0 entry %x", this );
       
  2189 	TInt ep0Size = iController->Ep0PacketSize();
  2026 	TInt ep0Size = iController->Ep0PacketSize();
  2190 	TUsbcEndpointInfo ep0Info = TUsbcEndpointInfo(KUsbEpTypeControl, KUsbEpDirBidirect, ep0Size);
  2027 	TUsbcEndpointInfo ep0Info = TUsbcEndpointInfo(KUsbEpTypeControl, KUsbEpDirBidirect, ep0Size);
  2191 	TUsbcEndpoint* ep0 = new TUsbcEndpoint(this, iController, &ep0Info, 0, 0);
  2028 	TUsbcEndpoint* ep0 = new TUsbcEndpoint(this, iController, &ep0Info, 0, 0);
  2192 	if (ep0 == NULL)
  2029 	if (ep0 == NULL)
  2193 		{
  2030 		{
  2219             return r;
  2056             return r;
  2220             }
  2057             }
  2221         TUint8 * buf;
  2058         TUint8 * buf;
  2222         buf = (TUint8*) chunk->LinearAddress();
  2059         buf = (TUint8*) chunk->LinearAddress();
  2223         ep0->SetBufferAddr( i, buf);
  2060         ep0->SetBufferAddr( i, buf);
  2224         OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPEP0_DUP1,
  2061         __KTRACE_OPT(KUSB, Kern::Printf("SetupEp0 60 buffer number %d", i));
  2225                 "SetupEp0 60 buffer number %d", i );
  2062         __KTRACE_OPT(KUSB, Kern::Printf("SetupEp0 60 buffer size %d", bufferSize));
  2226         OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_SETUPEP0_DUP2,
       
  2227                 "SetupEp0 60 buffer size %d", bufferSize );
       
  2228         }
  2063         }
  2229 
  2064 
  2230     ep0->SetRealEpNumber(0);
  2065     ep0->SetRealEpNumber(0);
  2231 	return KErrNone;
  2066 	return KErrNone;
  2232 	}
  2067 	}
  2252             if (ep != NULL )
  2087             if (ep != NULL )
  2253                 {
  2088                 {
  2254                 TUint8* pBuf = NULL;
  2089                 TUint8* pBuf = NULL;
  2255                 pBuf = reinterpret_cast<TUint8*>(aHwChunks[chunkInd]->LinearAddress());
  2090                 pBuf = reinterpret_cast<TUint8*>(aHwChunks[chunkInd]->LinearAddress());
  2256                 ep->SetBufferAddr( k, pBuf);
  2091                 ep->SetBufferAddr( k, pBuf);
  2257                 OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_RESETINTERFACEMEMORY,
  2092                 __KTRACE_OPT(KUSB, Kern::Printf("  ep %d, buf %d, addr 0x%x", nextEp, k, pBuf ));
  2258                         "  ep %d, buf %d, addr 0x%x", nextEp, k, reinterpret_cast<TUint>(pBuf) );
       
  2259                 chunkInd++;
  2093                 chunkInd++;
  2260 #ifdef _DEBUG
  2094                 __ASSERT_DEBUG(chunkInd<=aHwChunks.Count(),
  2261                 if (chunkInd > aHwChunks.Count())
  2095                                Kern::Printf("  Error: available chunks %d, run out at epInd%d, bufInd%d",
  2262                     {
  2096                                        aHwChunks.Count(), i, k));
  2263                     OstTraceDefExt3(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, DLDDUSBCCHANNEL_RESETINTERFACEMEMORY_DUP1,
       
  2264                             "  Error: available chunks %d, run out at epInd%d, bufInd%d",
       
  2265                             aHwChunks.Count(), i, k );
       
  2266                     }
       
  2267 #endif
       
  2268                 __ASSERT_DEBUG(chunkInd<=aHwChunks.Count(),
  2097                 __ASSERT_DEBUG(chunkInd<=aHwChunks.Count(),
  2269                                    Kern::Fault("usbc.ldd", __LINE__));
  2098                                    Kern::Fault("usbc.ldd", __LINE__));
  2270                 }
  2099                 }
  2271             }
  2100             }
  2272         }
  2101         }
  2358 	}
  2187 	}
  2359 
  2188 
  2360 
  2189 
  2361 void DLddUsbcChannel::EndpointStatusChangeCallback(TAny* aDLddUsbcChannel)
  2190 void DLddUsbcChannel::EndpointStatusChangeCallback(TAny* aDLddUsbcChannel)
  2362     {
  2191     {
  2363     OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_ENDPOINTSTATUSCHANGECALLBACK,
  2192 	__KTRACE_OPT(KUSB, Kern::Printf("EndpointStatusChangeCallback"));
  2364             "EndpointStatusChangeCallback" );
       
  2365     DLddUsbcChannel* dUsbc = (DLddUsbcChannel*) aDLddUsbcChannel;
  2193     DLddUsbcChannel* dUsbc = (DLddUsbcChannel*) aDLddUsbcChannel;
  2366 	if (dUsbc->iChannelClosing)
  2194 	if (dUsbc->iChannelClosing)
  2367 		return;
  2195 		return;
  2368 	TUint endpointState = dUsbc->iEndpointStatusCallbackInfo.State();
  2196 	TUint endpointState = dUsbc->iEndpointStatusCallbackInfo.State();
  2369 	const TInt reqNo = (TInt) RDevUsbcClient::ERequestEndpointStatusNotify;
  2197 	const TInt reqNo = (TInt) RDevUsbcClient::ERequestEndpointStatusNotify;
  2370 	if (dUsbc->iRequestStatus[reqNo])
  2198 	if (dUsbc->iRequestStatus[reqNo])
  2371 		{
  2199 		{
  2372 	    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_ENDPOINTSTATUSCHANGECALLBACK_DUP1,
  2200 		__KTRACE_OPT(KUSB, Kern::Printf("EndpointStatusChangeCallback Notify status"));
  2373 	            "EndpointStatusChangeCallback Notify status" );
       
  2374 		DThread* client = dUsbc->iClient;
  2201 		DThread* client = dUsbc->iClient;
  2375 		
  2202 		
  2376 		dUsbc->iEndpointStatusChangeReq->Data() = endpointState;
  2203 		dUsbc->iEndpointStatusChangeReq->Data() = endpointState;
  2377 		dUsbc->iRequestStatus[reqNo] = NULL;
  2204 		dUsbc->iRequestStatus[reqNo] = NULL;
  2378 		Kern::QueueRequestComplete(client,dUsbc->iEndpointStatusChangeReq,KErrNone);
  2205 		Kern::QueueRequestComplete(client,dUsbc->iEndpointStatusChangeReq,KErrNone);
  2391     TInt i;
  2218     TInt i;
  2392  	for (i = 0;
  2219  	for (i = 0;
  2393  		 (i < KUsbcDeviceStateRequests) && ((deviceState = dUsbc->iStatusCallbackInfo.State(i)) != EUsbcNoState);
  2220  		 (i < KUsbcDeviceStateRequests) && ((deviceState = dUsbc->iStatusCallbackInfo.State(i)) != EUsbcNoState);
  2394  		 ++i)
  2221  		 ++i)
  2395 		{
  2222 		{
  2396 		OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_STATUSCHANGECALLBACK, 
  2223  		__KTRACE_OPT(KUSB, Kern::Printf("StatusChangeCallBack status=%d", deviceState));
  2397 		        "StatusChangeCallBack status=%d", static_cast<TInt>(deviceState) );
       
  2398 		if (deviceState & KUsbAlternateSetting)
  2224 		if (deviceState & KUsbAlternateSetting)
  2399 			{
  2225 			{
  2400 			dUsbc->ProcessAlternateSetting(deviceState);
  2226 			dUsbc->ProcessAlternateSetting(deviceState);
  2401 			}
  2227 			}
  2402 		else
  2228 		else
  2422 	}
  2248 	}
  2423 
  2249 
  2424 
  2250 
  2425 void DLddUsbcChannel::OtgFeatureChangeCallback(TAny* aDLddUsbcChannel)
  2251 void DLddUsbcChannel::OtgFeatureChangeCallback(TAny* aDLddUsbcChannel)
  2426     {
  2252     {
  2427     OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_OTGFEATURECHANGECALLBACK,
  2253 	__KTRACE_OPT(KUSB, Kern::Printf("OtgFeatureChangeCallback"));
  2428             "OtgFeatureChangeCallback" );
       
  2429     DLddUsbcChannel* dUsbc = (DLddUsbcChannel*) aDLddUsbcChannel;
  2254     DLddUsbcChannel* dUsbc = (DLddUsbcChannel*) aDLddUsbcChannel;
  2430 	if (dUsbc->iChannelClosing)
  2255 	if (dUsbc->iChannelClosing)
  2431 		return;
  2256 		return;
  2432 
  2257 
  2433     TUint8 features;
  2258     TUint8 features;
  2435     dUsbc->iController->GetCurrentOtgFeatures(features);
  2260     dUsbc->iController->GetCurrentOtgFeatures(features);
  2436 
  2261 
  2437     const TInt reqNo = (TInt) RDevUsbcClient::ERequestOtgFeaturesNotify;
  2262     const TInt reqNo = (TInt) RDevUsbcClient::ERequestOtgFeaturesNotify;
  2438 	if (dUsbc->iRequestStatus[reqNo])
  2263 	if (dUsbc->iRequestStatus[reqNo])
  2439 		{
  2264 		{
  2440 	    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_OTGFEATURECHANGECALLBACK_DUP1,
  2265 		__KTRACE_OPT(KUSB, Kern::Printf("OtgFeatureChangeCallback Notify status"));
  2441 	            "OtgFeatureChangeCallback Notify status" );
       
  2442 		dUsbc->iOtgFeatureChangeReq->Data()=features;
  2266 		dUsbc->iOtgFeatureChangeReq->Data()=features;
  2443 		dUsbc->iRequestStatus[reqNo] = NULL;
  2267 		dUsbc->iRequestStatus[reqNo] = NULL;
  2444 		Kern::QueueRequestComplete(dUsbc->iClient,dUsbc->iOtgFeatureChangeReq,KErrNone);
  2268 		Kern::QueueRequestComplete(dUsbc->iClient,dUsbc->iOtgFeatureChangeReq,KErrNone);
  2445 		dUsbc->iOtgFeatureChangePtr = NULL;
  2269 		dUsbc->iOtgFeatureChangePtr = NULL;
  2446 		}
  2270 		}
  2487 				{
  2311 				{
  2488 				return alternateSettingListRec->iEndpoint[aEndpoint]->RealEpNumber();
  2312 				return alternateSettingListRec->iEndpoint[aEndpoint]->RealEpNumber();
  2489 				}
  2313 				}
  2490 			else
  2314 			else
  2491 				{
  2315 				{
  2492 				OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_EPFROMALTERNATESETTING,
  2316 				__KTRACE_OPT(KPANIC, Kern::Printf("  Error: aEndpoint %d wrong for aAlternateSetting %d",
  2493 				        "  Error: aEndpoint %d wrong for aAlternateSetting %d", aEndpoint, aAlternateSetting );
  2317 												  aEndpoint, aAlternateSetting));
  2494 				return -1;
  2318 				return -1;
  2495 				}
  2319 				}
  2496 			}
  2320 			}
  2497 		alternateSettingListRec = alternateSettingListRec->iNext;
  2321 		alternateSettingListRec = alternateSettingListRec->iNext;
  2498 		}
  2322 		}
  2499     OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_EPFROMALTERNATESETTING_DUP1,
  2323 	__KTRACE_OPT(KPANIC, Kern::Printf("  Error: no aAlternateSetting %d found", aAlternateSetting));
  2500             "  Error: no aAlternateSetting %d found", aAlternateSetting );
       
  2501 	return -1;
  2324 	return -1;
  2502 	}
  2325 	}
  2503 
  2326 
  2504 
  2327 
  2505 TInt DLddUsbcChannel::ProcessAlternateSetting(TUint aAlternateSetting)
  2328 TInt DLddUsbcChannel::ProcessAlternateSetting(TUint aAlternateSetting)
  2506 	{
  2329 	{
  2507 	ResetInterface(KErrUsbInterfaceChange);					// kill any outstanding transfers
  2330 	ResetInterface(KErrUsbInterfaceChange);					// kill any outstanding transfers
  2508 	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_PROCESSALTERNATESETTING,
  2331 	__KTRACE_OPT(KUSB, Kern::Printf("ProcessAlternateSetting 0x%08x", aAlternateSetting));
  2509 	        "ProcessAlternateSetting 0x%08x", aAlternateSetting );
       
  2510 	TUint newSetting = aAlternateSetting&(~KUsbAlternateSetting);
  2332 	TUint newSetting = aAlternateSetting&(~KUsbAlternateSetting);
  2511     OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_PROCESSALTERNATESETTING_DUP1,
  2333 	__KTRACE_OPT(KUSB, Kern::Printf("ProcessAlternateSetting selecting alternate setting 0x%08x", newSetting));
  2512             "ProcessAlternateSetting selecting alternate setting 0x%08x", newSetting );
       
  2513 
       
  2514 	TInt r = SelectAlternateSetting(newSetting);
  2334 	TInt r = SelectAlternateSetting(newSetting);
  2515 	if (r != KErrNone)
  2335 	if (r != KErrNone)
  2516 		return r;
  2336 		return r;
  2517 	StartEpReads();
  2337 	StartEpReads();
  2518 	iAlternateSetting = newSetting;
  2338 	iAlternateSetting = newSetting;
  2520 	}
  2340 	}
  2521 
  2341 
  2522 
  2342 
  2523 TInt DLddUsbcChannel::ProcessDeviceState(TUsbcDeviceState aDeviceState)
  2343 TInt DLddUsbcChannel::ProcessDeviceState(TUsbcDeviceState aDeviceState)
  2524 	{
  2344 	{
  2525 	OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_PROCESSDEVICESTATE,
  2345 	__KTRACE_OPT(KUSB, Kern::Printf("ProcessDeviceState(%d -> %d)", iDeviceState, aDeviceState));
  2526 	        "ProcessDeviceState(%d -> %d)", iDeviceState, aDeviceState );
       
  2527 	if (iDeviceState == aDeviceState)
  2346 	if (iDeviceState == aDeviceState)
  2528 		{
  2347 		{
  2529         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_PROCESSDEVICESTATE_DUP1,
  2348 		__KTRACE_OPT(KUSB, Kern::Printf("  No state change => nothing to be done."));
  2530                 "  No state change => nothing to be done." );
       
  2531 		return KErrNone;
  2349 		return KErrNone;
  2532 		}
  2350 		}
  2533 	if (iDeviceState == EUsbcDeviceStateSuspended)
  2351 	if (iDeviceState == EUsbcDeviceStateSuspended)
  2534 		{
  2352 		{
  2535         OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_PROCESSDEVICESTATE_DUP2,
  2353 		__KTRACE_OPT(KUSB, Kern::Printf("  Coming out of Suspend: old state = %d", iOldDeviceState));
  2536                 "  Coming out of Suspend: old state = %d", iOldDeviceState );
       
  2537 		iDeviceState = iOldDeviceState;
  2354 		iDeviceState = iOldDeviceState;
  2538 		if (iDeviceState == aDeviceState)
  2355 		if (iDeviceState == aDeviceState)
  2539 			{
  2356 			{
  2540 	        OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_PROCESSDEVICESTATE_DUP3,
  2357 			__KTRACE_OPT(KUSB, Kern::Printf("  New state same as before Suspend => nothing to be done."));
  2541 	                "  New state same as before Suspend => nothing to be done." );
       
  2542 			return KErrNone;
  2358 			return KErrNone;
  2543 			}
  2359 			}
  2544 		}
  2360 		}
  2545 	TBool renumerateState = (aDeviceState == EUsbcDeviceStateConfigured);
  2361 	TBool renumerateState = (aDeviceState == EUsbcDeviceStateConfigured);
  2546 	TBool deconfigured = EFalse;
  2362 	TBool deconfigured = EFalse;
  2547 	TInt cancellationCode = KErrNone;
  2363 	TInt cancellationCode = KErrNone;
  2548 	if (aDeviceState == EUsbcDeviceStateSuspended)
  2364 	if (aDeviceState == EUsbcDeviceStateSuspended)
  2549 		{
  2365 		{
  2550         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_PROCESSDEVICESTATE_DUP4,
  2366 		__KTRACE_OPT(KUSB, Kern::Printf("  Suspending..."));
  2551                 "  Suspending..." );
       
  2552 		iOldDeviceState = iDeviceState;
  2367 		iOldDeviceState = iDeviceState;
  2553 		// Put PSL into low power mode here
  2368 		// Put PSL into low power mode here
  2554 		}
  2369 		}
  2555 	else
  2370 	else
  2556 		{
  2371 		{
  2566 				cancellationCode = KErrUsbDeviceBusReset;
  2381 				cancellationCode = KErrUsbDeviceBusReset;
  2567 			else
  2382 			else
  2568 				cancellationCode = KErrUsbDeviceNotConfigured;
  2383 				cancellationCode = KErrUsbDeviceNotConfigured;
  2569 			}
  2384 			}
  2570 		}
  2385 		}
  2571     OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_PROCESSDEVICESTATE_DUP5,
  2386 	__KTRACE_OPT(KUSB, Kern::Printf("  %d --> %d", iDeviceState, aDeviceState));
  2572             "  %d --> %d", iDeviceState, aDeviceState );
       
  2573 	iDeviceState = aDeviceState;
  2387 	iDeviceState = aDeviceState;
  2574 	if (iValidInterface || iOwnsDeviceControl)
  2388 	if (iValidInterface || iOwnsDeviceControl)
  2575 		{
  2389 		{
  2576 		// This LDD may not own an interface. It could be some manager reenumerating
  2390 		// This LDD may not own an interface. It could be some manager reenumerating
  2577 		// after its subordinate LDDs have setup their interfaces.
  2391 		// after its subordinate LDDs have setup their interfaces.
  2610 	while ((++i <= KMaxEndpointsPerClient) && iEndpoint[i])
  2424 	while ((++i <= KMaxEndpointsPerClient) && iEndpoint[i])
  2611 		{
  2425 		{
  2612 		const TInt size = iController->EndpointPacketSize(this, iEndpoint[i]->RealEpNumber());
  2426 		const TInt size = iController->EndpointPacketSize(this, iEndpoint[i]->RealEpNumber());
  2613 		if (size < 0)
  2427 		if (size < 0)
  2614 			{
  2428 			{
  2615 			OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCCHANNEL_UPDATEENDPOINTSIZES,
  2429 			__KTRACE_OPT(KPANIC, Kern::Printf("  Error: Packet size < 0 for ep %d", i));
  2616 			        "  Error: Packet size < 0 for ep %d", i );
       
  2617 			continue;
  2430 			continue;
  2618 			}
  2431 			}
  2619 		iEndpoint[i]->SetMaxPacketSize(size);
  2432 		iEndpoint[i]->SetMaxPacketSize(size);
  2620 		}
  2433 		}
  2621 #ifdef _DEBUG
  2434 	__ASSERT_DEBUG(i == iNumberOfEndpoints + 1,
  2622 	if (i != iNumberOfEndpoints + 1)
  2435 				   Kern::Printf("  Error: iNumberOfEndpoints wrong (%d)", iNumberOfEndpoints));
  2623 	    {
  2436 	}
  2624         OstTraceDef1( OST_TRACE_CATEGORY_DEBUG, TRACE_FATAL, DLDDUSBCCHANNEL_UPDATEENDPOINTSIZES_DUP1,
  2437 
  2625                 "  Error: iNumberOfEndpoints wrong (%d)", iNumberOfEndpoints );
  2438 
  2626 
  2439 DPlatChunkHw* DLddUsbcChannel::ReAllocate(TInt aBuffersize, DPlatChunkHw* aHwChunk, TUint32 aCacheAttribs)
  2627 	    }
       
  2628 #endif
       
  2629 	}
       
  2630 
       
  2631 
       
  2632 DPlatChunkHw* DLddUsbcChannel::ReAllocate(TInt aBuffersize, DPlatChunkHw* aHwChunk,TUint32 aCacheAttribs)
       
  2633 	{
  2440 	{
  2634 	DPlatChunkHw* chunk = aHwChunk;
  2441 	DPlatChunkHw* chunk = aHwChunk;
  2635 	if ((!chunk) || (chunk->iSize < aBuffersize))
  2442 	if ((!chunk) || (chunk->iSize < aBuffersize))
  2636 		{
  2443 		{
  2637 		if (chunk)
  2444 		if (chunk)
  2638 			{
  2445 			{
  2639 			ClosePhysicalChunk(chunk);
  2446 			ClosePhysicalChunk(chunk);
  2640 			}
  2447 			}
  2641 		OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_REALLOCATE, 
  2448 		__KTRACE_OPT(KUSB, Kern::Printf("ReAllocate need to get new chunk"));
  2642 		        "ReAllocate need to get new chunk" );
       
  2643 		chunk = Allocate(aBuffersize, aCacheAttribs);
  2449 		chunk = Allocate(aBuffersize, aCacheAttribs);
  2644 		}
  2450 		}
  2645 	return chunk;
  2451 	return chunk;
  2646 	}
  2452 	}
  2647 
  2453 
  2703 		TUint32 deviceState;
  2509 		TUint32 deviceState;
  2704 		if (iStatusFifo->GetDeviceQueuedStatus(deviceState) == KErrNone)
  2510 		if (iStatusFifo->GetDeviceQueuedStatus(deviceState) == KErrNone)
  2705 			{
  2511 			{
  2706 			// Device state waiting to be sent userside
  2512 			// Device state waiting to be sent userside
  2707 			completeNow = ETrue;
  2513 			completeNow = ETrue;
  2708 			OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_ALTERNATEDEVICESTATETESTCOMPLETE,
  2514 			__KTRACE_OPT(KUSB, Kern::Printf("StatusChangeCallback Notify status"));
  2709 			        "StatusChangeCallback Notify status" );
       
  2710 			iStatusChangeReq->Data()=deviceState;
  2515 			iStatusChangeReq->Data()=deviceState;
  2711 			iStatusChangePtr = NULL;
  2516 			iStatusChangePtr = NULL;
  2712 			}
  2517 			}
  2713 		}
  2518 		}
  2714 	return completeNow;
  2519 	return completeNow;
  2721 	}
  2526 	}
  2722 
  2527 
  2723 
  2528 
  2724 void DLddUsbcChannel::DeConfigure(TInt aErrorCode)
  2529 void DLddUsbcChannel::DeConfigure(TInt aErrorCode)
  2725 	{
  2530 	{
  2726 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DECONFIGURE,
  2531 	__KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcChannel::DeConfigure()"));
  2727 	        "DLddUsbcChannel::DeConfigure()" );
       
  2728 	// Called after deconfiguration. Cancels transfers on all endpoints.
  2532 	// Called after deconfiguration. Cancels transfers on all endpoints.
  2729 	ResetInterface(aErrorCode);
  2533 	ResetInterface(aErrorCode);
  2730 	// Cancel the endpoint status notify request if it is outstanding.
  2534 	// Cancel the endpoint status notify request if it is outstanding.
  2731 	const TInt KEpNotReq = RDevUsbcClient::ERequestEndpointStatusNotify;
  2535 	const TInt KEpNotReq = RDevUsbcClient::ERequestEndpointStatusNotify;
  2732 	if (iRequestStatus[KEpNotReq])
  2536 	if (iRequestStatus[KEpNotReq])
  2760 	if (iValidInterface || iOwnsDeviceControl)
  2564 	if (iValidInterface || iOwnsDeviceControl)
  2761 		{
  2565 		{
  2762 		// Reset each endpoint except ep0
  2566 		// Reset each endpoint except ep0
  2763 		for (TInt i = 1; i <= iNumberOfEndpoints; i++)
  2567 		for (TInt i = 1; i <= iNumberOfEndpoints; i++)
  2764 			{
  2568 			{
  2765 			OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_RESETINTERFACE,
  2569 			__KTRACE_OPT(KUSB, Kern::Printf("Cancelling transfer ep=%d", i));
  2766 			        "Cancelling transfer ep=%d", i );
       
  2767 			iEndpoint[i]->CancelTransfer(iClient,iClientAsynchNotify[i]->iClientBuffer);			// Copies data userside
  2570 			iEndpoint[i]->CancelTransfer(iClient,iClientAsynchNotify[i]->iClientBuffer);			// Copies data userside
  2768 			iEndpoint[i]->AbortTransfer();					// kills any ldd->pil outstanding transfers
  2571 			iEndpoint[i]->AbortTransfer();					// kills any ldd->pil outstanding transfers
  2769 			iEndpoint[i]->iDmaBuffers->Flush();
  2572 			iEndpoint[i]->iDmaBuffers->Flush();
  2770 			if (iRequestStatus[i] != NULL)
  2573 			if (iRequestStatus[i] != NULL)
  2771 				CompleteBufferRequest(iClient, i, aErrorCode);
  2574 				CompleteBufferRequest(iClient, i, aErrorCode);
  2806 	}
  2609 	}
  2807 
  2610 
  2808 
  2611 
  2809 TInt DLddUsbcChannel::DoEmergencyComplete()
  2612 TInt DLddUsbcChannel::DoEmergencyComplete()
  2810 	{
  2613 	{
  2811 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOEMERGENCYCOMPLETE,
  2614 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::DoEmergencyComplete"));
  2812 	        "TUsbcEndpoint::DoEmergencyComplete" );
       
  2813 	// cancel any pending DFCs
  2615 	// cancel any pending DFCs
  2814 	// complete all client requests
  2616 	// complete all client requests
  2815     for (TInt i = 0; i < KUsbcMaxRequests; i++)
  2617     for (TInt i = 0; i < KUsbcMaxRequests; i++)
  2816         {
  2618         {
  2817         if (iRequestStatus[i])
  2619         if (iRequestStatus[i])
  2818             {
  2620             {
  2819             OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCCHANNEL_DOEMERGENCYCOMPLETE_DUP1,
  2621             __KTRACE_OPT(KUSB, Kern::Printf("Complete request 0x%x", iRequestStatus[i]));
  2820                     "Complete request 0x%x", iRequestStatus[i] );
       
  2821 
  2622 
  2822             if (i == RDevUsbcClient::ERequestAlternateDeviceStatusNotify)
  2623             if (i == RDevUsbcClient::ERequestAlternateDeviceStatusNotify)
  2823                 {
  2624                 {
  2824 
  2625 
  2825                 iDeviceStatusNeeded = EFalse;
  2626                 iDeviceStatusNeeded = EFalse;
  2921 	  iRequestCallbackInfo(NULL),
  2722 	  iRequestCallbackInfo(NULL),
  2922 	  iBytesTransferred(0),
  2723 	  iBytesTransferred(0),
  2923 	  iBandwidthPriority(aBandwidthPriority)
  2724 	  iBandwidthPriority(aBandwidthPriority)
  2924 	{
  2725 	{
  2925  	ResetTransferInfo();
  2726  	ResetTransferInfo();
  2926 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCENDPOINT_TUSBCENDPOINT_CONS, 
  2727 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::TUsbcEndpoint 2"));
  2927 	        "TUsbcEndpoint::TUsbcEndpoint 2" );
       
  2928 	}
  2728 	}
  2929 
  2729 
  2930 
  2730 
  2931 TInt TUsbcEndpoint::Construct()
  2731 TInt TUsbcEndpoint::Construct()
  2932 	{
  2732 	{
  2954 	}
  2754 	}
  2955 
  2755 
  2956 
  2756 
  2957 TUsbcEndpoint::~TUsbcEndpoint()
  2757 TUsbcEndpoint::~TUsbcEndpoint()
  2958 	{
  2758 	{
  2959 	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCENDPOINT_TUSBCENDPOINT_DES, 
  2759 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::~TUsbcEndpoint(%d)", iEndpointNumber));
  2960 	        "TUsbcEndpoint::~TUsbcEndpoint(%d)", iEndpointNumber );
       
  2961 	AbortTransfer();
  2760 	AbortTransfer();
  2962 	delete iRequestCallbackInfo;
  2761 	delete iRequestCallbackInfo;
  2963 	delete iDmaBuffers;
  2762 	delete iDmaBuffers;
  2964 	}
  2763 	}
  2965 
  2764 
  2966 
  2765 
  2967 void TUsbcEndpoint::RequestCallback(TAny* aTUsbcEndpoint)
  2766 void TUsbcEndpoint::RequestCallback(TAny* aTUsbcEndpoint)
  2968 	{
  2767 	{
  2969 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_REQUESTCALLBACK, 
  2768 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::RequestCallback"));
  2970 	        "TUsbcEndpoint::RequestCallback" );
       
  2971 	((TUsbcEndpoint*) aTUsbcEndpoint)->EndpointComplete();
  2769 	((TUsbcEndpoint*) aTUsbcEndpoint)->EndpointComplete();
  2972 	}
  2770 	}
  2973 
  2771 
  2974 
  2772 
  2975 void TUsbcEndpoint::SetMaxPacketSize(TInt aSize)
  2773 void TUsbcEndpoint::SetMaxPacketSize(TInt aSize)
  2979 	}
  2777 	}
  2980 
  2778 
  2981 
  2779 
  2982 TInt TUsbcEndpoint::EndpointComplete()
  2780 TInt TUsbcEndpoint::EndpointComplete()
  2983 	{
  2781 	{
  2984     OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_ENDPOINTCOMPLETE, 
  2782 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::EndpointComplete ep=%d %d",
  2985             "TUsbcEndpoint::EndpointComplete ep=%d %d", iEndpointNumber, iRequestCallbackInfo->iEndpointNum );
  2783 									iEndpointNumber, iRequestCallbackInfo->iEndpointNum));
  2986 
  2784 
  2987 	if (iLdd->ChannelClosing())
  2785 	if (iLdd->ChannelClosing())
  2988 		{
  2786 		{
  2989 	    OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_ENDPOINTCOMPLETE_DUP1,
  2787 		__KTRACE_OPT(KUSB, Kern::Printf("We're going home -> completions no longer accepted"));
  2990 	            "We're going home -> completions no longer accepted" );
       
  2991 		return KErrNone;
  2788 		return KErrNone;
  2992 		}
  2789 		}
  2993 
  2790 
  2994 	TTransferDirection transferDir = iRequestCallbackInfo->iTransferDir;
  2791 	TTransferDirection transferDir = iRequestCallbackInfo->iTransferDir;
  2995 	TInt error = iRequestCallbackInfo->iError;
  2792 	TInt error = iRequestCallbackInfo->iError;
  2997 	switch (transferDir)
  2794 	switch (transferDir)
  2998 		{
  2795 		{
  2999 
  2796 
  3000 	case EControllerWrite:
  2797 	case EControllerWrite:
  3001 		{
  2798 		{
  3002         OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_ENDPOINTCOMPLETE_DUP2,
  2799 		__KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::EndpointComplete Write 2"));
  3003                 "TUsbcEndpoint::EndpointComplete Write 2" );
       
  3004 		if (!iDmaBuffers->TxIsActive())
  2800 		if (!iDmaBuffers->TxIsActive())
  3005 			{
  2801 			{
  3006 	        OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_ENDPOINTCOMPLETE_DUP3,
  2802 			__KTRACE_OPT(KUSB, Kern::Printf("  TX completion but !iDmaBuffers->TxIsActive()"));
  3007 	                "  TX completion but !iDmaBuffers->TxIsActive()" );
       
  3008 			break;
  2803 			break;
  3009 			}
  2804 			}
  3010 
  2805 
  3011 		iDmaBuffers->TxSetInActive();
  2806 		iDmaBuffers->TxSetInActive();
  3012 		TBool completeNow = EFalse;
  2807 		TBool completeNow = EFalse;
  3058 		// We queue the dfc if we can complete the read, i.e. if we are reading a packet,
  2853 		// We queue the dfc if we can complete the read, i.e. if we are reading a packet,
  3059 		// or if we have enough data to satisfy a read data request.
  2854 		// or if we have enough data to satisfy a read data request.
  3060 		if (iClientReadPending)
  2855 		if (iClientReadPending)
  3061 			{
  2856 			{
  3062 			//Complete outstanding read
  2857 			//Complete outstanding read
  3063             OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_ENDPOINTCOMPLETE_DUP4,
  2858 			__KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::EndpointComplete Read 3 (bytes "
  3064                     "TUsbcEndpoint::EndpointComplete Read 3 (bytes available=%d)", 
  2859 											"available=%d)", iDmaBuffers->RxBytesAvailable()));
  3065                     iDmaBuffers->RxBytesAvailable());
       
  3066 
       
  3067 			TInt bytesReqd = iTransferInfo.iTransferSize - iBytesTransferred;
  2860 			TInt bytesReqd = iTransferInfo.iTransferSize - iBytesTransferred;
  3068 			TBool completeNow = EFalse;
  2861 			TBool completeNow = EFalse;
  3069 
  2862 
  3070 			if (iTransferInfo.iTransferType == ETransferTypeReadPacket ||
  2863 			if (iTransferInfo.iTransferType == ETransferTypeReadPacket ||
  3071 				iTransferInfo.iTransferType == ETransferTypeReadOneOrMore)
  2864 				iTransferInfo.iTransferType == ETransferTypeReadOneOrMore)
  3162 	TInt err;
  2955 	TInt err;
  3163 	const TInt length = iTransferInfo.iTransferSize;
  2956 	const TInt length = iTransferInfo.iTransferSize;
  3164 	const TBool KReadData = EFalse;
  2957 	const TBool KReadData = EFalse;
  3165 	const TBool KReadUntilShort = ETrue;
  2958 	const TBool KReadUntilShort = ETrue;
  3166 
  2959 
  3167     OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_COPYTOCLIENT, 
  2960 	__KTRACE_OPT(KUSB, Kern::Printf("CopyToClient: length = %d", length));
  3168             "CopyToClient: length = %d", length );
       
  3169 
  2961 
  3170 	if (iTransferInfo.iTransferType == ETransferTypeReadPacket)
  2962 	if (iTransferInfo.iTransferType == ETransferTypeReadPacket)
  3171 		{
  2963 		{
  3172 		err = iDmaBuffers->RxCopyPacketToClient(aClient, aTcb, length);
  2964 		err = iDmaBuffers->RxCopyPacketToClient(aClient, aTcb, length);
  3173 		aCompleteNow = ETrue;
  2965 		aCompleteNow = ETrue;
  3199 	}
  2991 	}
  3200 
  2992 
  3201 
  2993 
  3202 TInt TUsbcEndpoint::TryToStartRead(TBool aReEntrant)
  2994 TInt TUsbcEndpoint::TryToStartRead(TBool aReEntrant)
  3203 	{
  2995 	{
  3204 	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_TRYTOSTARTREAD,
  2996 	__KTRACE_OPT(KUSB, Kern::Printf("TryToStartRead 1 ep=%d", iEndpointNumber));
  3205 	        "TryToStartRead 1 ep=%d", iEndpointNumber );
       
  3206 	TInt r = KErrNone;
  2997 	TInt r = KErrNone;
  3207 	if (iEndpointInfo.iDir != KUsbEpDirOut &&
  2998 	if (iEndpointInfo.iDir != KUsbEpDirOut &&
  3208 		iEndpointInfo.iDir != KUsbEpDirBidirect)
  2999 		iEndpointInfo.iDir != KUsbEpDirBidirect)
  3209 		{
  3000 		{
  3210 		// Verify ep direction
  3001 		// Verify ep direction
  3211 		  OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_TRYTOSTARTREAD_DUP1,
  3002 		__KTRACE_OPT(KUSB, Kern::Printf("TryToStartRead wrong direction ep=%d", iEndpointNumber));
  3212 		          "TryToStartRead wrong direction ep=%d", iEndpointNumber );
       
  3213 		return KErrUsbEpBadDirection;
  3003 		return KErrUsbEpBadDirection;
  3214 		}
  3004 		}
  3215 
  3005 
  3216 	if (iEndpointNumber == 0)
  3006 	if (iEndpointNumber == 0)
  3217 		{
  3007 		{
  3218 		// Can't issue an Ep0 read if reader or writer is active
  3008 		// Can't issue an Ep0 read if reader or writer is active
  3219 		if (iDmaBuffers->TxIsActive())
  3009 		if (iDmaBuffers->TxIsActive())
  3220 			{
  3010 			{
  3221             OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_TRYTOSTARTREAD_DUP2,
  3011 			__KTRACE_OPT(KUSB, Kern::Printf("TryToStartRead ep0 Tx already active FATAL"));
  3222                     "TryToStartRead ep0 Tx already active FATAL" );
       
  3223 
       
  3224 			return KErrUsbEpNotReady;
  3012 			return KErrUsbEpNotReady;
  3225 			}
  3013 			}
  3226 		if (iDmaBuffers->RxIsActive())
  3014 		if (iDmaBuffers->RxIsActive())
  3227 			{
  3015 			{
  3228             OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_TRYTOSTARTREAD_DUP3,
  3016 			__KTRACE_OPT(KUSB, Kern::Printf("TryToStartRead ep0 Rx already active non-FATAL"));
  3229                     "TryToStartRead ep0 Rx already active non-FATAL" );
       
  3230 			}
  3017 			}
  3231 		}
  3018 		}
  3232 
  3019 
  3233 	if (!(iDmaBuffers->RxIsActive()))
  3020 	if (!(iDmaBuffers->RxIsActive()))
  3234 		{
  3021 		{
  3240 		r = iDmaBuffers->RxGetNextXfer(bufferAddr, indexArray, sizeArray, length, physAddr);
  3027 		r = iDmaBuffers->RxGetNextXfer(bufferAddr, indexArray, sizeArray, length, physAddr);
  3241 		if (r == KErrNone)
  3028 		if (r == KErrNone)
  3242 			{
  3029 			{
  3243 			iDmaBuffers->RxSetActive();
  3030 			iDmaBuffers->RxSetActive();
  3244 			iRequestCallbackInfo->SetRxBufferInfo(bufferAddr, physAddr, indexArray, sizeArray, length);
  3031 			iRequestCallbackInfo->SetRxBufferInfo(bufferAddr, physAddr, indexArray, sizeArray, length);
  3245             OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_TRYTOSTARTREAD_DUP4,
  3032 
  3246                     "TryToStartRead 2 bufferAddr=0x%08x", bufferAddr );
  3033 			__KTRACE_OPT(KUSB, Kern::Printf("TryToStartRead 2 bufferAddr=0x%08x", bufferAddr));
  3247 
  3034 
  3248 			r = iController->SetupReadBuffer(*iRequestCallbackInfo);
  3035 			r = iController->SetupReadBuffer(*iRequestCallbackInfo);
  3249 			if (r != KErrNone)
  3036 			if (r != KErrNone)
  3250 				{
  3037 				{
  3251 				iDmaBuffers->RxSetInActive();
  3038 				iDmaBuffers->RxSetInActive();
  3252 	            OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_TRYTOSTARTREAD_DUP5,
  3039 				__KTRACE_OPT(KPANIC, Kern::Printf("  Error: TryToStartRead controller rejects read"));
  3253 	                    "  Error: TryToStartRead controller rejects read" );
       
  3254 				}
  3040 				}
  3255 			}
  3041 			}
  3256 		else
  3042 		else
  3257 			{
  3043 			{
  3258 			if (iClientReadPending)
  3044 			if (iClientReadPending)
  3274 	}
  3060 	}
  3275 
  3061 
  3276 
  3062 
  3277 TInt TUsbcEndpoint::TryToStartWrite(TEndpointTransferInfo* pTfr)
  3063 TInt TUsbcEndpoint::TryToStartWrite(TEndpointTransferInfo* pTfr)
  3278 	{
  3064 	{
  3279 	OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_TRYTOSTARTWRITE,
  3065 	__KTRACE_OPT(KUSB, Kern::Printf("TryToStartWrite 1 ep=%d", iEndpointNumber));
  3280 	        "TryToStartWrite 1 ep=%d", iEndpointNumber );
       
  3281 	if (iEndpointInfo.iDir != KUsbEpDirIn &&
  3066 	if (iEndpointInfo.iDir != KUsbEpDirIn &&
  3282 		iEndpointInfo.iDir != KUsbEpDirBidirect)
  3067 		iEndpointInfo.iDir != KUsbEpDirBidirect)
  3283 		{
  3068 		{
  3284 		// Verify ep direction
  3069 		// Verify ep direction
  3285 		return KErrUsbEpBadDirection;
  3070 		return KErrUsbEpBadDirection;
  3304 	}
  3089 	}
  3305 
  3090 
  3306 
  3091 
  3307 TInt TUsbcEndpoint::ContinueWrite()
  3092 TInt TUsbcEndpoint::ContinueWrite()
  3308 	{
  3093 	{
  3309 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_CONTINUEWRITE, "ContinueWrite 2" );
  3094 	__KTRACE_OPT(KUSB, Kern::Printf("ContinueWrite 2"));
  3310 	TUint8* bufferAddr;
  3095 	TUint8* bufferAddr;
  3311 	TPhysAddr physAddr;
  3096 	TPhysAddr physAddr;
  3312 	TInt bufferLength;
  3097 	TInt bufferLength;
  3313 	TInt r = iDmaBuffers->TxGetNextXfer(bufferAddr, bufferLength, physAddr);
  3098 	TInt r = iDmaBuffers->TxGetNextXfer(bufferAddr, bufferLength, physAddr);
  3314 	if (r != KErrNone)											// probably already active
  3099 	if (r != KErrNone)											// probably already active
  3315 		return r;
  3100 		return r;
  3316     OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_CONTINUEWRITE_DUP1,
  3101 	__KTRACE_OPT(KUSB, Kern::Printf("ContinueWrite 3"));
  3317             "ContinueWrite 3" );
       
  3318 
       
  3319 	iDmaBuffers->TxSetActive();
  3102 	iDmaBuffers->TxSetActive();
  3320 	TBool zlpReqd = EFalse;
  3103 	TBool zlpReqd = EFalse;
  3321 	TUint32 transferSize = iTransferInfo.iTransferSize;
  3104 	TUint32 transferSize = iTransferInfo.iTransferSize;
  3322 	TInt length = Min(transferSize - iBytesTransferred, (TUint32) bufferLength);
  3105 	TInt length = Min(transferSize - iBytesTransferred, (TUint32) bufferLength);
  3323 	if (iBytesTransferred+length>=transferSize)
  3106 	if (iBytesTransferred+length>=transferSize)
  3332 	iRequestCallbackInfo->SetTxBufferInfo(bufferAddr, physAddr, length);
  3115 	iRequestCallbackInfo->SetTxBufferInfo(bufferAddr, physAddr, length);
  3333 	iRequestCallbackInfo->iZlpReqd = zlpReqd;
  3116 	iRequestCallbackInfo->iZlpReqd = zlpReqd;
  3334 #if 0
  3117 #if 0
  3335 	for (TInt i = 0; i < iRequestCallbackInfo->iLength; i++)
  3118 	for (TInt i = 0; i < iRequestCallbackInfo->iLength; i++)
  3336 		{
  3119 		{
  3337 	    OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_CONTINUEWRITE_DUP2,
  3120 		__KTRACE_OPT(KUSB, Kern::Printf("Buffer[%d] = 0x%02x", i, iRequestCallbackInfo->iBufferStart[i]));
  3338 	            "Buffer[%d] = 0x%02x", i, iRequestCallbackInfo->iBufferStart[i] );
       
  3339 
       
  3340 		}
  3121 		}
  3341 #endif
  3122 #endif
  3342 	r = iController->SetupWriteBuffer(*iRequestCallbackInfo);
  3123 	r = iController->SetupWriteBuffer(*iRequestCallbackInfo);
  3343 	return r;
  3124 	return r;
  3344 	}
  3125 	}
  3345 
  3126 
  3346 
  3127 
  3347 void TUsbcEndpoint::CancelTransfer(DThread* aThread, TClientBuffer *aTcb)
  3128 void TUsbcEndpoint::CancelTransfer(DThread* aThread, TClientBuffer *aTcb)
  3348 	{
  3129 	{
  3349 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_CANCELTRANSFER, "CancelTransfer" );
  3130 	__KTRACE_OPT(KUSB, Kern::Printf("CancelTransfer"));
  3350 	if (iDmaBuffers != NULL)
  3131 	if (iDmaBuffers != NULL)
  3351 		{
  3132 		{
  3352 		if (iClientWritePending)
  3133 		if (iClientWritePending)
  3353 			{
  3134 			{
  3354             OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_CANCELTRANSFER_DUP1,
  3135 			__KTRACE_OPT(KUSB, Kern::Printf("  (iClientWritePending)"));
  3355                     "  (iClientWritePending)" );
       
  3356 			iClientWritePending = EFalse;
  3136 			iClientWritePending = EFalse;
  3357 			iController->CancelWriteBuffer(iLdd, iRealEpNumber);
  3137 			iController->CancelWriteBuffer(iLdd, iRealEpNumber);
  3358 			iDmaBuffers->TxSetInActive();
  3138 			iDmaBuffers->TxSetInActive();
  3359 			}
  3139 			}
  3360 		if (iClientReadPending)
  3140 		if (iClientReadPending)
  3361 			{
  3141 			{
  3362             OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_CANCELTRANSFER_DUP2,
  3142 			__KTRACE_OPT(KUSB, Kern::Printf("  (iClientReadPending)"));
  3363                     "  (iClientReadPending)" );
       
  3364 			iClientReadPending = EFalse;
  3143 			iClientReadPending = EFalse;
  3365 			CopyToClient(aThread,aTcb);
  3144 			CopyToClient(aThread,aTcb);
  3366 			}
  3145 			}
  3367 		}
  3146 		}
  3368 	}
  3147 	}
  3369 
  3148 
  3370 
  3149 
  3371 void TUsbcEndpoint::AbortTransfer()
  3150 void TUsbcEndpoint::AbortTransfer()
  3372 	{
  3151 	{
  3373 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_ABORTTRANSFER, "Abort Transfer" );
  3152 	__KTRACE_OPT(KUSB, Kern::Printf("Abort Transfer"));
  3374 	if (iDmaBuffers != NULL)
  3153 	if (iDmaBuffers != NULL)
  3375 		{
  3154 		{
  3376 		if (iDmaBuffers->TxIsActive())
  3155 		if (iDmaBuffers->TxIsActive())
  3377 			{
  3156 			{
  3378             OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_ABORTTRANSFER_DUP1,
  3157 			__KTRACE_OPT(KUSB, Kern::Printf("  (iClientWritePending)"));
  3379                     "  (iClientWritePending)" );
       
  3380 			iController->CancelWriteBuffer(iLdd, iRealEpNumber);
  3158 			iController->CancelWriteBuffer(iLdd, iRealEpNumber);
  3381 			iDmaBuffers->TxSetInActive();
  3159 			iDmaBuffers->TxSetInActive();
  3382 			}
  3160 			}
  3383 		if (iDmaBuffers->RxIsActive())
  3161 		if (iDmaBuffers->RxIsActive())
  3384 			{
  3162 			{
  3385             OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCENDPOINT_ABORTTRANSFER_DUP2,
  3163 			__KTRACE_OPT(KUSB, Kern::Printf("  (iClientReadPending)"));
  3386                     "  (iClientReadPending)" );
       
  3387 			iController->CancelReadBuffer(iLdd, iRealEpNumber);
  3164 			iController->CancelReadBuffer(iLdd, iRealEpNumber);
  3388 			iDmaBuffers->RxSetInActive();
  3165 			iDmaBuffers->RxSetInActive();
  3389 			}
  3166 			}
  3390 		iRequestCallbackInfo->iDfc.Cancel();
  3167 		iRequestCallbackInfo->iDfc.Cancel();
  3391 		}
  3168 		}
  3405 	}
  3182 	}
  3406 
  3183 
  3407 
  3184 
  3408 TUsbcAlternateSettingList::~TUsbcAlternateSettingList()
  3185 TUsbcAlternateSettingList::~TUsbcAlternateSettingList()
  3409 	{
  3186 	{
  3410 	OstTraceDef0( OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCALTERNATESETTINGLIST_TUSBCALTERNATESETTINGLIST_DES,
  3187 	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcAlternateSettingList::~TUsbcAlternateSettingList()"));
  3411 	        "TUsbcAlternateSettingList::~TUsbcAlternateSettingList()" );
       
  3412 	for (TInt i = 0; i <= KMaxEndpointsPerClient; i++)
  3188 	for (TInt i = 0; i <= KMaxEndpointsPerClient; i++)
  3413 		{
  3189 		{
  3414 		delete iEndpoint[i];
  3190 		delete iEndpoint[i];
  3415 		}
  3191 		}
  3416 	}
  3192 	}