# HG changeset patch # User hgs # Date 1286816081 -3600 # Node ID 48e57fb1237e86ad0904b85b3c5460b3f60dbb17 # Parent ff5437e4337ccf0e093143172c834773d154c16d 201039_11 diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/drivers/pbus/mmc/stack.cpp --- a/kernel/eka/drivers/pbus/mmc/stack.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/drivers/pbus/mmc/stack.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1082,7 +1082,7 @@ * Constructor */ : iPMark(NULL),iPoint(NULL),iPrevP(NULL),iSize(0) - {OstTraceFunctionEntry1( TMMCSESSRING_TMMCSESSRING_ENTRY, this );} + {} void TMMCSessRing::Erase() @@ -1090,9 +1090,7 @@ * Erases all the ring content */ { - OstTraceFunctionEntry1( TMMCSESSRING_ERASE_ENTRY, this ); iPMark = iPoint = iPrevP = NULL; iSize = 0; - OstTraceFunctionExit1( TMMCSESSRING_ERASE_EXIT, this ); } @@ -1118,19 +1116,16 @@ * Finds aSessP and sets Point to that position */ { - OstTraceFunctionEntryExt( TMMCSESSRING_POINT_ENTRY, this ); Point(); while( iPoint != NULL ) if( iPoint == aSessP ) { - OstTraceFunctionExitExt( TMMCSESSRING_POINT_EXIT1, this, (TUint) ETrue ); return ETrue; } else this->operator++(0); - OstTraceFunctionExitExt( TMMCSESSRING_POINT_EXIT2, this, (TUint) EFalse ); return EFalse; } @@ -1139,13 +1134,11 @@ * Inserts aSessP before Marker. Point is moved into the Marker position. */ { - OstTraceFunctionEntryExt( TMMCSESSRING_ADD1_ENTRY, this ); if( iSize == 0 ) { iPMark = iPrevP = iPoint = aSessP; aSessP->iLinkP = aSessP; iSize = 1; - OstTraceFunctionExit1( TMMCSESSRING_ADD1_EXIT1, this ); return; } @@ -1154,7 +1147,6 @@ aSessP->iLinkP = iPoint; iPMark = iPrevP = aSessP; iSize++; - OstTraceFunctionExit1( TMMCSESSRING_ADD1_EXIT2, this ); } @@ -1165,12 +1157,10 @@ * Erases aRing. */ { - OstTraceFunctionEntry1( TMMCSESSRING_ADD2_ENTRY, this ); Point(); if( aRing.iSize == 0 ) { - OstTraceFunctionExit1( TMMCSESSRING_ADD2_EXIT1, this ); return; } @@ -1189,7 +1179,6 @@ } aRing.Erase(); - OstTraceFunctionExit1( TMMCSESSRING_ADD2_EXIT2, this ); } DMMCSession* TMMCSessRing::Remove() @@ -1198,7 +1187,6 @@ * Point (and possibly Marker) move forward as in operator++ */ { - OstTraceFunctionEntry1( TMMCSESSRING_REMOVE1_ENTRY, this ); DMMCSession* remS = iPrevP; if( iSize < 2 ) @@ -1219,7 +1207,6 @@ } } - OstTraceFunctionExitExt( TMMCSESSRING_REMOVE1_EXIT, this, ( TUint )( remS ) ); return remS; } @@ -1229,12 +1216,10 @@ * Removes a specified session from the ring */ { - OstTraceFunctionEntryExt( TMMCSESSRING_REMOVE2_ENTRY, this ); if( Point(aSessP) ) Remove(); else DMMCSocket::Panic(DMMCSocket::EMMCSessRingNoSession); - OstTraceFunctionExit1( TMMCSESSRING_REMOVE2_EXIT, this ); } diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/include/e32uid.h --- a/kernel/eka/include/e32uid.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/include/e32uid.h Mon Oct 11 17:54:41 2010 +0100 @@ -1,128 +1,130 @@ -// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\include\e32uid.h -// -// WARNING: This file contains some APIs which are internal and are subject -// to change without notice. Such APIs should therefore not be used -// outside the Kernel and Hardware Services package. -// - -/** - @file - @publishedPartner - @released -*/ - -#ifndef __E32UID_H__ -#define __E32UID_H__ -#include - -const TInt KDynamicLibraryUidValue=0x10000079; -const TInt KExecutableImageUidValue=0x1000007a; -const TUid KDynamicLibraryUid={KDynamicLibraryUidValue}; -const TUid KExecutableImageUid={KExecutableImageUidValue}; - -#if defined(_UNICODE) -#define KLogicalDeviceDriverUidValue KLogicalDeviceDriverUidValue16 -#define KLogicalDeviceDriverUid KLogicalDeviceDriverUid16 -#else -#define KLogicalDeviceDriverUidValue KLogicalDeviceDriverUidValue8 -#define KLogicalDeviceDriverUid KLogicalDeviceDriverUid8 -#endif -const TInt KLogicalDeviceDriverUidValue16=0x100000af; -const TUid KLogicalDeviceDriverUid16={KLogicalDeviceDriverUidValue16}; -const TInt KLogicalDeviceDriverUidValue8=0x100000ae; -const TUid KLogicalDeviceDriverUid8={KLogicalDeviceDriverUidValue8}; - -#if defined(_UNICODE) -#define KPhysicalDeviceDriverUidValue KPhysicalDeviceDriverUidValue16 -#define KPhysicalDeviceDriverUid KPhysicalDeviceDriverUid16 -#else -#define KPhysicalDeviceDriverUidValue KPhysicalDeviceDriverUidValue8 -#define KPhysicalDeviceDriverUid KPhysicalDeviceDriverUid8 -#endif -const TInt KPhysicalDeviceDriverUidValue16=0x100039d0; -const TUid KPhysicalDeviceDriverUid16={KPhysicalDeviceDriverUidValue16}; -const TInt KPhysicalDeviceDriverUidValue8=0x100000ad; -const TUid KPhysicalDeviceDriverUid8={KPhysicalDeviceDriverUidValue8}; - -const TInt KMachineConfigurationUidValue=0x100000f4; -const TUid KMachineConfigurationUid={KMachineConfigurationUidValue}; - -#if defined(_UNICODE) -#define KLocaleDllUidValue KLocaleDllUidValue16 -#define KLocaleDllUid KLocaleDllUid16 -#else -#define KLocaleDllUidValue KLocaleDllUidValue8 -#define KLocaleDllUid KLocaleDllUid8 -#endif -const TInt KLocaleDllUidValue16=0x100039e6; -const TUid KLocaleDllUid16={KLocaleDllUidValue16}; -const TInt KLocaleDllUidValue8=0x100000c3; -const TUid KLocaleDllUid8={KLocaleDllUidValue8}; - -const TInt KSharedLibraryUidValue=0x1000008d; -const TUid KSharedLibraryUid={KSharedLibraryUidValue}; - -const TInt KKeyboardUidValue=0x100000db; -const TUid KKeyboardUid={KKeyboardUidValue}; - -/** @internalComponent */ -const TInt KEka1EntryStubUidValue=0x101fdf0f; -/** @internalComponent */ -const TUid KEka1EntryStubUid={KEka1EntryStubUidValue}; - -#if defined(_UNICODE) -#define KKeyboardDataUidValue KKeyboardDataUidValue16 -#define KKeyboardDataUid KKeyboardDataUid16 -#else -#define KKeyboardDataUidValue KKeyboardDataUidValue8 -#define KKeyboardDataUid KKeyboardDataUid8 -#endif -const TInt KKeyboardDataUidValue16=0x100039e0; -const TUid KKeyboardDataUid16={KKeyboardDataUidValue16}; -const TInt KKeyboardDataUidValue8=0x100000dc; -const TUid KKeyboardDataUid8={KKeyboardDataUidValue8}; - -#if defined(_UNICODE) -#define KKeyboardTranUidValue KKeyboardTranUidValue16 -#define KKeyboardTranUid KKeyboardTranUid16 -#else -#define KKeyboardTranUidValue KKeyboardTranUidValue8 -#define KKeyboardTranUid KKeyboardTranUid8 -#endif -const TInt KKeyboardTranUidValue16=0x100039e1; -const TUid KKeyboardTranUid16={KKeyboardTranUidValue16}; -const TInt KKeyboardTranUidValue8=0x100000dd; -const TUid KKeyboardTranUid8={KKeyboardTranUidValue8}; - - -#if defined(_UNICODE) -#define KConsoleDllUidValue KConsoleDllUidValue16 -#define KConsoleDllUid KConsoleDllUid16 -#else -#define KConsoleDllUidValue KConsoleDllUidValue8 -#define KConsoleDllUid KConsoleDllUid8 -#endif -const TInt KConsoleDllUidValue16=0x100039e7; -const TUid KConsoleDllUid16={KConsoleDllUidValue16}; -const TInt KConsoleDllUidValue8=0x100000c5; -const TUid KConsoleDllUid8={KConsoleDllUidValue8}; - -const TUint KSystemStartupModeKey=0x10204BB5; - -const TUint KSystemEmulatorOrientationKey=0x10204BB6; - -#endif - +// Copyright (c) 1995-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32uid.h +// +// WARNING: This file contains some APIs which are internal and are subject +// to change without notice. Such APIs should therefore not be used +// outside the Kernel and Hardware Services package. +// + +/** + @file + @publishedPartner + @released +*/ + +#ifndef __E32UID_H__ +#define __E32UID_H__ +#include + +const TInt KDynamicLibraryUidValue=0x10000079; +const TInt KExecutableImageUidValue=0x1000007a; +const TUid KDynamicLibraryUid={KDynamicLibraryUidValue}; +const TUid KExecutableImageUid={KExecutableImageUidValue}; + +#if defined(_UNICODE) +#define KLogicalDeviceDriverUidValue KLogicalDeviceDriverUidValue16 +#define KLogicalDeviceDriverUid KLogicalDeviceDriverUid16 +#else +#define KLogicalDeviceDriverUidValue KLogicalDeviceDriverUidValue8 +#define KLogicalDeviceDriverUid KLogicalDeviceDriverUid8 +#endif +const TInt KLogicalDeviceDriverUidValue16=0x100000af; +const TUid KLogicalDeviceDriverUid16={KLogicalDeviceDriverUidValue16}; +const TInt KLogicalDeviceDriverUidValue8=0x100000ae; +const TUid KLogicalDeviceDriverUid8={KLogicalDeviceDriverUidValue8}; + +#if defined(_UNICODE) +#define KPhysicalDeviceDriverUidValue KPhysicalDeviceDriverUidValue16 +#define KPhysicalDeviceDriverUid KPhysicalDeviceDriverUid16 +#else +#define KPhysicalDeviceDriverUidValue KPhysicalDeviceDriverUidValue8 +#define KPhysicalDeviceDriverUid KPhysicalDeviceDriverUid8 +#endif +const TInt KPhysicalDeviceDriverUidValue16=0x100039d0; +const TUid KPhysicalDeviceDriverUid16={KPhysicalDeviceDriverUidValue16}; +const TInt KPhysicalDeviceDriverUidValue8=0x100000ad; +const TUid KPhysicalDeviceDriverUid8={KPhysicalDeviceDriverUidValue8}; + +const TInt KMachineConfigurationUidValue=0x100000f4; +const TUid KMachineConfigurationUid={KMachineConfigurationUidValue}; + +#if defined(_UNICODE) +#define KLocaleDllUidValue KLocaleDllUidValue16 +#define KLocaleDllUid KLocaleDllUid16 +#else +#define KLocaleDllUidValue KLocaleDllUidValue8 +#define KLocaleDllUid KLocaleDllUid8 +#endif +const TInt KLocaleDllUidValue16=0x100039e6; +const TUid KLocaleDllUid16={KLocaleDllUidValue16}; +const TInt KLocaleDllUidValue8=0x100000c3; +const TUid KLocaleDllUid8={KLocaleDllUidValue8}; + +const TInt KSharedLibraryUidValue=0x1000008d; +const TUid KSharedLibraryUid={KSharedLibraryUidValue}; + +const TInt KKeyboardUidValue=0x100000db; +const TUid KKeyboardUid={KKeyboardUidValue}; + +/** @internalComponent */ +const TInt KEka1EntryStubUidValue=0x101fdf0f; +/** @internalComponent */ +const TUid KEka1EntryStubUid={KEka1EntryStubUidValue}; + +#if defined(_UNICODE) +#define KKeyboardDataUidValue KKeyboardDataUidValue16 +#define KKeyboardDataUid KKeyboardDataUid16 +#else +#define KKeyboardDataUidValue KKeyboardDataUidValue8 +#define KKeyboardDataUid KKeyboardDataUid8 +#endif +const TInt KKeyboardDataUidValue16=0x100039e0; +const TUid KKeyboardDataUid16={KKeyboardDataUidValue16}; +const TInt KKeyboardDataUidValue8=0x100000dc; +const TUid KKeyboardDataUid8={KKeyboardDataUidValue8}; + +#if defined(_UNICODE) +#define KKeyboardTranUidValue KKeyboardTranUidValue16 +#define KKeyboardTranUid KKeyboardTranUid16 +#else +#define KKeyboardTranUidValue KKeyboardTranUidValue8 +#define KKeyboardTranUid KKeyboardTranUid8 +#endif +const TInt KKeyboardTranUidValue16=0x100039e1; +const TUid KKeyboardTranUid16={KKeyboardTranUidValue16}; +const TInt KKeyboardTranUidValue8=0x100000dd; +const TUid KKeyboardTranUid8={KKeyboardTranUidValue8}; + + +#if defined(_UNICODE) +#define KConsoleDllUidValue KConsoleDllUidValue16 +#define KConsoleDllUid KConsoleDllUid16 +#else +#define KConsoleDllUidValue KConsoleDllUidValue8 +#define KConsoleDllUid KConsoleDllUid8 +#endif +const TInt KConsoleDllUidValue16=0x100039e7; +const TUid KConsoleDllUid16={KConsoleDllUidValue16}; +const TInt KConsoleDllUidValue8=0x100000c5; +const TUid KConsoleDllUid8={KConsoleDllUidValue8}; + +const TUint KSystemStartupModeKey=0x10204BB5; +const TUint KSystemEmulatorOrientationKey=0x10204BB6; + +/** @internalComponent */ +const TUint KPlatformTestExclusionKey=0x20033F19; + +#endif + diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/include/e32ver.h --- a/kernel/eka/include/e32ver.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/include/e32ver.h Mon Oct 11 17:54:41 2010 +0100 @@ -28,7 +28,7 @@ const TInt KE32MajorVersionNumber=2; const TInt KE32MinorVersionNumber=0; -const TInt KE32BuildVersionNumber=4007; +const TInt KE32BuildVersionNumber=4008; const TInt KMachineConfigurationMajorVersionNumber=1; const TInt KMachineConfigurationMinorVersionNumber=0; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/include/memmodel/epoc/mmubase/mmubase.h --- a/kernel/eka/include/memmodel/epoc/mmubase/mmubase.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/include/memmodel/epoc/mmubase/mmubase.h Mon Oct 11 17:54:41 2010 +0100 @@ -464,7 +464,7 @@ virtual void RemapPage(TInt aId, TUint32 aAddr, TPhysAddr aOldAddr, TPhysAddr aNewAddr, TPte aPtePerm, DProcess* aProcess)=0; virtual TInt UnmapPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TBool aSetPagesFree, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0; virtual void ClearRamDrive(TLinAddr aStart)=0; - virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte)=0; + virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte, TBool aGlobal)=0; virtual void Map(TLinAddr aLinAddr, TPhysAddr aPhysAddr, TInt aSize, TPde aPdePerm, TPte aPtePerm, TInt aMapShift)=0; virtual void Unmap(TLinAddr aLinAddr, TInt aSize)=0; virtual void InitShadowPageTable(TInt aId, TLinAddr aRomAddr, TPhysAddr aOrigPhys)=0; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/include/memmodel/epoc/moving/arm/arm_mem.h --- a/kernel/eka/include/memmodel/epoc/moving/arm/arm_mem.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/include/memmodel/epoc/moving/arm/arm_mem.h Mon Oct 11 17:54:41 2010 +0100 @@ -285,7 +285,7 @@ virtual void RemapPage(TInt aId, TUint32 aAddr, TPhysAddr aOldAddr, TPhysAddr aNewAddr, TPte aPtePerm, DProcess* aProcess); virtual TInt UnmapPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TBool aSetPagesFree, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess); virtual void ClearRamDrive(TLinAddr aStart); - virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte); + virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte, TBool aGlobal); virtual void Map(TLinAddr aLinAddr, TPhysAddr aPhysAddr, TInt aSize, TPde aPdePerm, TPte aPtePerm, TInt aMapShift); virtual void Unmap(TLinAddr aLinAddr, TInt aSize); virtual void InitShadowPageTable(TInt aId, TLinAddr aRomAddr, TPhysAddr aOrigPhys); diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/include/memmodel/epoc/moving/memmodel.h --- a/kernel/eka/include/memmodel/epoc/moving/memmodel.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/include/memmodel/epoc/moving/memmodel.h Mon Oct 11 17:54:41 2010 +0100 @@ -318,7 +318,7 @@ // virtual void MapPhysicalPages(TInt aId, SPageInfo::TType aType, TAny* aPtr, TUint32 aOffset, TPhysAddr aPhysAddr, TInt aNumPages, TPte aPtePerm)=0; // virtual TInt UnmapPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TBool aSetPagesFree, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0; // virtual void ClearRamDrive(TLinAddr aStart)=0; -// virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte)=0; +// virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte, TBool aGlobal)=0; // virtual void Map(TLinAddr aLinAddr, TPhysAddr aPhysAddr, TInt aSize, TPde aPdePerm, TPte aPtePerm, TInt aMapShift)=0; // virtual void Unmap(TLinAddr aLinAddr, TInt aSize)=0; // virtual void InitShadowPageTable(TInt aId, TLinAddr aRomAddr, TPhysAddr aOrigPhys)=0; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/include/memmodel/epoc/multiple/arm/arm_mem.h --- a/kernel/eka/include/memmodel/epoc/multiple/arm/arm_mem.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/include/memmodel/epoc/multiple/arm/arm_mem.h Mon Oct 11 17:54:41 2010 +0100 @@ -161,7 +161,7 @@ virtual TInt UnmapPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TBool aSetPagesFree, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess); virtual TInt UnmapUnownedPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TLinAddr* aLAPageList, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess); virtual void ClearRamDrive(TLinAddr aStart); - virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte); + virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte, TBool aGlobal); virtual void Map(TLinAddr aLinAddr, TPhysAddr aPhysAddr, TInt aSize, TPde aPdePerm, TPte aPtePerm, TInt aMapShift); virtual void Unmap(TLinAddr aLinAddr, TInt aSize); virtual void InitShadowPageTable(TInt aId, TLinAddr aRomAddr, TPhysAddr aOrigPhys); diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/include/memmodel/epoc/multiple/memmodel.h --- a/kernel/eka/include/memmodel/epoc/multiple/memmodel.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/include/memmodel/epoc/multiple/memmodel.h Mon Oct 11 17:54:41 2010 +0100 @@ -405,7 +405,7 @@ // virtual void MapPhysicalPages(TInt aId, SPageInfo::TType aType, TAny* aPtr, TUint32 aOffset, TPhysAddr aPhysAddr, TInt aNumPages, TPte aPtePerm)=0; // virtual TInt UnmapPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TBool aSetPagesFree, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0; // virtual void ClearRamDrive(TLinAddr aStart)=0; -// virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte)=0; +// virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte, TBool aGlobal)=0; // virtual void Map(TLinAddr aLinAddr, TPhysAddr aPhysAddr, TInt aSize, TPde aPdePerm, TPte aPtePerm, TInt aMapShift)=0; // virtual void Unmap(TLinAddr aLinAddr, TInt aSize)=0; // virtual void InitShadowPageTable(TInt aId, TLinAddr aRomAddr, TPhysAddr aOrigPhys)=0; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/include/memmodel/epoc/multiple/x86/x86_mem.h --- a/kernel/eka/include/memmodel/epoc/multiple/x86/x86_mem.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/include/memmodel/epoc/multiple/x86/x86_mem.h Mon Oct 11 17:54:41 2010 +0100 @@ -100,7 +100,7 @@ virtual TInt UnmapPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TBool aSetPagesFree, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess); virtual TInt UnmapUnownedPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TLinAddr* aLAPageList, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess); virtual void ClearRamDrive(TLinAddr aStart); - virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte); + virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte, TBool aGlobal); virtual void Map(TLinAddr aLinAddr, TPhysAddr aPhysAddr, TInt aSize, TPde aPdePerm, TPte aPtePerm, TInt aMapShift); virtual void Unmap(TLinAddr aLinAddr, TInt aSize); virtual void InitShadowPageTable(TInt aId, TLinAddr aRomAddr, TPhysAddr aOrigPhys); diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/include/u32hal.h --- a/kernel/eka/include/u32hal.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/include/u32hal.h Mon Oct 11 17:54:41 2010 +0100 @@ -1171,6 +1171,14 @@ - TAny* a2 : NULL. */ EPowerHalAcessoryPowerPresent, + + + /** + Used for testing purposes. + + Sets a member in the power manager depending on which testing of some API's are skipped + */ + EPowerHalPowerManagerTestMode, }; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/kernel/power.cpp --- a/kernel/eka/kernel/power.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/kernel/power.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -25,6 +25,7 @@ #include //#define _DEBUG_POWER #endif +const TUint KDisableControllerShutdown = 0x1; /****************************************************************************** * Power Manager - a Power Model implementation @@ -62,7 +63,8 @@ DBatteryMonitor* iBatteryMonitor; DPowerHal* iPowerHal; - TUint iPslShutdownTimeoutMs; // default = 0 + TUint iPslShutdownTimeoutMs; // default = 0 + TInt iTestMode; private: #ifndef _DEBUG_POWER @@ -188,6 +190,16 @@ TInt DPowerManager::PowerHalFunction(TInt aFunction, TAny* a1, TAny* a2) { // from DPowerModel __KTRACE_OPT(KPOWER,Kern::Printf(">DPowerManager::PowerHalFunction() func=0x%x, a1=0x%x, a2=0x%x", aFunction, a1, a2)); + if (aFunction == EPowerHalPowerManagerTestMode) + { + if ((!Kern::CurrentThreadHasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by PowerHalFunction EPowerHalPowerManagerTestMode"))) || + (!Kern::CurrentThreadHasCapability(ECapabilityWriteDeviceData,__PLATSEC_DIAGNOSTIC_STRING("Checked by PowerHalFunction EPowerHalPowerManagerTestMode")))) + { + return KErrPermissionDenied; + } + iTestMode = (TInt) a1; + return KErrNone; + } TInt r; if (iPowerHal) r = iPowerHal->PowerHalFunction(aFunction, a1, a2); @@ -445,8 +457,9 @@ #endif TTickQ::Wait(); + if(!(iTestMode & KDisableControllerShutdown)) + iPowerController->PowerDown(K::SecondQ->WakeupTime()); - iPowerController->PowerDown(K::SecondQ->WakeupTime()); __PM_ASSERT(iPowerController->iTargetState != EPwOff); iPowerController->iTargetState = EPwActive; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/kernel/stimer.cpp --- a/kernel/eka/kernel/stimer.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/kernel/stimer.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 1994-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -1824,7 +1824,8 @@ if (aTimeSetMode & Kern::ETimeSet_SetHwRtc) { r = A::SetSystemTimeInSecondsFrom2000(s); - if (r!=KErrNone) + // Set SW RTC even if HW RTC is not supported + if ((r!=KErrNone) && (r != KErrNotSupported)) { TTickQ::Signal(); return r; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/memmodel/epoc/mmubase/mmubase.cpp --- a/kernel/eka/memmodel/epoc/mmubase/mmubase.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/memmodel/epoc/mmubase/mmubase.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -2527,7 +2527,7 @@ TUint mapattr=aMapAttr; TPde pdePerm=0; TPte ptePerm=0; - TInt r=m.PdePtePermissions(mapattr, pdePerm, ptePerm); + TInt r=m.PdePtePermissions(mapattr, pdePerm, ptePerm, ETrue); if (r==KErrNone) { pC->iAllocator=m.MappingRegion(mapattr); diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/memmodel/epoc/moving/arm/xkernel.cpp --- a/kernel/eka/memmodel/epoc/moving/arm/xkernel.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/memmodel/epoc/moving/arm/xkernel.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -143,7 +143,7 @@ // override map attributes for shared kernel chunks TUint ma = (iMapAttr &~ EMapAttrAccessMask) | EMapAttrSupRw; TPde pde; - TInt r = m.PdePtePermissions(ma, pde, iPtePermissions); + TInt r = m.PdePtePermissions(ma, pde, iPtePermissions, ETrue); if (r != KErrNone) return r; iMapAttr = ma; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/memmodel/epoc/moving/arm/xmmu.cpp --- a/kernel/eka/memmodel/epoc/moving/arm/xmmu.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/memmodel/epoc/moving/arm/xmmu.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1447,7 +1447,7 @@ return r; } -TInt ArmMmu::PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte) +TInt ArmMmu::PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte, TBool /*aGlobal*/) { __KTRACE_OPT(KMMU,Kern::Printf(">ArmMmu::PdePtePermissions, mapattr=%08x",aMapAttr)); TUint read=aMapAttr & EMapAttrReadMask; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/memmodel/epoc/multiple/arm/xkernel.cpp --- a/kernel/eka/memmodel/epoc/multiple/arm/xkernel.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/memmodel/epoc/multiple/arm/xkernel.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -159,8 +159,9 @@ if(iChunkType==ESharedKernelSingle || iChunkType==ESharedKernelMultiple || iChunkType==ESharedIo || iChunkType==ESharedKernelMirror) { // override map attributes for shared kernel chunks - TUint ma = (iMapAttr &~ EMapAttrAccessMask) | (iChunkType==ESharedKernelMirror?EMapAttrSupRw:EMapAttrUserRw); - TInt r = m.PdePtePermissions(ma, iPdePermissions, iPtePermissions); + TBool kernelMirror = iChunkType == ESharedKernelMirror; + TUint ma = (iMapAttr &~ EMapAttrAccessMask) | ((kernelMirror)? EMapAttrSupRw : EMapAttrUserRw); + TInt r = m.PdePtePermissions(ma, iPdePermissions, iPtePermissions, kernelMirror); if (r != KErrNone) return r; iMapAttr = ma; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/memmodel/epoc/multiple/arm/xmmu.cpp --- a/kernel/eka/memmodel/epoc/multiple/arm/xmmu.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/memmodel/epoc/multiple/arm/xmmu.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1937,7 +1937,7 @@ #if defined(__CPU_MEMORY_TYPE_REMAPPING) //arm1176, arm11mcore, armv7 /** Calculates page directory/table entries for memory type described in aMapAttr. -Global, small page (4KB) mapping is assumed. +Small page (4KB) mapping is assumed. (All magic numbers come from ARM page table descriptions.) @param aMapAttr On entry, holds description(memory type, access permisions,...) of the memory. It is made up of TMappingAttributes constants or TMappingAttributes2 object. If TMappingAttributes, @@ -1946,10 +1946,11 @@ for given type of memory, with base address set to 0. @param aPte On exit, holds small-page-entry (4K) for the 2nd level descriptor for given type of memory, with base address set to 0. +@param aGlobal Set to ETrue when the mapping should be global. @return KErrNotSupported If memory described in aMapAttr is not supported KErrNone Otherwise */ -TInt ArmMmu::PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte) +TInt ArmMmu::PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte, TBool aGlobal) { __KTRACE_OPT(KMMU,Kern::Printf(">ArmMmu::PdePtePermissions, mapattr=%08x",aMapAttr)); @@ -1977,10 +1978,11 @@ #if defined (__CPU_USE_SHARED_MEMORY) KArmV6PteS | // Memory is always shared. #else - (memory.Shared() ? KArmV6PteS : 0) | // Shared bit -#endif - (memory.Writable() ? 0 : KArmV6PteAPX) | // APX = !Writable - (memory.UserAccess() ? KArmV6PteAP1: 0); // AP1 = UserAccess + (memory.Shared() ? KArmV6PteS : 0) | // Shared bit +#endif + (memory.Writable() ? 0 : KArmV6PteAPX) | // APX = !Writable + (memory.UserAccess()? KArmV6PteAP1 : 0) | // AP1 = UserAccess + (aGlobal ? 0 : KArmV6PteNG); // Not Global bit // aMapAttr remains the same } else @@ -2060,7 +2062,7 @@ aPde=((aMapAttr&EMapAttrUseECC)>>8)|KArmV6PdePageTable; // 5. Calculate small-page-entry for the 2nd level (aka page table) descriptor - aPte=SP_PTE(apxap, tex0_c_b, exec, 1); // always global + aPte=SP_PTE(apxap, tex0_c_b, exec, aGlobal); if (aMapAttr&EMapAttrShared) aPte |= KArmV6PteS; @@ -2150,7 +2152,7 @@ WBRA, WBRA, WBRA, WBRA //111 }; -TInt ArmMmu::PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte) +TInt ArmMmu::PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte, TBool aGlobal) { __KTRACE_OPT(KMMU,Kern::Printf(">ArmMmu::PdePtePermissions, mapattr=%08x",aMapAttr)); @@ -2191,7 +2193,7 @@ apxap=(read>=4)?KArmV6PermRWRO:KArmV6PermRWNO; else apxap=KArmV6PermRWRW; - TPte pte=SP_PTE(apxap, cbtex, exec, 1); // always global + TPte pte=SP_PTE(apxap, cbtex, exec, aGlobal); if (aMapAttr&EMapAttrShared) pte |= KArmV6PteS; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/memmodel/epoc/multiple/x86/xkernel.cpp --- a/kernel/eka/memmodel/epoc/multiple/x86/xkernel.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/memmodel/epoc/multiple/x86/xkernel.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -158,8 +158,9 @@ if(iChunkType==ESharedKernelSingle || iChunkType==ESharedKernelMultiple || iChunkType==ESharedIo || iChunkType==ESharedKernelMirror) { // override map attributes for shared kernel chunks - TUint ma = (iMapAttr &~ EMapAttrAccessMask) | (iChunkType==ESharedKernelMirror?EMapAttrSupRw:EMapAttrUserRw); - TInt r = m.PdePtePermissions(ma, iPdePermissions, iPtePermissions); + TBool kernelMirror = iChunkType == ESharedKernelMirror; + TUint ma = (iMapAttr &~ EMapAttrAccessMask) | ((kernelMirror)? EMapAttrSupRw : EMapAttrUserRw); + TInt r = m.PdePtePermissions(ma, iPdePermissions, iPtePermissions, kernelMirror); if (r != KErrNone) return r; iMapAttr = ma; diff -r ff5437e4337c -r 48e57fb1237e kernel/eka/memmodel/epoc/multiple/x86/xmmu.cpp --- a/kernel/eka/memmodel/epoc/multiple/x86/xmmu.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kernel/eka/memmodel/epoc/multiple/x86/xmmu.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1323,7 +1323,7 @@ static const TUint8 ActualReadPrivilegeLevel[4]={1,1,4,4}; // RONO,RWNO,RORO,RWRW static const TUint8 ActualWritePrivilegeLevel[4]={0,1,0,4}; // RONO,RWNO,RORO,RWRW -TInt X86Mmu::PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte) +TInt X86Mmu::PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte, TBool aGlobal) { __KTRACE_OPT(KMMU,Kern::Printf(">X86Mmu::PdePtePermissions, mapattr=%08x",aMapAttr)); TUint read=aMapAttr & EMapAttrReadMask; @@ -1363,10 +1363,10 @@ r=KErrNotSupported; if (r==KErrNone) { - cache=CacheBuffActual[cache]; - aPde=KPdePtePresent|KPdePteWrite|KPdePteUser; - aPte=pte|cbatt|iPteGlobal; // HW chunks can always be global - aMapAttr=read|(write<<4)|(read<<8)|(cache<<12); + cache = CacheBuffActual[cache]; + aPde = KPdePtePresent | KPdePteWrite | KPdePteUser; + aPte = pte | cbatt | ((aGlobal)? iPteGlobal : 0); + aMapAttr = read | (write<<4) | (read<<8) | (cache<<12); } __KTRACE_OPT(KMMU,Kern::Printf(" #include @@ -59,7 +60,7 @@ #include "domainpolicytest.h" #include "t_domain.h" - +#include "testexclusions.h" RTest test(_L(" T_DOMAIN ")); _LIT(KThreadName, "t_domain_panic_thread"); @@ -2126,6 +2127,14 @@ delete hb; } + TInt testExclusions = 0; + test_KErrNone(GetTestExclusionSettings(testExclusions)); + + if (testExclusions & KDisableControllerShutdown) + { + UserSvr::HalFunction(EHalGroupPower, EPowerHalPowerManagerTestMode, (TAny*)KDisableControllerShutdown, NULL); + } + test.Title(); test.Printf(_L("Go for %d iterations\n"), iter); diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/domainmgr/t_domain.mmp --- a/kerneltest/e32test/domainmgr/t_domain.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/e32test/domainmgr/t_domain.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -17,14 +17,15 @@ TARGET t_domain.exe TARGETTYPE EXE +USERINCLUDE ../misc SOURCEPATH . SOURCE t_domain.cpp t_domain_cmn.cpp -LIBRARY euser.lib domaincli.lib +LIBRARY euser.lib domaincli.lib efsrv.lib OS_LAYER_SYSTEMINCLUDE_SYMBIAN USERINCLUDE ../../../userlibandfileserver/domainmgr/inc -CAPABILITY WriteDeviceData PowerMgmt +CAPABILITY WriteDeviceData PowerMgmt AllFiles VENDORID 0x70000001 diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/group/d_mmctest.mmp --- a/kerneltest/e32test/group/d_mmctest.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/e32test/group/d_mmctest.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -30,4 +30,8 @@ capability all VENDORID 0x70000001 +// Don't put this in ROM here since it would stop ROMs building on platforms +// without MMC support. +romtarget + SMPSAFE diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/group/t_lddpowerseqtest.mmp --- a/kerneltest/e32test/group/t_lddpowerseqtest.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/e32test/group/t_lddpowerseqtest.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -17,9 +17,10 @@ TARGET t_lddpowerseqtest.exe TARGETTYPE EXE +USERINCLUDE ../misc SOURCEPATH ../power SOURCE t_lddpowerseqtest.cpp -LIBRARY euser.lib +LIBRARY euser.lib efsrv.lib OS_LAYER_SYSTEMINCLUDE_SYMBIAN USERINCLUDE ../power diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/group/t_power.mmp --- a/kerneltest/e32test/group/t_power.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/e32test/group/t_power.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -17,12 +17,13 @@ TARGET t_power.exe TARGETTYPE EXE +USERINCLUDE ../misc SOURCEPATH ../power SOURCE t_power.cpp -LIBRARY euser.lib +LIBRARY euser.lib efsrv.lib OS_LAYER_SYSTEMINCLUDE_SYMBIAN -CAPABILITY PowerMgmt +CAPABILITY PowerMgmt WriteDeviceData AllFiles VENDORID 0x70000001 diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/group/t_suser.mmp --- a/kerneltest/e32test/group/t_suser.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/e32test/group/t_suser.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2001-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -17,9 +17,10 @@ target t_suser.exe targettype exe +USERINCLUDE ../misc sourcepath ../secure source t_suser.cpp -library euser.lib hal.lib +library euser.lib hal.lib efsrv.lib OS_LAYER_SYSTEMINCLUDE_SYMBIAN ROMTARGET RAMTARGET \sys\bin\ // diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/group/t_switchoff.mmp --- a/kerneltest/e32test/group/t_switchoff.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/e32test/group/t_switchoff.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -17,12 +17,13 @@ TARGET t_switchoff.exe TARGETTYPE EXE +USERINCLUDE ../misc SOURCEPATH ../power SOURCE t_switchoff.cpp -LIBRARY euser.lib +LIBRARY euser.lib efsrv.lib OS_LAYER_SYSTEMINCLUDE_SYMBIAN -CAPABILITY PowerMgmt SwEvent +CAPABILITY PowerMgmt SwEvent WriteDeviceData AllFiles VENDORID 0x70000001 diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/misc/testexclusions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/misc/testexclusions.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,84 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\misc\testexclusions.h +// Gets the test exclusion property which is set by reading a file provided by base port and +// based on this property some tests can be excluded +// +// + +#ifndef __TESTEXCLUSIONS_H__ +#define __TESTEXCLUSIONS_H__ + +#include +#include +#include +#include +#include + +_LIT(KLitPlatformTestExclusionFile, "Z:\\sys\\data\\platformtestexclusion.txt"); + +// Bit masks to disable different tests + +// To disable invoking PowerController::PowerDown +const TUint KDisableControllerShutdown = 0x1; + +TInt GetExclusionFromFile(TUint& aTestExclusion) + { + RFs theFs; + TInt r = KErrNone; + r = theFs.Connect(); + if (r != KErrNone) + return r; + + RFile file; + TFileName filename(KLitPlatformTestExclusionFile); + r = file.Open(theFs, filename, EFileRead); + if (r == KErrNone) + { + TBuf8<8> data; + file.Read(data); + TLex8 lexData(data); + r = lexData.Val(aTestExclusion, EHex); + file.Close(); + } + + theFs.Close(); + return r; + } + + +TInt GetTestExclusionSettings(TInt& aTestExclusion) + { + TInt r = RProperty::Get(KUidSystemCategory, KPlatformTestExclusionKey, aTestExclusion); + if (r != KErrNotFound) + return r; + + _LIT_SECURITY_POLICY_PASS(KTestPropPolicy); + r = RProperty::Define(KUidSystemCategory, KPlatformTestExclusionKey, RProperty::EInt, KTestPropPolicy, KTestPropPolicy); + if (r != KErrNone) + return r; + + + TUint testExclusion = 0; + r = GetExclusionFromFile(testExclusion); + if ((r != KErrNotFound) && (r != KErrNone)) // All platforms need not have test exclusions file defined + return r; + + aTestExclusion = testExclusion; + r = RProperty::Set(KUidSystemCategory, KPlatformTestExclusionKey, testExclusion); + return r; + } + +#endif // __TESTEXCLUSIONS_H__ + diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/power/t_lddpowerseqtest.cpp --- a/kerneltest/e32test/power/t_lddpowerseqtest.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/e32test/power/t_lddpowerseqtest.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -20,6 +20,7 @@ #include "d_lddpowerseqtest.h" #include +#include "testexclusions.h" _LIT(KLddFileName, "D_LDDPOWERSEQTEST.LDD"); RLddTest1 ldd; @@ -39,6 +40,15 @@ RTimer timer; TRequestStatus tstatus; + TInt testExclusions = 0; + r = GetTestExclusionSettings(testExclusions); + test(r == KErrNone); + + if (testExclusions & KDisableControllerShutdown) + { + UserSvr::HalFunction(EHalGroupPower, EPowerHalPowerManagerTestMode, (TAny*)KDisableControllerShutdown, NULL); + } + test.Printf(_L("Loading logical device \n")); r=User::LoadLogicalDevice(KLddFileName); test(r == KErrNone); diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/power/t_power.cpp --- a/kerneltest/e32test/power/t_power.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/e32test/power/t_power.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -41,6 +41,7 @@ #include #include #include +#include "testexclusions.h" LOCAL_D RTest test(_L(" T_POWER ")); @@ -55,6 +56,14 @@ void PowerTests() { test.Next(_L("test PowerDown()")); + + TInt testExclusions = 0; + test_KErrNone(GetTestExclusionSettings(testExclusions)); + + if (testExclusions & KDisableControllerShutdown) + { + UserSvr::HalFunction(EHalGroupPower, EPowerHalPowerManagerTestMode, (TAny*)KDisableControllerShutdown, NULL); + } TInt r = Power::PowerDown(); test (r == KErrNotReady); diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/power/t_switchoff.cpp --- a/kerneltest/e32test/power/t_switchoff.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/e32test/power/t_switchoff.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -15,10 +15,13 @@ // // +#define __E32TEST_EXTENSION__ + #include #include #include #include +#include "testexclusions.h" LOCAL_D RTest test(_L(" T_SWITCHOFF ")); @@ -61,6 +64,15 @@ test.Title(); test.Start(_L("Testing")); + TInt testExclusions = 0; + test_KErrNone(GetTestExclusionSettings(testExclusions)); + + if (testExclusions & KDisableControllerShutdown) + { + UserSvr::HalFunction(EHalGroupPower, EPowerHalPowerManagerTestMode, (TAny*)KDisableControllerShutdown, NULL); + } + + SwittchOffTests(); test.End(); diff -r ff5437e4337c -r 48e57fb1237e kerneltest/e32test/secure/t_suser.cpp --- a/kerneltest/e32test/secure/t_suser.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/e32test/secure/t_suser.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2001-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -44,11 +44,14 @@ #include #include #include +#include "testexclusions.h" LOCAL_D RTest test(_L("T_SUSER")); _LIT(KSyncSemaphoreName,"T_SUSER-SyncSemaphore"); RSemaphore SyncSemaphore; +TBool gControllerShutdownDisabled = EFalse; +TInt gTestExclusions = 0; void SlaveWait() @@ -319,7 +322,9 @@ ETestProcessSetCurrencySymbol, ETestProcessAddEventESwitchOff, ETestProcessAddEventECaseOpen, - ETestProcessAddEventECaseClose + ETestProcessAddEventECaseClose, + ETestProcessPowerHalTestMode, + ETestProcessGetTestExclusions }; #include "testprocess.h" @@ -532,6 +537,16 @@ return UserSvr::AddEvent(event); } + case ETestProcessPowerHalTestMode: + { + return UserSvr::HalFunction(EHalGroupPower, EPowerHalPowerManagerTestMode, (TAny*)KDisableControllerShutdown, NULL); + } + + case ETestProcessGetTestExclusions: + { + return GetTestExclusionSettings(gTestExclusions); + } + default: User::Panic(_L("T_SUSER"),1); } @@ -822,6 +837,60 @@ TUint KTestUid = 0x87654321; +void GetTestExclusions() + { + RTestProcess process; + TRequestStatus logonStatus; + + test.Start(_L("Get Test exclusions")); + TInt caps = 1u< 0) + { + r=TheFs.MountFileSystem(aFsName,aFsExtName0,aDriveNo); + test(r==KErrNone); + } + else if(aFsExtName1.Length() > 0) // untested ! + { + r=TheFs.MountFileSystem(aFsName,aFsExtName1,aDriveNo); + test(r==KErrNone); + } + else + { + r=TheFs.MountFileSystem(aFsName,aDriveNo); + test(r==KErrNone); + } + } + LOCAL_C void TestDeferredDismount(TDesC& aRoot, TDesC& aFileName, RFileClamp* handlePtr) { // Open and clamp file, register for dismount notification, then issue @@ -231,26 +251,23 @@ TBuf fsName; TBuf fsExtName_0; TBuf fsExtName_1; - TBool fsExt0Present=EFalse; - TBool fsExt1Present=EFalse; TInt driveNo, r; r=TheFs.CharToDrive(aRoot[0], driveNo); test(r==KErrNone); r=TheFs.FileSystemName(fsName, driveNo); test(r==KErrNone); - r=TheFs.ExtensionName(fsExtName_0,driveNo,0); - if(r==KErrNone) - fsExt0Present=ETrue; - r=TheFs.ExtensionName(fsExtName_1,driveNo,1); - if(r==KErrNone) - fsExt1Present=ETrue; + //******************************************************************************************************* // Create a file & write to it so that we can test whether dismounting works correctly with dirty data + //******************************************************************************************************* + test.Next(_L("T_Clamp - TestDeferredDismount(), testing unmounting with dirty data, registered clients & clamped files")); + TDriveInfo driveInfo; test(TheFs.Drive(driveInfo, driveNo) == KErrNone); TFileName dirtyFileName(_L("dirtyFile.tst")); RFile dirtyFile; - if (!(driveInfo.iMediaAtt & KMediaAttWriteProtected)) + TBool writeProtectedMedia = driveInfo.iMediaAtt & KMediaAttWriteProtected; + if (!writeProtectedMedia) { r=dirtyFile.Replace(TheFs, dirtyFileName, EFileWrite); test(r==KErrNone); @@ -268,9 +285,16 @@ TRequestStatus clientNotify=KErrNone; TRequestStatus clientDismount=KErrNone; - TheFs.NotifyDismount(driveNo, clientNotify); // Register for notification + TheFs.NotifyDismount(driveNo, clientNotify); // Register for dismount notification test(clientNotify == KRequestPending); + + // register for disk change notifcation, so we can detect when dismount has actually taken place + TRequestStatus diskChangeStatus; + TheFs.NotifyChange(ENotifyDisk, diskChangeStatus); + test.Printf(_L("diskChangeStatus %d"), diskChangeStatus.Int()); + test(diskChangeStatus == KRequestPending); // no disk change yet + TheFs.NotifyDismount(driveNo, clientDismount, EFsDismountNotifyClients); test(clientDismount == KRequestPending); User::WaitForRequest(clientNotify); @@ -279,6 +303,7 @@ r=TheFs.AllowDismount(driveNo); // Respond to dismount notification test(r == KErrNone); test(clientDismount == KRequestPending); // Dismount is deferred + test(diskChangeStatus == KRequestPending); // no disk change yet // // Now unclamp the file, and check that the deferred dismount is performed. @@ -287,33 +312,38 @@ User::WaitForRequest(clientDismount); test(clientDismount == KErrNone); + // wait for disk change notification following dismount + User::WaitForRequest(diskChangeStatus); + test(diskChangeStatus == KErrNone); // should have got a disk change notification after dismount + r = TheFs.Drive(driveInfo, driveNo); + test (r==KErrNone); + test (driveInfo.iType == EMediaNotPresent); + + // re-register for disk change notifcation, so we can detect when remount has actually taken place + TheFs.NotifyChange(ENotifyDisk, diskChangeStatus); + test.Printf(_L("diskChangeStatus %d"), diskChangeStatus.Int()); + test(diskChangeStatus == KRequestPending); // no disk change yet + // Try to write to the opened file: this should return KErrNotReady as there is no drive thread - if (!(driveInfo.iMediaAtt & KMediaAttWriteProtected)) + if (!writeProtectedMedia) { r=dirtyFile.Write(_L8("My name isn't really Michael Caine")); test(r==KErrNotReady); } // Re-mount the file system - if(fsExt0Present) - { - r=TheFs.MountFileSystem(fsName,fsExtName_0,driveNo); - test(r==KErrNone); - } - else if(fsExt1Present) // untested ! - { - r=TheFs.MountFileSystem(fsName,fsExtName_1,driveNo); - test(r==KErrNone); - } - else - { - r=TheFs.MountFileSystem(fsName,driveNo); - test_KErrNone(r); - } + RemountFileSystem(driveNo, fsName, fsExtName_0, fsExtName_1); + + // wait for disk change notification following remount + User::WaitForRequest(diskChangeStatus); + test(diskChangeStatus == KErrNone); // should have got a disk change notification after dismount + r = TheFs.Drive(driveInfo, driveNo); + test (r==KErrNone); + test (driveInfo.iType != EMediaNotPresent); // create some more dirty data to verify that the file server can cope with the drive thread // having gone & come back again - if (!(driveInfo.iMediaAtt & KMediaAttWriteProtected)) + if (!writeProtectedMedia) { r=dirtyFile.Write(_L8("My name is Michael Phelps and I'm a fish.")); test(r==KErrDisMounted); @@ -323,8 +353,12 @@ test(r == KErrNone); } + //******************************************************************************************************* // Issue a EFsDismountNotifyClients with no clients but with files clamped // & verify that the dismount request completes when clamps are removed + //******************************************************************************************************* + test.Next(_L("T_Clamp - TestDeferredDismount(), testing unmounting with no registered clients & clamped files")); + r=testFile.Open(TheFs,aFileName,EFileRead); test(r==KErrNone); r=handlePtr->Clamp(testFile); @@ -338,21 +372,7 @@ User::WaitForRequest(clientDismount); test(clientDismount == KErrNone); // Re-mount the file system again - if(fsExt0Present) - { - r=TheFs.MountFileSystem(fsName,fsExtName_0,driveNo); - test(r==KErrNone); - } - else if(fsExt1Present) // untested ! - { - r=TheFs.MountFileSystem(fsName,fsExtName_1,driveNo); - test(r==KErrNone); - } - else - { - r=TheFs.MountFileSystem(fsName,driveNo); - test_KErrNone(r); - } + RemountFileSystem(driveNo, fsName, fsExtName_0, fsExtName_1); // Issue a EFsDismountForceDismount with no clients but with files clamped @@ -369,23 +389,239 @@ test(r==KErrNone); User::WaitForRequest(clientDismount); test(clientDismount == KErrNone); + + // Re-mount the file system again - if(fsExt0Present) + RemountFileSystem(driveNo, fsName, fsExtName_0, fsExtName_1); + + + const TInt KNumClients = 5; + RFs clientFs[KNumClients]; + TRequestStatus clientNotifies[KNumClients]; + TRequestStatus clientDiskChanges[KNumClients]; + TRequestStatus clientComplete; + + #define LOG_AND_TEST(a, e) {if (a!=e) {test.Printf(_L("lvalue %d, rvalue%d\n\r"), a,e); test(EFalse);}} + + //******************************************************************************************************* + // Test unmounting with multiple registered clients which do not respond & close their sessions + //******************************************************************************************************* + test.Next(_L("T_Clamp - TestDeferredDismount(), testing unmounting with multiple registered clients which do not respond & close their sessions")); + + TheFs.NotifyChange(ENotifyDisk, diskChangeStatus); + test.Printf(_L("diskChangeStatus %d"), diskChangeStatus.Int()); + + TInt i; + for (i=0; i< KNumClients; i++) { - r=TheFs.MountFileSystem(fsName,fsExtName_0,driveNo); + LOG_AND_TEST(KErrNone, clientFs[i].Connect()); + clientFs[i].NotifyDismount(driveNo, clientNotifies[i]); + test(clientNotifies[i] == KRequestPending); + } + + test.Next(_L("Close all but one client sessions with outstanding notifiers")); + for (i=0; i< KNumClients-1; i++) + clientFs[i].Close(); + + // Since all clients have NOT been closed, the next stage should not yet complete + test.Next(_L("Notify clients of pending media removal and check status - should not complete")); + TheFs.NotifyDismount(driveNo, clientComplete, EFsDismountNotifyClients); + test(clientComplete == KRequestPending); + + + test.Next(_L("Close the remaining sessions with an outstanding notifier")); + clientFs[KNumClients-1].Close(); + + // Check that the dismount completes now that all session have been closed + test.Next(_L("Check that the dismount completes")); + User::WaitForRequest(clientComplete); + test_KErrNone(clientComplete.Int()); + + // wait for disk change notification following dismount + User::WaitForRequest(diskChangeStatus); + test(diskChangeStatus == KErrNone); // should have got a disk change notification after dismount + r = TheFs.Drive(driveInfo, driveNo); + test (r==KErrNone); + test (driveInfo.iType == EMediaNotPresent); + + // re-register for disk change notifcation, so we can detect when remount has actually taken place + TheFs.NotifyChange(ENotifyDisk, diskChangeStatus); + test.Printf(_L("diskChangeStatus %d"), diskChangeStatus.Int()); + test(diskChangeStatus == KRequestPending); // no disk change yet + + + // Re-mount the file system again + RemountFileSystem(driveNo, fsName, fsExtName_0, fsExtName_1); + + // wait for disk change notification following remount + User::WaitForRequest(diskChangeStatus); + test(diskChangeStatus == KErrNone); // should have got a disk change notification after dismount + r = TheFs.Drive(driveInfo, driveNo); + test (r==KErrNone); + test (driveInfo.iType != EMediaNotPresent); + + + + //******************************************************************************************************* + // Issue a EFsDismountNotifyClients with multiple clients + // Verify that the dismount completes if a client re-registers for dismount notifications BEFORE calling AllowDismount + //******************************************************************************************************* + + test.Next(_L("T_Clamp - TestDeferredDismount(), testing unmounting with multiple registered clients & a re-registration")); + + for(i=0; i< KNumClients; i++) + { + r=clientFs[i].Connect(); + test(r==KErrNone); + } + // Cancel any deferred dismount in preparation for the next test + TheFs.NotifyDismountCancel(); + + // All clients register for dismount notification + for(i=0; i< KNumClients; i++) + { + clientNotifies[i] = KErrNone; + clientFs[i].NotifyDismount(driveNo, clientNotifies[i]); + test(clientNotifies[i] == KRequestPending); + } + + // Issue a EFsDismountNotifyClients & wait for clients to respond + clientDismount = KErrNone; + TheFs.NotifyDismount(driveNo, clientDismount, EFsDismountNotifyClients); + test(clientDismount == KRequestPending); + + // Check all clients have received the notification + for(i=0; i< KNumClients; i++) + { + User::WaitForRequest(clientNotifies[i]); + test(clientNotifies[i] == KErrNone); + } + // All clients - except first one - invoke AllowDismount + for(i=1; i< KNumClients; i++) + { + r=clientFs[i].AllowDismount(driveNo); test(r==KErrNone); } - else if(fsExt1Present) // untested ! + + + // verify dismount has not yet completed + test(clientDismount == KRequestPending); + + + // first client re-registers for dismount notifications + clientFs[0].NotifyDismount(driveNo, clientNotifies[0]); + test(clientNotifies[0] == KRequestPending); + + // first client allows dismount + clientFs[0].AllowDismount(driveNo); + test(r==KErrNone); + + // Wait for dismount + User::WaitForRequest(clientDismount); + test(clientDismount == KErrNone); + + + // verify the first client's re-issued dismount notification is still pending + test(clientNotifies[0] == KRequestPending); + + + // Re-mount the file system again + RemountFileSystem(driveNo, fsName, fsExtName_0, fsExtName_1); + + + // Issue a EFsDismountNotifyClients again & check previously re-registered notification completes + test(clientNotifies[0] == KRequestPending); + clientDismount = KErrNone; + TheFs.NotifyDismount(driveNo, clientDismount, EFsDismountNotifyClients); + test(clientDismount == KRequestPending); + + // wait for notification + User::WaitForRequest(clientNotifies[0]); + + // first client allows dismount + clientFs[0].AllowDismount(driveNo); + test(r==KErrNone); + + // Wait for dismount + User::WaitForRequest(clientDismount); + test(clientDismount == KErrNone); + + + + // Re-mount the file system again + RemountFileSystem(driveNo, fsName, fsExtName_0, fsExtName_1); + + + + //******************************************************************************************************* + // Issue a EFsDismountNotifyClients again with a multiple clients & then call RFs::NotifyDismountCancel() + // Verify that all clients receive a disk change notification + //******************************************************************************************************* + test.Next(_L("T_Clamp - TestDeferredDismount(), testing unmounting with registered clients, a re-registration & a cancel")); + + // All clients register for dismount notification & disk change notification + for(i=0; i< KNumClients; i++) { - r=TheFs.MountFileSystem(fsName,fsExtName_1,driveNo); + clientNotifies[i] = KErrNone; + clientFs[i].NotifyDismount(driveNo, clientNotifies[i], EFsDismountRegisterClient); + test(clientNotifies[i] == KRequestPending); + + clientFs[i].NotifyChange(ENotifyDisk, clientDiskChanges[i]); + test.Printf(_L("diskChangeStatus %d"), clientDiskChanges[i].Int()); + test(clientDiskChanges[i] == KRequestPending); + } + + + // Issue a EFsDismountNotifyClients + TheFs.NotifyDismount(driveNo, clientComplete, EFsDismountNotifyClients); + test(clientComplete == KRequestPending); + + + // Check all clients have received the notification + for(i=0; i< KNumClients; i++) + { + User::WaitForRequest(clientNotifies[i]); + test(clientNotifies[i] == KErrNone); + + test.Printf(_L("diskChangeStatus %d"), clientDiskChanges[i].Int()); + test(clientDiskChanges[i] == KRequestPending); + } + + // verify dismount has not yet completed + test(clientComplete == KRequestPending); + + + // first client re-registers for dismount notifications + clientFs[0].NotifyDismount(driveNo, clientNotifies[0]); + test(clientNotifies[0] == KRequestPending); + + // first client acknowledges the dismount request + r = clientFs[0].AllowDismount(driveNo); + test(r == KErrNone); + + + // cancel dismount +// TheFs.NotifyDismountCancel(clientComplete); + TheFs.NotifyDismountCancel(); + test(clientComplete == KErrCancel); + User::WaitForRequest(clientComplete); + + // Check all clients have received a disk change notification - + // the file server should send a disk change notification when RFs::NotifyDismountCancel() is called + for(i=0; i< KNumClients; i++) + { + User::WaitForRequest(clientDiskChanges[i]); + test.Printf(_L("diskChangeStatus %d"), clientDiskChanges[i].Int()); + test(clientDiskChanges[i] == KErrNone); + } + + + // cleanup + for(i=0; i< KNumClients; i++) + { + clientFs[i].Close(); test(r==KErrNone); } - else - { - r=TheFs.MountFileSystem(fsName,driveNo); - test_KErrNone(r); - } - } diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/server/t_format.cpp --- a/kerneltest/f32test/server/t_format.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/server/t_format.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -741,34 +741,6 @@ test_Value(nRes, nRes == KErrDisMounted); file1.Close(); //-- this will make the previously "Dismounted" mount die. - //--------------------------------------------------------------------------------- - //-- 3. check that forced formatting will complete NotifyDismount - test.Printf(_L("Test forced formatting completes NotifyDismount\n")); - TRequestStatus stat1; - - nRes = file1.Replace(TheFs, KFname, EFileWrite); - test_KErrNone(nRes); - - TheFs.NotifyDismount(gDrive, stat1, EFsDismountRegisterClient); - test(stat1.Int() == KRequestPending); - - fmtMode = EQuickFormat; - nRes = format.Open(TheFs, drivePath, fmtMode, fmtCnt); - test_Value(nRes, nRes == KErrInUse); - format.Close(); - - test(stat1.Int() == KRequestPending); - - fmtMode = EQuickFormat | EForceFormat; - nRes = format.Open(TheFs, drivePath, fmtMode, fmtCnt); - test_KErrNone(nRes); - format.Close(); - - User::WaitForRequest(stat1); - test(stat1.Int() == KErrNone); - - buf8.SetLength(22); - nRes = file1.Write(buf8); test_Value(nRes, nRes == KErrDisMounted); file1.Close(); diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/group/t_13cases.mmp --- a/kerneltest/f32test/smassstorage/group/t_13cases.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/group/t_13cases.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -28,6 +28,7 @@ USERINCLUDE ../t_13cases/inc +USERINCLUDE ../t_13cases/traces USERINCLUDE ../../../../userlibandfileserver/fileserver/smassstorage/inc OS_LAYER_SYSTEMINCLUDE_SYMBIAN diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/group/t_gml_tur.mmp --- a/kerneltest/f32test/smassstorage/group/t_gml_tur.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/group/t_gml_tur.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -27,6 +27,7 @@ SOURCE cactivedevicestatenotifierbase.cpp USERINCLUDE ../inc +USERINCLUDE ../traces USERINCLUDE ../../../../userlibandfileserver/fileserver/smassstorage/inc OS_LAYER_SYSTEMINCLUDE_SYMBIAN diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/group/t_ms_mocksvr.mmp --- a/kerneltest/f32test/smassstorage/group/t_ms_mocksvr.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/group/t_ms_mocksvr.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -22,7 +22,8 @@ UID 0x1000007B 0x101F7774 OS_LAYER_SYSTEMINCLUDE_SYMBIAN -USERINCLUDE ../inc +USERINCLUDE ../inc +USERINCLUDE ../traces USERINCLUDE ../../../../userlibandfileserver/fileserver/smassstorage/inc SOURCEPATH ../src diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/group/t_msdrive.mmp --- a/kerneltest/f32test/smassstorage/group/t_msdrive.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/group/t_msdrive.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -25,6 +25,7 @@ SOURCE drivepublisher.cpp LIBRARY euser.lib +USERINCLUDE ../traces USERINCLUDE ../../../../userlibandfileserver/fileserver/inc OS_LAYER_SYSTEMINCLUDE_SYMBIAN USERINCLUDE ../../../../userlibandfileserver/fileserver/smassstorage/inc diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/group/t_msfs.mmp --- a/kerneltest/f32test/smassstorage/group/t_msfs.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/group/t_msfs.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -47,8 +47,9 @@ #endif OS_LAYER_SYSTEMINCLUDE_SYMBIAN -USERINCLUDE ../../../../userlibandfileserver/fileserver/smassstorage/inc -USERINCLUDE ../inc +USERINCLUDE ../../../../userlibandfileserver/fileserver/smassstorage/inc +USERINCLUDE ../traces +USERINCLUDE ../inc capability NetworkControl DiskAdmin diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/group/t_msfs_scsi.mmp --- a/kerneltest/f32test/smassstorage/group/t_msfs_scsi.mmp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/group/t_msfs_scsi.mmp Mon Oct 11 17:54:41 2010 +0100 @@ -29,8 +29,10 @@ LIBRARY euser.lib efsrv.lib hal.lib OS_LAYER_SYSTEMINCLUDE_SYMBIAN -USERINCLUDE ../../../../userlibandfileserver/fileserver/smassstorage/inc -USERINCLUDE ../scsiprot +USERINCLUDE ../../../../userlibandfileserver/fileserver/smassstorage/inc +USERINCLUDE ../inc +USERINCLUDE ../traces +USERINCLUDE ../scsiprot SMPSAFE diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/inc/massstoragedebug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/smassstorage/inc/massstoragedebug.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,77 @@ +/** +* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Class declaration for MassStorageDebug +* +* +*/ + + + +/** + @file +*/ + +#ifndef __MASSSTORAGEDEBUG_H__ +#define __MASSSTORAGEDEBUG_H__ + +#include +#include + +//#define _USBMS_DEBUG_PRINT_ + +// Display some info during IN double-buffering +//#define PRINT_MSDC_MULTITHREADED_READ_INFO + + +#if defined(_USBMS_DEBUG_PRINT_) && (defined(_DEBUG) || defined(_DEBUG_RELEASE)) +#define __PRINT(t) {RDebug::Print(t);} +#define __PRINT1(t,a) {RDebug::Print(t,a);} +#define __PRINT2(t,a,b) {RDebug::Print(t,a,b);} +#define __PRINT3(t,a,b,c) {RDebug::Print(t,a,b,c);} +#define __PRINT4(t,a,b,c,d) {RDebug::Print(t,a,b,c,d);} +#define __PRINT5(t,a,b,c,d,e) {RDebug::Print(t,a,b,c,d,e);} +#define __PRINT8BIT1(t,a) {TFileName temp;temp.Copy(a);RDebug::Print(t,&temp);} +#define __PRINT1TEMP(t,a) {TBuftemp(a);RDebug::Print(t,&temp);} +#define __PRINTERR(txt, err) {if(KErrNone != err) __PRINT1(txt, err);} + +_LIT(KMsgIn, ">>%S\n"); +_LIT(KMsgOut,"<<%S\n"); + +class TMSLogFn +{ + protected: + TBuf<100> iName; + + public: + TMSLogFn(const TDesC& aName){iName = aName; RDebug::Print(KMsgIn, &iName);}; + ~TMSLogFn(){RDebug::Print(KMsgOut, &iName);}; +}; + +#define __FNLOG(name) TMSLogFn __fn_log__(_L(name)) + +#else +#define __PRINT(t) +#define __PRINT1(t,a) +#define __PRINT2(t,a,b) +#define __PRINT3(t,a,b,c) +#define __PRINT4(t,a,b,c,d) +#define __PRINT5(t,a,b,c,d,e) +#define __PRINT8BIT1(t,a) +#define __PRINT1TEMP(t,a) +#define __PRINTERR(txt,err) +#define __FNLOG(name) +#endif + +#endif // __MASSSTORAGEDEBUG_H__ diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/inc/t_cusbmassstoragecontroller.h --- a/kerneltest/f32test/smassstorage/inc/t_cusbmassstoragecontroller.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/inc/t_cusbmassstoragecontroller.h Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -25,7 +25,7 @@ #include #include "cusbmassstorageserver.h" -#include "protocol.h" +#include "mprotocol.h" #include "massstoragedebug.h" /** diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/inc/t_gml_tur_protocol.h --- a/kerneltest/f32test/smassstorage/inc/t_gml_tur_protocol.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/inc/t_gml_tur_protocol.h Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -23,10 +23,6 @@ #ifndef __T_GML_TUR_PROTOCOL_H__ #define __T_GML_TUR_PROTOCOL_H__ -#include // C Class Definitions, Cleanup Stack -#include // T Type Definitions -#include // ELeave definition -#include "protocol.h" class CScsiProtocol : public CBase, public MProtocolBase { diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/scsiprot/t_ms_scsi.cpp --- a/kerneltest/f32test/smassstorage/scsiprot/t_ms_scsi.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/scsiprot/t_ms_scsi.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -23,7 +23,15 @@ #include #include #include -#include // Caps.iMediaAtt +//#include // Caps.iMediaAtt + +#include +#include // for Proxy drive + +#include "mprotocol.h" +#include "mtransport.h" +#include "scsiprot.h" +#include "drivemanager.h" #include "massstoragedebug.h" diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/scsiprot/t_ms_scsi.h --- a/kerneltest/f32test/smassstorage/scsiprot/t_ms_scsi.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/scsiprot/t_ms_scsi.h Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -23,11 +23,6 @@ #ifndef __T_MS_SCSI_H__ #define __T_MS_SCSI_H__ -#include -#include // for Proxy drive - -#include "scsiprot.h" -#include "drivemanager.h" /** diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/scsiprot/t_ms_scsi_steps.cpp --- a/kerneltest/f32test/smassstorage/scsiprot/t_ms_scsi_steps.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/scsiprot/t_ms_scsi_steps.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -29,6 +29,9 @@ #include "massstoragedebug.h" +#include "mtransport.h" +#include "mprotocol.h" +#include "scsiprot.h" #include "t_ms_main.h" #include "t_ms_scsi.h" diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/src/t_cusbmassstoragescheduler.cpp --- a/kerneltest/f32test/smassstorage/src/t_cusbmassstoragescheduler.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/src/t_cusbmassstoragescheduler.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -13,6 +13,7 @@ // Description: // +#include "massstoragedebug.h" #include "cusbmassstoragescheduler.h" #include "cusbmassstorageserver.h" diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/src/t_gml_tur.cpp --- a/kerneltest/f32test/smassstorage/src/t_gml_tur.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/src/t_gml_tur.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -17,9 +17,10 @@ #include #include #include +#include "mtransport.h" +#include "mprotocol.h" #include "t_gml_tur_protocol.h" #include "t_gml_tur_controller.h" -#include "protocol.h" #include "cbulkonlytransport.h" LOCAL_D RTest test(_L("t_gml_tur")); diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/src/t_gml_tur_controller.cpp --- a/kerneltest/f32test/smassstorage/src/t_gml_tur_controller.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/src/t_gml_tur_controller.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -13,8 +13,10 @@ // Description: // -#include "e32base.h" -#include "e32base_private.h" + + +#include +#include "mprotocol.h" #include "t_gml_tur_controller.h" /** diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/src/t_gml_tur_protocol.cpp --- a/kerneltest/f32test/smassstorage/src/t_gml_tur_protocol.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/src/t_gml_tur_protocol.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -13,6 +13,8 @@ // Description: // +#include +#include "mprotocol.h" #include "t_gml_tur_protocol.h" /** diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/src/t_ms_mountstart.cpp --- a/kerneltest/f32test/smassstorage/src/t_ms_mountstart.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/src/t_ms_mountstart.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -52,10 +52,10 @@ @internalTechnology */ +#define __E32TEST_EXTENSION__ #include #include #include -#include #include #include #include @@ -571,7 +571,9 @@ test(trsClientComplete == KErrCancel); test.Next(_L("...issuing a forced dismount request")); fs.NotifyDismount(removalDrvNo, trsClientComplete, EFsDismountForceDismount); - test(trsClientComplete == KErrNone); + + User::WaitForRequest(trsClientComplete); + test_KErrNone(trsClientComplete.Int()); expectedAllowDismountRet = KErrNotReady; expectedCompletionCode = KErrNone; } @@ -689,7 +691,8 @@ // Since all clients have been closed, the next stage should result in a dismount test.Next(_L("Notify clients of pending media removal and check status")); fs.NotifyDismount(removalDrvNo, trsClientComplete, EFsDismountNotifyClients); - test(trsClientComplete == KErrNone); + User::WaitForRequest(trsClientComplete); + test_KErrNone(trsClientComplete.Int()); test.Next(_L("Mount FAT FS on to the removal drive")); LOG_AND_TEST(KErrNone, fs.MountFileSystem(fsName, removalDrvNo)); diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/t_13cases/inc/cusbmassstoragecontroller.h --- a/kerneltest/f32test/smassstorage/t_13cases/inc/cusbmassstoragecontroller.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/t_13cases/inc/cusbmassstoragecontroller.h Mon Oct 11 17:54:41 2010 +0100 @@ -28,15 +28,6 @@ class CBulkOnlyTransport; -/** -Stub drive manager for bulk-only transport testing. -*/ -class CDriveManager - { -public: - TInt Connect(TUint aLun); - TInt Disconnect(TUint aLun); - }; /** Stub Mass Storage Controller class for bulk-only transport testing. diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/t_13cases/inc/drivemanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/smassstorage/t_13cases/inc/drivemanager.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,35 @@ +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** @file +@internalTechnology +*/ + +#ifndef __DRIVEMANAGER_H__ +#define __DRIVEMANAGER_H__ + +/** +Stub drive manager for bulk-only transport testing. +*/ +class CDriveManager + { +public: + TInt Connect(TUint aLun); + TInt Disconnect(TUint aLun); + }; + + +#endif diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/t_13cases/inc/massstoragedebug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/smassstorage/t_13cases/inc/massstoragedebug.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,77 @@ +/** +* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Class declaration for MassStorageDebug +* +* +*/ + + + +/** + @file +*/ + +#ifndef __MASSSTORAGEDEBUG_H__ +#define __MASSSTORAGEDEBUG_H__ + +#include +#include + +//#define _USBMS_DEBUG_PRINT_ + +// Display some info during IN double-buffering +//#define PRINT_MSDC_MULTITHREADED_READ_INFO + + +#if defined(_USBMS_DEBUG_PRINT_) && (defined(_DEBUG) || defined(_DEBUG_RELEASE)) +#define __PRINT(t) {RDebug::Print(t);} +#define __PRINT1(t,a) {RDebug::Print(t,a);} +#define __PRINT2(t,a,b) {RDebug::Print(t,a,b);} +#define __PRINT3(t,a,b,c) {RDebug::Print(t,a,b,c);} +#define __PRINT4(t,a,b,c,d) {RDebug::Print(t,a,b,c,d);} +#define __PRINT5(t,a,b,c,d,e) {RDebug::Print(t,a,b,c,d,e);} +#define __PRINT8BIT1(t,a) {TFileName temp;temp.Copy(a);RDebug::Print(t,&temp);} +#define __PRINT1TEMP(t,a) {TBuftemp(a);RDebug::Print(t,&temp);} +#define __PRINTERR(txt, err) {if(KErrNone != err) __PRINT1(txt, err);} + +_LIT(KMsgIn, ">>%S\n"); +_LIT(KMsgOut,"<<%S\n"); + +class TMSLogFn +{ + protected: + TBuf<100> iName; + + public: + TMSLogFn(const TDesC& aName){iName = aName; RDebug::Print(KMsgIn, &iName);}; + ~TMSLogFn(){RDebug::Print(KMsgOut, &iName);}; +}; + +#define __FNLOG(name) TMSLogFn __fn_log__(_L(name)) + +#else +#define __PRINT(t) +#define __PRINT1(t,a) +#define __PRINT2(t,a,b) +#define __PRINT3(t,a,b,c) +#define __PRINT4(t,a,b,c,d) +#define __PRINT5(t,a,b,c,d,e) +#define __PRINT8BIT1(t,a) +#define __PRINT1TEMP(t,a) +#define __PRINTERR(txt,err) +#define __FNLOG(name) +#endif + +#endif // __MASSSTORAGEDEBUG_H__ diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/t_13cases/inc/t_13cases_protocol.h --- a/kerneltest/f32test/smassstorage/t_13cases/inc/t_13cases_protocol.h Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/t_13cases/inc/t_13cases_protocol.h Mon Oct 11 17:54:41 2010 +0100 @@ -24,11 +24,7 @@ #ifndef __T_13CASES_PROTOCOL_H__ #define __T_13CASES_PROTOCOL_H__ -#include -#include -#include - -#include "protocol.h" +#include "mprotocol.h" class CScsiProtocol : public CBase, public MProtocolBase { diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/t_13cases/src/controller.cpp --- a/kerneltest/f32test/smassstorage/t_13cases/src/controller.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/t_13cases/src/controller.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -14,7 +14,10 @@ // -#include "protocol.h" +#include +#include "mprotocol.h" +#include "mtransport.h" +#include "drivemanager.h" #include "cusbmassstoragecontroller.h" #include "cbulkonlytransport.h" diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/t_13cases/src/protocol.cpp --- a/kerneltest/f32test/smassstorage/t_13cases/src/protocol.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/t_13cases/src/protocol.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -13,7 +13,10 @@ // Description: // - +#include +#include +#include "mtransport.h" +#include "mprotocol.h" #include "t_13cases_protocol.h" /** diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/t_13cases/src/t_13cases.cpp --- a/kerneltest/f32test/smassstorage/t_13cases/src/t_13cases.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/kerneltest/f32test/smassstorage/t_13cases/src/t_13cases.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -22,7 +22,10 @@ #include #include #include +#include "mtransport.h" +#include "mprotocol.h" #include "t_13cases_protocol.h" +#include "drivemanager.h" #include "cusbmassstoragecontroller.h" #include "cbulkonlytransport.h" diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/t_13cases/traces/OstTraceDefinitions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/smassstorage/t_13cases/traces/OstTraceDefinitions.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,21 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: + +#ifndef __OSTTRACEDEFINITIONS_H__ +#define __OSTTRACEDEFINITIONS_H__ +// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler +// REMOVE BEFORE CHECK-IN TO VERSION CONTROL +//#define OST_TRACE_COMPILER_IN_USE +#include +#endif diff -r ff5437e4337c -r 48e57fb1237e kerneltest/f32test/smassstorage/traces/OstTraceDefinitions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/smassstorage/traces/OstTraceDefinitions.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,21 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: + +#ifndef __OSTTRACEDEFINITIONS_H__ +#define __OSTTRACEDEFINITIONS_H__ +// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler +// REMOVE BEFORE CHECK-IN TO VERSION CONTROL +//#define OST_TRACE_COMPILER_IN_USE +#include +#endif diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/group/release.txt --- a/userlibandfileserver/fileserver/group/release.txt Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/group/release.txt Mon Oct 11 17:54:41 2010 +0100 @@ -1,3 +1,14 @@ +Version 2.00.4005 +================= +(Made by fadhliM 04/10/2010) + +1. niccox + 1. ou1cimx1#597260 smassstorage trace compiler + +2. migubarr + 1. ou1cimx1#598134 RFs::NotifyDismount(,,EFsDismountNotifyClients) doesn't always complete as expected + + Version 2.00.4004 ================= (Made by vfebvre 24/09/2010) diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/inc/f32fsys.h --- a/userlibandfileserver/fileserver/inc/f32fsys.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/inc/f32fsys.h Mon Oct 11 17:54:41 2010 +0100 @@ -251,7 +251,6 @@ IMPORT_C TName Name() const; IMPORT_C virtual TBool IsCorrectThread(); inline CFsObjectCon* Container() const; - inline TInt AccessCount() const; protected: void DoClose(); TInt UniqueID() const; @@ -469,7 +468,11 @@ TInt DismountProxyDrive(); TInt ForceUnmountFileSystemForFormatting(); -public: + void DismountClientAdded(); + void DismountClientRemoved(); + TInt DismountClientCount(); + TInt DeferredDismountCheck(); + void DismountLock(); TInt DismountUnlock(); TInt DismountLocked() const; @@ -518,7 +521,6 @@ IMPORT_C TBool IsMainThread() const; IMPORT_C void DriveFault(TBool aDriveError) const; void DoDismount(); - void DoCompleteDismountNotify(TInt aCompletionCode); private: @@ -526,7 +528,7 @@ enum { ENotifyOff = 0x01, - EDismountDeferred= 0x02, + EDismountDeferred= 0x02, // Dismount initiated, waiting for clients to respond with EFsAllowDismount or files to become unclamped ENotRugged = 0x04, EClampPresent = 0x08, EDriveIsSynch = 0x10, //-- is set on mount when the drive is synchronous (doesn't have its own thread) @@ -550,9 +552,9 @@ TInt iDismountLock; TInt iMountFailures; // number of times the mount has failed TInt iLastMountError; - - TInt iSpare1; - TInt iSpare2; + + TInt iDismountClientCount; // number of EFsAllowDismount requests pending following a EFsDismountNotifyClients request + CFsInternalRequest* iDeferredDismountRequest; friend class LocalDrives; // for access to iChanged flag @@ -2039,9 +2041,6 @@ void InitL(); inline CFileCB& File(); - // override CFsDispatchObject::Close() so that we can flush dirty data - void Close(); - // For serialising aync requests TBool RequestStart(CFsMessageRequest* aRequest); void RequestEnd(CFsMessageRequest* aRequest); diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/inc/f32fsys.inl --- a/userlibandfileserver/fileserver/inc/f32fsys.inl Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/inc/f32fsys.inl Mon Oct 11 17:54:41 2010 +0100 @@ -1347,6 +1347,4 @@ inline TInt CFsObject::Dec() { return __e32_atomic_tas_ord32(&iAccessCount, 1, -1, 0); } -inline TInt CFsObject::AccessCount() const - {return iAccessCount;} diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/inc/f32ver.h --- a/userlibandfileserver/fileserver/inc/f32ver.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/inc/f32ver.h Mon Oct 11 17:54:41 2010 +0100 @@ -58,6 +58,6 @@ @see TVersion */ -const TInt KF32BuildVersionNumber=4004; +const TInt KF32BuildVersionNumber=4005; // #endif diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/sfile/sf_drv.cpp --- a/userlibandfileserver/fileserver/sfile/sf_drv.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_drv.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -130,6 +130,10 @@ iMount=TheContainer->CreateL(); TInt r=iLock.CreateLocal(); User::LeaveIfError(r); + + iDeferredDismountRequest = new(ELeave) CFsInternalRequest; + iDeferredDismountRequest->Set(DeferredDismountOp,NULL); + iDeferredDismountRequest->SetDriveNumber(aDriveNumber); } TInt TDrive::CheckMountAndEntryName(const TDesC& aName) @@ -2345,10 +2349,66 @@ { return(iDismountLock); } +/** +DismountClientAdded() - + +Increments the count of clients which need to respond to a dismount request - by calling RFs::AllowDismount() - +before the dismount can process + +Called when a EFsDismountRegisterClient request is completed by RFs::NotifyDismount(,,EFsDismountNotifyClients) +*/ +void TDrive::DismountClientAdded() + { + __e32_atomic_add_ord32(&iDismountClientCount, (TUint32) 1); + } + +/** +DismountClientRemoved() - +Called when a EFsDismountRegisterClient request is deleted. E.g. by RFs::AllowDismount() +*/ +void TDrive::DismountClientRemoved() + { + ASSERT(iDismountClientCount > 0); + if ((__e32_atomic_add_ord32(&iDismountClientCount, (TUint32) -1) == 1) && + (!FsThreadManager::IsDriveThread(iDriveNumber,EFalse)) && + DismountDeferred()) + { + iDeferredDismountRequest->Dispatch(); + } + } + +TInt TDrive::DismountClientCount() + { + return iDismountClientCount; + } + + +/* +Dismount the file system if a deferred dismount has been schedulued and there are no waiting clients and no clamps +*/ +TInt TDrive::DeferredDismountCheck() + { + // Don't dismount if no deferred dismount is scheduled + if (!DismountDeferred()) + return KErrNone; + + // Don't dismount if clients are waiting + if (DismountClientCount() > 0) + return KErrNone; + + // Don't dismount if files are clamped + TInt clampErr = ClampsOnDrive(); + if (clampErr != 0 && clampErr != KErrNotSupported) + return KErrNone; + + // Nothing to wait for, so dismount immediately + __ASSERT_DEBUG(GetFSys(), Fault(EAllowDismount)); + return DeferredDismount(); + } /** -Pending flag - set while waiting for clients to accept the dismount +Dismount deferred flag - set while waiting for clients to accept the dismount or files to become unclamped */ void TDrive::SetDismountDeferred(TBool aPending) { @@ -2529,19 +2589,7 @@ //---------------------------------------------------------------------------- /** - Complete, remove and delete notification requests - @param aCompletionCode completion code for some notifications -*/ -void TDrive::DoCompleteDismountNotify(TInt aCompletionCode) - { - FsNotify::HandleDismount(EFsDismountRegisterClient, iDriveNumber, ETrue, KErrNone); - FsNotify::HandleDismount(EFsDismountNotifyClients, iDriveNumber, ETrue, aCompletionCode); - FsNotify::HandleDismount(EFsDismountForceDismount, iDriveNumber, ETrue, aCompletionCode); - } - -//---------------------------------------------------------------------------- -/** - a helper method that allows forced dismounting current mount for volume formatting. + a helper method that allows forced unmounting current mount for volume formatting. */ TInt TDrive::ForceUnmountFileSystemForFormatting() { @@ -2566,8 +2614,6 @@ ForceDismount(); - DoCompleteDismountNotify(KErrDisMounted); //-- complete all dismount notifications - return KErrNone; } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/sfile/sf_file.cpp --- a/userlibandfileserver/fileserver/sfile/sf_file.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_file.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -2772,22 +2772,6 @@ iFile->Close(); } -void CFileShare::Close() - { - - // Flush the write cache before closing the file share - // NB If there is any dirty data, then a new request will be allocated which will increase - // the reference count on this file share, thus preventing it from being deleted untill all - // data has been flushed - if (AccessCount() == 1) - { - CFileCache* fileCache = File().FileCache(); - if (fileCache) - fileCache->FlushDirty(); - } - - CFsDispatchObject::Close(); - } /** @@ -3267,8 +3251,8 @@ { ASSERT(NoOfClamps() == 0); drive.SetClampFlag(EFalse); - if (drive.DismountDeferred()) - r = drive.DeferredDismount(); + // dismount now if no clients waiting... + r = drive.DeferredDismountCheck(); } return r; diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/sfile/sf_file_cache.cpp --- a/userlibandfileserver/fileserver/sfile/sf_file_cache.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_file_cache.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -2117,7 +2117,13 @@ // Remember the last session which caused the file to become dirty // Always record whether any session has reserved access so the CheckDiskSpace() behaves correctly if (iDirtyDataOwner == NULL || session->ReservedAccess(iDriveNum)) + { + if (iDirtyDataOwner) + iDirtyDataOwner->Close(); iDirtyDataOwner = session; + // open the session to prevent it from being deleted while there is dirty data + iDirtyDataOwner->Open(); + } // start a timer after which file will be flushed CDriveThread* driveThread=NULL; @@ -2132,6 +2138,9 @@ */ void CFileCache::MarkFileClean() { + if (iDirtyDataOwner) + iDirtyDataOwner->Close(); + iDirtyDataOwner = NULL; if (!iDriveThread) diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/sfile/sf_func.h --- a/userlibandfileserver/fileserver/sfile/sf_func.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_func.h Mon Oct 11 17:54:41 2010 +0100 @@ -1068,6 +1068,13 @@ static TInt DoRequestL(CFsRequest* aRequest); }; +class TFsDeferredDismount + { +public: + static TInt Initialise(CFsRequest* aRequest); + static TInt DoRequestL(CFsRequest* aRequest); + }; + void GetFileFromScratch(CFsRequest* aRequest, CFileShare*& aShare, CFileCB*& aFile); #endif // __SF_FUNC_H diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/sfile/sf_notify.cpp --- a/userlibandfileserver/fileserver/sfile/sf_notify.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_notify.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -40,7 +40,11 @@ // // { - __ASSERT_DEBUG(!iLink.iNext,Fault(ENotifyInfoDestructor)); + // message should have been completed already + __ASSERT_DEBUG(iMessage.IsNull(), Fault(ENotifyInfoDestructor)); + + __ASSERT_DEBUG(iLink.iNext,Fault(ENotifyInfoDestructor)); + iLink.Deque(); } void CNotifyInfo::Complete(TInt aError) @@ -49,10 +53,8 @@ // { __PRINT2(_L("CNotifyInfo::Complete 0x%x error=%d"),this,aError); - if (!iMessage.IsNull()) // Dismount notifiers may be completed but remain in the list - { // until handled by the client or the session is closed. + if (!iMessage.IsNull()) iMessage.Complete(aError); - } } @@ -259,12 +261,27 @@ break; case EFsDismountRegisterClient: __ASSERT_ALWAYS(TheDrives[iDriveNumber].DismountUnlock() >= 0, Fault(ENotifyDismountCancel)); + __ASSERT_ALWAYS(iMessage.IsNull(), Fault(ENotifyDismountCancel)); + TheDrives[iDriveNumber].DismountClientRemoved(); break; default: break; } } +void CDismountNotifyInfo::Complete(TInt aError) + { + __PRINT2(_L("CDismountNotifyInfo::Complete 0x%x error=%d"),this,aError); + if (!iMessage.IsNull()) + { + iMessage.Complete(aError); + // inc count of messages completed by EFsDismountNotifyClients & waiting for an EFsAllowDismount request from client + if (iMode == EFsDismountRegisterClient) + TheDrives[iDriveNumber].DismountClientAdded(); + } + } + + void CDismountNotifyInfo::Initialise(TNotifyDismountMode aMode, TInt aDriveNumber, TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession) { iMode = aMode; @@ -324,7 +341,6 @@ { isFound=ETrue; info->Complete(aCompletionCode); - info->iLink.Deque(); delete(info); if(aStatus) break; @@ -333,18 +349,6 @@ return(isFound); } -CNotifyInfo* TBaseQue::DoFindEntry(CSessionFs* aSession, TRequestStatus* aStatus) - { - TDblQueIter q(iHeader); - CNotifyInfo* info; - while((info=q++)!=NULL) - { - if(info->Session()==aSession && (!aStatus || aStatus==info->Status())) - return info; - } - return NULL; - } - void TBaseQue::DoCancelAll(TInt aCompletionCode) // // Cancel all notifications @@ -356,7 +360,6 @@ while((info=q++)!=NULL) { info->Complete(aCompletionCode); - info->iLink.Deque(); delete(info); } __ASSERT_DEBUG(iHeader.IsEmpty(),Fault(EBaseQueCancel)); @@ -433,7 +436,6 @@ { __PRINT1(_L("TChangeQue::CheckChange()-Matching info=0x%x"),info); info->Complete(KErrNone); - info->iLink.Deque(); delete(info); } } @@ -530,7 +532,6 @@ { __PRINT1(_L("TDiskSpaceQue::CheckDiskSpace()-Matching info=0x%x"),info); info->Complete(KErrNone); - info->iLink.Deque(); delete(info); } } @@ -579,7 +580,6 @@ { __PRINT1(_L("TDiskSpaceQue::CheckDiskSpace()-Matching info=0x%x"),info); info->Complete(KErrNone); - info->iLink.Deque(); delete(info); } } @@ -646,7 +646,6 @@ { __PRINT1(_L("TDebugQue::CheckDebug()-Matching info=0x%x"),info); info->Complete(KErrNone); - info->iLink.Deque(); delete(info); } } @@ -664,22 +663,41 @@ return(KErrNone); } -TInt TDismountNotifyQue::CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus) +void TDismountNotifyQue::CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus) // -// Returns the drive number or KErrNotFound // { iQLock.Wait(); - // return the drive number - CDismountNotifyInfo* info = (CDismountNotifyInfo*) DoFindEntry(aSession, aStatus); - TInt driveNumber = info ? info->DriveNumber() : KErrNotFound; + TDblQueIter q(iHeader); + CDismountNotifyInfo* info; + while((info=q++)!=NULL) + { + if(info->Session()==aSession && (!aStatus || aStatus==info->Status())) + { + TInt driveNumber = info->DriveNumber(); + + info->Complete(aCompletionCode); + TInt mode = info->Mode(); + + delete info; + info = NULL; - TBaseQue::DoCancelSession(aSession,aCompletionCode,aStatus); + // if we're cancelling a dismount request (EFsDismountNotifyClients or EFsDismountForceDismount), + // then we need to cancel the deferred dismount and issue a disk change notification as observers + // may be expecting one... + if (mode == EFsDismountNotifyClients || mode == EFsDismountForceDismount) + { + TheDrives[driveNumber].SetDismountDeferred(EFalse); + FsNotify::DiskChange(driveNumber); + } + + if(aStatus) + break; + } + } iQLock.Signal(); - - return(driveNumber); } void TDismountNotifyQue::CancelAll(TInt aCompletionCode) @@ -708,40 +726,43 @@ __PRINT1(_L("TDismountNotifyQue::CheckDismount()-Matching info=0x%x"),info); info->Complete(aError); if(aRemove) - { - info->iLink.Deque(); - delete(info); - } + delete info; } } - __ASSERT_ALWAYS(!aRemove || TheDrives[aDrive].DismountLocked() == 0, Fault(EDismountLocked)); + __ASSERT_ALWAYS(!(aRemove && aMode == EFsDismountRegisterClient && TheDrives[aDrive].DismountLocked() > 0), Fault(EDismountLocked)); iQLock.Signal(); } TBool TDismountNotifyQue::HandlePendingDismount(CSessionFs* aSession, TInt aDrive) // -// Determine if the session has any outstanding dismount notifications on the specified drive. +// Determine if the session has any outstanding *completed* dismount notifications on the specified drive +// and delete them. Called from TFsAllowDismount::DoRequestL() // { iQLock.Wait(); - TDblQueIter q(iHeader); - CNotifyInfo* info; + TDblQueIter q(iHeader); + CDismountNotifyInfo* info; + + TBool entryFound = EFalse; + while((info=q++)!=NULL) { __ASSERT_DEBUG(info->Type()==CNotifyInfo::EDismount,Fault(EBadDismountNotifyType)); if(((CDismountNotifyInfo*)info)->IsMatching(EFsDismountRegisterClient, aDrive, aSession)) { - __PRINT1(_L("TDismountNotifyQue::CheckDismount()-Pending info=0x%x"),info); - info->iLink.Deque(); - delete(info); - iQLock.Signal(); - return ETrue; + __PRINT1(_L("TDismountNotifyQue::HandlePendingDismount()-Pending info=0x%x"),info); + + if (info->Completed()) + delete info; + + entryFound = ETrue; } } iQLock.Signal(); - return EFalse; + + return entryFound; } void FsNotify::Initialise() @@ -948,15 +969,14 @@ iDebugQue.CancelSession(aSession,KErrCancel,aStatus); } -TInt FsNotify::CancelDismountNotifySession(CSessionFs* aSession, TRequestStatus* aStatus) +void FsNotify::CancelDismountNotifySession(CSessionFs* aSession, TRequestStatus* aStatus) // // Cancel all media removal notification(s) setup by aSession (if aStatus == NULL) // else cancels all outstanding notifications(s) for the session // { __PRINT2(_L("FsNotify::CancelDismountNotifySession() aSession=0x%x aStatus=0x%x"),aSession,aStatus); - TInt drive = iDismountNotifyQue.CancelSession(aSession,KErrCancel,aStatus); - return drive; + iDismountNotifyQue.CancelSession(aSession,KErrCancel,aStatus); } void FsNotify::CancelSession(CSessionFs* aSession) diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/sfile/sf_request.cpp --- a/userlibandfileserver/fileserver/sfile/sf_request.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_request.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -2212,6 +2212,9 @@ Free(); } } + else if(func==KDeferredDismount) + { + } else Fault(EInternalRequestComplete3); } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/sfile/sf_ses.cpp --- a/userlibandfileserver/fileserver/sfile/sf_ses.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_ses.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -40,9 +40,12 @@ return new(ELeave) CSessionFs; } -CSessionFs::~CSessionFs() + +void CSessionFs::Cleanup() { __PRINT1(_L("CSessionFs::~CSessionFs() deleting... = 0x%x"),this); + + CancelAsyncRequests(this); FsNotify::CancelSession(this); @@ -74,41 +77,28 @@ delete iPath; - iSessionFlagsLock.Close(); #if defined(_DEBUG) || defined(_DEBUG_RELEASE) __e32_atomic_add_ord32(&SessionCount, (TUint32) -1); #endif } +CSessionFs::~CSessionFs() + { + } + void CSessionFs::Close() { - TheFileServer->SessionQueueLockWait(); - - if (iAccessCount == 1) - { - // close the objects owned by this session - // NB closing a CFileShare may allocate a request to flush dirty data which will - // in turn increment iAccessCount on this session - if (iHandles) - { - // Cancel any ASYNC requests belonging to this session BEFORE - // CSessionFs is deleted to avoid a KERN-EXEC 44 (EBadMessageHandle) - CancelAsyncRequests(this); - delete iHandles; - iHandles = NULL; - } - } - if (__e32_atomic_tas_ord32(&iAccessCount, 1, -1, 0) == 1) { RMessage2 message = iMessage; + Cleanup(); + TheFileServer->SessionQueueLockWait(); delete this; + TheFileServer->SessionQueueLockSignal(); // NB Must complete the message AFTER the session has been deleted... message.Complete(KErrNone); } - - TheFileServer->SessionQueueLockSignal(); } void CSessionFs::CreateL() @@ -119,8 +109,6 @@ __PRINT1(_L("CSessionFs::CreateL 0x%x"),this); iHandles=CFsObjectIx::NewL(); - TInt r = iSessionFlagsLock.CreateLocal(); - User::LeaveIfError(r); } TInt CSessionFs::CurrentDrive() @@ -231,35 +219,27 @@ TBool CSessionFs::TestSessionFlags(TUint32 aFlags) { - iSessionFlagsLock.Wait(); - TBool b = (iSessionFlags & aFlags) == aFlags; - iSessionFlagsLock.Signal(); - return(b); + return (TBool) ((iSessionFlags & aFlags) == aFlags); } void CSessionFs::SetSessionFlags(TUint32 aBitsToSet, TUint32 aBitsToClear) { - iSessionFlagsLock.Wait(); + // currently this only called from the main thread. + __CHECK_MAINTHREAD(); - iSessionFlags &= ~aBitsToClear; - iSessionFlags |= aBitsToSet; - - iSessionFlagsLock.Signal(); + __e32_atomic_ior_ord_ptr(&iSessionFlags, aBitsToSet); + __e32_atomic_and_ord_ptr(&iSessionFlags, ~aBitsToClear); } void CSessionFs::CloseRequestCountInc() { - iSessionFlagsLock.Wait(); - iCloseRequestCount++; - iSessionFlagsLock.Signal(); + __e32_atomic_add_ord32(&iCloseRequestCount, (TUint32) 1); } void CSessionFs::CloseRequestCountDec() { - iSessionFlagsLock.Wait(); - iCloseRequestCount--; - iSessionFlagsLock.Signal(); + __e32_atomic_add_ord32(&iCloseRequestCount, (TUint32) -1); } // diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/sfile/sf_std.h --- a/userlibandfileserver/fileserver/sfile/sf_std.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_std.h Mon Oct 11 17:54:41 2010 +0100 @@ -922,12 +922,12 @@ private: CSessionFs(); ~CSessionFs(); + void Cleanup(); private: TInt iResourceCountMark; TInt iResourceCount; TInt iSessionFlags; - RFastLock iSessionFlagsLock; CFsObjectIx* iHandles; HBufC* iPath; RArray iReservedDriveAccess; @@ -1466,11 +1466,12 @@ public: ~CNotifyInfo(); void Initialise(TInfoType aType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession); - void Complete(TInt aError); + virtual void Complete(TInt aError); // inline CSessionFs* Session(); inline TRequestStatus* Status(); - inline TInfoType Type() const {return(iType);} + inline TInfoType Type() {return(iType);} + inline TBool Completed() {return iMessage.IsNull();} public: TDblQueLink iLink; protected: @@ -1522,9 +1523,12 @@ { public: ~CDismountNotifyInfo(); + virtual void Complete(TInt aError); void Initialise(TNotifyDismountMode aMode, TInt aDriveNumber,TRequestStatus* iStatus,const RMessagePtr2& aMessage,CSessionFs* aSession); TBool IsMatching(TNotifyDismountMode aMode, TInt aDriveNumber, CSessionFs* aSession); inline TInt DriveNumber() {return iDriveNumber;} + inline TNotifyDismountMode Mode() {return iMode;} + private: TNotifyDismountMode iMode; TInt iDriveNumber; @@ -1541,7 +1545,6 @@ void DoAddNotify(CNotifyInfo* aInfo); TBool DoCancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL); void DoCancelAll(TInt aCompletionCode); - CNotifyInfo* DoFindEntry(CSessionFs* aSession, TRequestStatus* aStatus=NULL); TBool IsEmpty(); protected: TDblQue iHeader; @@ -1589,7 +1592,7 @@ { public: TInt AddNotify(CNotifyInfo* aInfo); - TInt CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL); + void CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL); void CancelAll(TInt aCompletionCode); void CheckDismount(TNotifyDismountMode aMode, TInt aDrive, TBool aRemove, TInt aError); TBool HandlePendingDismount(CSessionFs* aSession, TInt aDrive); @@ -1612,7 +1615,7 @@ static void CancelChangeSession(CSessionFs* aSession,TRequestStatus* aStatus=NULL); static void CancelDiskSpaceSession(CSessionFs* aSession,TRequestStatus* aStatus=NULL); static void CancelDebugSession(CSessionFs* aSession, TRequestStatus* aStatus=NULL); - static TInt CancelDismountNotifySession(CSessionFs* aSession, TRequestStatus* aStatus=NULL); + static void CancelDismountNotifySession(CSessionFs* aSession, TRequestStatus* aStatus=NULL); static void CancelSession(CSessionFs* aSession); static TBool HandlePendingDismount(CSessionFs* aSession, TInt aDriveNumber); static TBool IsChangeQueEmpty(TInt aDrive); @@ -1704,12 +1707,13 @@ const TInt KDispatchObjectClose=KMaxTInt-1; const TInt KSessionInternalReserved2=KMaxTInt-2; // not used any more - placeholder const TInt KSessionInternalReserved3=KMaxTInt-3; // not used any more - placeholder -const TInt KSessionInternalReserved4=KMaxTInt-4; // not used any more - placeholder +const TInt KDeferredDismount=KMaxTInt-4; const TInt KFileShareClose=KMaxTInt-5; const TInt KFlushDirtyData=KMaxTInt-6; const TOperation DispatchObjectCloseOp= {KDispatchObjectClose, EInternalRequest, &TFsCloseObject::Initialise, NULL, &TFsCloseObject::DoRequestL }; const TOperation FileShareCloseOp= {KFileShareClose, EInternalRequest, &TFsCloseFileShare::Initialise, NULL, &TFsCloseFileShare::DoRequestL }; +const TOperation DeferredDismountOp= {KDeferredDismount, EInternalRequest, &TFsDeferredDismount::Initialise, NULL, &TFsDeferredDismount::DoRequestL }; extern TBool OpenOnDriveZOnly; extern TBool LocalFileSystemInitialized; diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/sfile/sf_sys.cpp --- a/userlibandfileserver/fileserver/sfile/sf_sys.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_sys.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1181,7 +1181,9 @@ if (err == CFsRequest::EReqActionBusy) return err; - DoCompleteDismountNotify(err); + // Complete, remove and delete notification requests + FsNotify::HandleDismount(EFsDismountNotifyClients, iDriveNumber, ETrue, err); + FsNotify::HandleDismount(EFsDismountForceDismount, iDriveNumber, ETrue, err); SetDismountDeferred(EFalse); @@ -1358,9 +1360,8 @@ // { CSessionFs* session = aRequest->Session(); - TInt drive = FsNotify::CancelDismountNotifySession(session, (TRequestStatus*)aRequest->Message().Ptr0()); - if (drive >= 0) - TheDrives[drive].SetDismountDeferred(EFalse); + FsNotify::CancelDismountNotifySession(session, (TRequestStatus*)aRequest->Message().Ptr0()); + return KErrNone; } @@ -1385,22 +1386,7 @@ if(!FsNotify::HandlePendingDismount(aRequest->Session(), driveNumber)) return KErrNotFound; - if(theDrive->DismountLocked()) - return KErrNone; - - TInt clampErr = theDrive->ClampsOnDrive(); - TInt err = KErrNone; - - if ((theDrive->DismountDeferred()) && (clampErr == 0 || clampErr == KErrNotSupported)) - { - // No clamps to worry about, so dismount immediately and complete the request - __ASSERT_DEBUG(aRequest->Drive()->GetFSys(), Fault(EAllowDismount)); - - // When the last client has responded, allow the media to be forcibly dismounted - err = theDrive->DeferredDismount(); - } - - return err; + return theDrive->DeferredDismountCheck(); } TInt TFsAllowDismount::Initialise(CFsRequest* aRequest) @@ -1412,6 +1398,23 @@ } +TInt TFsDeferredDismount::Initialise(CFsRequest* /*aRequest*/) + { + return KErrNone; + } + +/* +Dismount the file system - this internal request is queued when one client issues a EFsDismountNotifyClients +request and another client with an outstanding EFsDismountRegisterClient closes their session (in the context +of the main file server thread) without sending a EFsAllowDismount request. + +*/ +TInt TFsDeferredDismount::DoRequestL(CFsRequest* aRequest) + { + return TheDrives[aRequest->DriveNumber()].DeferredDismountCheck(); + } + + TInt TFsMountProxyDrive::DoRequestL(CFsRequest* aRequest) { return LocalDrives::MountProxyDrive(aRequest); diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/cactivedevicestatenotifierbase.cpp --- a/userlibandfileserver/fileserver/smassstorage/cactivedevicestatenotifierbase.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/cactivedevicestatenotifierbase.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -11,157 +11,147 @@ * * Contributors: * -* Description: +* Description: * Class definition for Device State Notifier Base Class * */ -/** +/** @file @internalTechnology */ #include +#include "mtransport.h" +#include "mldddevicestatenotification.h" +#include "drivemanager.h" +#include "cusbmassstoragecontroller.h" +#include "cbulkonlytransport.h" + #include "cactivedevicestatenotifierbase.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cactivedevicestatenotifierbaseTraces.h" +#endif + + CActiveDeviceStateNotifierBase::CActiveDeviceStateNotifierBase(CBulkOnlyTransport& aBot, MLddDeviceStateNotification& aLddDeviceStateNotification) -/** - * - */ - : CActive(EPriorityStandard), - iBot(aBot), + : CActive(EPriorityStandard), + iBot(aBot), iLddDeviceStateNotification(aLddDeviceStateNotification), - iDeviceState(EUsbcNoState), - iOldDeviceState(EUsbcNoState) - { + iDeviceState(EUsbcNoState), + iOldDeviceState(EUsbcNoState) + { - } + } CActiveDeviceStateNotifierBase* CActiveDeviceStateNotifierBase::NewL(CBulkOnlyTransport& aBot, MLddDeviceStateNotification& aLddDeviceStateNotification) -/** - * - */ - { - CActiveDeviceStateNotifierBase* self = new (ELeave) CActiveDeviceStateNotifierBase(aBot, aLddDeviceStateNotification); - CleanupStack::PushL(self); - self->ConstructL(); - CActiveScheduler::Add(self); - CleanupStack::Pop(); // self - return (self); - } + { + CActiveDeviceStateNotifierBase* self = new (ELeave) CActiveDeviceStateNotifierBase(aBot, aLddDeviceStateNotification); + CleanupStack::PushL(self); + self->ConstructL(); + CActiveScheduler::Add(self); + CleanupStack::Pop(); // self + return (self); + } void CActiveDeviceStateNotifierBase::ConstructL() -/** - * - */ - { - __FNLOG("CActiveDeviceStateNotifierBase::ConstructL"); - } + { + } CActiveDeviceStateNotifierBase::~CActiveDeviceStateNotifierBase() -/** - * - */ - { - __PRINT(_L("CActiveDeviceStateNotifierBase::~CActiveDeviceStateNotifierBase()")); - Cancel(); // base class - } + { + Cancel(); // base class + } void CActiveDeviceStateNotifierBase::DoCancel() -/** - * - */ - { - __PRINT(_L("CActiveDeviceStateNotifierBase::DoCancel()")); - iLddDeviceStateNotification.Cancel(); - } + { + iLddDeviceStateNotification.Cancel(); + } void CActiveDeviceStateNotifierBase::RunL() -/** - * - */ - { - __FNLOG("CActiveDeviceStateNotifierBase::RunL"); - // This displays the device state. - // In a real world program, the user could take here appropriate action (cancel a - // transfer request or whatever). - __PRINT1(_L("DeviceState Notification = %d"), iDeviceState); + { + // This displays the device state. + // In a real world program, the user could take here appropriate action (cancel a + // transfer request or whatever). + + OstTrace1(TRACE_SMASSSTORAGE_STATE, CACTIVEDEVICESTATENOTIFIERBASE_100, + "DeviceState Notification = %d", iDeviceState); - if (!(iDeviceState & KUsbAlternateSetting)) - { - switch (iDeviceState) - { - case EUsbcDeviceStateUndefined: //0 - case EUsbcDeviceStateDefault: //3 - iBot.HwStop(); - break; + if (!(iDeviceState & KUsbAlternateSetting)) + { + switch (iDeviceState) + { + case EUsbcDeviceStateUndefined: //0 + case EUsbcDeviceStateDefault: //3 + iBot.HwStop(); + break; - case EUsbcDeviceStateAttached: //1 - case EUsbcDeviceStatePowered: //2 + case EUsbcDeviceStateAttached: //1 + case EUsbcDeviceStatePowered: //2 // do nothing break; - case EUsbcDeviceStateAddress: //4 - if (iOldDeviceState == EUsbcDeviceStateConfigured) + case EUsbcDeviceStateAddress: //4 + if (iOldDeviceState == EUsbcDeviceStateConfigured) { iBot.StopBulkOnlyEndpoint(); } - break; + break; - case EUsbcDeviceStateConfigured: //5 - if (iOldDeviceState == EUsbcDeviceStateSuspended) - { - iBot.HwResume(); - } - else - { - iBot.HwStart(); - } - break; - case EUsbcDeviceStateSuspended: //6 - if (iOldDeviceState == EUsbcDeviceStateConfigured) - { - iBot.HwSuspend(); - } - break; - default: - __PRINT(_L("Device State notifier: ***BAD***\n")); - iBot.HwStop(); - break; - } - iOldDeviceState = iDeviceState; - } - else if (iDeviceState & KUsbAlternateSetting) - { - __PRINT1(_L("Device State notifier: Alternate interface setting has changed: now %d\n"), iDeviceState & ~KUsbAlternateSetting); - } - Activate(); - } + case EUsbcDeviceStateConfigured: //5 + if (iOldDeviceState == EUsbcDeviceStateSuspended) + { + iBot.HwResume(); + } + else + { + iBot.HwStart(); + } + break; + case EUsbcDeviceStateSuspended: //6 + if (iOldDeviceState == EUsbcDeviceStateConfigured) + { + iBot.HwSuspend(); + } + break; + default: + OstTrace0(TRACE_SMASSSTORAGE_STATE, CACTIVEDEVICESTATENOTIFIERBASE_101, + "Device State notifier: ***BAD***"); + iBot.HwStop(); + break; + } + iOldDeviceState = iDeviceState; + } + else if (iDeviceState & KUsbAlternateSetting) + { + OstTrace1(TRACE_SMASSSTORAGE_STATE, CACTIVEDEVICESTATENOTIFIERBASE_102, + "Device State notifier: Alternate interface setting has changed: now %d", + iDeviceState & ~KUsbAlternateSetting); + } + Activate(); + } void CActiveDeviceStateNotifierBase::Activate() -/** - * - */ - { - __FNLOG("CActiveDeviceStateNotifierBase::Activate"); - if (IsActive()) - { - __PRINT(_L("Still active\n")); - return; - } - iLddDeviceStateNotification.Activate(iStatus, iDeviceState); - SetActive(); - } + { + if (IsActive()) + { + return; + } + iLddDeviceStateNotification.Activate(iStatus, iDeviceState); + SetActive(); + } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/cbulkonlytransport.cpp --- a/userlibandfileserver/fileserver/smassstorage/cbulkonlytransport.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/cbulkonlytransport.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -17,32 +17,44 @@ @file @internalTechnology */ + +#include +#include "mtransport.h" +#include "mprotocol.h" +#include "mldddevicestatenotification.h" +#include "tbulkmm.h" + +#include "drivemanager.h" +#include "cusbmassstoragecontroller.h" + #include "cbulkonlytransport.h" #include "cbulkonlytransportusbcldd.h" #if !defined(__WINS__) && !defined(__X86__) #include "cbulkonlytransportusbcscldd.h" #endif -#include "usbmsshared.h" -#include "massstoragedebug.h" -#include "cusbmassstorageserver.h" +#include "smassstorage.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cbulkonlytransportTraces.h" +#endif //CBW offsets -LOCAL_D const TInt KCbwSignatureOffset = 0; -LOCAL_D const TInt KCbwTagOffset = 4; -LOCAL_D const TInt KCbwDataTransferLengthOffset = 8; -LOCAL_D const TInt KCbwFlagOffset = 12; -LOCAL_D const TInt KCbwLunOffset = 13; -LOCAL_D const TInt KCbwCbLengthOffset = 14; +static const TInt KCbwSignatureOffset = 0; +static const TInt KCbwTagOffset = 4; +static const TInt KCbwDataTransferLengthOffset = 8; +static const TInt KCbwFlagOffset = 12; +static const TInt KCbwLunOffset = 13; +static const TInt KCbwCbLengthOffset = 14; -LOCAL_D const TInt KMaxCbwcbLength = 16; +static const TInt KMaxCbwcbLength = 16; // CSW offsets -LOCAL_D const TInt KCswSingnatureOffset = 0; -LOCAL_D const TInt KCswTagOffset = 4; -LOCAL_D const TInt KCswDataResidueOffset = 8; -LOCAL_D const TInt KCswStatusOffset = 12; - +static const TInt KCswSingnatureOffset = 0; +static const TInt KCswTagOffset = 4; +static const TInt KCswDataResidueOffset = 8; +static const TInt KCswStatusOffset = 12; /** @@ -54,35 +66,38 @@ @return Error. */ TInt TUsbRequestHdr::Decode(const TDesC8& aBuffer) - { - if (aBuffer.Length() < static_cast(KRequestHdrSize)) - { - __PRINT1(_L("TUsbRequestHdr::Decode buffer invalid length %d"), aBuffer.Length()); - return KErrGeneral; - } + { + if (aBuffer.Length() < static_cast(KRequestHdrSize)) + { + OstTrace1(TRACE_SMASSSTORAGE_USB, TUSBREQUESTHDR_DECODE_ERR, + "ERROR: USB DEVICE REQUEST invalid length 0x%x", aBuffer.Length()); + return KErrGeneral; + } - iRequestType = aBuffer[0]; - iRequest = static_cast(aBuffer[1]); - iValue = static_cast(aBuffer[2] + (aBuffer[3] << 8)); - iIndex = static_cast(aBuffer[4] + (aBuffer[5] << 8)); - iLength = static_cast(aBuffer[6] + (aBuffer[7] << 8)); - __PRINT5(_L("type=%d request=%d value=%d index=%d length=%d"), iRequestType,iRequest,iValue,iIndex,iLength); + iRequestType = aBuffer[0]; + iRequest = static_cast(aBuffer[1]); + iValue = static_cast(aBuffer[2] + (aBuffer[3] << 8)); + iIndex = static_cast(aBuffer[4] + (aBuffer[5] << 8)); + iLength = static_cast(aBuffer[6] + (aBuffer[7] << 8)); + OstTraceExt5(TRACE_SMASSSTORAGE_USB, TUSBREQUESTHDR_DECODE, + "USB DEVICE REQUEST type=0x%x request=0x%x value=%d index=%d length=%d", + iRequestType, iRequest, iValue, iIndex, iLength); - return KErrNone; - } + return KErrNone; + } /** This function determines whether data is required by the host in response to a message header. -@return TBool Flag indicating whether a data response required. +@return TBool Flag indicating whether a data response required. */ TBool TUsbRequestHdr::IsDataResponseRequired() const - { - return (iRequestType & 0x80) ? (TBool)ETrue : (TBool)EFalse; - } + { + return (iRequestType & 0x80) ? (TBool)ETrue : (TBool)EFalse; + } //------------------------------------- /** @@ -92,92 +107,89 @@ @return pointer to newly created derived class object */ CBulkOnlyTransport* CBulkOnlyTransport::NewL(TInt aNumDrives,CUsbMassStorageController& aController) - { - __FNLOG("CBulkOnlyTransport::NewL()"); - - return NewL(aNumDrives,aController, (CUsbMassStorageController::TTransportldd) 1); - } + { + return NewL(aNumDrives,aController, (CUsbMassStorageController::TTransportldd) 1); + } /** -Create an object of a class derived from CBulkOnlyTransport +Create an object of a class derived from CBulkOnlyTransport @param aNumDrives - The number of drives available for MS @param aController - reference to the parent @param aTransportLddFlag - Type of usb client ldd @return pointer to newly created derived class object */ CBulkOnlyTransport* CBulkOnlyTransport::NewL(TInt aNumDrives,CUsbMassStorageController& aController, CUsbMassStorageController::TTransportldd aTransportLddFlag) - { - __FNLOG("CBulkOnlyTransport::NewL()"); - - if (aNumDrives <=0 || static_cast(aNumDrives) > KUsbMsMaxDrives) - { - User::Leave(KErrArgument); - } + { + if (aNumDrives <=0 || static_cast(aNumDrives) > KUsbMsMaxDrives) + { + User::Leave(KErrArgument); + } #if !defined(__WINS__) && !defined(__X86__) - CBulkOnlyTransportUsbcScLdd* scTransport; + CBulkOnlyTransportUsbcScLdd* scTransport; #endif - CBulkOnlyTransportUsbcLdd* nonscTransport; - switch (aTransportLddFlag) - { - case 1: - nonscTransport = new(ELeave) CBulkOnlyTransportUsbcLdd(aNumDrives, aController); - return nonscTransport; + CBulkOnlyTransportUsbcLdd* nonscTransport; + switch (aTransportLddFlag) + { + case 1: + nonscTransport = new(ELeave) CBulkOnlyTransportUsbcLdd(aNumDrives, aController); + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_NEWL1, "CBulkOnlyTransportUsbcLdd created."); + return nonscTransport; #if !defined(__WINS__) && !defined(__X86__) - case 2: - scTransport = new(ELeave) CBulkOnlyTransportUsbcScLdd(aNumDrives, aController); - return scTransport; + case 2: + scTransport = new(ELeave) CBulkOnlyTransportUsbcScLdd(aNumDrives, aController); + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_NEWL2, "CBulkOnlyTransportUsbcScLdd created."); + return scTransport; #endif default: - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsCBulkOnlyTransportNull)); - return NULL; + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsCBulkOnlyTransportNull)); + return NULL; - } - } + } + } TInt CBulkOnlyTransport::InitialiseTransportL(TInt aTransportLddFlag) - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::InitialiseTransportL()"); - TInt ret = KErrNone; - MTransportBase* transport; - iController.GetTransport(transport); - switch (aTransportLddFlag) - { + { + TInt ret = KErrNone; + MTransportBase* transport; + iController.GetTransport(transport); + switch (aTransportLddFlag) + { #if !defined(__WINS__) && !defined(__X86__) - case 2: - ret = ((CBulkOnlyTransportUsbcScLdd*) transport)->Ldd().Open(0); - if (ret != KErrNone) - { - return ret; - } - else - { - ((CBulkOnlyTransportUsbcScLdd*) transport)->Ldd().Close(); - CleanupStack::PushL(transport); - ((CBulkOnlyTransportUsbcScLdd*) transport)->ConstructL(); - CleanupStack::Pop(transport); - return ret; - } + case 2: + ret = ((CBulkOnlyTransportUsbcScLdd*) transport)->Ldd().Open(0); + if (ret != KErrNone) + { + return ret; + } + else + { + ((CBulkOnlyTransportUsbcScLdd*) transport)->Ldd().Close(); + CleanupStack::PushL(transport); + ((CBulkOnlyTransportUsbcScLdd*) transport)->ConstructL(); + CleanupStack::Pop(transport); + return ret; + } #endif - case 1: - ret = ((CBulkOnlyTransportUsbcLdd*) transport)->Ldd().Open(0); - if (ret != KErrNone) - { - return ret; - } - else - { - ((CBulkOnlyTransportUsbcLdd*) transport)->Ldd().Close(); - CleanupStack::PushL(transport); - ((CBulkOnlyTransportUsbcLdd*) transport)->ConstructL(); - CleanupStack::Pop(transport); - return ret; - } - default: - return KErrNotFound; - } - } + case 1: + ret = ((CBulkOnlyTransportUsbcLdd*) transport)->Ldd().Open(0); + if (ret != KErrNone) + { + return ret; + } + else + { + ((CBulkOnlyTransportUsbcLdd*) transport)->Ldd().Close(); + CleanupStack::PushL(transport); + ((CBulkOnlyTransportUsbcLdd*) transport)->ConstructL(); + CleanupStack::Pop(transport); + return ret; + } + default: + return KErrNotFound; + } + } /** c'tor @@ -185,28 +197,27 @@ @param aController - reference to the parent */ CBulkOnlyTransport::CBulkOnlyTransport(TInt aNumDrives,CUsbMassStorageController& aController): - CActive(EPriorityStandard), - iMaxLun(aNumDrives-1), - iController(aController), - iStallAllowed(ETrue), - iInterfaceConfigured(EFalse), - iCommandBufPtr(NULL,0), - iDataBufPtr(NULL,0), - iCswBufPtr(NULL,0), - iPaddingBufPtr(NULL,0), - iWriteBufPtr(NULL,0), - iReadBufPtr(NULL, 0), - iCbwBufPtr(NULL,0) - { - __FNLOG("CBulkOnlyTransport::CBulkOnlyTransport"); - } + CActive(EPriorityStandard), + iMaxLun(aNumDrives-1), + iController(aController), + iStallAllowed(ETrue), + iInterfaceConfigured(EFalse), + iCommandBufPtr(NULL,0), + iDataBufPtr(NULL,0), + iCswBufPtr(NULL,0), + iPaddingBufPtr(NULL,0), + iWriteBufPtr(NULL,0), + iReadBufPtr(NULL, 0), + iCbwBufPtr(NULL,0) + { + } /** Destructor */ CBulkOnlyTransport::~CBulkOnlyTransport() - { - } + { + } /** @@ -215,12 +226,12 @@ @param aData reference to the data buffer. */ void CBulkOnlyTransport::SetupReadData(TUint aLength) - { - __FNLOG("CBulkOnlyTransport::SetupReadData"); - __PRINT1(_L("Length = %d (bytes)\n"), aLength); - iBufSize = aLength; - iReadSetUp = ETrue; - } + { + OstTrace1(TRACE_SMASSSTORAGE_BOTDATA, CBULKONLYTRANSPORT_SETUPREADDATA, + "BOT SetupReadData Length = 0x%x bytes", aLength); + iBufSize = aLength; + iReadSetUp = ETrue; + } /** @@ -229,64 +240,126 @@ @param aData reference to the data buffer. */ void CBulkOnlyTransport::SetupWriteData(TPtrC8& aData) - { - __FNLOG("CBulkOnlyTransport::SetupWriteData"); - __PRINT1(_L("Length = %d (bytes)\n"), aData.Length()); - iWriteBufPtr.Set(aData); - iWriteSetUp = ETrue; - } + { + OstTrace1(TRACE_SMASSSTORAGE_BOTDATA, CBULKONLYTRANSPORT_SETUPWRITEDATA, + "BOT SetupWriteData Length = 0x%x bytes", aData.Length()); + iWriteBufPtr.Set(aData); + iWriteSetUp = ETrue; + } TInt CBulkOnlyTransport::Start() - { - __FNLOG("CBulkOnlyTransport::Start"); - - TInt err = KErrNone; + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_START, "Start..."); + if (!iProtocol) + { + return KErrBadHandle; //protocol should be set up before start + } - if (!iProtocol) - { - return KErrBadHandle; //protocol should be set up before start - } - - if (IsActive()) - { - __PRINT(_L("CBulkOnlyTransport::Start - active before start!\n")); - return KErrInUse; - } + if (IsActive()) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_START1, "Error: active before start!"); + return KErrInUse; + } - if ((err = SetupConfigurationDescriptor()) != KErrNone || - (err = SetupInterfaceDescriptors()) != KErrNone ) - { - __PRINT(_L("CBulkOnlyTransport::Start - Error during descriptors setup!\n")); - return err; - } + TInt err = KErrNone; + if ((err = SetupConfigurationDescriptor()) != KErrNone || + (err = SetupInterfaceDescriptors()) != KErrNone ) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_START2, "Error: descriptors setup failed %d", err); + return err; + } - AllocateEndpointResources(); - ActivateDeviceStateNotifier(); // activate notifier wich will wait until USB became configured - TUsbcDeviceState deviceStatus = EUsbcDeviceStateDefault; - err = GetDeviceStatus(deviceStatus); - __PRINT1(_L("CBulkOnlyTransport::Start - Device status = %d\n"), deviceStatus); - if (err == KErrNone && deviceStatus == EUsbcDeviceStateConfigured) - { - __PRINT(_L("CBulkOnlyTransport::Start - Starting bulk only transport\n")); - err = HwStart(); - } + AllocateEndpointResources(); + ActivateDeviceStateNotifier(); // activate notifier wich will wait until USB became configured + TUsbcDeviceState deviceStatus = EUsbcDeviceStateDefault; + err = GetDeviceStatus(deviceStatus); + if (err == KErrNone && deviceStatus == EUsbcDeviceStateConfigured) + { + err = HwStart(); + } #ifdef MSDC_MULTITHREADED - TPtr8 aDes1(NULL,0); - TPtr8 aDes2(NULL,0); - GetBufferPointers(aDes1, aDes2); - iProtocol->InitializeBufferPointers(aDes1, aDes2); // have to pass pointer to memory not offsets to initialise TPtr, and lengths + TPtr8 aDes1(NULL,0); + TPtr8 aDes2(NULL,0); + GetBufferPointers(aDes1, aDes2); + iProtocol->InitializeBufferPointers(aDes1, aDes2); // have to pass pointer to memory not offsets to initialise TPtr, and lengths #endif - iInterfaceConfigured = ETrue; - return err; - } + iInterfaceConfigured = ETrue; + return err; + } TInt CBulkOnlyTransport::HwStart(TBool aDiscard) - { - __FNLOG("CBulkOnlyTransport::HwStart"); + { + TInt lun = MaxLun(); + OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_HWSTART, "HwStart MAX LUN=%d", lun); + do + { + Controller().DriveManager().Connect(lun); + } + while(--lun >= 0); + + TInt res = StartControlInterface(); + + iCurrentState = ENone; + iWriteSetUp=EFalse; + iReadSetUp=EFalse; + iStarted = ETrue; + + if (aDiscard) + { + FlushData(); + } + + ReadCBW(); + return res; + } + +TInt CBulkOnlyTransport::HwStop() + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_HWSTOP, "HwStop"); + if (iStarted) + { + StopBulkOnlyEndpoint(); + CancelControlInterface(); + iStarted = EFalse; + } + return KErrNone; + } + + +void CBulkOnlyTransport::StopBulkOnlyEndpoint() + { + TInt lun = MaxLun(); + do + { + Controller().DriveManager().Disconnect(lun); + } + while(--lun >= 0); + Cancel(); + iProtocol->Cancel(); + } + + +TInt CBulkOnlyTransport::HwSuspend() + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_HWSUSPEND, "HwSuspend"); + TInt lun = MaxLun(); + do + { + Controller().DriveManager().Disconnect(lun); + } + while(--lun >= 0); + + return KErrNone; + } + + +TInt CBulkOnlyTransport::HwResume() + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_HWRESUME, "HwResume"); TInt lun = MaxLun(); do { @@ -294,107 +367,35 @@ } while(--lun >= 0); - TInt res = StartControlInterface(); - - iCurrentState = ENone; - iWriteSetUp=EFalse; - iReadSetUp=EFalse; - iStarted = ETrue; - - if (aDiscard) - { - FlushData(); - } - - ReadCBW(); - return res; - } - - -TInt CBulkOnlyTransport::HwStop() - { - __FNLOG("CBulkOnlyTransport::HwStop"); - if (iStarted) - { - StopBulkOnlyEndpoint(); - CancelControlInterface(); - iStarted = EFalse; - } - return KErrNone; - } - - -void CBulkOnlyTransport::StopBulkOnlyEndpoint() - { - __FNLOG("CBulkOnlyTransport::StopBulkOnlyEndpoint"); - - TInt lun = MaxLun(); - do - { - Controller().DriveManager().Disconnect(lun); - } - while(--lun >= 0); - Cancel(); - iProtocol->Cancel(); - } - - -TInt CBulkOnlyTransport::HwSuspend() - { - __FNLOG("CBulkOnlyTransport::HwSuspend"); - - TInt lun = MaxLun(); - do - { - Controller().DriveManager().Disconnect(lun); - } - while(--lun >= 0); - - return KErrNone; - } - - -TInt CBulkOnlyTransport::HwResume() - { - __FNLOG("CBulkOnlyTransport::HwResume"); - - TInt lun = MaxLun(); - do - { - Controller().DriveManager().Connect(lun); - } - while(--lun >= 0); - - return KErrNone; - } + return KErrNone; + } /** Stops the Bulk Only Transport */ TInt CBulkOnlyTransport::Stop() - { - __FNLOG("CBulkOnlyTransport::Stop"); - CancelControlInterface(); - CancelDeviceStateNotifier(); - Cancel(); - if (iInterfaceConfigured) - { - ReleaseInterface(); - SetupConfigurationDescriptor(ETrue); - } - iCurrentState = ENone; - iInterfaceConfigured = EFalse; + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_STOP, "Stop"); + CancelControlInterface(); + CancelDeviceStateNotifier(); + Cancel(); + if (iInterfaceConfigured) + { + ReleaseInterface(); + SetupConfigurationDescriptor(ETrue); + } + iCurrentState = ENone; + iInterfaceConfigured = EFalse; - return KErrNone; - } + return KErrNone; + } void CBulkOnlyTransport::DoCancel() - { - __FNLOG("CBulkOnlyTransport::DoCancel"); - CancelReadWriteRequests(); - } + { + CancelReadWriteRequests(); + } void CBulkOnlyTransport::Activate(TInt aReason) @@ -406,55 +407,53 @@ void CBulkOnlyTransport::RunL() - { - __FNLOG("CBulkOnlyTransport::RunL"); - if (iStatus != KErrNone) - { - __PRINT1(_L("Error %d in RunL, halt endpoints \n"), iStatus.Int()); - SetPermError(); //halt endpoints for reset recovery - return; - } - switch (iCurrentState) - { - case EWaitForCBW: - __PRINT(_L("EWaitForCBW")); - ProcessCbwEvent(); - break; + { + if (iStatus != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_RUNL, "Error %d in RunL, halt endpoints", iStatus.Int()); + SetPermError(); //halt endpoints for reset recovery + return; + } + switch (iCurrentState) + { + case EWaitForCBW: + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_RUNL1, "EWaitForCBW"); + ProcessCbwEvent(); + break; - case EWritingData: - __PRINT(_L("EWritingData")); - iWriteSetUp = EFalse; //the buffer was used + case EWritingData: + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_RUNL2, "EWritingData"); + iWriteSetUp = EFalse; //the buffer was used - if (iDataResidue && iStallAllowed) - { - StallEndpointAndWaitForClear(); - } + if (iDataResidue && iStallAllowed) + { + StallEndpointAndWaitForClear(); + } - SendCSW(iCbwTag, iDataResidue, iCmdStatus); - break; + SendCSW(iCbwTag, iDataResidue, iCmdStatus); + break; - case EReadingData: - { - __PRINT(_L("EReadingData")); + case EReadingData: + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_RUNL3, "EReadingData"); + ProcessReadingDataEvent(); + } + break; - ProcessReadingDataEvent(); - } - break; - - case ESendingCSW: - __PRINT(_L("ESendingCSW")); - ReadCBW(); - break; + case ESendingCSW: + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_RUNL4, "ESendingCSW"); + ReadCBW(); + break; case EPermErr: - __PRINT(_L("EPermErr")); - StallEndpointAndWaitForClear(); + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_RUNL5, "EPermErr"); + StallEndpointAndWaitForClear(); break; default: - SetPermError(); // unexpected state - } - } + SetPermError(); // unexpected state + } + } /** @@ -466,243 +465,249 @@ */ void CBulkOnlyTransport::DecodeCBW() - { - __FNLOG("CBulkOnlyTransport::DecodeCBW"); + { + SetCbwPtr(); - SetCbwPtr(); - - if (!CheckCBW()) //check if CBW valid and meaningful - { + if (!CheckCBW()) //check if CBW valid and meaningful + { // CBW not valid or meaningful // Specification says: "If the CBW is not valid, the device shall STALL // the Bulk-In pipe. Also, the device shall either STALL the Bulk-Out pipe, // or the device shall accept and discard any Bulk-Out data. The device // shall maintain this state until a Reset Recovery." // Here we keep bulk-in ep stalled and ignore bulk-out ep. - SetPermError(); - ExpireData((TAny*) (iCbwBufPtr.Ptr())); - return; - } + SetPermError(); + ExpireData((TAny*) (iCbwBufPtr.Ptr())); + return; + } - TPtrC8 aData; - aData.Set(&iCbwBufPtr[KCbwCbLengthOffset], KMaxCbwcbLength+1); //prepare data for protocol starting form Length - TUint8 lun = static_cast(iCbwBufPtr[13] & 0x0f); + TPtrC8 aData; + aData.Set(&iCbwBufPtr[KCbwCbLengthOffset], KMaxCbwcbLength+1); //prepare data for protocol starting form Length + TUint lun = static_cast(iCbwBufPtr[13] & 0x0f); - iCbwTag = static_cast(iCbwBufPtr[KCbwTagOffset]) | - static_cast(iCbwBufPtr[KCbwTagOffset+1]) <<8 | - static_cast(iCbwBufPtr[KCbwTagOffset+2]) <<16| - static_cast(iCbwBufPtr[KCbwTagOffset+3]) <<24; + iCbwTag = static_cast(iCbwBufPtr[KCbwTagOffset]) | + static_cast(iCbwBufPtr[KCbwTagOffset+1]) <<8 | + static_cast(iCbwBufPtr[KCbwTagOffset+2]) <<16| + static_cast(iCbwBufPtr[KCbwTagOffset+3]) <<24; - TInt i = KCbwDataTransferLengthOffset; - TUint hostDataLength = static_cast(iCbwBufPtr[i ]) | - static_cast(iCbwBufPtr[i+1]) <<8 | - static_cast(iCbwBufPtr[i+2]) <<16 | - static_cast(iCbwBufPtr[i+3]) <<24; + TInt i = KCbwDataTransferLengthOffset; + TUint32 hostDataLength = static_cast(iCbwBufPtr[i ]) | + static_cast(iCbwBufPtr[i+1]) <<8 | + static_cast(iCbwBufPtr[i+2]) <<16 | + static_cast(iCbwBufPtr[i+3]) <<24; - TBool dataToHost = iCbwBufPtr[KCbwFlagOffset] & 0x80; + TBool dataToHost = iCbwBufPtr[KCbwFlagOffset] & 0x80; - __PRINT4(_L("lun =%d, hostDataLength=%d, CBWtag = 0x%x, dataToHost=%d\n"), lun, hostDataLength, iCbwTag, dataToHost); - ////////////////////////////////////////////// - TBool ret = iProtocol->DecodePacket(aData, lun); - ////////////////////////////////////////////// - ExpireData((TAny*) (iCbwBufPtr.Ptr())); + OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_DECODECBW, + "CBW LUN=%d", lun); + OstTraceExt3(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_DECODECBW0, + "CBW hostDataLength=0x%x, CBWtag = 0x%x, dataToHost=%d", + hostDataLength, iCbwTag, (TUint32)dataToHost); + ////////////////////////////////////////////// + TBool ret = iProtocol->DecodePacket(aData, lun); + ////////////////////////////////////////////// + ExpireData((TAny*) (iCbwBufPtr.Ptr())); - - iStallAllowed = ETrue; + iStallAllowed = ETrue; - if (!ret) - { - __PRINT(_L("Command Failed\n")); - iCmdStatus = ECommandFailed; - } - else - { - __PRINT(_L("Command Passed\n")); - iCmdStatus = ECommandPassed; - } + if (!ret) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_DECODECBW1, "ERROR: DecodePacket err=%d", ret); + iCmdStatus = ECommandFailed; + } + else + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW2, "ERROR: DecodePacket OK"); + iCmdStatus = ECommandPassed; + } - if (hostDataLength) // Host expected data transfer - { - if (dataToHost) // send data to host - { - if (!iWriteSetUp) //write buffer was not set up - { - __PRINT(_L("Write buffer was not setup\n")); - iDataResidue =hostDataLength; - __PRINT1(_L("DataResidue (write to host)=%d\n"),iDataResidue); + if (hostDataLength) // Host expected data transfer + { + if (dataToHost) // send data to host + { + if (!iWriteSetUp) //write buffer was not set up + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW3, "Write buffer was not setup"); + iDataResidue =hostDataLength; + OstTrace1(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW4, "DataResidue (write to host)=%d", iDataResidue); //------------------------------------ - if (hostDataLength <= KBOTMaxBufSize) - { - __PRINT(_L("Case 4 or 8\n")); - SetPaddingBufPtr(hostDataLength); - iPaddingBufPtr.FillZ(hostDataLength); - TPtrC8 ptr(NULL, 0); - ptr.Set((TUint8*)iPaddingBufPtr.Ptr(), hostDataLength); - WriteData(iStatus, ptr, hostDataLength, EFalse); - iStallAllowed = EFalse; - if (iReadSetUp) //read buffer WAS set up - case (8) - { - __PRINT(_L("It is Case 8\n")); - iCmdStatus = EPhaseError; - } - return; - } - else + if (hostDataLength <= KBOTMaxBufSize) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW5, "Case 4 or 8"); + SetPaddingBufPtr(hostDataLength); + iPaddingBufPtr.FillZ(hostDataLength); + TPtrC8 ptr(NULL, 0); + ptr.Set((TUint8*)iPaddingBufPtr.Ptr(), hostDataLength); + WriteData(iStatus, ptr, hostDataLength, EFalse); + iStallAllowed = EFalse; + if (iReadSetUp) //read buffer WAS set up - case (8) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW6, "It is Case 8"); + iCmdStatus = EPhaseError; + } + return; + } + else //------------------------------------ -// Use next block instead of StallEndpointAndWaitForClear(InEndpoint); - { - SetPaddingBufPtr(hostDataLength); - iPaddingBufPtr.FillZ(KBOTMaxBufSize); - TUint c =0; - TRequestStatus status; - while (c KBOTMaxBufSize) - { - len = KBOTMaxBufSize; - } - else - { - len = hostDataLength - c; - } +// Use next block instead of StallEndpointAndWaitForClear(InEndpoint); + { + SetPaddingBufPtr(hostDataLength); + iPaddingBufPtr.FillZ(KBOTMaxBufSize); + TUint c =0; + TRequestStatus status; + while (c KBOTMaxBufSize) + { + len = KBOTMaxBufSize; + } + else + { + len = hostDataLength - c; + } - TPtrC8 ptr(NULL, 0); - ptr.Set((TUint8*)iPaddingBufPtr.Ptr(), len); - WriteUsb(status, ptr, len); - User::WaitForRequest(status); - c += KBOTMaxBufSize; - } - } + TPtrC8 ptr(NULL, 0); + ptr.Set((TUint8*)iPaddingBufPtr.Ptr(), len); + WriteUsb(status, ptr, len); + User::WaitForRequest(status); + c += KBOTMaxBufSize; + } + } - if (iReadSetUp) //read buffer WAS set up - case (8) - { - __PRINT(_L("Case 8\n")); - SendCSW(iCbwTag, hostDataLength, EPhaseError); - //don't care to reset any flag - should get reset recovery - } - else // case (4) - { - __PRINT(_L("Case 4\n")); - SendCSW(iCbwTag, hostDataLength, iCmdStatus); - } - return; - } // if (!iWriteSetUp) + if (iReadSetUp) //read buffer WAS set up - case (8) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW7, "Case 8"); + SendCSW(iCbwTag, hostDataLength, EPhaseError); + //don't care to reset any flag - should get reset recovery + } + else // case (4) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW8, "Case 4"); + SendCSW(iCbwTag, hostDataLength, iCmdStatus); + } + return; + } // if (!iWriteSetUp) //================== - TUint deviceDataLength = static_cast(iWriteBufPtr.Length()); - iDataResidue =hostDataLength - deviceDataLength ; - __PRINT2(_L("Device data length = %d, DataResidue (write to host)=%d\n"), deviceDataLength, iDataResidue); + TUint32 deviceDataLength = iWriteBufPtr.Length(); + iDataResidue =hostDataLength - deviceDataLength ; + OstTraceExt2(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW9, + "Device data length = 0x%x, DataResidue (write to host)=0x%x", deviceDataLength, iDataResidue); - if (deviceDataLength < hostDataLength && - hostDataLength < KBOTMaxBufSize ) - { - __PRINT(_L("Case 5 (padding)\n")); - SetPaddingBufPtr(hostDataLength); - iPaddingBufPtr.Zero(); - iPaddingBufPtr.Append(iWriteBufPtr); - iStallAllowed = EFalse; - __PRINT1(_L("iPaddingBufPtr.Length = %d\n"),iPaddingBufPtr.Length()); - TPtrC8 ptr(NULL, 0); - ptr.Set((TUint8*)iPaddingBufPtr.Ptr(), hostDataLength); - WriteData(iStatus, ptr, hostDataLength, EFalse); - return; - } + if (deviceDataLength < hostDataLength && + hostDataLength < KBOTMaxBufSize ) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW10, "Case 5 (padding)"); + SetPaddingBufPtr(hostDataLength); + iPaddingBufPtr.Zero(); + iPaddingBufPtr.Append(iWriteBufPtr); + iStallAllowed = EFalse; + OstTrace1(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW11, + "iPaddingBufPtr.Length = 0x%x", + iPaddingBufPtr.Length()); + TPtrC8 ptr(NULL, 0); + ptr.Set((TUint8*)iPaddingBufPtr.Ptr(), hostDataLength); + WriteData(iStatus, ptr, hostDataLength, EFalse); + return; + } //=================== - if (deviceDataLength == hostDataLength) //case (6)[==] - { - __PRINT(_L("Case 6\n")); - WriteData(iStatus, iWriteBufPtr, deviceDataLength); - return; - } - else if (deviceDataLength < hostDataLength) //case (5)[<] - { - __PRINT(_L("Case 5\n")); - WriteData(iStatus, iWriteBufPtr, deviceDataLength, ETrue); // Send ZLP - return; - } - else // deviceDataLength > hostDataLength - case (7) - { - __PRINT(_L("Case 7\n")); - iCmdStatus = EPhaseError; - iDataResidue = 0; - WriteData(iStatus, iWriteBufPtr, hostDataLength); - return; - } - } - else //read data from host - { - if (!iReadSetUp) - { - iDataResidue = hostDataLength; - __PRINT(_L("Read buffer was not setup\n")); -// Use next block instead of StallEndpointAndWaitForClear(OutEndpoint); - DiscardData(hostDataLength); + if (deviceDataLength == hostDataLength) //case (6)[==] + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW12, "Case 6"); + WriteData(iStatus, iWriteBufPtr, deviceDataLength); + return; + } + else if (deviceDataLength < hostDataLength) //case (5)[<] + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW13, "Case 5"); + WriteData(iStatus, iWriteBufPtr, deviceDataLength, ETrue); // Send ZLP + return; + } + else // deviceDataLength > hostDataLength - case (7) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW14, "Case 7"); + iCmdStatus = EPhaseError; + iDataResidue = 0; + WriteData(iStatus, iWriteBufPtr, hostDataLength); + return; + } + } + else //read data from host + { + if (!iReadSetUp) + { + iDataResidue = hostDataLength; + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_DECODECBW15, "Read buffer was not setup"); +// Use next block instead of StallEndpointAndWaitForClear(OutEndpoint); + DiscardData(hostDataLength); - if (iWriteSetUp) //case (10) - { - __PRINT(_L("case 10\n")); - SendCSW(iCbwTag, hostDataLength, EPhaseError); - } - else // case (9) - { - __PRINT(_L("Case 9\n")); - SendCSW(iCbwTag, hostDataLength, iCmdStatus); - } + if (iWriteSetUp) //case (10) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW16, "case 10"); + SendCSW(iCbwTag, hostDataLength, EPhaseError); + } + else // case (9) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW17, "Case 9"); + SendCSW(iCbwTag, hostDataLength, iCmdStatus); + } - return; - } + return; + } - TUint deviceDataLength = iBufSize; - iDataResidue = hostDataLength; // calculate residue later + TUint32 deviceDataLength = iBufSize; + iDataResidue = hostDataLength; // calculate residue later - __PRINT2(_L("deviceDataLength = iBufSize = %d, DataResidue = HDL for now (read from host) =%d\n"),deviceDataLength,iDataResidue); + OstTraceExt2(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW18, + "deviceDataLength = iBufSize = 0x%x, DataResidue = HDL for now (read from host) =0x%x", + deviceDataLength, iDataResidue); - if (deviceDataLength <= hostDataLength) // case (11) and (12) - { - __PRINT(_L("Case 11 or 12\n")); - ReadData(deviceDataLength); - return; - } - if (deviceDataLength > hostDataLength) // case (13) - { - __PRINT(_L("Case 13\n")); + if (deviceDataLength <= hostDataLength) // case (11) and (12) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW19, "Case 11 or 12"); + ReadData(deviceDataLength); + return; + } + if (deviceDataLength > hostDataLength) // case (13) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW20, "Case 13"); /** * Comment following line in order to pass compliant test. * As spec said in case 13:"The device may receive data up to a * total of dCBWDataTransferLength." * Here we choose to ignore incoming data. */ - //StallEndpointAndWaitForClear(OutEndpoint); //Stall Out endpoint + //StallEndpointAndWaitForClear(OutEndpoint); //Stall Out endpoint if (iReadSetUp) { - WriteToClient(hostDataLength); + WriteToClient(hostDataLength); iReadSetUp = EFalse; } SendCSW(iCbwTag, hostDataLength, EPhaseError); - return; - } - } - } - else // Host expected no data transfer - { - __PRINT(_L("No data transfer expected\n")); - iDataResidue = 0; - if (iWriteSetUp || iReadSetUp) // case (2) and (3) - { - __PRINT(_L("Case 2 or 3\n")); - SendCSW(iCbwTag, 0, EPhaseError); - } - else - { - __PRINT(_L("Case 1\n")); - SendCSW(iCbwTag, 0, iCmdStatus); //case (1) - } - } - } + return; + } + } + } + else // Host expected no data transfer + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW21, "No data transfer expected"); + iDataResidue = 0; + if (iWriteSetUp || iReadSetUp) // case (2) and (3) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW22, "Case 2 or 3"); + SendCSW(iCbwTag, 0, EPhaseError); + } + else + { + OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW23, "Case 1"); + SendCSW(iCbwTag, 0, iCmdStatus); //case (1) + } + } + } /** @@ -711,9 +716,7 @@ @return ETrue if CBW is Valid and Meaningful, EFalse otherwise */ TBool CBulkOnlyTransport::CheckCBW() - { - __FNLOG("CBulkOnlyTransport::CheckCBW"); - + { // // Check valid // @@ -721,21 +724,21 @@ // Check length if ((TUint) (iCbwBufPtr.Length()) != KCbwLength) { - __PRINT2(_L("Bad length: %d != KCbwLength"), iCbwBufPtr.Length(), KCbwLength); - return EFalse; + OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_CHECKCBW, "ERROR Bad length: 0x%x != KCbwLength", iCbwBufPtr.Length()); + return EFalse; } // Check signature - TInt i = KCbwSignatureOffset; - if (iCbwBufPtr[i ] != 0x55 || // CBW Singature from USB Bulk-Only Transport spec - iCbwBufPtr[i+1] != 0x53 || - iCbwBufPtr[i+2] != 0x42 || - iCbwBufPtr[i+3] != 0x43) - { - __PRINT(_L("Bad signature")); - __PRINT4(_L(" 0x%x, 0x%x, 0x%x, 0x%x \n"), iCbwBufPtr[i], iCbwBufPtr[i+1], iCbwBufPtr[i+2],iCbwBufPtr[i+3]) - return EFalse; - } + TInt i = KCbwSignatureOffset; + if (iCbwBufPtr[i ] != 0x55 || // CBW Singature from USB Bulk-Only Transport spec + iCbwBufPtr[i+1] != 0x53 || + iCbwBufPtr[i+2] != 0x42 || + iCbwBufPtr[i+3] != 0x43) + { + OstTraceData(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_CHECKCBW1, + "CBW ERROR: Bad signature %s", &iCbwBufPtr[i], 4); + return EFalse; + } // // Check meaningful @@ -743,29 +746,29 @@ // Check reserved bits ( must be zero ) if ((iCbwBufPtr[KCbwLunOffset] & 0xF0) || (iCbwBufPtr[KCbwCbLengthOffset] & 0xE0)) - { - __PRINT(_L("Reserved bits not zero\n")); - return EFalse; - } + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_CHECKCBW2, "CBW ERROR: Reserved bits not zero"); + return EFalse; + } - // check command block length - TInt cbwcbLength = iCbwBufPtr[KCbwCbLengthOffset] & 0x1F; - if (cbwcbLength >KMaxCbwcbLength) - { - __PRINT(_L("Incorrect block length\n")); - return EFalse; - } + // check command block length + TInt cbwcbLength = iCbwBufPtr[KCbwCbLengthOffset] & 0x1F; + if (cbwcbLength >KMaxCbwcbLength) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_CHECKCBW3, "CBW ERROR: Incorrect block length"); + return EFalse; + } - //check LUN - TInt8 lun = static_cast(iCbwBufPtr[KCbwLunOffset] & 0x0f); - if (iMaxLun < lun) - { - RDebug::Print(_L("bad lun: %d"), lun); - return EFalse; - } + //check LUN + TInt8 lun = static_cast(iCbwBufPtr[KCbwLunOffset] & 0x0f); + if (iMaxLun < lun) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_CHECKCBW4, "CBW ERROR: bad lun: %d", lun); + return EFalse; + } - return ETrue; - } + return ETrue; + } /** @@ -773,11 +776,10 @@ Used when protocol wants to force host to initiate a reset recovery. */ void CBulkOnlyTransport::SetPermError() - { - __FNLOG("CBulkOnlyTransport::SetPermError"); + { iCurrentState = EPermErr; Activate(KErrNone); - } + } /** @@ -786,19 +788,16 @@ @param aLength amount of data (in bytes) to be send to host */ void CBulkOnlyTransport::WriteData(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired) - { - __FNLOG("CBulkOnlyTransport::WriteData"); - - if (IsActive()) - { - __PRINT(_L("Still active\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); - return; - } - WriteUsb(aStatus, aDes, aLength, aZlpRequired); - iCurrentState = EWritingData; - SetActive(); - } + { + if (IsActive()) + { + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); + return; + } + WriteUsb(aStatus, aDes, aLength, aZlpRequired); + iCurrentState = EWritingData; + SetActive(); + } /** @@ -810,48 +809,47 @@ @param aStatus indicates the success or failure of the command. */ void CBulkOnlyTransport::SendCSW(TUint aTag, TUint aDataResidue, TCswStatus aStatus) - { - __FNLOG("CBulkOnlyTransport::SendCSW"); - __PRINT2(_L("DataResidue = %d, Status = %d \n"), aDataResidue, aStatus); + { + OstTraceExt2(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_SENDCSW, + "CSW DataResidue = 0x%x, Status = %d", aDataResidue, aStatus); - if (IsActive()) - { - __PRINT(_L("Still active\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); - return; - } + if (IsActive()) + { + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); + return; + } - SetCswBufPtr(KCswLength); - TInt i = KCswSingnatureOffset; - iCswBufPtr[i ] = 0x55; // CSW Singature from USB Bulk-Only Transport spec - iCswBufPtr[i+1] = 0x53; - iCswBufPtr[i+2] = 0x42; - iCswBufPtr[i+3] = 0x53; + SetCswBufPtr(KCswLength); + TInt i = KCswSingnatureOffset; + iCswBufPtr[i ] = 0x55; // CSW Singature from USB Bulk-Only Transport spec + iCswBufPtr[i+1] = 0x53; + iCswBufPtr[i+2] = 0x42; + iCswBufPtr[i+3] = 0x53; - i = KCswTagOffset; + i = KCswTagOffset; - iCswBufPtr[i ] = static_cast((aTag & 0x000000FF)); - iCswBufPtr[i+1] = static_cast((aTag & 0x0000FF00) >> 8); - iCswBufPtr[i+2] = static_cast((aTag & 0x00FF0000) >> 16); - iCswBufPtr[i+3] = static_cast((aTag & 0xFF000000) >> 24); + iCswBufPtr[i ] = static_cast((aTag & 0x000000FF)); + iCswBufPtr[i+1] = static_cast((aTag & 0x0000FF00) >> 8); + iCswBufPtr[i+2] = static_cast((aTag & 0x00FF0000) >> 16); + iCswBufPtr[i+3] = static_cast((aTag & 0xFF000000) >> 24); - i = KCswDataResidueOffset; - iCswBufPtr[i ] = static_cast((aDataResidue & 0x000000FF)); - iCswBufPtr[i+1] = static_cast((aDataResidue & 0x0000FF00) >> 8); - iCswBufPtr[i+2] = static_cast((aDataResidue & 0x00FF0000) >> 16); - iCswBufPtr[i+3] = static_cast((aDataResidue & 0xFF000000) >> 24); + i = KCswDataResidueOffset; + iCswBufPtr[i ] = static_cast((aDataResidue & 0x000000FF)); + iCswBufPtr[i+1] = static_cast((aDataResidue & 0x0000FF00) >> 8); + iCswBufPtr[i+2] = static_cast((aDataResidue & 0x00FF0000) >> 16); + iCswBufPtr[i+3] = static_cast((aDataResidue & 0xFF000000) >> 24); - iCswBufPtr[KCswStatusOffset] = static_cast(aStatus); + iCswBufPtr[KCswStatusOffset] = static_cast(aStatus); - TPtrC8 ptr(NULL, 0); - ptr.Set((const TUint8*)iCswBufPtr.Ptr(), KCswLength); + TPtrC8 ptr(NULL, 0); + ptr.Set((const TUint8*)iCswBufPtr.Ptr(), KCswLength); - WriteUsb(iStatus, ptr, KCswLength); + WriteUsb(iStatus, ptr, KCswLength); - iCurrentState = ESendingCSW; + iCurrentState = ESendingCSW; - SetActive(); - } + SetActive(); + } /** @@ -860,10 +858,9 @@ @param aProtocol reference to the protocol */ void CBulkOnlyTransport::RegisterProtocol(MProtocolBase& aProtocol) - { - __FNLOG("CBulkOnlyTransport::RegisterProtocol"); - iProtocol = &aProtocol; - } + { + iProtocol = &aProtocol; + } /** @@ -872,9 +869,9 @@ @return reference to the controller which instantiate the CBulkOnlyTransport */ CUsbMassStorageController& CBulkOnlyTransport::Controller() - { - return iController; - } + { + return iController; + } /** @@ -883,32 +880,32 @@ 0 to a maximum LUN of 15 (Fh). */ TInt CBulkOnlyTransport::MaxLun() - { - return iMaxLun; - } + { + return iMaxLun; + } void CBulkOnlyTransport::GetCommandBufPtr(TPtr8& aDes, TUint aLength) // Set pointer to buffer of specified aLength for command - { - aDes.Set(SetCommandBufPtr(aLength)); - } + { + aDes.Set(SetCommandBufPtr(aLength)); + } void CBulkOnlyTransport::GetReadDataBufPtr(TPtr8& aDes) // Set pointer to buffer into which data is to be read from drive (Read10) - { - aDes.Set(SetDataBufPtr()); - } + { + aDes.Set(SetDataBufPtr()); + } void CBulkOnlyTransport::GetWriteDataBufPtr(TPtrC8& aDes) // Set pointer to buffer from which data is to be written to drive (Write10) - { - aDes.Set(iReadBufPtr); - } + { + aDes.Set(iReadBufPtr); + } #ifdef MSDC_MULTITHREADED void CBulkOnlyTransport::ProcessReadData(TAny* aAddress) - { - ExpireData(aAddress); - } + { + ExpireData(aAddress); + } #endif diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcldd.cpp --- a/userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcldd.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcldd.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -21,19 +21,33 @@ @internalTechnology */ +#include +#include "mtransport.h" +#include "mprotocol.h" +#include "mldddevicestatenotification.h" +#include "tbulkmm.h" + +#include "drivemanager.h" +#include "cusbmassstoragecontroller.h" + #include "cbulkonlytransport.h" #include "cbulkonlytransportusbcldd.h" -#include "usbmsshared.h" -#include "massstoragedebug.h" -#include "cusbmassstorageserver.h" +#include "smassstorage.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cbulkonlytransportusbclddTraces.h" +#endif + + #define InEndpoint EEndpoint1 #define OutEndpoint EEndpoint2 //This value defined in USB Mass Storage Bulk Only Transrt spec and not supposed to be changed -LOCAL_D const TInt KRequiredNumberOfEndpoints = 2; // in addition to endpoint 0. +static const TInt KRequiredNumberOfEndpoints = 2; // in addition to endpoint 0. -LOCAL_D const TInt KUsbNumInterfacesOffset = 4; +static const TInt KUsbNumInterfacesOffset = 4; //////////////////////////////////// /** @@ -44,19 +58,19 @@ CControlInterfaceUsbcLdd* CControlInterfaceUsbcLdd::NewL(CBulkOnlyTransportUsbcLdd& aParent) - { - CControlInterfaceUsbcLdd* self = new(ELeave) CControlInterfaceUsbcLdd(aParent); - CleanupStack::PushL(self); - self->ConstructL(); - CActiveScheduler::Add(self); - CleanupStack::Pop(); - return self; - } + { + CControlInterfaceUsbcLdd* self = new(ELeave) CControlInterfaceUsbcLdd(aParent); + CleanupStack::PushL(self); + self->ConstructL(); + CActiveScheduler::Add(self); + CleanupStack::Pop(); + return self; + } void CControlInterfaceUsbcLdd::ConstructL() - { - } + { + } /** @@ -65,210 +79,194 @@ @param aParent reference to the CBulkOnlyTransportUsbcLdd */ CControlInterfaceUsbcLdd::CControlInterfaceUsbcLdd(CBulkOnlyTransportUsbcLdd& aParent) - :CActive(EPriorityStandard), - iParent(aParent), - iCurrentState(ENone) - { - } + :CActive(EPriorityStandard), + iParent(aParent), + iCurrentState(ENone) + { + } /** d'tor */ CControlInterfaceUsbcLdd::~CControlInterfaceUsbcLdd() - { - __FNLOG("CControlInterfaceUsbcLdd::~CControlInterfaceUsbcLdd "); - Cancel(); - } + { + Cancel(); + } /** Called by CBulkOnlyTransport HwStart to start control interface */ TInt CControlInterfaceUsbcLdd::Start() - { - __FNLOG("CControlInterfaceUsbcLdd::Start "); - TInt res = ReadEp0Data(); - return (res); - } + { + TInt res = ReadEp0Data(); + return (res); + } /** Called by desctructor of CBulkOnlyTransportUsbcLdd to stop control interface */ void CControlInterfaceUsbcLdd::Stop() - { - __FNLOG("CControlInterfaceUsbcLdd::Stop "); - if (!IsActive()) - { - __PRINT(_L("Not active\n")); - return; - } - - __PRINT(_L("\nStopping...\n")); - - - iCurrentState = ENone; - - Cancel(); - } + { + if (!IsActive()) + { + return; + } + iCurrentState = ENone; + Cancel(); + } /** Cancel outstanding request (if any) */ void CControlInterfaceUsbcLdd::DoCancel() - { - __FNLOG("CControlInterfaceUsbcLdd::DoCancel "); - switch(iCurrentState) - { - case EReadEp0Data: - iParent.Ldd().ReadCancel(EEndpoint0); - break; - case ESendMaxLun: - iParent.Ldd().WriteCancel(EEndpoint0); - break; - default: - __PRINT(_L("\nWrong state !\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceBadState)); - } - } + { + switch(iCurrentState) + { + case EReadEp0Data: + iParent.Ldd().ReadCancel(EEndpoint0); + break; + case ESendMaxLun: + iParent.Ldd().WriteCancel(EEndpoint0); + break; + default: + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceBadState)); + break; + } + } /** Implement CControlInterfaceUsbcLdd state machine */ void CControlInterfaceUsbcLdd::RunL() - { - __FNLOG("CControlInterfaceUsbcLdd::RunL "); - if (iStatus != KErrNone) - { - __PRINT1(_L("Error %d in RunL\n"), iStatus.Int()); + { + if (iStatus != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, CCONTROLINTERFACEUSBCLDD, + "ERROR %d in RunL", iStatus.Int()); - //read EP0 again - ReadEp0Data(); - return; - } + //read EP0 again + ReadEp0Data(); + return; + } - switch (iCurrentState) - { - case ESendMaxLun: - ReadEp0Data(); - break; + switch (iCurrentState) + { + case ESendMaxLun: + ReadEp0Data(); + break; - case EReadEp0Data: - DecodeEp0Data(); - break; + case EReadEp0Data: + DecodeEp0Data(); + break; - default: - __PRINT(_L(" error: (Shouldn't end up here...)\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceBadState)); - break; - } - return; - } + default: + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceBadState)); + break; + } + return; + } /** Post a read request to EEndpoint0 to read request header */ TInt CControlInterfaceUsbcLdd::ReadEp0Data() - { - __FNLOG("CControlInterfaceUsbcLdd::ReadEp0Data "); - if (IsActive()) - { - __PRINT(_L("Still active\n")); - return KErrServerBusy; - } - iParent.Ldd().Read(iStatus, EEndpoint0, iData, KRequestHdrSize); + { + if (IsActive()) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, READEP0DATA, "Still active"); + return KErrServerBusy; + } + iParent.Ldd().Read(iStatus, EEndpoint0, iData, KRequestHdrSize); - iCurrentState = EReadEp0Data; + iCurrentState = EReadEp0Data; - SetActive(); - return KErrNone; - } + SetActive(); + return KErrNone; + } /** Decode request header and do appropriate action - get max LUN info or post a reset request */ void CControlInterfaceUsbcLdd::DecodeEp0Data() - { - __FNLOG("CControlInterfaceUsbcLdd::DecodeEp0Data "); - if (IsActive()) - { - __PRINT(_L("Still active\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceStillActive)); - return; - } + { + if (IsActive()) + { + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceStillActive)); + return; + } - TInt err = iRequestHeader.Decode(iData); + TInt err = iRequestHeader.Decode(iData); - if(err != KErrNone) - return; + if(err != KErrNone) + return; switch(iRequestHeader.iRequest) - { - // - // GET MAX LUN (0xFE) - // - case TUsbRequestHdr::EReqGetMaxLun: - { - __PRINT1(_L("DecodeEp0Data : 'Get Max LUN' Request MaxLun = %d"),iParent.MaxLun() ); - + { + // + // GET MAX LUN (0xFE) + // + case TUsbRequestHdr::EReqGetMaxLun: + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA, ">>> EP0 GetMaxLun = %d", iParent.MaxLun()); if ( iRequestHeader.iRequestType != 0xA1 //value from USB MS BOT spec || iRequestHeader.iIndex > 15 || iRequestHeader.iValue != 0 || iRequestHeader.iLength != 1) { - __PRINT(_L("GetMaxLun command packet check error")); + OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA1, "ERROR: GetMaxLun command packet check error"); iParent.Ldd().EndpointZeroRequestError(); break; } - iData.FillZ(1); //Return only 1 byte to host - iData[0] = static_cast(iParent.MaxLun()); // Supported Units - iParent.Ldd().Write(iStatus, EEndpoint0, iData, 1); + iData.FillZ(1); //Return only 1 byte to host + iData[0] = static_cast(iParent.MaxLun()); // Supported Units + iParent.Ldd().Write(iStatus, EEndpoint0, iData, 1); - iCurrentState = ESendMaxLun; - SetActive(); + iCurrentState = ESendMaxLun; + SetActive(); - return; - } - // - // RESET (0xFF) - // - case TUsbRequestHdr::EReqReset: - { - __PRINT(_L("DecodeEp0Data : 'Mass Storage Reset' Request")); + return; + } + // + // RESET (0xFF) + // + case TUsbRequestHdr::EReqReset: + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA2, ">>> EP0 BulkOnlyMassStorageReset"); if ( iRequestHeader.iRequestType != 0x21 //value from USB MS BOT spec || iRequestHeader.iIndex > 15 || iRequestHeader.iValue != 0 || iRequestHeader.iLength != 0) { - __PRINT(_L("MSC Reset command packet check error")); + OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA3, "BulkOnlyMassStorageReset command packet check error"); iParent.Ldd().EndpointZeroRequestError(); break; } - iParent.HwStop(); - iParent.Controller().Reset(); - iParent.HwStart(ETrue); + iParent.HwStop(); + iParent.Controller().Reset(); + iParent.HwStart(ETrue); err = iParent.Ldd().SendEp0StatusPacket(); - return; - } - // - // Unknown? - // - default: - { - __PRINT(_L("DecodeEp0Data : Unknown Request")); - - } - } - ReadEp0Data(); //try to get another request - } + return; + } + // + // Unknown? + // + default: + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA4, ">>> EP0 DecodeEp0Data : Unknown Request"); + } + } + ReadEp0Data(); //try to get another request + } // @@ -276,38 +274,34 @@ // CBulkOnlyTransportUsbcLdd::CBulkOnlyTransportUsbcLdd(TInt aNumDrives,CUsbMassStorageController& aController) - :CBulkOnlyTransport(aNumDrives, aController), - iSwap(ETrue) - { - __FNLOG("CBulkOnlyTransportUsbcLdd::CBulkOnlyTransportUsbcLdd"); - } + :CBulkOnlyTransport(aNumDrives, aController) + { + } /** Constructs the CBulkOnlyTransportUsbcLdd object */ void CBulkOnlyTransportUsbcLdd::ConstructL() - { - __FNLOG("CBulkOnlyTransportUsbcLdd::ConstructL()"); - iControlInterface = CControlInterfaceUsbcLdd::NewL(*this); - iDeviceStateNotifier = CActiveDeviceStateNotifierBase::NewL(*this, *this); - CActiveScheduler::Add(this); - } + { + iControlInterface = CControlInterfaceUsbcLdd::NewL(*this); + iDeviceStateNotifier = CActiveDeviceStateNotifierBase::NewL(*this, *this); + CActiveScheduler::Add(this); + } CBulkOnlyTransportUsbcLdd::~CBulkOnlyTransportUsbcLdd() - { - __FNLOG("CBulkOnlyTransportUsbcLdd::~CBulkOnlyTransportUsbcLdd"); - if (iInterfaceConfigured) - { - Stop(); - delete iControlInterface ; - delete iDeviceStateNotifier; - } - } + { + if (iInterfaceConfigured) + { + Stop(); + delete iControlInterface ; + delete iDeviceStateNotifier; + } + } RDevUsbcClient& CBulkOnlyTransportUsbcLdd::Ldd() - { - return iLdd; - } + { + return iLdd; + } /** @@ -317,44 +311,43 @@ @return KErrNone if operation was completed successfully, errorcode otherwise */ TInt CBulkOnlyTransportUsbcLdd::SetupConfigurationDescriptor(TBool aUnset) - { - __FNLOG("CBulkOnlyTransportUsbcLdd::SetupConfigurationDescriptor"); - TInt ret(KErrNone); - - if ((ret = iLdd.Open(0)) != KErrNone) - return ret; + { + TInt ret(KErrNone); + + if ((ret = iLdd.Open(0)) != KErrNone) + return ret; - TInt configDescriptorSize(0); - iLdd.GetConfigurationDescriptorSize(configDescriptorSize); - if (static_cast(configDescriptorSize) != KUsbDescSize_Config) - { - return KErrCorrupt; - } + TInt configDescriptorSize(0); + iLdd.GetConfigurationDescriptorSize(configDescriptorSize); + if (static_cast(configDescriptorSize) != KUsbDescSize_Config) + { + return KErrCorrupt; + } - TBuf8 configDescriptor; - ret = iLdd.GetConfigurationDescriptor(configDescriptor); - if (ret != KErrNone) - { - return ret; - } + TBuf8 configDescriptor; + ret = iLdd.GetConfigurationDescriptor(configDescriptor); + if (ret != KErrNone) + { + return ret; + } - // I beleive that other fields setted up during LDD initialisation - if (aUnset) - { - --configDescriptor[KUsbNumInterfacesOffset]; - } - else - { - ++configDescriptor[KUsbNumInterfacesOffset]; - } - ret = iLdd.SetConfigurationDescriptor(configDescriptor); + // I beleive that other fields setted up during LDD initialisation + if (aUnset) + { + --configDescriptor[KUsbNumInterfacesOffset]; + } + else + { + ++configDescriptor[KUsbNumInterfacesOffset]; + } + ret = iLdd.SetConfigurationDescriptor(configDescriptor); - if (aUnset) - { - iLdd.Close(); - } - return ret; - } + if (aUnset) + { + iLdd.Close(); + } + return ret; + } /** Set up interface descriptor @@ -362,211 +355,208 @@ @return KErrNone if operation was completed successfully, errorcode otherwise */ TInt CBulkOnlyTransportUsbcLdd::SetupInterfaceDescriptors() - { - __FNLOG("CBulkOnlyTransportUsbcLdd::SetupInterfaceDescriptors"); - // Device caps - TUsbDeviceCaps d_caps; - TInt ret = iLdd.DeviceCaps(d_caps); - if (ret != KErrNone) - { - return ret; - } - TInt totalEndpoints = d_caps().iTotalEndpoints; - if (totalEndpoints < KRequiredNumberOfEndpoints) - { - return KErrHardwareNotAvailable; - } + { + // Device caps + TUsbDeviceCaps d_caps; + TInt ret = iLdd.DeviceCaps(d_caps); + if (ret != KErrNone) + { + return ret; + } + TInt totalEndpoints = d_caps().iTotalEndpoints; + if (totalEndpoints < KRequiredNumberOfEndpoints) + { + return KErrHardwareNotAvailable; + } - // Endpoint caps - TUsbcEndpointData data[KUsbcMaxEndpoints]; - TPtr8 dataptr(reinterpret_cast(data), sizeof(data), sizeof(data)); - ret = iLdd.EndpointCaps(dataptr); - if (ret != KErrNone) - { - return ret; - } + // Endpoint caps + TUsbcEndpointData data[KUsbcMaxEndpoints]; + TPtr8 dataptr(reinterpret_cast(data), sizeof(data), sizeof(data)); + ret = iLdd.EndpointCaps(dataptr); + if (ret != KErrNone) + { + return ret; + } - // Set the active interface - TUsbcInterfaceInfoBuf ifc; - TInt ep_found = 0; - TBool foundBulkIN = EFalse; - TBool foundBulkOUT = EFalse; + // Set the active interface + TUsbcInterfaceInfoBuf ifc; + TInt ep_found = 0; + TBool foundBulkIN = EFalse; + TBool foundBulkOUT = EFalse; - for (TInt i = 0; i < totalEndpoints ; i++) - { - const TUsbcEndpointCaps* caps = &data[i].iCaps; - const TInt maxPacketSize = caps->MaxPacketSize(); - if (!foundBulkIN && - (caps->iTypesAndDir & (KUsbEpTypeBulk | KUsbEpDirIn)) == (KUsbEpTypeBulk | KUsbEpDirIn)) - { - // InEndpoint is going to be our TX (IN, write) endpoint - ifc().iEndpointData[0].iType = KUsbEpTypeBulk; - if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) - ifc().iEndpointData[0].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; - ifc().iEndpointData[0].iDir = KUsbEpDirIn; - ifc().iEndpointData[0].iSize = maxPacketSize; - ifc().iEndpointData[0].iInterval_Hs = 0; - foundBulkIN = ETrue; - if (++ep_found == KRequiredNumberOfEndpoints) - { - break; - } - continue; - } - if (!foundBulkOUT && - (caps->iTypesAndDir & (KUsbEpTypeBulk | KUsbEpDirOut)) == (KUsbEpTypeBulk | KUsbEpDirOut)) - { - // OutEndpoint is going to be our RX (OUT, read) endpoint - ifc().iEndpointData[1].iType = KUsbEpTypeBulk; - if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) - ifc().iEndpointData[1].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; - ifc().iEndpointData[1].iDir = KUsbEpDirOut; - ifc().iEndpointData[1].iSize = maxPacketSize; - ifc().iEndpointData[1].iInterval_Hs = 0; - foundBulkOUT = ETrue; - if (++ep_found == KRequiredNumberOfEndpoints) - { - break; - } - continue; - } - } - if (ep_found != KRequiredNumberOfEndpoints) - { - return KErrHardwareNotAvailable; - } + for (TInt i = 0; i < totalEndpoints ; i++) + { + const TUsbcEndpointCaps* caps = &data[i].iCaps; + const TInt maxPacketSize = caps->MaxPacketSize(); + if (!foundBulkIN && + (caps->iTypesAndDir & (KUsbEpTypeBulk | KUsbEpDirIn)) == (KUsbEpTypeBulk | KUsbEpDirIn)) + { + // InEndpoint is going to be our TX (IN, write) endpoint + ifc().iEndpointData[0].iType = KUsbEpTypeBulk; + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + ifc().iEndpointData[0].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; + ifc().iEndpointData[0].iDir = KUsbEpDirIn; + ifc().iEndpointData[0].iSize = maxPacketSize; + ifc().iEndpointData[0].iInterval_Hs = 0; + foundBulkIN = ETrue; + if (++ep_found == KRequiredNumberOfEndpoints) + { + break; + } + continue; + } + if (!foundBulkOUT && + (caps->iTypesAndDir & (KUsbEpTypeBulk | KUsbEpDirOut)) == (KUsbEpTypeBulk | KUsbEpDirOut)) + { + // OutEndpoint is going to be our RX (OUT, read) endpoint + ifc().iEndpointData[1].iType = KUsbEpTypeBulk; + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + ifc().iEndpointData[1].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; + ifc().iEndpointData[1].iDir = KUsbEpDirOut; + ifc().iEndpointData[1].iSize = maxPacketSize; + ifc().iEndpointData[1].iInterval_Hs = 0; + foundBulkOUT = ETrue; + if (++ep_found == KRequiredNumberOfEndpoints) + { + break; + } + continue; + } + } + if (ep_found != KRequiredNumberOfEndpoints) + { + return KErrHardwareNotAvailable; + } - _LIT16(string, "USB Mass Storage Interface"); - ifc().iString = const_cast(&string); - ifc().iTotalEndpointsUsed = KRequiredNumberOfEndpoints; - ifc().iClass.iClassNum = 0x08; // Mass Storage - ifc().iClass.iSubClassNum = 0x06; // SCSI Transparent Command Set - ifc().iClass.iProtocolNum = 0x50; // Bulk Only Transport + _LIT16(string, "USB Mass Storage Interface"); + ifc().iString = const_cast(&string); + ifc().iTotalEndpointsUsed = KRequiredNumberOfEndpoints; + ifc().iClass.iClassNum = 0x08; // Mass Storage + ifc().iClass.iSubClassNum = 0x06; // SCSI Transparent Command Set + ifc().iClass.iProtocolNum = 0x50; // Bulk Only Transport - TUint bandwidth_priority = (EUsbcBandwidthOUTDefault | EUsbcBandwidthINDefault); - if (d_caps().iHighSpeed) - { - // If this device supports USB High-speed, then we request 64KB buffers - // (otherwise the default 4KB ones will do). - bandwidth_priority = (EUsbcBandwidthOUTPlus2 | EUsbcBandwidthINPlus2); - // Also, tell the Protocol about it, because it might want to do some - // optimizing too. - iProtocol->ReportHighSpeedDevice(); - } - ret = iLdd.SetInterface(0, ifc, bandwidth_priority); - return ret; - } + TUint bandwidth_priority = (EUsbcBandwidthOUTDefault | EUsbcBandwidthINDefault); + if (d_caps().iHighSpeed) + { + // If this device supports USB High-speed, then we request 64KB buffers + // (otherwise the default 4KB ones will do). + bandwidth_priority = (EUsbcBandwidthOUTPlus2 | EUsbcBandwidthINPlus2); + // Also, tell the Protocol about it, because it might want to do some + // optimizing too. + iProtocol->ReportHighSpeedDevice(); + } + ret = iLdd.SetInterface(0, ifc, bandwidth_priority); + return ret; + } void CBulkOnlyTransportUsbcLdd::ReleaseInterface() - { - iLdd.ReleaseInterface(0); - } + { + iLdd.ReleaseInterface(0); + } TInt CBulkOnlyTransportUsbcLdd::StartControlInterface() - { - return iControlInterface->Start(); - } + { + return iControlInterface->Start(); + } void CBulkOnlyTransportUsbcLdd::CancelControlInterface() - { - iControlInterface->Cancel(); - } + { + iControlInterface->Cancel(); + } void CBulkOnlyTransportUsbcLdd::ActivateDeviceStateNotifier() - { + { __ASSERT_DEBUG(iDeviceStateNotifier, User::Panic(KUsbMsSvrPncCat, EMsCDeviceStateNotifierNull)); - iDeviceStateNotifier->Activate(); - } + iDeviceStateNotifier->Activate(); + } void CBulkOnlyTransportUsbcLdd::CancelDeviceStateNotifier() - { - iDeviceStateNotifier->Cancel(); - } + { + iDeviceStateNotifier->Cancel(); + } void CBulkOnlyTransportUsbcLdd::CancelReadWriteRequests() - { - __FNLOG("CBulkOnlyTransportUsbcLdd::CancelReadWriteRequests"); - iLdd.WriteCancel(InEndpoint); - iLdd.ReadCancel(OutEndpoint); - } + { + iLdd.WriteCancel(InEndpoint); + iLdd.ReadCancel(OutEndpoint); + } void CBulkOnlyTransportUsbcLdd::AllocateEndpointResources() - { - TUsbDeviceCaps d_caps; - TInt ret = iLdd.DeviceCaps(d_caps); - if (ret == KErrNone) - { - if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) != KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) - { - // Set up DMA if possible (errors are non-critical) - TInt err = iLdd.AllocateEndpointResource(OutEndpoint, EUsbcEndpointResourceDMA); - if (err != KErrNone) - { - __PRINT1(_L("Set DMA on OUT endpoint failed with error code: %d"), err); - } - err = iLdd.AllocateEndpointResource(InEndpoint, EUsbcEndpointResourceDMA); - if (err != KErrNone) - { - __PRINT1(_L("Set DMA on IN endpoint failed with error code: %d"), err); - } + { + TUsbDeviceCaps d_caps; + TInt ret = iLdd.DeviceCaps(d_caps); + if (ret == KErrNone) + { + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) != KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + { + // Set up DMA if possible (errors are non-critical) + TInt err = iLdd.AllocateEndpointResource(OutEndpoint, EUsbcEndpointResourceDMA); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, A1, "Set DMA on OUT endpoint failed with error code: %d", err); + } + err = iLdd.AllocateEndpointResource(InEndpoint, EUsbcEndpointResourceDMA); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, A2, "Set DMA on IN endpoint failed with error code: %d", err); + } - // Set up Double Buffering if possible (errors are non-critical) - err = iLdd.AllocateEndpointResource(OutEndpoint, EUsbcEndpointResourceDoubleBuffering); - if (err != KErrNone) - { - __PRINT1(_L("Set Double Buffering on OUT endpoint failed with error code: %d"), err); - } - err = iLdd.AllocateEndpointResource(InEndpoint, EUsbcEndpointResourceDoubleBuffering); - if (err != KErrNone) - { - __PRINT1(_L("Set Double Buffering on IN endpoint failed with error code: %d"), err); - } - } - } - } + // Set up Double Buffering if possible (errors are non-critical) + err = iLdd.AllocateEndpointResource(OutEndpoint, EUsbcEndpointResourceDoubleBuffering); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, A3, "Set Double Buffering on OUT endpoint failed with error code: %d", err); + } + err = iLdd.AllocateEndpointResource(InEndpoint, EUsbcEndpointResourceDoubleBuffering); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, A4, "Set Double Buffering on IN endpoint failed with error code: %d", err); + } + } + } + } TInt CBulkOnlyTransportUsbcLdd::GetDeviceStatus(TUsbcDeviceState& deviceStatus) - { - return iLdd.DeviceStatus(deviceStatus); - } + { + return iLdd.DeviceStatus(deviceStatus); + } void CBulkOnlyTransportUsbcLdd::FlushData() - { - TInt bytes; - const TInt err = iLdd.QueryReceiveBuffer(OutEndpoint, bytes); - if (err != KErrNone || bytes <= 0) - { - __PRINT1(_L("Error: err=%d bytes=%d"), bytes); - } - else - { - __PRINT1(_L("RxBuffer has %d bytes"), bytes); - ReadAndDiscardData(bytes); - } - } + { + TInt bytes; + const TInt err = iLdd.QueryReceiveBuffer(OutEndpoint, bytes); + if (err != KErrNone || bytes <= 0) + { + OstTraceExt2(TRACE_SMASSSTORAGE_BOT, B1, "ERROR: err=%d bytes=0x%x", err, bytes); + } + else + { + OstTrace1(TRACE_SMASSSTORAGE_BOT1, B2, "RxBuffer has %d bytes", bytes); + ReadAndDiscardData(bytes); + } + } /** * Read out rest data from OutEndpoint and discard them */ void CBulkOnlyTransportUsbcLdd::ReadAndDiscardData(TInt aBytes) - { - __FNLOG("CBulkOnlyTransportUsbcLdd::ReadAndDiscardData"); - iDiscardBuf.SetMax(); - const TUint bufsize = static_cast(iDiscardBuf.Length()); - TRequestStatus status; - while (aBytes > 0) - { - __PRINT1(_L("Bytes still to be read: %d\n"), aBytes); - iLdd.ReadOneOrMore(status, OutEndpoint, iDiscardBuf, bufsize); - User::WaitForRequest(status); - TInt err = status.Int(); - if (err != KErrNone) - { - // Bad. - break; - } - aBytes -= iDiscardBuf.Length(); - } - } + { + iDiscardBuf.SetMax(); + const TUint bufsize = static_cast(iDiscardBuf.Length()); + TRequestStatus status; + while (aBytes > 0) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT1, C1, "Bytes still to be read: 0x%x", aBytes); + iLdd.ReadOneOrMore(status, OutEndpoint, iDiscardBuf, bufsize); + User::WaitForRequest(status); + TInt err = status.Int(); + if (err != KErrNone) + { + // Bad. + break; + } + aBytes -= iDiscardBuf.Length(); + } + } /** Called by the protocol to determine how many bytes of data are available in the read buffer. @@ -574,74 +564,70 @@ @return The number of bytes available in the read buffer */ TInt CBulkOnlyTransportUsbcLdd::BytesAvailable() - { - TInt bytes = 0; - TInt err = iLdd.QueryReceiveBuffer(OutEndpoint, bytes); - if (err != KErrNone) - bytes = 0; - return bytes; - } + { + TInt bytes = 0; + TInt err = iLdd.QueryReceiveBuffer(OutEndpoint, bytes); + if (err != KErrNone) + bytes = 0; + return bytes; + } void CBulkOnlyTransportUsbcLdd::StallEndpointAndWaitForClear() - { - __FNLOG("CBulkOnlyTransportUsbcLdd::StallEndpointAndWaitForClear"); - - // Now stall this endpoint - __PRINT1(_L("Stalling endpoint %d"), InEndpoint); - TInt r = iLdd.HaltEndpoint(InEndpoint); - if (r != KErrNone) - { - __PRINT2(_L("Error: stalling ep %d failed: %d"), InEndpoint, r); - } - TEndpointState ep_state; - TInt i = 0; - do - { - // Wait for 10ms before checking the ep status - User::After(10000); - iLdd.EndpointStatus(InEndpoint, ep_state); - if (++i >= 550) - { - // 5.5 secs should be enough (see 9.2.6.1 Request Processing Timing) - __PRINT1(_L("Error: Checked for ep %d de-stall for 5.5s - giving up now"), InEndpoint); - // We can now only hope for a Reset Recovery - return; - } - } while ((ep_state == EEndpointStateStalled) && iStarted); - __PRINT2(_L("Checked for ep %d de-stall: %d time(s)"), InEndpoint, i); - } + { + // Now stall this endpoint + OstTrace1(TRACE_SMASSSTORAGE_BOT, D1, "Stalling endpoint %d", InEndpoint); + TInt r = iLdd.HaltEndpoint(InEndpoint); + if (r != KErrNone) + { + OstTraceExt2(TRACE_SMASSSTORAGE_BOT, D2, "Error: stalling ep %d failed: %d", InEndpoint, r); + } + TEndpointState ep_state; + TInt i = 0; + do + { + // Wait for 10ms before checking the ep status + User::After(10000); + iLdd.EndpointStatus(InEndpoint, ep_state); + if (++i >= 550) + { + // 5.5 secs should be enough (see 9.2.6.1 Request Processing Timing) + OstTrace1(TRACE_SMASSSTORAGE_BOT, D3, "Error: Checked for ep %d de-stall for 5.5s - giving up now", InEndpoint); + // We can now only hope for a Reset Recovery + return; + } + } while ((ep_state == EEndpointStateStalled) && iStarted); + OstTraceExt2(TRACE_SMASSSTORAGE_BOT, D4, "Checked for ep %d de-stall: %d time(s)", InEndpoint, i); + } /** Read CBW data (KCbwLength) from the host into the read buffer. */ void CBulkOnlyTransportUsbcLdd::ReadCBW() - { - __FNLOG("CBulkOnlyTransportUsbcLdd::ReadCBW"); - if (IsActive()) - { - __PRINT(_L("Still active\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); - return; - } + { + if (IsActive()) + { + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); + return; + } - iCbwBuf.SetMax(); - iLdd.ReadUntilShort(iStatus, OutEndpoint, iCbwBuf, KCbwLength); + iCbwBuf.SetMax(); + iLdd.ReadUntilShort(iStatus, OutEndpoint, iCbwBuf, KCbwLength); - iCurrentState = EWaitForCBW; - SetActive(); - } + iCurrentState = EWaitForCBW; + SetActive(); + } void CBulkOnlyTransportUsbcLdd::ExpireData(TAny* /*aAddress*/) - { - // Intentionally left blank - } + { + // Intentionally left blank + } void CBulkOnlyTransportUsbcLdd::ProcessCbwEvent() - { - DecodeCBW(); - } + { + DecodeCBW(); + } /** @@ -650,193 +636,172 @@ @param aLength amount of data (in bytes) to be received from the host */ void CBulkOnlyTransportUsbcLdd::ReadData(TUint aLength) - { - __FNLOG("CBulkOnlyTransportUsbcLdd::ReadData"); - if (IsActive()) - { - __PRINT(_L("Still active\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); - return; - } - - SetReadDataBufPtr(aLength); - iLdd.Read(iStatus, OutEndpoint, iReadBufPtr, aLength); + { + if (IsActive()) + { + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); + return; + } - iCurrentState = EReadingData; - SetActive(); - } + SetReadDataBufPtr(aLength); + iLdd.Read(iStatus, OutEndpoint, iReadBufPtr, aLength); + + iCurrentState = EReadingData; + SetActive(); + } void CBulkOnlyTransportUsbcLdd::WriteUsb(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired) - { - iLdd.Write(aStatus, InEndpoint, aDes, aLength, aZlpRequired); - } + { + iLdd.Write(aStatus, InEndpoint, aDes, aLength, aZlpRequired); + } void CBulkOnlyTransportUsbcLdd::SetCbwPtr() - { - iCbwBufPtr.Set(iCbwBuf.Ptr(), iCbwBuf.Length()); - } + { + iCbwBufPtr.Set(iCbwBuf.Ptr(), iCbwBuf.Length()); + } TPtr8& CBulkOnlyTransportUsbcLdd::SetCommandBufPtr(TUint aLength) - { - iCommandBufPtr.Set((TUint8*) iCommandBuf.Ptr(), aLength, aLength ); - return iCommandBufPtr; - } + { + iCommandBufPtr.Set((TUint8*) iCommandBuf.Ptr(), aLength, aLength ); + return iCommandBufPtr; + } void CBulkOnlyTransportUsbcLdd::SetReadDataBufPtr(TUint aLength) //Write10(Host->Device - { - if (iSwap) - { - iDataBuf1.SetLength(aLength); - iReadBufPtr.Set(iDataBuf1.LeftTPtr(iDataBuf1.Length())); - iSwap = EFalse; - } - else - { - iDataBuf2.SetLength(aLength); - iReadBufPtr.Set(iDataBuf2.LeftTPtr(iDataBuf2.Length())); - iSwap = ETrue; - } - } + { + iBulkMm.GetNextTransferBuffer(aLength, iReadBufPtr); + } + TPtr8& CBulkOnlyTransportUsbcLdd::SetDataBufPtr() //Read10(Device->Host) - { - if (iSwap) - { - iDataBufPtr.Set((TUint8*) iDataBuf1.Ptr(), KMaxBufSize, KMaxBufSize); - iSwap = EFalse; - } - else - { - iDataBufPtr.Set((TUint8*) iDataBuf2.Ptr(), KMaxBufSize, KMaxBufSize); - iSwap = ETrue; - } - return iDataBufPtr; - } + { + iBulkMm.GetNextTransferBuffer(iDataBufPtr); + return iDataBufPtr; + } void CBulkOnlyTransportUsbcLdd::SetPaddingBufPtr(TUint aLength) - { - iPaddingBufPtr.Set((TUint8*) iBuf.Ptr(), aLength, aLength ); - } + { + iPaddingBufPtr.Set((TUint8*) iBuf.Ptr(), aLength, aLength ); + } void CBulkOnlyTransportUsbcLdd::SetCswBufPtr(TUint aLength) - { - iCswBufPtr.Set((TUint8*) iCswBuf.Ptr(), aLength, aLength ); - } + { + iCswBufPtr.Set((TUint8*) iCswBuf.Ptr(), aLength, aLength ); + } void CBulkOnlyTransportUsbcLdd::ProcessReadingDataEvent() - { - TInt ret = KErrNone; + { + TInt ret = KErrNone; FOREVER - { - if (iReadSetUp) - { - ret = iProtocol->ReadComplete(KErrNone); - } + { + if (iReadSetUp) + { + ret = iProtocol->ReadComplete(KErrNone); + } - TUint deviceDataLength = iBufSize; // This is the amount (maximum in case of SC Ldd) to be read next. + TUint deviceDataLength = iBufSize; // This is the amount (maximum in case of SC Ldd) to be read next. - if(ret == KErrCompletion) - { - // The protocol has indicated with KErrCompletion that sufficient - // data is available in the buffer to process the transfer immediately. + if(ret == KErrCompletion) + { + // The protocol has indicated with KErrCompletion that sufficient + // data is available in the buffer to process the transfer immediately. - iDataResidue -= iReadBufPtr.Length(); - SetReadDataBufPtr(deviceDataLength); + iDataResidue -= iReadBufPtr.Length(); + SetReadDataBufPtr(deviceDataLength); - iLdd.Read(iStatus, OutEndpoint, iReadBufPtr, deviceDataLength); - User::WaitForRequest(iStatus); - if (iStatus != KErrNone) - { - // An error occurred - halt endpoints for reset recovery - __PRINT1(_L("Error %d in EReadingData, halt endpoints \n"), iStatus.Int()); - SetPermError(); - return; - } - } - else if(ret == KErrNotReady) - { - // The protocol has indicated with KErrNotReady that insufficient - // data is available in the buffer, so should wait for it to arrive + iLdd.Read(iStatus, OutEndpoint, iReadBufPtr, deviceDataLength); + User::WaitForRequest(iStatus); + if (iStatus != KErrNone) + { + // An error occurred - halt endpoints for reset recovery + OstTrace1(TRACE_SMASSSTORAGE_BOT, E1, "Error %d in EReadingData, halt endpoints", iStatus.Int()); + SetPermError(); + return; + } + } + else if(ret == KErrNotReady) + { + // The protocol has indicated with KErrNotReady that insufficient + // data is available in the buffer, so should wait for it to arrive iDataResidue -= iReadBufPtr.Length(); - ReadData(deviceDataLength); - break; - } - else - { - // The protocol has indicated that transfer is - // complete, so send the CSW response to the host. - iDataResidue -= iReadBufPtr.Length(); - iReadSetUp = EFalse; + ReadData(deviceDataLength); + break; + } + else + { + // The protocol has indicated that transfer is + // complete, so send the CSW response to the host. + iDataResidue -= iReadBufPtr.Length(); + iReadSetUp = EFalse; - if (ret != KErrNone) - { - iCmdStatus = ECommandFailed; - } + if (ret != KErrNone) + { + iCmdStatus = ECommandFailed; + } - if (iDataResidue) - { - __PRINT(_L("Discarding residue")); - // we have to read as much data as available that host PC sends; - // otherwise, bulk-out endpoint will need to keep sending NAK back. - ReadAndDiscardData(iDataResidue); - } - SendCSW(iCbwTag, iDataResidue, iCmdStatus); - break; - } - } + if (iDataResidue) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, E2, "Discarding residue"); + // we have to read as much data as available that host PC sends; + // otherwise, bulk-out endpoint will need to keep sending NAK back. + ReadAndDiscardData(iDataResidue); + } + SendCSW(iCbwTag, iDataResidue, iCmdStatus); + break; + } + } - } + } void CBulkOnlyTransportUsbcLdd::DiscardData(TUint aLength) - { - iBuf.SetLength(KBOTMaxBufSize); - TUint c = 0; - TRequestStatus status; - while (c < aLength) - { - TInt len; - if (aLength - c > KBOTMaxBufSize) - { - len = KBOTMaxBufSize; - } - else - { - len = aLength - c; - } + { + iBuf.SetLength(KBOTMaxBufSize); + TUint c = 0; + TRequestStatus status; + while (c < aLength) + { + TInt len; + if (aLength - c > KBOTMaxBufSize) + { + len = KBOTMaxBufSize; + } + else + { + len = aLength - c; + } - iLdd.Read(status, OutEndpoint, iBuf, len); - User::WaitForRequest(status); - c += KBOTMaxBufSize; - } - } + iLdd.Read(status, OutEndpoint, iBuf, len); + User::WaitForRequest(status); + c += KBOTMaxBufSize; + } + } void CBulkOnlyTransportUsbcLdd::WriteToClient(TUint aLength) - { - SetDataBufPtr(); - iLdd.Read(iStatus, OutEndpoint, iDataBufPtr, aLength); + { + SetDataBufPtr(); + iLdd.Read(iStatus, OutEndpoint, iDataBufPtr, aLength); User::WaitForRequest(iStatus); iProtocol->ReadComplete(KErrGeneral); - } + } #ifdef MSDC_MULTITHREADED void CBulkOnlyTransportUsbcLdd::GetBufferPointers(TPtr8& aDes1, TPtr8& aDes2) - { - aDes1.Set((TUint8*) iDataBuf1.Ptr(), KMaxBufSize, KMaxBufSize); - aDes2.Set((TUint8*) iDataBuf2.Ptr(), KMaxBufSize, KMaxBufSize); - } + { + aDes1.Set(iBulkMm.Buf1(), KMaxBufSize, KMaxBufSize); + aDes2.Set(iBulkMm.Buf2(), KMaxBufSize, KMaxBufSize); + } #endif void CBulkOnlyTransportUsbcLdd::Activate(TRequestStatus& aStatus, TUint& aDeviceState) { - iLdd.AlternateDeviceStatusNotify(aStatus, aDeviceState); + iLdd.AlternateDeviceStatusNotify(aStatus, aDeviceState); } void CBulkOnlyTransportUsbcLdd::Cancel() { - iLdd.AlternateDeviceStatusNotifyCancel(); + iLdd.AlternateDeviceStatusNotifyCancel(); } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcscldd.cpp --- a/userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcscldd.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcscldd.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -21,20 +21,32 @@ @internalTechnology */ +#include +#include "mtransport.h" +#include "mprotocol.h" +#include "mldddevicestatenotification.h" + +#include "drivemanager.h" +#include "cusbmassstoragecontroller.h" + #include "cbulkonlytransport.h" #include "cbulkonlytransportusbcscldd.h" -#include "usbmsshared.h" -#include "massstoragedebug.h" -#include "cusbmassstorageserver.h" +#include "smassstorage.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cbulkonlytransportusbcsclddTraces.h" +#endif + //This value defined in USB Mass Storage Bulk Only Transrt spec and not supposed to be changed -LOCAL_D const TInt KRequiredNumberOfEndpoints = 2; // in addition to endpoint 0. +static const TInt KRequiredNumberOfEndpoints = 2; // in addition to endpoint 0. -LOCAL_D const TInt KUsbNumInterfacesOffset = 4; +static const TInt KUsbNumInterfacesOffset = 4; #ifdef MSDC_MULTITHREADED -//Only used in DB. The first 2K of KMaxScBufferSize for sending CSW +//Only used in DB. The first 2K of KMaxScBufferSize for sending CSW static const TUint32 KCswBufferSize = 2 * 1024; #endif @@ -47,19 +59,19 @@ CControlInterfaceUsbcScLdd* CControlInterfaceUsbcScLdd::NewL(CBulkOnlyTransportUsbcScLdd& aParent) - { - CControlInterfaceUsbcScLdd* self = new(ELeave) CControlInterfaceUsbcScLdd(aParent); - CleanupStack::PushL(self); - self->ConstructL(); - CActiveScheduler::Add(self); - CleanupStack::Pop(); - return self; - } + { + CControlInterfaceUsbcScLdd* self = new(ELeave) CControlInterfaceUsbcScLdd(aParent); + CleanupStack::PushL(self); + self->ConstructL(); + CActiveScheduler::Add(self); + CleanupStack::Pop(); + return self; + } void CControlInterfaceUsbcScLdd::ConstructL() - { - } + { + } /** @@ -68,229 +80,212 @@ @param aParent reference to the CBulkOnlyTransportUsbcScLdd */ CControlInterfaceUsbcScLdd::CControlInterfaceUsbcScLdd(CBulkOnlyTransportUsbcScLdd& aParent) - :CActive(EPriorityStandard), - iParent(aParent), - iCurrentState(ENone) - { - } + :CActive(EPriorityStandard), + iParent(aParent), + iCurrentState(ENone) + { + } /** d'tor */ CControlInterfaceUsbcScLdd::~CControlInterfaceUsbcScLdd() - { - __FNLOG("CControlInterfaceUsbcScLdd::~CControlInterfaceUsbcScLdd "); - Cancel(); - iEp0Buf.Close(); - } + { + Cancel(); + iEp0Buf.Close(); + } TInt CControlInterfaceUsbcScLdd::OpenEp0() - { - TInt res = iParent.Ldd().OpenEndpoint(iEp0Buf,0); - return res; - } + { + TInt res = iParent.Ldd().OpenEndpoint(iEp0Buf,0); + return res; + } /** Called by CBulkOnlyTransport HwStart to start control interface */ TInt CControlInterfaceUsbcScLdd::Start() - { - __FNLOG("CControlInterfaceUsbcScLdd::Start "); - TInt res = ReadEp0Data(); - return (res); - } + { + TInt res = ReadEp0Data(); + return (res); + } /** Called by desctructor of CBulkOnlyTransportUsbcScLdd to stop control interface */ void CControlInterfaceUsbcScLdd::Stop() - { - __FNLOG("CControlInterfaceUsbcScLdd::Stop "); - if (!IsActive()) - { - __PRINT(_L("Not active\n")); - return; - } - - __PRINT(_L("\nStopping...\n")); - - - iCurrentState = ENone; - - Cancel(); - } + { + if (!IsActive()) + { + return; + } + iCurrentState = ENone; + Cancel(); + } /** Cancel outstanding request (if any) */ void CControlInterfaceUsbcScLdd::DoCancel() - { - __FNLOG("CControlInterfaceUsbcScLdd::DoCancel "); - switch(iCurrentState) - { - case EReadEp0Data: - iParent.Ldd().ReadCancel(KUsbcScEndpointZero); - break; - case ESendMaxLun: - iParent.Ldd().WriteCancel(KUsbcScEndpointZero); - break; - default: - __PRINT(_L("\nWrong state !\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceBadState)); - } - } + { + switch(iCurrentState) + { + case EReadEp0Data: + iParent.Ldd().ReadCancel(KUsbcScEndpointZero); + break; + case ESendMaxLun: + iParent.Ldd().WriteCancel(KUsbcScEndpointZero); + break; + default: + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceBadState)); + } + } /** Implement CControlInterfaceUsbcScLdd state machine */ void CControlInterfaceUsbcScLdd::RunL() - { - __FNLOG("CControlInterfaceUsbcScLdd::RunL "); - if (iStatus != KErrNone) - { - __PRINT1(_L("Error %d in RunL\n"), iStatus.Int()); + { + if (iStatus != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, CCONTROLINTERFACEUSBCSCLDD, + "ERROR %d in RunL", iStatus.Int()); + //read EP0 again + ReadEp0Data(); + return; + } - //read EP0 again - ReadEp0Data(); - return; - } - - ReadEp0Data(); - } + ReadEp0Data(); + } /** Actual Read to RDevUsbcScClient BIL */ TInt CControlInterfaceUsbcScLdd::ReadUsbEp0() - { - iCurrentState = EReadEp0Data; - iStatus = KRequestPending; - return iEp0Buf.GetBuffer (iEp0Packet,iEp0Size,iEp0Zlp,iStatus); - } + { + iCurrentState = EReadEp0Data; + iStatus = KRequestPending; + return iEp0Buf.GetBuffer (iEp0Packet,iEp0Size,iEp0Zlp,iStatus); + } /** Post a read request to EEndpoint0 to read request header */ TInt CControlInterfaceUsbcScLdd::ReadEp0Data() - { - __FNLOG("CControlInterfaceUsbcScLdd::ReadEp0Data "); - if (IsActive()) - { - __PRINT(_L("Still active\n")); - return KErrServerBusy; - } + { + if (IsActive()) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, READEP0DATA_SC, "Still active"); + return KErrServerBusy; + } - TInt r = KErrNone; - do - { - r = ReadUsbEp0(); - if (r == KErrCompletion) - { - iStatus = KErrNone; - DecodeEp0Data(); - } - else if (r == KErrNone) - { - SetActive(); - } - } while (((r == KErrCompletion) || (r == TEndpointBuffer::KStateChange)) && (!IsActive())); - return KErrNone; - } + TInt r = KErrNone; + do + { + r = ReadUsbEp0(); + if (r == KErrCompletion) + { + iStatus = KErrNone; + DecodeEp0Data(); + } + else if (r == KErrNone) + { + SetActive(); + } + } while (((r == KErrCompletion) || (r == TEndpointBuffer::KStateChange)) && (!IsActive())); + return KErrNone; + } /** Decode request header and do appropriate action - get max LUN info or post a reset request */ void CControlInterfaceUsbcScLdd::DecodeEp0Data() - { - __FNLOG("CControlInterfaceUsbcScLdd::DecodeEp0Data "); + { + if (IsActive()) + { + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceStillActive)); + return; + } - if (IsActive()) - { - __PRINT(_L("Still active\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceStillActive)); - return; - } + TPtrC8 ep0ReadDataPtr((TUint8*)iEp0Packet, iEp0Size); + TInt err = iRequestHeader.Decode(ep0ReadDataPtr); - TPtrC8 ep0ReadDataPtr((TUint8*)iEp0Packet, iEp0Size); - TInt err = iRequestHeader.Decode(ep0ReadDataPtr); - - if(err != KErrNone) - return; + if(err != KErrNone) + return; switch(iRequestHeader.iRequest) - { - // - // GET MAX LUN (0xFE) - // - case TUsbRequestHdr::EReqGetMaxLun: - { - __PRINT1(_L("DecodeEp0Data : 'Get Max LUN' Request MaxLun = %d"),iParent.MaxLun() ); + { + // + // GET MAX LUN (0xFE) + // + case TUsbRequestHdr::EReqGetMaxLun: + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA_SC, ">>> EP0 GetMaxLun = %d", iParent.MaxLun()); if ( iRequestHeader.iRequestType != 0xA1 //value from USB MS BOT spec || iRequestHeader.iIndex > 15 || iRequestHeader.iValue != 0 || iRequestHeader.iLength != 1) { - __PRINT(_L("GetMaxLun command packet check error")); + OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA1_SC, "ERROR: GetMaxLun command packet check error"); iParent.Ldd().EndpointZeroRequestError(); break; } - TPtr8* ep0WriteDataPtr = NULL; - TUint ep0Length; - iEp0Buf.GetInBufferRange(((TAny*&)ep0WriteDataPtr),ep0Length); - ep0WriteDataPtr->SetLength(1); //Return only 1 byte to host - ep0WriteDataPtr->Fill(0); - ep0WriteDataPtr->Fill(iParent.MaxLun()); // Supported Units - TInt length = ep0WriteDataPtr->Length(); - err = iEp0Buf.WriteBuffer((TPtr8*)(ep0WriteDataPtr->Ptr()),length,ETrue,iStatus); + TPtr8* ep0WriteDataPtr = NULL; + TUint ep0Length; + iEp0Buf.GetInBufferRange(((TAny*&)ep0WriteDataPtr),ep0Length); + ep0WriteDataPtr->SetLength(1); //Return only 1 byte to host + ep0WriteDataPtr->Fill(0); + ep0WriteDataPtr->Fill(iParent.MaxLun()); // Supported Units + TInt length = ep0WriteDataPtr->Length(); + err = iEp0Buf.WriteBuffer((TPtr8*)(ep0WriteDataPtr->Ptr()),length,ETrue,iStatus); - iCurrentState = ESendMaxLun; - SetActive(); + iCurrentState = ESendMaxLun; + SetActive(); - return; - } - // - // RESET (0xFF) - // - case TUsbRequestHdr::EReqReset: - { - __PRINT(_L("DecodeEp0Data : 'Mass Storage Reset' Request")); + return; + } + // + // RESET (0xFF) + // + case TUsbRequestHdr::EReqReset: + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA2_SC, ">>> EP0 BulkOnlyMassStorageReset"); if ( iRequestHeader.iRequestType != 0x21 //value from USB MS BOT spec || iRequestHeader.iIndex > 15 || iRequestHeader.iValue != 0 || iRequestHeader.iLength != 0) { - __PRINT(_L("MSC Reset command packet check error")); + OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA3_SC, "BulkOnlyMassStorageReset command packet check error"); iParent.Ldd().EndpointZeroRequestError(); break; } - iParent.HwStop(); - iParent.Controller().Reset(); - iParent.HwStart(ETrue); + iParent.HwStop(); + iParent.Controller().Reset(); + iParent.HwStart(ETrue); err = iParent.Ldd().SendEp0StatusPacket(); - return; - } - // - // Unknown? - // - default: - { - __PRINT(_L("DecodeEp0Data : Unknown Request")); - - } - } - ReadEp0Data(); //try to get another request - } + return; + } + // + // Unknown? + // + default: + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA4_SC, ">>> EP0 DecodeEp0Data : Unknown Request"); + } + } + ReadEp0Data(); //try to get another request + } // @@ -298,42 +293,39 @@ // CBulkOnlyTransportUsbcScLdd::CBulkOnlyTransportUsbcScLdd(TInt aNumDrives,CUsbMassStorageController& aController) - :CBulkOnlyTransport(aNumDrives, aController) - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::CBulkOnlyTransportUsbcScLdd"); - } + :CBulkOnlyTransport(aNumDrives, aController) + { + } /** Constructs the CBulkOnlyTransportUsbcScLdd object */ void CBulkOnlyTransportUsbcScLdd::ConstructL() - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::ConstructL()"); - iControlInterface = CControlInterfaceUsbcScLdd::NewL(*this); - iDeviceStateNotifier = CActiveDeviceStateNotifierBase::NewL(*this, *this); - iChunk = new RChunk(); - CActiveScheduler::Add(this); - } + { + iControlInterface = CControlInterfaceUsbcScLdd::NewL(*this); + iDeviceStateNotifier = CActiveDeviceStateNotifierBase::NewL(*this, *this); + iChunk = new RChunk(); + CActiveScheduler::Add(this); + } CBulkOnlyTransportUsbcScLdd::~CBulkOnlyTransportUsbcScLdd() - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::~CBulkOnlyTransportUsbcScLdd"); - if (iInterfaceConfigured) - { + { + if (iInterfaceConfigured) + { Stop(); - TInt err = iSCReadEndpointBuf.Close(); - err = iSCWriteEndpointBuf.Close(); - delete iControlInterface ; - delete iDeviceStateNotifier; - delete iChunk; - } - } + TInt err = iSCReadEndpointBuf.Close(); + err = iSCWriteEndpointBuf.Close(); + delete iControlInterface ; + delete iDeviceStateNotifier; + delete iChunk; + } + } RDevUsbcScClient& CBulkOnlyTransportUsbcScLdd::Ldd() - { - return iLdd; - } + { + return iLdd; + } /** Set or unset configuration descriptor for USB MassStorage Bulk Only transport @@ -342,45 +334,44 @@ @return KErrNone if operation was completed successfully, errorcode otherwise */ TInt CBulkOnlyTransportUsbcScLdd::SetupConfigurationDescriptor(TBool aUnset) - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::SetupConfigurationDescriptor"); - TInt ret(KErrNone); + { + TInt ret(KErrNone); - if ((ret = iLdd.Open(0)) != KErrNone) - return ret; + if ((ret = iLdd.Open(0)) != KErrNone) + return ret; - TInt configDescriptorSize(0); - iLdd.GetConfigurationDescriptorSize(configDescriptorSize); - if (static_cast(configDescriptorSize) != KUsbDescSize_Config) - { - return KErrCorrupt; - } + TInt configDescriptorSize(0); + iLdd.GetConfigurationDescriptorSize(configDescriptorSize); + if (static_cast(configDescriptorSize) != KUsbDescSize_Config) + { + return KErrCorrupt; + } - TBuf8 configDescriptor; - ret = iLdd.GetConfigurationDescriptor(configDescriptor); - if (ret != KErrNone) - { - return ret; - } + TBuf8 configDescriptor; + ret = iLdd.GetConfigurationDescriptor(configDescriptor); + if (ret != KErrNone) + { + return ret; + } - // I beleive that other fields setted up during LDD initialisation - if (aUnset) - { - --configDescriptor[KUsbNumInterfacesOffset]; - } - else - { - ++configDescriptor[KUsbNumInterfacesOffset]; - } - ret = iLdd.SetConfigurationDescriptor(configDescriptor); + // I beleive that other fields setted up during LDD initialisation + if (aUnset) + { + --configDescriptor[KUsbNumInterfacesOffset]; + } + else + { + ++configDescriptor[KUsbNumInterfacesOffset]; + } + ret = iLdd.SetConfigurationDescriptor(configDescriptor); - if (aUnset) - { - iLdd.Close(); - } + if (aUnset) + { + iLdd.Close(); + } - return ret; - } + return ret; + } /** Set up interface descriptor @@ -388,265 +379,261 @@ @return KErrNone if operation was completed successfully, errorcode otherwise */ TInt CBulkOnlyTransportUsbcScLdd::SetupInterfaceDescriptors() - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::SetupInterfaceDescriptors"); - // Device caps - TUsbDeviceCaps d_caps; - TInt ret = iLdd.DeviceCaps(d_caps); - if (ret != KErrNone) - { - return ret; - } - TInt totalEndpoints = d_caps().iTotalEndpoints; - if (totalEndpoints < KRequiredNumberOfEndpoints) - { - return KErrHardwareNotAvailable; - } + { + // Device caps + TUsbDeviceCaps d_caps; + TInt ret = iLdd.DeviceCaps(d_caps); + if (ret != KErrNone) + { + return ret; + } + TInt totalEndpoints = d_caps().iTotalEndpoints; + if (totalEndpoints < KRequiredNumberOfEndpoints) + { + return KErrHardwareNotAvailable; + } - // Endpoint caps - TUsbcEndpointData data[KUsbcMaxEndpoints]; - TPtr8 dataptr(reinterpret_cast(data), sizeof(data), sizeof(data)); - ret = iLdd.EndpointCaps(dataptr); - if (ret != KErrNone) - { - return ret; - } + // Endpoint caps + TUsbcEndpointData data[KUsbcMaxEndpoints]; + TPtr8 dataptr(reinterpret_cast(data), sizeof(data), sizeof(data)); + ret = iLdd.EndpointCaps(dataptr); + if (ret != KErrNone) + { + return ret; + } - // Set the active interface - TUsbcScInterfaceInfoBuf ifc; - TInt ep_found = 0; - TBool foundBulkIN = EFalse; - TBool foundBulkOUT = EFalse; + // Set the active interface + TUsbcScInterfaceInfoBuf ifc; + TInt ep_found = 0; + TBool foundBulkIN = EFalse; + TBool foundBulkOUT = EFalse; - for (TInt i = 0; i < totalEndpoints ; i++) - { - const TUsbcEndpointCaps* caps = &data[i].iCaps; - const TInt maxPacketSize = caps->MaxPacketSize(); - if (!foundBulkIN && - (caps->iTypesAndDir & (KUsbEpTypeBulk | KUsbEpDirIn)) == (KUsbEpTypeBulk | KUsbEpDirIn)) - { - // InEndpoint is going to be our TX (IN, write) endpoint - ifc().iEndpointData[0].iType = KUsbEpTypeBulk; - if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) - ifc().iEndpointData[0].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; - ifc().iEndpointData[0].iDir = KUsbEpDirIn; - ifc().iEndpointData[0].iSize = maxPacketSize; - ifc().iEndpointData[0].iInterval_Hs = 0; - ifc().iEndpointData[0].iBufferSize = KMaxScBufferSize; - foundBulkIN = ETrue; - if (++ep_found == KRequiredNumberOfEndpoints) - { - break; - } - continue; - } - if (!foundBulkOUT && - (caps->iTypesAndDir & (KUsbEpTypeBulk | KUsbEpDirOut)) == (KUsbEpTypeBulk | KUsbEpDirOut)) - { - // OutEndpoint is going to be our RX (OUT, read) endpoint - ifc().iEndpointData[1].iType = KUsbEpTypeBulk; - if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) - ifc().iEndpointData[1].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; - ifc().iEndpointData[1].iDir = KUsbEpDirOut; - ifc().iEndpointData[1].iSize = maxPacketSize; - ifc().iEndpointData[1].iInterval_Hs = 0; - ifc().iEndpointData[1].iBufferSize = KMaxScBufferSize; - ifc().iEndpointData[1].iReadSize = KMaxScReadSize; + for (TInt i = 0; i < totalEndpoints ; i++) + { + const TUsbcEndpointCaps* caps = &data[i].iCaps; + const TInt maxPacketSize = caps->MaxPacketSize(); + if (!foundBulkIN && + (caps->iTypesAndDir & (KUsbEpTypeBulk | KUsbEpDirIn)) == (KUsbEpTypeBulk | KUsbEpDirIn)) + { + // InEndpoint is going to be our TX (IN, write) endpoint + ifc().iEndpointData[0].iType = KUsbEpTypeBulk; + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + ifc().iEndpointData[0].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; + ifc().iEndpointData[0].iDir = KUsbEpDirIn; + ifc().iEndpointData[0].iSize = maxPacketSize; + ifc().iEndpointData[0].iInterval_Hs = 0; + ifc().iEndpointData[0].iBufferSize = KMaxScBufferSize; + foundBulkIN = ETrue; + if (++ep_found == KRequiredNumberOfEndpoints) + { + break; + } + continue; + } + if (!foundBulkOUT && + (caps->iTypesAndDir & (KUsbEpTypeBulk | KUsbEpDirOut)) == (KUsbEpTypeBulk | KUsbEpDirOut)) + { + // OutEndpoint is going to be our RX (OUT, read) endpoint + ifc().iEndpointData[1].iType = KUsbEpTypeBulk; + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + ifc().iEndpointData[1].iFeatureWord1 = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering; + ifc().iEndpointData[1].iDir = KUsbEpDirOut; + ifc().iEndpointData[1].iSize = maxPacketSize; + ifc().iEndpointData[1].iInterval_Hs = 0; + ifc().iEndpointData[1].iBufferSize = KMaxScBufferSize; + ifc().iEndpointData[1].iReadSize = KMaxScReadSize; - foundBulkOUT = ETrue; - if (++ep_found == KRequiredNumberOfEndpoints) - { - break; - } - continue; - } - } - if (ep_found != KRequiredNumberOfEndpoints) - { - return KErrHardwareNotAvailable; - } + foundBulkOUT = ETrue; + if (++ep_found == KRequiredNumberOfEndpoints) + { + break; + } + continue; + } + } + if (ep_found != KRequiredNumberOfEndpoints) + { + return KErrHardwareNotAvailable; + } - _LIT16(string, "USB Mass Storage Interface"); - ifc().iString = const_cast(&string); - ifc().iTotalEndpointsUsed = KRequiredNumberOfEndpoints; - ifc().iClass.iClassNum = 0x08; // Mass Storage - ifc().iClass.iSubClassNum = 0x06; // SCSI Transparent Command Set - ifc().iClass.iProtocolNum = 0x50; // Bulk Only Transport + _LIT16(string, "USB Mass Storage Interface"); + ifc().iString = const_cast(&string); + ifc().iTotalEndpointsUsed = KRequiredNumberOfEndpoints; + ifc().iClass.iClassNum = 0x08; // Mass Storage + ifc().iClass.iSubClassNum = 0x06; // SCSI Transparent Command Set + ifc().iClass.iProtocolNum = 0x50; // Bulk Only Transport - if (d_caps().iHighSpeed) - { - // Tell the Protocol about it, because it might want to do some - // optimizing too. - iProtocol->ReportHighSpeedDevice(); - } + if (d_caps().iHighSpeed) + { + // Tell the Protocol about it, because it might want to do some + // optimizing too. + iProtocol->ReportHighSpeedDevice(); + } - if ((ret = iLdd.SetInterface(0, ifc)) == KErrNone) - { - return (iLdd.FinalizeInterface(iChunk)); - } - return ret; - } + if ((ret = iLdd.SetInterface(0, ifc)) == KErrNone) + { + return (iLdd.FinalizeInterface(iChunk)); + } + return ret; + } void CBulkOnlyTransportUsbcScLdd::ReleaseInterface() - { - iLdd.ReleaseInterface(0); - } + { + iLdd.ReleaseInterface(0); + } TInt CBulkOnlyTransportUsbcScLdd::StartControlInterface() - { - return iControlInterface->Start(); - } + { + return iControlInterface->Start(); + } void CBulkOnlyTransportUsbcScLdd::CancelControlInterface() - { - iControlInterface->Cancel(); - } + { + iControlInterface->Cancel(); + } void CBulkOnlyTransportUsbcScLdd::ActivateDeviceStateNotifier() - { - iDeviceStateNotifier->Activate(); - } + { + iDeviceStateNotifier->Activate(); + } void CBulkOnlyTransportUsbcScLdd::CancelDeviceStateNotifier() - { - iDeviceStateNotifier->Cancel(); - } + { + iDeviceStateNotifier->Cancel(); + } void CBulkOnlyTransportUsbcScLdd::CancelReadWriteRequests() - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::CancelReadWriteRequests"); - TUsbcScChunkHeader chunkHeader(*iChunk); - for (TInt i = 0; i < chunkHeader.iAltSettings->iNumOfAltSettings; i++) - { - TInt8* endpoint = (TInt8*) (chunkHeader.iAltSettings->iAltTableOffset[i] + (TInt) iChunk->Base()); - TInt numOfEps = chunkHeader.GetNumberOfEndpoints(i); + { + TUsbcScChunkHeader chunkHeader(*iChunk); + for (TInt i = 0; i < chunkHeader.iAltSettings->iNumOfAltSettings; i++) + { + TInt8* endpoint = (TInt8*) (chunkHeader.iAltSettings->iAltTableOffset[i] + (TInt) iChunk->Base()); + TInt numOfEps = chunkHeader.GetNumberOfEndpoints(i); __ASSERT_DEBUG(numOfEps >= 0, User::Invariant()); - for (TInt j = 1; j <= numOfEps; j++) - { - TUsbcScHdrEndpointRecord* endpointInf = (TUsbcScHdrEndpointRecord*) &(endpoint[j * chunkHeader.iAltSettings->iEpRecordSize]); - if (endpointInf->Direction() == KUsbScHdrEpDirectionOut) - { - iLdd.ReadCancel(endpointInf->iBufferNo); - } - if (endpointInf->Direction() == KUsbScHdrEpDirectionIn) - { - iLdd.WriteCancel(endpointInf->iBufferNo); - } - } - } - } + for (TInt j = 1; j <= numOfEps; j++) + { + TUsbcScHdrEndpointRecord* endpointInf = (TUsbcScHdrEndpointRecord*) &(endpoint[j * chunkHeader.iAltSettings->iEpRecordSize]); + if (endpointInf->Direction() == KUsbScHdrEpDirectionOut) + { + iLdd.ReadCancel(endpointInf->iBufferNo); + } + if (endpointInf->Direction() == KUsbScHdrEpDirectionIn) + { + iLdd.WriteCancel(endpointInf->iBufferNo); + } + } + } + } void CBulkOnlyTransportUsbcScLdd::AllocateEndpointResources() - { - TUsbcScChunkHeader chunkHeader(*iChunk); - for (TInt i = 0; i < chunkHeader.iAltSettings->iNumOfAltSettings; i++) - { - TInt8* endpoint = (TInt8*) (chunkHeader.iAltSettings->iAltTableOffset[i] + (TInt) iChunk->Base()); + { + TUsbcScChunkHeader chunkHeader(*iChunk); + for (TInt i = 0; i < chunkHeader.iAltSettings->iNumOfAltSettings; i++) + { + TInt8* endpoint = (TInt8*) (chunkHeader.iAltSettings->iAltTableOffset[i] + (TInt) iChunk->Base()); - for (TInt j = 1; j <= chunkHeader.GetNumberOfEndpoints(i); j++) - { - TUsbcScHdrEndpointRecord* endpointInf = (TUsbcScHdrEndpointRecord*) &(endpoint[j * chunkHeader.iAltSettings->iEpRecordSize]); - if (endpointInf->Direction() == KUsbScHdrEpDirectionOut) - { - iOutEndpoint = j; - } - if (endpointInf->Direction() == KUsbScHdrEpDirectionIn) - { - iInEndpoint = j; - } - } - } + for (TInt j = 1; j <= chunkHeader.GetNumberOfEndpoints(i); j++) + { + TUsbcScHdrEndpointRecord* endpointInf = (TUsbcScHdrEndpointRecord*) &(endpoint[j * chunkHeader.iAltSettings->iEpRecordSize]); + if (endpointInf->Direction() == KUsbScHdrEpDirectionOut) + { + iOutEndpoint = j; + } + if (endpointInf->Direction() == KUsbScHdrEpDirectionIn) + { + iInEndpoint = j; + } + } + } - TUsbDeviceCaps d_caps; - TInt err; - TInt ret = iLdd.DeviceCaps(d_caps); - if (ret == KErrNone) - { - if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) != KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) - { - __PRINT(_L("CBulkOnlyTransportUsbcScLdd::Start - Setting up DMA and double buffering\n")); - // Set up DMA if possible (errors are non-critical) - err = iLdd.AllocateEndpointResource(iOutEndpoint, EUsbcEndpointResourceDMA); - if (err != KErrNone) - { - __PRINT1(_L("Set DMA on OUT endpoint failed with error code: %d"), err); - } - err = iLdd.AllocateEndpointResource(iInEndpoint, EUsbcEndpointResourceDMA); - if (err != KErrNone) - { - __PRINT1(_L("Set DMA on IN endpoint failed with error code: %d"), err); - } + TUsbDeviceCaps d_caps; + TInt err; + TInt ret = iLdd.DeviceCaps(d_caps); + if (ret == KErrNone) + { + if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) != KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) + { + // Set up DMA if possible (errors are non-critical) + err = iLdd.AllocateEndpointResource(iOutEndpoint, EUsbcEndpointResourceDMA); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, A1_SC, "Set DMA on OUT endpoint failed with error code: %d", err); + } + err = iLdd.AllocateEndpointResource(iInEndpoint, EUsbcEndpointResourceDMA); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, A2_SC, "Set DMA on IN endpoint failed with error code: %d", err); + } - // Set up Double Buffering if possible (errors are non-critical) - err = iLdd.AllocateEndpointResource(iOutEndpoint, EUsbcEndpointResourceDoubleBuffering); - if (err != KErrNone) - { - __PRINT1(_L("Set Double Buffering on OUT endpoint failed with error code: %d"), err); - } - err = iLdd.AllocateEndpointResource(iInEndpoint, EUsbcEndpointResourceDoubleBuffering); - if (err != KErrNone) - { - __PRINT1(_L("Set Double Buffering on IN endpoint failed with error code: %d"), err); - } - } - } - - err = OpenEndpoints(); - } + // Set up Double Buffering if possible (errors are non-critical) + err = iLdd.AllocateEndpointResource(iOutEndpoint, EUsbcEndpointResourceDoubleBuffering); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, A3_SC, "Set Double Buffering on OUT endpoint failed with error code: %d", err); + } + err = iLdd.AllocateEndpointResource(iInEndpoint, EUsbcEndpointResourceDoubleBuffering); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_BOT, A4_SC, "Set Double Buffering on IN endpoint failed with error code: %d", err); + } + } + } + + err = OpenEndpoints(); + } TInt CBulkOnlyTransportUsbcScLdd::OpenEndpoints() - { - TInt res = iLdd.OpenEndpoint(iSCReadEndpointBuf, iOutEndpoint); - if (res == KErrNone) - { - res = iLdd.OpenEndpoint(iSCWriteEndpointBuf, iInEndpoint); - if (res == KErrNone) - { - iSCWriteEndpointBuf.GetInBufferRange((TAny*&)iDataPtr, iInBufferLength); - res = iControlInterface->OpenEp0(); - } - return res; - } + { + TInt res = iLdd.OpenEndpoint(iSCReadEndpointBuf, iOutEndpoint); + if (res == KErrNone) + { + res = iLdd.OpenEndpoint(iSCWriteEndpointBuf, iInEndpoint); + if (res == KErrNone) + { + iSCWriteEndpointBuf.GetInBufferRange((TAny*&)iDataPtr, iInBufferLength); + res = iControlInterface->OpenEp0(); + } + return res; + } - return res; - } + return res; + } TInt CBulkOnlyTransportUsbcScLdd::GetDeviceStatus(TUsbcDeviceState& deviceStatus) - { - return iLdd.DeviceStatus(deviceStatus); - } + { + return iLdd.DeviceStatus(deviceStatus); + } void CBulkOnlyTransportUsbcScLdd::FlushData() - { - // Intentionally Left Blank Do Nothing - } + { + // Intentionally Left Blank Do Nothing + } /** * Read out rest data from OutEndpoint and discard them */ void CBulkOnlyTransportUsbcScLdd::ReadAndDiscardData(TInt /*aBytes*/) - { - __FNLOG("CBulkOnlyTransport::ReadAndDiscardData"); - TRequestStatus status; - TInt r = KErrNone; // Lets assume there is no data - do - { - iSCReadSize = 0; - status = KErrNone; - r = iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,status); - iSCReadEndpointBuf.Expire(); - } - while (r == KErrCompletion); + { + TRequestStatus status; + TInt r = KErrNone; // Lets assume there is no data + do + { + iSCReadSize = 0; + status = KErrNone; + r = iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,status); + iSCReadEndpointBuf.Expire(); + } + while (r == KErrCompletion); - if (r == KErrNone) - { - TRequestStatus* stat = &status; - User::RequestComplete(stat, KErrNone); - } - } + if (r == KErrNone) + { + TRequestStatus* stat = &status; + User::RequestComplete(stat, KErrNone); + } + } /** Called by the protocol to determine how many bytes of data are available in the read buffer. @@ -654,91 +641,87 @@ @return The number of bytes available in the read buffer */ TInt CBulkOnlyTransportUsbcScLdd::BytesAvailable() - { - // Intentionally Left Blank Do Nothing - return 0; - } + { + // Intentionally Left Blank Do Nothing + return 0; + } void CBulkOnlyTransportUsbcScLdd::StallEndpointAndWaitForClear() - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::StallEndpointAndWaitForClear"); - - // Now stall this endpoint - __PRINT1(_L("Stalling endpoint %d"), iInEndpoint); - TInt r = iLdd.HaltEndpoint(iInEndpoint); - if (r != KErrNone) - { - __PRINT2(_L("Error: stalling ep %d failed: %d"), iInEndpoint, r); - } - TEndpointState ep_state; - TInt i = 0; - do - { - // Wait for 10ms before checking the ep status - User::After(10000); - iLdd.EndpointStatus(iInEndpoint, ep_state); - if (++i >= 550) - { - // 5.5 secs should be enough (see 9.2.6.1 Request Processing Timing) - __PRINT1(_L("Error: Checked for ep %d de-stall for 5.5s - giving up now"), iInEndpoint); - // We can now only hope for a Reset Recovery - return; - } - } while ((ep_state == EEndpointStateStalled) && iStarted); - __PRINT2(_L("Checked for ep %d de-stall: %d time(s)"), iInEndpoint, i); - } + { + // Now stall this endpoint + OstTrace1(TRACE_SMASSSTORAGE_BOT, D1_SC, "Stalling endpoint %d", iInEndpoint); + TInt r = iLdd.HaltEndpoint(iInEndpoint); + if (r != KErrNone) + { + OstTraceExt2(TRACE_SMASSSTORAGE_BOT, D2_SC, "Error: stalling ep %d failed: %d", iInEndpoint, r); + } + TEndpointState ep_state; + TInt i = 0; + do + { + // Wait for 10ms before checking the ep status + User::After(10000); + iLdd.EndpointStatus(iInEndpoint, ep_state); + if (++i >= 550) + { + // 5.5 secs should be enough (see 9.2.6.1 Request Processing Timing) + OstTrace1(TRACE_SMASSSTORAGE_BOT, D3_SC, "Error: Checked for ep %d de-stall for 5.5s - giving up now", iInEndpoint); + // We can now only hope for a Reset Recovery + return; + } + } while ((ep_state == EEndpointStateStalled) && iStarted); + OstTraceExt2(TRACE_SMASSSTORAGE_BOT, D4_SC, "Checked for ep %d de-stall: %d time(s)", iInEndpoint, i); + } /** Read CBW data from the host and decode it. */ void CBulkOnlyTransportUsbcScLdd::ReadCBW() - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::ReadCBW"); - if (IsActive()) - { - __PRINT(_L("Still active\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); - return; - } - TInt r = KErrNone; - do - { - r = ReadUsb(); - if ((r == KErrCompletion) && (iSCReadSize == KCbwLength)) - { - iCurrentState = EWaitForCBW; - iStatus = KErrNone; - DecodeCBW(); - iSCReadSize = 0; - } - else if (r == KErrNone) - { - iCurrentState = EWaitForCBW; - SetActive(); - } - else if ((r == KErrCompletion) && (iSCReadSize != KCbwLength)) - { - ExpireData(iSCReadData); - } - }while ((r == KErrCompletion) && (!IsActive())); - } + { + if (IsActive()) + { + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); + return; + } + TInt r = KErrNone; + do + { + r = ReadUsb(); + if ((r == KErrCompletion) && (iSCReadSize == KCbwLength)) + { + iCurrentState = EWaitForCBW; + iStatus = KErrNone; + DecodeCBW(); + iSCReadSize = 0; + } + else if (r == KErrNone) + { + iCurrentState = EWaitForCBW; + SetActive(); + } + else if ((r == KErrCompletion) && (iSCReadSize != KCbwLength)) + { + ExpireData(iSCReadData); + } + }while ((r == KErrCompletion) && (!IsActive())); + } void CBulkOnlyTransportUsbcScLdd::ExpireData(TAny* aAddress) - { - if (aAddress) - { - iSCReadEndpointBuf.Expire(aAddress); - } - else - { - iSCReadEndpointBuf.Expire(); - } - } + { + if (aAddress) + { + iSCReadEndpointBuf.Expire(aAddress); + } + else + { + iSCReadEndpointBuf.Expire(); + } + } void CBulkOnlyTransportUsbcScLdd::ProcessCbwEvent() - { - ReadCBW(); - } + { + ReadCBW(); + } /** Request data form the host for the protocol @@ -746,201 +729,198 @@ @param aLength amount of data (in bytes) to be received from the host */ void CBulkOnlyTransportUsbcScLdd::ReadData(TUint /*aLength*/) - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::ReadData"); - if (IsActive()) - { - __PRINT(_L("Still active\n")); - __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); - return; - } - TInt r = KErrNone; - do - { - r = ReadUsb(); - iCurrentState = EReadingData; - if (r == KErrCompletion) - { - iReadBufPtr.Set((TUint8*) iSCReadData, iSCReadSize, iSCReadSize); - iStatus = KErrNone; - ProcessDataFromHost(); - iSCReadSize = 0; - } - else if (r == KErrNone) - { - iSCReadSize = 0; - SetActive(); - } + { + if (IsActive()) + { + __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive)); + return; + } + TInt r = KErrNone; + do + { + r = ReadUsb(); + iCurrentState = EReadingData; + if (r == KErrCompletion) + { + iReadBufPtr.Set((TUint8*) iSCReadData, iSCReadSize, iSCReadSize); + iStatus = KErrNone; + ProcessDataFromHost(); + iSCReadSize = 0; + } + else if (r == KErrNone) + { + iSCReadSize = 0; + SetActive(); + } - }while ((r == KErrCompletion) && (!IsActive())); - } + }while ((r == KErrCompletion) && (!IsActive())); + } void CBulkOnlyTransportUsbcScLdd::ProcessDataFromHost() - { - TInt ret = KErrNone; - { - if (iReadSetUp) - { - ret = iProtocol->ReadComplete(KErrNone); - } + { + TInt ret = KErrNone; + { + if (iReadSetUp) + { + ret = iProtocol->ReadComplete(KErrNone); + } #ifndef MSDC_MULTITHREADED - ExpireData(iSCReadData); + ExpireData(iSCReadData); #endif - TUint deviceDataLength = iSCReadSize; // What was written to the disk // static_cast(iReadBuf.Length()); - if(ret == KErrCompletion) - { - // The protocol has indicated with KErrCompletion that sufficient - // data is available in the buffer to process the transfer immediately. + TUint deviceDataLength = iSCReadSize; // What was written to the disk // static_cast(iReadBuf.Length()); + if(ret == KErrCompletion) + { + // The protocol has indicated with KErrCompletion that sufficient + // data is available in the buffer to process the transfer immediately. - //iDataResidue is initially set to host data length as we do not know how much data is there in the 'LDD transfer'. - //After a TakeBuffer call, iSCReadSize in updated and set to deviceDataLength - iDataResidue -= deviceDataLength; - } - else - { - iDataResidue -= deviceDataLength; + //iDataResidue is initially set to host data length as we do not know how much data is there in the 'LDD transfer'. + //After a TakeBuffer call, iSCReadSize in updated and set to deviceDataLength + iDataResidue -= deviceDataLength; + } + else + { + iDataResidue -= deviceDataLength; - // The protocol has indicated that transfer is - // complete, so send the CSW response to the host. - iReadSetUp = EFalse; + // The protocol has indicated that transfer is + // complete, so send the CSW response to the host. + iReadSetUp = EFalse; - if (ret != KErrNone) - { - iCmdStatus = ECommandFailed; - } + if (ret != KErrNone) + { + iCmdStatus = ECommandFailed; + } - if (iDataResidue) - { - __PRINT(_L("Discarding residue")); - // we have to read as much data as available that host PC sends; - // otherwise, bulk-out endpoint will need to keep sending NAK back. - ReadAndDiscardData(iDataResidue); - } + if (iDataResidue) + { + OstTrace0(TRACE_SMASSSTORAGE_BOT, E2_SC, "Discarding residue"); + // we have to read as much data as available that host PC sends; + // otherwise, bulk-out endpoint will need to keep sending NAK back. + ReadAndDiscardData(iDataResidue); + } - SendCSW(iCbwTag, iDataResidue, iCmdStatus); - } - } - } + SendCSW(iCbwTag, iDataResidue, iCmdStatus); + } + } + } void CBulkOnlyTransportUsbcScLdd::WriteUsb(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired) - { - TUint aOffset = (TUint) aDes.Ptr() - (TUint) iChunk->Base(); - iSCWriteEndpointBuf.WriteBuffer(aOffset, aLength, aZlpRequired, aStatus); - } + { + TUint aOffset = (TUint) aDes.Ptr() - (TUint) iChunk->Base(); + iSCWriteEndpointBuf.WriteBuffer(aOffset, aLength, aZlpRequired, aStatus); + } void CBulkOnlyTransportUsbcScLdd::SetCbwPtr() - { - iCbwBufPtr.Set((TUint8*)iSCReadData, iSCReadSize); - } + { + iCbwBufPtr.Set((TUint8*)iSCReadData, iSCReadSize); + } TPtr8& CBulkOnlyTransportUsbcScLdd::SetCommandBufPtr(TUint aLength) - { - TPtr8 writeBuf((TUint8*) iDataPtr, aLength); - iCommandBufPtr.Set(writeBuf); - return iCommandBufPtr; - } + { + TPtr8 writeBuf((TUint8*) iDataPtr, aLength); + iCommandBufPtr.Set(writeBuf); + return iCommandBufPtr; + } void CBulkOnlyTransportUsbcScLdd::SetReadDataBufPtr(TUint /*aLength*/) - { - // Do nothing for now - } + { + // Do nothing for now + } TPtr8& CBulkOnlyTransportUsbcScLdd::SetDataBufPtr() - { - TPtr8 writeBuf((TUint8*) iDataPtr, iInBufferLength); - iDataBufPtr.Set(writeBuf); - return iDataBufPtr; - } + { + TPtr8 writeBuf((TUint8*) iDataPtr, iInBufferLength); + iDataBufPtr.Set(writeBuf); + return iDataBufPtr; + } void CBulkOnlyTransportUsbcScLdd::SetPaddingBufPtr(TUint aLength) - { - TPtr8 writeBuf((TUint8*) iDataPtr, aLength, aLength); - iPaddingBufPtr.Set(writeBuf); - } + { + TPtr8 writeBuf((TUint8*) iDataPtr, aLength, aLength); + iPaddingBufPtr.Set(writeBuf); + } void CBulkOnlyTransportUsbcScLdd::SetCswBufPtr(TUint aLength) - { - TPtr8 writeBuf((TUint8*) iDataPtr, aLength, aLength); - iCswBufPtr.Set(writeBuf); - } + { + TPtr8 writeBuf((TUint8*) iDataPtr, aLength, aLength); + iCswBufPtr.Set(writeBuf); + } void CBulkOnlyTransportUsbcScLdd::ProcessReadingDataEvent() - { - ReadData(); - } + { + ReadData(); + } TInt CBulkOnlyTransportUsbcScLdd::ReadUsb(TUint /*aLength*/) - { - __FNLOG("CBulkOnlyTransportUsbcScLdd::ReadUSB"); - return iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,iStatus); - } + { + return iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,iStatus); + } void CBulkOnlyTransportUsbcScLdd::DiscardData(TUint aLength) - { - TUint c = 0; - TRequestStatus status; - TInt r = KErrNone; - while (c < aLength) - { - iSCReadSize = 0; - status = KErrNone; - r = iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,status); - c += iSCReadSize; - if (r == KErrNone) - User::WaitForRequest(status); - if (r == KErrCompletion) - { - iSCReadEndpointBuf.Expire(); - } - iSCReadSize = 0; - } - } + { + TUint c = 0; + TRequestStatus status; + TInt r = KErrNone; + while (c < aLength) + { + iSCReadSize = 0; + status = KErrNone; + r = iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,status); + c += iSCReadSize; + if (r == KErrNone) + User::WaitForRequest(status); + if (r == KErrCompletion) + { + iSCReadEndpointBuf.Expire(); + } + iSCReadSize = 0; + } + } void CBulkOnlyTransportUsbcScLdd::WriteToClient(TUint aLength) - { - TUint c = 0; - TRequestStatus status; - TInt r = KErrNone; - while (c < aLength) - { - iSCReadSize = 0; - status = KErrNone; - r = iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,status); - c += iSCReadSize; - iProtocol->ReadComplete(KErrGeneral); - if (r == KErrNone) - User::WaitForRequest(status); - if (r == KErrCompletion) - { - iSCReadEndpointBuf.Expire(); - } - iSCReadSize = 0; - } - } + { + TUint c = 0; + TRequestStatus status; + TInt r = KErrNone; + while (c < aLength) + { + iSCReadSize = 0; + status = KErrNone; + r = iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,status); + c += iSCReadSize; + iProtocol->ReadComplete(KErrGeneral); + if (r == KErrNone) + User::WaitForRequest(status); + if (r == KErrCompletion) + { + iSCReadEndpointBuf.Expire(); + } + iSCReadSize = 0; + } + } #ifdef MSDC_MULTITHREADED void CBulkOnlyTransportUsbcScLdd::GetBufferPointers(TPtr8& aDes1, TPtr8& aDes2) - { - //for DB - TUint length = (TUint) (iInBufferLength - KCswBufferSize) / 2; + { + //for DB + TUint length = (TUint) (iInBufferLength - KCswBufferSize) / 2; - TUint8* start = (TUint8*) (iDataPtr) + KCswBufferSize ; // 'first' buffer - aDes1.Set(start, length, length); + TUint8* start = (TUint8*) (iDataPtr) + KCswBufferSize ; // 'first' buffer + aDes1.Set(start, length, length); - start = (TUint8*) (iDataPtr) + KCswBufferSize + length; // 'second' buffer - aDes2.Set(start, length, length); - } + start = (TUint8*) (iDataPtr) + KCswBufferSize + length; // 'second' buffer + aDes2.Set(start, length, length); + } #endif void CBulkOnlyTransportUsbcScLdd::Activate(TRequestStatus& aStatus, TUint& aDeviceState) { - iLdd.AlternateDeviceStatusNotify(aStatus, aDeviceState); + iLdd.AlternateDeviceStatusNotify(aStatus, aDeviceState); } void CBulkOnlyTransportUsbcScLdd::Cancel() { - iLdd.AlternateDeviceStatusNotifyCancel(); + iLdd.AlternateDeviceStatusNotifyCancel(); } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/cmassstoragefilesystem.cpp --- a/userlibandfileserver/fileserver/smassstorage/cmassstoragefilesystem.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/cmassstoragefilesystem.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -12,7 +12,7 @@ // // Description: // CMassStorageFileSystem implementation. -// +// // /** @@ -22,51 +22,57 @@ #include #include +#include "drivemanager.h" #include "cusbmassstoragecontroller.h" #include "cmassstoragefilesystem.h" #include "cmassstoragemountcb.h" -#include "massstoragedebug.h" #include "massstorage.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cmassstoragefilesystemTraces.h" +#endif + + _LIT(KMsFsyName, "MassStorageFileSystem"); _LIT(KMsThreadName, "MassStorageThread"); _LIT(KMsDeadThreadName, "MassStorageDeadThread"); _LIT(KMsFsysSemName, "MassStorageSemaphore"); -LOCAL_D const TInt KMsFsyMajorVersionNumber=1; -LOCAL_D const TInt KMsFsyMinorVersionNumber=0; +static const TInt KMsFsyMajorVersionNumber=1; +static const TInt KMsFsyMinorVersionNumber=0; CMassStorageFileSystem::CMassStorageFileSystem() - { - } + { + } CMassStorageFileSystem::~CMassStorageFileSystem() - { - //Kill the controller thread if it exists - delete iMassStorageController; - delete iMediaChanged; - RThread thread; - TInt err = thread.Open(KMsThreadName); - if (err == KErrNone) - { - thread.Kill(1); //Parameter is irrelevant - } - thread.Close(); - iMsDrives.Close(); - } + { + //Kill the controller thread if it exists + delete iMassStorageController; + delete iMediaChanged; + RThread thread; + TInt err = thread.Open(KMsThreadName); + if (err == KErrNone) + { + thread.Kill(1); //Parameter is irrelevant + } + thread.Close(); + iMsDrives.Close(); + } CMassStorageFileSystem* CMassStorageFileSystem::NewL() - { - CMassStorageFileSystem* self = new (ELeave) CMassStorageFileSystem(); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(self); - return self; - } - + { + CMassStorageFileSystem* self = new (ELeave) CMassStorageFileSystem(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + void CMassStorageFileSystem::ConstructL() - { - iMediaChanged = new(ELeave) CArrayFixFlat(KMaxDrives); - } + { + iMediaChanged = new(ELeave) CArrayFixFlat(KMaxDrives); + } /** Set the file system version and name @@ -74,47 +80,47 @@ @return Any of the standard Symbian error codes. */ TInt CMassStorageFileSystem::Install() - { - __PRINT(_L("CMassStorageFileSystem::Install In\n")); - iVersion=TVersion(KMsFsyMajorVersionNumber, KMsFsyMinorVersionNumber, KF32BuildVersionNumber); - TInt err = SetName(&KMsFsyName); - __PRINT(_L("CMassStorageFileSystem::Install Out\n")); - return err; - } + { + OstTraceFunctionEntry0(CMASSSTORAGEFILESYSTEM_100); + iVersion=TVersion(KMsFsyMajorVersionNumber, KMsFsyMinorVersionNumber, KF32BuildVersionNumber); + TInt err = SetName(&KMsFsyName); + return err; + } TInt CMassStorageFileSystem::Remove() - { - __PRINT(_L("CMassStorageFileSystem::Remove In\n")); - TInt err = KErrNone; - if (iInstalled) - { - // Try connecting to the server to send a shutdown message. - // - If the class controller has a session in use, this will return KErrInUse - RUsbMassStorage usbMs; - err = usbMs.Connect(); - if(err == KErrNone) - { - err = usbMs.Shutdown(); - usbMs.Close(); + { + OstTraceFunctionEntry0(CMASSSTORAGEFILESYSTEM_101); + TInt err = KErrNone; + if (iInstalled) + { + // Try connecting to the server to send a shutdown message. + // - If the class controller has a session in use, this will return KErrInUse + RUsbMassStorage usbMs; + err = usbMs.Connect(); + if(err == KErrNone) + { + err = usbMs.Shutdown(); + usbMs.Close(); - if(err == KErrNone) - { - User::WaitForRequest(iThreadStat); - err = iThreadStat.Int(); - } - else - { - __PRINT1(_L("CMassStorageFileSystem::Remove Shutdown Error %d\n"),err); - } - } - else - { - __PRINT1(_L("CMassStorageFileSystem::Remove Connect Error %d\n"),err); - } - } - __PRINT(_L("CMassStorageFileSystem::Remove Out\n")); - return(err); - } + if(err == KErrNone) + { + User::WaitForRequest(iThreadStat); + err = iThreadStat.Int(); + } + else + { + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_102, + "Shutdown Error %d", err); + } + } + else + { + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_103, + "Connect Error %d", err); + } + } + return(err); + } /** Creates a new Mass Storage mount object. @@ -123,13 +129,13 @@ @leave KErrNotReady if the Mass Storage controller is not running. */ CMountCB* CMassStorageFileSystem::NewMountL() const - { - if (!iRunning) - { - User::Leave(KErrNotReady); - } - return CMassStorageMountCB::NewL(iMsDrives); - } + { + if (!iRunning) + { + User::Leave(KErrNotReady); + } + return CMassStorageMountCB::NewL(iMsDrives); + } /** Sets the media attributes and type in the aInfo parameter to those of the specified drive. @@ -138,20 +144,19 @@ @param aDriveNumber The number of the drive to get the information from. */ void CMassStorageFileSystem::DriveInfo(TDriveInfo& aInfo, TInt aDriveNumber) const - { - __PRINT(_L("CMassStorageFileSystem::DriveInfo In\n")); - TLocalDriveCapsV2Buf caps; - if (!IsValidLocalDriveMapping(aDriveNumber)) - { - return; - } - (void)GetLocalDrive(aDriveNumber).Caps(caps); + { + OstTraceFunctionEntry0(CMASSSTORAGEFILESYSTEM_104); + TLocalDriveCapsV2Buf caps; + if (!IsValidLocalDriveMapping(aDriveNumber)) + { + return; + } + (void)GetLocalDrive(aDriveNumber).Caps(caps); // error ignored as Caps always returns valid Media and Drive attributes - aInfo.iMediaAtt=caps().iMediaAtt; + aInfo.iMediaAtt=caps().iMediaAtt; aInfo.iType = ::EMediaNotPresent; // Media is not available to the file system - aInfo.iDriveAtt=caps().iDriveAtt; - __PRINT(_L("CMassStorageFileSystem::DriveInfo Out\n")); - } + aInfo.iDriveAtt=caps().iDriveAtt; + } /** Returns a reference to the Mass Storage controller. @@ -159,65 +164,66 @@ @return Reference to the Mass Storage controller. */ CUsbMassStorageController& CMassStorageFileSystem::Controller() - { - return *iMassStorageController; - } + { + return *iMassStorageController; + } /** Fill iMsDrives with a mapping of lun->drive number for supported mass storage drives */ TInt CMassStorageFileSystem::EnumerateMsDrivesL() - { - __PRINT(_L("CMassStorageFileSystem::EnumerateMsDrives In\n")); - iMsDrives.Reset(); - TInt driveCount = 0; + { + OstTraceFunctionEntry0(CMASSSTORAGEFILESYSTEM_105); + iMsDrives.Reset(); + TInt driveCount = 0; + + TLocalDriveCapsV2Buf caps; + for (TInt i = EDriveC; i < KMaxDrives; i++) + { + caps.FillZ(); + + if (IsValidLocalDriveMapping(i)) + { + TInt err = GetLocalDrive(i).Caps(caps); + TInt locDrvNum = DriveNumberToLocalDriveNumber(i); + OstTraceExt2(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_106, + "Caps: err=%d, att=%d", err, caps().iDriveAtt); + + TBool isRemovable = err==KErrNotReady || (caps().iDriveAtt & KDriveAttRemovable); + OstTraceExt2(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_107, + "EnumerateMsDrives: Drive %c: removable %d", 'A'+i-EDriveA, isRemovable); - TLocalDriveCapsV2Buf caps; - for (TInt i = EDriveC; i < KMaxDrives; i++) - { - caps.FillZ(); - - if (IsValidLocalDriveMapping(i)) - { - TInt err = GetLocalDrive(i).Caps(caps); - TInt locDrvNum = DriveNumberToLocalDriveNumber(i); - __PRINT2(_L("Caps: err=%d, att=%d\n"), err, caps().iDriveAtt); - - TBool isRemovable = err==KErrNotReady || (caps().iDriveAtt & KDriveAttRemovable); - __PRINT2(_L("EnumerateMsDrives: Drive %c: is %sremovable\n"), - 'A'+i-EDriveA, - isRemovable?_S(""):_S("NOT ")); - - if (isRemovable) - { - // - // STF: Connect to the local drive here. This gives us the media changed flag, and - // our own TBusLocalDrive object for use by the proxy drive and controller. - // - TBool& mediaChanged = (*iMediaChanged).ExtendL(); - mediaChanged = EFalse; - TBusLocalDrive* localDrive = new(ELeave) TBusLocalDrive; - iLocalDriveForMediaFlag.Append(*localDrive); - - TInt err=iLocalDriveForMediaFlag[driveCount].Connect(locDrvNum, mediaChanged); - if(err == KErrNone) - { - iMsDrives.Append(i); - } - driveCount++; - } - } - } + if (isRemovable) + { + // + // STF: Connect to the local drive here. This gives us the media changed flag, and + // our own TBusLocalDrive object for use by the proxy drive and controller. + // + TBool& mediaChanged = (*iMediaChanged).ExtendL(); + mediaChanged = EFalse; + TBusLocalDrive* localDrive = new(ELeave) TBusLocalDrive; + iLocalDriveForMediaFlag.Append(*localDrive); - __PRINT1(_L("CMassStorageFileSystem::EnumerateMsDrives Out, %d MS drives found\n"), driveCount); - return driveCount; - } + TInt err=iLocalDriveForMediaFlag[driveCount].Connect(locDrvNum, mediaChanged); + if(err == KErrNone) + { + iMsDrives.Append(i); + } + driveCount++; + } + } + } + + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_108, + "%d MS drives found", driveCount); + return driveCount; + } TBool CMassStorageFileSystem::IsExtensionSupported() const - { - return ETrue; - } + { + return ETrue; + } /** Creates a TrapCleanup and ActiveScheduler and initializes the Mass Storage controller. @@ -226,103 +232,104 @@ @return Any of the standard Symbian error codes. */ TInt CMassStorageFileSystem::InitThread() - { - __PRINT(_L("CMassStorageFileSystem::InitThread In\n")); - - //Give the thread a name so we can kill it later - User::RenameThread(KMsThreadName); - - CTrapCleanup* cleanup = CTrapCleanup::New(); - if (cleanup == NULL) - { - return KErrNoMemory; - } + { + OstTraceFunctionEntry0(CMASSSTORAGEFILESYSTEM_109); + + //Give the thread a name so we can kill it later + User::RenameThread(KMsThreadName); - TRAPD(err, InitThreadL()); - - delete cleanup; - - __PRINT1(_L("CMassStorageFileSystem::InitThread Out, error=%d\n"), err); - return err; - } + CTrapCleanup* cleanup = CTrapCleanup::New(); + if (cleanup == NULL) + { + return KErrNoMemory; + } + + TRAPD(err, InitThreadL()); + + delete cleanup; + + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_110, + "error=%d", err); + return err; + } TInt CMassStorageFileSystem::InitThreadL() - { - __PRINT(_L("CMassStorageFileSystem::InitThreadL In\n")); - - RSemaphore gSemThreadReady; + { + OstTraceFunctionEntry0(CMASSSTORAGEFILESYSTEM_111); - TInt ret = gSemThreadReady.OpenGlobal(KMsFsysSemName); + RSemaphore gSemThreadReady; + + TInt ret = gSemThreadReady.OpenGlobal(KMsFsysSemName); - if (ret != KErrNone && ret != KErrAlreadyExists) - { - User::Leave(ret); - } + if (ret != KErrNone && ret != KErrAlreadyExists) + { + User::Leave(ret); + } - // Determine which drives are available for Mass Storage. - // (this also creates a local TBusLocalDrive for use by the drive controller) - EnumerateMsDrivesL(); + // Determine which drives are available for Mass Storage. + // (this also creates a local TBusLocalDrive for use by the drive controller) + EnumerateMsDrivesL(); - CActiveScheduler* sched = new CActiveScheduler; - if (sched == NULL) - { - gSemThreadReady.Signal(); - User::Leave(KErrNoMemory); - } - CleanupStack::PushL(sched); - CActiveScheduler::Install(sched); + CActiveScheduler* sched = new CActiveScheduler; + if (sched == NULL) + { + gSemThreadReady.Signal(); + User::Leave(KErrNoMemory); + } + CleanupStack::PushL(sched); + CActiveScheduler::Install(sched); + + iMassStorageController = new CUsbMassStorageController; + if (iMassStorageController == NULL) + { + gSemThreadReady.Signal(); + User::Leave(KErrNoMemory); + } - iMassStorageController = new CUsbMassStorageController; - if (iMassStorageController == NULL) - { - gSemThreadReady.Signal(); - User::Leave(KErrNoMemory); - } - - __PRINT(_L("CMassStorageFileSystem::InitThread: Creating Mass Storage Controller\n")); - TRAPD(err, iMassStorageController->CreateL(iMsDrives)); - if (err != KErrNone) - { - gSemThreadReady.Signal(); - CActiveScheduler::Install(NULL); - User::Leave(err); - } - - CleanupStack::Pop(sched); + OstTrace0(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_112, + "Creating Mass Storage Controller"); + TRAPD(err, iMassStorageController->CreateL(iMsDrives)); + if (err != KErrNone) + { + gSemThreadReady.Signal(); + CActiveScheduler::Install(NULL); + User::Leave(err); + } - iRunning = ETrue; - gSemThreadReady.Signal(); - gSemThreadReady.Close(); - CActiveScheduler::Start(); + CleanupStack::Pop(sched); + + iRunning = ETrue; + gSemThreadReady.Signal(); + gSemThreadReady.Close(); + CActiveScheduler::Start(); //========= stop thread ================ - delete iMassStorageController; - iMassStorageController = NULL; - TInt i=0; - for (;iInitThread(); - //Rename the thread so we can create a new one with the same original name later - User::RenameThread(KMsDeadThreadName); - return KErrNone; - } +static TInt MsInitThreadFn(TAny* aPtr) + { + User::SetCritical(User::ESystemCritical); + ((CMassStorageFileSystem*)aPtr)->InitThread(); + //Rename the thread so we can create a new one with the same original name later + User::RenameThread(KMsDeadThreadName); + return KErrNone; + } /** Standard entry point for file systems. Creates a new file system object and starts a new thread for the Mass Storage controller. */ extern "C" EXPORT_C CFileSystem* CreateFileSystem() - { - __PRINT(_L("CMassStorageFileSystem::CreateFileSystem In\n")); - RSemaphore gSemThreadReady; - TInt err = gSemThreadReady.CreateGlobal(KMsFsysSemName, 0); - if (err != KErrNone) - { - __PRINT1(_L("CMassStorageFileSystem::CreateFileSystem Out Semaphore Error %d\n"),err); - return NULL; - } + { + OstTraceFunctionEntry0(CMASSSTORAGEFILESYSTEM_115); + RSemaphore gSemThreadReady; + TInt err = gSemThreadReady.CreateGlobal(KMsFsysSemName, 0); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_116, + "Semaphore CreateGlobal Error %d", err); + return NULL; + } - CFileSystem* msFsys = NULL; - TRAP(err, msFsys = CMassStorageFileSystem::NewL()); - if (err != KErrNone) - { - __PRINT1(_L("CMassStorageFileSystem::CreateFileSystem Out MSFS Error %d\n"),err); - gSemThreadReady.Close(); - return NULL; - } + CFileSystem* msFsys = NULL; + TRAP(err, msFsys = CMassStorageFileSystem::NewL()); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_117, + "MSFS Error %d",err); + gSemThreadReady.Close(); + return NULL; + } - RThread msThread; - __PRINT(_L("CMassStorageFileSystem::CreateFileSystem: Creating Mass Storage thread\n")); - err = msThread.Create(KMsThreadName, MsInitThreadFn, KDefaultStackSize, NULL, msFsys); - if (err != KErrNone) - { - __PRINT1(_L("CMassStorageFileSystem::CreateFileSystem Out Thread Error %d\n"),err); - gSemThreadReady.Close(); - return msFsys; - } - ((CMassStorageFileSystem*)msFsys)->iInstalled=ETrue; + RThread msThread; + OstTrace0(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_118, + "Creating Mass Storage thread..."); + err = msThread.Create(KMsThreadName, MsInitThreadFn, KDefaultStackSize, NULL, msFsys); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEFILESYSTEM_119, + "Thread Error %d", err); + gSemThreadReady.Close(); + return msFsys; + } + ((CMassStorageFileSystem*)msFsys)->iInstalled=ETrue; - msThread.Logon(((CMassStorageFileSystem*)msFsys)->iThreadStat); - msThread.Resume(); - gSemThreadReady.Wait(); - gSemThreadReady.Close(); - msThread.Close(); - - __PRINT(_L("CMassStorageFileSystem::CreateFileSystem Out Clean\n")); - - return msFsys; - } + msThread.Logon(((CMassStorageFileSystem*)msFsys)->iThreadStat); + msThread.Resume(); + gSemThreadReady.Wait(); + gSemThreadReady.Close(); + msThread.Close(); + return msFsys; + } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/cmassstoragemountcb.cpp --- a/userlibandfileserver/fileserver/smassstorage/cmassstoragemountcb.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/cmassstoragemountcb.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -12,7 +12,7 @@ // // Description: // CMassStorageMountCB implementation. -// +// // /** @@ -22,20 +22,27 @@ #include #include -#include "cmassstoragemountcb.h" + +#include "drivemanager.h" #include "cusbmassstoragecontroller.h" #include "cmassstoragefilesystem.h" -#include "massstoragedebug.h" +#include "cmassstoragemountcb.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cmassstoragemountcbTraces.h" +#endif + CMassStorageMountCB::CMassStorageMountCB(const RArray& aDriveMapping) : iDriveMapping(aDriveMapping) - { - } + { + } CMassStorageMountCB* CMassStorageMountCB::NewL(const RArray& aDriveMapping) - { - return new (ELeave) CMassStorageMountCB(aDriveMapping); - } + { + return new (ELeave) CMassStorageMountCB(aDriveMapping); + } /** Checks that the drive number is supported. @@ -43,18 +50,19 @@ @leave KErrNotReady The drive number is not supported. */ TInt CMassStorageMountCB::CheckDriveNumberL() - { - __FNLOG("CMassStorageMountCB::CheckDriveNumberL"); - TInt driveNumber; - driveNumber = Drive().DriveNumber(); - if (!IsValidLocalDriveMapping(driveNumber)) - { - __PRINT1(_L("CMassStorageMountCB::CheckDriveNumberL: Drive number %d not supported"), driveNumber); - User::Leave(KErrNotReady); - } - __PRINT1(_L("CMassStorageMountCB::CheckDriveNumberL: Drive number = %d"), driveNumber); - return driveNumber; - } + { + TInt driveNumber; + driveNumber = Drive().DriveNumber(); + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEMOUNTCB_100, + "Drive=%d", driveNumber); + if (!IsValidLocalDriveMapping(driveNumber)) + { + OstTrace0(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEMOUNTCB_101, + "Drive number not supported"); + User::Leave(KErrNotReady); + } + return driveNumber; + } /** Registers the drive with the Mass Storage drive manager. @@ -62,57 +70,57 @@ @leave KErrNotSupported The drive is not compatible with Mass Storage. */ void CMassStorageMountCB::MountL(TBool /*aForceMount*/) - { - __FNLOG("CMassStorageMountCB::MountL"); + { + CheckDriveNumberL(); + CMassStorageFileSystem& msFsys = *reinterpret_cast(Drive().GetFSys()); - CheckDriveNumberL(); - CMassStorageFileSystem& msFsys = *reinterpret_cast(Drive().GetFSys()); + TInt lun = DriveNumberToLun(Drive().DriveNumber()); - TInt lun = DriveNumberToLun(Drive().DriveNumber()); + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEMOUNTCB_120, + "LUN=%d", lun); - if(lun < 0) - { - // This is not a supported Mass Storage drive - User::Leave(KErrNotSupported); - } + if(lun < 0) + { + // This is not a supported Mass Storage drive + User::Leave(KErrNotSupported); + } - TBusLocalDrive& localDrive = msFsys.iLocalDriveForMediaFlag[lun]; + TBusLocalDrive& localDrive = msFsys.iLocalDriveForMediaFlag[lun]; - TInt err = CreateLocalDrive(localDrive); - User::LeaveIfError(err); + TInt err = CreateLocalDrive(localDrive); + User::LeaveIfError(err); - CProxyDrive* proxyDrive = LocalDrive(); + CProxyDrive* proxyDrive = LocalDrive(); - TLocalDriveCapsV2Buf caps; - err = localDrive.Caps(caps); - //Make sure file system is FAT and removable - if (err == KErrNone) - { - err = KErrNotSupported; - if ((caps().iDriveAtt & KDriveAttRemovable) == KDriveAttRemovable) - { - if (caps().iType != EMediaNotPresent) - { - err = KErrNone; - } - } - } + TLocalDriveCapsV2Buf caps; + err = localDrive.Caps(caps); + //Make sure file system is FAT and removable + if (err == KErrNone) + { + err = KErrNotSupported; + if ((caps().iDriveAtt & KDriveAttRemovable) == KDriveAttRemovable) + { + if (caps().iType != EMediaNotPresent) + { + err = KErrNone; + } + } + } - if (err != KErrNone && err != KErrNotReady) - { - __PRINT1(_L("CMassStorageMountCB::MountL: Drive is not compatible with Mass Storage, err=%d"), err); - User::Leave(err); - } - - __PRINT(_L("CMassStorageMountCB::MountL: Registering drive")); + if (err != KErrNone && err != KErrNotReady) + { + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEMOUNTCB_121, + "Drive is not compatible with Mass Storage err=%d", err); + User::Leave(err); + } - // Set media changed to true so that Win2K doesn't used cached drive data - (*msFsys.iMediaChanged)[lun] = ETrue; + // Set media changed to true so that Win2K doesn't used cached drive data + (*msFsys.iMediaChanged)[lun] = ETrue; - msFsys.Controller().DriveManager().RegisterDrive(*proxyDrive, (*msFsys.iMediaChanged)[lun], lun); + msFsys.Controller().DriveManager().RegisterDrive(*proxyDrive, (*msFsys.iMediaChanged)[lun], lun); - SetVolumeName(_L("MassStorage").AllocL()); - } + SetVolumeName(_L("MassStorage").AllocL()); + } /** Returns the LUN that corresponds to the specified drive number. @@ -120,39 +128,39 @@ @param aDriveNumber The drive number. */ TInt CMassStorageMountCB::DriveNumberToLun(TInt aDriveNumber) - { - __FNLOG("CMassStorageMountCB::DriveNumberToLun"); - TInt lun = -1; - for (TInt i = 0; i < iDriveMapping.Count(); i++) - { - if (iDriveMapping[i] == aDriveNumber) - { - lun = i; - break; - } - } - __PRINT2(_L("CMassStorageMountCB::DriveNumberToLun: Drive %d maps to LUN %d"), aDriveNumber, lun); - return lun; - } + { + TInt lun = -1; + for (TInt i = 0; i < iDriveMapping.Count(); i++) + { + if (iDriveMapping[i] == aDriveNumber) + { + lun = i; + break; + } + } + OstTraceExt2(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEMOUNTCB_130, + "Drive %d maps to LUN %d", aDriveNumber, lun); + return lun; + } /** Deregisters the drive from the Drive Manager. */ void CMassStorageMountCB::Dismounted() - { - __FNLOG("CMassStorageMountCB::Dismounted"); - TInt driveNumber = -1; - TRAPD(err, driveNumber = CheckDriveNumberL()); - if (err != KErrNone) - { - return; - } - __PRINT(_L("CMassStorageMountCB::Dismounted: Deregistering drive")); + { + TInt driveNumber = -1; + TRAPD(err, driveNumber = CheckDriveNumberL()); + if (err != KErrNone) + { + return; + } + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEMOUNTCB_140, + "Dismounted drive %d", driveNumber); CMassStorageFileSystem& msFsys = *reinterpret_cast(Drive().GetFSys()); - msFsys.Controller().DriveManager().DeregisterDrive(DriveNumberToLun(driveNumber)); - - DismountedLocalDrive(); - } + msFsys.Controller().DriveManager().DeregisterDrive(DriveNumberToLun(driveNumber)); + + DismountedLocalDrive(); + } /** Unlocks the drive with the specified password, optionally storing the password for later use. @@ -161,158 +169,160 @@ @param aStore True if the password is to be stored. */ TInt CMassStorageMountCB::Unlock(TMediaPassword& aPassword, TBool aStore) - { - __FNLOG("CMassStorageMountCB::Unlock"); - TInt driveNumber = -1; - TRAPD(err, driveNumber = CheckDriveNumberL()); - if (err != KErrNone) - { - return err; - } - TBusLocalDrive& localDrive=GetLocalDrive(driveNumber); - if(localDrive.Status() == KErrLocked) - { - localDrive.Status() = KErrNotReady; - } - TInt r = localDrive.Unlock(aPassword, aStore); - if(r == KErrNone && aStore) - { - WritePasswordData(); - } - return(r); - } + { + TInt driveNumber = -1; + TRAPD(err, driveNumber = CheckDriveNumberL()); + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEMOUNTCB_150, + "Unlock drive %d", driveNumber); + if (err != KErrNone) + { + return err; + } + TBusLocalDrive& localDrive=GetLocalDrive(driveNumber); + if(localDrive.Status() == KErrLocked) + { + localDrive.Status() = KErrNotReady; + } + TInt r = localDrive.Unlock(aPassword, aStore); + if(r == KErrNone && aStore) + { + WritePasswordData(); + } + return(r); + } /** Stores the password for the drive to the password file. */ void CMassStorageMountCB::WritePasswordData() - { - __FNLOG("CMassStorageMountCB::WritePasswordData"); - TBusLocalDrive& local=GetLocalDrive(Drive().DriveNumber()); - TInt length = local.PasswordStoreLengthInBytes(); - if(length==0) - { - TBuf mediaPWrdFile(KMediaPWrdFile); - mediaPWrdFile[0] = (TUint8) RFs::GetSystemDriveChar(); - WriteToDisk(mediaPWrdFile,_L8("")); - return; - } - HBufC8* hDes=HBufC8::New(length); - if(hDes==NULL) - { - return; - } - TPtr8 pDes=hDes->Des(); - TInt r=local.ReadPasswordData(pDes); - if(r==KErrNone) - { - TBuf mediaPWrdFile(KMediaPWrdFile); - mediaPWrdFile[0] = (TUint8) RFs::GetSystemDriveChar(); - WriteToDisk(mediaPWrdFile,pDes); - } - delete hDes; - } + { + TBusLocalDrive& local=GetLocalDrive(Drive().DriveNumber()); + OstTrace1(TRACE_SMASSSTORAGE_FS, CMASSSTORAGEMOUNTCB_160, + "WritePasswordData drive %d", DriveNumber()); + TInt length = local.PasswordStoreLengthInBytes(); + if(length==0) + { + TBuf mediaPWrdFile(KMediaPWrdFile); + mediaPWrdFile[0] = (TUint8) RFs::GetSystemDriveChar(); + WriteToDisk(mediaPWrdFile,_L8("")); + return; + } + HBufC8* hDes=HBufC8::New(length); + if(hDes==NULL) + { + return; + } + TPtr8 pDes=hDes->Des(); + TInt r=local.ReadPasswordData(pDes); + if(r==KErrNone) + { + TBuf mediaPWrdFile(KMediaPWrdFile); + mediaPWrdFile[0] = (TUint8) RFs::GetSystemDriveChar(); + WriteToDisk(mediaPWrdFile,pDes); + } + delete hDes; + } TInt CMassStorageMountCB::ReMount() - { - return KErrNotReady; - } + { + return KErrNotReady; + } void CMassStorageMountCB::VolumeL(TVolumeInfo& /*aVolume*/) const - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::SetVolumeL(TDes& /*aName*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::MkDirL(const TDesC& /*aName*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::RmDirL(const TDesC& /*aName*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::DeleteL(const TDesC& /*aName*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::RenameL(const TDesC& /*anOldName*/,const TDesC& /*anNewName*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::ReplaceL(const TDesC& /*anOldName*/,const TDesC& /*anNewName*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::EntryL(const TDesC& /*aName*/,TEntry& /*anEntry*/) const - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::SetEntryL(const TDesC& /*aName*/,const TTime& /*aTime*/,TUint /*aSetAttMask*/,TUint /*aClearAttMask*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::FileOpenL(const TDesC& /*aName*/,TUint /*aMode*/,TFileOpen /*anOpen*/,CFileCB* /*aFile*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::DirOpenL(const TDesC& /*aName*/,CDirCB* /*aDir*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::RawReadL(TInt64 /*aPos*/,TInt /*aLength*/,const TAny* /*aTrg*/,TInt /*anOffset*/,const RMessagePtr2& /*aMessage*/) const - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::RawWriteL(TInt64 /*aPos*/,TInt /*aLength*/,const TAny* /*aSrc*/,TInt /*anOffset*/,const RMessagePtr2& /*aMessage*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::GetShortNameL(const TDesC& /*aLongName*/,TDes& /*aShortName*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } void CMassStorageMountCB::GetLongNameL(const TDesC& /*aShorName*/,TDes& /*aLongName*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } #if defined(_DEBUG) TInt CMassStorageMountCB::ControlIO(const RMessagePtr2& aMessage,TInt aCommand,TAny* aParam1,TAny* aParam2) // // Debug function // - { - if(aCommand>=(KMaxTInt/2)) - return LocalDrive()->ControlIO(aMessage,aCommand-(KMaxTInt/2),aParam1,aParam2); - else - return KErrNotSupported; - } + { + if(aCommand>=(KMaxTInt/2)) + return LocalDrive()->ControlIO(aMessage,aCommand-(KMaxTInt/2),aParam1,aParam2); + else + return KErrNotSupported; + } #else TInt CMassStorageMountCB::ControlIO(const RMessagePtr2& /*aMessage*/,TInt /*aCommand*/,TAny* /*aParam1*/,TAny* /*aParam2*/) - {return(KErrNotSupported);} + {return(KErrNotSupported);} #endif void CMassStorageMountCB::ReadSectionL(const TDesC& /*aName*/,TInt /*aPos*/,TAny* /*aTrg*/,TInt /*aLength*/,const RMessagePtr2& /*aMessage*/) - { - User::Leave(KErrNotReady); - } + { + User::Leave(KErrNotReady); + } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/cusbmassstoragecontroller.cpp --- a/userlibandfileserver/fileserver/smassstorage/cusbmassstoragecontroller.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/cusbmassstoragecontroller.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -12,7 +12,7 @@ // // Description: // CUsbMassStorageController implementation. -// +// // /** @@ -20,21 +20,31 @@ @internalTechnology */ +#include +#include "mtransport.h" +#include "mprotocol.h" + +#include "scsiprot.h" +#include "cusbmassstorageserver.h" +#include "drivemanager.h" #include "cusbmassstoragecontroller.h" -#include "massstoragedebug.h" -#include "scsiprot.h" #include "cbulkonlytransport.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cusbmassstoragecontrollerTraces.h" +#endif + /** Destructor */ CUsbMassStorageController::~CUsbMassStorageController() - { - delete iServer; - delete iProtocol; - delete iTransport; - delete iDriveManager; - } + { + delete iServer; + delete iProtocol; + delete iTransport; + delete iDriveManager; + } /** Creates the drive manager, transport, protocol and server @@ -42,32 +52,31 @@ @param aMaxDrives Maximum number of Mass Storage drives supported. */ void CUsbMassStorageController::CreateL(RArray& aDriveMapping) - { - __PRINT(_L("CUsbMassStorageController::CreateL In")); + { + OstTraceFunctionEntry0(CUSBMASSSTORAGECONTROLLER_100); #if !defined(__WINS__) && !defined(__X86__) - iTransportLddFlag = EUsbcsc; // Create transport object using SC Ldd By default + iTransportLddFlag = EUsbcsc; // Create transport object using SC Ldd By default #else - iTransportLddFlag = EUsbc; + iTransportLddFlag = EUsbc; #endif - //Save this value for use in the Reset method. - iMaxDrives = aDriveMapping.Count(); - //Create and init drive manager - iDriveManager = CDriveManager::NewL(aDriveMapping); + //Save this value for use in the Reset method. + iMaxDrives = aDriveMapping.Count(); + OstTrace1(TRACE_SMASSSTORAGE_FS, CUSBMASSSTORAGECONTROLLER_101, + "MaxDrives = %d", iMaxDrives); + //Create and init drive manager + iDriveManager = CDriveManager::NewL(aDriveMapping); - //Create transport and protocol and initialize them - __PRINT(_L("CUsbMassStorageController::CreateL: Creating transport and protocol")); - iTransport = CBulkOnlyTransport::NewL(iMaxDrives, *this, iTransportLddFlag); - if (!iTransport) - User::Leave(KErrNoMemory); + //Create transport and protocol and initialize them + iTransport = CBulkOnlyTransport::NewL(iMaxDrives, *this, iTransportLddFlag); + if (!iTransport) + User::Leave(KErrNoMemory); - iProtocol = CScsiProtocol::NewL(*iDriveManager); + iProtocol = CScsiProtocol::NewL(*iDriveManager); - //Create and start server - __PRINT(_L("CUsbMassStorageController::CreateL: Creating server")); - iServer = CUsbMassStorageServer::NewLC(*this); - CleanupStack::Pop(iServer); - __PRINT(_L("CUsbMassStorageController::CreateL Out")); - } + //Create and start server + iServer = CUsbMassStorageServer::NewLC(*this); + CleanupStack::Pop(iServer); + } /** Returns a reference to the drive manager @@ -75,15 +84,15 @@ @return A reference to the drive manager */ CDriveManager& CUsbMassStorageController::DriveManager() - { - return *iDriveManager; - } + { + return *iDriveManager; + } void CUsbMassStorageController::GetTransport(MTransportBase* &aTransport) - { - aTransport = iTransport; - } + { + aTransport = iTransport; + } /** Starts the transport and initializes the protocol. @@ -91,78 +100,69 @@ @param aConfig Reference to Mass Storage configuration data */ TInt CUsbMassStorageController::Start(TMassStorageConfig& aConfig) - { - __PRINT(_L("CUsbMassStorageController::Start In")); - //Save this value for use in the Reset method. - iConfig = aConfig; + { + OstTraceFunctionEntry0(CUSBMASSSTORAGECONTROLLER_200); + //Save this value for use in the Reset method. + iConfig = aConfig; __ASSERT_DEBUG(iTransport, User::Invariant()); - if ((iTransport->InitialiseTransportL((TInt) iTransportLddFlag)) != KErrNone) - { - iTransportLddFlag = EUsbc; // If SC Ldd not present use the default USB Client Ldd - delete iTransport; - iTransport = CBulkOnlyTransport::NewL(iMaxDrives, *this, iTransportLddFlag); - if (!iTransport) - User::Leave(KErrNoMemory); - if ((iTransport->InitialiseTransportL((TInt) iTransportLddFlag)) != KErrNone) - return KErrNotFound; - } - - TInt err = KErrNotReady; + if ((iTransport->InitialiseTransportL((TInt) iTransportLddFlag)) != KErrNone) + { + iTransportLddFlag = EUsbc; // If SC Ldd not present use the default USB Client Ldd + delete iTransport; + iTransport = CBulkOnlyTransport::NewL(iMaxDrives, *this, iTransportLddFlag); + if (!iTransport) + User::Leave(KErrNoMemory); + if ((iTransport->InitialiseTransportL((TInt) iTransportLddFlag)) != KErrNone) + return KErrNotFound; + } - if (iProtocol && iTransport) - { - iTransport->RegisterProtocol(*iProtocol); - iProtocol->RegisterTransport(iTransport); - __PRINT(_L("CUsbMassStorageController::Start: Starting")); - ((CScsiProtocol*)iProtocol)->SetScsiParameters(aConfig); - err = iTransport->Start(); - } + TInt err = KErrNotReady; - __PRINT(_L("CUsbMassStorageController::Start Out")); + if (iProtocol && iTransport) + { + iTransport->RegisterProtocol(*iProtocol); + iProtocol->RegisterTransport(iTransport); + ((CScsiProtocol*)iProtocol)->SetScsiParameters(aConfig); + err = iTransport->Start(); + } - return err; - } + return err; + } /** Stops the transport. */ TInt CUsbMassStorageController::Stop() - { - - __PRINT(_L("CUsbMassStorageController::Stop In")); - TInt err = KErrNotReady; - if (iTransport) - { - __PRINT(_L("CUsbMassStorageController::Stop: Stopping")); - err = iTransport->Stop(); - } - TInt i=0; - for (i=0; i<=iMaxDrives; ++i) - { - iDriveManager->SetCritical(i, EFalse); //unset critical - } - __PRINT(_L("CUsbMassStorageController::Stop Out")); - - return err; - } + { + OstTraceFunctionEntry0(CUSBMASSSTORAGECONTROLLER_110); + TInt err = KErrNotReady; + if (iTransport) + { + err = iTransport->Stop(); + } + TInt i=0; + for (i=0; i<=iMaxDrives; ++i) + { + iDriveManager->SetCritical(i, EFalse); //unset critical + } + return err; + } /** Delete the transport and protocol and start new ones. */ void CUsbMassStorageController::Reset() - { - - delete iProtocol; - iProtocol = NULL; - - //Create transport and protocol and initialize them - __PRINT(_L("CUsbMassStorageController::Reset: Creating protocol")); + { + OstTraceFunctionEntry0(CUSBMASSSTORAGECONTROLLER_120); + delete iProtocol; + iProtocol = NULL; - TRAPD(err,iProtocol = CScsiProtocol::NewL(*iDriveManager)); - err = err; - __ASSERT_DEBUG(err==KErrNone, User::Invariant()); - iTransport->RegisterProtocol(*iProtocol); - iProtocol->RegisterTransport(iTransport); - } + //Create transport and protocol and initialize them + TRAPD(err,iProtocol = CScsiProtocol::NewL(*iDriveManager)); + err = err; + __ASSERT_DEBUG(err==KErrNone, User::Invariant()); + iTransport->RegisterProtocol(*iProtocol); + iProtocol->RegisterTransport(iTransport); + } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/cusbmassstorageserver.cpp --- a/userlibandfileserver/fileserver/smassstorage/cusbmassstorageserver.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/cusbmassstorageserver.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -12,7 +12,7 @@ // // Description: // Implements a Symbian OS server that exposes the RUsbMassStorage API -// +// // /** @@ -24,30 +24,36 @@ #include "usbmsshared.h" #include "cusbmassstorageserver.h" #include "cusbmassstoragesession.h" +#include "drivemanager.h" #include "cusbmassstoragecontroller.h" -#include "massstoragedebug.h" +#include "smassstorage.h" +#include "usbmsserversecuritypolicy.h" -#include "usbmsserversecuritypolicy.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cusbmassstorageserverTraces.h" +#endif + /** Constructs a USB mass storage Server - + @return a pointer to CUsbMassStorageServer object */ CUsbMassStorageServer* CUsbMassStorageServer::NewLC(CUsbMassStorageController& aController) - { - CUsbMassStorageServer* r = new (ELeave) CUsbMassStorageServer(aController); - CleanupStack::PushL(r); - r->StartL(KUsbMsServerName); - return r; - } + { + CUsbMassStorageServer* r = new (ELeave) CUsbMassStorageServer(aController); + CleanupStack::PushL(r); + r->StartL(KUsbMsServerName); + return r; + } /** Destructor */ CUsbMassStorageServer::~CUsbMassStorageServer() - { + { // Intentionally left blank - } + } /** @@ -56,73 +62,67 @@ @param aController a USB mass storage controller reference */ CUsbMassStorageServer::CUsbMassStorageServer(CUsbMassStorageController& aController) - : CPolicyServer(EPriorityHigh,KUsbMsServerPolicy) + : CPolicyServer(EPriorityHigh,KUsbMsServerPolicy) , iController(aController) - { - __PRINT(_L("CUsbMassStorageServer::CUsbMassStorageServer\n")); - } + { + OstTraceFunctionEntry0(CUSBMASSSTORAGESERVER_100); + } /** Create a new session on this server - - @param &aVersion Version of client - @return A pointer to a session object to be used for the client + + @param &aVersion Version of client + @return A pointer to a session object to be used for the client */ CSession2* CUsbMassStorageServer::NewSessionL(const TVersion &aVersion, const RMessage2& /*aMessage*/) const - { - TVersion v(KUsbMsSrvMajorVersionNumber,KUsbMsSrvMinorVersionNumber,KUsbMsSrvBuildVersionNumber); - - __PRINT(_L("CUsbMassStorageServer::NewSessionL\n")); - if (!User::QueryVersionSupported(v, aVersion)) - User::Leave(KErrNotSupported); + { + OstTraceFunctionEntry0(CUSBMASSSTORAGESERVER_110); + TVersion v(KUsbMsSrvMajorVersionNumber,KUsbMsSrvMinorVersionNumber,KUsbMsSrvBuildVersionNumber); + if (!User::QueryVersionSupported(v, aVersion)) + User::Leave(KErrNotSupported); - CUsbMassStorageServer* ncThis = const_cast(this); - - CUsbMassStorageSession* sess = CUsbMassStorageSession::NewL(*ncThis); - - return sess; - } + CUsbMassStorageServer* ncThis = const_cast(this); + CUsbMassStorageSession* sess = CUsbMassStorageSession::NewL(*ncThis); + return sess; + } /** Inform the client there has been an error. - - @param aError The error that has occurred + + @param aError The error that has occurred */ void CUsbMassStorageServer::Error(TInt aError) - { - __PRINT1(_L("CUsbMassStorageServer::Error [aError=%d]\n"), aError); - - Message().Complete(aError); - ReStart(); - } + { + OstTrace1(TRACE_SMASSSTORAGE_FS, CUSBMASSSTORAGESERVER_120, + "aError=%d", aError); + Message().Complete(aError); + ReStart(); + } /** Increment the open session count (iSessionCount) by one. - - @post the number of open sessions is incremented by one + + @post the number of open sessions is incremented by one */ void CUsbMassStorageServer::IncrementSessionCount() - { - __PRINT1(_L("CUsbMassStorageServer::IncrementSessionCount %d\n"), iSessionCount); - __ASSERT_DEBUG(iSessionCount >= 0, User::Panic(KUsbMsSvrPncCat, EUsbMsPanicIllegalIPC)); - - ++iSessionCount; - - __PRINT(_L("CUsbMassStorageServer::IncrementSessionCount\n")); - } + { + OstTrace1(TRACE_SMASSSTORAGE_FS, CUSBMASSSTORAGESERVER_130, + "SessionCount=%d", iSessionCount); + __ASSERT_DEBUG(iSessionCount >= 0, User::Panic(KUsbMsSvrPncCat, EUsbMsPanicIllegalIPC)); + ++iSessionCount; + } /** Decrement the open session count (iSessionCount) by one. - - @post the number of open sessions is decremented by one + + @post the number of open sessions is decremented by one */ void CUsbMassStorageServer::DecrementSessionCount() - { - __PRINT1(_L("CUsbMassStorageServer::DecrementSessionCount %d\n"), iSessionCount); + { + OstTrace1(TRACE_SMASSSTORAGE_FS, CUSBMASSSTORAGESERVER_140, + "SessionCount=%d", iSessionCount); + __ASSERT_DEBUG(iSessionCount > 0, User::Panic(KUsbMsSvrPncCat, EUsbMsPanicIllegalIPC)); + --iSessionCount; + } - __ASSERT_DEBUG(iSessionCount > 0, User::Panic(KUsbMsSvrPncCat, EUsbMsPanicIllegalIPC)); - - --iSessionCount; - } - diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/cusbmassstoragesession.cpp --- a/userlibandfileserver/fileserver/smassstorage/cusbmassstoragesession.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/cusbmassstoragesession.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -12,7 +12,7 @@ // // Description: // Implements a Session of a Symbian OS server for the RUsbMassStorage API -// +// // /** @@ -20,152 +20,163 @@ @internalTechnology */ -#include "cusbmassstoragesession.h" +#include +#include +#include "usbmsshared.h" + +#include "drivemanager.h" #include "cusbmassstoragecontroller.h" #include "cusbmassstorageserver.h" -#include "usbmsshared.h" +#include "cusbmassstoragesession.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cusbmassstoragesessionTraces.h" +#endif + /** Construct a Symbian OS session object. - - @param aServer Service the session will be a member of - @param aMessage The message from the client. - @return A new CUsbMassStorageSession object + + @param aServer Service the session will be a member of + @param aMessage The message from the client. + @return A new CUsbMassStorageSession object */ CUsbMassStorageSession* CUsbMassStorageSession::NewL(CUsbMassStorageServer& aServer) - { - CUsbMassStorageSession* r = new (ELeave) CUsbMassStorageSession(aServer); - CleanupStack::PushL(r); - r->ConstructL(); - CleanupStack::Pop(); - return r; - } + { + CUsbMassStorageSession* r = new (ELeave) CUsbMassStorageSession(aServer); + CleanupStack::PushL(r); + r->ConstructL(); + CleanupStack::Pop(); + return r; + } /** Constructor. - - @param aServer Service the session will be a member of + + @param aServer Service the session will be a member of */ CUsbMassStorageSession::CUsbMassStorageSession(CUsbMassStorageServer& aServer) - : iUsbMsServer(aServer) - { - __PRINT(_L("CUsbMassStorageSession::CUsbMassStorageSession\n")); - } + : iUsbMsServer(aServer) + { + OstTraceFunctionEntry0(CUSBMASSSTORAGESESSION_100); + } /** 2nd Phase Construction. */ void CUsbMassStorageSession::ConstructL() - { - iUsbMsServer.IncrementSessionCount(); + { + iUsbMsServer.IncrementSessionCount(); if (iUsbMsServer.SessionCount() > 1) { - __PRINT1(_L("\tiSessionCount: %d\n"), iUsbMsServer.SessionCount()); + OstTrace1(TRACE_SMASSSTORAGE_FS, CUSBMASSSTORAGESESSION_101, + "iSessionCount: %d", iUsbMsServer.SessionCount()); // Only one session is allowed User::Leave(KErrInUse); - } - } + } + } /** Destructor. */ CUsbMassStorageSession::~CUsbMassStorageSession() - { - iUsbMsServer.DecrementSessionCount(); - } + { + iUsbMsServer.DecrementSessionCount(); + } /** Called when a message is received from the client. - - @param aMessage Message received from the client + + @param aMessage Message received from the client */ void CUsbMassStorageSession::ServiceL(const RMessage2& aMessage) - { - DispatchMessageL(aMessage); - } + { + DispatchMessageL(aMessage); + } /** Handles the request (in the form of a the message) received from the client - + @internalTechnology - @param aMessage The received message + @param aMessage The received message */ void CUsbMassStorageSession::DispatchMessageL(const RMessage2& aMessage) - { - TInt ret = KErrNone; - - switch (aMessage.Function()) - { - case EUsbMsStart: - ret = Start(aMessage); - break; - case EUsbMsStop: - ret = Stop(); - break; - case EUsbMsShutdown: - ret = Shutdown(); - break; + { + TInt ret = KErrNone; - default: - aMessage.Panic(KUsbMsCliPncCat, EUsbMsPanicIllegalIPC); - break; - } + switch (aMessage.Function()) + { + case EUsbMsStart: + ret = Start(aMessage); + break; + case EUsbMsStop: + ret = Stop(); + break; + case EUsbMsShutdown: + ret = Shutdown(); + break; - aMessage.Complete(ret); - } + default: + aMessage.Panic(KUsbMsCliPncCat, EUsbMsPanicIllegalIPC); + break; + } + + aMessage.Complete(ret); + } /** Client request to start the device. - - @return Any error that occurred or KErrNone + + @return Any error that occurred or KErrNone */ TInt CUsbMassStorageSession::Start(const RMessage2& aMessage) - { - __PRINT(_L("CUsbMassStorageSession::Start\n")); + { + OstTraceFunctionEntry0(CUSBMASSSTORAGESESSION_103); + TMassStorageConfig msConfig; + TRAPD(err, GetMsConfigL(aMessage, msConfig)); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_FS, CUSBMASSSTORAGESESSION_111, + "Failed to get mass storage configuration data err=%d", err); + return err; + } - TMassStorageConfig msConfig; - TRAPD(err, GetMsConfigL(aMessage, msConfig)); - if (err != KErrNone) - { - __PRINT(_L("Failed to get mass storage configuration data\n")); - return err; - } - - return iUsbMsServer.Controller().Start(msConfig); - } + return iUsbMsServer.Controller().Start(msConfig); + } /** Client request to stop the device. - - @return Any error that occurred or KErrNone + + @return Any error that occurred or KErrNone */ TInt CUsbMassStorageSession::Stop() { - __PRINT(_L("CUsbMassStorageSession::Stop\n")); + OstTraceFunctionEntry0(CUSBMASSSTORAGESESSION_104); TInt err = iUsbMsServer.Controller().Stop(); - return err; - } + return err; + } /** Client request to shut down the server - + @return KErrNone */ TInt CUsbMassStorageSession::Shutdown() { - __PRINT(_L("CUsbMassStorageSession::Shutdown\n")); + OstTraceFunctionEntry0(CUSBMASSSTORAGESESSION_105); CActiveScheduler::Stop(); - return KErrNone; - } + return KErrNone; + } /** Get mass storage configuration data from the received message */ void CUsbMassStorageSession::GetMsConfigL(const RMessage2& aMessage, TMassStorageConfig& aMsStorage) - { - aMessage.ReadL(0,aMsStorage.iVendorId); - aMessage.ReadL(1,aMsStorage.iProductId); - aMessage.ReadL(2,aMsStorage.iProductRev); - } + { + aMessage.ReadL(0,aMsStorage.iVendorId); + aMessage.ReadL(1,aMsStorage.iProductId); + aMessage.ReadL(2,aMsStorage.iProductRev); + } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/drivemanager.cpp --- a/userlibandfileserver/fileserver/smassstorage/drivemanager.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/drivemanager.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -12,7 +12,7 @@ // // Description: // Class implementation of CDriveManager and CMassStorageDrive. -// +// // /** @@ -20,187 +20,195 @@ @internalTechnology */ +#include +#include // C Class Definitions, Cleanup Stack +#include // T Type Definitions #include -#include "massstoragedebug.h" -#include "usbmsshared.h" +#include +#include "usbmsshared.h" // KUsbMsMaxDrives + + #include "drivemanager.h" +#include "smassstorage.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "drivemanagerTraces.h" +#endif + + /////////////////////////////////////////////////////////////////////////////// /** -A private structure that, when Connected, holds references to +A private structure that, when Connected, holds references to the CProxyDrive and the corresponding TBusLocalDrive's Media Changed flag. */ struct CMassStorageDrive::CLocalDriveRef : public CBase - { - CLocalDriveRef(CProxyDrive& aProxyDrive, TBool& aMediaChanged) - : iProxyDrive(aProxyDrive), iMediaChanged(aMediaChanged), iDriveState(EIdle) - { - } - CProxyDrive& iProxyDrive; - TBool& iMediaChanged; - /** - The Drive Media state machine - */ - TDriveState iDriveState; - }; + { + CLocalDriveRef(CProxyDrive& aProxyDrive, TBool& aMediaChanged) + : iProxyDrive(aProxyDrive), iMediaChanged(aMediaChanged), iDriveState(EIdle) + { + } + CProxyDrive& iProxyDrive; + TBool& iMediaChanged; + /** + The Drive Media state machine + */ + TDriveState iDriveState; + }; /** @param aCritSec A Critical Section object shared by all drives. -@param aDrives Reference to the list of CMassStorageDrive objects. -@param aDriveMap Reference to array mapping lun to drive number for supported - mass storage drives. +@param aDrives Reference to the list of CMassStorageDrive objects. +@param aDriveMap Reference to array mapping lun to drive number for supported + mass storage drives. @post Object is fully constructed */ -CMassStorageDrive::CMassStorageDrive(RCriticalSection& aCritSec, - RDriveStateChangedPublisher& aDriveStateChangedPublisher) - : - iCritSec(aCritSec), - iMountState(EDisconnected), - iDriveStateChangedPublisher(aDriveStateChangedPublisher) - { - __FNLOG("CMassStorageDrive::CMassStorageDrive"); - - } +CMassStorageDrive::CMassStorageDrive(RCriticalSection& aCritSec, + RDriveStateChangedPublisher& aDriveStateChangedPublisher) + : + iCritSec(aCritSec), + iMountState(EDisconnected), + iDriveStateChangedPublisher(aDriveStateChangedPublisher) + { + } CMassStorageDrive::~CMassStorageDrive() - { - delete iLocalDrive; - } + { + delete iLocalDrive; + } /** Read from the target drive unit. @return KErrNone on success, otherwise system wide error code */ TInt CMassStorageDrive::Read(const TInt64& aPos, TInt aLength, TDes8& aBuf, TBool aWholeMedia) - { - __FNLOG("CMassStorageDrive::Read"); + { + TInt err = KErrUnknown; // never return this + iCritSec.Wait(); - TInt err = KErrUnknown; // never return this - iCritSec.Wait(); + if(iMountState != EConnected) + { + err = KErrDisconnected; + } + else + { + if(aWholeMedia) + { + err = SafeProxyDrive().Read(aPos, aLength, &aBuf, KLocalMessageHandle, 0, RLocalDrive::ELocDrvWholeMedia); + } + else + { + err = SafeProxyDrive().Read(aPos, aLength, aBuf); + } - if(iMountState != EConnected) - { - err = KErrDisconnected; - } - else - { - if(aWholeMedia) - { - err = SafeProxyDrive().Read(aPos, aLength, &aBuf, KLocalMessageHandle, 0, RLocalDrive::ELocDrvWholeMedia); - } - else - { - err = SafeProxyDrive().Read(aPos, aLength, aBuf); - } + if(err == KErrNone) + { +#ifndef USB_TRANSFER_PUBLISHER + iBytesRead += aBuf.Length(); + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_100, + "iBytesRead=%d", iBytesRead); +#endif + } - if(err == KErrNone) - { -#ifndef USB_TRANSFER_PUBLISHER - iBytesRead += aBuf.Length(); - __PRINT1(_L("iBytesRead=%d\n"),iBytesRead); -#endif - } + else if(err == KErrLocked) + { + SetDriveState(ELocked); + } + } - else if(err == KErrLocked) - { - SetDriveState(ELocked); - } - } - - iCritSec.Signal(); - return err; - } + iCritSec.Signal(); + return err; + } /** Write to the target drive unit. @return KErrNone on success, otherwise system wide error code */ TInt CMassStorageDrive::Write(const TInt64& aPos, TDesC8& aBuf, TBool aWholeMedia) - { - __FNLOG("CMassStorageDrive::Write"); - - TInt err = KErrNone; - iCritSec.Wait(); + { + TInt err = KErrNone; + iCritSec.Wait(); - if (iMountState != EConnected) - { - err = KErrDisconnected; - } - else - { - __ASSERT_DEBUG(iLocalDrive, User::Invariant()); - TDriveState oldState = iLocalDrive->iDriveState; - if(oldState != EActive) - { - // SCSI hasn't called SetCritical - SetDriveState(EActive); - } + if (iMountState != EConnected) + { + err = KErrDisconnected; + } + else + { + __ASSERT_DEBUG(iLocalDrive, User::Panic(KUsbMsSvrPncCat, EMsCMassStorageDriveWrite)); + TDriveState oldState = iLocalDrive->iDriveState; + if(oldState != EActive) + { + // SCSI hasn't called SetCritical + SetDriveState(EActive); + } - if (aWholeMedia) - { - err = SafeProxyDrive().Write(aPos, aBuf.Length(), &aBuf, KLocalMessageHandle, 0, RLocalDrive::ELocDrvWholeMedia); - } - else - { - err = SafeProxyDrive().Write(aPos,aBuf); - } + if (aWholeMedia) + { + err = SafeProxyDrive().Write(aPos, aBuf.Length(), &aBuf, KLocalMessageHandle, 0, RLocalDrive::ELocDrvWholeMedia); + } + else + { + err = SafeProxyDrive().Write(aPos,aBuf); + } - if (err == KErrNone) - { + if (err == KErrNone) + { #ifndef USB_TRANSFER_PUBLISHER - iBytesWritten += aBuf.Length(); + iBytesWritten += aBuf.Length(); #endif - } + } - if (err == KErrLocked) - { - SetDriveState(ELocked); - } - else if (oldState != EActive) - { - SetDriveState(oldState); - } - } + if (err == KErrLocked) + { + SetDriveState(ELocked); + } + else if (oldState != EActive) + { + SetDriveState(oldState); + } + } - iCritSec.Signal(); - return err; - } + iCritSec.Signal(); + return err; + } /** Get the capabilities of the target drive unit. @return KErrNone on success, otherwise system wide error code */ TInt CMassStorageDrive::Caps(TLocalDriveCapsV4& aInfo) - { - __FNLOG("CMassStorageDrive::Caps"); + { + TInt err = KErrNone; + iCritSec.Wait(); + + if(iMountState != EConnected) + { + err = KErrDisconnected; + } + else + { + // Initialise in case Caps() fails + aInfo.iType = ::EMediaUnknown; + err = DoCaps(aInfo); - TInt err = KErrNone; - iCritSec.Wait(); - - if(iMountState != EConnected) - { - err = KErrDisconnected; - } - else - { - // Initialise in case Caps() fails - aInfo.iType = ::EMediaUnknown; - err = DoCaps(aInfo); + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_110, + "err=%d", err); - __PRINTERR(_L("CheckDriveState: DoCaps err=%d\n"), err); + if(err == KErrNotReady || (err==KErrNone && aInfo.iType == ::EMediaNotPresent)) + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_111, + "detected MediaNotPresent"); + SetDriveState(CMassStorageDrive::EMediaNotPresent); + } + } - if(err == KErrNotReady || (err==KErrNone && aInfo.iType == ::EMediaNotPresent)) - { - __PRINT(_L("CMassStorageDrive::Caps detected MediaNotPresent\n")); - SetDriveState(CMassStorageDrive::EMediaNotPresent); - } - } - - iCritSec.Signal(); - return err; - } + iCritSec.Signal(); + return err; + } /** Provides an interface to CProxyDrive::Caps that hides the @@ -209,45 +217,41 @@ @param aInfo */ TInt CMassStorageDrive::DoCaps(TLocalDriveCapsV4& aInfo) - { - __FNLOG("CMassStorageDrive::DoCaps"); + { + TLocalDriveCapsV4Buf buf; + buf.FillZ(); + CProxyDrive& pd = SafeProxyDrive(); - TLocalDriveCapsV4Buf buf; - buf.FillZ(); - CProxyDrive& pd = SafeProxyDrive(); - - __PRINT(_L("CMassStorageDrive::DoCaps calling Caps\n")); - TInt err = pd.Caps(buf); + TInt err = pd.Caps(buf); + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_121, + "Caps returned %d", err); - __PRINT1(_L("CMassStorageDrive::DoCaps: Caps returned %d\n"), err); + if(err==KErrNone) + { + // Invoke function call operator to cast to TLocalDriveCapsV4& + aInfo = buf(); + } - if(err==KErrNone) - { - // Invoke function call operator to cast to TLocalDriveCapsV4& - aInfo = buf(); - } - - return err; - } + return err; + } /** Publish media error, user should reinsert the memory card. Similar to FAT32's TDriver::HandleCriticalError. Note: User notification is not implemented, instead we abort and dismount. */ -TInt CMassStorageDrive::HandleCriticalError() - { - __FNLOG("CMassStorageDrive::HandleCriticalError"); - iDriveMediaErrorPublisher.PublishError(ETrue); - return KErrAbort; - } +TInt CMassStorageDrive::HandleCriticalError() + { + iDriveMediaErrorPublisher.PublishError(ETrue); + return KErrAbort; + } TInt CMassStorageDrive::ClearCriticalError() - { - iDriveMediaErrorPublisher.PublishError(EFalse); - return KErrNone; - } + { + iDriveMediaErrorPublisher.PublishError(EFalse); + return KErrNone; + } /** @@ -256,30 +260,30 @@ @param aReset If true, the Media Changed flag is reset to EFalse. */ TBool CMassStorageDrive::IsMediaChanged(TBool aReset) - { - __FNLOG("CMassStorageDrive::IsMediaChanged"); - - iCritSec.Wait(); + { + iCritSec.Wait(); - TBool mediaChanged = EFalse; - if(iLocalDrive) - { - mediaChanged = iLocalDrive->iMediaChanged; - if(aReset) - { - iLocalDrive->iMediaChanged = EFalse; - } - } - else - { - __PRINT(_L("CMassStorageDrive::IsMediaChanged: no drive\n")); - } + TBool mediaChanged = EFalse; + if(iLocalDrive) + { + mediaChanged = iLocalDrive->iMediaChanged; + if(aReset) + { + iLocalDrive->iMediaChanged = EFalse; + } + } + else + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_130, + "No drive"); + } - iCritSec.Signal(); + iCritSec.Signal(); - __PRINT1(_L("CMassStorageDrive::IsMediaChanged: returning %d\n"), mediaChanged); - return mediaChanged; - } + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_131, + "IsMediaChanged returning %d", mediaChanged); + return mediaChanged; + } /** Set the Drive State to Active or Idle. @@ -287,58 +291,56 @@ @param aCritical ETrue for Active, EFalse for Idle */ TInt CMassStorageDrive::SetCritical(TBool aCritical) - { - __FNLOG("CMassStorageDrive::SetCritical"); + { + TInt err = KErrDisMounted; - TInt err = KErrDisMounted; - - iCritSec.Wait(); + iCritSec.Wait(); - if(iLocalDrive) - { - if(iLocalDrive->iDriveState == CMassStorageDrive::EMediaNotPresent) - { - err = KErrNotReady; - } - else - { - SetDriveState( - aCritical - ? CMassStorageDrive::EActive - : CMassStorageDrive::EIdle ); - - err = KErrNone; - } - } + if(iLocalDrive) + { + if(iLocalDrive->iDriveState == CMassStorageDrive::EMediaNotPresent) + { + err = KErrNotReady; + } + else + { + SetDriveState( + aCritical + ? CMassStorageDrive::EActive + : CMassStorageDrive::EIdle ); - iCritSec.Signal(); + err = KErrNone; + } + } - return err; - } + iCritSec.Signal(); + + return err; + } /** Set the mount state */ TInt CMassStorageDrive::SetMountConnected(CProxyDrive& aProxyDrive, TBool& aMediaChanged) - { - __FNLOG("CMassStorageDrive::SetMountConnected"); - CLocalDriveRef* localDrive = NULL; + { + CLocalDriveRef* localDrive = NULL; - __PRINT(_L("SetMountConnected entering critical section\n")); - iCritSec.Wait(); // note: signalled in SetMountState + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_140, + "SetMountConnected entering critical section"); + iCritSec.Wait(); // note: signalled in SetMountState - if (iLocalDrive == NULL) - { - localDrive = new CLocalDriveRef(aProxyDrive, aMediaChanged); - if (localDrive==NULL) - { - iCritSec.Signal(); - return KErrNoMemory; - } - } + if (iLocalDrive == NULL) + { + localDrive = new CLocalDriveRef(aProxyDrive, aMediaChanged); + if (localDrive==NULL) + { + iCritSec.Signal(); + return KErrNoMemory; + } + } - return SetMountState(EConnected, localDrive); - } + return SetMountState(EConnected, localDrive); + } /** @return KErrNone @@ -346,256 +348,257 @@ @param aLocalDrive Only provide this if aNewState is EConnected. */ TInt CMassStorageDrive::SetMountState(TMountState aNewState, CLocalDriveRef* aLocalDrive/*=NULL*/) - { - __FNLOG("CMassStorageDrive::SetMountState"); - - if(iMountState == aNewState) - { - __PRINT(_L("SetMountState: No change\n")); - } - else - { - // If called from SetMountConnected, already in critical section, - // otherwise, must enter it here. - if(EConnected!=aNewState) - { - __PRINT(_L("SetMountState entering critical section\n")); - iCritSec.Wait(); - } + { + if(iMountState == aNewState) + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_150, + "SetMountState: No change"); + } + else + { + // If called from SetMountConnected, already in critical section, + // otherwise, must enter it here. + if(EConnected!=aNewState) + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_151, + "SetMountState entering critical section"); + iCritSec.Wait(); + } + + switch(aNewState) + { + case EConnected: + if(aLocalDrive) + { + __ASSERT_DEBUG(iLocalDrive, User::Panic(KUsbMsSvrPncCat, EMsCMassStorageDriveSetMountState_iLocalDrive)); + iLocalDrive = aLocalDrive; + } + __ASSERT_DEBUG(iLocalDrive, User::Panic(KUsbMsSvrPncCat, EMsCMassStorageDriveSetMountState_aLocalDrive)); + break; - switch(aNewState) - { - case EConnected: - if(aLocalDrive) - { - __ASSERT_DEBUG(!iLocalDrive, User::Invariant()); - iLocalDrive = aLocalDrive; - } - __ASSERT_DEBUG(iLocalDrive, User::Invariant()); - break; - - case EDisconnected: - delete iLocalDrive; - iLocalDrive = NULL; + case EDisconnected: + delete iLocalDrive; + iLocalDrive = NULL; #ifndef USB_TRANSFER_PUBLISHER - iBytesWritten = iBytesRead = 0; + iBytesWritten = iBytesRead = 0; #endif - break; + break; + + case EDisconnecting: + case EConnecting: + // Do not change iLocalDrive for these state changes + break; + } - case EDisconnecting: - case EConnecting: - // Do not change iLocalDrive for these state changes - break; - } - - iMountState = aNewState; - __PRINT1(_L("SetMountState: state=%d\n"), iMountState); + iMountState = aNewState; + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_152, + "SetMountState: state=%d", iMountState); + + iDriveStateChangedPublisher.DriveStateChanged(); - iDriveStateChangedPublisher.DriveStateChanged(); - - iCritSec.Signal(); - __PRINT(_L("SetMountState has left the critical section\n")); - } + iCritSec.Signal(); + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_153, + "SetMountState has left the critical section"); + } - return KErrNone; - } + return KErrNone; + } /** @return Current drive media state */ CMassStorageDrive::TDriveState CMassStorageDrive::DriveState() const - { - return iLocalDrive ? iLocalDrive->iDriveState : EErrDisMounted; - } + { + return iLocalDrive ? iLocalDrive->iDriveState : EErrDisMounted; + } /** Check for media not present, and return the drive state. @return Current drive media state */ CMassStorageDrive::TDriveState CMassStorageDrive::CheckDriveState() - { - __FNLOG("CMassStorageDrive::CheckDriveState"); + { + CMassStorageDrive::TDriveState state = EErrDisMounted; - CMassStorageDrive::TDriveState state = EErrDisMounted; + iCritSec.Wait(); - iCritSec.Wait(); - - if (iLocalDrive) - { - TInt err = KErrGeneral; - TLocalDriveCapsV4 caps; + if (iLocalDrive) + { + TInt err = KErrGeneral; + TLocalDriveCapsV4 caps; - FOREVER - { - // Initialise in case Caps() fails - caps.iType = ::EMediaNotPresent; + FOREVER + { + // Initialise in case Caps() fails + caps.iType = ::EMediaNotPresent; - err = DoCaps(caps); - __PRINTERR(_L("CheckDriveState: DoCaps err=%d\n"), err); - if (err == KErrNotReady || (err == KErrNone && caps.iType == ::EMediaNotPresent)) - { - __PRINT(_L("CheckDriveState: detected MediaNotPresent\n")); + err = DoCaps(caps); + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_160, + "DoCaps err=%d", err); + if (err == KErrNotReady || (err == KErrNone && caps.iType == ::EMediaNotPresent)) + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_161, + "Detected MediaNotPresent"); - SetDriveState(CMassStorageDrive::EMediaNotPresent); + SetDriveState(CMassStorageDrive::EMediaNotPresent); - if (HandleCriticalError() == KErrAbort) - break; - } - else - { - ClearCriticalError(); - break; - } - } + if (HandleCriticalError() == KErrAbort) + break; + } + else + { + ClearCriticalError(); + break; + } + } - if (err == KErrNone && caps.iType != ::EMediaNotPresent) - { - if (iLocalDrive->iDriveState == CMassStorageDrive::EMediaNotPresent) - { - __PRINT(_L("CheckDriveState: detected media inserted\n")); - SetDriveState(CMassStorageDrive::EIdle); - } - else if (iLocalDrive->iDriveState == CMassStorageDrive::ELocked && - !(caps.iMediaAtt & KMediaAttLocked)) - { - __PRINT(_L("CheckDriveState: detected media unlocked\n")); - SetDriveState(CMassStorageDrive::EIdle); - } - else if (caps.iMediaAtt & KMediaAttLocked) - { - __PRINT(_L("CheckDriveState: detected media locked\n")); - SetDriveState(CMassStorageDrive::ELocked); - } - - iWholeMediaAccess = !(caps.iDriveAtt & KDriveAttLogicallyRemovable); - } + if (err == KErrNone && caps.iType != ::EMediaNotPresent) + { + if (iLocalDrive->iDriveState == CMassStorageDrive::EMediaNotPresent) + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_162, + "Detected media inserted"); + SetDriveState(CMassStorageDrive::EIdle); + } + else if (iLocalDrive->iDriveState == CMassStorageDrive::ELocked && + !(caps.iMediaAtt & KMediaAttLocked)) + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_163, + "Detected media unlocked"); + SetDriveState(CMassStorageDrive::EIdle); + } + else if (caps.iMediaAtt & KMediaAttLocked) + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_164, + "Detected media locked"); + SetDriveState(CMassStorageDrive::ELocked); + } - // Get the current state - state = iLocalDrive->iDriveState; - } + iWholeMediaAccess = !(caps.iDriveAtt & KDriveAttLogicallyRemovable); + } - iCritSec.Signal(); + // Get the current state + state = iLocalDrive->iDriveState; + } - return state; - } + iCritSec.Signal(); + + return state; + } static TBool IsActive(CMassStorageDrive::TDriveState aDriveState) - { - return aDriveState==CMassStorageDrive::EActive; - } + { + return aDriveState==CMassStorageDrive::EActive; + } /** @param aNewState */ void CMassStorageDrive::SetDriveState(TDriveState aNewState) - { - __FNLOG("CMassStorageDrive::SetDriveState"); - - __ASSERT_DEBUG(aNewState == EIdle || + { + __ASSERT_DEBUG(aNewState == EIdle || (iMountState == EConnected && NULL != iLocalDrive) || (iMountState == EDisconnecting && NULL != iLocalDrive), - User::Invariant()); + User::Panic(KUsbMsSvrPncCat, EMsCMassStorageDriveSetDriveState_State)); - if(!iLocalDrive) - { - __PRINT(_L("SetDriveState: Drive not mounted.\n")); - } - else - { - __PRINT2(_L("SetDriveState: %d->%d\n"), iLocalDrive->iDriveState, aNewState); + if(!iLocalDrive) + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_170, + "Drive not mounted."); + } + else + { + OstTraceExt2(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_171, + "Drive state change %d->%d", iLocalDrive->iDriveState, aNewState); + + if(iLocalDrive->iDriveState != aNewState) + { + CMountCB* mount = SafeProxyDrive().Mount(); + __ASSERT_DEBUG(mount != NULL, User::Panic(KUsbMsSvrPncCat, EMsCMassStorageDriveSetDriveState_Mount)); - if(iLocalDrive->iDriveState != aNewState) - { - CMountCB* mount = SafeProxyDrive().Mount(); -#if !defined(USBMSDRIVE_TEST) - __ASSERT_DEBUG(mount != NULL, User::Invariant()); -#endif - if(mount) - { - if(!IsActive(iLocalDrive->iDriveState) && IsActive(aNewState)) - { - mount->IncLock(); - } - else if(IsActive(iLocalDrive->iDriveState) && !IsActive(aNewState)) - { - mount->DecLock(); - } - __PRINT1(_L("SetDriveState: LockStatus=%d\n"), mount->LockStatus()); - } + if(mount) + { + if(!IsActive(iLocalDrive->iDriveState) && IsActive(aNewState)) + { + mount->IncLock(); + } + else if(IsActive(iLocalDrive->iDriveState) && !IsActive(aNewState)) + { + mount->DecLock(); + } + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_172, + "LockStatus=%d", mount->LockStatus()); + } - iLocalDrive->iDriveState = aNewState; + iLocalDrive->iDriveState = aNewState; - iDriveStateChangedPublisher.DriveStateChanged(); - } - } - } + iDriveStateChangedPublisher.DriveStateChanged(); + } + } + } /** Accessor for iProxyDrive; asserts if NULL */ CProxyDrive& CMassStorageDrive::SafeProxyDrive() const - { - __ASSERT_ALWAYS(NULL!=iLocalDrive, User::Invariant()); - return iLocalDrive->iProxyDrive; - } + { + __ASSERT_ALWAYS(NULL!=iLocalDrive, User::Invariant()); + return iLocalDrive->iProxyDrive; + } ///////////////////////////////////////////////////////////////// /** Construct a CDriveManager object. -@param aDriveMap Reference to array mapping lun to drive number for supported - mass storage drives. +@param aDriveMap Reference to array mapping lun to drive number for supported + mass storage drives. */ CDriveManager* CDriveManager::NewL(TRefDriveMap aDriveMap) - { - __FNLOG("CDriveManager::NewL"); - __PRINT1(_L("CDriveManager::NewL - %d drives\n"), aDriveMap.Count()); + { + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_180, + "%d drives available", aDriveMap.Count()); - CDriveManager* self = new (ELeave) CDriveManager(aDriveMap); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } + CDriveManager* self = new (ELeave) CDriveManager(aDriveMap); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } CDriveManager::CDriveManager(const RArray& aDriveMap) - : iDriveMap(aDriveMap) - {} + : iDriveMap(aDriveMap) + {} /** Construct a CDriveManager object. */ void CDriveManager::ConstructL() - { - __FNLOG("CDriveManager::ConstructL"); + { + User::LeaveIfError(iDriveCritSec.CreateLocal()); - User::LeaveIfError(iDriveCritSec.CreateLocal()); - - iDriveStateChangedPublisher = new (ELeave) RDriveStateChangedPublisher(iDrives, iDriveMap); + iDriveStateChangedPublisher = new (ELeave) RDriveStateChangedPublisher(iDrives, iDriveMap); - for(TInt i = 0; i < iDriveMap.Count(); i++) - { - iDrives[i] = new (ELeave) CMassStorageDrive(iDriveCritSec, *iDriveStateChangedPublisher); - } + for(TInt i = 0; i < iDriveMap.Count(); i++) + { + iDrives[i] = new (ELeave) CMassStorageDrive(iDriveCritSec, *iDriveStateChangedPublisher); + } - // Publish initial drive state - if (iDriveMap.Count() > 0) - { - iDriveStateChangedPublisher->DriveStateChanged(); - } - } + // Publish initial drive state + if (iDriveMap.Count() > 0) + { + iDriveStateChangedPublisher->DriveStateChanged(); + } + } /** Destructor */ CDriveManager::~CDriveManager() - { - __FNLOG("CDriveManager::~CDriveManager"); - - iDrives.DeleteAll(); - delete iDriveStateChangedPublisher; - iDriveCritSec.Close(); - } + { + iDrives.DeleteAll(); + delete iDriveStateChangedPublisher; + iDriveCritSec.Close(); + } /** Set the mount state to Connected and specify the Proxy Drive. @@ -607,19 +610,18 @@ @post The Mount State will be Connected. */ TInt CDriveManager::RegisterDrive(CProxyDrive& aProxyDrive, TBool& aMediaChanged, TUint aLun) - { - __FNLOG("CDriveManager::RegisterDrive"); - __PRINT1(_L("Lun=%d \n"),aLun); - TInt err = KErrUnknown; // never return this - CMassStorageDrive* drive = CDriveManager::Drive(aLun, err); - if(drive) - { - drive->SetMountConnected(aProxyDrive, aMediaChanged); - } + { + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_190, "Lun=%d", aLun); + TInt err = KErrUnknown; // never return this + CMassStorageDrive* drive = CDriveManager::Drive(aLun, err); + if(drive) + { + drive->SetMountConnected(aProxyDrive, aMediaChanged); + } - __PRINT1(_L("CDriveManager::RegisterDrive err=%d\n"), err); - return err; - } + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_191, "err=%d", err); + return err; + } /** Set the mount state to Disconnected. @@ -628,18 +630,16 @@ @post The Mount State will be Disconnected. */ TInt CDriveManager::DeregisterDrive(TUint aLun) - { - __FNLOG("CDriveManager::DeregisterDrive"); + { + TInt err = KErrUnknown; // never return this + if(CMassStorageDrive* drive = Drive(aLun, err)) + { + err = drive->SetMountDisconnected(); + } - TInt err = KErrUnknown; // never return this - if(CMassStorageDrive* drive = Drive(aLun, err)) - { - err = drive->SetMountDisconnected(); - } - - __PRINT1(_L("CDriveManager::DeregisterDrive err=%d\n"), err); - return err; - } + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_200, "err=%d", err); + return err; + } /** Return a pointer to the drive specified aLun, or NULL if @@ -650,22 +650,22 @@ @param aError KErrNone on success, KErrArgument if NULL is returned. */ CMassStorageDrive* CDriveManager::Drive(TUint aLun, TInt& aError) const - { - aError = KErrNone; - CMassStorageDrive* drive = NULL; + { + aError = KErrNone; + CMassStorageDrive* drive = NULL; - // Check if aLun exceeds the specified number of drives - // (This will panic if it exceeds KMaxLun). - if(aLun>=KUsbMsMaxDrives || !iDrives[aLun]) - { - aError = KErrArgument; - } - else - { - drive = iDrives[aLun]; - } - return drive; - } + // Check if aLun exceeds the specified number of drives + // (This will panic if it exceeds KMaxLun). + if(aLun>=KUsbMsMaxDrives || !iDrives[aLun]) + { + aError = KErrArgument; + } + else + { + drive = iDrives[aLun]; + } + return drive; + } /** Checks the Media Changed flag, and optionally resets it. @@ -674,22 +674,21 @@ @param aReset If true, the Media Changed flag is reset to EFalse. */ TBool CDriveManager::IsMediaChanged(TUint aLun, TBool aReset) - { - __FNLOG("CDriveManager::IsMediaChanged"); - - TInt err; // not used, but is a required parameter - CMassStorageDrive* drive = Drive(aLun, err); + { + TInt err; // not used, but is a required parameter + CMassStorageDrive* drive = Drive(aLun, err); - if(!drive) - { - __PRINT1(_L("CDriveManager::IsMediaChanged: LUN=%d not found, returning false\n"), aLun); - return ETrue; - } - else - { - return drive->IsMediaChanged(aReset); - } - } + if(!drive) + { + OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_210, + "LUN=%d not found, returning false", aLun); + return ETrue; + } + else + { + return drive->IsMediaChanged(aReset); + } + } /** Set the Drive State to Active or Idle. @@ -699,31 +698,29 @@ @param aCritical ETrue for Active, EFalse for Idle */ TInt CDriveManager::SetCritical(TUint aLun, TBool aCritical) - { - __FNLOG("CDriveManager::SetCritical"); + { + TInt err = KErrUnknown; // never return this + + TInt i=aLun; + TInt cnt=aLun+1; - TInt err = KErrUnknown; // never return this + if (aLun == KAllLuns) + { + i=0; + cnt= iDriveMap.Count(); + } - TInt i=aLun; - TInt cnt=aLun+1; - - if (aLun == KAllLuns) - { - i=0; - cnt= iDriveMap.Count(); - } + for(; iSetCritical(aCritical); - } - } - return err; - } + CMassStorageDrive* drive = Drive(i, err); + if(drive) + { + err = drive->SetCritical(aCritical); + } + } + return err; + } /** Inititiate transition to Connected. @@ -732,32 +729,31 @@ @post The Mount State will be Connected or Connecting. */ TInt CDriveManager::Connect(TUint aLun) - { - __FNLOG("CDriveManager::Connect"); + { + TInt err = KErrUnknown; // never return this + CMassStorageDrive* drive = Drive(aLun, err); - TInt err = KErrUnknown; // never return this - CMassStorageDrive* drive = Drive(aLun, err); - - __PRINT3(_L("CDriveManager::Connect lun=%d, err=%d, mountState=%d\n"), aLun, err, drive->MountState()); + OstTraceExt3(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_230, + "lun=%d err=%d mountState=%d", aLun, err, drive->MountState()); - if(drive) - { - switch(drive->MountState()) - { - case CMassStorageDrive::EDisconnected: - err = drive->SetMountConnecting(); - break; - case CMassStorageDrive::EDisconnecting: - err = drive->SetMountConnected(); - break; - case CMassStorageDrive::EConnected: - case CMassStorageDrive::EConnecting: - // do nothing - break; - } - } - return err; - } + if(drive) + { + switch(drive->MountState()) + { + case CMassStorageDrive::EDisconnected: + err = drive->SetMountConnecting(); + break; + case CMassStorageDrive::EDisconnecting: + err = drive->SetMountConnected(); + break; + case CMassStorageDrive::EConnected: + case CMassStorageDrive::EConnecting: + // do nothing + break; + } + } + return err; + } /** Inititiate transition to Disconnected. @@ -766,29 +762,27 @@ @post The Mount State will be Disconnected or Disconnecting. */ TInt CDriveManager::Disconnect(TUint aLun) - { - __FNLOG("CDriveManager::Disconnect"); - - TInt err = KErrUnknown; // never return this - CMassStorageDrive* drive = Drive(aLun, err); + { + TInt err = KErrUnknown; // never return this + CMassStorageDrive* drive = Drive(aLun, err); - if(drive) - { - switch(drive->MountState()) - { - case CMassStorageDrive::EConnected: - err = drive->SetMountDisconnecting(); - break; - case CMassStorageDrive::EConnecting: - err = drive->SetMountDisconnected(); - break; - case CMassStorageDrive::EDisconnected: - case CMassStorageDrive::EDisconnecting: - // do nothing - break; - } - } - return err; - } + if(drive) + { + switch(drive->MountState()) + { + case CMassStorageDrive::EConnected: + err = drive->SetMountDisconnecting(); + break; + case CMassStorageDrive::EConnecting: + err = drive->SetMountDisconnected(); + break; + case CMassStorageDrive::EDisconnected: + case CMassStorageDrive::EDisconnecting: + // do nothing + break; + } + } + return err; + } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/drivepublisher.cpp --- a/userlibandfileserver/fileserver/smassstorage/drivepublisher.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/drivepublisher.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -11,16 +11,16 @@ // Contributors: // // Description: -// Class implementation of the drive publishing classes - +// Class implementation of the drive publishing classes - // RDriveMediaErrorPublisher, -// RDriveStateChangedPublisher, +// RDriveStateChangedPublisher, // CDriveTransferPublisher, // CDriveWriteTransferPublisher, // CDriveReadTransferPublisher, // CUsbTransferPublisher, // CUsbReadTransferPublisher, // CUsbReadTransferPublisher. -// +// // /** @@ -28,42 +28,48 @@ @internalTechnology */ -#include "massstoragedebug.h" + #include "drivepublisher.h" #include "drivemanager.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "drivepublisherTraces.h" +#endif -// + + +// // Use Lookup table to translate from the internal pair of state variables // to the externally published drive state code. // -LOCAL_D const TUint8 table[][5] = +static const TUint8 table[][5] = { //TMountState=EDisconnected - {EUsbMsDriveState_Disconnected, - EUsbMsDriveState_Disconnected, - EUsbMsDriveState_Disconnected, - EUsbMsDriveState_Disconnected, - EUsbMsDriveState_Disconnected}, + {EUsbMsDriveState_Disconnected, + EUsbMsDriveState_Disconnected, + EUsbMsDriveState_Disconnected, + EUsbMsDriveState_Disconnected, + EUsbMsDriveState_Disconnected}, //TMountState=EConnecting - {EUsbMsDriveState_Connecting, - EUsbMsDriveState_Connecting, - EUsbMsDriveState_Connecting, - EUsbMsDriveState_Connecting, - EUsbMsDriveState_Connecting}, + {EUsbMsDriveState_Connecting, + EUsbMsDriveState_Connecting, + EUsbMsDriveState_Connecting, + EUsbMsDriveState_Connecting, + EUsbMsDriveState_Connecting}, //TMountState=EConnected - //EIdle,EActive,ELocked,EMediaNotPresent,EErrDisMounted - {EUsbMsDriveState_Connected, - EUsbMsDriveState_Active, - EUsbMsDriveState_Locked, - EUsbMsDriveState_MediaNotPresent, - EUsbMsDriveState_Removed}, + //EIdle,EActive,ELocked,EMediaNotPresent,EErrDisMounted + {EUsbMsDriveState_Connected, + EUsbMsDriveState_Active, + EUsbMsDriveState_Locked, + EUsbMsDriveState_MediaNotPresent, + EUsbMsDriveState_Removed}, //TMountState=EDisconnecting - {EUsbMsDriveState_Disconnecting, - EUsbMsDriveState_Disconnecting, - EUsbMsDriveState_Disconnecting, - EUsbMsDriveState_Disconnecting, - EUsbMsDriveState_Disconnecting} + {EUsbMsDriveState_Disconnecting, + EUsbMsDriveState_Disconnecting, + EUsbMsDriveState_Disconnecting, + EUsbMsDriveState_Disconnecting, + EUsbMsDriveState_Disconnecting} }; @@ -72,29 +78,25 @@ Constructor */ RDriveMediaErrorPublisher::RDriveMediaErrorPublisher() - { - __FNLOG("RDriveMediaErrorPublisher::RDriveMediaErrorPublisher()"); - - _LIT_SECURITY_POLICY_PASS(KMassStorageReadPolicy); - _LIT_SECURITY_POLICY_S0(KMassStorageWritePolicy, KUsbMsDriveState_Category.iUid); + { + _LIT_SECURITY_POLICY_PASS(KMassStorageReadPolicy); + _LIT_SECURITY_POLICY_S0(KMassStorageWritePolicy, KUsbMsDriveState_Category.iUid); - TInt result = RProperty::Define(EUsbMsDriveState_MediaError, RProperty::EInt, - KMassStorageReadPolicy, KMassStorageWritePolicy); - - __ASSERT_DEBUG(result == KErrAlreadyExists || result == KErrNone, User::Invariant()); - - result = iMediaErrorProperty.Attach(KUsbMsDriveState_Category, EUsbMsDriveState_MediaError); - __ASSERT_DEBUG(result == KErrNone, User::Invariant()); - } + TInt result = RProperty::Define(EUsbMsDriveState_MediaError, RProperty::EInt, + KMassStorageReadPolicy, KMassStorageWritePolicy); + + __ASSERT_DEBUG(result == KErrAlreadyExists || result == KErrNone, User::Invariant()); + + result = iMediaErrorProperty.Attach(KUsbMsDriveState_Category, EUsbMsDriveState_MediaError); + __ASSERT_DEBUG(result == KErrNone, User::Invariant()); + } RDriveMediaErrorPublisher::~RDriveMediaErrorPublisher() - { - __FNLOG("RDriveStatePublisher::~RDriveStatePublisher()"); - - iMediaErrorProperty.Close(); - RProperty::Delete(KUsbMsDriveState_Category, EUsbMsDriveState_MediaError); - } + { + iMediaErrorProperty.Close(); + RProperty::Delete(KUsbMsDriveState_Category, EUsbMsDriveState_MediaError); + } /** Publishing method @@ -104,17 +106,16 @@ @param aError ETrue if drive media has an error else EFalse for no error */ void RDriveMediaErrorPublisher::PublishError(TBool aError) - { - __PRINT1(_L("<< RDriveMediaErrorPublisher::PublishError %x"), aError); - - TInt oldValue; - iMediaErrorProperty.Get(oldValue); + { + OstTraceFunctionEntry0(DRIVEPUBLISHER_100); + TInt oldValue; + iMediaErrorProperty.Get(oldValue); - if (oldValue != aError) - { - User::LeaveIfError(iMediaErrorProperty.Set(aError)); - } - } + if (oldValue != aError) + { + User::LeaveIfError(iMediaErrorProperty.Set(aError)); + } + } //---------------------------------------------------------------------------- /** @@ -124,70 +125,64 @@ @param aDriveMap */ RDriveStateChangedPublisher::RDriveStateChangedPublisher(TRefMsDriveList aDrives, - TRefDriveMap aDriveMap) - : - iDrives(aDrives), - iDriveMap(aDriveMap) - { - __FNLOG("RDriveStateChangedPublisher::RDriveStateChangedPublisher()"); + TRefDriveMap aDriveMap) + : + iDrives(aDrives), + iDriveMap(aDriveMap) + { + _LIT_SECURITY_POLICY_PASS(KMassStorageReadPolicy); + _LIT_SECURITY_POLICY_S0(KMassStorageWritePolicy, KUsbMsDriveState_Category.iUid); - _LIT_SECURITY_POLICY_PASS(KMassStorageReadPolicy); - _LIT_SECURITY_POLICY_S0(KMassStorageWritePolicy, KUsbMsDriveState_Category.iUid); - - TInt result = RProperty::Define(KUsbMsDriveState_Category, - EUsbMsDriveState_DriveStatus, RProperty::EByteArray, - KMassStorageReadPolicy, KMassStorageWritePolicy, - KUsbMsMaxDrives*2); - __ASSERT_DEBUG(result == KErrAlreadyExists || result == KErrNone, User::Invariant()); - result = result; // remove urel warning - } + TInt result = RProperty::Define(KUsbMsDriveState_Category, + EUsbMsDriveState_DriveStatus, RProperty::EByteArray, + KMassStorageReadPolicy, KMassStorageWritePolicy, + KUsbMsMaxDrives*2); + __ASSERT_DEBUG(result == KErrAlreadyExists || result == KErrNone, User::Invariant()); + result = result; // remove urel warning + } RDriveStateChangedPublisher::~RDriveStateChangedPublisher() - { - __FNLOG("RDriveStateChangedPublisher::~RDriveStateChangedPublisher()"); - - RProperty::Delete(KUsbMsDriveState_Category, EUsbMsDriveState_DriveStatus); - } + { + RProperty::Delete(KUsbMsDriveState_Category, EUsbMsDriveState_DriveStatus); + } /** Publishing method -Sends a property event on behalf of CMassStorageDrive, with the mountstate and drivestate +Sends a property event on behalf of CMassStorageDrive, with the mountstate and drivestate values encoded into one 32-bit word. */ void RDriveStateChangedPublisher::DriveStateChanged() - { - __FNLOG("RDriveStateChangedPublisher::DriveStateChanged"); - - - TUsbMsDrivesStatus allDrivesStatus; - for(TUint8 i=0; iMountState(); - CMassStorageDrive::TDriveState ds = iDrives[i]->DriveState(); - TInt driveStatus = EUsbMsDriveState_Error; - if((TUint8)ds < sizeof(table[0]) && (TUint8)ms < sizeof(table)/sizeof(table[0])) - { - driveStatus = table[ms][ds]; - __PRINT3(_L("ms=%d ds=%d %d"), ms, ds, driveStatus); - } - allDrivesStatus.Append(driveStatus); - } + CMassStorageDrive::TMountState ms = iDrives[i]->MountState(); + CMassStorageDrive::TDriveState ds = iDrives[i]->DriveState(); + TInt driveStatus = EUsbMsDriveState_Error; + if((TUint8)ds < sizeof(table[0]) && (TUint8)ms < sizeof(table)/sizeof(table[0])) + { + driveStatus = table[ms][ds]; + OstTraceExt3(TRACE_SMASSSTORAGE_DRIVE, DRIVEPUBLISHER_110, + "ms=%d ds=%d %d", ms, ds, driveStatus); + } + allDrivesStatus.Append(driveStatus); + } - __PRINT1(_L("Publishing EUsbMsDriveState_DriveStatus for %d drives\n"), - allDrivesStatus.Length()/2); + OstTrace1(TRACE_SMASSSTORAGE_DRIVE, DRIVEPUBLISHER_111, + "Publishing EUsbMsDriveState_DriveStatus for %d drives", allDrivesStatus.Length()/2); - if(KErrNone != RProperty::Set(KUsbMsDriveState_Category, - EUsbMsDriveState_DriveStatus, - allDrivesStatus)) - { - __ASSERT_DEBUG(EFalse,User::Invariant()); - } - } + if(KErrNone != RProperty::Set(KUsbMsDriveState_Category, + EUsbMsDriveState_DriveStatus, + allDrivesStatus)) + { + __ASSERT_DEBUG(EFalse,User::Invariant()); + } + } //---------------------------------------------------------------------------- @@ -195,60 +190,56 @@ /** Private default constructor to ensure that NewL is used -@param aSubKey +@param aSubKey @param aDrives */ CDriveTransferPublisher::CDriveTransferPublisher( - TUsbMsDriveState_Subkey aSubKey, - TRefMsDriveList aDrives) - : - iSubKey(aSubKey), - iDrives(aDrives) - { - } + TUsbMsDriveState_Subkey aSubKey, + TRefMsDriveList aDrives) + : + iSubKey(aSubKey), + iDrives(aDrives) + { + } void CDriveTransferPublisher::ConstructL() - { - __FNLOG("CDriveTransferPublisher::ConstructL"); + { + _LIT_SECURITY_POLICY_PASS(KMassStorageReadPolicy); + _LIT_SECURITY_POLICY_S0(KMassStorageWritePolicy, KUsbMsDriveState_Category.iUid); - _LIT_SECURITY_POLICY_PASS(KMassStorageReadPolicy); - _LIT_SECURITY_POLICY_S0(KMassStorageWritePolicy, KUsbMsDriveState_Category.iUid); - - TInt r = RProperty::Define(iSubKey, RProperty::EByteArray, - KMassStorageReadPolicy, KMassStorageWritePolicy, - KUsbMsMaxDrives*sizeof(TInt)); + TInt r = RProperty::Define(iSubKey, RProperty::EByteArray, + KMassStorageReadPolicy, KMassStorageWritePolicy, + KUsbMsMaxDrives*sizeof(TInt)); - if (r != KErrAlreadyExists) - { - User::LeaveIfError(r); - } + if (r != KErrAlreadyExists) + { + User::LeaveIfError(r); + } - User::LeaveIfError(iProperty.Attach(KUsbMsDriveState_Category, iSubKey)); + User::LeaveIfError(iProperty.Attach(KUsbMsDriveState_Category, iSubKey)); - // Create the EDataTransferred timer - iTimer = CPeriodic::NewL(CActive::EPriorityStandard); - iTimerRunning = EFalse; - } + // Create the EDataTransferred timer + iTimer = CPeriodic::NewL(CActive::EPriorityStandard); + iTimerRunning = EFalse; + } /** Destructor */ CDriveTransferPublisher::~CDriveTransferPublisher() - { - __FNLOG("CDriveTransferPublisher::~CDriveTransferPublisher"); + { + if(iTimer) + { + iTimer->Cancel(); + } + delete iTimer; - if(iTimer) - { - iTimer->Cancel(); - } - delete iTimer; + iProperty.Close(); - iProperty.Close(); - - RProperty::Delete(KUsbMsDriveState_Category, iSubKey); - } + RProperty::Delete(KUsbMsDriveState_Category, iSubKey); + } /** @@ -259,11 +250,10 @@ @return not used in CPeriodic callback (see TCallback) */ TInt CDriveTransferPublisher::PublishDataTransferredEvent(TAny* obj) - { - __FNLOG("CDrivePublisher::PublishDataTransferredEvent"); - static_cast(obj)->DoPublishDataTransferredEvent(); - return 1; - } + { + static_cast(obj)->DoPublishDataTransferredEvent(); + return 1; + } /** @@ -271,65 +261,63 @@ the last update. */ void CDriveTransferPublisher::DoPublishDataTransferredEvent() - { - if (PublishDataTransferred()) - { - // some data has been transfered so reset the counter - iTimerCancelCnt = ETimerCancelDelay; - } + { + if (PublishDataTransferred()) + { + // some data has been transfered so reset the counter + iTimerCancelCnt = ETimerCancelDelay; + } - // Update the cancel count if no data was transferred the last - // (few) times this has been called - if (--iTimerCancelCnt == 0) - { - StopTimer(); - iTimerCancelCnt = ETimerCancelDelay; - } - } + // Update the cancel count if no data was transferred the last + // (few) times this has been called + if (--iTimerCancelCnt == 0) + { + StopTimer(); + iTimerCancelCnt = ETimerCancelDelay; + } + } /** -Update the data transferred properties if the counts have changed since +Update the data transferred properties if the counts have changed since the last update. */ TBool CDriveTransferPublisher::PublishDataTransferred() - { - __FNLOG("CDriveWriteTransferPublisher::PublishDataTransferred"); - - TUsbMsBytesTransferred bytesTransferred; - TBool dataTransferred = EFalse; + { + TUsbMsBytesTransferred bytesTransferred; + TBool dataTransferred = EFalse; - for (TInt i=0; i < iDrives.Count() && iDrives[i]; i++) - { - bytesTransferred[i] = GetBytesTransferred(i); - } + for (TInt i=0; i < iDrives.Count() && iDrives[i]; i++) + { + bytesTransferred[i] = GetBytesTransferred(i); + } - // Update the properties only if they have changed - // (or if there's an error reading the old value.) - // Possible optimisation: keep a copy of the value - // as a member variable so we don't need the Get. - TUsbMsBytesTransferred oldValue; + // Update the properties only if they have changed + // (or if there's an error reading the old value.) + // Possible optimisation: keep a copy of the value + // as a member variable so we don't need the Get. + TUsbMsBytesTransferred oldValue; - if ((iProperty.Get(oldValue) != KErrNone) || (oldValue != bytesTransferred)) - { + if ((iProperty.Get(oldValue) != KErrNone) || (oldValue != bytesTransferred)) + { #ifdef __PRINT3 - for (TInt j=0; j < iDrives.Count() && iDrives[j]; j++) - { - if(oldValue[j] != bytesTransferred[j]) - { - __PRINT3(_L("CDrivePublisher: KBytes[%d] %d->%d\n"), j, oldValue[j], bytesTransferred[j]); - } - } + for (TInt j=0; j < iDrives.Count() && iDrives[j]; j++) + { + if(oldValue[j] != bytesTransferred[j]) + { + __PRINT3(_L("CDrivePublisher: KBytes[%d] %d->%d\n"), j, oldValue[j], bytesTransferred[j]); + } + } #endif - if (KErrNone != iProperty.Set(bytesTransferred)) - { - __ASSERT_DEBUG(EFalse, User::Invariant()); - } - dataTransferred = ETrue; - } + if (KErrNone != iProperty.Set(bytesTransferred)) + { + __ASSERT_DEBUG(EFalse, User::Invariant()); + } + dataTransferred = ETrue; + } - return dataTransferred; - } + return dataTransferred; + } /** @@ -337,35 +325,31 @@ If the timer is not yet running then start it. */ void CDriveTransferPublisher::StartTimer() - { - __FNLOG("CDrivePublisher::StartTimer"); - - if (!iTimerRunning) - { - // EDataTransferred event every second - const TTimeIntervalMicroSeconds32 interval = 1 * 1000 * 1000; - TCallBack callback(PublishDataTransferredEvent, this); - __PRINT(_L("Starting timer")); - iTimer->Start(interval, interval, callback); - iTimerRunning = ETrue; - } - } + { + if (!iTimerRunning) + { + // EDataTransferred event every second + const TTimeIntervalMicroSeconds32 interval = 1 * 1000 * 1000; + TCallBack callback(PublishDataTransferredEvent, this); + OstTrace0(TRACE_SMASSSTORAGE_DRIVE, DRIVEPUBLISHER_140, "Starting timer"); + iTimer->Start(interval, interval, callback); + iTimerRunning = ETrue; + } + } /** Ensure that the Timer is stopped */ void CDriveTransferPublisher::StopTimer() - { - __FNLOG("CDrivePublisher::StopTimer"); - - if (iTimerRunning) - { - __PRINT(_L("Stopping timer")); - iTimer->Cancel(); - iTimerRunning = EFalse; - } - } + { + if (iTimerRunning) + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVE, DRIVEPUBLISHER_141, "Stopping timer"); + iTimer->Cancel(); + iTimerRunning = EFalse; + } + } //---------------------------------------------------------------------------- @@ -375,15 +359,13 @@ @param aDrives */ CDriveWriteTransferPublisher* CDriveWriteTransferPublisher::NewL(TRefMsDriveList aDrives) - { - __FNLOG("CDriveWriteTransferPublisher::NewL"); - - CDriveWriteTransferPublisher* self = new (ELeave) CDriveWriteTransferPublisher(aDrives); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } + { + CDriveWriteTransferPublisher* self = new (ELeave) CDriveWriteTransferPublisher(aDrives); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } /** @@ -392,10 +374,10 @@ @param aDrives */ CDriveWriteTransferPublisher::CDriveWriteTransferPublisher(TRefMsDriveList aDrives) - : - CDriveTransferPublisher(EUsbMsDriveState_KBytesWritten, aDrives) - { - } + : + CDriveTransferPublisher(EUsbMsDriveState_KBytesWritten, aDrives) + { + } /** @@ -404,9 +386,9 @@ @param aLun */ TUint CDriveWriteTransferPublisher::GetBytesTransferred(TUint aLun) const - { - return iDrives[aLun]->KBytesWritten(); - } + { + return iDrives[aLun]->KBytesWritten(); + } //---------------------------------------------------------------------------- @@ -416,15 +398,13 @@ @param aDrives */ CDriveReadTransferPublisher* CDriveReadTransferPublisher::NewL(TRefMsDriveList aDrives) - { - __FNLOG("CDriveWriteTransferPublisher::NewL"); - - CDriveReadTransferPublisher* self = new (ELeave) CDriveReadTransferPublisher(aDrives); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } + { + CDriveReadTransferPublisher* self = new (ELeave) CDriveReadTransferPublisher(aDrives); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } /** @@ -433,10 +413,10 @@ @param aDrives */ CDriveReadTransferPublisher::CDriveReadTransferPublisher(TRefMsDriveList aDrives) - : - CDriveTransferPublisher(EUsbMsDriveState_KBytesRead, aDrives) - { - } + : + CDriveTransferPublisher(EUsbMsDriveState_KBytesRead, aDrives) + { + } /** @@ -445,72 +425,68 @@ @param aLun */ TUint CDriveReadTransferPublisher::GetBytesTransferred(TUint aLun) const - { - return iDrives[aLun]->KBytesRead(); - } + { + return iDrives[aLun]->KBytesRead(); + } //---------------------------------------------------------------------------- #else /** Private default constructor to ensure that NewL is used - + @param aSubKey @param aArray */ CUsbTransferPublisher::CUsbTransferPublisher( - TUsbMsDriveState_Subkey aSubKey, - TRefBytesTransferedList aArray) - : - iSubKey(aSubKey), - iArray(aArray) - { - } + TUsbMsDriveState_Subkey aSubKey, + TRefBytesTransferedList aArray) + : + iSubKey(aSubKey), + iArray(aArray) + { + } void CUsbTransferPublisher::ConstructL() - { - __FNLOG("CUsbTransferPublisher::ConstructL"); + { + _LIT_SECURITY_POLICY_PASS(KMassStorageReadPolicy); + _LIT_SECURITY_POLICY_S0(KMassStorageWritePolicy, KUsbMsDriveState_Category.iUid); - _LIT_SECURITY_POLICY_PASS(KMassStorageReadPolicy); - _LIT_SECURITY_POLICY_S0(KMassStorageWritePolicy, KUsbMsDriveState_Category.iUid); - - TInt r = RProperty::Define(iSubKey, RProperty::EByteArray, - KMassStorageReadPolicy, KMassStorageWritePolicy, - KUsbMsMaxDrives*sizeof(TInt)); + TInt r = RProperty::Define(iSubKey, RProperty::EByteArray, + KMassStorageReadPolicy, KMassStorageWritePolicy, + KUsbMsMaxDrives*sizeof(TInt)); - if (r != KErrAlreadyExists) - { - User::LeaveIfError(r); - } + if (r != KErrAlreadyExists) + { + User::LeaveIfError(r); + } - // Attach to the properties here. Only do this once, continuously attaching - // will currently cause a memory leak - User::LeaveIfError(iProperty.Attach(KUsbMsDriveState_Category, iSubKey)); + // Attach to the properties here. Only do this once, continuously attaching + // will currently cause a memory leak + User::LeaveIfError(iProperty.Attach(KUsbMsDriveState_Category, iSubKey)); - // Create the EDataTransferred timer - iTimer = CPeriodic::NewL(CActive::EPriorityStandard); - iTimerRunning = EFalse; - } + // Create the EDataTransferred timer + iTimer = CPeriodic::NewL(CActive::EPriorityStandard); + iTimerRunning = EFalse; + } /** Destructor */ CUsbTransferPublisher::~CUsbTransferPublisher() - { - __FNLOG("CUsbTransferPublisher::~CDriveTransferPublisher"); + { + if(iTimer) + { + iTimer->Cancel(); + } + delete iTimer; - if(iTimer) - { - iTimer->Cancel(); - } - delete iTimer; + iProperty.Close(); - iProperty.Close(); - - RProperty::Delete(KUsbMsDriveState_Category, iSubKey); - } + RProperty::Delete(KUsbMsDriveState_Category, iSubKey); + } /** @@ -521,11 +497,10 @@ @return not used in CPeriodic callback (see TCallback) */ TInt CUsbTransferPublisher::PublishDataTransferredEvent(TAny* obj) - { - __FNLOG("CUsbTransferPublisher::PublishDataTransferredEvent"); - static_cast(obj)->DoPublishDataTransferredEvent(); - return 1; - } + { + static_cast(obj)->DoPublishDataTransferredEvent(); + return 1; + } /** @@ -533,66 +508,64 @@ the last update. */ void CUsbTransferPublisher::DoPublishDataTransferredEvent() - { - if (PublishDataTransferred()) - { - // some data has been transfered so reset the counter - iTimerCancelCnt = ETimerCancelDelay; - } + { + if (PublishDataTransferred()) + { + // some data has been transfered so reset the counter + iTimerCancelCnt = ETimerCancelDelay; + } - // Update the cancel count if no data was transferred the last - // (few) times this has been called - if (--iTimerCancelCnt == 0) - { - StopTimer(); - iTimerCancelCnt = ETimerCancelDelay; - } - } + // Update the cancel count if no data was transferred the last + // (few) times this has been called + if (--iTimerCancelCnt == 0) + { + StopTimer(); + iTimerCancelCnt = ETimerCancelDelay; + } + } /** -Update the data transferred properties if the counts have changed since +Update the data transferred properties if the counts have changed since the last update. */ TBool CUsbTransferPublisher::PublishDataTransferred() - { - __FNLOG("CUsbWriteTransferPublisher::PublishDataTransferred"); - - TUsbMsBytesTransferred bytesTransferred; - TBool dataTransferred = EFalse; + { + TUsbMsBytesTransferred bytesTransferred; + TBool dataTransferred = EFalse; - for (TInt i = 0; i < iArray.Count(); i++) - { - bytesTransferred[i] = GetBytesTransferred(i); - } + for (TInt i = 0; i < iArray.Count(); i++) + { + bytesTransferred[i] = GetBytesTransferred(i); + } - // Update the properties only if they have changed - // (or if there's an error reading the old value.) - // Possible optimisation: keep a copy of the value - // as a member variable so we don't need the Get. - TUsbMsBytesTransferred oldValue; + // Update the properties only if they have changed + // (or if there's an error reading the old value.) + // Possible optimisation: keep a copy of the value + // as a member variable so we don't need the Get. + TUsbMsBytesTransferred oldValue; - if ((iProperty.Get(oldValue) != KErrNone) || (oldValue != bytesTransferred)) - { + if ((iProperty.Get(oldValue) != KErrNone) || (oldValue != bytesTransferred)) + { #ifdef __PRINT3 - // trace of the bytes transferred - for (TInt j=0; j < iArray.Count(); j++) - { - if(oldValue[j] != bytesTransferred[j]) - { - __PRINT3(_L("CDrivePublisher: KBytes[%d] %d->%d\n"), j, oldValue[j], bytesTransferred[j]); - } - } + // trace of the bytes transferred + for (TInt j=0; j < iArray.Count(); j++) + { + if(oldValue[j] != bytesTransferred[j]) + { + __PRINT3(_L("CDrivePublisher: KBytes[%d] %d->%d\n"), j, oldValue[j], bytesTransferred[j]); + } + } #endif - if (KErrNone != iProperty.Set(bytesTransferred)) - { - __ASSERT_DEBUG(EFalse, User::Invariant()); - } - dataTransferred = ETrue; - } + if (KErrNone != iProperty.Set(bytesTransferred)) + { + __ASSERT_DEBUG(EFalse, User::Invariant()); + } + dataTransferred = ETrue; + } - return dataTransferred; - } + return dataTransferred; + } /** @@ -600,35 +573,31 @@ If the timer is not yet running then start it. */ void CUsbTransferPublisher::StartTimer() - { - __FNLOG("CUsbTransferPublisher::StartTimer"); - - if (!iTimerRunning) - { - // EDataTransferred event every second - const TTimeIntervalMicroSeconds32 interval = 1 * 1000 * 1000; - TCallBack callback(PublishDataTransferredEvent, this); - __PRINT(_L("Starting timer")); - iTimer->Start(interval, interval, callback); - iTimerRunning = ETrue; - } - } + { + if (!iTimerRunning) + { + // EDataTransferred event every second + const TTimeIntervalMicroSeconds32 interval = 1 * 1000 * 1000; + TCallBack callback(PublishDataTransferredEvent, this); + OstTrace0(TRACE_SMASSSTORAGE_DRIVE, DRIVEPUBLISHER_120, "Starting timer"); + iTimer->Start(interval, interval, callback); + iTimerRunning = ETrue; + } + } /** Ensure that the Timer is stopped */ void CUsbTransferPublisher::StopTimer() - { - __FNLOG("CUsbTransferPublisher::StopTimer"); - - if (iTimerRunning) - { - __PRINT(_L("Stopping timer")); - iTimer->Cancel(); - iTimerRunning = EFalse; - } - } + { + if (iTimerRunning) + { + OstTrace0(TRACE_SMASSSTORAGE_DRIVE, DRIVEPUBLISHER_130, "Stopping timer"); + iTimer->Cancel(); + iTimerRunning = EFalse; + } + } //---------------------------------------------------------------------------- @@ -638,23 +607,21 @@ @param aArray */ CUsbWriteTransferPublisher* CUsbWriteTransferPublisher::NewL(TRefBytesTransferedList aArray) - { - __FNLOG("CUsbWriteTransferPublisher::NewL"); - - CUsbWriteTransferPublisher* self = new (ELeave) CUsbWriteTransferPublisher(aArray); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } + { + CUsbWriteTransferPublisher* self = new (ELeave) CUsbWriteTransferPublisher(aArray); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } CUsbWriteTransferPublisher::CUsbWriteTransferPublisher( - TRefBytesTransferedList aArray) - : - CUsbTransferPublisher(EUsbMsDriveState_KBytesWritten, aArray) - { - } + TRefBytesTransferedList aArray) + : + CUsbTransferPublisher(EUsbMsDriveState_KBytesWritten, aArray) + { + } //---------------------------------------------------------------------------- @@ -664,21 +631,19 @@ @param aArray */ CUsbReadTransferPublisher* CUsbReadTransferPublisher::NewL(TRefBytesTransferedList aArray) - { - __FNLOG("CUsbWriteTransferPublisher::NewL"); - - CUsbReadTransferPublisher* self = new (ELeave) CUsbReadTransferPublisher(aArray); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } + { + CUsbReadTransferPublisher* self = new (ELeave) CUsbReadTransferPublisher(aArray); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } CUsbReadTransferPublisher::CUsbReadTransferPublisher( - TRefBytesTransferedList aArray) - : - CUsbTransferPublisher(EUsbMsDriveState_KBytesRead, aArray) - { - } + TRefBytesTransferedList aArray) + : + CUsbTransferPublisher(EUsbMsDriveState_KBytesRead, aArray) + { + } #endif // USB_TRANSFER_PUBLISHER diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/cactivedevicestatenotifierbase.h --- a/userlibandfileserver/fileserver/smassstorage/inc/cactivedevicestatenotifierbase.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/inc/cactivedevicestatenotifierbase.h Mon Oct 11 17:54:41 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -11,59 +11,55 @@ * * Contributors: * -* Description: +* Description: * Class declaration for Device State.Notifier Base Class * */ -/** +/** @file @internalTechnology */ #ifndef CACTIVEDEVICESTATENOTIFIERBASE_H #define CACTIVEDEVICESTATENOTIFIERBASE_H -#include -#include "cbulkonlytransport.h" -#include "protocol.h" -#include "cusbmassstoragecontroller.h" class CActiveDeviceStateNotifierBase : public CActive - { + { public: - // Construction - static CActiveDeviceStateNotifierBase* NewL(CBulkOnlyTransport& aBot, + // Construction + static CActiveDeviceStateNotifierBase* NewL(CBulkOnlyTransport& aBot, MLddDeviceStateNotification& aLddDeviceStateNotification); - // Destruction - ~CActiveDeviceStateNotifierBase(); + // Destruction + ~CActiveDeviceStateNotifierBase(); - void Activate(); + void Activate(); protected: - // Construction - CActiveDeviceStateNotifierBase(CBulkOnlyTransport& aBot, + // Construction + CActiveDeviceStateNotifierBase(CBulkOnlyTransport& aBot, MLddDeviceStateNotification& aLddDeviceStateNotification); - void ConstructL(); + void ConstructL(); - // Cancel request. - // Defined as pure virtual by CActive; - // implementation provided by this class. - virtual void DoCancel(); + // Cancel request. + // Defined as pure virtual by CActive; + // implementation provided by this class. + virtual void DoCancel(); - // Service completed request. - // Defined as pure virtual by CActive; - // implementation provided by this class, - virtual void RunL(); + // Service completed request. + // Defined as pure virtual by CActive; + // implementation provided by this class, + virtual void RunL(); protected: - CBulkOnlyTransport& iBot; + CBulkOnlyTransport& iBot; MLddDeviceStateNotification& iLddDeviceStateNotification; - TUint iDeviceState; - TUint iOldDeviceState; - }; + TUint iDeviceState; + TUint iOldDeviceState; + }; #endif diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransport.h --- a/userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransport.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransport.h Mon Oct 11 17:54:41 2010 +0100 @@ -12,7 +12,7 @@ // // Description: // Class declaration for CBulkOnlyTransport. -// +// // /** @@ -24,22 +24,20 @@ #define __CBULKONLYTRANSPORT_H__ #include -#if !defined(__WINS__) && !defined(__X86__) +#if !defined(__WINS__) && !defined(__X86__) #include #endif #include -#include "protocol.h" -#include "cusbmassstoragecontroller.h" -#include "mldddevicestatenotification.h" + static const TUint KCbwLength = 31; static const TUint KCommandBufferLength = 36; -// for control endpoint +// for control endpoint static const TUint KRequestHdrSize = 8; /** size of buffer for command padding */ -static const TUint KBOTMaxBufSize = 512; +static const TUint KBOTMaxBufSize = 512; /** size of csw */ LOCAL_D const TInt KCswLength = 13; @@ -49,168 +47,168 @@ Represent Endpoint0 request */ class TUsbRequestHdr - { + { public: - enum TEp0Request - { - EReqGetMaxLun = 0xFE, - EReqReset = 0xFF - }; + enum TEp0Request + { + EReqGetMaxLun = 0xFE, + EReqReset = 0xFF + }; public: - TInt Decode(const TDesC8& aBuffer); - TBool IsDataResponseRequired() const; + TInt Decode(const TDesC8& aBuffer); + TBool IsDataResponseRequired() const; public: - TUint8 iRequestType; - TEp0Request iRequest; - TUint16 iValue; - TUint16 iIndex; - TUint16 iLength; - }; + TUint8 iRequestType; + TEp0Request iRequest; + TUint16 iValue; + TUint16 iIndex; + TUint16 iLength; + }; /** handles the data transport and communications with the SCSI protocol */ class CBulkOnlyTransport : public CActive, public MTransportBase - { + { public: - enum TCswStatus - { - ECommandPassed = 0, - ECommandFailed = 1, - EPhaseError = 2 - }; + enum TCswStatus + { + ECommandPassed = 0, + ECommandFailed = 1, + EPhaseError = 2 + }; - enum TTransportState - { - ENone, - EWaitForCBW, - ESendingCSW, - EWritingData, - EReadingData, + enum TTransportState + { + ENone, + EWaitForCBW, + ESendingCSW, + EWritingData, + EReadingData, EPermErr - }; + }; public: - static CBulkOnlyTransport* NewL(TInt aNumDrives,CUsbMassStorageController& aController, CUsbMassStorageController::TTransportldd aTransportLddFlag); - static CBulkOnlyTransport* NewL(TInt aNumDrives,CUsbMassStorageController& aController); + static CBulkOnlyTransport* NewL(TInt aNumDrives,CUsbMassStorageController& aController, CUsbMassStorageController::TTransportldd aTransportLddFlag); + static CBulkOnlyTransport* NewL(TInt aNumDrives,CUsbMassStorageController& aController); protected: ~CBulkOnlyTransport(); - CBulkOnlyTransport(TInt aNumDrives,CUsbMassStorageController& aController); + CBulkOnlyTransport(TInt aNumDrives,CUsbMassStorageController& aController); public: - TInt InitialiseTransportL(TInt aTransportLddFlag); + TInt InitialiseTransportL(TInt aTransportLddFlag); - TInt Start(); - TInt Stop(); - void RegisterProtocol(MProtocolBase& aProtocol); + TInt Start(); + TInt Stop(); + void RegisterProtocol(MProtocolBase& aProtocol); - CUsbMassStorageController& Controller(); - TInt MaxLun(); - void SetupReadData(TUint aLength); - void SetupWriteData(TPtrC8& aData); + CUsbMassStorageController& Controller(); + TInt MaxLun(); + void SetupReadData(TUint aLength); + void SetupWriteData(TPtrC8& aData); - void GetCommandBufPtr(TPtr8& aDes, TUint aLength); // Ptr to iCommandBuf to send responses to commands - void GetReadDataBufPtr(TPtr8& aDes); // Ptr to DataBuf's - void GetWriteDataBufPtr(TPtrC8& aDes); + void GetCommandBufPtr(TPtr8& aDes, TUint aLength); // Ptr to iCommandBuf to send responses to commands + void GetReadDataBufPtr(TPtr8& aDes); // Ptr to DataBuf's + void GetWriteDataBufPtr(TPtrC8& aDes); #ifdef MSDC_MULTITHREADED - void ProcessReadData(TAny* aAddress); + void ProcessReadData(TAny* aAddress); #endif - TInt HwStart(TBool aDiscard = EFalse); - TInt HwStop(); + TInt HwStart(TBool aDiscard = EFalse); + TInt HwStop(); void StopBulkOnlyEndpoint(); - TInt HwSuspend(); - TInt HwResume(); + TInt HwSuspend(); + TInt HwResume(); - virtual void RunL(); - virtual void DoCancel(); + virtual void RunL(); + virtual void DoCancel(); - virtual TInt SetupConfigurationDescriptor(TBool aUnset = EFalse) = 0; - virtual TInt SetupInterfaceDescriptors() = 0; - virtual void ReleaseInterface() = 0; - virtual void CancelControlInterface() = 0; - virtual TInt StartControlInterface() = 0; - virtual void ActivateDeviceStateNotifier() = 0; - virtual void CancelDeviceStateNotifier() = 0; - virtual void CancelReadWriteRequests() = 0; - virtual void AllocateEndpointResources() = 0; - virtual TInt GetDeviceStatus(TUsbcDeviceState& deviceStatus) = 0; - virtual void FlushData() = 0; - virtual void ReadAndDiscardData(TInt aBytes) = 0; - virtual void ReadCBW() = 0; - virtual void ExpireData(TAny* aAddress = NULL) = 0; - virtual void ProcessCbwEvent() = 0; - virtual void StallEndpointAndWaitForClear() = 0; - virtual void ReadData(TUint aLength = 0) = 0; - virtual void WriteUsb(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired = EFalse) = 0; - virtual void SetCbwPtr() = 0; - virtual TPtr8& SetCommandBufPtr(TUint aLength) = 0; // pointer to buf for sending responses to commands - virtual TPtr8& SetDataBufPtr() = 0; // to swap between the two buffers - virtual void SetPaddingBufPtr(TUint aLength) = 0; - virtual void SetCswBufPtr(TUint aLength) = 0; - virtual void ProcessReadingDataEvent() = 0; - virtual void DiscardData(TUint aLength) = 0; - virtual void WriteToClient(TUint aLength) = 0; - virtual void SetReadDataBufPtr( TUint aLength) = 0; + virtual TInt SetupConfigurationDescriptor(TBool aUnset = EFalse) = 0; + virtual TInt SetupInterfaceDescriptors() = 0; + virtual void ReleaseInterface() = 0; + virtual void CancelControlInterface() = 0; + virtual TInt StartControlInterface() = 0; + virtual void ActivateDeviceStateNotifier() = 0; + virtual void CancelDeviceStateNotifier() = 0; + virtual void CancelReadWriteRequests() = 0; + virtual void AllocateEndpointResources() = 0; + virtual TInt GetDeviceStatus(TUsbcDeviceState& deviceStatus) = 0; + virtual void FlushData() = 0; + virtual void ReadAndDiscardData(TInt aBytes) = 0; + virtual void ReadCBW() = 0; + virtual void ExpireData(TAny* aAddress = NULL) = 0; + virtual void ProcessCbwEvent() = 0; + virtual void StallEndpointAndWaitForClear() = 0; + virtual void ReadData(TUint aLength = 0) = 0; + virtual void WriteUsb(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired = EFalse) = 0; + virtual void SetCbwPtr() = 0; + virtual TPtr8& SetCommandBufPtr(TUint aLength) = 0; // pointer to buf for sending responses to commands + virtual TPtr8& SetDataBufPtr() = 0; // to swap between the two buffers + virtual void SetPaddingBufPtr(TUint aLength) = 0; + virtual void SetCswBufPtr(TUint aLength) = 0; + virtual void ProcessReadingDataEvent() = 0; + virtual void DiscardData(TUint aLength) = 0; + virtual void WriteToClient(TUint aLength) = 0; + virtual void SetReadDataBufPtr( TUint aLength) = 0; #ifdef MSDC_MULTITHREADED - virtual void GetBufferPointers(TPtr8& aDes1, TPtr8& aDes2) = 0; + virtual void GetBufferPointers(TPtr8& aDes1, TPtr8& aDes2) = 0; #endif protected: - void DecodeCBW(); - TBool CheckCBW(); - void SetPermError(); - void SendCSW(TUint aTag, TUint aDataResidue, TCswStatus aStatus); - void WriteData(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired = EFalse); + void DecodeCBW(); + TBool CheckCBW(); + void SetPermError(); + void SendCSW(TUint aTag, TUint aDataResidue, TCswStatus aStatus); + void WriteData(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired = EFalse); - void CallReadAndDiscardData(TInt aBytes); - void Activate(TInt aReason); + void CallReadAndDiscardData(TInt aBytes); + void Activate(TInt aReason); protected: - /** maximun logic unit number supported (started from 0*/ - TInt iMaxLun; + /** maximun logic unit number supported (started from 0*/ + TInt iMaxLun; - CUsbMassStorageController& iController; + CUsbMassStorageController& iController; - MProtocolBase* iProtocol; + MProtocolBase* iProtocol; - TTransportState iCurrentState; + TTransportState iCurrentState; - /** Shows how much data was not send/received */ - TUint32 iDataResidue; - TUint32 iCbwTag; - TCswStatus iCmdStatus; + /** Shows how much data was not send/received */ + TUint32 iDataResidue; + TUint32 iCbwTag; + TCswStatus iCmdStatus; - /** Indicate if SCSI prot has data to sent */ - TBool iWriteSetUp; + /** Indicate if SCSI prot has data to sent */ + TBool iWriteSetUp; - /** Indicate if SCSI prot expected additional data */ - TBool iReadSetUp; + /** Indicate if SCSI prot expected additional data */ + TBool iReadSetUp; - /** Indicate whether SCSI prot started or not */ - TBool iStarted; + /** Indicate whether SCSI prot started or not */ + TBool iStarted; - TBool iStallAllowed; + TBool iStallAllowed; - TBool iInterfaceConfigured; + TBool iInterfaceConfigured; - TPtr8 iCommandBufPtr; // Ptr to buffer to write responses to commands - TPtr8 iDataBufPtr; - TPtr8 iCswBufPtr; - TPtr8 iPaddingBufPtr; + TPtr8 iCommandBufPtr; // Ptr to buffer to write responses to commands + TPtr8 iDataBufPtr; + TPtr8 iCswBufPtr; + TPtr8 iPaddingBufPtr; - /** Size of data, Used to tell transport how much protocol/media has to send */ - TUint iBufSize; + /** Size of data, Used to tell transport how much protocol/media has to send */ + TUint32 iBufSize; - TPtrC8 iWriteBufPtr; + TPtrC8 iWriteBufPtr; - TPtr8 iReadBufPtr; + TPtr8 iReadBufPtr; - /** Internal TPtr to check validity of and decode CBW */ - TPtrC8 iCbwBufPtr; - }; + /** Internal TPtr to check validity of and decode CBW */ + TPtrC8 iCbwBufPtr; + }; #endif // __CBULKONLYTRANSPORT_H__ diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransportusbcldd.h --- a/userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransportusbcldd.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransportusbcldd.h Mon Oct 11 17:54:41 2010 +0100 @@ -28,9 +28,6 @@ #include "cbulkonlytransport.h" #include "cactivedevicestatenotifierbase.h" -// Maximum size for SCSI Read10 Write10 and Verify10 commands -// Windows requests size of 64K whereas MAC requests size of 128K -static const TUint32 KMaxBufSize = 128 * 1024; //Forward Declaration class CBulkOnlyTransportUsbcLdd; @@ -138,11 +135,8 @@ TBuf8 iCommandBuf; // For Responses to commands - TBuf8 iDataBuf1; // For data transfers (Reading and Writing) + TBulkMm iBulkMm; - TBuf8 iDataBuf2; - - TBool iSwap; /** internal buffer for CSW */ TBuf8 iCswBuf; diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/cusbmassstoragecontroller.h --- a/userlibandfileserver/fileserver/smassstorage/inc/cusbmassstoragecontroller.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/inc/cusbmassstoragecontroller.h Mon Oct 11 17:54:41 2010 +0100 @@ -12,7 +12,7 @@ // // Description: // Class declaration for CUsbMassStorageController. -// +// // /** @@ -23,11 +23,10 @@ #ifndef __CUSBMASSSTORAGECONTROLLER_H__ #define __CUSBMASSSTORAGECONTROLLER_H__ -#include -#include -#include "drivemanager.h" -#include "cusbmassstorageserver.h" -#include "protocol.h" + +class MTransportBase; +class MProtocolBase; +class CUsbMassStorageServer; /** Mass Storage Controller class. @@ -35,25 +34,25 @@ Its main purpose is to instantiate and initialize these objects. */ class CUsbMassStorageController : public CBase - { - public: - ~CUsbMassStorageController(); - void CreateL(RArray& aDriveMapping); - CDriveManager& DriveManager(); - TInt Start(TMassStorageConfig& aConfig); - TInt Stop(); - void Reset(); - void GetTransport(MTransportBase* &aTransport); - enum TTransportldd {EUsbc = 1, EUsbcsc}; - - private: - CDriveManager* iDriveManager; - MTransportBase* iTransport; - MProtocolBase* iProtocol; - CUsbMassStorageServer* iServer; - TMassStorageConfig iConfig; - TInt iMaxDrives; - TTransportldd iTransportLddFlag; - }; + { +public: + ~CUsbMassStorageController(); + void CreateL(RArray& aDriveMapping); + CDriveManager& DriveManager(); + TInt Start(TMassStorageConfig& aConfig); + TInt Stop(); + void Reset(); + void GetTransport(MTransportBase* &aTransport); + enum TTransportldd {EUsbc = 1, EUsbcsc}; + +private: + CDriveManager* iDriveManager; + MTransportBase* iTransport; + MProtocolBase* iProtocol; + CUsbMassStorageServer* iServer; + TMassStorageConfig iConfig; + TInt iMaxDrives; + TTransportldd iTransportLddFlag; + }; #endif //__CUSBMASSSTORAGECONTROLLER_H__ diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/cusbmassstorageserver.h --- a/userlibandfileserver/fileserver/smassstorage/inc/cusbmassstorageserver.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/inc/cusbmassstorageserver.h Mon Oct 11 17:54:41 2010 +0100 @@ -12,7 +12,7 @@ // // Description: // Implements a Symbian OS server that exposes the RUsbMassStorage API -// +// // /** @@ -23,21 +23,6 @@ #ifndef __CUSBMASSSTORAGESERVER_H__ #define __CUSBMASSSTORAGESERVER_H__ -#include "massstoragedebug.h" - - -_LIT(KUsbMsSvrPncCat, "CUsbMsServer"); - -enum TUsbPanicServer - { - EMsCBulkOnlyTransportNull = 300, - EMsCDeviceStateNotifierNull, - EMsClientInvalidSessCount, - EMsControlInterfaceBadState, - EMsControlInterfaceStillActive, - EMsBulkOnlyStillActive, - EMsWrongEndpoint - }; // // Forward declarations @@ -49,28 +34,28 @@ Implements a Symbian OS server that exposes the RUsbMassStorage API */ class CUsbMassStorageServer : public CPolicyServer - { + { public: - static CUsbMassStorageServer* NewLC(CUsbMassStorageController& aController); - virtual ~CUsbMassStorageServer(); + static CUsbMassStorageServer* NewLC(CUsbMassStorageController& aController); + virtual ~CUsbMassStorageServer(); - virtual CSession2* NewSessionL(const TVersion &aVersion, const RMessage2& aMessage) const; - void Error(TInt aError); + virtual CSession2* NewSessionL(const TVersion &aVersion, const RMessage2& aMessage) const; + void Error(TInt aError); - inline CUsbMassStorageController& Controller() const; + inline CUsbMassStorageController& Controller() const; - void IncrementSessionCount(); - void DecrementSessionCount(); - inline TInt SessionCount() const; + void IncrementSessionCount(); + void DecrementSessionCount(); + inline TInt SessionCount() const; protected: - CUsbMassStorageServer(CUsbMassStorageController& aController); - void ConstructL(); - + CUsbMassStorageServer(CUsbMassStorageController& aController); + void ConstructL(); + private: - CUsbMassStorageController& iController; - TInt iSessionCount; - }; + CUsbMassStorageController& iController; + TInt iSessionCount; + }; #include "cusbmassstorageserver.inl" diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/cusbmassstoragesession.h --- a/userlibandfileserver/fileserver/smassstorage/inc/cusbmassstoragesession.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/inc/cusbmassstoragesession.h Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -12,7 +12,7 @@ // // Description: // Implements a Session of a Symbian OS server for the RUsbMassStorage API -// +// // /** @@ -23,10 +23,6 @@ #ifndef __CUSBMASSSTORAGESESSION_H__ #define __CUSBMASSSTORAGESESSION_H__ -#include -#include -#include "massstoragedebug.h" -#include "usbmsshared.h" _LIT(KUsbMsCliPncCat, "UsbMs-Client"); @@ -44,29 +40,29 @@ Implements a Session of a Symbian OS server for the RUsbMassStorage API */ class CUsbMassStorageSession : public CSession2 - { + { public: - static CUsbMassStorageSession* NewL(CUsbMassStorageServer& aServer); - virtual ~CUsbMassStorageSession(); + static CUsbMassStorageSession* NewL(CUsbMassStorageServer& aServer); + virtual ~CUsbMassStorageSession(); - // CSession - virtual void ServiceL(const RMessage2& aMessage); + // CSession + virtual void ServiceL(const RMessage2& aMessage); protected: - CUsbMassStorageSession(CUsbMassStorageServer& aServer); - void ConstructL(); + CUsbMassStorageSession(CUsbMassStorageServer& aServer); + void ConstructL(); - void DispatchMessageL(const RMessage2& aMessage); - TInt Start(const RMessage2& aMessage); - TInt Stop(); - TInt Shutdown(); + void DispatchMessageL(const RMessage2& aMessage); + TInt Start(const RMessage2& aMessage); + TInt Stop(); + TInt Shutdown(); private: - void GetMsConfigL(const RMessage2& aMessage, TMassStorageConfig& aMsStorage); - + void GetMsConfigL(const RMessage2& aMessage, TMassStorageConfig& aMsStorage); + private: - CUsbMassStorageServer& iUsbMsServer; - }; + CUsbMassStorageServer& iUsbMsServer; + }; #endif //__CUSBMASSSTORAGESESSION_H__ diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/massstoragedebug.h --- a/userlibandfileserver/fileserver/smassstorage/inc/massstoragedebug.h Wed Oct 06 17:13:14 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/** -* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* Class declaration for MassStorageDebug -* -* -*/ - - - -/** - @file -*/ - -#ifndef __MASSSTORAGEDEBUG_H__ -#define __MASSSTORAGEDEBUG_H__ - -#include -#include - -//#define _USBMS_DEBUG_PRINT_ - -// Display some info during IN double-buffering -//#define PRINT_MSDC_MULTITHREADED_READ_INFO - - -#if defined(_USBMS_DEBUG_PRINT_) && (defined(_DEBUG) || defined(_DEBUG_RELEASE)) -#define __PRINT(t) {RDebug::Print(t);} -#define __PRINT1(t,a) {RDebug::Print(t,a);} -#define __PRINT2(t,a,b) {RDebug::Print(t,a,b);} -#define __PRINT3(t,a,b,c) {RDebug::Print(t,a,b,c);} -#define __PRINT4(t,a,b,c,d) {RDebug::Print(t,a,b,c,d);} -#define __PRINT5(t,a,b,c,d,e) {RDebug::Print(t,a,b,c,d,e);} -#define __PRINT8BIT1(t,a) {TFileName temp;temp.Copy(a);RDebug::Print(t,&temp);} -#define __PRINT1TEMP(t,a) {TBuftemp(a);RDebug::Print(t,&temp);} -#define __PRINTERR(txt, err) {if(KErrNone != err) __PRINT1(txt, err);} - -_LIT(KMsgIn, ">>%S\n"); -_LIT(KMsgOut,"<<%S\n"); - -class TMSLogFn -{ - protected: - TBuf<100> iName; - - public: - TMSLogFn(const TDesC& aName){iName = aName; RDebug::Print(KMsgIn, &iName);}; - ~TMSLogFn(){RDebug::Print(KMsgOut, &iName);}; -}; - -#define __FNLOG(name) TMSLogFn __fn_log__(_L(name)) - -#else -#define __PRINT(t) -#define __PRINT1(t,a) -#define __PRINT2(t,a,b) -#define __PRINT3(t,a,b,c) -#define __PRINT4(t,a,b,c,d) -#define __PRINT5(t,a,b,c,d,e) -#define __PRINT8BIT1(t,a) -#define __PRINT1TEMP(t,a) -#define __PRINTERR(txt,err) -#define __FNLOG(name) -#endif - -#endif // __MASSSTORAGEDEBUG_H__ diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/mprotocol.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/smassstorage/inc/mprotocol.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,48 @@ +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalTechnology +*/ + +#ifndef MPROTOCOL_H +#define MPROTOCOL_H + +#include // C Class Definitions, Cleanup Stack +#include // T Type Definitions +#include // ELeave definition +#include "usbmsshared.h" + + +class MTransportBase; + +class MProtocolBase + { + public: + virtual void RegisterTransport(MTransportBase* aTransport) = 0; + virtual TBool DecodePacket(TPtrC8& aData, TUint aLun) = 0; + virtual TInt ReadComplete(TInt aError) = 0; + virtual TInt Cancel() = 0; + virtual void ReportHighSpeedDevice() {}; + virtual ~MProtocolBase() {}; +#ifdef MSDC_MULTITHREADED + virtual void InitializeBufferPointers(TPtr8& aDes1, TPtr8& aDes2) = 0; +#endif + }; + + +#endif // __PROTOCOL_H__ + diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/mtransport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/smassstorage/inc/mtransport.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,48 @@ +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalTechnology +*/ + +#ifndef MTRANSPORT_H +#define MTRANSPORT_H + + +class MProtocolBase; + +class MTransportBase + { + public: + virtual void SetupWriteData(TPtrC8& aData) = 0; + virtual TInt Start() = 0; + virtual TInt Stop() = 0; + virtual void RegisterProtocol(MProtocolBase& aProtocol) = 0; + virtual TInt BytesAvailable() = 0; + virtual ~MTransportBase() {}; + virtual TInt InitialiseTransportL(TInt aTransportLddFlag) = 0; + virtual void SetupReadData(TUint aLength) = 0; + virtual void GetCommandBufPtr(TPtr8& aDes, TUint aLength) = 0; + virtual void GetReadDataBufPtr(TPtr8& aDes) = 0; + virtual void GetWriteDataBufPtr(TPtrC8& aDes) = 0; +#ifdef MSDC_MULTITHREADED + virtual void ProcessReadData(TAny* aAddress) = 0; +#endif + }; + + +#endif // MTRANSPORT_H + diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/protocol.h --- a/userlibandfileserver/fileserver/smassstorage/inc/protocol.h Wed Oct 06 17:13:14 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// - -/** - @file - @internalTechnology -*/ - -#ifndef __PROTOCOL_H__ -#define __PROTOCOL_H__ - -#include // C Class Definitions, Cleanup Stack -#include // T Type Definitions -#include // ELeave definition -#include "usbmsshared.h" - - -class MProtocolBase; - -class MTransportBase - { - public: - virtual void SetupWriteData(TPtrC8& aData) = 0; - virtual TInt Start() = 0; - virtual TInt Stop() = 0; - virtual void RegisterProtocol(MProtocolBase& aProtocol) = 0; - virtual TInt BytesAvailable() = 0; - virtual ~MTransportBase() {}; - virtual TInt InitialiseTransportL(TInt aTransportLddFlag) = 0; - virtual void SetupReadData(TUint aLength) = 0; - virtual void GetCommandBufPtr(TPtr8& aDes, TUint aLength) = 0; - virtual void GetReadDataBufPtr(TPtr8& aDes) = 0; - virtual void GetWriteDataBufPtr(TPtrC8& aDes) = 0; -#ifdef MSDC_MULTITHREADED - virtual void ProcessReadData(TAny* aAddress) = 0; -#endif - }; - - -class MProtocolBase - { - public: - virtual void RegisterTransport(MTransportBase* aTransport) = 0; - virtual TBool DecodePacket(TPtrC8& aData, TUint aLun) = 0; - virtual TInt ReadComplete(TInt aError) = 0; - virtual TInt Cancel() = 0; - virtual void ReportHighSpeedDevice() {}; - virtual ~MProtocolBase() {}; -#ifdef MSDC_MULTITHREADED - virtual void InitializeBufferPointers(TPtr8& aDes1, TPtr8& aDes2) = 0; -#endif - }; - - -#endif // __PROTOCOL_H__ - diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/rwdrivethread.h --- a/userlibandfileserver/fileserver/smassstorage/inc/rwdrivethread.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/inc/rwdrivethread.h Mon Oct 11 17:54:41 2010 +0100 @@ -186,7 +186,6 @@ public: TBool ReadDriveData(CMassStorageDrive* aDrive, const TInt64& aOffset, TUint32 aLength, TBool aIgnoreCache); - void DiscardRead(); private: static TInt ThreadFunction(TAny* aSelf); diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/scsiprot.h --- a/userlibandfileserver/fileserver/smassstorage/inc/scsiprot.h Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/inc/scsiprot.h Mon Oct 11 17:54:41 2010 +0100 @@ -12,7 +12,7 @@ // // Description: // SCSI Protocol layer for USB Mass Storage -// +// // /** @@ -26,12 +26,12 @@ // Header files #include "drivemanager.h" -#include "protocol.h" + // Define MSDC_MULTITHREADED to use Mass Storage multi-threaded (Double-buffering) disk read/writes. // smassstorage_db.mmp defines this macro. -#if defined MSDC_MULTITHREADED +#if defined MSDC_MULTITHREADED class CWriteDriveThread; class CReadDriveThread; #endif @@ -58,81 +58,81 @@ Sense Info */ class TSenseInfo - { + { public: - // Spec: SCSI Primary Commands 3 (SPC-3) - // Section 4.5.6 Sense key and sense code defintions - // Table 27 - Sense key descriptions - enum TSenseCode - { - ENoSense = 0, - ERecoveredError = 1, - ENotReady = 2, - EMediumError = 3, - EHardwareError = 4, - EIllegalRequest = 5, - EUnitAttention = 6, - EDataProtection = 7, - EBlankCheck = 8, - EVendorSpecific = 9, - ECopyAborted = 10, - EAbortedCommand = 11, - EDataOverflow = 13, - EMisCompare = 14 - }; + // Spec: SCSI Primary Commands 3 (SPC-3) + // Section 4.5.6 Sense key and sense code defintions + // Table 27 - Sense key descriptions + enum TSenseCode + { + ENoSense = 0, + ERecoveredError = 1, + ENotReady = 2, + EMediumError = 3, + EHardwareError = 4, + EIllegalRequest = 5, + EUnitAttention = 6, + EDataProtection = 7, + EBlankCheck = 8, + EVendorSpecific = 9, + ECopyAborted = 10, + EAbortedCommand = 11, + EDataOverflow = 13, + EMisCompare = 14 + }; - // Table 28 - ASC and ASQ assignments - enum TAdditionalCode - { - EAscNull = 0x00, - EAscLogicalUnitNotReady = 0x04, - EAscLogicalUnitDoesNotRespondToSelection = 0x05, - EInvalidCmdCode = 0x20, - ELbaOutOfRange = 0x21, - EInvalidFieldInCdb = 0x24, - ELuNotSupported = 0x25, - EWriteProtected = 0x27, - ENotReadyToReadyChange = 0x28, - EMediaNotPresent = 0x3A, - EInsufficientRes = 0x55 - }; + // Table 28 - ASC and ASQ assignments + enum TAdditionalCode + { + EAscNull = 0x00, + EAscLogicalUnitNotReady = 0x04, + EAscLogicalUnitDoesNotRespondToSelection = 0x05, + EInvalidCmdCode = 0x20, + ELbaOutOfRange = 0x21, + EInvalidFieldInCdb = 0x24, + ELuNotSupported = 0x25, + EWriteProtected = 0x27, + ENotReadyToReadyChange = 0x28, + EMediaNotPresent = 0x3A, + EInsufficientRes = 0x55 + }; - enum TAdditionalSenseCodeQualifier - { - EAscqNull = 0x00, - EAscqLogicalUnitIsInProcessOfBecomingReady = 0x01 - }; + enum TAdditionalSenseCodeQualifier + { + EAscqNull = 0x00, + EAscqLogicalUnitIsInProcessOfBecomingReady = 0x01 + }; public: - TSenseInfo(); + TSenseInfo(); - void SetSense(TSenseCode aSenseCode); + void SetSense(TSenseCode aSenseCode); - void SetSense(TSenseCode aSenseCode, - TAdditionalCode aAdditional); + void SetSense(TSenseCode aSenseCode, + TAdditionalCode aAdditional); - void SetSense(TSenseCode aSenseCode, - TAdditionalCode aAdditional, - TAdditionalSenseCodeQualifier aQualifier); + void SetSense(TSenseCode aSenseCode, + TAdditionalCode aAdditional, + TAdditionalSenseCodeQualifier aQualifier); - TBool SenseOk(); + TBool SenseOk(); public: - TUint8 iSenseCode; - TUint8 iAdditional; - TUint8 iQualifier; - }; + TUint8 iSenseCode; + TUint8 iAdditional; + TUint8 iQualifier; + }; /** -Returns EFalse if a sense code has been set. +Returns EFalse if a sense code has been set. Note that ENoSense indicates that there is no specific sense key infotmation -to be reported and the command was successful. +to be reported and the command was successful. */ inline TBool TSenseInfo::SenseOk() - { - return (iSenseCode == ENoSense); - } + { + return (iSenseCode == ENoSense); + } const TUint KModeSense6CommandLength = 4; @@ -150,126 +150,126 @@ @internalTechnology */ class CScsiProtocol : public CBase, public MProtocolBase - { + { public: - enum TCommand - { - ETestUnitReady = 0x00, - ERequestSense = 0x03, - EInquiry = 0x12, - EModeSense6 = 0x1A, - EStartStopUnit = 0x1B, - EPreventMediaRemoval = 0x1E, - EReadFormatCapacities = 0x23, - EReadCapacity = 0x25, - ERead10 = 0x28, - EWrite10 = 0x2A, - EVerify10 = 0x2f, - EModeSense10 = 0x5A, - EUndefinedCommand = 0xFF - }; + enum TCommand + { + ETestUnitReady = 0x00, + ERequestSense = 0x03, + EInquiry = 0x12, + EModeSense6 = 0x1A, + EStartStopUnit = 0x1B, + EPreventMediaRemoval = 0x1E, + EReadFormatCapacities = 0x23, + EReadCapacity = 0x25, + ERead10 = 0x28, + EWrite10 = 0x2A, + EVerify10 = 0x2f, + EModeSense10 = 0x5A, + EUndefinedCommand = 0xFF + }; public: - static CScsiProtocol* NewL(CDriveManager& aDriveManager); - void RegisterTransport(MTransportBase* aTransport); - void ReportHighSpeedDevice(); - TBool DecodePacket(TPtrC8& aData, TUint aLun); - TInt ReadComplete(TInt aError); - TInt SetScsiParameters(TMassStorageConfig aConfig); - TInt Cancel(); - ~CScsiProtocol(); + static CScsiProtocol* NewL(CDriveManager& aDriveManager); + void RegisterTransport(MTransportBase* aTransport); + void ReportHighSpeedDevice(); + TBool DecodePacket(TPtrC8& aData, TUint aLun); + TInt ReadComplete(TInt aError); + TInt SetScsiParameters(TMassStorageConfig aConfig); + TInt Cancel(); + ~CScsiProtocol(); #ifdef MSDC_MULTITHREADED - void InitializeBufferPointers(TPtr8& aDes1, TPtr8& aDes2); - static void ProcessWriteComplete (TUint8* aAddress, TAny* aPtr); //todo const + void InitializeBufferPointers(TPtr8& aDes1, TPtr8& aDes2); + static void ProcessWriteComplete (TUint8* aAddress, TAny* aPtr); //todo const #endif private: - CScsiProtocol(CDriveManager& aDriveManager); - void ConstructL(); - CMassStorageDrive* GetCheckDrive(TUint aLun); - TBool HandleUnitReady(TUint aLun); - TBool HandleRequestSense(TPtrC8& aData); - TBool HandleInquiry(TPtrC8& aData, TUint aLun); - TBool HandleStartStopUnit(TPtrC8& aData, TUint aLun); - TBool HandlePreventMediaRemoval(TPtrC8& aData, TUint aLun); - TBool HandleReadCapacity(TPtrC8& aData, TUint aLun); - TBool HandleRead10(TPtrC8& aData, TUint aLun); - TBool HandleWrite10(TPtrC8& aData, TUint aLun); - TBool HandleVerify10(TPtrC8& aData, TUint aLun); - TBool HandleModeSense6(TPtrC8& aData, TUint aLun); + CScsiProtocol(CDriveManager& aDriveManager); + void ConstructL(); + CMassStorageDrive* GetCheckDrive(TUint aLun); + TBool HandleUnitReady(TUint aLun); + TBool HandleRequestSense(TPtrC8& aData); + TBool HandleInquiry(TPtrC8& aData, TUint aLun); + TBool HandleStartStopUnit(TPtrC8& aData, TUint aLun); + TBool HandlePreventMediaRemoval(TPtrC8& aData, TUint aLun); + TBool HandleReadCapacity(TPtrC8& aData, TUint aLun); + TBool HandleRead10(TPtrC8& aData, TUint aLun); + TBool HandleWrite10(TPtrC8& aData, TUint aLun); + TBool HandleVerify10(TPtrC8& aData, TUint aLun); + TBool HandleModeSense6(TPtrC8& aData, TUint aLun); TBool HandleModeSense10(TPtrC8& aData, TUint aLun); - TBool HandleReadFormatCapacities(TUint aLun); + TBool HandleReadFormatCapacities(TUint aLun); private: - /** Configuration data for INQUIRY command*/ - TMassStorageConfig iConfig; + /** Configuration data for INQUIRY command*/ + TMassStorageConfig iConfig; + + /** reference to the Drive Manager */ + CDriveManager& iDriveManager; - /** reference to the Drive Manager */ - CDriveManager& iDriveManager; - - /** pointer to the transport level */ - MTransportBase* iTransport; + /** pointer to the transport level */ + MTransportBase* iTransport; - /** Sense Info */ - TSenseInfo iSenseInfo; + /** Sense Info */ + TSenseInfo iSenseInfo; #ifdef MSDC_MULTITHREADED - /** Sense Info */ - TSenseInfo iDeferredSenseInfo; + /** Sense Info */ + TSenseInfo iDeferredSenseInfo; #endif - /** Start offset (in bytes) for Write/Verify */ - TInt64 iOffset; + /** Start offset (in bytes) for Write/Verify */ + TInt64 iOffset; - /** Last command for SetupRead (Write or Verify) */ - TUint8 iLastCommand; + /** Last command for SetupRead (Write or Verify) */ + TUint8 iLastCommand; - /** LUN for SetupRead */ - TUint iLastLun; + /** LUN for SetupRead */ + TUint iLastLun; #ifdef SIMDISK - CArrayFixFlat* iSimDisk; + CArrayFixFlat* iSimDisk; #endif - /** The number of bytes remaining to be read from the host for write operations */ - TUint32 iBytesRemain; + /** The number of bytes remaining to be read from the host for write operations */ + TUint32 iBytesRemain; - /** Write to the media when this amount of data is available */ - TUint32 iMediaWriteSize; + /** Write to the media when this amount of data is available */ + TUint32 iMediaWriteSize; #ifdef MSDC_MULTITHREADED - /** Ptr to Write Thread instance */ - CWriteDriveThread* iWriteDriveThread; + /** Ptr to Write Thread instance */ + CWriteDriveThread* iWriteDriveThread; - /** Ptr to Read Thread instance */ - CReadDriveThread* iReadDriveThread; + /** Ptr to Read Thread instance */ + CReadDriveThread* iReadDriveThread; #endif // MSDC_MULTITHREADED #ifdef USB_TRANSFER_PUBLISHER - /** - Publish and subscribe properties for tracking data transfer volume - */ - CUsbWriteTransferPublisher* iWriteTransferPublisher; - CUsbReadTransferPublisher* iReadTransferPublisher; + /** + Publish and subscribe properties for tracking data transfer volume + */ + CUsbWriteTransferPublisher* iWriteTransferPublisher; + CUsbReadTransferPublisher* iReadTransferPublisher; - /** - Cumulative bytes read - */ - TFixedArray iBytesRead; - /** - Cumulative bytes written - */ - TFixedArray iBytesWritten; + /** + Cumulative bytes read + */ + TFixedArray iBytesRead; + /** + Cumulative bytes written + */ + TFixedArray iBytesWritten; #else - /** - Publish and subscribe properties for tracking data transfer volume - */ - CDriveWriteTransferPublisher* iWriteTransferPublisher; - CDriveReadTransferPublisher* iReadTransferPublisher; + /** + Publish and subscribe properties for tracking data transfer volume + */ + CDriveWriteTransferPublisher* iWriteTransferPublisher; + CDriveReadTransferPublisher* iReadTransferPublisher; #endif - }; + }; #endif // __SCSIPROT_H__ diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/smassstorage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/smassstorage/inc/smassstorage.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,48 @@ +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// CDriveManager and CMassStorageDrive classes for USB Mass Storage. +// +// + +/** + @file + @internalTechnology +*/ + +#ifndef SMASSSTORAGE_H +#define SMASSSTORAGE_H + +_LIT(KUsbMsSvrPncCat, "CUsbMsServer"); + +enum TUsbPanicServer + { + EMsCBulkOnlyTransportNull = 3300, + EMsCDeviceStateNotifierNull, + EMsClientInvalidSessCount, + EMsControlInterfaceBadState, + EMsControlInterfaceStillActive, + EMsBulkOnlyStillActive, + EMsWrongEndpoint, + EMsInvalidLun, + EMsThreadWriteToDrive = 3400, + EMsThreadIsRecentlyWritten, + EMsThreadReadDriveThread, + EMsCMassStorageDriveWrite = 3500, + EMsCMassStorageDriveSetMountState_iLocalDrive, + EMsCMassStorageDriveSetMountState_aLocalDrive, + EMsCMassStorageDriveSetDriveState_State, + EMsCMassStorageDriveSetDriveState_Mount + }; + +#endif diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/inc/tbulkmm.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/smassstorage/inc/tbulkmm.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,103 @@ +/* +* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Class declaration for CBulkOnlyTransportUsbcLdd. +* +*/ + + +/** + @file + @internalTechnology +*/ + +#ifndef TBULKMM_H +#define TBULKMM_H + +// Maximum size for SCSI Read10 Write10 and Verify10 commands +// Windows requests size of 64K whereas MAC requests size of 128K +static const TUint32 KMaxBufSize = 128 * 1024; + +#ifdef MSDC_MULTITHREADED +class TBulkMm +{ +public: + TBulkMm(); + void GetNextTransferBuffer(TUint aLength, TPtr8& aPtr); + void GetNextTransferBuffer(TPtr8& aPtr); + + TUint MaxTransferSize() const {return KMaxBufSize;} + + TUint8* Buf1(); + TUint8* Buf2(); + +private: + TBuf8 iDataBuf1; // For data transfers (Reading and Writing) + TBuf8 iDataBuf2; + + TBool iSwap; +}; + +#else + +class TBulkMm +{ +public: + TBulkMm() {}; + + void GetNextTransferBuffer(TUint aLength, TPtr8& aPtr); + void GetNextTransferBuffer(TPtr8& aPtr); + + TUint MaxTransferSize() const {return KMaxBufSize;} + +private: + TBuf8 iDataBuf; +}; + +#endif + +#ifdef MSDC_MULTITHREADED +inline TUint8* TBulkMm::Buf1() +{ + return const_cast(iDataBuf1.Ptr()); +} + + +inline TUint8* TBulkMm::Buf2() +{ + return const_cast(iDataBuf2.Ptr()); +} + + +inline void TBulkMm::GetNextTransferBuffer(TPtr8& aPtr) + { + GetNextTransferBuffer(KMaxBufSize, aPtr); + } + +#else +inline void TBulkMm::GetNextTransferBuffer(TUint aLength, TPtr8& aPtr) + { + iDataBuf.SetLength(aLength); + aPtr.Set(iDataBuf.LeftTPtr(iDataBuf.Length())); + } + + +inline void TBulkMm::GetNextTransferBuffer(TPtr8& aPtr) + { + GetNextTransferBuffer(KMaxBufSize, aPtr); + } +#endif + +#endif + diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/rwdrivethread.cpp --- a/userlibandfileserver/fileserver/smassstorage/rwdrivethread.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/rwdrivethread.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" @@ -13,50 +13,48 @@ // Description: // -#include "scsiprot.h" + +#include +#include "smassstorage.h" +#include "mprotocol.h" +#include "scsiprot.h" // KMaxBufSize +#include "drivemanager.h" #include "usbmsshared.h" #include "rwdrivethread.h" -#include "massstoragedebug.h" -// --- -#ifdef PRINT_MSDC_MULTITHREADED_READ_INFO -#define __MT_READ_PRINT(t) {RDebug::Print(t);} -#define __MT_READ_PRINT1(t,a) {RDebug::Print(t,a);} -#define __MT_READ_PRINT2(t,a,b) {RDebug::Print(t,a,b);} -#else -#define __MT_READ_PRINT(t) -#define __MT_READ_PRINT1(t,a) -#define __MT_READ_PRINT2(t,a,b) -#endif // PRINT_MSDC_MULTITHREADED_READ_INFO +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "rwdrivethreadTraces.h" +#endif -#ifdef MSDC_MULTITHREADED +#ifdef MSDC_MULTITHREADED TBlockDesc::TBlockDesc() - :iBuf((TUint8 *)NULL,0,0) - { - } + :iBuf((TUint8 *)NULL,0,0) + { + } void TBlockDesc::SetPtr(TPtr8& aDes) - { - iBuf.Set(aDes); - } + { + iBuf.Set(aDes); + } TBlockDescBuffer::TBlockDescBuffer() - { - iDescReadPtr = &iDesc1; - iDescWritePtr = &iDesc2; - } + { + iDescReadPtr = &iDesc1; + iDescWritePtr = &iDesc2; + } void TBlockDescBuffer::SetUpReadBuf(TPtr8& aDes1, TPtr8& aDes2) - { - iDesc1.SetPtr(aDes1); - iDesc2.SetPtr(aDes2); - iDescReadPtr = &iDesc1; - iDescWritePtr = &iDesc2; - } + { + iDesc1.SetPtr(aDes1); + iDesc2.SetPtr(aDes2); + iDescReadPtr = &iDesc1; + iDescWritePtr = &iDesc2; + } //----------------------------------------------- @@ -69,16 +67,15 @@ @param aOwner Pointer to the object owning the thread. Used as the parameter to aThreadFunction. */ CThreadContext* CThreadContext::NewL(const TDesC& aName, - TThreadFunction aThreadFunction, - TAny* aOwner) - { - __FNLOG("CThreadContext::NewL"); - CThreadContext* self = new (ELeave) CThreadContext(); - CleanupStack::PushL(self); - self->ConstructL(aName, aThreadFunction, aOwner); - CleanupStack::Pop(); - return self; - } + TThreadFunction aThreadFunction, + TAny* aOwner) + { + CThreadContext* self = new (ELeave) CThreadContext(); + CleanupStack::PushL(self); + self->ConstructL(aName, aThreadFunction, aOwner); + CleanupStack::Pop(); + return self; + } /** Construct a CThreadContext object @@ -88,74 +85,75 @@ @param aOwner Pointer to the object owning the thread. Used as the parameter to aThreadFunction. */ void CThreadContext::ConstructL(const TDesC& aName, - TThreadFunction aThreadFunction, - TAny* aOwner) - { - __FNLOG("CThreadContext::ConstructL"); - __PRINT(_L("Creating Critical Section")); - User::LeaveIfError(iCritSect.CreateLocal()); - __PRINT(_L("Creating RThread")); + TThreadFunction aThreadFunction, + TAny* aOwner) + { + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_10, "Creating Critical Section"); + User::LeaveIfError(iCritSect.CreateLocal()); + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_11, "Creating RThread"); - TUint serial(0); // Used to retry creation of a thread in case - // one with the same name already exists + TUint serial(0); // Used to retry creation of a thread in case + // one with the same name already exists - RBuf threadName; - threadName.CreateMaxL(aName.Length() + 8); - CleanupClosePushL(threadName); - threadName = aName; + RBuf threadName; + threadName.CreateMaxL(aName.Length() + 8); + CleanupClosePushL(threadName); + threadName = aName; - TInt err; - for (;;) - { - err = iThread.Create(threadName, aThreadFunction, 0x1000, NULL, aOwner); - __PRINT2(_L("CThreadContext::ConstructL Created thread %S err=%d"), &threadName, err); + TInt err; + for (;;) + { + err = iThread.Create(threadName, aThreadFunction, 0x1000, NULL, aOwner); + OstTraceData(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_13, + "CThreadContext::ConstructL Created thread %s err=%d", threadName.Ptr(), threadName.Length()); + OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_14, + "err=%d", err); + // for a restart wait and retry until old thread is gone - if (err == KErrAlreadyExists) - { - User::After(10 * 1000); // 10 mS - threadName = aName; - threadName.AppendNumFixedWidth(serial, EDecimal, 8); - ++serial; - } - else - { - break; - } - } + if (err == KErrAlreadyExists) + { + User::After(10 * 1000); // 10 mS + threadName = aName; + threadName.AppendNumFixedWidth(serial, EDecimal, 8); + ++serial; + } + else + { + break; + } + } User::LeaveIfError(err); CleanupStack::Pop(); // threadName threadName.Close(); - // set priority - iThread.SetPriority(EPriorityMore); - } + // set priority + iThread.SetPriority(EPriorityMore); + } /** Construct a CThreadContext object */ CThreadContext::CThreadContext() - : - iError(KErrNone) - { - __FNLOG("CThreadContext::CThreadContext"); - } + : + iError(KErrNone) + { + } /** Destructor */ CThreadContext::~CThreadContext() - { - __FNLOG("CThreadContext::~CThreadContext"); - __PRINT(_L("Closing Critical Section")); - iCritSect.Close(); - __PRINT(_L("Killing ThreadContext")); - iThread.Kill(0); - __PRINT(_L("Closing ThreadContext")); - iThread.Close(); - } + { + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_20, "Closing Critical Section"); + iCritSect.Close(); + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_21, "Killing ThreadContext"); + iThread.Kill(0); + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_22, "Closing ThreadContext"); + iThread.Close(); + } //----------------------------------------------- @@ -163,47 +161,43 @@ Construct a CWriteDriveThread object */ CWriteDriveThread* CWriteDriveThread::NewL() - { - __FNLOG("CWriteDriveThread::NewL"); - CWriteDriveThread* self = new (ELeave) CWriteDriveThread(); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } + { + CWriteDriveThread* self = new (ELeave) CWriteDriveThread(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } /** Construct a CWriteDriveThread object */ void CWriteDriveThread::ConstructL() - { - __FNLOG("CWriteDriveThread::ConstructL"); - TBuf<16> name = _L("MassStorageWrite"); - iThreadContext = CThreadContext::NewL(name, ThreadFunction, this); - // There are two free pointers to start with so initialise the semaphore with 1 - User::LeaveIfError(iProducerSem.CreateLocal(1)); - User::LeaveIfError(iConsumerSem.CreateLocal(0)); - - iThreadContext->Resume(); - } + { + TBuf<16> name = _L("MassStorageWrite"); + iThreadContext = CThreadContext::NewL(name, ThreadFunction, this); + // There are two free pointers to start with so initialise the semaphore with 1 + User::LeaveIfError(iProducerSem.CreateLocal(1)); + User::LeaveIfError(iConsumerSem.CreateLocal(0)); + + iThreadContext->Resume(); + } /** Construct a CWriteDriveThread object */ -CWriteDriveThread::CWriteDriveThread() - : iIsCommandWrite10(EFalse) - { - __FNLOG("CWriteDriveThread::CWriteDriveThread"); - } +CWriteDriveThread::CWriteDriveThread() + : iIsCommandWrite10(EFalse) + { + } /** Destructor */ CWriteDriveThread::~CWriteDriveThread() - { - __FNLOG("CWriteDriveThread::~CWriteDriveThread"); - delete iThreadContext; - } + { + delete iThreadContext; + } /** This function is called when the thread is initially scheduled. @@ -211,150 +205,117 @@ @param aSelf Pointer to self to facilitate call to member method. */ TInt CWriteDriveThread::ThreadFunction(TAny* aSelf) - { - __FNLOG("CWriteDriveThread::ThreadFunction"); - CWriteDriveThread* self = static_cast(aSelf); - return self->WriteToDrive(); - } + { + CWriteDriveThread* self = static_cast(aSelf); + return self->WriteToDrive(); + } /** Writes the data pointed to by iDescWritePtr to the drive. */ TInt CWriteDriveThread::WriteToDrive() - { - __FNLOG("\tCWriteDriveThread::WriteToDrive"); - - // One-off convenience variable assignment - TBlockDesc* &desc = iThreadContext->iBuffer.iDescWritePtr; - - for(;;) - { - iConsumerSem.Wait(); - __PRINT(_L("\tWaiting on Write CS...")); - iThreadContext->iCritSect.Wait(); - // +++ WRITE CS STARTS HERE +++ - __PRINT1(_L("\tNow using as write buffer: iBuf%d"), iThreadContext->iBuffer.GetBufferNumber(&desc->iBuf)); -#ifdef MEASURE_AND_DISPLAY_WRITE_TIME - RDebug::Print(_L("\tSCSI: writing %d bytes\n"), desc->iBuf.Length()); - TTime t0, t1; - t0.HomeTime(); -#else - __PRINT1(_L("\tSCSI: writing %d bytes\n"), desc->iBuf.Length()); -#endif - // Write buffer to disk - -#ifdef INJECT_ERROR - if (desc->iBuf[0] == '2') - { - desc->iBuf[0] = 'x'; - RDebug::Printf("Injecting error"); - } + { + // One-off convenience variable assignment + TBlockDesc* &desc = iThreadContext->iBuffer.iDescWritePtr; - - RDebug::Printf("%08lx %x [%x] [%x]", desc->iByteOffset, desc->iBuf.Length(), - desc->iBuf[0], - desc->iBuf[desc->iBuf.Length()-1]); -#endif - - iThreadContext->iError = iThreadContext->iDrive->Write(desc->iByteOffset, desc->iBuf,iThreadContext->iDrive->IsWholeMediaAccess()); -#ifdef INJECT_ERROR - if (desc->iBuf[0] == 'x') - { - iThreadContext->iError = KErrUnknown; - } -#endif + for(;;) + { + iConsumerSem.Wait(); + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_30, "Waiting on Write CS..."); + iThreadContext->iCritSect.Wait(); + // +++ WRITE CS STARTS HERE +++ + OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_31, + "Now using as write buffer: iBuf%d", iThreadContext->iBuffer.GetBufferNumber(&desc->iBuf)); + OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_32, + "SCSI: writing %d bytes", desc->iBuf.Length()); + // Write buffer to disk + iThreadContext->iError = iThreadContext->iDrive->Write(desc->iByteOffset, desc->iBuf,iThreadContext->iDrive->IsWholeMediaAccess()); -#ifdef MEASURE_AND_DISPLAY_WRITE_TIME - t1.HomeTime(); - const TTimeIntervalMicroSeconds time = t1.MicroSecondsFrom(t0); - const TUint time_ms = I64LOW(time.Int64() / 1000); - RDebug::Print(_L("SCSI: write took %d ms\n"), time_ms); -#endif - iCallback((TUint8*) (desc->iBuf.Ptr()), iCallbackParameter); - iWriteCounter--; - ASSERT(iWriteCounter >= 0); + iCallback((TUint8*) (desc->iBuf.Ptr()), iCallbackParameter); + iWriteCounter--; + __ASSERT_DEBUG(iWriteCounter >= 0, User::Panic(KUsbMsSvrPncCat, EMsThreadWriteToDrive)); - __PRINT(_L("\tSignalling Write CS")); - iThreadContext->iCritSect.Signal(); - // +++ WRITE CS ENDS HERE +++ - iProducerSem.Signal(); - } - } + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_33, "Signalling Write CS"); + iThreadContext->iCritSect.Signal(); + // +++ WRITE CS ENDS HERE +++ + iProducerSem.Signal(); + } + } /** -Initiates writing data pointed to by iReadBuf to the drive and resumes the thread. Writing +Initiates writing data pointed to by iReadBuf to the drive and resumes the thread. Writing is completed by the ThreadFunction when the thread is resumed. @param aDrive Drive to write to. @param aOffset Write offset. */ TInt CWriteDriveThread::WriteDriveData(CMassStorageDrive* aDrive, const TInt64& aOffset, TPtrC8& aDes, ProcessWriteCompleteFunc aFunc, TAny* aPtr) - { - // Check error code from previous write - const TInt r = iThreadContext->iError; - if (r != KErrNone) - { - __PRINT1(_L("Error after previous write = 0x%x \n"), r); - return KErrAbort; + { + // Check error code from previous write + const TInt r = iThreadContext->iError; + if (r != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_40, "Error after previous write = %d", r); + return KErrAbort; } - // Swap the two buffer pointers - iProducerSem.Wait(); - __PRINT(_L("Waiting on Write CS...")); - // +++ WRITE CS STARTS HERE +++ - iThreadContext->iCritSect.Wait(); + // Swap the two buffer pointers + iProducerSem.Wait(); + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_41, "Waiting on Write CS..."); + // +++ WRITE CS STARTS HERE +++ + iThreadContext->iCritSect.Wait(); + + // New DB First read into the iDescReadPtr pointer, + // then swap,so that write pointer points to correct location, as the ptr pointed to by iDescWritePtr is what is written from in WriteToDrive + iThreadContext->iBuffer.iDescReadPtr->iBuf.Set((TUint8*)aDes.Ptr(), aDes.Length(), KMaxBufSize); - // New DB First read into the iDescReadPtr pointer, - // then swap,so that write pointer points to correct location, as the ptr pointed to by iDescWritePtr is what is written from in WriteToDrive - iThreadContext->iBuffer.iDescReadPtr->iBuf.Set((TUint8*)aDes.Ptr(), aDes.Length(), KMaxBufSize ); - - iCallback = aFunc; - iCallbackParameter = aPtr; + iCallback = aFunc; + iCallbackParameter = aPtr; - iWriteCounter++; - iThreadContext->iBuffer.SwapDesc(); - // Prepare variables for next write - iThreadContext->iDrive = aDrive; - iThreadContext->iBuffer.iDescWritePtr->iByteOffset = aOffset; - // +++ WRITE CS ENDS HERE +++ - __PRINT(_L("Signalling Write CS...")); - iThreadContext->iCritSect.Signal(); + iWriteCounter++; + iThreadContext->iBuffer.SwapDesc(); + // Prepare variables for next write + iThreadContext->iDrive = aDrive; + iThreadContext->iBuffer.iDescWritePtr->iByteOffset = aOffset; + // +++ WRITE CS ENDS HERE +++ + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_42, "Signalling Write CS..."); + iThreadContext->iCritSect.Signal(); - iConsumerSem.Signal(); - return KErrNone; + iConsumerSem.Signal(); + return KErrNone; } void CWriteDriveThread::WaitForWriteEmpty() { - while(iWriteCounter > 0) - { - User::After(100); - } + while(iWriteCounter > 0) + { + User::After(100); + } } // Check if the target address range was recently written to, this is to force a -// cache miss when reading from the same sectors that were just written. +// cache miss when reading from the same sectors that were just written. // Optimisation note: this is only needed if the read precache was started // before the write was completed. TBool CWriteDriveThread::IsRecentlyWritten(TInt64 aOffset, TInt aLength) { - ASSERT(iWriteCounter == 0); - if (iIsCommandWrite10) //If the previous command is Write10, then discard pre-read as the same buffers are used and will be over written by Write10 - return ETrue; - if(aOffset <= iThreadContext->iBuffer.iDescReadPtr->iByteOffset && - aOffset + aLength >= iThreadContext->iBuffer.iDescReadPtr->iByteOffset) - return ETrue; - if(aOffset >= iThreadContext->iBuffer.iDescReadPtr->iByteOffset && - aOffset <= iThreadContext->iBuffer.iDescReadPtr->iByteOffset + iThreadContext->iBuffer.iDescReadPtr->iLength) - return ETrue; - if(aOffset <= iThreadContext->iBuffer.iDescWritePtr->iByteOffset && - aOffset + aLength >= iThreadContext->iBuffer.iDescReadPtr->iByteOffset) - return ETrue; - if(aOffset >= iThreadContext->iBuffer.iDescWritePtr->iByteOffset && - aOffset <= iThreadContext->iBuffer.iDescReadPtr->iByteOffset + iThreadContext->iBuffer.iDescReadPtr->iLength) - return ETrue; - return EFalse; + __ASSERT_DEBUG(iWriteCounter == 0, User::Panic(KUsbMsSvrPncCat, EMsThreadIsRecentlyWritten)); + if (iIsCommandWrite10) //If the previous command is Write10, then discard pre-read as the same buffers are used and will be over written by Write10 + return ETrue; + if(aOffset <= iThreadContext->iBuffer.iDescReadPtr->iByteOffset && + aOffset + aLength >= iThreadContext->iBuffer.iDescReadPtr->iByteOffset) + return ETrue; + if(aOffset >= iThreadContext->iBuffer.iDescReadPtr->iByteOffset && + aOffset <= iThreadContext->iBuffer.iDescReadPtr->iByteOffset + iThreadContext->iBuffer.iDescReadPtr->iLength) + return ETrue; + if(aOffset <= iThreadContext->iBuffer.iDescWritePtr->iByteOffset && + aOffset + aLength >= iThreadContext->iBuffer.iDescReadPtr->iByteOffset) + return ETrue; + if(aOffset >= iThreadContext->iBuffer.iDescWritePtr->iByteOffset && + aOffset <= iThreadContext->iBuffer.iDescReadPtr->iByteOffset + iThreadContext->iBuffer.iDescReadPtr->iLength) + return ETrue; + return EFalse; } //----------------------------------------------- @@ -363,14 +324,13 @@ Construct a CReadDriveThread object */ CReadDriveThread* CReadDriveThread::NewL() - { - __FNLOG("CReadDriveThread::NewL"); - CReadDriveThread* self = new (ELeave) CReadDriveThread(); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } + { + CReadDriveThread* self = new (ELeave) CReadDriveThread(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } /** Construct a CReadDriveThread object @@ -379,30 +339,27 @@ @pram aThreadFunction Function to be called when thread is initially scheduled. */ void CReadDriveThread::ConstructL() - { - __FNLOG("CReadDriveThread::ConstructL"); - TBuf<15> name = _L("MassStorageRead"); - iThreadContext = CThreadContext::NewL(name, ThreadFunction, this); - } + { + TBuf<15> name = _L("MassStorageRead"); + iThreadContext = CThreadContext::NewL(name, ThreadFunction, this); + } /** Construct a CReadDriveThread object */ CReadDriveThread::CReadDriveThread() - : - iThreadRunning(EFalse) - { - __FNLOG("CReadDriveThread::CReadDriveThread"); - } + : + iThreadRunning(EFalse) + { + } /** Destructor */ CReadDriveThread::~CReadDriveThread() - { - __FNLOG("CReadDriveThread::~CReadDriveThread"); - delete iThreadContext; - } + { + delete iThreadContext; + } /** This function is called when the thread is initially scheduled. @@ -410,174 +367,146 @@ @param aSelf Pointer to self to facilitate call to member method. */ TInt CReadDriveThread::ThreadFunction(TAny* aSelf) - { - __FNLOG("CReadDriveThread::ThreadFunction"); - CReadDriveThread* self = static_cast(aSelf); - return self->ReadFromDrive(); - } + { + CReadDriveThread* self = static_cast(aSelf); + return self->ReadFromDrive(); + } /** Reads data from the drive with iOffset and iReadLength into memory pointer iReadBuffer and suspends the thread. */ TInt CReadDriveThread::ReadFromDrive() - { - __FNLOG("\tCReadDriveThread::ReadFromDrive"); - - // One-off convenience variable assignment - TBlockDesc* &desc = iThreadContext->iBuffer.iDescWritePtr; + { + // One-off convenience variable assignment + TBlockDesc* &desc = iThreadContext->iBuffer.iDescWritePtr; - for (;;) - { - __PRINT(_L("\tWaiting on Read CS...")); - iThreadContext->iCritSect.Wait(); - // +++ READ CS STARTS HERE +++ - iThreadRunning = ETrue; - iCompleted = EFalse; + for (;;) + { + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_50, "Waiting on Read CS..."); + iThreadContext->iCritSect.Wait(); + // +++ READ CS STARTS HERE +++ + iThreadRunning = ETrue; + iCompleted = EFalse; + + OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_51, + "\tNow using as read buffer: iBuf%d", iThreadContext->iBuffer.GetBufferNumber(&desc->iBuf)); + OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_52, + "\tSCSI: reading %d bytes", desc->iBuf.Length()); - __PRINT1(_L("\tNow using as read buffer: iBuf%d"), iThreadContext->iBuffer.GetBufferNumber(&desc->iBuf)); - -#ifdef MEASURE_AND_DISPLAY_READ_TIME - RDebug::Print(_L("\tSCSI: reading %d bytes\n"), desc->iBuf.Length()); - TTime t0, t1; - t0.HomeTime(); -#else - __PRINT1(_L("\tSCSI: reading %d bytes\n"), desc->iBuf.Length()); -#endif - // Fill read buffer from disk - iThreadContext->iError = iThreadContext->iDrive->Read(desc->iByteOffset, - desc->iLength, - desc->iBuf, - iThreadContext->iDrive->IsWholeMediaAccess()); + // Fill read buffer from disk + iThreadContext->iError = iThreadContext->iDrive->Read(desc->iByteOffset, + desc->iLength, + desc->iBuf, + iThreadContext->iDrive->IsWholeMediaAccess()); -#ifdef MEASURE_AND_DISPLAY_READ_TIME - t1.HomeTime(); - const TTimeIntervalMicroSeconds time = t1.MicroSecondsFrom(t0); - const TUint time_ms = I64LOW(time.Int64() / 1000); - RDebug::Print(_L("SCSI: read took %d ms\n"), time_ms); -#endif - - iCompleted = ETrue; - iThreadRunning = EFalse; - __PRINT(_L("\tSignalling Read CS")); - // +++ READ CS ENDS HERE +++ - iThreadContext->iCritSect.Signal(); - // Suspend self - __PRINT(_L("\tSuspending Read Thread")); - RThread().Suspend(); - } - } + iCompleted = ETrue; + iThreadRunning = EFalse; + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_53, "Signalling Read CS"); + // +++ READ CS ENDS HERE +++ + iThreadContext->iCritSect.Signal(); + // Suspend self + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_54, "Suspending Read Thread"); + RThread().Suspend(); + } + } /** -Client read request of a data block from the specified drive. +Client read request of a data block from the specified drive. If there is no pre-read data that matches the requested Offset and Length then the drive is read and the next pre-read is setup. If there is matching pre-read data available then the next pre-read is setup. Finishes by resuming the thread and the ThreadFunciton runs. @param aDrive Drive to read from. @param aOffset Read offset -@param aLength Length +@param aLength Length */ TBool CReadDriveThread::ReadDriveData(CMassStorageDrive* aDrive, - const TInt64& aOffset, - TUint32 aLength, - TBool aIgnoreCache) - { - __MT_READ_PRINT2(_L("\nRead10: offs %ld len %d"), aOffset, aLength); + const TInt64& aOffset, + TUint32 aLength, + TBool aIgnoreCache) + { + OstTraceExt2(TRACE_SMASSSTORAGE_MEDIADB, CTHREADCONTEXT_60, "Read10: offs %ld len %d", aOffset, aLength); - __PRINT(_L("Waiting on Read CS...")); - iThreadContext->iCritSect.Wait(); - // +++ READ CS STARTS HERE +++ - __ASSERT_DEBUG(!iThreadRunning, User::Panic(_L("MSDC-THREAD"), 666)); + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_61, "Waiting on Read CS..."); + iThreadContext->iCritSect.Wait(); + // +++ READ CS STARTS HERE +++ + __ASSERT_DEBUG(!iThreadRunning, User::Panic(KUsbMsSvrPncCat, EMsThreadReadDriveThread)); - TBlockDesc* &desc = iThreadContext->iBuffer.iDescReadPtr; - TBlockDesc* &bgDesc = iThreadContext->iBuffer.iDescWritePtr; + TBlockDesc* &desc = iThreadContext->iBuffer.iDescReadPtr; + TBlockDesc* &bgDesc = iThreadContext->iBuffer.iDescWritePtr; - if ((!aIgnoreCache) && - (iCompleted) && - (iThreadContext->iError == KErrNone) && - (iThreadContext->iDrive == aDrive) && - (bgDesc->iByteOffset == aOffset) && - (bgDesc->iLength == aLength)) - { - // Good: We pre-read the correct data :-) - __MT_READ_PRINT(_L("Match: Using pre-read data :-) :-) :-) :-)")); - } - else - { - __MT_READ_PRINT(_L("Not using pre-read data")); - if (iThreadContext->iError != KErrNone) - { - __MT_READ_PRINT1(_L("Pre-read failed: %d"), iThreadContext->iError); - } - if (iThreadContext->iDrive != aDrive) - { - __MT_READ_PRINT2(_L("Pre-read drive mismatch: pre 0x%08x / act 0x%08x"), - iThreadContext->iDrive, aDrive); - } - if (desc->iByteOffset != aOffset) - { - __MT_READ_PRINT2(_L("Pre-read offset mismatch: pre %ld / act %ld"), - desc->iByteOffset, aOffset); - } - if (desc->iLength != aLength) - { - __MT_READ_PRINT2(_L("Pre-read length mismatch: pre %d / act %d"), - desc->iLength, aLength); - // Potential optimization: If the pre-read was OK but for more data - // than the host is now asking for, we could still satisfy that - // request from the pre-read data by shortening the buffer. - } - // No valid pre-read data was available - so we have to read it now - bgDesc->iByteOffset = aOffset; - bgDesc->iLength = aLength; - TInt err = aDrive->Read(aOffset, - aLength, - bgDesc->iBuf, - aDrive->IsWholeMediaAccess()); - if (err != KErrNone) - { - __PRINT1(_L("Read failed, err=%d\n"), err); - // +++ READ CS ENDS HERE +++ - __PRINT(_L("Signalling Read CS...")); - iThreadContext->iCritSect.Signal(); - return EFalse; - } - } + if ((!aIgnoreCache) && + (iCompleted) && + (iThreadContext->iError == KErrNone) && + (iThreadContext->iDrive == aDrive) && + (bgDesc->iByteOffset == aOffset) && + (bgDesc->iLength == aLength)) + { + // Good: We pre-read the correct data :-) + OstTrace0(TRACE_SMASSSTORAGE_MEDIADB, CTHREADCONTEXT_70, "Match: Using pre-read data :-) :-) :-) :-)"); + } + else + { + OstTrace0(TRACE_SMASSSTORAGE_MEDIADB, CTHREADCONTEXT_71, "Not using pre-read data"); + if (iThreadContext->iError != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_MEDIADB, CTHREADCONTEXT_72, "Pre-read failed: %d", iThreadContext->iError); + } + if (iThreadContext->iDrive != aDrive) + { + OstTraceExt2(TRACE_SMASSSTORAGE_MEDIADB, CTHREADCONTEXT_73, + "Pre-read drive mismatch: pre 0x%08x / act 0x%08x", + (TUint32)iThreadContext->iDrive, (TUint32)aDrive); + } + if (desc->iByteOffset != aOffset) + { + OstTraceExt4(TRACE_SMASSSTORAGE_MEDIADB, CTHREADCONTEXT_74, + "Pre-read offset mismatch: pre 0x%x 0x%x / act 0x%x 0x%x", + I64HIGH(desc->iByteOffset), I64LOW(desc->iByteOffset), I64HIGH(aOffset), I64LOW(aOffset)); + } + if (desc->iLength != aLength) + { + OstTraceExt2(TRACE_SMASSSTORAGE_MEDIADB, CTHREADCONTEXT_75, + "Pre-read length mismatch: pre 0x%x / act 0x%x", + (TUint32)desc->iLength, aLength); + // Potential optimization: If the pre-read was OK but for more data + // than the host is now asking for, we could still satisfy that + // request from the pre-read data by shortening the buffer. + } + // No valid pre-read data was available - so we have to read it now + bgDesc->iByteOffset = aOffset; + bgDesc->iLength = aLength; + TInt err = aDrive->Read(aOffset, + aLength, + bgDesc->iBuf, + aDrive->IsWholeMediaAccess()); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_76, "Read failed, err=%d", err); + // +++ READ CS ENDS HERE +++ + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_77, "Signalling Read CS..."); + iThreadContext->iCritSect.Signal(); + return EFalse; + } + } - // Prepare thread variables for next pre-read attempt by the ReadThread - const TInt64 offs_new = aOffset + aLength; - iThreadContext->iDrive = aDrive; // same drive - desc->iByteOffset = offs_new; // next block - desc->iLength = aLength; // same length - iCompleted = EFalse; - iThreadContext->iBuffer.SwapDesc(); - - // +++ READ CS ENDS HERE +++ - __PRINT(_L("Signalling Read CS...")); - iThreadContext->iCritSect.Signal(); - // Start background read - __PRINT(_L("Resuming Read Thread")); - iThreadContext->Resume(); - return ETrue; - } + // Prepare thread variables for next pre-read attempt by the ReadThread + const TInt64 offs_new = aOffset + aLength; + iThreadContext->iDrive = aDrive; // same drive + desc->iByteOffset = offs_new; // next block + desc->iLength = aLength; // same length + iCompleted = EFalse; + iThreadContext->iBuffer.SwapDesc(); -/** -Discard the read buffer. This is used to force a cache miss when reading from -the same sectors that were just written. -*/ -void CReadDriveThread::DiscardRead() -{ - __PRINT(_L("Waiting on Read CS in DiscardRead...")); - iThreadContext->iCritSect.Wait(); - // +++ READ CS STARTS HERE +++ - __PRINT(_L("Discarding pre-read buffer")); - iCompleted = EFalse; - iThreadContext->iBuffer.iDescReadPtr->iLength = 0; + // +++ READ CS ENDS HERE +++ + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_78, "Signalling Read CS..."); + iThreadContext->iCritSect.Signal(); + // Start background read + OstTrace0(TRACE_SMASSSTORAGE_MEDIA, CTHREADCONTEXT_79, "Resuming Read Thread"); + iThreadContext->Resume(); + return ETrue; + } - // +++ READ CS ENDS HERE +++ - __PRINT(_L("Signalling Read CS in DiscardRead...")); - iThreadContext->iCritSect.Signal(); -} #endif // MSDC_MULTITHREADED diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/scsiprot.cpp --- a/userlibandfileserver/fileserver/smassstorage/scsiprot.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/scsiprot.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -13,34 +13,41 @@ // Description: // +#include +#include "mtransport.h" +#include "mprotocol.h" #include "scsiprot.h" -#ifdef MSDC_MULTITHREADED +#ifdef MSDC_MULTITHREADED #include "rwdrivethread.h" #endif // MSDC_MULTITHREADED -#include "massstoragedebug.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "scsiprotTraces.h" +#endif // Helper macros #define LBA(x) static_cast((x[3] << 24) | (x[4] << 16) | (x[5] << 8) | x[6]) #define LEN(x) static_cast((x[8] << 8) | x[9]) -LOCAL_D const TUint KDefaultBlockSize = 0x200; //default block size for FAT +static const TUint32 KDefaultBlockSize = 0x200; //default block size for FAT -LOCAL_D const TUint KUndefinedLun = 0xFFFF; +static const TUint KUndefinedLun = 0xFFFF; -LOCAL_D const TUint8 KAllPages = 0x3F; +static const TUint8 KAllPages = 0x3F; -LOCAL_D const TUint8 KChangeableValues = 0x1; -LOCAL_D const TUint8 KDefaultValues = 0x2; +static const TUint8 KChangeableValues = 0x1; +static const TUint8 KDefaultValues = 0x2; /** Default constructor for TSenseInfo */ TSenseInfo::TSenseInfo() - : iSenseCode(ENoSense), - iAdditional(EAscNull), - iQualifier(EAscqNull) - {} + : iSenseCode(ENoSense), + iAdditional(EAscNull), + iQualifier(EAscqNull) + {} /** @@ -49,43 +56,46 @@ @param aSenseCode sense key */ void TSenseInfo::SetSense(TSenseCode aSenseCode) - { - iSenseCode = static_cast(aSenseCode); - iAdditional = EAscNull; - iQualifier = EAscqNull; - } + { + iSenseCode = static_cast(aSenseCode); + iAdditional = EAscNull; + iQualifier = EAscqNull; + OstTraceExt3(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_SETSENSE1, " SENSE CODE %d ASC %d ASC %d", iSenseCode, iAdditional, iQualifier); + } /** Set sense with additional info. @param aSenseCode sense key -@param aAdditional additional sense code (ASC) +@param aAdditional additional sense code (ASC) */ void TSenseInfo::SetSense(TSenseCode aSenseCode, TAdditionalCode aAdditional) - { - iSenseCode = static_cast(aSenseCode); - iAdditional = static_cast(aAdditional); - iQualifier = EAscqNull; - } + { + iSenseCode = static_cast(aSenseCode); + iAdditional = static_cast(aAdditional); + iQualifier = EAscqNull; + OstTraceExt3(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_SETSENSE2, " SENSE CODE %d ASC %d ASC %d", iSenseCode, iAdditional, iQualifier); + } /** Set sense with additional info and qualifier. -@param aSenseCode sense key -@param aAdditional additional sense code (ASC) +@param aSenseCode sense key +@param aAdditional additional sense code (ASC) @param aQualifier additional sense code qualifier (ASCQ) */ void TSenseInfo::SetSense(TSenseCode aSenseCode, - TAdditionalCode aAdditional, - TAdditionalSenseCodeQualifier aQualifier) - { - iSenseCode = static_cast(aSenseCode); - iAdditional = static_cast(aAdditional); - iQualifier = static_cast(aQualifier); - } + TAdditionalCode aAdditional, + TAdditionalSenseCodeQualifier aQualifier) + { + iSenseCode = static_cast(aSenseCode); + iAdditional = static_cast(aAdditional); + iQualifier = static_cast(aQualifier); + OstTraceExt3(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_SETSENSE3, " SENSE CODE %d ASC %d ASC %d", iSenseCode, iAdditional, iQualifier); + } //----------------------------------------------- @@ -96,13 +106,13 @@ @param aDriveManager reference to the drive manager object */ CScsiProtocol* CScsiProtocol::NewL(CDriveManager& aDriveManager) - { - CScsiProtocol* self = new (ELeave) CScsiProtocol(aDriveManager); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } + { + CScsiProtocol* self = new (ELeave) CScsiProtocol(aDriveManager); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } /** c'tor @@ -110,54 +120,48 @@ @param aDriveManager reference to the drive manager object */ CScsiProtocol::CScsiProtocol(CDriveManager& aDriveManager): - iDriveManager(aDriveManager), - iLastCommand(EUndefinedCommand), - iLastLun(KUndefinedLun), - iMediaWriteSize(KDefaultMediaWriteSize) - { - __FNLOG("CScsiProtocol::CScsiProtocol"); - + iDriveManager(aDriveManager), + iLastCommand(EUndefinedCommand), + iLastLun(KUndefinedLun), + iMediaWriteSize(KDefaultMediaWriteSize) + { #ifdef USB_TRANSFER_PUBLISHER - iWriteTransferPublisher = CUsbWriteTransferPublisher::NewL(iBytesWritten); - iReadTransferPublisher = CUsbReadTransferPublisher::NewL(iBytesRead); + iWriteTransferPublisher = CUsbWriteTransferPublisher::NewL(iBytesWritten); + iReadTransferPublisher = CUsbReadTransferPublisher::NewL(iBytesRead); - for (TUint i = 0; i < KUsbMsMaxDrives; i++) - { - iBytesRead[i] = 0; - iBytesWritten[i] = 0; - } + for (TUint i = 0; i < KUsbMsMaxDrives; i++) + { + iBytesRead[i] = 0; + iBytesWritten[i] = 0; + } #else - iWriteTransferPublisher = CDriveWriteTransferPublisher::NewL(aDriveManager.iDrives); - iReadTransferPublisher = CDriveReadTransferPublisher::NewL(aDriveManager.iDrives); + iWriteTransferPublisher = CDriveWriteTransferPublisher::NewL(aDriveManager.iDrives); + iReadTransferPublisher = CDriveReadTransferPublisher::NewL(aDriveManager.iDrives); #endif - } + } CScsiProtocol::~CScsiProtocol() - { - __FNLOG("CScsiProtocol::~CScsiProtocol"); + { #ifdef MSDC_MULTITHREADED - __PRINT(_L("Deleting WriteDrive Thread")); - delete iWriteDriveThread; - __PRINT(_L("Deleting ReadDrive Thread")); - delete iReadDriveThread; + OstTrace0(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_DES, "Deleting Drive Threads"); + delete iWriteDriveThread; + delete iReadDriveThread; #endif // MSDC_MULTITHREADED - delete iWriteTransferPublisher; - delete iReadTransferPublisher; - } + delete iWriteTransferPublisher; + delete iReadTransferPublisher; + } void CScsiProtocol::ConstructL() - { - __FNLOG("CScsiProtocol::ConstructL"); + { #ifdef MSDC_MULTITHREADED - __PRINT(_L("Creating WriteDrive Thread")); - iWriteDriveThread = CWriteDriveThread::NewL(); - __PRINT(_L("Creating ReadDrive Thread")); - iReadDriveThread = CReadDriveThread::NewL(); + OstTrace0(TRACE_SMASSSTORAGE, _CSCSIPROTOCOL, "Creating Drive Threads"); + iWriteDriveThread = CWriteDriveThread::NewL(); + iReadDriveThread = CReadDriveThread::NewL(); #endif // MSDC_MULTITHREADED - } + } /** @@ -166,10 +170,9 @@ @param aTransport pointer to the transport object */ void CScsiProtocol::RegisterTransport(MTransportBase* aTransport) - { - __FNLOG("CScsiProtocol::RegisterTransport"); - iTransport = aTransport; - } + { + iTransport = aTransport; + } /** @@ -182,31 +185,30 @@ */ void CScsiProtocol::ReportHighSpeedDevice() - { - __FNLOG("CScsiProtocol::ReportHighSpeedDevice"); - iMediaWriteSize = KHsMediaWriteSize; - __PRINT1(_L("HS Device reported: SCSI will use %d bytes disk write size"), iMediaWriteSize); - } + { + iMediaWriteSize = KHsMediaWriteSize; + OstTrace1(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_REPORTHIGHSPEEDDEVICE, + "HS Device reported: SCSI will use 0x%x bytes disk write size", iMediaWriteSize); + } TInt CScsiProtocol::SetScsiParameters(TMassStorageConfig aConfig) - { - __FNLOG("CScsiProtocol::SetScsiParameters"); - iConfig = aConfig; - return KErrNone; - } + { + iConfig = aConfig; + return KErrNone; + } #ifdef MSDC_MULTITHREADED void CScsiProtocol::ProcessWriteComplete (TUint8* aAddress, TAny* aPtr) - { - ((CScsiProtocol*)aPtr)->iTransport->ProcessReadData(aAddress); - } + { + ((CScsiProtocol*)aPtr)->iTransport->ProcessReadData(aAddress); + } void CScsiProtocol::InitializeBufferPointers(TPtr8& aDes1, TPtr8& aDes2) // Todo Change name later - InitializeReadBufferSomething - { - iReadDriveThread->iThreadContext->iBuffer.SetUpReadBuf(aDes1, aDes2); - } + { + iReadDriveThread->iThreadContext->iBuffer.SetUpReadBuf(aDes1, aDes2); + } #endif /** @@ -218,399 +220,393 @@ @return ETrue if command was decoded and executed successfully */ TBool CScsiProtocol::DecodePacket(TPtrC8& aData, TUint aLun) - { - __FNLOG("CScsiProtocol::DecodePacket"); - - TUint8 command = aData[1]; + { + TUint command = aData[1]; - if (command != ERequestSense) - { - iSenseInfo.SetSense(TSenseInfo::ENoSense); - } + if (command != ERequestSense) + { + iSenseInfo.SetSense(TSenseInfo::ENoSense); + } - __PRINT2(_L("command = 0x%x lun=%d"), command, aLun); - switch (command) - { - case ETestUnitReady: - HandleUnitReady(aLun); - break; + OstTraceExt2(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_DECODEPACKET, "Command=0x%x LUN=%d", command, aLun); + switch (command) + { + case ETestUnitReady: + HandleUnitReady(aLun); + break; - case ERequestSense: - HandleRequestSense(aData); - break; + case ERequestSense: + HandleRequestSense(aData); + break; - case EInquiry: - HandleInquiry(aData, aLun); - break; + case EInquiry: + HandleInquiry(aData, aLun); + break; - case EModeSense6: - HandleModeSense6(aData, aLun); - break; + case EModeSense6: + HandleModeSense6(aData, aLun); + break; case EModeSense10: HandleModeSense10(aData, aLun); break; - case EStartStopUnit: - HandleStartStopUnit(aData, aLun); - break; + case EStartStopUnit: + HandleStartStopUnit(aData, aLun); + break; - case EPreventMediaRemoval: - HandlePreventMediaRemoval(aData, aLun); - break; + case EPreventMediaRemoval: + HandlePreventMediaRemoval(aData, aLun); + break; - case EReadCapacity: - HandleReadCapacity(aData, aLun); - break; + case EReadCapacity: + HandleReadCapacity(aData, aLun); + break; - case ERead10: - HandleRead10(aData, aLun); - break; + case ERead10: + HandleRead10(aData, aLun); + break; - case EWrite10: - HandleWrite10(aData,aLun); - break; + case EWrite10: + HandleWrite10(aData,aLun); + break; - case EVerify10: - HandleVerify10(aData, aLun); - break; + case EVerify10: + HandleVerify10(aData, aLun); + break; - case EReadFormatCapacities: - HandleReadFormatCapacities(aLun); - break; + case EReadFormatCapacities: + HandleReadFormatCapacities(aLun); + break; - default: - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidCmdCode); - } - __PRINT1(_L("DecodePacket result = %d"), iSenseInfo.SenseOk()); - return(iSenseInfo.SenseOk()); - } + default: + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidCmdCode); + } + return(iSenseInfo.SenseOk()); + } /** Checks if drive ready -@param aLun Logic unit number +@param aLun Logic unit number @return pointer to drive correspondent to LUN if drive mounted and ready, NULL otherwise */ CMassStorageDrive* CScsiProtocol::GetCheckDrive(TUint aLun) - { - __FNLOG("CScsiProtocol::GetCheckDrive"); - TInt err=KErrNone; + { + TInt err=KErrNone; #ifdef MSDC_MULTITHREADED - // check for deferred errors - if (iWriteDriveThread->DeferredError()) - { - iWriteDriveThread->ClearDeferredError(); - iDeferredSenseInfo.SetSense(TSenseInfo::EMediumError); - return NULL; - } + // check for deferred errors + if (iWriteDriveThread->DeferredError()) + { + iWriteDriveThread->ClearDeferredError(); + iDeferredSenseInfo.SetSense(TSenseInfo::EMediumError); + return NULL; + } #endif - CMassStorageDrive* drive= iDriveManager.Drive(aLun, err); + CMassStorageDrive* drive= iDriveManager.Drive(aLun, err); - if (err !=KErrNone || drive == NULL) - { - __PRINT(_L("No drive available\n")); - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELuNotSupported); - return NULL; - } + if (err !=KErrNone || drive == NULL) + { + OstTrace0(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_GETCHECKDRIVE1, "No drive available"); + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELuNotSupported); + return NULL; + } - CMassStorageDrive::TMountState mountState = drive->MountState(); + CMassStorageDrive::TMountState mountState = drive->MountState(); - if (mountState == CMassStorageDrive::EDisconnected || mountState == CMassStorageDrive::EConnecting) - { - __PRINT(_L("Drive disconnected\n")); - iSenseInfo.SetSense(TSenseInfo::ENotReady, - TSenseInfo::EMediaNotPresent); - return NULL; - } + if (mountState == CMassStorageDrive::EDisconnected || mountState == CMassStorageDrive::EConnecting) + { + OstTrace0(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_GETCHECKDRIVE2, "Drive disconnected"); + iSenseInfo.SetSense(TSenseInfo::ENotReady, + TSenseInfo::EMediaNotPresent); + return NULL; + } - CMassStorageDrive::TDriveState state = drive->CheckDriveState(); - if (state == CMassStorageDrive::EMediaNotPresent || state == CMassStorageDrive::ELocked) - { - __PRINT1(_L("Media not present or locked. (state =0x%X)\n"),state); - iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); - return NULL; - } + CMassStorageDrive::TDriveState state = drive->CheckDriveState(); + if (state == CMassStorageDrive::EMediaNotPresent || state == CMassStorageDrive::ELocked) + { + OstTrace1(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_GETCHECKDRIVE3, "Media not present or locked. state =0x%X", state); + iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); + return NULL; + } - if (drive->IsMediaChanged(ETrue)) //reset "media changed" status - { - __PRINT(_L("Media was changed\n")); - // SAM-2 Section 5.9.5 Unit Attention Condition - iSenseInfo.SetSense(TSenseInfo::EUnitAttention, TSenseInfo::ENotReadyToReadyChange); - iDriveManager.Connect(aLun); //publish event to USB app - return NULL; - } + if (drive->IsMediaChanged(ETrue)) //reset "media changed" status + { + OstTrace0(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_GETCHECKDRIVE4, "Media was changed"); + // SAM-2 Section 5.9.5 Unit Attention Condition + iSenseInfo.SetSense(TSenseInfo::EUnitAttention, TSenseInfo::ENotReadyToReadyChange); + iDriveManager.Connect(aLun); //publish event to USB app + return NULL; + } - if (mountState == CMassStorageDrive::EDisconnecting) - { - __PRINT(_L("Drive disconnecting\n")); - iSenseInfo.SetSense(TSenseInfo::ENotReady, - TSenseInfo::EMediaNotPresent); - return NULL; - } + if (mountState == CMassStorageDrive::EDisconnecting) + { + OstTrace0(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_GETCHECKDRIVE5, "Drive disconnecting"); + iSenseInfo.SetSense(TSenseInfo::ENotReady, + TSenseInfo::EMediaNotPresent); + return NULL; + } - return drive; - } + return drive; + } /** Command Parser for the UNIT READY command (0x00) -@param aLun Logic unit number -@return ETrue if successful, +@param aLun Logic unit number +@return ETrue if successful, */ TBool CScsiProtocol::HandleUnitReady(TUint aLun) - { - __FNLOG("CScsiProtocol::HandleUnitReady"); + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_TESTUNITREADY, ">>> TEST UNIT READY"); #ifdef MSDC_MULTITHREADED - iWriteDriveThread->WaitForWriteEmpty(); + iWriteDriveThread->WaitForWriteEmpty(); #endif - return GetCheckDrive(aLun) ? (TBool)ETrue : (TBool)EFalse; - } + return GetCheckDrive(aLun) ? (TBool)ETrue : (TBool)EFalse; + } /** Command Parser for the REQUEST SENSE command (0x03) -@return ETrue if successful, +@return ETrue if successful, */ TBool CScsiProtocol::HandleRequestSense(TPtrC8& aData) - { - __FNLOG("CScsiProtocol::HandleRequestSense"); - TUint length = aData[5]; - __PRINT1(_L("length = %d\n"), length); - - TPtr8 writeBuf(NULL, 0); - iTransport->GetCommandBufPtr(writeBuf, KRequestSenseCommandLength); - writeBuf.FillZ(KRequestSenseCommandLength); + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_REQUESTSENSE, ">>> REQUEST SENSE"); + TUint length = aData[5]; + OstTrace1(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_REQUESTSENSE1, " length = %d", length); - TSenseInfo* senseInfo; + TPtr8 writeBuf(NULL, 0); + iTransport->GetCommandBufPtr(writeBuf, KRequestSenseCommandLength); + writeBuf.FillZ(KRequestSenseCommandLength); + + TSenseInfo* senseInfo; #ifdef MSDC_MULTITHREADED - if (!iDeferredSenseInfo.SenseOk()) - { - writeBuf[00] = 0x71; //(deferred errors) - senseInfo = &iDeferredSenseInfo; - } - else - { - writeBuf[00] = 0x70; //(current errors) - senseInfo = &iSenseInfo; - } + if (!iDeferredSenseInfo.SenseOk()) + { + writeBuf[00] = 0x71; //(deferred errors) + senseInfo = &iDeferredSenseInfo; + } + else + { + writeBuf[00] = 0x70; //(current errors) + senseInfo = &iSenseInfo; + } #else - senseInfo = &iSenseInfo; - writeBuf[00] = 0x70; //(current errors) + senseInfo = &iSenseInfo; + writeBuf[00] = 0x70; //(current errors) #endif - writeBuf[02] = static_cast(senseInfo->iSenseCode & 0x0F); + writeBuf[02] = static_cast(senseInfo->iSenseCode & 0x0F); - writeBuf[12] = senseInfo->iAdditional; - writeBuf[13] = senseInfo->iQualifier; - if (length<18 && length >=8) - { - writeBuf.SetLength(length); //length of response code data - writeBuf[07] = TUint8(length - 8); //additional sence length - } - else if (length >= KRequestSenseCommandLength) - { - writeBuf[07] = KRequestSenseCommandLength - 8; // we have max 18 byte to send - } + writeBuf[12] = senseInfo->iAdditional; + writeBuf[13] = senseInfo->iQualifier; + if (length<18 && length >=8) + { + writeBuf.SetLength(length); //length of response code data + writeBuf[07] = TUint8(length - 8); //additional sence length + } + else if (length >= KRequestSenseCommandLength) + { + writeBuf[07] = KRequestSenseCommandLength - 8; // we have max 18 byte to send + } - __PRINT4(_L("Response=0x%x Sense=0x%x, Additional=0x%x, Qualifier=0x%x\n"), - writeBuf[0], writeBuf[02], writeBuf[12], writeBuf[13]); - - TPtrC8 writeBuf1 = writeBuf.Left(length); + OstTraceExt4(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_REQUESTSENSE2, + " Response=0x%x Sense=0x%x, Additional=0x%x, Qualifier=0x%x", + (TUint)writeBuf[0], (TUint)writeBuf[02], (TUint)writeBuf[12], (TUint)writeBuf[13]); - iTransport->SetupWriteData(writeBuf1); + TPtrC8 writeBuf1 = writeBuf.Left(length); - // clear the sense info - iSenseInfo.SetSense(TSenseInfo::ENoSense); + iTransport->SetupWriteData(writeBuf1); + + // clear the sense info + iSenseInfo.SetSense(TSenseInfo::ENoSense); #ifdef MSDC_MULTITHREADED - iDeferredSenseInfo.SetSense(TSenseInfo::ENoSense); + iDeferredSenseInfo.SetSense(TSenseInfo::ENoSense); #endif - return ETrue; - } + return ETrue; + } /** Command Parser for the INQUIRY command (0x12) -@param aLun Logic unit number -@return ETrue if successful, +@param aLun Logic unit number +@return ETrue if successful, */ TBool CScsiProtocol::HandleInquiry(TPtrC8& aData, TUint aLun ) - { - __FNLOG("CScsiProtocol::HandleInquiry"); + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_INQUIRY, ">>> INQUIRY"); + TBool cmdDt = aData[2] & 0x2; + TBool evpd = aData[2] & 0x1; + TUint8 page = aData[3]; + if (cmdDt || evpd || page || aLun >= KUsbMsMaxDrives) + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); + return EFalse; + } - TBool cmdDt = aData[2] & 0x2; - TBool evpd = aData[2] & 0x1; - TUint8 page = aData[3]; - if (cmdDt || evpd || page || aLun >= KUsbMsMaxDrives) - { - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); - return EFalse; - } - - TPtr8 writeBuf(NULL, 0); - iTransport->GetCommandBufPtr(writeBuf, KInquiryCommandLength); - writeBuf.FillZ(KInquiryCommandLength); + TPtr8 writeBuf(NULL, 0); + iTransport->GetCommandBufPtr(writeBuf, KInquiryCommandLength); + writeBuf.FillZ(KInquiryCommandLength); - writeBuf[1] = 0x80; // MSB: RMB : Removable - writeBuf[3] = 0x02; // AERC, TrmTsk, NormACA, Response Data Format - writeBuf[4] = 0x1F; // Additional Length + writeBuf[1] = 0x80; // MSB: RMB : Removable + writeBuf[3] = 0x02; // AERC, TrmTsk, NormACA, Response Data Format + writeBuf[4] = 0x1F; // Additional Length - TPtr8 vendorId(&writeBuf[8], 8, 8); // Vendor ID (Vendor Specific/Logged by T10) - vendorId.Fill(' ', 8); - vendorId.Copy(iConfig.iVendorId); + TPtr8 vendorId(&writeBuf[8], 8, 8); // Vendor ID (Vendor Specific/Logged by T10) + vendorId.Fill(' ', 8); + vendorId.Copy(iConfig.iVendorId); - TPtr8 productId(&writeBuf[16], 16, 16); // Product ID (Vendor Specific) - productId.Fill(' ', 16); - productId.Copy(iConfig.iProductId); + TPtr8 productId(&writeBuf[16], 16, 16); // Product ID (Vendor Specific) + productId.Fill(' ', 16); + productId.Copy(iConfig.iProductId); - TPtr8 productRev(&writeBuf[32], 4, 4); // Product Revision Level (Vendor Specific) - productRev.Fill(' ', 4); - productRev.Copy(iConfig.iProductRev); + TPtr8 productRev(&writeBuf[32], 4, 4); // Product Revision Level (Vendor Specific) + productRev.Fill(' ', 4); + productRev.Copy(iConfig.iProductRev); + + OstTraceData(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_INQUIRY1, "Vendor ID %s", vendorId.Ptr(), vendorId.Length()); + OstTraceData(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_INQUIRY2, "Product ID %s", productId.Ptr(), productId.Length()); + OstTraceData(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_INQUIRY3, "Product Rev %s", productRev.Ptr(), productRev.Length()); TUint length = aData[5]; - TPtrC8 writeBuf1 = writeBuf.Left(length); - iTransport->SetupWriteData(writeBuf1); + TPtrC8 writeBuf1 = writeBuf.Left(length); + iTransport->SetupWriteData(writeBuf1); - iSenseInfo.SetSense(TSenseInfo::ENoSense); - return ETrue; - } + iSenseInfo.SetSense(TSenseInfo::ENoSense); + return ETrue; + } /** Command Parser for the START STOP UNIT command (0x1B) - + @param aData command data (started form position 1) - @param aLun Logic unit number + @param aLun Logic unit number @return ETrue if successful, TFalse otherwise */ TBool CScsiProtocol::HandleStartStopUnit(TPtrC8& aData, TUint aLun) - { - __FNLOG("CScsiProtocol::HandleStartStopUnit"); + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_STARTSTOPUNIT, ">>> START STOP UNIT"); + const TUint8 KStartMask = 0x01; + const TUint8 KImmedMask = 0x01; + const TUint8 KLoejMask = 0x02; - const TUint8 KStartMask = 0x01; - const TUint8 KImmedMask = 0x01; - const TUint8 KLoejMask = 0x02; - - TBool immed = aData[2] & KImmedMask ? (TBool)ETrue : (TBool)EFalse; - TBool start = aData[5] & KStartMask ? (TBool)ETrue : (TBool)EFalse; - TBool loej = aData[5] & KLoejMask ? (TBool)ETrue : (TBool)EFalse; + TBool immed = aData[2] & KImmedMask ? (TBool)ETrue : (TBool)EFalse; + TBool start = aData[5] & KStartMask ? (TBool)ETrue : (TBool)EFalse; + TBool loej = aData[5] & KLoejMask ? (TBool)ETrue : (TBool)EFalse; - __PRINT2(_L("Data %X %X\n"), aData[2], aData[5]); - __PRINT1(_L("IMMED = %d\n"), immed); - __PRINT1(_L("START = %d\n"), start); - - __PRINT1(_L("LOEJ = %d\n"), loej); + OstTrace1(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_STARTSTOPUNIT1, " IMMED = %d", immed); + OstTrace1(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_STARTSTOPUNIT2, " START = %d", start); + OstTrace1(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_STARTSTOPUNIT3, " LOEJ = %d", loej); - TInt err(KErrNone); - if (loej) - { - if(start) //Start unit - { - err = iDriveManager.Connect(aLun); - __PRINT(_L("Load media\n")); + TInt err(KErrNone); + if (loej) + { + if(start) //Start unit + { + err = iDriveManager.Connect(aLun); #ifdef USB_TRANSFER_PUBLISHER - iBytesRead[aLun] = 0; - iBytesWritten[aLun] = 0; + iBytesRead[aLun] = 0; + iBytesWritten[aLun] = 0; #endif - // publish the initial values - iWriteTransferPublisher->DoPublishDataTransferredEvent(); - iReadTransferPublisher->DoPublishDataTransferredEvent(); - } - else //Stop unit - { - iDriveManager.SetCritical(aLun, EFalse); - err = iDriveManager.Disconnect(aLun); - __PRINT(_L("Unload media\n")); - } - } + // publish the initial values + iWriteTransferPublisher->DoPublishDataTransferredEvent(); + iReadTransferPublisher->DoPublishDataTransferredEvent(); + } + else //Stop unit + { + iDriveManager.SetCritical(aLun, EFalse); + err = iDriveManager.Disconnect(aLun); + } + } - if (err !=KErrNone) //actually we have error here only if the LUN is incorrect - { - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELuNotSupported); - return EFalse; - } - if (immed) - { - return ETrue; - } + if (err !=KErrNone) //actually we have error here only if the LUN is incorrect + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELuNotSupported); + return EFalse; + } + if (immed) + { + return ETrue; + } - CMassStorageDrive* drive= iDriveManager.Drive(aLun, err); + CMassStorageDrive* drive= iDriveManager.Drive(aLun, err); - if (err !=KErrNone || drive == NULL) - { - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELuNotSupported); - return EFalse; - } + if (err !=KErrNone || drive == NULL) + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELuNotSupported); + return EFalse; + } - TInt timeLeft (20); // 1 sec timeout - CMassStorageDrive::TMountState mountState; + TInt timeLeft (20); // 1 sec timeout + CMassStorageDrive::TMountState mountState; - do - { - User::After(1000 * 50); // 50 mSec - --timeLeft; - mountState = drive->MountState(); + do + { + User::After(1000 * 50); // 50 mSec + --timeLeft; + mountState = drive->MountState(); - if ((!start && mountState != CMassStorageDrive::EConnected) - || - (start && - (mountState == CMassStorageDrive::EDisconnecting || - mountState == CMassStorageDrive::EConnected)) - ) - { - return ETrue; - } - } while (timeLeft>0); + if ((!start && mountState != CMassStorageDrive::EConnected) + || + (start && + (mountState == CMassStorageDrive::EDisconnecting || + mountState == CMassStorageDrive::EConnected)) + ) + { + return ETrue; + } + } while (timeLeft>0); - //timeout happend - iSenseInfo.SetSense(TSenseInfo::ENotReady, - TSenseInfo::EAscLogicalUnitDoesNotRespondToSelection); - return EFalse; - } + //timeout happend + iSenseInfo.SetSense(TSenseInfo::ENotReady, + TSenseInfo::EAscLogicalUnitDoesNotRespondToSelection); + return EFalse; + } /** Command Parser for the PREVENT/ALLOW MEDIA REMOVAL command (0x1E) @param aData command data (started form position 1) -@param aLun Logic unit number +@param aLun Logic unit number @return ETrue if successful. */ TBool CScsiProtocol::HandlePreventMediaRemoval(TPtrC8& aData, TUint aLun) - { - __FNLOG("CScsiProtocol::HandlePreventMediaRemoval"); - CMassStorageDrive* drive=GetCheckDrive(aLun); + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_PREVENTMEDIAREMOVAL, ">>> PREVENT MEDIA REMOVAL"); + CMassStorageDrive* drive=GetCheckDrive(aLun); - if (drive == NULL) - { - return EFalse; - } + if (drive == NULL) + { + return EFalse; + } - TInt prevent = aData[5] & 0x01; - __PRINT1(_L("prevent = %d\n"), prevent); - iDriveManager.SetCritical(aLun, prevent); - - return ETrue; - } + TInt prevent = aData[5] & 0x01; + OstTrace1(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_PREVENTMEDIAREMOVAL1, " prevent = %d", prevent); + iDriveManager.SetCritical(aLun, prevent); + return ETrue; + } /** Cancel active state, Invoked by transnport when it stops */ TInt CScsiProtocol::Cancel() - { - iDriveManager.SetCritical(CDriveManager::KAllLuns, EFalse); - return KErrNone; - } + { + iDriveManager.SetCritical(CDriveManager::KAllLuns, EFalse); + return KErrNone; + } TBool CScsiProtocol::HandleReadFormatCapacities(TUint aLun) @@ -619,136 +615,137 @@ * * @return ETrue if successful, else a standard Symbian OS error code. */ - { - __FNLOG("CScsiProtocol::HandleReadFormatCapacities"); - - CMassStorageDrive* drive=GetCheckDrive(aLun); + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_READFORMATCAPACITIES, ">>> READ FORMAT CAPACITIES"); + CMassStorageDrive* drive=GetCheckDrive(aLun); - if (drive == NULL) - { - return EFalse; - } + if (drive == NULL) + { + return EFalse; + } - TLocalDriveCapsV4 driveInfo; + TLocalDriveCapsV4 driveInfo; - TInt err = drive->Caps(driveInfo); + TInt err = drive->Caps(driveInfo); - if(err != KErrNone) - { - __PRINT1(_L("Can't obtain drive Caps. Err=%d \n"),err); - iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); - return EFalse; - } + if(err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_HANDLEREADFORMATCAPACITIES, "Can't obtain drive Caps. Err=%d", err); + iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); + return EFalse; + } - TInt64 driveBlocks = (driveInfo.iDriveAtt & KDriveAttLogicallyRemovable) ? driveInfo.iSize : driveInfo.MediaSizeInBytes(); - driveBlocks /= MAKE_TINT64(0, KDefaultBlockSize); + TInt64 driveBlocks = (driveInfo.iDriveAtt & KDriveAttLogicallyRemovable) ? driveInfo.iSize : driveInfo.MediaSizeInBytes(); + driveBlocks /= MAKE_TINT64(0, KDefaultBlockSize); - TPtr8 writeBuf(NULL, 0); - iTransport->GetCommandBufPtr(writeBuf, KReadFormatCapacitiesCommandLength); - writeBuf.FillZ(KReadFormatCapacitiesCommandLength); + TPtr8 writeBuf(NULL, 0); + iTransport->GetCommandBufPtr(writeBuf, KReadFormatCapacitiesCommandLength); + writeBuf.FillZ(KReadFormatCapacitiesCommandLength); - writeBuf[3] = 0x08; // Capacity List Length + writeBuf[3] = 0x08; // Capacity List Length - TUint32 numBlocks = I64LOW(driveBlocks); + TUint32 numBlocks = I64LOW(driveBlocks); - writeBuf[4] = static_cast((numBlocks & 0xFF000000) >> 24); // Number of blocks - writeBuf[5] = static_cast((numBlocks & 0x00FF0000) >> 16); // - writeBuf[6] = static_cast((numBlocks & 0x0000FF00) >> 8); // - writeBuf[7] = static_cast((numBlocks & 0x000000FF)); // + writeBuf[4] = static_cast((numBlocks & 0xFF000000) >> 24); // Number of blocks + writeBuf[5] = static_cast((numBlocks & 0x00FF0000) >> 16); // + writeBuf[6] = static_cast((numBlocks & 0x0000FF00) >> 8); // + writeBuf[7] = static_cast((numBlocks & 0x000000FF)); // - writeBuf[8] = 0x02; // Formatted size + writeBuf[8] = 0x02; // Formatted size - writeBuf[9] = 0x00; // 512 Byte Blocks - writeBuf[10] = 0x02; // - writeBuf[11] = 0x00; // + writeBuf[9] = 0x00; // 512 Byte Blocks + writeBuf[10] = 0x02; // + writeBuf[11] = 0x00; // - TPtrC8 writeBuf1 = writeBuf; + TPtrC8 writeBuf1 = writeBuf; - iTransport->SetupWriteData(writeBuf1); + iTransport->SetupWriteData(writeBuf1); - return ETrue; - } + return ETrue; + } /** Command Parser for the READ CAPACITY(10) command (0x25) @param aData command data (started form position 1) -@param aLun Logic unit number +@param aLun Logic unit number @return ETrue if successful. */ TBool CScsiProtocol::HandleReadCapacity(TPtrC8& aData, TUint aLun) - { - __FNLOG("CScsiProtocol::HandleReadCapacity"); - CMassStorageDrive* drive=GetCheckDrive(aLun); + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_READCAPACITY, ">>> READ CAPACITY"); + CMassStorageDrive* drive=GetCheckDrive(aLun); - if (drive == NULL) - { - return EFalse; - } + if (drive == NULL) + { + return EFalse; + } - TInt pmi = aData[9] & 0x01; - TInt lba = aData[3] | aData[4] | aData[5] | aData[6]; + TInt pmi = aData[9] & 0x01; + TInt lba = aData[3] | aData[4] | aData[5] | aData[6]; - if (pmi || lba) //do not support partial medium indicator - { - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); - return EFalse; - } + if (pmi || lba) //do not support partial medium indicator + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); + return EFalse; + } - TLocalDriveCapsV4 driveInfo; + TLocalDriveCapsV4 driveInfo; - TInt err = drive->Caps(driveInfo); + TInt err = drive->Caps(driveInfo); - if(err != KErrNone) - { - __PRINT1(_L("Can't obtain drive Caps. Err=%d \n"),err); - iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); - return EFalse; - } + if(err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_HANDLEREADCAPACITY1, "ERROR: Can't obtain drive Caps Err=%d", err); + iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); + return EFalse; + } - TInt64 driveBlocks = 0; - if (driveInfo.iDriveAtt & KDriveAttLogicallyRemovable) - { - // Partition Access only - driveBlocks = driveInfo.iSize / MAKE_TINT64(0, KDefaultBlockSize); - } - else - { - // whole Media Access - driveBlocks = driveInfo.MediaSizeInBytes() / MAKE_TINT64(0, KDefaultBlockSize) - 1; - } - + TInt64 driveBlocks = 0; + if (driveInfo.iDriveAtt & KDriveAttLogicallyRemovable) + { + // Partition Access only + driveBlocks = driveInfo.iSize / MAKE_TINT64(0, KDefaultBlockSize); + } + else + { + // whole Media Access + driveBlocks = driveInfo.MediaSizeInBytes() / MAKE_TINT64(0, KDefaultBlockSize) - 1; + } - TPtr8 writeBuf(NULL, 0); - iTransport->GetCommandBufPtr(writeBuf, KReadCapacityCommandLength); - writeBuf.FillZ(KReadCapacityCommandLength); - if (I64HIGH(driveBlocks) == 0) - { - TUint32 numBlocks = I64LOW(driveBlocks); + TPtr8 writeBuf(NULL, 0); + iTransport->GetCommandBufPtr(writeBuf, KReadCapacityCommandLength); + writeBuf.FillZ(KReadCapacityCommandLength); + + if (I64HIGH(driveBlocks) == 0) + { + TUint32 numBlocks = I64LOW(driveBlocks); - __PRINT2(_L("Block size=%d, NumBlocks=%d\n"), KDefaultBlockSize, numBlocks); - writeBuf[0] = static_cast((numBlocks & 0xFF000000) >> 24); // Number of blocks - writeBuf[1] = static_cast((numBlocks & 0x00FF0000) >> 16); - writeBuf[2] = static_cast((numBlocks & 0x0000FF00) >> 8); - writeBuf[3] = static_cast((numBlocks & 0x000000FF)); - } - else - { - writeBuf[0] = writeBuf[1] = writeBuf[2] = writeBuf[3] = 0xFF; // indicate that size more then )0xFFFFFFFF - } + OstTraceExt2(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_HANDLEREADCAPACITY2, + " Block size=0x%x, NumBlocks=0x%x", + KDefaultBlockSize, numBlocks); + writeBuf[0] = static_cast((numBlocks & 0xFF000000) >> 24); // Number of blocks + writeBuf[1] = static_cast((numBlocks & 0x00FF0000) >> 16); + writeBuf[2] = static_cast((numBlocks & 0x0000FF00) >> 8); + writeBuf[3] = static_cast((numBlocks & 0x000000FF)); + } + else + { + writeBuf[0] = writeBuf[1] = writeBuf[2] = writeBuf[3] = 0xFF; // indicate that size more then )0xFFFFFFFF + } - writeBuf[4] = static_cast((KDefaultBlockSize & 0xFF000000) >> 24); // Block Size - writeBuf[5] = static_cast((KDefaultBlockSize & 0x00FF0000) >> 16); - writeBuf[6] = static_cast((KDefaultBlockSize & 0x0000FF00) >> 8); - writeBuf[7] = static_cast((KDefaultBlockSize & 0x000000FF)); + writeBuf[4] = static_cast((KDefaultBlockSize & 0xFF000000) >> 24); // Block Size + writeBuf[5] = static_cast((KDefaultBlockSize & 0x00FF0000) >> 16); + writeBuf[6] = static_cast((KDefaultBlockSize & 0x0000FF00) >> 8); + writeBuf[7] = static_cast((KDefaultBlockSize & 0x000000FF)); - TPtrC8 writeBuf1 = writeBuf; - iTransport->SetupWriteData(writeBuf1); + TPtrC8 writeBuf1 = writeBuf; + iTransport->SetupWriteData(writeBuf1); - return KErrNone; - } + return KErrNone; + } /** @@ -759,109 +756,109 @@ @return ETrue if successful. */ TBool CScsiProtocol::HandleRead10(TPtrC8& aData, TUint aLun) - { - __FNLOG("CScsiProtocol::HandleRead10"); - CMassStorageDrive* drive = GetCheckDrive(aLun); - if (drive == NULL) - { - return EFalse; - } - TInt rdProtect = aData[2] >> 5; - if (rdProtect) - { - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); - return EFalse; - } + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_READ10, ">>> READ(10)"); + CMassStorageDrive* drive = GetCheckDrive(aLun); + if (drive == NULL) + { + return EFalse; + } + TInt rdProtect = aData[2] >> 5; + if (rdProtect) + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); + return EFalse; + } - const TUint32 lba = LBA(aData); - const TUint16 len = LEN(aData); + const TUint32 lba = LBA(aData); + const TUint32 len = LEN(aData); - __PRINT2(_L("READ(10) : LBA = 0x%x, Length = %d (blocks)\n"), lba, len); + OstTraceExt2(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_HANDLEREAD10_1, + " LBA = 0x%x Transfer Len = 0x%x", lba, len); - if (!len) - { - return ETrue; // do nothing - this is not an error - } + if (!len) + { + return ETrue; // do nothing - this is not an error + } - TLocalDriveCapsV4 driveInfo; - TInt err = drive->Caps(driveInfo); - if (err != KErrNone) - { - __PRINT1(_L("Can't obtain drive Caps. Err=%d \n"), err); - iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); - return EFalse; - } + TLocalDriveCapsV4 driveInfo; + TInt err = drive->Caps(driveInfo); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_HANDLEREAD10_2, "Can't obtain drive Caps. Err=%d", err); + iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); + return EFalse; + } - const TInt64 bOffset = MAKE_TINT64(0, lba) * KDefaultBlockSize; - const TInt bLength = len * KDefaultBlockSize; - const TInt64 theEnd = bOffset + MAKE_TINT64(0, bLength); - const TInt64 mediaSize = (driveInfo.iDriveAtt & KDriveAttLogicallyRemovable) ? driveInfo.iSize : driveInfo.MediaSizeInBytes() ; - - if (theEnd > mediaSize) //check if media big enough for this request - { - __PRINT(_L("err - Request ends out of media\n")); - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELbaOutOfRange); - return EFalse; - } + const TInt64 bOffset = MAKE_TINT64(0, lba) * KDefaultBlockSize; + const TInt bLength = len * KDefaultBlockSize; + const TInt64 theEnd = bOffset + MAKE_TINT64(0, bLength); + const TInt64 mediaSize = (driveInfo.iDriveAtt & KDriveAttLogicallyRemovable) ? driveInfo.iSize : driveInfo.MediaSizeInBytes() ; + + if (theEnd > mediaSize) //check if media big enough for this request + { + OstTrace0(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_HANDLEREAD10_3, "ERROR: Requested size is out of media range"); + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELbaOutOfRange); + return EFalse; + } #ifdef MSDC_MULTITHREADED - iWriteDriveThread->WaitForWriteEmpty(); + iWriteDriveThread->WaitForWriteEmpty(); - // check if our buffer can hold requested data - if (iReadDriveThread->iThreadContext->MaxBufferLength() < bLength) - { - __PRINT(_L("err - Buffer too small\n")); - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); - return EFalse; - } + // check if our buffer can hold requested data + if (iReadDriveThread->iThreadContext->MaxBufferLength() < bLength) + { + OstTrace0(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_HANDLEREAD10_4, "ERROR: Buffer too small"); + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); + return EFalse; + } // Optimisation note : If the host is reading from sectors it just wrote to, // then we have to force a cache-miss so that the real data is read from the - // drive. It would be possible to service the read from the write buffers, - // but as the host is probably trying to verify the write data, we don't do - // that for now. - if (!iReadDriveThread->ReadDriveData(drive, bOffset, bLength, iWriteDriveThread->IsRecentlyWritten(bOffset,bLength))) - { - iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); - return EFalse; - } + // drive. It would be possible to service the read from the write buffers, + // but as the host is probably trying to verify the write data, we don't do + // that for now. + if (!iReadDriveThread->ReadDriveData(drive, bOffset, bLength, iWriteDriveThread->IsRecentlyWritten(bOffset,bLength))) + { + iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); + return EFalse; + } - iWriteDriveThread->SetCommandWrite10(EFalse); - TBlockDesc* &desc = iReadDriveThread->iThreadContext->iBuffer.iDescReadPtr; - TPtrC8 writeBuf1 = desc->iBuf; + iWriteDriveThread->SetCommandWrite10(EFalse); + TBlockDesc* &desc = iReadDriveThread->iThreadContext->iBuffer.iDescReadPtr; + TPtrC8 writeBuf1 = desc->iBuf; #else - - TPtr8 writeBuf(NULL, 0); - iTransport->GetReadDataBufPtr(writeBuf); - // check if our buffer can hold requested data - if (writeBuf.MaxLength() < bLength) - { - __PRINT(_L("err - Buffer too small\n")); - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); - return EFalse; - } + + TPtr8 writeBuf(NULL, 0); + iTransport->GetReadDataBufPtr(writeBuf); + // check if our buffer can hold requested data + if (writeBuf.MaxLength() < bLength) + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); + return EFalse; + } - err = drive->Read(bOffset, bLength, writeBuf, drive->IsWholeMediaAccess()); + err = drive->Read(bOffset, bLength, writeBuf, drive->IsWholeMediaAccess()); - if (err != KErrNone) - { - __PRINT1(_L("Read failed, err=%d\n"), err); - iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); - return EFalse; - } + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_HANDLEREAD10_5, "ERROR: Read failed err=%d", err); + iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); + return EFalse; + } - TPtrC8 writeBuf1 = writeBuf; + TPtrC8 writeBuf1 = writeBuf; #endif // MSDC_MULTITHREADED #ifdef USB_TRANSFER_PUBLISHER - iBytesRead[aLun] += writeBuf1.Length(); + iBytesRead[aLun] += writeBuf1.Length(); #endif - iReadTransferPublisher->StartTimer(); + iReadTransferPublisher->StartTimer(); - // Set up data write to the host - iTransport->SetupWriteData(writeBuf1); + // Set up data write to the host + iTransport->SetupWriteData(writeBuf1); - return ETrue; - } + return ETrue; + } /** @@ -872,73 +869,73 @@ @return ETrue if successful. */ TBool CScsiProtocol::HandleWrite10(TPtrC8& aData, TUint aLun) - { - __FNLOG("CScsiProtocol::HandleWrite10"); - CMassStorageDrive* drive = GetCheckDrive(aLun); - if (drive == NULL) - { - return EFalse; - } - TInt wrProtect = aData[2] >> 5; - if (wrProtect) - { - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); - return EFalse; - } + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_WRITE10, ">>> WRITE(10)"); + CMassStorageDrive* drive = GetCheckDrive(aLun); + if (drive == NULL) + { + return EFalse; + } + TInt wrProtect = aData[2] >> 5; + if (wrProtect) + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); + return EFalse; + } - const TUint32 lba = LBA(aData); - const TUint16 len = LEN(aData); - __PRINT2(_L("WRITE(10) : LBA = 0x%x, Length = %d (blocks)\n"), lba, len); - if (!len) - { - return ETrue; // do nothing - this is not an error - } + const TUint32 lba = LBA(aData); + const TUint32 len = LEN(aData); + OstTraceExt2(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_HANDLEWRITE10_1, "LBA = 0x%x, Transfer Len = 0x%x", lba, len); + if (!len) + { + return ETrue; // do nothing - this is not an error + } - TLocalDriveCapsV4 driveInfo; - TInt err = drive->Caps(driveInfo); - if (err != KErrNone) - { - __PRINT1(_L("Can't obtain drive Caps. Err=%d \n"), err); - iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); - return EFalse; - } - if (driveInfo.iMediaAtt & KMediaAttWriteProtected || - driveInfo.iMediaAtt & KMediaAttLocked) - { - iSenseInfo.SetSense(TSenseInfo::EDataProtection, TSenseInfo::EWriteProtected); - return EFalse; - } + TLocalDriveCapsV4 driveInfo; + TInt err = drive->Caps(driveInfo); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_WRITE10_2, "ERROR: Can't obtain drive Caps Err=%d", err); + iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); + return EFalse; + } + if (driveInfo.iMediaAtt & KMediaAttWriteProtected || + driveInfo.iMediaAtt & KMediaAttLocked) + { + iSenseInfo.SetSense(TSenseInfo::EDataProtection, TSenseInfo::EWriteProtected); + return EFalse; + } - const TInt64 bOffset = MAKE_TINT64(0, lba) * KDefaultBlockSize; - iBytesRemain = len * KDefaultBlockSize; - const TInt64 theEnd = bOffset + MAKE_TINT64(0, iBytesRemain); - const TInt64 mediaSize = (driveInfo.iDriveAtt & KDriveAttLogicallyRemovable) ? driveInfo.iSize : driveInfo.MediaSizeInBytes() ; + const TInt64 bOffset = MAKE_TINT64(0, lba) * KDefaultBlockSize; + iBytesRemain = len * KDefaultBlockSize; + const TInt64 theEnd = bOffset + MAKE_TINT64(0, iBytesRemain); + const TInt64 mediaSize = (driveInfo.iDriveAtt & KDriveAttLogicallyRemovable) ? driveInfo.iSize : driveInfo.MediaSizeInBytes() ; - if (theEnd > mediaSize) //check if media big enough for this request - { - __PRINT(_L("err - Request ends out of media\n")); - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELbaOutOfRange); - return EFalse; - } + if (theEnd > mediaSize) //check if media big enough for this request + { + OstTrace0(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_HANDLEWRITE10_3, "Requested size is out of media range"); + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELbaOutOfRange); + return EFalse; + } #ifdef MSDC_MULTITHREADED - iWriteDriveThread->SetCommandWrite10(ETrue); + iWriteDriveThread->SetCommandWrite10(ETrue); #endif - // Set up the first request for data from the host - either - // KMaxBufSize or the entire transfer length, whichever is smallest. - TUint thisLength = (iBytesRemain > KMaxBufSize) ? KMaxBufSize : iBytesRemain; - thisLength = (thisLength > iMediaWriteSize) ? iMediaWriteSize : thisLength; + // Set up the first request for data from the host - either + // KMaxBufSize or the entire transfer length, whichever is smallest. + TUint thisLength = (iBytesRemain > KMaxBufSize) ? KMaxBufSize : iBytesRemain; + thisLength = (thisLength > iMediaWriteSize) ? iMediaWriteSize : thisLength; - iOffset = bOffset; - iLastCommand = EWrite10; - iLastLun = aLun; + iOffset = bOffset; + iLastCommand = EWrite10; + iLastLun = aLun; - iWriteTransferPublisher->StartTimer(); - iTransport->SetupReadData(thisLength); + iWriteTransferPublisher->StartTimer(); + iTransport->SetupReadData(thisLength); - return ETrue; - } + return ETrue; + } /** @@ -949,94 +946,94 @@ @return ETrue if successful. */ TBool CScsiProtocol::HandleVerify10(TPtrC8& aData, TUint aLun) - { - __FNLOG("CScsiProtocol::HandleVerify10"); - CMassStorageDrive* drive = GetCheckDrive(aLun); - if (drive == NULL) - { - return EFalse; - } + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_VERIFY10, ">>> VERIFY(10)"); + CMassStorageDrive* drive = GetCheckDrive(aLun); + if (drive == NULL) + { + return EFalse; + } - TInt vrProtect = aData[2] >> 5; - if (vrProtect) - { - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); - return EFalse; - } + TInt vrProtect = aData[2] >> 5; + if (vrProtect) + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); + return EFalse; + } - const TUint32 lba = LBA(aData); - const TUint16 len = LEN(aData); - __PRINT2(_L("VERIFY(10) : LBA = %d, Length = %d (blocks)\n"), lba, len); + const TUint32 lba = LBA(aData); + const TUint32 len = LEN(aData); + OstTraceExt2(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_VERIFY10_1, "VERIFY(10) : LBA = 0x%x Transfer Len = 0x%x", lba, len); - TInt bytChk = aData[2] & 0x02; - if (!len) - { - return ETrue; // do nothing - this is not an error - } + TInt bytChk = aData[2] & 0x02; + if (!len) + { + return ETrue; // do nothing - this is not an error + } - TLocalDriveCapsV4 driveInfo; - TInt err = drive->Caps(driveInfo); - if (err != KErrNone) - { - __PRINT1(_L("Can't obtain drive Caps. Err=%d \n"), err); - iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); - return EFalse; - } + TLocalDriveCapsV4 driveInfo; + TInt err = drive->Caps(driveInfo); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_VERIFY10_2, "ERROR: Can't obtain drive Caps Err=%d", err); + iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); + return EFalse; + } - const TInt64 bOffset = MAKE_TINT64(0, lba) * KDefaultBlockSize; - const TInt bLength = len * KDefaultBlockSize; - const TInt64 theEnd = bOffset + MAKE_TINT64(0, bLength); - const TInt64 mediaSize = (driveInfo.iDriveAtt & KDriveAttLogicallyRemovable) ? driveInfo.iSize : driveInfo.MediaSizeInBytes() ; + const TInt64 bOffset = MAKE_TINT64(0, lba) * KDefaultBlockSize; + const TInt bLength = len * KDefaultBlockSize; + const TInt64 theEnd = bOffset + MAKE_TINT64(0, bLength); + const TInt64 mediaSize = (driveInfo.iDriveAtt & KDriveAttLogicallyRemovable) ? driveInfo.iSize : driveInfo.MediaSizeInBytes() ; - // check if media big enough for this request - if (theEnd > mediaSize) - { - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELbaOutOfRange); - return EFalse; - } + // check if media big enough for this request + if (theEnd > mediaSize) + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::ELbaOutOfRange); + return EFalse; + } - // check if our buffer can hold requested data + // check if our buffer can hold requested data #ifdef MSDC_MULTITHREADED - if (iWriteDriveThread->iThreadContext->MaxBufferLength() < bLength) + if (iWriteDriveThread->iThreadContext->MaxBufferLength() < bLength) #else - TPtr8 writeBuf(NULL, 0); - iTransport->GetReadDataBufPtr(writeBuf); - if (writeBuf.MaxLength() < bLength) + TPtr8 writeBuf(NULL, 0); + iTransport->GetReadDataBufPtr(writeBuf); + if (writeBuf.MaxLength() < bLength) #endif - { - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); - return EFalse; - } + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest, TSenseInfo::EInvalidFieldInCdb); + return EFalse; + } - if (!bytChk) - { - // BYTCHK==0 : Perform a medium verification with no data comparison and not transfer any data from the application client data-out buffer. - // The device should attempt to read from the specified locations + if (!bytChk) + { + // BYTCHK==0 : Perform a medium verification with no data comparison and not transfer any data from the application client data-out buffer. + // The device should attempt to read from the specified locations #ifdef MSDC_MULTITHREADED - TPtr8 writeBuf = iWriteDriveThread->iThreadContext->GetReadBuffer(bLength); + TPtr8 writeBuf = iWriteDriveThread->iThreadContext->GetReadBuffer(bLength); #else - writeBuf.SetLength(bLength); + writeBuf.SetLength(bLength); #endif - err = drive->Read(bOffset, bLength, writeBuf, drive->IsWholeMediaAccess()); - if (err != KErrNone) - { - iSenseInfo.SetSense(TSenseInfo::EMisCompare); - return EFalse; - } - return ETrue; - } + err = drive->Read(bOffset, bLength, writeBuf, drive->IsWholeMediaAccess()); + if (err != KErrNone) + { + iSenseInfo.SetSense(TSenseInfo::EMisCompare); + return EFalse; + } + return ETrue; + } - // BYTCHK==1 : perform a byte-by-byte comparison of user data read from the medium & user data transferred from the application client data-out buffer. - // The host sends data in the data-transport phase, and the device should verify that the received data matches what is stored in the device. + // BYTCHK==1 : perform a byte-by-byte comparison of user data read from the medium & user data transferred from the application client data-out buffer. + // The host sends data in the data-transport phase, and the device should verify that the received data matches what is stored in the device. - iOffset = bOffset; - iLastCommand = EVerify10; - iLastLun = aLun; + iOffset = bOffset; + iLastCommand = EVerify10; + iLastLun = aLun; - iTransport->SetupReadData(bLength); + iTransport->SetupReadData(bLength); - return ETrue; - } + return ETrue; + } /** @@ -1051,176 +1048,138 @@ KErrNone if command processing is complete and was successful. */ TInt CScsiProtocol::ReadComplete(TInt aError) - { - __FNLOG("CScsiProtocol::ReadComplete"); - __PRINT1(_L("Error = 0x%X \n"), aError); - const TInt64 bOffset = iOffset; - TUint8 lastCommand = iLastCommand; - TUint lastLun = iLastLun; + { + OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CSCSIPROTOCOL_READCOMPLETE0, "ReadComplete = 0x%X", aError); + const TInt64 bOffset = iOffset; + TUint8 lastCommand = iLastCommand; + TUint lastLun = iLastLun; - iOffset = 0; - iLastCommand = EUndefinedCommand; - iLastLun = KUndefinedLun; + iOffset = 0; + iLastCommand = EUndefinedCommand; + iLastLun = KUndefinedLun; - __PRINT1(_L("Last command was: %s\n"), - (lastCommand == EUndefinedCommand) ? _S("Undefined") : - ((lastCommand == EWrite10) ? _S("EWrite10") : - ((lastCommand == EVerify10) ? _S("EVerify10") : - _S("Unknown")))); +// OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CSCSIPROTOCOL_READCOMPLETE1, "lastCommand = d", lastCommand); - if (aError != KErrNone || - lastCommand == EUndefinedCommand || - lastLun == KUndefinedLun) - { - iSenseInfo.SetSense(TSenseInfo::EAbortedCommand); - return KErrAbort; - } + if (aError != KErrNone || + lastCommand == EUndefinedCommand || + lastLun == KUndefinedLun) + { + iSenseInfo.SetSense(TSenseInfo::EAbortedCommand); + return KErrAbort; + } - CMassStorageDrive* drive = GetCheckDrive(lastLun); - if (drive == NULL) - { - return KErrAbort; - } + CMassStorageDrive* drive = GetCheckDrive(lastLun); + if (drive == NULL) + { + return KErrAbort; + } - if (lastCommand == EWrite10) - { - TPtrC8 writeBuf(NULL, 0); - iTransport->GetWriteDataBufPtr(writeBuf); - + if (lastCommand == EWrite10) + { + TPtrC8 writeBuf(NULL, 0); + iTransport->GetWriteDataBufPtr(writeBuf); + #ifdef USB_TRANSFER_PUBLISHER - iBytesWritten[lastLun] += writeBuf.Length(); + iBytesWritten[lastLun] += writeBuf.Length(); #endif #ifdef MSDC_MULTITHREADED - TInt err = iWriteDriveThread->WriteDriveData(drive, bOffset, writeBuf, ProcessWriteComplete, this); + TInt err = iWriteDriveThread->WriteDriveData(drive, bOffset, writeBuf, ProcessWriteComplete, this); + + if (err != KErrNone) + { + iDeferredSenseInfo.SetSense(TSenseInfo::EMediumError); + } - if (err != KErrNone) - { - iDeferredSenseInfo.SetSense(TSenseInfo::EMediumError); - } + TUint thisLength = iWriteDriveThread->WriteBufferLength(); +#else + OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CSCSIPROTOCOL_READCOMPLETE2, "SCSI: writing 0x%x bytes", writeBuf.Length()); + TInt err = drive->Write(bOffset, writeBuf, drive->IsWholeMediaAccess()); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE_MEDIA, CSCSIPROTOCOL_READCOMPLETE3, "Error after write = 0x%x", err); + iSenseInfo.SetSense(TSenseInfo::EAbortedCommand); + return KErrAbort; + } - TUint thisLength = iWriteDriveThread->WriteBufferLength(); -#else -#ifdef MEASURE_AND_DISPLAY_WRITE_TIME - RDebug::Print(_L("SCSI: writing %d bytes\n"), writeBuf.Length()); - TTime t0, t1; - t0.HomeTime(); -#else - __PRINT1(_L("SCSI: writing %d bytes\n"), writeBuf.Length()); -#endif + TUint thisLength = writeBuf.Length(); +#endif // MSDC_MULTITHREADED + iOffset = bOffset + MAKE_TINT64(0, thisLength); + iBytesRemain -= thisLength; + if ((TInt)iBytesRemain > 0) + { + // More data is expected - set up another request to read from the host + iLastCommand = EWrite10; + iLastLun = lastLun; + + TUint minLength = (iBytesRemain < iMediaWriteSize) ? iBytesRemain : iMediaWriteSize; + TUint bytesAvail = iTransport->BytesAvailable() & ~(KDefaultBlockSize-1); + + TBool wait = EFalse; + thisLength = bytesAvail ? bytesAvail : minLength; + if (thisLength < minLength) + { + // Not enough data is available at the transport to satisfy the request, + // so return KErrNotReady to indicate that the transport should wait. + thisLength = minLength; + wait = ETrue; + } -#ifdef INJECT_ERROR - if (writeBuf[0] == '2') - { - writeBuf[0] = 'x'; - RDebug::Printf("Injecting error"); - } + thisLength = (thisLength > KMaxBufSize) ? KMaxBufSize : thisLength; + + iTransport->SetupReadData(thisLength); - RDebug::Printf("%08lx %x [%x] [%x]", bOffset,writeBuf.Length(), - writeBuf[0], - writeBuf[writeBuf.Length()-1]); + return wait ? KErrNotReady : KErrCompletion; + } + } + else if (lastCommand == EVerify10) + { + HBufC8* hostData = NULL; + TPtrC8 writeBuf(NULL, 0); + iTransport->GetWriteDataBufPtr(writeBuf); +#ifdef MSDC_MULTITHREADED + TRAPD(err, hostData = HBufC8::NewL(writeBuf.Length())); +#else + TRAPD(err, hostData = HBufC8::NewL(writeBuf.Length())); #endif - - TInt err = drive->Write(bOffset, writeBuf, drive->IsWholeMediaAccess()); + if (err != KErrNone || hostData == NULL) + { + iSenseInfo.SetSense(TSenseInfo::EAbortedCommand, TSenseInfo::EInsufficientRes); + return KErrAbort; + } -#ifdef INJECT_ERROR - if (writeBuf[0] == 'x') - { - err = KErrUnknown; - } +#ifdef MSDC_MULTITHREADED + // copy the data + *hostData = writeBuf; + TPtr8 readBuf = iWriteDriveThread->iThreadContext->GetReadBuffer(); + err = drive->Read(bOffset, writeBuf.Length(), readBuf, drive->IsWholeMediaAccess()); + if (err == KErrNone) + { + err = (hostData->Compare(readBuf) == 0) ? KErrNone : KErrCorrupt; + } +#else + *hostData = writeBuf; + TPtr8 readBuf((TUint8*) writeBuf.Ptr(), writeBuf.Length()); + err = drive->Read(bOffset, writeBuf.Length(), readBuf, drive->IsWholeMediaAccess()); + if (err == KErrNone) + { + err = (hostData->Compare(readBuf) == 0) ? KErrNone : KErrCorrupt; + } #endif -#ifdef MEASURE_AND_DISPLAY_WRITE_TIME - t1.HomeTime(); - const TTimeIntervalMicroSeconds time = t1.MicroSecondsFrom(t0); - const TUint time_ms = I64LOW(time.Int64() / 1000); - RDebug::Print(_L("SCSI: write took %d ms\n"), time_ms); -#endif - if (err != KErrNone) - { - __PRINT1(_L("Error after write = 0x%X \n"), err); - iSenseInfo.SetSense(TSenseInfo::EAbortedCommand); - return KErrAbort; - } - - TUint thisLength = writeBuf.Length(); -#endif // MSDC_MULTITHREADED - iOffset = bOffset + MAKE_TINT64(0, thisLength); - iBytesRemain -= thisLength; - if ((TInt)iBytesRemain > 0) - { - // More data is expected - set up another request to read from the host - iLastCommand = EWrite10; - iLastLun = lastLun; - - TUint minLength = (iBytesRemain < iMediaWriteSize) ? iBytesRemain : iMediaWriteSize; - TUint bytesAvail = iTransport->BytesAvailable() & ~(KDefaultBlockSize-1); - - TBool wait = EFalse; - thisLength = bytesAvail ? bytesAvail : minLength; - if (thisLength < minLength) - { - // Not enough data is available at the transport to satisfy the request, - // so return KErrNotReady to indicate that the transport should wait. - thisLength = minLength; - wait = ETrue; - } - - thisLength = (thisLength > KMaxBufSize) ? KMaxBufSize : thisLength; - - iTransport->SetupReadData(thisLength); + if (err != KErrNone) + { + iSenseInfo.SetSense(TSenseInfo::EMisCompare); + } - return wait ? KErrNotReady : KErrCompletion; - } - } - else if (lastCommand == EVerify10) - { - HBufC8* hostData = NULL; - TPtrC8 writeBuf(NULL, 0); - iTransport->GetWriteDataBufPtr(writeBuf); -#ifdef MSDC_MULTITHREADED - TRAPD(err, hostData = HBufC8::NewL(writeBuf.Length())); -#else - TRAPD(err, hostData = HBufC8::NewL(writeBuf.Length())); -#endif - if (err != KErrNone || hostData == NULL) - { - iSenseInfo.SetSense(TSenseInfo::EAbortedCommand, TSenseInfo::EInsufficientRes); - return KErrAbort; - } - -#ifdef MSDC_MULTITHREADED - // copy the data - *hostData = writeBuf; - TPtr8 readBuf = iWriteDriveThread->iThreadContext->GetReadBuffer(); - err = drive->Read(bOffset, writeBuf.Length(), readBuf, drive->IsWholeMediaAccess()); - if (err == KErrNone) - { - err = (hostData->Compare(readBuf) == 0) ? KErrNone : KErrCorrupt; - } -#else - *hostData = writeBuf; - TPtr8 readBuf((TUint8*) writeBuf.Ptr(), writeBuf.Length()); - err = drive->Read(bOffset, writeBuf.Length(), readBuf, drive->IsWholeMediaAccess()); - if (err == KErrNone) - { - err = (hostData->Compare(readBuf) == 0) ? KErrNone : KErrCorrupt; - } -#endif - - if (err != KErrNone) - { - iSenseInfo.SetSense(TSenseInfo::EMisCompare); - } - - delete hostData; - } - else // unknown command - { - iSenseInfo.SetSense(TSenseInfo::EAbortedCommand); - } - return iSenseInfo.SenseOk() ? KErrNone : KErrAbort; - } + delete hostData; + } + else // unknown command + { + iSenseInfo.SetSense(TSenseInfo::EAbortedCommand); + } + return iSenseInfo.SenseOk() ? KErrNone : KErrAbort; + } /** @@ -1229,57 +1188,55 @@ @return ETrue if successful. */ TBool CScsiProtocol::HandleModeSense6(TPtrC8& aData, TUint aLun) - { - __FNLOG("CScsiProtocol::HandleModeSense6"); - - TInt pageCode = aData[3] & 0x3F; - TUint8 pageControl= static_cast(aData[3] >>6); + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_MODESENSE6, ">>> MODESENSE(06)"); + TInt pageCode = aData[3] & 0x3F; + TUint8 pageControl= static_cast(aData[3] >>6); - if (pageCode != KAllPages || pageControl == KChangeableValues) - { - __PRINT(_L("TSenseInfo::EIllegalRequest,TSenseInfo::EInvalidFieldInCdb")); - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest,TSenseInfo::EInvalidFieldInCdb); - return EFalse; - } + if (pageCode != KAllPages || pageControl == KChangeableValues) + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest,TSenseInfo::EInvalidFieldInCdb); + return EFalse; + } - // reserve 4 bytes for Length, Media type, Device-specific parameter and Block descriptor length - TPtr8 writeBuf(NULL, 0); - iTransport->GetCommandBufPtr(writeBuf, KModeSense6CommandLength); - writeBuf.FillZ(KModeSense6CommandLength); + // reserve 4 bytes for Length, Media type, Device-specific parameter and Block descriptor length + TPtr8 writeBuf(NULL, 0); + iTransport->GetCommandBufPtr(writeBuf, KModeSense6CommandLength); + writeBuf.FillZ(KModeSense6CommandLength); - if (pageControl != KDefaultValues) - { - //check if drive write protected - CMassStorageDrive* drive=GetCheckDrive(aLun); - if (drive == NULL) - { - __PRINT(_L("drive == null")); - return EFalse; - } + if (pageControl != KDefaultValues) + { + //check if drive write protected + CMassStorageDrive* drive=GetCheckDrive(aLun); + if (drive == NULL) + { + OstTrace0(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_HANDLEMODESENSE6_1, "drive == null"); + return EFalse; + } - TLocalDriveCapsV4 driveInfo; - TInt err = drive->Caps(driveInfo); - if (err != KErrNone) - { - __PRINT(_L("TSenseInfo::ENotReady")); - iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); - return EFalse ; - } + TLocalDriveCapsV4 driveInfo; + TInt err = drive->Caps(driveInfo); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_MODESENSE6_2, "ERROR: Can't obtain drive Caps Err=%d", err); + iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); + return EFalse ; + } - if (driveInfo.iMediaAtt & KMediaAttWriteProtected) - { - writeBuf[2] = 1<<7; // set SWP bit at the Device Specific parameters - } - } + if (driveInfo.iMediaAtt & KMediaAttWriteProtected) + { + writeBuf[2] = 1<<7; // set SWP bit at the Device Specific parameters + } + } - writeBuf[0]=3; //Sending only Mode parameter header + writeBuf[0]=3; //Sending only Mode parameter header - TPtrC8 writeBuf1 = writeBuf; + TPtrC8 writeBuf1 = writeBuf; - iTransport->SetupWriteData(writeBuf1); + iTransport->SetupWriteData(writeBuf1); - return (iSenseInfo.SenseOk()); - } + return (iSenseInfo.SenseOk()); + } /** @@ -1288,57 +1245,55 @@ @return ETrue if successful. */ TBool CScsiProtocol::HandleModeSense10(TPtrC8& aData, TUint aLun) - { - __FNLOG("CScsiProtocol::HandleModeSense10"); - - TInt pageCode = aData[3] & 0x3F; - TUint8 pageControl= static_cast(aData[3] >>6); + { + OstTrace0(TRACE_SMASSSTORAGE_SCSI, CSCSIPROTOCOL_MODESENSE10, ">>> MODESENSE(10)"); + TInt pageCode = aData[3] & 0x3F; + TUint8 pageControl= static_cast(aData[3] >>6); - if (pageCode != KAllPages || pageControl == KChangeableValues) - { - __PRINT(_L("TSenseInfo::EIllegalRequest,TSenseInfo::EInvalidFieldInCdb")); - iSenseInfo.SetSense(TSenseInfo::EIllegalRequest,TSenseInfo::EInvalidFieldInCdb); - return EFalse; - } + if (pageCode != KAllPages || pageControl == KChangeableValues) + { + iSenseInfo.SetSense(TSenseInfo::EIllegalRequest,TSenseInfo::EInvalidFieldInCdb); + return EFalse; + } - // reserve 8 bytes for Length, Media type, Device-specific parameter and Block descriptor length - TPtr8 writeBuf(NULL, 0); - iTransport->GetCommandBufPtr(writeBuf, KModeSense10CommandLength); - writeBuf.FillZ(KModeSense10CommandLength); + // reserve 8 bytes for Length, Media type, Device-specific parameter and Block descriptor length + TPtr8 writeBuf(NULL, 0); + iTransport->GetCommandBufPtr(writeBuf, KModeSense10CommandLength); + writeBuf.FillZ(KModeSense10CommandLength); - if (pageControl != KDefaultValues) - { - //check if drive write protected - CMassStorageDrive* drive=GetCheckDrive(aLun); - if (drive == NULL) - { - __PRINT(_L("drive == null")); - return EFalse; - } + if (pageControl != KDefaultValues) + { + //check if drive write protected + CMassStorageDrive* drive=GetCheckDrive(aLun); + if (drive == NULL) + { + OstTrace0(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_HANDLEMODESENSE10_1, "drive == null"); + return EFalse; + } - TLocalDriveCapsV4 driveInfo; - TInt err = drive->Caps(driveInfo); - if (err != KErrNone) - { - __PRINT(_L("TSenseInfo::ENotReady")); - iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); - return EFalse ; - } + TLocalDriveCapsV4 driveInfo; + TInt err = drive->Caps(driveInfo); + if (err != KErrNone) + { + OstTrace1(TRACE_SMASSSTORAGE, CSCSIPROTOCOL_MODESENSE10_1, "ERROR: Can't obtain drive Caps Err=%d", err); + iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent); + return EFalse ; + } - if (driveInfo.iMediaAtt & KMediaAttWriteProtected) - { - writeBuf[3] = 1<<7; // set SWP bit at the Device Specific parameters - } - } + if (driveInfo.iMediaAtt & KMediaAttWriteProtected) + { + writeBuf[3] = 1<<7; // set SWP bit at the Device Specific parameters + } + } - writeBuf[1]=6; //Sending only Mode parameter header + writeBuf[1]=6; //Sending only Mode parameter header - TPtrC8 writeBuf1 = writeBuf; + TPtrC8 writeBuf1 = writeBuf; - iTransport->SetupWriteData(writeBuf1); + iTransport->SetupWriteData(writeBuf1); - return (iSenseInfo.SenseOk()); - } + return (iSenseInfo.SenseOk()); + } diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/smassstorage.mmh --- a/userlibandfileserver/fileserver/smassstorage/smassstorage.mmh Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/smassstorage/smassstorage.mmh Mon Oct 11 17:54:41 2010 +0100 @@ -20,9 +20,11 @@ @file */ -TARGETTYPE fsy +TARGETTYPE fsy USERINCLUDE ../inc +USERINCLUDE traces + #ifdef SYMBIAN_OLD_EXPORT_LOCATION SYSTEMINCLUDE ../inc SYMBIAN_BASE_SYSTEMINCLUDE(kernel) @@ -32,12 +34,17 @@ SOURCEPATH ../smassstorage SOURCE scsiprot.cpp SOURCE cbulkonlytransport.cpp + +// Double Buffering media interface SOURCE cbulkonlytransportusbcldd.cpp +SOURCE tbulkmm.cpp +SOURCE rwdrivethread.cpp +// Shared Chunk media interface #if !defined(WINS) && !defined(GENERIC_X86) SOURCE cbulkonlytransportusbcscldd.cpp #endif + SOURCE cactivedevicestatenotifierbase.cpp -SOURCE rwdrivethread.cpp SOURCE cmassstoragefilesystem.cpp SOURCE cmassstoragemountcb.cpp SOURCE cusbmassstoragecontroller.cpp @@ -47,20 +54,22 @@ SOURCE drivepublisher.cpp LIBRARY efile.lib efsrv.lib euser.lib + +// Shared Chunk library #if !defined(WINS) && !defined(GENERIC_X86) LIBRARY usbcsc_bil.lib #endif SOURCEPATH . -DOCUMENT ../group/release.txt +DOCUMENT ../group/release.txt START WINS -BASEADDRESS 0x61000000 +BASEADDRESS 0x61000000 END -UID 0 0x100000d6 //TODO reserve new UID +UID 0 0x100000d6 //TODO reserve new UID unpaged diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/tbulkmm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/smassstorage/tbulkmm.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** + @file + @internalTechnology +*/ + +#include +#include "tbulkmm.h" + +#ifdef MSDC_MULTITHREADED +TBulkMm::TBulkMm() +: iSwap(ETrue) + { + } + + +void TBulkMm::GetNextTransferBuffer(TUint aLength, TPtr8& aPtr) + { + if (iSwap) + { + iDataBuf1.SetLength(aLength); + aPtr.Set(iDataBuf1.LeftTPtr(iDataBuf1.Length())); + iSwap = EFalse; + } + else + { + iDataBuf2.SetLength(aLength); + aPtr.Set(iDataBuf2.LeftTPtr(iDataBuf2.Length())); + iSwap = ETrue; + } + } +#endif + diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/smassstorage/traces/OstTraceDefinitions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/smassstorage/traces/OstTraceDefinitions.h Mon Oct 11 17:54:41 2010 +0100 @@ -0,0 +1,21 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: + +#ifndef __OSTTRACEDEFINITIONS_H__ +#define __OSTTRACEDEFINITIONS_H__ +// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler +// REMOVE BEFORE CHECK-IN TO VERSION CONTROL +//#define OST_TRACE_COMPILER_IN_USE +#include +#endif