os/boardsupport/haitest/bspsvs/suite/bsp/mmc/ldd/src/d_mmcsdif.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). 
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description:
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
#include <kernel.h>
sl@0
    19
#include <mmc.h>
sl@0
    20
#include <locmedia.h>
sl@0
    21
sl@0
    22
#include "mmcldd.h"
sl@0
    23
#include "d_mmcsdif.h"
sl@0
    24
sl@0
    25
sl@0
    26
sl@0
    27
const TInt KMajorVersionNumber=1;
sl@0
    28
const TInt KMinorVersionNumber=0;
sl@0
    29
const TInt KBuildVersionNumber=0;
sl@0
    30
sl@0
    31
// global Dfc Que
sl@0
    32
TDynamicDfcQue* gDfcQ;
sl@0
    33
sl@0
    34
sl@0
    35
sl@0
    36
DECLARE_STANDARD_LDD()
sl@0
    37
	{
sl@0
    38
	return new DLddFactoryMmcCntrlInterface;
sl@0
    39
	}
sl@0
    40
sl@0
    41
/**
sl@0
    42
 * DLddFactoryMmcCntrlInterface constructor
sl@0
    43
 *
sl@0
    44
 * @return N/A
sl@0
    45
 *
sl@0
    46
 * @leave N/A
sl@0
    47
 */
sl@0
    48
DLddFactoryMmcCntrlInterface::DLddFactoryMmcCntrlInterface()
sl@0
    49
	{
sl@0
    50
    iParseMask=KDeviceAllowUnit;  // Pass stack number as unit
sl@0
    51
	iUnitsMask=0xffffffff;
sl@0
    52
	iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);
sl@0
    53
	}
sl@0
    54
sl@0
    55
/**
sl@0
    56
 * Create logical channel
sl@0
    57
 *
sl@0
    58
 * @param DLogicalChannelBase*& aChannel - logical channel
sl@0
    59
 *
sl@0
    60
 * @return TInt the error code
sl@0
    61
 *
sl@0
    62
 * @leave N/A
sl@0
    63
 */
sl@0
    64
TInt DLddFactoryMmcCntrlInterface::Create(DLogicalChannelBase*& aChannel)
sl@0
    65
	{
sl@0
    66
	aChannel = new DLddMmcCntrlInterface;
sl@0
    67
	return aChannel ? KErrNone : KErrNoMemory;
sl@0
    68
	}
sl@0
    69
sl@0
    70
const TInt KDMmcThreadPriority = 27;
sl@0
    71
_LIT(KDMmcThread,"DMMCSDThread");
sl@0
    72
sl@0
    73
sl@0
    74
/**
sl@0
    75
 * Install driver
sl@0
    76
 *
sl@0
    77
 * @return TInt the error code
sl@0
    78
 *
sl@0
    79
 * @leave N/A
sl@0
    80
 */
sl@0
    81
TInt DLddFactoryMmcCntrlInterface::Install()
sl@0
    82
	{
sl@0
    83
	// Allocate a kernel thread to run the DFC
sl@0
    84
	TInt r = Kern::DynamicDfcQCreate(gDfcQ, KDMmcThreadPriority, KDMmcThread);
sl@0
    85
sl@0
    86
	if (r != KErrNone)
sl@0
    87
		return r;
sl@0
    88
	__KTRACE_OPT(KHARDWARE,MMCSDLOG("installing driver name from factory"));
sl@0
    89
	return SetName(&KLddName);
sl@0
    90
    }
sl@0
    91
sl@0
    92
/**
sl@0
    93
 * Get the Pc Card Contoller Interface ldd's version info
sl@0
    94
 *
sl@0
    95
 * @param TDes8 &aDes - Buffer to contain version info
sl@0
    96
 *
sl@0
    97
 * @return N/A
sl@0
    98
 *
sl@0
    99
 * @leave N/A
sl@0
   100
 */
sl@0
   101
void DLddFactoryMmcCntrlInterface::GetCaps(TDes8 &aDes) const
sl@0
   102
	{
sl@0
   103
    TCapsMmcIfV01 b;
sl@0
   104
	b.version=TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);
sl@0
   105
	aDes.FillZ(aDes.MaxLength());
sl@0
   106
	aDes.Copy((TUint8 *)&b,Min(aDes.MaxLength(),sizeof(b)));
sl@0
   107
	}
sl@0
   108
sl@0
   109
/**
sl@0
   110
 * Destructor
sl@0
   111
 *
sl@0
   112
 * @return N/A
sl@0
   113
 *
sl@0
   114
 * @leave N/A
sl@0
   115
 */
sl@0
   116
DLddFactoryMmcCntrlInterface::~DLddFactoryMmcCntrlInterface()
sl@0
   117
	{
sl@0
   118
	if (gDfcQ)
sl@0
   119
		gDfcQ->Destroy();
sl@0
   120
	}
sl@0
   121
sl@0
   122
/**
sl@0
   123
 * DLddMmcCntrlInterface constructor
sl@0
   124
 *
sl@0
   125
 * @return N/A
sl@0
   126
 *
sl@0
   127
 * @leave N/A
sl@0
   128
 */
sl@0
   129
DLddMmcCntrlInterface::DLddMmcCntrlInterface()
sl@0
   130
	{
sl@0
   131
	iClient = &Kern::CurrentThread();
sl@0
   132
	((DObject*)iClient)->Open();	// can't fail since thread is running
sl@0
   133
    }
sl@0
   134
sl@0
   135
/**
sl@0
   136
 * Destructor
sl@0
   137
 *
sl@0
   138
 * @return N/A
sl@0
   139
 *
sl@0
   140
 * @leave	N/A
sl@0
   141
 */
sl@0
   142
DLddMmcCntrlInterface::~DLddMmcCntrlInterface()
sl@0
   143
	{
sl@0
   144
	Kern::SafeClose((DObject*&)iClient,NULL);
sl@0
   145
	iAsyncList.ResetAndDestroy();
sl@0
   146
    }
sl@0
   147
sl@0
   148
/**
sl@0
   149
 * Create driver ojects
sl@0
   150
 *
sl@0
   151
 * @param TInt aUnit - Socket ID
sl@0
   152
 * @param const TDesC8* aInfo - Buffer for logging
sl@0
   153
 * @param const TVersion& aVer - Current version
sl@0
   154
 *
sl@0
   155
 * @return TInt the error code
sl@0
   156
 *
sl@0
   157
 * @leave N/A
sl@0
   158
 */
sl@0
   159
TInt DLddMmcCntrlInterface::DoCreate(TInt aUnit, const TDesC8* aInfo, const TVersion& aVer)
sl@0
   160
	{
sl@0
   161
	if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber),aVer))
sl@0
   162
		return(KErrNotSupported);
sl@0
   163
sl@0
   164
	MMCSDLOG2("DLddMmcCntrlInterface::DoCreate called aInfo(%S)", aInfo);
sl@0
   165
sl@0
   166
	// create the socket - there is only a DMMCSocket
sl@0
   167
	iSocket = static_cast<DMMCSocket*>(DPBusSocket::SocketFromId(aUnit));
sl@0
   168
	if(!iSocket)
sl@0
   169
		return(KErrNoMemory);
sl@0
   170
sl@0
   171
	//Obtain the appropriate card from the stack
sl@0
   172
	iStack = static_cast<DMMCStack*>(iSocket->Stack(KStackNo));
sl@0
   173
	if(iStack == NULL)
sl@0
   174
		return(KErrNoMemory);
sl@0
   175
sl@0
   176
	//Obtain the appropriate card power supply
sl@0
   177
	iPsu=static_cast<DMMCPsu*>(iSocket->iVcc);
sl@0
   178
	if (iPsu==NULL)
sl@0
   179
		return(KErrNoMemory);
sl@0
   180
sl@0
   181
	//Obtain the appropriate card  Media change
sl@0
   182
	iMediaChange=static_cast<DMMCMediaChange*>(iSocket->iMediaChange);
sl@0
   183
	if (iMediaChange==NULL)
sl@0
   184
		return(KErrNoMemory);
sl@0
   185
sl@0
   186
	SetDfcQ(gDfcQ);
sl@0
   187
	iMsgQ.Receive();
sl@0
   188
sl@0
   189
	iUnit = aUnit;  // save the unit - needed for regitering callbacks for subsequent bus events
sl@0
   190
sl@0
   191
    return(KErrNone);
sl@0
   192
	}
sl@0
   193
sl@0
   194
/**
sl@0
   195
 * Request cancelled callback
sl@0
   196
 *
sl@0
   197
 * @param TInt sReqNo - Request Number
sl@0
   198
 *
sl@0
   199
 * @return N/A
sl@0
   200
 *
sl@0
   201
 * @leave N/A
sl@0
   202
 */
sl@0
   203
void DLddMmcCntrlInterface::DoCancel(TInt /*aReqNo*/)
sl@0
   204
	{
sl@0
   205
	}
sl@0
   206
sl@0
   207
/**
sl@0
   208
 * Handle kernel side message
sl@0
   209
 *
sl@0
   210
 * @param TMessageBase* aMsg - The kernel side message
sl@0
   211
 *
sl@0
   212
 * @return N/A
sl@0
   213
 *
sl@0
   214
 * @leave N/A
sl@0
   215
 */
sl@0
   216
void DLddMmcCntrlInterface::HandleMsg(TMessageBase* aMsg)
sl@0
   217
    {
sl@0
   218
    TThreadMessage& m=*(TThreadMessage*)aMsg;
sl@0
   219
    TInt id=m.iValue;
sl@0
   220
sl@0
   221
	if (id==(TInt)ECloseMsg)
sl@0
   222
		{
sl@0
   223
		m.Complete(KErrNone, EFalse);
sl@0
   224
		return;
sl@0
   225
		}
sl@0
   226
    else if (id==KMaxTInt)
sl@0
   227
		{
sl@0
   228
		// DoCancel
sl@0
   229
		m.Complete(KErrNone,ETrue);
sl@0
   230
		return;
sl@0
   231
		}
sl@0
   232
sl@0
   233
    if (id<0)
sl@0
   234
		{
sl@0
   235
		// DoRequest
sl@0
   236
		TRequestStatus* pS=(TRequestStatus*)m.Ptr0();
sl@0
   237
		TInt r=DoRequest(~id, pS, m.Ptr1(), m.Ptr2());
sl@0
   238
		if (r!=KErrNone)
sl@0
   239
	    	Kern::RequestComplete(iClient, pS, r);
sl@0
   240
		m.Complete(KErrNone,ETrue);
sl@0
   241
		}
sl@0
   242
    else
sl@0
   243
		{
sl@0
   244
		// DoControl
sl@0
   245
		TInt r=DoControl(id,m.Ptr0(),m.Ptr1());
sl@0
   246
		if(r != KErrCompletion)
sl@0
   247
			{
sl@0
   248
			m.Complete(r,ETrue);
sl@0
   249
			}
sl@0
   250
		}
sl@0
   251
	}
sl@0
   252
sl@0
   253
/**
sl@0
   254
 * Do a kernel side request
sl@0
   255
 *
sl@0
   256
 * @param TInt aFunction - Request Function ID
sl@0
   257
 * @param TRequestStatus* aStatus - Request Status
sl@0
   258
 * @param TAny* a1 - Given parameter
sl@0
   259
 * @param TAny* a2 - Given parameter
sl@0
   260
 *
sl@0
   261
 * @return TInt the error code
sl@0
   262
 *
sl@0
   263
 * @leave N/A
sl@0
   264
 */
sl@0
   265
TInt DLddMmcCntrlInterface::DoRequest(TInt aFunction, TRequestStatus* aStatus, TAny* a1, TAny *a2)
sl@0
   266
	{
sl@0
   267
sl@0
   268
	TTCFunctionId fid = TTCFunctionId(aFunction);
sl@0
   269
	switch(fid.TestType())
sl@0
   270
		{
sl@0
   271
		case EMmcTestSocket:
sl@0
   272
			return SocketDoRequest(aStatus, a1, a2, aFunction);
sl@0
   273
sl@0
   274
		case EMmcTestStack:
sl@0
   275
		case EMmcTestPsu:
sl@0
   276
		case EMmcTestMediaChange:
sl@0
   277
	  	case EMmcGeneralTest:
sl@0
   278
		default:
sl@0
   279
			break;
sl@0
   280
		};
sl@0
   281
sl@0
   282
    switch(fid.FunctionId())
sl@0
   283
		{
sl@0
   284
        case RMMCSDTestControllerInterface::EReadSector:
sl@0
   285
            {
sl@0
   286
            // read sector a1 is block number, a2 is client descriptor
sl@0
   287
            // data will be written back to upon completion
sl@0
   288
			MMCSDLOG3("RMMCSDTestControllerInterface::EReadSector a1(%d) a2(%x)", (TUint32)a1, a2);
sl@0
   289
			if(!iCard)
sl@0
   290
				{
sl@0
   291
				MMCSDLOG("RMMCSDTestControllerInterface::EReadSector NULL card\n");
sl@0
   292
				return KErrNotReady;
sl@0
   293
				}
sl@0
   294
sl@0
   295
			DMmcSessionAsyncRequest* request = CreateAsyncSessionRequest(EMmcSesReadBlk, aStatus);
sl@0
   296
sl@0
   297
			TUint32 srcAddr=((TUint32)a1)<<KSectorSizeShift;
sl@0
   298
			TUint readBlLen = 1 << iCard->MaxReadBlLen();
sl@0
   299
			TUint readBlMask=(readBlLen-1);
sl@0
   300
			request->iBlkOffet=srcAddr-(srcAddr&(~readBlMask));
sl@0
   301
			request->iClientDesPtr = a2;
sl@0
   302
			srcAddr &= (~readBlMask);
sl@0
   303
sl@0
   304
			MMCSDLOG("RMMCSDTestControllerInterface::EReadSector #2");
sl@0
   305
			TMMCArgument da(srcAddr);
sl@0
   306
sl@0
   307
			request->Session().SetupCIMReadBlock(da,readBlLen,&(request->iBuf[0]));
sl@0
   308
			request->Session().Engage();
sl@0
   309
sl@0
   310
			MMCSDLOG("RMMCSDTestControllerInterface::EReadSector #3");
sl@0
   311
			break;
sl@0
   312
            }
sl@0
   313
        case RMMCSDTestControllerInterface::EWriteSector:
sl@0
   314
            {
sl@0
   315
			MMCSDLOG3("RMMCSDTestControllerInterface::EWriteSector a1(%d) a2(%x) #1", (TUint32)a1, a2);
sl@0
   316
			if(!iCard)
sl@0
   317
				{
sl@0
   318
				MMCSDLOG("RMMCSDTestControllerInterface::EWriteSector NULL card\n");
sl@0
   319
				return KErrNotReady;
sl@0
   320
				}
sl@0
   321
sl@0
   322
			TUint32 destAddr=((TUint32)a1)<<KSectorSizeShift;
sl@0
   323
			TUint writeBlLen=1 << iCard->MaxWriteBlLen();
sl@0
   324
			
sl@0
   325
			DMmcSessionAsyncRequest* request = CreateAsyncSessionRequest(EMmcSesWriteBlk, aStatus);
sl@0
   326
			
sl@0
   327
			TUint writeBlMask=(writeBlLen-1);
sl@0
   328
			request->iBlkOffet=destAddr-(destAddr&(~writeBlMask));
sl@0
   329
			TPtr8* srcDes = (TPtr8*)a2;
sl@0
   330
			TPtr8 ptr(&(request->iBuf[request->iBlkOffet]),KSectorSizeInBytes,KSectorSizeInBytes);
sl@0
   331
			TInt r = Kern::ThreadDesRead(iClient, srcDes, ptr, 0, KChunkShiftBy0);
sl@0
   332
			if(r != KErrNone)
sl@0
   333
				{
sl@0
   334
				return(r);
sl@0
   335
				}
sl@0
   336
sl@0
   337
			destAddr&=(~writeBlMask);
sl@0
   338
			request->Session().SetupCIMWriteBlock(TMMCArgument(destAddr),writeBlLen,&(request->iBuf[0]));
sl@0
   339
			request->Session().Engage();
sl@0
   340
sl@0
   341
			MMCSDLOG("RMMCSDTestControllerInterface::EWriteSector #4");
sl@0
   342
			break;
sl@0
   343
			}
sl@0
   344
        }
sl@0
   345
	return(KErrNone);
sl@0
   346
	}
sl@0
   347
sl@0
   348
/**
sl@0
   349
 * Do a kernel side control
sl@0
   350
 *
sl@0
   351
 * @param TInt aFunction - Request Function ID
sl@0
   352
 * @param TAny* a1 - Given parameter
sl@0
   353
 * @param TAny* a2 - Given parameter
sl@0
   354
 *
sl@0
   355
 * @return TInt the error code
sl@0
   356
 *
sl@0
   357
 * @leave N/A
sl@0
   358
 */
sl@0
   359
TInt DLddMmcCntrlInterface::DoControl(TInt aFunction,TAny* a1,TAny* a2)
sl@0
   360
	{
sl@0
   361
	TInt r = KErrNotSupported;
sl@0
   362
	TTCFunctionId fid = TTCFunctionId(aFunction);
sl@0
   363
	MMCSDLOG4("DLddMmcCntrlInterface::DoControl aFunction(%d) \
sl@0
   364
			fid.FunctionId()(%d) fid.TestType(%d)"
sl@0
   365
			, aFunction, fid.FunctionId(), fid.TestType());
sl@0
   366
sl@0
   367
	switch(fid.TestType())
sl@0
   368
		{
sl@0
   369
		case EMmcTestStack:
sl@0
   370
			return StackDoControl(aFunction, a1, a2);
sl@0
   371
		case EMmcTestSocket:
sl@0
   372
			return SocketDoControl(aFunction, a1, a2);
sl@0
   373
      	case EMmcTestPsu:
sl@0
   374
			return PsuDoControl(aFunction, a1, a2);
sl@0
   375
		case EMmcTestMediaChange:
sl@0
   376
			return MediaChangeDoControl(aFunction, a1, a2);
sl@0
   377
		case EMmcGeneralTest:
sl@0
   378
		default:
sl@0
   379
			break;
sl@0
   380
		};
sl@0
   381
sl@0
   382
	switch (fid.FunctionId())
sl@0
   383
		{
sl@0
   384
      	case RMMCSDTestControllerInterface::EReadCSD:
sl@0
   385
      		{
sl@0
   386
			iCSD = iCard->CSD();
sl@0
   387
				{				
sl@0
   388
				TCSDInfo csdInfo(iCSD);
sl@0
   389
	    		r = Kern::ThreadRawWrite(iClient, a1, &csdInfo, sizeof(csdInfo));
sl@0
   390
				}
sl@0
   391
      		}
sl@0
   392
	  		break;
sl@0
   393
	  		  		
sl@0
   394
      	case RMMCSDTestControllerInterface::EReadExtCSD:
sl@0
   395
      		{
sl@0
   396
			iExtendedCSD = iCard->ExtendedCSD();
sl@0
   397
			TExtendedCSDInfo extendedCSDInfo(iExtendedCSD);
sl@0
   398
    		r = Kern::ThreadRawWrite(iClient, a1, &extendedCSDInfo, sizeof(extendedCSDInfo));
sl@0
   399
      		}
sl@0
   400
	  		break;
sl@0
   401
	  		
sl@0
   402
		case RMMCSDTestControllerInterface::ECardInfo:
sl@0
   403
			{
sl@0
   404
			TMMCCardInfo cardInfo;
sl@0
   405
			cardInfo.SetCardInfo(*iCard);
sl@0
   406
			r = Kern::ThreadRawWrite(iClient, a1, &cardInfo, sizeof(cardInfo));
sl@0
   407
			}
sl@0
   408
			break;
sl@0
   409
			
sl@0
   410
		case RMMCSDTestControllerInterface::ECard:
sl@0
   411
      		{
sl@0
   412
			r = Kern::ThreadRawWrite(iClient, a1, &iCard, sizeof(iCard));
sl@0
   413
      		}
sl@0
   414
	  		break;
sl@0
   415
		  		
sl@0
   416
		case RMMCSDTestControllerInterface::ECardIsPresent:
sl@0
   417
			{
sl@0
   418
			TBool isPresent = iCard->IsPresent();
sl@0
   419
			r = Kern::ThreadRawWrite(iClient, a1, &isPresent, sizeof(isPresent));
sl@0
   420
			}
sl@0
   421
			break;
sl@0
   422
		  		
sl@0
   423
		case RMMCSDTestControllerInterface::ECardIsReady:
sl@0
   424
			{
sl@0
   425
			TBool isReady = iCard->IsReady();
sl@0
   426
			r = Kern::ThreadRawWrite(iClient, a1, &isReady, sizeof(isReady));
sl@0
   427
			}
sl@0
   428
			break;
sl@0
   429
		  		
sl@0
   430
		case RMMCSDTestControllerInterface::ECardIsLocked:
sl@0
   431
			{
sl@0
   432
			TBool isLocked = iCard->IsLocked();
sl@0
   433
			r = Kern::ThreadRawWrite(iClient, a1, &isLocked, sizeof(isLocked));
sl@0
   434
			}
sl@0
   435
			break;
sl@0
   436
		  		
sl@0
   437
       default:
sl@0
   438
        	{
sl@0
   439
        	MMCSDLOG2("DLddMmcCntrlInterface::DoControl - Invalid FunctionId()(%d)", fid.FunctionId());        	
sl@0
   440
        	}
sl@0
   441
			break;
sl@0
   442
		}
sl@0
   443
		
sl@0
   444
		
sl@0
   445
	return (r);
sl@0
   446
	}
sl@0
   447
sl@0
   448
/**
sl@0
   449
 * Check if a request status exists
sl@0
   450
 *
sl@0
   451
 * @param TRequestStatus* aStatus - Request Status
sl@0
   452
 *
sl@0
   453
 * @return TBool A request status exists
sl@0
   454
 *
sl@0
   455
 * @leave N/A
sl@0
   456
 */
sl@0
   457
TBool DLddMmcCntrlInterface::RequestStatusExists(TRequestStatus* aStatus)
sl@0
   458
	{
sl@0
   459
sl@0
   460
	// check whether this request status already exists in the async request list
sl@0
   461
	for(int i=0;i<iAsyncList.Count();i++)
sl@0
   462
		{
sl@0
   463
		MMCSDLOG3("Checking index(%d) iAsyncList[i]->Status(%x)", i, iAsyncList[i]->Status());
sl@0
   464
sl@0
   465
		if(iAsyncList[i]->Status() == aStatus)
sl@0
   466
			{
sl@0
   467
			MMCSDLOG3("WaRNING - adding duplicate TRequestStatus index[%d] aStatus(%x)", i, aStatus);
sl@0
   468
			return ETrue;
sl@0
   469
			}
sl@0
   470
		}
sl@0
   471
sl@0
   472
	return EFalse;
sl@0
   473
	}
sl@0
   474
sl@0
   475
/**
sl@0
   476
 * Create Asynchronous Session Request
sl@0
   477
 *
sl@0
   478
 * @param TMmcAsyncCmd aFunctionId - Request Function ID
sl@0
   479
 * @param TRequestStatus* aStatus - Request Status
sl@0
   480
 *
sl@0
   481
 * @return DMmcSessionAsyncRequest* Poniter to the created session request object
sl@0
   482
 *
sl@0
   483
 * @leave N/A
sl@0
   484
 */
sl@0
   485
DMmcSessionAsyncRequest* DLddMmcCntrlInterface::CreateAsyncSessionRequest(TMmcAsyncCmd aFunctionId, TRequestStatus* aStatus)
sl@0
   486
	{
sl@0
   487
sl@0
   488
	MMCSDLOG3("DLddMmcCntrlInterface::CreateAsyncRequest aStatus(%x) num requests in list (%d)",
sl@0
   489
			aStatus, iAsyncList.Count());
sl@0
   490
	
sl@0
   491
	// create an async request & append to async request list	
sl@0
   492
	DMmcSessionAsyncRequest* request = new  DMmcSessionAsyncRequest(aFunctionId, aStatus, *this, gDfcQ, *iStack, *iCard);	
sl@0
   493
	iAsyncList.Append(request);		
sl@0
   494
	MMCSDLOG4("DLddMmcCntrlInterface::CreateAsyncSessionRequest created OK Status(%x) functionID(%d) aFunctionId(%d)",
sl@0
   495
			request->Status(), request->FunctionId(), aFunctionId);
sl@0
   496
	return request;
sl@0
   497
	}
sl@0
   498
sl@0
   499
/**
sl@0
   500
 * Create Asynchronous Bus Event Request
sl@0
   501
 *
sl@0
   502
 * @param TMmcAsyncCmd aFunctionId - Request Function ID
sl@0
   503
 * @param TRequestStatus* aStatus - Request Status
sl@0
   504
 * @param TInt aUnit - Socket ID
sl@0
   505
 *
sl@0
   506
 * @return DBusEventRequest* Poniter to the created bus event request object
sl@0
   507
 *
sl@0
   508
 * @leave N/A
sl@0
   509
 */
sl@0
   510
DBusEventRequest* DLddMmcCntrlInterface::CreateAsyncBusEventRequest(TMmcAsyncCmd aFunctionId, TRequestStatus* aStatus, TInt aUnit)
sl@0
   511
	{
sl@0
   512
	MMCSDLOG3("DLddMmcCntrlInterface::CreateAsyncBusEventRequest aStatus(%x) num requests in list (%d)",
sl@0
   513
			aStatus, iAsyncList.Count());
sl@0
   514
	
sl@0
   515
	MMCSDLOG4("gDfcQ(%x), iStack(%x), iCard(%x)", gDfcQ, iStack, iCard);
sl@0
   516
sl@0
   517
	// create an async request & append toS async request list
sl@0
   518
	DBusEventRequest* request = new  DBusEventRequest(aFunctionId, aStatus, *this, aUnit, gDfcQ, *iStack, *iCard);
sl@0
   519
	iAsyncList.Append(request);
sl@0
   520
	MMCSDLOG4("DLddMmcCntrlInterface::CreateAsyncBusEventRequest created OK Status(%x) functionID(%d) aFunctionId(%d)",
sl@0
   521
			request->Status(), request->FunctionId(), aFunctionId);
sl@0
   522
	return request;
sl@0
   523
sl@0
   524
	}
sl@0
   525
sl@0
   526
/**
sl@0
   527
 * Clears an asynchronous Request from list
sl@0
   528
 *
sl@0
   529
 * @param DLddAsyncRequest* aRequest - Pointer to the request
sl@0
   530
 *
sl@0
   531
 * @return N/A
sl@0
   532
 *
sl@0
   533
 * @leave N/A
sl@0
   534
 */
sl@0
   535
void DLddMmcCntrlInterface::ClearRequest(DLddAsyncRequest* aRequest)
sl@0
   536
	{
sl@0
   537
	if(!aRequest)
sl@0
   538
		{
sl@0
   539
		MMCSDLOG("ERROR IN DLddMmcCntrlInterface::ClearRequest NULL request");
sl@0
   540
		return;
sl@0
   541
		}
sl@0
   542
sl@0
   543
	TInt i = iAsyncList.Find(aRequest);
sl@0
   544
	if(i >= 0)
sl@0
   545
		{
sl@0
   546
		iAsyncList.Remove(i);
sl@0
   547
		}
sl@0
   548
	else
sl@0
   549
		{
sl@0
   550
		MMCSDLOG2("ERROR IN DLddMmcCntrlInterface::ClearRequest err(%d)", i);
sl@0
   551
		}
sl@0
   552
sl@0
   553
	delete aRequest;
sl@0
   554
sl@0
   555
	}
sl@0
   556
sl@0
   557
/**
sl@0
   558
 * Callback when request has completed
sl@0
   559
 *
sl@0
   560
 * @param DLddAsyncRequest& aRequest - The completed request
sl@0
   561
 *
sl@0
   562
 * @return N/A
sl@0
   563
 *
sl@0
   564
 * @leave N/A
sl@0
   565
 */
sl@0
   566
void DLddMmcCntrlInterface::Notify(DLddAsyncRequest& aRequest)  // callback from DLddAsyncRequest
sl@0
   567
	{
sl@0
   568
	MMCSDLOG("DLddMmcCntrlInterface::Notify called");
sl@0
   569
	TRequestStatus* status =  aRequest.Status();
sl@0
   570
	switch (aRequest.FunctionId())
sl@0
   571
		{
sl@0
   572
		case DLddMmcCntrlInterface::EMmcSesReadBlk:
sl@0
   573
			{
sl@0
   574
			DMmcSessionAsyncRequest& request = (DMmcSessionAsyncRequest&) aRequest;
sl@0
   575
			MMCSDLOG("DLddMmcCntrlInterface::ReadBlockComplete");
sl@0
   576
			TInt r = KErrNone;
sl@0
   577
			if (request.iClientDesPtr) // have we supplied descriptor to hold returned data
sl@0
   578
				{
sl@0
   579
				TPtr8 ptr(&(request.iBuf[request.iBlkOffet]), KSectorSizeInBytes, KSectorSizeInBytes);
sl@0
   580
				TPtrC8* srcDes = (TPtrC8*)request.iClientDesPtr;
sl@0
   581
				r = Kern::ThreadDesWrite(iClient, srcDes, ptr, 0, iClient);
sl@0
   582
				if(r != KErrNone)
sl@0
   583
					{
sl@0
   584
					MMCSDLOG2("ERROR DLddMmcCntrlInterface::ReadBlockComplete Kern::ThreadDesWrite returned r(%d)", r);
sl@0
   585
					}
sl@0
   586
				}
sl@0
   587
			else
sl@0
   588
				{
sl@0
   589
				MMCSDLOG("ERROR DLddMmcCntrlInterface::ReadExtCSDComplete - No pointer provided to hold returned data");
sl@0
   590
				Kern::PanicCurrentThread(_L("PBUS-MMC"), 0);				
sl@0
   591
				}
sl@0
   592
			Kern::RequestComplete(iClient, status, (r == KErrNone) ? aRequest.Error() : r);
sl@0
   593
			}
sl@0
   594
			break;
sl@0
   595
sl@0
   596
		case DLddMmcCntrlInterface::EMmcSesWriteBlk:
sl@0
   597
			{
sl@0
   598
			MMCSDLOG("DLddMmcCntrlInterface::WriteBlockComplete)");
sl@0
   599
			TRequestStatus* status =  aRequest.Status();
sl@0
   600
			Kern::RequestComplete(iClient, status, aRequest.Error());
sl@0
   601
			}
sl@0
   602
			break;
sl@0
   603
sl@0
   604
		case DLddMmcCntrlInterface::EMmcSesReadCSD:
sl@0
   605
			{
sl@0
   606
			DMmcSessionAsyncRequest& request = (DMmcSessionAsyncRequest&) aRequest;
sl@0
   607
			MMCSDLOG("DLddMmcCntrlInterface::ReadCSDComplete");
sl@0
   608
			TInt r = KErrNone;
sl@0
   609
			if (request.iClientDesPtr) // have we supplied pointer to hold returned data
sl@0
   610
				{
sl@0
   611
					{
sl@0
   612
					TCSDInfo csdInfo(iCSD);
sl@0
   613
		    		r = Kern::ThreadRawWrite(iClient, request.iClientDesPtr, &csdInfo, sizeof(csdInfo));
sl@0
   614
					}
sl@0
   615
				if(r != KErrNone)
sl@0
   616
					{
sl@0
   617
					MMCSDLOG2("ERROR DLddMmcCntrlInterface::ReadCSDComplete Kern::ThreadRawWrite returned r(%d)", r);
sl@0
   618
					}
sl@0
   619
				}
sl@0
   620
			else
sl@0
   621
				{
sl@0
   622
				MMCSDLOG("ERROR DLddMmcCntrlInterface::ReadExtCSDComplete - No pointer provided to hold returned data");
sl@0
   623
				Kern::PanicCurrentThread(_L("PBUS-MMC"), 0);				
sl@0
   624
				}
sl@0
   625
			Kern::RequestComplete(iClient, status, (r == KErrNone) ? aRequest.Error() : r);
sl@0
   626
			}
sl@0
   627
			break;
sl@0
   628
sl@0
   629
		case DLddMmcCntrlInterface::EMmcSesReadExtCSD:
sl@0
   630
			{
sl@0
   631
			DMmcSessionAsyncRequest& request = (DMmcSessionAsyncRequest&) aRequest;
sl@0
   632
			MMCSDLOG("DLddMmcCntrlInterface::ReadExtCSDComplete");
sl@0
   633
			TInt r = KErrNone;
sl@0
   634
			if (request.iClientDesPtr) // have we supplied pointer to hold returned data
sl@0
   635
				{
sl@0
   636
				TExtendedCSDInfo extendedCSDInfo(iExtendedCSD);
sl@0
   637
	    		r = Kern::ThreadRawWrite(iClient, request.iClientDesPtr, &extendedCSDInfo, sizeof(extendedCSDInfo));
sl@0
   638
				if(r != KErrNone)
sl@0
   639
					{
sl@0
   640
					MMCSDLOG2("ERROR DLddMmcCntrlInterface::ReadExtCSDComplete Kern::ThreadRawWrite returned r(%d)", r);
sl@0
   641
					}
sl@0
   642
				}
sl@0
   643
			else
sl@0
   644
				{
sl@0
   645
				MMCSDLOG("ERROR DLddMmcCntrlInterface::ReadExtCSDComplete - No pointer provided to hold returned data");
sl@0
   646
				Kern::PanicCurrentThread(_L("PBUS-MMC"), 0);				
sl@0
   647
				}
sl@0
   648
			Kern::RequestComplete(iClient, status, (r == KErrNone) ? aRequest.Error() : r);
sl@0
   649
			}
sl@0
   650
			break;
sl@0
   651
			
sl@0
   652
		case DLddMmcCntrlInterface::EMMcSocketPowerUp:
sl@0
   653
			{
sl@0
   654
			DBusEventRequest& request = (DBusEventRequest&) aRequest;
sl@0
   655
			TInt retCode = KErrNone;
sl@0
   656
			
sl@0
   657
			MMCSDLOG2("DLddMmcCntrlInterface::EMMcSocketPowerUp ret code = %d", aRequest.Error());
sl@0
   658
			MMCSDLOG2("DLddMmcCntrlInterface::EMMcSocketPowerUp request.BusState() = %d", request.BusState());
sl@0
   659
			MMCSDLOG2("DLddMmcCntrlInterface::EMMcSocketPowerUp request.BusError() = %d", request.BusError());
sl@0
   660
			
sl@0
   661
			switch(aRequest.Error())
sl@0
   662
				{
sl@0
   663
				case TPBusCallBack::EPBusStateChange:
sl@0
   664
					{
sl@0
   665
					TPBusState newState = request.BusState();
sl@0
   666
					retCode = request.BusError();
sl@0
   667
sl@0
   668
					if (retCode == KErrNone)
sl@0
   669
						{
sl@0
   670
						switch(newState)
sl@0
   671
							{
sl@0
   672
							case EPBusCardAbsent:	retCode = KErrNotFound;		break;			
sl@0
   673
							case EPBusPsuFault:		retCode = KErrBadPower;		break;
sl@0
   674
							case EPBusOff:
sl@0
   675
							case EPBusOn:
sl@0
   676
							case EPBusPowerUpPending:
sl@0
   677
							case EPBusPoweringUp:
sl@0
   678
							default:	
sl@0
   679
								break;
sl@0
   680
							}
sl@0
   681
						}
sl@0
   682
sl@0
   683
					break;
sl@0
   684
					}
sl@0
   685
				}
sl@0
   686
			
sl@0
   687
	   		Kern::RequestComplete(iClient, status, retCode);
sl@0
   688
			}
sl@0
   689
			break;
sl@0
   690
sl@0
   691
		default:
sl@0
   692
			MMCSDLOG("#######################################################################");
sl@0
   693
			MMCSDLOG("## UNHANDLED END DFC DLddAsyncRequest DLddMmcCntrlInterface::Notify  ##");
sl@0
   694
			MMCSDLOG2("## aRequest.FunctionId(%d)  ##", aRequest.FunctionId());
sl@0
   695
			MMCSDLOG("#######################################################################");
sl@0
   696
			Kern::PanicCurrentThread(_L("PBUS-MMC"), 0);
sl@0
   697
			break;
sl@0
   698
		};
sl@0
   699
sl@0
   700
	ClearRequest(&aRequest);
sl@0
   701
sl@0
   702
	}
sl@0
   703