--- a/kernel/eka/drivers/locmedia/locmedia.cpp Wed Sep 15 13:42:27 2010 +0300
+++ b/kernel/eka/drivers/locmedia/locmedia.cpp Wed Oct 13 16:04:24 2010 +0300
@@ -29,6 +29,7 @@
#include "locmediaTraces.h"
#endif
+
#if defined(_DEBUG) && defined(__DEMAND_PAGING__)
//#define __DEBUG_DEMAND_PAGING__
#endif
@@ -70,9 +71,6 @@
class DPrimaryMediaBase::DBody : public DBase
{
public:
- DBody(DPrimaryMediaBase& aPrimaryMediaBase);
-public:
- DPrimaryMediaBase& iPrimaryMediaBase; // ptr to parent
TInt iPhysDevIndex;
TInt iRequestCount;
#ifdef __DEMAND_PAGING__
@@ -81,24 +79,12 @@
TInt iPageSizeLog2; // LOG2 of page size (i.e. 4096 -> 12)
TInt iMediaChanges;
#endif
-
- // This bit mask indicates which local drives the media is attached to
- TUint32 iRegisteredDriveMask;
-
- // Set to ETrue for media extension drivers
- TBool iMediaExtension;
-
- // Media change DFCs to allow media change events from attached media
- // to be handled in the context of an extension media's thread
- TDfc iMediaChangeDfc;
- TDfc iMediaPresentDfc;
};
#ifdef __DEMAND_PAGING__
DMediaPagingDevice* ThePagingDevices[KMaxLocalDrives];
DPrimaryMediaBase* TheRomPagingMedia = NULL;
DPrimaryMediaBase* TheDataPagingMedia = NULL;
-TLocDrv* TheDataPagingDrive = NULL;
TBool DataPagingDeviceRegistered = EFalse;
class DPinObjectAllocator;
DPinObjectAllocator* ThePinObjectAllocator = NULL;
@@ -107,29 +93,10 @@
// In this case, we need to avoid taking page faults on the non-paging media too, hence the need for these checks:
inline TBool DataPagingDfcQ(DPrimaryMediaBase* aPrimaryMedia)
{return TheDataPagingMedia && TheDataPagingMedia->iDfcQ == aPrimaryMedia->iDfcQ;}
-
-
-TBool DataPagingMedia(DPrimaryMediaBase* aPrimaryMedia)
- {
- for (TLocDrv* drv = TheDataPagingDrive; drv; drv = drv->iNextDrive)
- if (drv->iPrimaryMedia == aPrimaryMedia)
- return ETrue;
- return EFalse;
- }
-
inline TBool RomPagingDfcQ(DPrimaryMediaBase* aPrimaryMedia)
{return TheRomPagingMedia && TheRomPagingMedia->iDfcQ == aPrimaryMedia->iDfcQ;}
-#if defined(_DEBUG)
- #define SETDEBUGFLAG(aBitNum) {Kern::SuperPage().iDebugMask[aBitNum >> 5] |= (1 << (aBitNum & 31));}
- #define CLRDEBUGFLAG(aBitNum) {Kern::SuperPage().iDebugMask[aBitNum >> 5] &= ~(1 << (aBitNum & 31));}
-#else
- #define SETDEBUGFLAG(aBitNum)
- #define CLRDEBUGFLAG(aBitNum)
-#endif
-
-
/*
DPinObjectAllocator
@@ -138,7 +105,6 @@
(1) a queue of pre-allocated TVirtualPinObject's;
(2) a single pre-allocated DFragmentationPagingLock object:
this may be used if there are no TVirtualPinObject's available or if Kern::PinVirtualMemory() fails
-@internalTechnology
*/
NONSHARABLE_CLASS(DPinObjectAllocator) : public DBase
{
@@ -192,7 +158,7 @@
delete iPreAllocatedDataLock;
}
- for (TInt n=0; iVirtualPinContainers!= NULL && n<iObjectCount; n++)
+ for (TInt n=0; n<iObjectCount; n++)
{
SVirtualPinContainer& virtualPinContainer = iVirtualPinContainers[n];
if (virtualPinContainer.iObject)
@@ -227,7 +193,7 @@
}
- iVirtualPinContainers = new SVirtualPinContainer[aObjectCount];
+ SVirtualPinContainer* iVirtualPinContainers = new SVirtualPinContainer[aObjectCount];
if (iVirtualPinContainers == NULL)
{
OstTraceFunctionExitExt( DPINOBJECTALLOCATOR_CONSTRUCT_EXIT3, this, KErrNoMemory );
@@ -294,99 +260,6 @@
#endif // __DEMAND_PAGING__
-
-/*
-TDriveIterator
-
-Internal class which supports iterating through all local drives (TLocDrv's)
-If there are media extensions present, then this will iterate through all attached drives.
-@internalTechnology
-*/
-class TDriveIterator
- {
-public:
- TDriveIterator();
- TLocDrv* NextDrive();
- inline TInt Index()
- {return iIndex;}
- static TLocDrv* GetDrive(TInt aDriveNum, DPrimaryMediaBase* aPrimaryMedia);
- static TLocDrv* GetPhysicalDrive(TLocDrv* aDrv);
-
-#if defined(__DEMAND_PAGING__) && defined(__DEMAND_PAGING_BENCHMARKS__)
- static DMediaPagingDevice* PagingDevice(TInt aDriveNum, DPagingDevice::TType aType);
-#endif
-
-private:
- TInt iIndex;
- TLocDrv* iDrive;
- };
-
-TDriveIterator::TDriveIterator() :
- iIndex(0), iDrive(NULL)
- {
- }
-
-TLocDrv* TDriveIterator::NextDrive()
- {
- if (iDrive) // i.e. if not first time
- {
- if (iDrive->iNextDrive)
- {
- iDrive = iDrive->iNextDrive;
- return iDrive;
- }
- iIndex++;
- }
-
- for (iDrive = NULL; iIndex < KMaxLocalDrives; iIndex++)
- {
- iDrive = TheDrives[iIndex];
- if (iDrive)
- break;
- }
-
- return iDrive;
- }
-
-/*
-Returns the first TLocDrv in the chain of attached drives which matches DPrimaryMediaBase
-*/
-TLocDrv* TDriveIterator::GetDrive(TInt aDriveNum, DPrimaryMediaBase* aPrimaryMedia)
- {
- TLocDrv* drive = TheDrives[aDriveNum];
- while (drive && drive->iPrimaryMedia != aPrimaryMedia)
- {
- drive = drive->iNextDrive ? drive->iNextDrive : NULL;
- }
- return drive;
- }
-
-/*
-Returns the last TLocDrv in the chain of attached drives -
-i.e. the TLocDrv attached to physical media rather than a TLocDrv corresponding to a media extension
-*/
-TLocDrv* TDriveIterator::GetPhysicalDrive(TLocDrv* aDrv)
- {
- __ASSERT_DEBUG(aDrv, LOCM_FAULT());
- while (aDrv->iNextDrive)
- aDrv = aDrv->iNextDrive;
- return aDrv;
- }
-
-#if defined(__DEMAND_PAGING__) && defined(__DEMAND_PAGING_BENCHMARKS__)
-DMediaPagingDevice* TDriveIterator::PagingDevice(TInt aDriveNum, DPagingDevice::TType aType)
- {
- TLocDrv* drive = TheDrives[aDriveNum];
- DMediaPagingDevice* pagingDevice = drive ? drive->iPrimaryMedia->iBody->iPagingDevice : NULL;
- while (drive && (pagingDevice == NULL || (pagingDevice->iType & aType) == 0))
- {
- drive = drive->iNextDrive ? drive->iNextDrive : NULL;
- pagingDevice = drive ? drive->iPrimaryMedia->iBody->iPagingDevice : NULL;
- }
- return pagingDevice;
- }
-#endif
-
/********************************************
* Local drive device base class
********************************************/
@@ -439,8 +312,7 @@
/********************************************
* Local drive interface class
********************************************/
-DLocalDrive::DLocalDrive() :
- iMediaChangeObserver(MediaChangeCallback, this, TCallBackLink::EDLocalDriveObject)
+DLocalDrive::DLocalDrive()
{
// iLink.iNext=NULL;
}
@@ -621,6 +493,42 @@
m.Length()=KMaxLocalDriveCapsLength; // for pinning
r=iDrive->Request(m);
+ if(r == KErrNone && iDrive->iMedia != NULL && iDrive->iMedia->iDriver != NULL)
+ {
+ // Fill in default media size if not specified by the driver
+ //
+ // - This uses the members of TLocalDriveCapsV4 which was primarily used
+ // to report NAND flash characteristics, but are general enough to be
+ // used to report the size of any type of media without adding yet
+ // another extension to TLocalDriveCapsVx.
+ //
+
+ TLocalDriveCapsV4& caps = *(TLocalDriveCapsV4*)capsBuf.Ptr();
+
+ if(caps.iSectorSizeInBytes == 0)
+ {
+ // Fill in a default value for the disk sector size
+ caps.iSectorSizeInBytes = 512;
+
+ // Zero the number of sectors, as a sector count makes no sense without a sector size
+ // - Fault in debug mode if a sector count is provided to ensure that media driver creators
+ // set this value,but in release mode continue gracefully be recalculating the sector count.
+ __ASSERT_DEBUG(caps.iNumberOfSectors == 0, LOCM_FAULT());
+ caps.iNumberOfSectors = 0;
+ caps.iNumPagesPerBlock = 1; // ...to ensure compatiility with NAND semantics
+ }
+
+ if(caps.iNumberOfSectors == 0)
+ {
+ const Int64 totalSizeInSectors = iDrive->iMedia->iDriver->TotalSizeInBytes() / caps.iSectorSizeInBytes;
+ __ASSERT_DEBUG(I64HIGH(totalSizeInSectors) == 0, LOCM_FAULT());
+
+ if(I64HIGH(totalSizeInSectors) == 0)
+ {
+ caps.iNumberOfSectors = I64LOW(totalSizeInSectors);
+ }
+ }
+ }
#if defined(OST_TRACE_COMPILER_IN_USE) && defined(_DEBUG)
const TLocalDriveCapsV5& caps=*(const TLocalDriveCapsV5*)capsBuf.Ptr();
@@ -689,11 +597,7 @@
{
OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_CONTROLISREMOVABLE, "EControlIsRemovable; TLocDrvRequest Object=0x%x", (TUint) &m);
TInt sockNum;
-
- // Pass request on to last chained drive
- TLocDrv* drv = TDriveIterator::GetPhysicalDrive(iDrive);
- r = drv->iPrimaryMedia->IsRemovableDevice(sockNum);
-
+ r=iDrive->iPrimaryMedia->IsRemovableDevice(sockNum);
if (r)
kumemput32(a1,&sockNum,sizeof(TInt));
break;
@@ -736,11 +640,7 @@
OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_CONTROLSETMOUNTINFO, "EControlSetMountInfo; TLocDrvRequest Object=0x%x", (TUint) &m);
m.Id()=ERead;
r=m.ProcessMessageData(a1);
-
- // Pass request on to last chained drive
- TLocDrv* drv = TDriveIterator::GetPhysicalDrive(iDrive);
- DPrimaryMediaBase* pM = drv->iPrimaryMedia;
-
+ DPrimaryMediaBase* pM=iDrive->iPrimaryMedia;
if(!pM || r!=KErrNone)
break;
@@ -978,15 +878,11 @@
TBuf8<KMaxQueryDeviceLength> queryBuf;
queryBuf.SetMax();
queryBuf.FillZ();
-
- DThread* pT = m.Client();
- r = Kern::ThreadDesRead(pT, (TDes8*)a2, queryBuf, 0 ,KChunkShiftBy0);
-
- queryBuf.SetMax();
+
m.Id() = EQueryDevice;
- m.iArg[0] = a1; // RLocalDrive::TQueryDevice
+ m.iArg[0] = a1; // RLocalDrive::TQueryDevice
m.RemoteDes() = (TAny*)queryBuf.Ptr(); // overload this
- m.Length() = KMaxQueryDeviceLength;
+ m.Length() = KMaxLocalDriveCapsLength; // for pinning
OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_QUERYDEVICE, "EQueryDevice; TLocDrvRequest Object=0x%x", (TUint) &m);
r=iDrive->Request(m);
OstTraceDef1( OST_TRACE_CATEGORY_RND, TRACE_REQUEST, DLOCALDRIVE_REQUEST_QUERYDEVICE_RETURN, "EQueryDevice Return; TLocDrvRequest Object=0x%x", (TUint) &m);
@@ -1141,7 +1037,7 @@
OstTrace1(TRACE_FLOW, DLOCALDRIVE_UNLOCKMOUNTINFO_ENTRY, "> DLocalDrive::UnlockMountInfo;aPrimaryMedia=%x", (TUint) &aPrimaryMedia);
DMediaPagingDevice* pagingDevice = aPrimaryMedia.iBody->iPagingDevice;
- if (pagingDevice == NULL)
+ if (pagingDevice == NULL || pagingDevice->iMountInfoDataLock == NULL)
{
OstTraceFunctionExit1( DLOCALDRIVE_UNLOCKMOUNTINFO_EXIT1, this );
return;
@@ -1173,52 +1069,50 @@
}
#endif // __DEMAND_PAGING__
-void DLocalDrive::NotifyChange()
+void DLocalDrive::NotifyChange(DPrimaryMediaBase& aPrimaryMedia, TBool aMediaChange)
{
- OstTrace0( TRACE_FLOW, DLOCALDRIVE_NOTIFYCHANGE_ENTRY, "> DLocalDrive::NotifyChange");
-
-
- // Complete any notification request on media change
- DThread* pC=NULL;
- NKern::LockSystem();
- if (iCleanup.iThread)
- {
- pC=iCleanup.iThread;
- pC->Open();
- }
- NKern::UnlockSystem();
- if (pC)
+ OstTraceExt2( TRACE_FLOW, DLOCALDRIVE_NOTIFYCHANGE_ENTRY, "> DLocalDrive::NotifyChange;aPrimaryMedia=%x;aMediaChange=%d", (TUint) &aPrimaryMedia, aMediaChange );
+#ifndef __DEMAND_PAGING__
+ aPrimaryMedia;
+#endif
+
+ // Complete any notification request on media change or power down
+ if (aMediaChange)
{
- TBool b = ETrue;
- // if change not yet queued, queue it now
- if (iNotifyChangeRequest->IsReady())
+ DThread* pC=NULL;
+ NKern::LockSystem();
+ if (iCleanup.iThread)
{
- *((TBool*) iNotifyChangeRequest->Buffer()) = b;
- Kern::QueueRequestComplete(pC,iNotifyChangeRequest,KErrNone);
+ pC=iCleanup.iThread;
+ pC->Open();
}
- // If change has not even been requested by the client, maintain the pre-wdp behaviour
- // and write data immediately back to client (possibly taking a page fault)
- // N.B. Must NOT do this on data paging media
+ NKern::UnlockSystem();
+ if (pC)
+ {
+ TBool b = ETrue;
+ // if change not yet queued, queue it now
+ if (iNotifyChangeRequest->IsReady())
+ {
+ *((TBool*) iNotifyChangeRequest->Buffer()) = b;
+ Kern::QueueRequestComplete(pC,iNotifyChangeRequest,KErrNone);
+ }
+ // If change has not even been requested by the client, maintain the pre-wdp behaviour
+ // and write data immediately back to client (possibly taking a page fault)
+ // N.B. Must NOT do this on data paging media
#ifdef __DEMAND_PAGING__
- else if (!DataPagingDfcQ(iDrive->iPrimaryMedia))
+ else if (!DataPagingDfcQ(&aPrimaryMedia))
#else
- else
+ else
#endif
- {
- Kern::ThreadRawWrite(pC, iNotifyChangeRequest->DestPtr(), &b, sizeof(b), NULL);
+ {
+ Kern::ThreadRawWrite(pC, iNotifyChangeRequest->DestPtr(), &b, sizeof(b), NULL);
+ }
+ pC->AsyncClose();
}
- pC->AsyncClose();
}
OstTraceFunctionExit1( DLOCALDRIVE_NOTIFYCHANGE_EXIT, this );
}
-// This function is called by the primary media when a media change occurs
-TInt DLocalDrive::MediaChangeCallback(TAny* aLocalDrive, TInt /* aNotifyType*/)
- {
- ((DLocalDrive*) aLocalDrive)->NotifyChange();
- return KErrNone;
- }
-
TLocalDriveCleanup::TLocalDriveCleanup()
{
}
@@ -1237,33 +1131,6 @@
NKern::LockSystem();
}
-
-EXPORT_C TInt DLocalDrive::Caps(TInt aDriveNumber, TDes8& aCaps)
- {
- if(!Kern::CurrentThreadHasCapability(ECapabilityTCB,__PLATSEC_DIAGNOSTIC_STRING("Checked by ELOCD.LDD (Local Media Driver)")))
- {
- return KErrPermissionDenied;
- }
-
-
- if (aDriveNumber >= KMaxLocalDrives)
- return KErrArgument;
-
- TLocDrv* drive = TheDrives[aDriveNumber];
- if (!drive)
- return KErrNotSupported;
-
- TLocDrvRequest request;
- memclr(&request, sizeof(request));
-
- request.Drive() = drive;
- request.Id() = DLocalDrive::ECaps;
- request.Length() = aCaps.Length();
- request.RemoteDes() = (TAny*) aCaps.Ptr();
-
- return request.SendReceive(&drive->iPrimaryMedia->iMsgQ);
- }
-
/********************************************
* Local drive request class
********************************************/
@@ -1292,14 +1159,6 @@
{
OstTraceFunctionEntry1( TLOCDRVREQUEST_READREMOTE_ENTRY, this );
TInt r;
-
- if (Flags() & TLocDrvRequest::EKernelBuffer)
- {
- (void)memcpy((TAny*) aDes->Ptr(), (TAny*)((TUint32)RemoteDes()+anOffset), aDes->MaxLength());
- aDes->SetLength(aDes->MaxLength());
- return KErrNone;
- }
-
DThread* pT=RemoteThread();
if (!pT)
pT=Client();
@@ -1439,14 +1298,6 @@
{
OstTraceFunctionEntry1( TLOCDRVREQUEST_WRITEREMOTE_ENTRY, this );
TInt r;
-
- if (Flags() & TLocDrvRequest::EKernelBuffer)
- {
- (void)memcpy((TAny*)((TUint32)RemoteDes()+anOffset), (TAny*) aDes->Ptr(), aDes->Length());
- OstTraceFunctionExitExt( TLOCDRVREQUEST_WRITEREMOTE_EXIT1, this, KErrNone );
- return KErrNone;
- }
-
DThread* pC=Client();
DThread* pT=RemoteThread();
if (!pT)
@@ -1456,12 +1307,12 @@
if (Flags() & ETClientBuffer)
{
r = Kern::ThreadBufWrite(pT, (TClientBuffer*) RemoteDes(),*aDes,anOffset+RemoteDesOffset(),KChunkShiftBy0,pC);
- OstTraceFunctionExitExt( TLOCDRVREQUEST_WRITEREMOTE_EXIT2, this, r );
+ OstTraceFunctionExitExt( TLOCDRVREQUEST_WRITEREMOTE_EXIT1, this, r );
return r;
}
#endif
r = Kern::ThreadDesWrite(pT,RemoteDes(),*aDes,anOffset+RemoteDesOffset(),KChunkShiftBy0,pC);
- OstTraceFunctionExitExt( TLOCDRVREQUEST_WRITEREMOTE_EXIT3, this, r );
+ OstTraceFunctionExitExt( TLOCDRVREQUEST_WRITEREMOTE_EXIT2, this, r );
return r;
}
@@ -1594,7 +1445,7 @@
break;
case DLocalDrive::EReduce:
__KTRACE_OPT(KLOCDRV,Kern::Printf("Reduce request %lx@%lx",Length(),Pos()));
- OstTraceExt4( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION3, "Reduce request length=%x:%x; position=%x:%x", (TUint) I64HIGH(Length()), (TUint) I64LOW(Length()), (TUint) I64HIGH (Pos()), (TUint) I64LOW (Pos()) );
+ OstTraceExt4( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION3, "Reduce request length=%x:%x; position=%x:%x", (TUint) I64HIGH(Length()), (TUint) I64LOW(Length()), (TUint) I64HIGH(Pos()), (TUint) I64LOW(Pos()) );
if (Pos()+Length()>d.iPartitionLen)
r = KErrArgument;
else
@@ -1602,7 +1453,7 @@
break;
case DLocalDrive::EFormat:
__KTRACE_OPT(KLOCDRV,Kern::Printf("Format request %lx@%lx",Length(),Pos()));
- OstTraceExt4( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION4, "Format request length=%x:%x; position=%x:%x", (TUint) I64HIGH(Length()),(TUint) I64LOW(Length()), (TUint) I64HIGH (Pos()), (TUint) I64LOW (Pos()) );
+ OstTraceExt4( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION4, "Format request length=%x:%x; position=%x:%x", (TUint) I64HIGH(Length()),(TUint) I64LOW(Length()), (TUint) I64HIGH(Pos()), (TUint) I64LOW(Pos()) );
if (!(DriverFlags() & RLocalDrive::ELocDrvWholeMedia))
{
if (Pos()>d.iPartitionLen)
@@ -1630,7 +1481,7 @@
// Otherwise the media driver adjust it internally
case DMediaPagingDevice::ECodePageInRequest:
__KTRACE_OPT(KLOCDPAGING,Kern::Printf("Adjusted Paging read request %lx@%lx",Length(),Pos()));
- OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, TLOCDRVREQUESTCHECKANDADJUSTFORPARTITION5, "Adjusted Paging read request length=%x:%x; position=%x:%x", (TUint) I64HIGH(Length()), (TUint) I64LOW(Length()), (TUint) I64HIGH(Pos()), (TUint) I64LOW(Pos()));
+ OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, TLOCDRVREQUESTCHECKANDADJUSTFORPARTITION5, "Adjusted Paging read request length=%x:%x; position=%x%:%x", (TUint) I64HIGH(Length()), (TUint) I64LOW(Length()), (TUint) I64HIGH(Pos()), (TUint) I64LOW(Pos()));
if (Pos()+Length()>d.iPartitionLen)
{
r = KErrArgument;
@@ -1643,10 +1494,10 @@
default: // read or write or fragment
__KTRACE_OPT(KLOCDRV,Kern::Printf("R/W request %lx@%lx",Length(),Pos()));
- OstTraceExt4( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION6, "Read/Write request length=%x:%x; position=%x:%x", (TUint)I64HIGH (Length()), (TUint)I64LOW (Length()), (TUint) I64HIGH (Pos()), (TUint) I64LOW (Pos()));
+ OstTraceExt4( TRACE_INTERNALS, TLOCDRVREQUEST_CHECKANDADJUSTFORPARTITION6, "Read/Write request length=%x:%x; position=%x:%x", (TUint) I64HIGH(Length()), (TUint) I64LOW(Length()), (TUint) I64HIGH(Pos()), (TUint) I64LOW(Pos()));
if (DriverFlags() & RLocalDrive::ELocDrvWholeMedia)
{
- if (d.iMedia && d.iMedia->iDriver && Pos()+Length() > d.iMedia->iPartitionInfo.iMediaSizeInBytes)
+ if (d.iMedia && d.iMedia->iDriver && Pos()+Length() > d.iMedia->iDriver->iTotalSizeInBytes)
{
r = KErrArgument;
break;
@@ -1676,22 +1527,9 @@
memclr(this, sizeof(TLocDrv));
iDriveNumber=aDriveNumber;
iPartitionNumber=-1;
- iMediaChangeObserver.iFunction = MediaChangeCallback;
- iMediaChangeObserver.iPtr= this;
- iMediaChangeObserver.iObjectType = TCallBackLink::ETLocDrvObject;
OstTraceFunctionExit1( TLOCDRV_TLOCDRV_EXIT, this );
}
-TInt TLocDrv::MediaChangeCallback(TAny* aLocDrv, TInt aNotifyType)
- {
- __ASSERT_DEBUG(aNotifyType == DPrimaryMediaBase::EMediaChange || aNotifyType == DPrimaryMediaBase::EMediaPresent, LOCM_FAULT());
- if (aNotifyType == DPrimaryMediaBase::EMediaPresent)
- return ((TLocDrv*) aLocDrv)->iPrimaryMedia->iBody->iMediaPresentDfc.Enque();
- else
- return ((TLocDrv*) aLocDrv)->iPrimaryMedia->iBody->iMediaChangeDfc.Enque();
- }
-
-
/**
Initialises the DMedia entity with the media device number and ID.
@@ -1758,26 +1596,6 @@
OstTraceFunctionExit0( _HANDLEMSG_EXIT );
}
-
-void mediaChangeDfc(TAny* aPtr)
- {
- DPrimaryMediaBase* pM = (DPrimaryMediaBase*)aPtr;
- pM->NotifyMediaChange();
- }
-
-void mediaPresentDfc(TAny* aPtr)
- {
- DPrimaryMediaBase* pM = (DPrimaryMediaBase*)aPtr;
- pM->NotifyMediaPresent();
- }
-
-DPrimaryMediaBase::DBody::DBody(DPrimaryMediaBase& aPrimaryMediaBase) :
- iPrimaryMediaBase(aPrimaryMediaBase),
- iMediaChangeDfc(mediaChangeDfc, &aPrimaryMediaBase, KMaxDfcPriority),
- iMediaPresentDfc(mediaPresentDfc, &aPrimaryMediaBase, KMaxDfcPriority)
- {
- }
-
EXPORT_C DPrimaryMediaBase::DPrimaryMediaBase()
: iMsgQ(handleMsg, this, NULL, 1),
iDeferred(NULL, NULL, NULL, 0), // callback never used
@@ -1817,18 +1635,15 @@
{
OstTraceFunctionExitExt( DPRIMARYMEDIABASE_CREATE_EXIT1, this, r );
return r;
- }
- iBody = new DBody(*this);
+ }
+ iBody = new DBody;
if (iBody == NULL)
{
OstTraceFunctionExitExt( DPRIMARYMEDIABASE_CREATE_EXIT2, this, KErrNoMemory );
return KErrNoMemory;
- }
- if (iDfcQ)
- {
- iBody->iMediaChangeDfc.SetDfcQ(iDfcQ);
- iBody->iMediaPresentDfc.SetDfcQ(iDfcQ);
- }
+ }
+
+
#ifdef __DEMAND_PAGING__
TInt pageSize = Kern::RoundToPageSize(1);
@@ -1891,7 +1706,7 @@
NKern::LockSystem();
TBool first=iConnectionQ.IsEmpty();
- iConnectionQ.Add(&aLocalDrive->iMediaChangeObserver.iLink);
+ iConnectionQ.Add(&aLocalDrive->iLink);
NKern::UnlockSystem();
if (first)
{
@@ -1959,52 +1774,6 @@
OstTraceFunctionExit1( DPRIMARYMEDIABASE_DISCONNECT_EXIT2, this );
}
-
-/**
-Connects a TLocDrv containing a media extension to the next primary media in the chain
-*/
-TInt DPrimaryMediaBase::Connect(TLocDrv* aLocDrv)
- {
- TInt r = KErrNone;
-
- NKern::LockSystem();
- TBool first = iConnectionQ.IsEmpty();
- iConnectionQ.Add(&aLocDrv->iMediaChangeObserver.iLink);
- NKern::UnlockSystem();
-
- if (first && !iDfcQ)
- {
- r = OpenMediaDriver();
- if (r!=KErrNone)
- {
- NKern::LockSystem();
- aLocDrv->iMediaChangeObserver.iLink.Deque();
- NKern::UnlockSystem();
- }
- }
- return r;
- }
-
-TInt DPrimaryMediaBase::HandleMediaNotPresent(TLocDrvRequest& aReq)
- {
- TInt reqId = aReq.Id();
-
- if (reqId == DLocalDrive::ECaps)
- DefaultDriveCaps(*(TLocalDriveCapsV2*)aReq.RemoteDes()); // fill in stuff we know even if no media present
-
- TInt r = QuickCheckStatus();
- if (r != KErrNone &&
- reqId != DLocalDrive::EForceMediaChange && // EForceMediaChange, and
- reqId != DLocalDrive::EReadPasswordStore && // Password store operations
- reqId != DLocalDrive::EWritePasswordStore && // do not require the media
- reqId != DLocalDrive::EPasswordStoreLengthInBytes) // to be ready.)
- {
- return r;
- }
-
- return KErrNone;
- }
-
EXPORT_C TInt DPrimaryMediaBase::Request(TLocDrvRequest& aReq)
/**
Issues a local drive request. It is called from TLocDrv::Request() function .
@@ -2025,7 +1794,7 @@
@see TLocDrvRequest
*/
{
- OstTraceFunctionEntry1( DPRIMARYMEDIABASE_REQUEST_ENTRY, this );
+OstTraceFunctionEntry1( DPRIMARYMEDIABASE_REQUEST_ENTRY, this );
__KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::Request(%08x)",iMediaId,&aReq));
__KTRACE_OPT(KLOCDRV,Kern::Printf("this=%x, ReqId=%d, Pos=%lx, Len=%lx, remote thread %O",this,aReq.Id(),aReq.Pos(),aReq.Length(),aReq.RemoteThread()));
@@ -2035,13 +1804,18 @@
TInt reqId = aReq.Id();
- TInt r = HandleMediaNotPresent(aReq);
- if (r != KErrNone)
- {
+ if (reqId == DLocalDrive::ECaps)
+ DefaultDriveCaps(*(TLocalDriveCapsV2*)aReq.RemoteDes()); // fill in stuff we know even if no media present
+
+ TInt r = QuickCheckStatus();
+ if (r != KErrNone && aReq.Id()!=DLocalDrive::EForceMediaChange && // EForceMediaChange, and
+ aReq.Id()!=DLocalDrive::EReadPasswordStore && // Password store operations
+ aReq.Id()!=DLocalDrive::EWritePasswordStore && // do not require the media
+ aReq.Id()!=DLocalDrive::EPasswordStoreLengthInBytes) // to be ready.)
+ {
OstTraceFunctionExitExt( DPRIMARYMEDIABASE_REQUEST_EXIT, this, r );
return r;
- }
-
+ }
// for ERead & EWrite requests, get the linear address for pinning & DMA
@@ -2487,7 +2261,7 @@
case EConnect:
{
DLocalDrive* pD=(DLocalDrive*)m.Ptr0();
- iConnectionQ.Add(&pD->iMediaChangeObserver.iLink);
+ iConnectionQ.Add(&pD->iLink);
m.Complete(KErrNone, EFalse);
OstTraceFunctionExit1( DPRIMARYMEDIABASE_HANDLEMSG_EXIT1, this );
return;
@@ -2511,30 +2285,6 @@
{
TUint flags = (TUint) m.Pos();
-#ifdef __DEMAND_PAGING__
- // if this is a paging media (ROM,code or data), turn off the KMediaRemountForceMediaChange flag
- // as this normally results in a call to DPBusSocket::ForceMediaChange() which effectively disables
- // the media for a small time period - which would be disasterous if a paging request arrived
- if (iBody->iPagingDevice)
- flags&= ~KMediaRemountForceMediaChange;
-#endif
-
- // For media extension drivers, send a copy of the request to the next drive in the chain and wait for it.
- TLocDrv* drv = m.Drive();
- if (drv->iNextDrive)
- {
- TLocDrvRequest request;
- request.Drive() = drv->iNextDrive;
- request.Id() = DLocalDrive::EForceMediaChange;
- request.Pos() = m.Pos(); // flags
-
- request.SendReceive(&drv->iNextDrive->iPrimaryMedia->iMsgQ);
-
- CompleteRequest(m, request.iValue);
- return;
- }
-
-
// if KForceMediaChangeReOpenDriver specified wait for power up,
// and then re-open this drive's media driver
__KTRACE_OPT(KLOCDRV, Kern::Printf("EForceMediaChange, flags %08X\n", flags));
@@ -2765,18 +2515,18 @@
if (m.iValue == DLocalDrive::EForceMediaChange)
{
__ASSERT_DEBUG(((TUint) m.Pos()) == (TUint) KForceMediaChangeReOpenMediaDriver, LOCM_FAULT());
+
iCurrentReq=NULL;
TLocDrv* pL = m.Drive();
DMedia* media = pL->iMedia;
-
if (media && media->iDriver)
CloseMediaDrivers(media);
iState=EOpening;
StartOpenMediaDrivers();
- NotifyClients(EMediaChange, pL);
+ NotifyClients(ETrue,pL);
CompleteRequest(m, r);
OstTraceFunctionExitExt( DPRIMARYMEDIABASE_DOREQUEST_EXIT, this, r );
return r;
@@ -2803,7 +2553,7 @@
if (!(m.Flags() & TLocDrvRequest::EAdjusted))
{
// If this isn't the only partition, don't allow access to the whole media
- if (TDriveIterator::GetPhysicalDrive(m.Drive())->iPrimaryMedia->iTotalPartitionsOpened > 1)
+ if (iTotalPartitionsOpened > 1)
m.DriverFlags() &= ~RLocalDrive::ELocDrvWholeMedia;
r=m.CheckAndAdjustForPartition();
}
@@ -2889,10 +2639,9 @@
}
else
#endif
- {
- CompleteRequest(m, s);
- OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_INTERNALS, DPRIMARYMEDIABASE_DOREQUEST_RETURN, "Return Remote Thread=0x%x; retval=%d", (TUint) m.RemoteThread(), (TInt) s);
- }
+
+ CompleteRequest(m, s);
+ OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_INTERNALS, DPRIMARYMEDIABASE_DOREQUEST_RETURN, "Return req Id=%d; Remote Thread=0x%x; retval=%d", (TInt) m.Id(), (TUint) m.RemoteThread(), (TInt) s);
}
iCurrentReq=NULL;
@@ -2948,7 +2697,7 @@
// we mustn't ever close the media driver if it's responsible for data paging as re-opening the drive
// would involve memory allocation which might cause deadlock if the kernel heap were to grow
#ifdef __DEMAND_PAGING__
- if (DataPagingMedia(this))
+ if (DataPagingDfcQ(this))
{
__KTRACE_OPT(KLOCDRV,Kern::Printf("CloseMediaDrivers aborting for data paging media %08X", this));
OstTrace1(TRACE_FLOW, DPRIMARYMEDIABASE_CLOSEMEDIADRIVERS_EXIT1, "CloseMediaDrivers aborting for data paging media 0x%08x", this);
@@ -2956,30 +2705,21 @@
}
#endif
-
- // Don't close any media extension drivers either, since it won't serve any purpose
- // and keeping the driver open allows it to maintain internal state
- if (iBody->iMediaExtension)
+ TInt i;
+ for (i=0; i<KMaxLocalDrives; i++)
{
- __KTRACE_OPT(KLOCDRV,Kern::Printf("CloseMediaDrivers aborting for extension media %08X", this));
- return;
- }
-
-
- TDriveIterator driveIter;
- for (TLocDrv* pL = driveIter.NextDrive(); pL != NULL; pL = driveIter.NextDrive())
- {
+ TLocDrv* pL=TheDrives[i];
if (pL && pL->iPrimaryMedia==this)
{
- __KTRACE_OPT(KLOCDRV,Kern::Printf("Drive %d",driveIter.Index()));
- OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_CLOSEMEDIADRIVERS2, "Drive=%d", driveIter.Index());
+ __KTRACE_OPT(KLOCDRV,Kern::Printf("Drive %d",i));
+ OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_CLOSEMEDIADRIVERS2, "Drive=%d", i );
if (aMedia == NULL || pL->iMedia == aMedia)
{
pL->iMedia=NULL;
}
}
}
- for (TInt i=iLastMediaId; i>=iMediaId; i--)
+ for (i=iLastMediaId; i>=iMediaId; i--)
{
DMedia* pM=TheMedia[i];
if (aMedia == NULL || pM == aMedia)
@@ -3136,7 +2876,7 @@
if (pM->iDriver)
{
#ifdef __DEMAND_PAGING__
- if (DataPagingMedia(this))
+ if (DataPagingDfcQ(this))
{
__KTRACE_OPT(KLOCDRV,Kern::Printf("DoPartitionInfoComplete(%d) Close Media Driver aborted for data paging media %08X", this));
OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE2, "Close Media Driver for data paging media 0x%08x", this);
@@ -3202,10 +2942,10 @@
TInt id=iMediaId; // start with primary media
TInt partitionsOnThisMedia=PartitionCount();
TInt partition=0;
-
- TDriveIterator driveIter;
- for (TLocDrv* pD = driveIter.NextDrive(); pD != NULL; pD = driveIter.NextDrive())
+ TInt j;
+ for (j=0; j<KMaxLocalDrives; j++)
{
+ TLocDrv* pD=TheDrives[j];
if (pD && pD->iPrimaryMedia==this)
{
if (totalPartitions==0)
@@ -3219,8 +2959,9 @@
partition=0;
partitionsOnThisMedia=TheMedia[id]->PartitionCount();
}
- __KTRACE_OPT(KLOCDRV,Kern::Printf("Drive %d = Media %d Partition %d",driveIter.Index(),id,partition));
- OstTraceExt3( TRACE_INTERNALS, DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE5, "Local Drive=%d; iMediaId=%d; partition=%d", driveIter.Index(), id, partition );
+ __KTRACE_OPT(KLOCDRV,Kern::Printf("Drive %d = Media %d Partition %d",j,id,partition));
+ OstTraceExt3( TRACE_INTERNALS, DPRIMARYMEDIABASE_DOPARTITIONINFOCOMPLETE5, "Local Drive=%d; iMediaId=%d; partition=%d", j, id, partition );
+
pD->iMedia=TheMedia[id];
pD->iPartitionNumber=partition;
memcpy(pD, pD->iMedia->iPartitionInfo.iEntry+partition, sizeof(TPartitionEntry));
@@ -3486,10 +3227,10 @@
OstTraceFunctionExit1( DPRIMARYMEDIABASE_SETCLOSED_EXIT, this );
}
-void DPrimaryMediaBase::NotifyClients(TNotifyType aNotifyType, TLocDrv* aLocDrv)
+void DPrimaryMediaBase::NotifyClients(TBool aMediaChange,TLocDrv* aLocDrv)
//
-// Notify all clients of a media change or media present event
+// Notify all clients of a media change or power-down event
//
{
OstTraceFunctionEntryExt( DPRIMARYMEDIABASE_NOTIFYCLIENTS_ENTRY, this );
@@ -3497,23 +3238,11 @@
SDblQueLink* pL=iConnectionQ.iA.iNext;
while (pL!=&iConnectionQ.iA)
{
- // Get pointer to TCallBackLink
- TCallBackLink* pCallBackLink = _LOFF(pL,TCallBackLink,iLink);
-
- // The link is embedded in either a TLocDrv or a DLocalDrive object;
- // find out which one it is and then get TLocDrv pointer from that
- __ASSERT_DEBUG(pCallBackLink->iObjectType == TCallBackLink::EDLocalDriveObject || pCallBackLink->iObjectType == TCallBackLink::ETLocDrvObject, LOCM_FAULT());
- TLocDrv* locDrv;
- if (pCallBackLink->iObjectType == TCallBackLink::EDLocalDriveObject)
- locDrv = ((DLocalDrive*) _LOFF(pCallBackLink,DLocalDrive, iMediaChangeObserver))->iDrive;
- else
- locDrv = ((TLocDrv*) _LOFF(pCallBackLink,TLocDrv, iMediaChangeObserver))->iNextDrive;
-
+ DLocalDrive* pD=_LOFF(pL,DLocalDrive,iLink);
// Issue the notification if the caller wants to notify all drives (aLocDrv == NULL) or
// the specified drive matches this one
- if (aLocDrv == NULL || aLocDrv == locDrv)
- pCallBackLink->CallBack(aNotifyType);
-
+ if (aLocDrv == NULL || aLocDrv == pD->iDrive)
+ pD->NotifyChange(*this, aMediaChange);
pL=pL->iNext;
}
OstTraceFunctionExit1( DPRIMARYMEDIABASE_NOTIFYCLIENTS_EXIT, this );
@@ -3531,13 +3260,32 @@
OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_MEDIACHANGE, DPRIMARYMEDIABASE_NOTIFYMEDIACHANGE, "iMediaId=%d; iState=%d", iMediaId, iState );
- // This should only be called in the context of the media thread
- __ASSERT_ALWAYS(NKern::CurrentThread() == iDfcQ->iThread, LOCM_FAULT());
-
- MediaChange();
+ TInt state=iState;
+
+ __ASSERT_DEBUG(iBody, LOCM_FAULT());
+
+#ifdef __DEMAND_PAGING__
+ iBody->iMediaChanges++;
+
+ // As data paging media never close, need to ensure the media driver cancels
+ // any requests it owns as the stack may be powered down by DPBusPrimaryMedia::ForceMediaChange().
+ // DMediaDriver::NotifyPowerDown() should do this
+ if(DataPagingDfcQ(this))
+ NotifyPowerDown();
+#endif
+
+ // complete any outstanding requests with KErrNotReady
+ // and any force media change requests with KErrNone
+ SetClosed(KErrNotReady);
+
+ // close all media drivers on this device
+ if (state>=EOpening)
+ {
+ CloseMediaDrivers();
+ }
// notify all connections that media change has occurred
- NotifyClients(EMediaChange);
+ NotifyClients(ETrue);
// complete any force media change requests
iWaitMedChg.CompleteAll(KErrNone);
@@ -3606,6 +3354,8 @@
CloseMediaDrivers();
SetClosed(KErrNotReady);
}
+
+ NotifyClients(EFalse);
OstTraceFunctionExit1( DPRIMARYMEDIABASE_NOTIFYPOWERDOWN_EXIT, this );
}
@@ -3675,56 +3425,17 @@
}
CloseMediaDrivers();
SetClosed(KErrNotReady);
+ NotifyClients(EFalse);
OstTraceFunctionExit1( DPRIMARYMEDIABASE_NOTIFYEMERGENCYPOWERDOWN_EXIT, this );
}
-
-/**
-Called by NotifyMediaPresent() and NotifyMediaChange() to ensure the media is in the correct state
-*/
-void DPrimaryMediaBase::MediaChange()
- {
- // Media has been inserted, so we need to cancel any outstanding requests and
- // ensure that the partition info is read again
- TInt state = iState;
-
- __ASSERT_DEBUG(iBody, LOCM_FAULT());
-
-#ifdef __DEMAND_PAGING__
- iBody->iMediaChanges++;
-
- // As data paging media never close, need to ensure the media driver cancels
- // any requests it owns as the stack may be powered down by DPBusPrimaryMedia::ForceMediaChange().
- // DMediaDriver::NotifyPowerDown() should do this
- if (DataPagingMedia(this))
- NotifyPowerDown();
-#endif
-
- // complete any outstanding requests with KErrNotReady
- // and any force media change requests with KErrNone
- SetClosed(KErrNotReady);
-
- // close all media drivers on this device
- if (state>=EOpening)
- {
- CloseMediaDrivers();
- }
- }
-
EXPORT_C void DPrimaryMediaBase::NotifyMediaPresent()
/**
Notifies clients of a media change by calling NotifyClients ( ) function to indicate that media is present.
*/
{
OstTraceFunctionEntry1( DPRIMARYMEDIABASE_NOTIFYMEDIAPRESENT_ENTRY, this );
- __KTRACE_OPT(KLOCDRV,Kern::Printf("DPrimaryMediaBase(%d)::NotifyMediaPresent state %d",iMediaId,iState));
-
- // This should only be called in the context of the media thread
- __ASSERT_ALWAYS(NKern::CurrentThread() == iDfcQ->iThread, LOCM_FAULT());
-
- MediaChange();
-
- NotifyClients(EMediaPresent);
+ NotifyClients(ETrue);
OstTraceFunctionExit1( DPRIMARYMEDIABASE_NOTIFYMEDIAPRESENT_EXIT, this );
}
@@ -3875,10 +3586,10 @@
TInt id=iMediaId; // start with primary media
TInt partitionsOnThisMedia=PartitionCount();
TInt partition=0;
-
- TDriveIterator driveIter;
- for (TLocDrv* pD = driveIter.NextDrive(); pD != NULL; pD = driveIter.NextDrive())
+ TInt j;
+ for (j=0; j<KMaxLocalDrives; j++)
{
+ TLocDrv* pD=TheDrives[j];
if (pD && pD->iPrimaryMedia==this)
{
if (totalPartitions==0)
@@ -3915,19 +3626,15 @@
void DPrimaryMediaBase::RequestCountInc()
{
__ASSERT_DEBUG(iBody, LOCM_FAULT());
- if (iBody->iPagingDevice)
+ TInt oldVal = (TInt) __e32_atomic_add_ord32(&iBody->iRequestCount, (TUint) 1);
+//Kern::Printf("RCINC: this %x cnt %d, old %d", this, iBody->iRequestCount, oldVal);
+
+ OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_REQUESTCOUNTINC, "new count=%d; old count=%d", iBody->iRequestCount, oldVal );
+
+ if (oldVal == 0 && iBody->iPagingDevice)
{
- NFastMutex* lock = iBody->iPagingDevice->NotificationLock();
- NKern::FMWait(lock);
- TInt oldVal = iBody->iRequestCount++;
- //Kern::Printf("RCINC: this %x cnt %d, old %d", this, iBody->iRequestCount, oldVal);
- OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_REQUESTCOUNTINC, "new count=%d; old count=%d", iBody->iRequestCount, oldVal );
- if (oldVal == 0)
- {
- //Kern::Printf("RCINC: NotifyBusy()");
- iBody->iPagingDevice->NotifyBusy();
- }
- NKern::FMSignal(lock);
+//Kern::Printf("RCINC: NotifyBusy()");
+ iBody->iPagingDevice->NotifyBusy();
}
}
@@ -3939,21 +3646,17 @@
void DPrimaryMediaBase::RequestCountDec()
{
__ASSERT_DEBUG(iBody, LOCM_FAULT());
- if (iBody->iPagingDevice)
+ TInt oldVal = (TInt) __e32_atomic_add_ord32(&iBody->iRequestCount, (TUint) -1);
+//Kern::Printf("RCDEC: this %x cnt %d, old %d", this, iBody->iRequestCount, oldVal);
+
+ OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_REQUESTCOUNTDEC, "new count=%d; old count=%d", iBody->iRequestCount, oldVal );
+
+ if (oldVal == 1 && iBody->iPagingDevice)
{
- NFastMutex* lock = iBody->iPagingDevice->NotificationLock();
- NKern::FMWait(lock);
- TInt oldVal = iBody->iRequestCount--;
- //Kern::Printf("RCDEC: this %x cnt %d, old %d", this, iBody->iRequestCount, oldVal);
- OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DPRIMARYMEDIABASE_REQUESTCOUNTDEC, "new count=%d; old count=%d", iBody->iRequestCount, oldVal );
- if (oldVal == 1)
- {
- //Kern::Printf("RCDEC: NotifyIdle()");
- iBody->iPagingDevice->NotifyIdle();
- }
- NKern::FMSignal(lock);
- __ASSERT_DEBUG(iBody->iRequestCount >= 0, LOCM_FAULT());
+//Kern::Printf("RCDEC: NotifyIdle()");
+ iBody->iPagingDevice->NotifyIdle();
}
+ __ASSERT_DEBUG(iBody->iRequestCount >= 0, LOCM_FAULT());
}
#endif // __DEMAND_PAGING__
@@ -4254,7 +3957,7 @@
TInt retVal = KErrGeneral;
for (TInt i=0; retVal != KErrNone && i < KPageInRetries; i++)
{
- m.Flags() = TLocDrvRequest::EKernelBuffer | TLocDrvRequest::EPaging;
+ m.Flags() = TLocDrvRequest::EPaging;
TLocDrv* pL=NULL;
if(aDrvNumber == EDriveRomPaging) // ROM paging
{
@@ -4293,7 +3996,7 @@
m.Id() = DMediaPagingDevice::ECodePageInRequest;
m.Flags() |= TLocDrvRequest::ECodePaging;
pL=TheDrives[aDrvNumber];
- __ASSERT_DEBUG(pL && TDriveIterator::GetDrive(aDrvNumber, iPrimaryMedia) ,LOCM_FAULT()); // valid drive number?
+ __ASSERT_DEBUG(pL&&(pL->iPrimaryMedia==iPrimaryMedia),LOCM_FAULT()); // valid drive number?
m.Drive()=pL;
#ifdef __DEMAND_PAGING_BENCHMARKS__
__e32_atomic_add_ord32(&iMediaPagingInfo.iCodePageInCount, (TUint) 1);
@@ -4431,8 +4134,7 @@
TInt retVal = KErrGeneral;
for (TInt i=0; retVal != KErrNone && i < KPageOutRetries; i++)
{
- m.Flags() = TLocDrvRequest::EKernelBuffer |
- TLocDrvRequest::EPaging |
+ m.Flags() = TLocDrvRequest::EPaging |
TLocDrvRequest::EDataPaging |
(aBackground ? TLocDrvRequest::EBackgroundPaging : 0) |
(aPhysAddr ? TLocDrvRequest::EPhysAddrOnly : 0);
@@ -4533,7 +4235,7 @@
TLocDrvRequest& m=*(TLocDrvRequest*)(aReq);
- m.Flags() = TLocDrvRequest::EKernelBuffer | TLocDrvRequest::EPaging | TLocDrvRequest::EDataPaging;
+ m.Flags() = TLocDrvRequest::EPaging | TLocDrvRequest::EDataPaging;
m.Id() = DLocalDrive::EDeleteNotify;
m.Drive() = TheDrives[iDataPagingDriveNumber];
@@ -4566,6 +4268,7 @@
}
+
EXPORT_C TInt TLocDrvRequest::WriteToPageHandler(const TAny* aSrc, TInt aSize, TInt anOffset)
{
OstTraceFunctionEntry1( TLOCDRVREQUEST_WRITETOPAGEHANDLER_ENTRY, this );
@@ -4753,28 +4456,6 @@
OstTraceFunctionExit1( DMEDIADRIVER_SETTOTALSIZEINBYTES_EXIT, this );
}
-/**
-For non NAND devices, i.e. devices which don't set TLocalDriveCapsV4::iNumOfBlocks,
-set iSectorSizeInBytes, iNumberOfSectors & iNumPagesPerBlock appropriately to allow
-TLocalDriveCapsV4::MediaSizeInBytes() to correctly return the media size
-
-Media drivers should call this when they receive a DLocalDrive::ECaps request
-*/
-EXPORT_C void DMediaDriver::SetTotalSizeInBytes(TLocalDriveCapsV4& aCaps)
- {
- if (aCaps.iNumOfBlocks == 0)
- {
- aCaps.iSectorSizeInBytes = 512;
- aCaps.iNumPagesPerBlock = 1; // ...to ensure compatibility with NAND semantics
- Int64 numberOfSectors = iTotalSizeInBytes >> 9;
- while (I64HIGH(numberOfSectors) > 0)
- {
- aCaps.iNumPagesPerBlock<<= 1;
- numberOfSectors>>= 1;
- }
- aCaps.iNumberOfSectors = I64LOW(numberOfSectors);
- }
- }
@@ -5004,27 +4685,39 @@
{
OstTraceFunctionEntry0( LOCDRV_REGISTERMEDIADEVICE_ENTRY );
// Create TLocDrv / DMedia objects to handle a media device
- __KTRACE_OPT(KBOOT,Kern::Printf("RegisterMediaDevice %S dev=%1d #drives=%d 1st=%d PM=%08x #media=%d",&aName,aDevice,aDriveCount,*aDriveList,aPrimaryMedia,aNumMedia));
+ __KTRACE_OPT(KBOOT,Kern::Printf("RegisterMediaDevice %lS dev=%1d #drives=%d 1st=%d PM=%08x #media=%d",&aName,aDevice,aDriveCount,*aDriveList,aPrimaryMedia,aNumMedia));
OstTraceExt5( TRACE_INTERNALS, LOCDRV_REGISTERMEDIADEVICE1, "aDevice=%d; aDriveCount=%d; aDriveList=%d; aPrimaryMedia=0x%08x; aNumMedia=%d", (TInt) aDevice, (TInt) aDriveCount, (TInt) *aDriveList, (TUint) aPrimaryMedia, (TInt) aNumMedia );
-
+
+ const TInt* p=aDriveList;
+ TInt i;
+ TInt r=0;
if (UsedMedia+aNumMedia>KMaxLocalDrives)
{
OstTrace0(TRACE_FLOW, LOCDRV_REGISTERMEDIADEVICE_EXIT1, "< KErrInUse");
return KErrInUse;
+ }
+ for (i=0; i<aDriveCount; ++i)
+ {
+ TInt drv = *p++;
+ // -1 means not used; this is to enable Dual-slot MMC support
+ if (drv == -1)
+ continue;
+ __KTRACE_OPT(KBOOT,Kern::Printf("Registering drive %d", drv));
+ OstTrace1( TRACE_INTERNALS, LOCDRV_REGISTERMEDIADEVICE2, "Registering drive=%d", drv );
+ if (TheDrives[drv])
+ {
+ __KTRACE_OPT(KBOOT,Kern::Printf("Drive %d already in use", drv));
+ OstTrace1( TRACE_FLOW, LOCDRV_REGISTERMEDIADEVICE_EXIT2, "< Drive %d already in use; KErrInUse", drv);
+ return KErrInUse;
+ }
}
-
- // make a local copy of the name
HBuf* pN=HBuf::New(aName);
if (!pN)
{
OstTrace0(TRACE_FLOW, LOCDRV_REGISTERMEDIADEVICE_EXIT3, "< KErrNoMemory");
return KErrNoMemory;
- }
-
- // Register the primary media and any secondary media
- TInt lastMedia = UsedMedia+aNumMedia-1;
- TInt i;
- TInt r=0;
+ }
+ TInt lastMedia=UsedMedia+aNumMedia-1;
for (i=UsedMedia; i<=lastMedia; ++i)
{
if (i==UsedMedia)
@@ -5045,88 +4738,29 @@
return r;
}
}
+
__KTRACE_OPT(KBOOT,Kern::Printf("FirstMedia %d LastMedia %d",UsedMedia,lastMedia));
OstTraceExt2( TRACE_INTERNALS, LOCDRV_REGISTERMEDIADEVICE4, "FirstMedia=%d; LastMedia=%d", UsedMedia, lastMedia );
UsedMedia+=aNumMedia;
-
- if (__IS_EXTENSION(aDevice))
- aPrimaryMedia->iBody->iMediaExtension = ETrue;
-
- // Register the drives
- const TInt* p=aDriveList;
+ p=aDriveList;
for (i=0; i<aDriveCount; ++i)
{
- TInt drv = *p++;
- // -1 means not used; this is to enable Dual-slot MMC support
+ TInt drv=*p++;
if (drv == -1)
continue;
-
- __KTRACE_OPT(KBOOT,Kern::Printf("Registering drive %d", drv));
- if (!__IS_EXTENSION(aDevice) && TheDrives[drv])
- {
- __KTRACE_OPT(KBOOT,Kern::Printf("Drive %d already in use", drv));
- return KErrInUse;
- }
- else if (__IS_EXTENSION(aDevice) && !TheDrives[drv])
- {
- __KTRACE_OPT(KBOOT,Kern::Printf("Drive %d not initialized", drv));
- return KErrNotReady;
- }
-
- TLocDrv* pNewDrive = new TLocDrv(drv);
- if (!pNewDrive)
- {
+ TLocDrv* pL=new TLocDrv(drv);
+ if (!pL)
+ {
OstTrace0(TRACE_FLOW, LOCDRV_REGISTERMEDIADEVICE_EXIT6, "< KErrNoMemory");
return KErrNoMemory;
- }
-
-
- TLocDrv* pOldDrive = TheDrives[drv];
- aPrimaryMedia->iBody->iRegisteredDriveMask|= (0x1 << drv);
- pNewDrive->iNextDrive = pOldDrive;
-
- TheDrives[drv] = pNewDrive;
- DriveNames[drv] = pN;
- pNewDrive->iPrimaryMedia = aPrimaryMedia;
-
-
- if (pOldDrive)
- {
- TInt r = pOldDrive->iPrimaryMedia->Connect(pNewDrive);
- if (r != KErrNone)
- return r;
-
-#ifdef __DEMAND_PAGING__
- // If we've hooked a drive letter which is being used for ROM paging by a media driver
- // which does not report the ROM partition, then we need to change iFirstLocalDriveNumber
- // so that ROM page-in requests go directly to that driver
- DMediaPagingDevice* oldPagingDevice = pOldDrive->iPrimaryMedia->iBody->iPagingDevice;
- if (oldPagingDevice &&
- (oldPagingDevice->iType & DPagingDevice::ERom) &&
- oldPagingDevice->iRomPagingDriveNumber == KErrNotFound &&
- oldPagingDevice->iFirstLocalDriveNumber == drv)
- {
- __KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("TRACE: hooking ROM paging device with no defined ROM partition"));
- TInt n;
- for (n=0; n<KMaxLocalDrives; ++n)
- {
- if(TheDrives[n] && TheDrives[n]->iPrimaryMedia == pOldDrive->iPrimaryMedia)
- {
- __KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("TRACE: Changing iFirstLocalDriveNumber from %d to %d", oldPagingDevice->iFirstLocalDriveNumber, n));
- oldPagingDevice->iFirstLocalDriveNumber = n;
- break;
- }
- }
- __ASSERT_ALWAYS(n < KMaxLocalDrives, LOCM_FAULT());
- }
-#endif
-
- }
-
- __KTRACE_OPT(KBOOT,Kern::Printf("Drive %d: TLocDrv @ %08x",drv,pNewDrive));
+ }
+ TheDrives[drv]=pL;
+ DriveNames[drv]=pN;
+ pL->iPrimaryMedia=aPrimaryMedia;
+ __KTRACE_OPT(KBOOT,Kern::Printf("Drive %d: TLocDrv @ %08x",drv,pL));
+ OstTraceExt2( TRACE_INTERNALS, LOCDRV_REGISTERMEDIADEVICE5, "Drive=%d; TLocDrv 0x%08x;", (TInt) drv, (TUint) pL );
}
-
OstTraceFunctionExit0( LOCDRV_REGISTERMEDIADEVICE_EXIT7 );
return KErrNone;
}
@@ -5211,12 +4845,11 @@
EXPORT_C TInt LocDrv::RegisterPagingDevice(DPrimaryMediaBase* aPrimaryMedia, const TInt* aPagingDriveList, TInt aDriveCount, TUint aPagingType, TInt aReadShift, TUint aNumPages)
{
OstTraceFunctionEntry0( LOCDRV_REGISTERPAGINGDEVICE_ENTRY );
-// SETDEBUGFLAG(KLOCDPAGING);
__KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf(">RegisterPagingDevice: paging type=%d PM=0x%x read shift=%d",aPagingType,aPrimaryMedia,aReadShift));
OstTraceDefExt3( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, LOCDRV_REGISTERPAGINGDEVICE1, "aPagingType=%d; aPrimaryMedia=0x%x; aReadShift=%d", (TInt) aPagingType, (TUint) aPrimaryMedia, (TInt) aReadShift);
- TInt i = 0;
+ TInt i;
if(!aPagingType || (aPagingType&~(DPagingDevice::ERom | DPagingDevice::ECode | DPagingDevice::EData)))
{
@@ -5225,24 +4858,19 @@
return KErrArgument;
}
-
- // Check for duplicate drives
- if (!aPrimaryMedia->iBody->iMediaExtension)
+ for(i=0; i<KMaxLocalDrives; i++)
{
- for(i=0; i<KMaxLocalDrives; i++)
+ if (ThePagingDevices[i] == NULL)
+ continue;
+ if ((ThePagingDevices[i]->iType&DPagingDevice::ERom) && (aPagingType & DPagingDevice::ERom))
{
- if (ThePagingDevices[i] == NULL)
- continue;
- if ((ThePagingDevices[i]->iType&DPagingDevice::ERom) && (aPagingType & DPagingDevice::ERom))
- {
- aPagingType&=~DPagingDevice::ERom; // already have a ROM paging device
- __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Already has ROM pager on locdrv no %d",i));
- }
- if ((ThePagingDevices[i]->iType&DPagingDevice::EData) && (aPagingType & DPagingDevice::EData))
- {
- aPagingType&=~DPagingDevice::EData; // already have a Data paging device
- __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Already has Data pager on locdrv no %d",i));
- }
+ aPagingType&=~DPagingDevice::ERom; // already have a ROM paging device
+ __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Already has ROM pager on locdrv no %d",i));
+ }
+ if ((ThePagingDevices[i]->iType&DPagingDevice::EData) && (aPagingType & DPagingDevice::EData))
+ {
+ aPagingType&=~DPagingDevice::EData; // already have a Data paging device
+ __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("Already has Data pager on locdrv no %d",i));
}
}
@@ -5325,16 +4953,12 @@
// Send an ECaps message to wake up the media driver & ensure all partitions are
// reported, then search for paged-data or paged-ROM partitions
- // NB: older media drivers supporting ROM and/or code paging only may not have started their DFC queues,
- // so for these media drivers, use the first local drive supported for ROM-pagin-in requests and
- // assume the media driver itself will adjust the request position internally to match the ROM partition
- // @see DMediaPagingDevice::Read()
if ((aPagingType & DPagingDevice::EData) ||
(aPagingType & DPagingDevice::ERom && aPrimaryMedia->iDfcQ && aPrimaryMedia->iMsgQ.iReady))
{
// the message queue must have been started already (by the media driver calling iMsgQ.Receive())
- // otherwise we can't send the DLocalDrive::ECaps request
- if (!aPrimaryMedia->iDfcQ || !aPrimaryMedia->iMsgQ.iReady)
+ // otherwise we can't send the DLocalDrive::EQueryDevice request
+ if (aPrimaryMedia->iDfcQ && !aPrimaryMedia->iMsgQ.iReady)
{
__KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: Message queue not started"));
OstTrace0(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT8, "< RegisterPagingDevice: Message queue not started; KErrNotReady");
@@ -5369,7 +4993,7 @@
if (r != KErrNone)
{
- OstTrace1(TRACE_FLOW, LOCRV_REGISTERPAGINGDEVICE_EXIT9, "< retval=%d",r);
+ OstTrace1(TRACE_FLOW, LOCRV_REGISTERPAGINGDEVICE_EXIT9, "< Caps::retval=%d - return KErrNotSupported",r);
// Media driver failure; media maybe recoverable after boot.
// Can't register any page drives so return not supported.
return KErrNotSupported;
@@ -5384,25 +5008,20 @@
drive = TheDrives[i];
if(drive && drive->iPrimaryMedia == aPrimaryMedia)
{
- __KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("RegisterPagingDevice: local drive %d, partition type %x base %lx size %lx name %S", i, drive->iPartitionType, drive->iPartitionBaseAddr, drive->iPartitionLen, DriveNames[i] ? DriveNames[i] : &KNullDesC8));
+ __KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("RegisterPagingDevice: local drive %d, partition type %x size %x", i, drive->iPartitionType, I64LOW(drive->iPartitionLen)));
// ROM partition ?
- if ((romPagingDriveNumber == KErrNotFound) &&
- (drive->iPartitionType == KPartitionTypeROM) &&
- (aPagingType & DPagingDevice::ERom))
+ if ((romPagingDriveNumber == KErrNotFound) && (drive->iPartitionType == KPartitionTypeROM))
{
__KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("Found ROM partition on local drive %d, size %x", i, I64LOW(drive->iPartitionLen)));
OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, LOCDRV_REGISTERPAGINGDEVICE5, "Found ROM partition on local drive=%d; size=0x%x", (TInt) i, (TUint) I64LOW(drive->iPartitionLen));
romPagingDriveNumber = i;
}
// swap partition ?
- else if ((dataPagingDriveNumber == KErrNotFound) &&
- (drive->iPartitionType == KPartitionTypePagedData) &&
- (aPagingType & DPagingDevice::EData))
+ else if ((dataPagingDriveNumber == KErrNotFound) && (drive->iPartitionType == KPartitionTypePagedData))
{
__KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("Found swap partition on local drive %d, size %x", i, I64LOW(drive->iPartitionLen)));
OstTraceDefExt2( OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, LOCDRV_REGISTERPAGINGDEVICE6, "Found SWAP partition on local drive=%d; size=0x%x", (TInt) i, (TUint) I64LOW(drive->iPartitionLen) );
dataPagingDriveNumber = i;
- TheDataPagingDrive = drive;
swapSize = drive->iPartitionLen >> aReadShift;
// Mark Paging Device capable of utilising physical addresss only accesses
@@ -5432,9 +5051,7 @@
}
pagingDevice->iType = aPagingType;
- if (aPrimaryMedia->iBody->iMediaExtension)
- pagingDevice->iType|= DPagingDevice::EMediaExtension;
-
+ pagingDevice->iFlags = flags;
pagingDevice->iReadUnitShift = aReadShift;
pagingDevice->iFirstLocalDriveNumber = firstLocalDriveNumber;
@@ -5447,14 +5064,13 @@
#ifdef __DEBUG_DEMAND_PAGING__
Kern::Printf("PagingDevice :");
- Kern::Printf("Name %S", firstLocalDriveNumber >= 0 && DriveNames[firstLocalDriveNumber] ? DriveNames[firstLocalDriveNumber] : &KNullDesC8);
- Kern::Printf("iType 0x%x", pagingDevice->iType);
+ Kern::Printf("iType 0x%x\n", pagingDevice->iType);
Kern::Printf("iFlags 0x%x\n", pagingDevice->iFlags);
- Kern::Printf("iReadUnitShift 0x%x", pagingDevice->iReadUnitShift);
- Kern::Printf("iFirstLocalDriveNumber 0x%x", pagingDevice->iFirstLocalDriveNumber);
- Kern::Printf("iRomPagingDriveNumber 0x%x", pagingDevice->iRomPagingDriveNumber);
- Kern::Printf("iDataPagingDriveNumber 0x%x", pagingDevice->iDataPagingDriveNumber);
- Kern::Printf("iSwapSize 0x%x", pagingDevice->iSwapSize);
+ Kern::Printf("iReadUnitShift 0x%x\n", pagingDevice->iReadUnitShift);
+ Kern::Printf("iFirstLocalDriveNumber 0x%x\n", pagingDevice->iFirstLocalDriveNumber);
+ Kern::Printf("iRomPagingDriveNumber 0x%x\n", pagingDevice->iRomPagingDriveNumber);
+ Kern::Printf("iDataPagingDriveNumber 0x%x\n", pagingDevice->iDataPagingDriveNumber);
+ Kern::Printf("iSwapSize 0x%x\n", pagingDevice->iSwapSize);
Kern::Printf("iPreferredWriteShift 0x%x\n", pagingDevice->iPreferredWriteShift);
#endif
@@ -5476,38 +5092,24 @@
if(aPagingType & DPagingDevice::ECode)
{
for (i=0; i<aDriveCount; ++i)
- pagingDevice->iDrivesSupported |= (0x1<<aPagingDriveList[i]);
+ pagingDevice->iDrivesSupported|=(0x1<<aPagingDriveList[i]);
}
pagingDevice->iName = DeviceName[aPagingType];
- // If ThePinObjectAllocator has already been created with a smaller number of pages,
- // delete it & then re-create it
- __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: ThePinObjectAllocator %x", ThePinObjectAllocator));
- if (ThePinObjectAllocator && ThePinObjectAllocator->iFragmentGranularity < Kern::RoundToPageSize(1) * aNumPages)
- {
- __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: Recreating ThePinObjectAllocator..."));
- delete ThePinObjectAllocator;
- ThePinObjectAllocator = NULL;
- }
-
-
- TInt r;
if (ThePinObjectAllocator == NULL)
+ ThePinObjectAllocator = new DPinObjectAllocator();
+ if(!ThePinObjectAllocator)
{
- ThePinObjectAllocator = new DPinObjectAllocator();
- if(!ThePinObjectAllocator)
- {
- __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: could not create ThePinObjectAllocator"));
- OstTrace0(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT11, "RegisterPagingDevice: could not create ThePinObjectAllocator; KErrNoMemory");
- return KErrNoMemory;
- }
- r = ThePinObjectAllocator->Construct(KDynamicPagingLockCount, aNumPages);
- if (r != KErrNone)
- {
- __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: could not construct ThePinObjectAllocator"));
- OstTrace1(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT12, "< RegisterPagingDevice: could not construct ThePinObjectAllocator; retval=%d",r);
- return r;
- }
+ __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: could not create ThePinObjectAllocator"));
+ OstTrace0(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT11, "RegisterPagingDevice: could not create ThePinObjectAllocator; KErrNoMemory");
+ return KErrNoMemory;
+ }
+ TInt r = ThePinObjectAllocator->Construct(KDynamicPagingLockCount, aNumPages);
+ if (r != KErrNone)
+ {
+ __KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("RegisterPagingDevice: could not construct ThePinObjectAllocator"));
+ OstTrace1(TRACE_FLOW, LOVDRV_REGISTERPAGINGDEVICE_EXIT12, "< RegisterPagingDevice: could not construct ThePinObjectAllocator; retval=%d",r);
+ return r;
}
@@ -5537,14 +5139,7 @@
for (i=0; i<aDriveCount; ++i)
{
TLocDrv* pD=TheDrives[*p++];
- pD->iPagingDrv = 1;
- // mark all attached drives as pageable too - this is really
- // only to avoid hitting an ASSERT in DMediaDriver::Complete()
- while (pD->iNextDrive)
- {
- pD->iNextDrive->iPagingDrv = 1;
- pD = pD->iNextDrive;
- }
+ pD->iPagingDrv=1;
}
}
@@ -5588,7 +5183,6 @@
__KTRACE_OPT2(KBOOT,KLOCDPAGING,Kern::Printf("< RegisterPagingDevice"));
OstTraceFunctionExit0( LOCDRV_REGISTERPAGINGDEVICE_EXIT14 );
-// CLRDEBUGFLAG(KLOCDPAGING);
return KErrNone;
}
@@ -5664,7 +5258,6 @@
TLocDrv* pL=TheDrives[i];
if (pL)
{
- pL = TDriveIterator::GetPhysicalDrive(TheDrives[i]);
++drives;
TInt sockNum;
DPrimaryMediaBase* pM=pL->iPrimaryMedia;
@@ -5673,7 +5266,7 @@
if (!(sock_mask & (1<<sockNum)))
{
info.iSocketName[sockNum]=*DriveNames[i];
- __KTRACE_OPT(KLOCDRV,Kern::Printf("Socket %d device %d name %S", sockNum, pM->iDevice, DriveNames[i]));
+ __KTRACE_OPT(KLOCDRV,Kern::Printf("Socket %d device %d name %lS", sockNum, pM->iDevice, DriveNames[i]));
OstTraceExt2( TRACE_INTERNALS, GETDRIVEINFO1, "Socket=%d; device=%d", sockNum, (TUint) pM->iDevice );
if ( (sockNum + 1) > sockets )
sockets = sockNum + 1;
@@ -5681,7 +5274,7 @@
sock_mask |= (1<<sockNum);
}
info.iDriveName[i]=*DriveNames[i];
- __KTRACE_OPT(KLOCDRV,Kern::Printf("Drive %d device %d name %S",i,pM->iDevice,DriveNames[i]));
+ __KTRACE_OPT(KLOCDRV,Kern::Printf("Drive %d device %d name %lS",i,pM->iDevice,DriveNames[i]));
OstTraceExt2( TRACE_INTERNALS, GETDRIVEINFO2, "Drive=%d; device=%d", i, (TUint) pM->iDevice );
info.iRegisteredDriveBitmask |= (0x01 << i);
@@ -5804,7 +5397,11 @@
#if defined(__DEMAND_PAGING__) && defined(__CONCURRENT_PAGING_INSTRUMENTATION__)
case EMediaHalGetROMConcurrencyInfo:
{
- DMediaPagingDevice* device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::ERom);
+ TInt drvNo=(TInt)a1;
+ TLocDrv* drv=TheDrives[drvNo];
+ if(!drv)
+ break;
+ DMediaPagingDevice* device = drv->iPrimaryMedia->iBody->iPagingDevice;
if(!device)
break;
NKern::FMWait(&device->iInstrumentationLock);
@@ -5816,7 +5413,11 @@
}
case EMediaHalGetCodeConcurrencyInfo:
{
- DMediaPagingDevice* device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::ECode);
+ TInt drvNo=(TInt)a1;
+ TLocDrv* drv=TheDrives[drvNo];
+ if(!drv)
+ break;
+ DMediaPagingDevice* device=drv->iPrimaryMedia->iBody->iPagingDevice;
if(!device)
break;
NKern::FMWait(&device->iInstrumentationLock);
@@ -5828,7 +5429,11 @@
}
case EMediaHalGetDataConcurrencyInfo:
{
- DMediaPagingDevice* device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::EData);
+ TInt drvNo=(TInt)a1;
+ TLocDrv* drv=TheDrives[drvNo];
+ if(!drv)
+ break;
+ DMediaPagingDevice* device = drv->iPrimaryMedia->iBody->iPagingDevice;
if(!device)
break;
NKern::FMWait(&device->iInstrumentationLock);
@@ -5840,20 +5445,17 @@
}
case EMediaHalResetConcurrencyInfo:
{
+ TInt drvNo=(TInt)a1;
+ TLocDrv* drv=TheDrives[drvNo];
+ if(!drv)
+ break;
+ DMediaPagingDevice* device=drv->iPrimaryMedia->iBody->iPagingDevice;
+ if(!device)
+ break;
TUint index=(TInt)a2;
if(index>EMediaPagingStatsCode)
break;
-
- DMediaPagingDevice* device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::ERom);
- if (device)
- ResetConcurrencyStats(device, (TMediaPagingStats)index);
- device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::ECode);
- if (device)
- ResetConcurrencyStats(device, (TMediaPagingStats)index);
- device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::EData);
- if (device)
- ResetConcurrencyStats(device, (TMediaPagingStats)index);
-
+ ResetConcurrencyStats(device, (TMediaPagingStats)index);
r=KErrNone;
break;
}
@@ -5861,7 +5463,11 @@
#if defined(__DEMAND_PAGING__) && defined(__DEMAND_PAGING_BENCHMARKS__)
case EMediaHalGetROMPagingBenchmark:
{
- DMediaPagingDevice* device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::ERom);
+ TInt drvNo=(TInt)a1;
+ TLocDrv* drv=TheDrives[drvNo];
+ if(!drv)
+ break;
+ DMediaPagingDevice* device=drv->iPrimaryMedia->iBody->iPagingDevice;
if(!device)
break;
NKern::FMWait(&device->iInstrumentationLock);
@@ -5873,7 +5479,11 @@
}
case EMediaHalGetCodePagingBenchmark:
{
- DMediaPagingDevice* device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::ECode);
+ TInt drvNo=(TInt)a1;
+ TLocDrv* drv=TheDrives[drvNo];
+ if(!drv)
+ break;
+ DMediaPagingDevice* device=drv->iPrimaryMedia->iBody->iPagingDevice;
if(!device)
break;
NKern::FMWait(&device->iInstrumentationLock);
@@ -5885,7 +5495,11 @@
}
case EMediaHalGetDataInPagingBenchmark:
{
- DMediaPagingDevice* device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::EData);
+ TInt drvNo=(TInt)a1;
+ TLocDrv* drv=TheDrives[drvNo];
+ if(!drv)
+ break;
+ DMediaPagingDevice* device=drv->iPrimaryMedia->iBody->iPagingDevice;
if(!device)
break;
NKern::FMWait(&device->iInstrumentationLock);
@@ -5897,7 +5511,11 @@
}
case EMediaHalGetDataOutPagingBenchmark:
{
- DMediaPagingDevice* device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::EData);
+ TInt drvNo=(TInt)a1;
+ TLocDrv* drv=TheDrives[drvNo];
+ if(!drv)
+ break;
+ DMediaPagingDevice* device=drv->iPrimaryMedia->iBody->iPagingDevice;
if(!device)
break;
NKern::FMWait(&device->iInstrumentationLock);
@@ -5909,26 +5527,27 @@
}
case EMediaHalResetPagingBenchmark:
{
+ TInt drvNo=(TInt)a1;
+ TLocDrv* drv=TheDrives[drvNo];
+ if(!drv)
+ break;
+ DMediaPagingDevice* device=drv->iPrimaryMedia->iBody->iPagingDevice;
+ if(!device)
+ break;
TUint index=(TInt)a2;
if(index>EMediaPagingStatsCode)
break;
-
- DMediaPagingDevice* device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::ERom);
- if (device)
- ResetBenchmarkStats(device, (TMediaPagingStats)index);
- device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::ECode);
- if (device)
- ResetBenchmarkStats(device, (TMediaPagingStats)index);
- device = TDriveIterator::PagingDevice((TInt)a1, DPagingDevice::EData);
- if (device)
- ResetBenchmarkStats(device, (TMediaPagingStats)index);
-
+ ResetBenchmarkStats(device, (TMediaPagingStats)index);
r=KErrNone;
break;
}
case EMediaHalGetPagingInfo:
{
- DMediaPagingDevice* device = TDriveIterator::PagingDevice((TInt)a1, (DPagingDevice::TType) 0xFF);
+ TInt drvNo=(TInt)a1;
+ TLocDrv* drv=TheDrives[drvNo];
+ if(!drv)
+ break;
+ DMediaPagingDevice* device=drv->iPrimaryMedia->iBody->iPagingDevice;
if(!device)
break;
NKern::FMWait(&device->iInstrumentationLock);
@@ -6168,317 +5787,6 @@
/******************************************************************************
- DMediaDriverExtension base class
- ******************************************************************************/
-
-EXPORT_C DMediaDriverExtension::DMediaDriverExtension(TInt aMediaId) :
- DMediaDriver(aMediaId)
- {
- }
-
-/**
-*/
-EXPORT_C DMediaDriverExtension::~DMediaDriverExtension()
- {
- }
-
-/**
-Closes the media driver.
-
-This default implementation simply deletes this DMediaDriverExtension object.
-
-Media drivers can provide their own implementation, which gives them
-the opportunity to clean up resources before closure; for example,
-cancelling a DFC.
-Any replacement function must call this base class function as
-the last instruction.
-*/
-EXPORT_C void DMediaDriverExtension::Close()
- {
- DMediaDriver::Close();
- }
-
-/**
-DoDrivePartitionInfo()
-
-Fills out the passed TPartitionInfo object with information from the attached drives
-*/
-EXPORT_C TInt DMediaDriverExtension::DoDrivePartitionInfo(TPartitionInfo& aInfo)
- {
- memclr(&aInfo, sizeof(aInfo));
- aInfo.iPartitionCount = 0;
- aInfo.iMediaSizeInBytes = 0;
-
- TDriveIterator driveIter;
- for (TLocDrv* drv = driveIter.NextDrive(); drv != NULL; drv = driveIter.NextDrive())
- {
- if (drv && drv->iPrimaryMedia == iPrimaryMedia)
- {
- TLocDrv* attachedDrive = drv->iNextDrive;
- __ASSERT_DEBUG(attachedDrive, LOCM_FAULT());
- TLocDrvRequest m;
- memclr(&m, sizeof(m));
-
- // Get the Caps from the device. NB for MMC/SD we may need to retry as there may have been an earlier
- // EForceMediaChange request which can result in the cancellation of requests already in the queue
- TBuf8<KMaxLocalDriveCapsLength> capsBuf;
- TInt i;
- const TInt KRetries = 5;
- TInt r = KErrNotReady;
- for (i=0; r == KErrNotReady && i < KRetries; i++)
- {
- capsBuf.SetMax();
- capsBuf.FillZ();
- m.Drive() = attachedDrive;
- m.Id() = DLocalDrive::ECaps;
- m.RemoteDes() = (TAny*)capsBuf.Ptr();
- m.Length() = KMaxLocalDriveCapsLength;
- r = attachedDrive->iPrimaryMedia->Request(m);
- }
-
- __KTRACE_OPT2(KBOOT,KLOCDPAGING, Kern::Printf("DMediaDriverExtension::PartitionInfo(ECaps: i %d: r %d ", driveIter.Index(), r));
-
- // NB The ECaps call might legitimately fail if one of the attached drives is removable
- // If this happens, just ignore & proceed to the next attached drive
- if (r == KErrNone)
- {
- aInfo.iEntry[aInfo.iPartitionCount] = *attachedDrive;
- // Set the media size to be that of the largest attached media
- // This is only needed to ensure that the test in TLocDrvRequest::CheckAndAdjustForPartition()
- // with the ELocDrvWholeMedia flag set succeeds: A further check on whether a request's
- // position & length are outside the media will be made when its is delievered to the attached media....
- aInfo.iMediaSizeInBytes = Max(
- aInfo.iMediaSizeInBytes,
- ((TLocalDriveCapsV4*) capsBuf.Ptr())->MediaSizeInBytes());
- }
-
-
- aInfo.iPartitionCount++;
- }
- }
-
- return KErrNone;
- }
-
-/**
-ForwardRequest() -
-
-forwards the request onto the next attached drive in the chain
-*/
-EXPORT_C TInt DMediaDriverExtension::ForwardRequest(TLocDrvRequest& aRequest)
- {
- TLocDrv* drive = aRequest.Drive();
- TLocDrv* attachedDrive = drive->iNextDrive;
- __ASSERT_DEBUG(attachedDrive, LOCM_FAULT());
- aRequest.Drive() = attachedDrive;
-
-
- TInt r = attachedDrive->iPrimaryMedia->HandleMediaNotPresent(aRequest);
- if (r != KErrNone)
- {
- return r;
- }
-
- aRequest.Forward(&attachedDrive->iPrimaryMedia->iMsgQ, EFalse);
- return KErrNone;
- }
-
-
-TInt DMediaDriverExtension::SendRequest(TInt aReqId, TBool aPagingRequest, TInt aDriveNumber, TInt64 aPos, TLinAddr aData, TUint aLen)
- {
- __ASSERT_DEBUG(aLen > 0, LOCM_FAULT());
-
- // Ensure this is a legitimate attached drive registered using LocDrv::RegisterMediaDevice()
- if (!(iPrimaryMedia->iBody->iRegisteredDriveMask & (0x1 << aDriveNumber)))
- return KErrArgument;
-
- TLocDrv* drive = TDriveIterator::GetDrive(aDriveNumber, iPrimaryMedia);
- __ASSERT_DEBUG(drive, LOCM_FAULT());
- TLocDrv* attachedDrive = drive->iNextDrive;
- __ASSERT_DEBUG(attachedDrive, LOCM_FAULT());
-
- TLocDrvRequest request;
- memclr(&request, sizeof(request));
-
- request.Drive() = attachedDrive;
- request.Id() = aReqId;
- request.Length() = aLen;
- request.RemoteDes() = (TAny*) aData;
- request.Pos() = aPos;
- request.Flags() = TLocDrvRequest::EKernelBuffer | TLocDrvRequest::EAdjusted;
-
-#ifdef __DEMAND_PAGING__
- if (aPagingRequest)
- {
- request.Flags()|= TLocDrvRequest::EPaging;
- // If the buffer is page aligned, use SendToMainQueueDfcAndBlock() as this
- // is more efficient if the attached drive use DMA.
- const TInt KPageSizeMask = 4096-1;
- if (aData & KPageSizeMask)
- {
- return attachedDrive->iPrimaryMedia->SendReceive(request, aData);
- }
- else
- {
- attachedDrive->iPrimaryMedia->iBody->iPagingDevice->SendToMainQueueDfcAndBlock(&request);
- return 0;
- }
- }
-#else
- aPagingRequest;
-#endif
-
- return attachedDrive->iPrimaryMedia->SendReceive(request, aData);
- }
-
-
-/**
-Read() -
-
-reads data from the next attached drive in the chain
-
-N.B. The position is assumed to be already adjusted i.e. relative to the start of the
-media, not the partition
-*/
-EXPORT_C TInt DMediaDriverExtension::Read(TInt aDriveNumber, TInt64 aPos, TLinAddr aData, TUint aLen)
- {
- return SendRequest(DLocalDrive::ERead, EFalse, aDriveNumber, aPos, aData, aLen);
- }
-
-/**
-Write() -
-
-writes data to the next attached drive in the chain
-
-N.B. The position is assumed to be already adjusted i.e. relative to the start of the
-media, not the partition
-*/
-EXPORT_C TInt DMediaDriverExtension::Write(TInt aDriveNumber, TInt64 aPos, TLinAddr aData, TUint aLen)
- {
- return SendRequest(DLocalDrive::EWrite, EFalse, aDriveNumber, aPos, aData, aLen);
- }
-
-
-#ifdef __DEMAND_PAGING__
-/**
-ReadPaged() -
-
-Sends a paging read request to the specified attached drive
-
-N.B. The position is assumed to be already adjusted i.e. relative to the start of the
-media, not the partition
-*/
-EXPORT_C TInt DMediaDriverExtension::ReadPaged(TInt aDriveNumber, TInt64 aPos, TLinAddr aData, TUint aLen)
- {
- return SendRequest(DLocalDrive::ERead, ETrue, aDriveNumber, aPos, aData, aLen);
- }
-
-/**
-WritePaged() -
-
-Send a paging write request to the specified attached drive
-
-N.B. The position is assumed to be already adjusted i.e. relative to the start of the
-media, not the partition
-*/
-EXPORT_C TInt DMediaDriverExtension::WritePaged(TInt aDriveNumber, TInt64 aPos, TLinAddr aData, TUint aLen)
- {
- return SendRequest(DLocalDrive::EWrite, ETrue, aDriveNumber, aPos, aData, aLen);
- }
-#endif // __DEMAND_PAGING__
-
-
-
-/**
-Caps() -
-
-gets the caps from the next attached drive in the chain
-
-N.B. The position is assumed to be already adjusted i.e. relative to the start of the
-media, not the partition
-*/
-EXPORT_C TInt DMediaDriverExtension::Caps(TInt aDriveNumber, TDes8& aCaps)
- {
- // Ensure this is a legitimate attached drive registered using LocDrv::RegisterMediaDevice()
- if (!(iPrimaryMedia->iBody->iRegisteredDriveMask & (0x1 << aDriveNumber)))
- return KErrArgument;
-
- TLocDrv* drive = TDriveIterator::GetDrive(aDriveNumber, iPrimaryMedia);
- __ASSERT_DEBUG(drive, LOCM_FAULT());
- TLocDrv* attachedDrive = drive->iNextDrive;
- __ASSERT_DEBUG(attachedDrive, LOCM_FAULT());
-
- TLocDrvRequest request;
- memclr(&request, sizeof(request));
-
- request.Drive() = attachedDrive;
- request.Id() = DLocalDrive::ECaps;
- request.Length() = aCaps.Length();
- request.RemoteDes() = (TAny*) aCaps.Ptr();
-
- return request.SendReceive(&attachedDrive->iPrimaryMedia->iMsgQ);
- }
-
-
-
-EXPORT_C void DMediaDriverExtension::NotifyPowerDown()
- {
- }
-
-EXPORT_C void DMediaDriverExtension::NotifyEmergencyPowerDown()
- {
- }
-
-
-/**
-Returns ETrue if this media - or any media which this TLocDrv is attached to - is busy
-*/
-EXPORT_C TBool DMediaDriverExtension::MediaBusy(TInt aDriveNumber)
- {
- for (TLocDrv* drive = TDriveIterator::GetDrive(aDriveNumber, iPrimaryMedia);
- drive;
- drive = drive->iNextDrive)
- {
- DPrimaryMediaBase* primaryMedia = drive->iPrimaryMedia;
- __ASSERT_DEBUG(primaryMedia, LOCM_FAULT());
-
- if ((primaryMedia->iMsgQ.iMessage && primaryMedia->iMsgQ.iMessage->iState != TMessageBase::EFree) ||
- !primaryMedia->iMsgQ.iQ.IsEmpty() ||
- primaryMedia->iBody->iMediaChangeDfc.Queued() ||
- primaryMedia->iBody->iMediaPresentDfc.Queued())
- return ETrue;
-
-#ifdef __DEMAND_PAGING__
- DMediaPagingDevice* pagingDevice = iPrimaryMedia->iBody->iPagingDevice;
- if (pagingDevice)
- {
- if ((pagingDevice->iMainQ.iMessage && pagingDevice->iMainQ.iMessage->iState != TMessageBase::EFree) ||
- !pagingDevice->iMainQ.iQ.IsEmpty())
- return ETrue;
- }
-#endif
- }
-
- return EFalse;
- }
-
-
-TCallBackLink::TCallBackLink()
- {
- memclr(this, sizeof(this));
- }
-
-TCallBackLink::TCallBackLink(TInt (*aFunction)(TAny* aPtr, TInt aParam),TAny* aPtr, TObjectType aObjectType) :
- iFunction(aFunction), iPtr(aPtr), iObjectType(aObjectType)
- {
- }
-
-TInt TCallBackLink::CallBack(TInt aParam) const
- {
- return (*iFunction)(iPtr, aParam);
- }
-
-/******************************************************************************
Entry point
******************************************************************************/
DECLARE_STANDARD_EXTENSION()
@@ -6487,7 +5795,6 @@
// install the HAL function
TInt r=Kern::AddHalEntry(EHalGroupMedia,MediaHalFunction,NULL);
-
#ifdef __DEMAND_PAGING__
if (r==KErrNone)
{
@@ -6500,7 +5807,6 @@
__KTRACE_OPT(KBOOT,Kern::Printf("Installing LocDrv device in kernel returned %d",r));
}
#endif // __DEMAND_PAGING__
-
return r;
}