sl@0: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: /** sl@0: @file sl@0: @internalTechnology sl@0: */ sl@0: sl@0: #include sl@0: sl@0: #include "usbmshostpanic.h" sl@0: #include "debug.h" sl@0: #include "msdebug.h" sl@0: sl@0: #include "msctypes.h" sl@0: #include "mprotocol.h" sl@0: #include "mblocktransferprotocol.h" sl@0: #include "tspcclientinterface.h" sl@0: #include "cscsiprotocol.h" sl@0: #include "cmassstoragefsm.h" sl@0: sl@0: sl@0: /** sl@0: Constructor sl@0: sl@0: @param aScsiProtocol A reference to CScsiProtocol sl@0: */ sl@0: TMassStorage::TMassStorage(CScsiProtocol& aScsiProtocol) sl@0: : iScsiProtocol(aScsiProtocol) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: /** sl@0: Clear StatusCheck flag. Periodic status checking is used for removable media. sl@0: */ sl@0: void CMassStorageFsm::ClearStatusCheck() sl@0: { sl@0: __MSFNLOG sl@0: iStatusCheck = EFalse; sl@0: } sl@0: sl@0: sl@0: /** sl@0: Set StatusCheck flag. Periodic status checking is used for removable media. sl@0: */ sl@0: void CMassStorageFsm::SetStatusCheck() sl@0: { sl@0: __MSFNLOG sl@0: iStatusCheck = ETrue; sl@0: } sl@0: sl@0: sl@0: /** sl@0: Get the boolean state of StatusCheck flag. sl@0: sl@0: @return TBool ETrue if StatusCheck flag is set sl@0: */ sl@0: TBool CMassStorageFsm::IsStatusCheck() const sl@0: { sl@0: __MSFNSLOG sl@0: return iStatusCheck; sl@0: } sl@0: sl@0: sl@0: /** sl@0: Device supports SCSI BLOCK COMMANDS. sl@0: sl@0: @return TBool Returns ETrue if the SBC interface is initialised sl@0: */ sl@0: TBool TMassStorage::IsSbcSet() const sl@0: { sl@0: __MSFNSLOG sl@0: return iScsiProtocol.MsIsSbcSet(); sl@0: } sl@0: sl@0: /** sl@0: Device is removable media sl@0: sl@0: @return TBool Returns ETrue if removable sl@0: */ sl@0: TBool TMassStorage::IsRemovableMedia() const sl@0: { sl@0: __MSFNSLOG sl@0: return iScsiProtocol.MsIsRemovableMedia(); sl@0: } sl@0: sl@0: /** sl@0: Retrieve the sense info returned by a call to SenseL sl@0: sl@0: @return const TSenseInfo& Returns the SCSI SENSE info sl@0: */ sl@0: const TSenseInfo& TMassStorage::MsSenseInfo() const sl@0: { sl@0: __MSFNSLOG sl@0: return iScsiProtocol.MsSenseInfo(); sl@0: } sl@0: sl@0: sl@0: /** SCSI Request */ sl@0: TMassStorage::TEvent TMassStorage::InquiryL() sl@0: { sl@0: __MSFNLOG sl@0: TEvent event = EEvCommandFailed; sl@0: sl@0: switch (iScsiProtocol.MsInquiryL()) sl@0: { sl@0: case KErrNone: sl@0: event = EEvCommandPassed; sl@0: break; sl@0: case KErrCommandFailed: sl@0: event = EEvCommandFailed; sl@0: break; sl@0: case KErrNotSupported: sl@0: __SCSIPRINT(_L("INQUIRY Command returned NOT SUPPORTED")); sl@0: User::Leave(KErrNotSupported); sl@0: break; sl@0: default: sl@0: User::Leave(KErrUnknown); sl@0: break; sl@0: } sl@0: return event; sl@0: } sl@0: sl@0: sl@0: /** SCSI Request */ sl@0: TMassStorage::TEvent TMassStorage::SenseL() sl@0: { sl@0: __MSFNLOG sl@0: TEvent event = EEvCommandPassed; sl@0: switch (iScsiProtocol.MsRequestSenseL()) sl@0: { sl@0: case KErrNone: sl@0: break; sl@0: case KErrCommandFailed: sl@0: __SCSIPRINT(_L("REQUEST SENSE Command Failed")); sl@0: User::Leave(KErrNotSupported); sl@0: break; sl@0: default: sl@0: User::Leave(KErrUnknown); sl@0: break; sl@0: } sl@0: return event; sl@0: } sl@0: sl@0: sl@0: /** SCSI Request */ sl@0: TMassStorage::TEvent TMassStorage::TestUnitReadyL() sl@0: { sl@0: __MSFNLOG sl@0: // KErrCommandFailed indictates that device is NOT READY sl@0: TInt err = iScsiProtocol.MsTestUnitReadyL(); sl@0: return (err == KErrNone) ? EEvCommandPassed : EEvCommandFailed; sl@0: } sl@0: sl@0: sl@0: /** SCSI Request */ sl@0: TMassStorage::TEvent TMassStorage::StartStopUnitL(TBool aStart) sl@0: { sl@0: __MSFNLOG sl@0: TInt err = iScsiProtocol.MsStartStopUnitL(aStart); sl@0: return (err == KErrNone) ? EEvCommandPassed : EEvCommandFailed; sl@0: } sl@0: sl@0: sl@0: /** SCSI Request */ sl@0: TMassStorage::TEvent TMassStorage::PreventAllowMediumRemovalL(TBool aPrevent) sl@0: { sl@0: __MSFNLOG sl@0: // KErrCommandFailed indictates that device is NOT READY sl@0: TInt err = iScsiProtocol.MsPreventAllowMediaRemovalL(aPrevent); sl@0: return (err == KErrNone) ? EEvCommandPassed : EEvCommandFailed; sl@0: } sl@0: sl@0: sl@0: /** SCSI Request */ sl@0: TMassStorage::TEvent TMassStorage::ReadCapacityL() sl@0: { sl@0: __MSFNLOG sl@0: TInt err = iScsiProtocol.MsReadCapacityL(); sl@0: return ErrToEvent(err); sl@0: } sl@0: sl@0: sl@0: /** SCSI Request */ sl@0: TMassStorage::TEvent TMassStorage::ModeSense10L() sl@0: { sl@0: __MSFNLOG sl@0: TInt err = iScsiProtocol.MsModeSense10L(); sl@0: return ErrToEvent(err); sl@0: } sl@0: sl@0: sl@0: /** SCSI Request */ sl@0: TMassStorage::TEvent TMassStorage::ModeSense6L() sl@0: { sl@0: __MSFNLOG sl@0: TInt err = iScsiProtocol.MsModeSense6L(); sl@0: return ErrToEvent(err); sl@0: } sl@0: sl@0: sl@0: /** sl@0: Creates and returns a pointer to CMassStorageFsm. sl@0: sl@0: @param aScsiProtocol A reference to the protocol providing the interface to the sl@0: mass storage device. sl@0: sl@0: @return CMassStorageFsm* A pointer to the newly created object sl@0: */ sl@0: CMassStorageFsm* CMassStorageFsm::NewL(CScsiProtocol& aScsiProtocol) sl@0: { sl@0: __MSFNSLOG sl@0: CMassStorageFsm* r = new (ELeave) CMassStorageFsm(aScsiProtocol); sl@0: sl@0: CleanupStack::PushL(r); sl@0: r->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return r; sl@0: } sl@0: sl@0: void CMassStorageFsm::ConstructL() sl@0: { sl@0: __MSFNLOG sl@0: TInt i = 0; sl@0: // EInquiryState, sl@0: iStateTable[i++] = new (ELeave) TInquiryState; sl@0: // EInquirySenseState, sl@0: iStateTable[i++] = new (ELeave) TInquirySenseState; sl@0: // ENotReadyState, sl@0: iStateTable[i++] = new (ELeave) TNotReadyState; sl@0: // ENotReadySenseState, sl@0: iStateTable[i++] = new (ELeave) TNotReadySenseState; sl@0: // EStartUnitState sl@0: iStateTable[i++] = new (ELeave) TStartUnitState; sl@0: //EStartUnitSenseState, sl@0: iStateTable[i++] = new (ELeave) TStartUnitSenseState; sl@0: //EPreventAllowMediumRemovalState, sl@0: iStateTable[i++] = new (ELeave) TPreventMediumRemovalState; sl@0: //EPreventAllowMediumRemovalSenseState, sl@0: iStateTable[i++] = new (ELeave) TPreventMediumRemovalSenseState; sl@0: //EReadCapacity10State, sl@0: iStateTable[i++] = new (ELeave) TReadCapacity10State; sl@0: //EModeSense10State, sl@0: iStateTable[i++] = new (ELeave) TModeSense10State; sl@0: //EModeSense10SenseState, sl@0: iStateTable[i++] = new (ELeave) TModeSense10SenseState; sl@0: //EModeSense6State, sl@0: iStateTable[i++] = new (ELeave) TModeSense6State; sl@0: //EModeSense6SenseState, sl@0: iStateTable[i++] = new (ELeave) TModeSense6SenseState; sl@0: //EConnectedState, sl@0: iStateTable[i++] = new (ELeave) TConnectedState; sl@0: //EStatusCheck sl@0: iStateTable[i++] = new (ELeave) TStatusCheckState; sl@0: //EAllowMediumRemovalState, sl@0: iStateTable[i++] = new (ELeave) TAllowMediumRemovalState; sl@0: //EStopUnitState, sl@0: iStateTable[i++] = new (ELeave) TStopUnitState; sl@0: //ESenseState, sl@0: iStateTable[i++] = new (ELeave) TSenseState; sl@0: sl@0: #ifdef __DEBUG sl@0: // verify state table sl@0: for (TInt i = 0; i < iStateTable.Count(), i++) sl@0: { sl@0: __ASSERT_DEBUG(i == iStateTable[i].iStateId, User::Invariant()); sl@0: } sl@0: #endif sl@0: sl@0: SetState(TMassStorageState::EInquiryState); sl@0: } sl@0: sl@0: sl@0: CMassStorageFsm::CMassStorageFsm(CScsiProtocol& aScsiProtocol) sl@0: : TMassStorage(aScsiProtocol), sl@0: iStartStopUnitRequired(EFalse) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: CMassStorageFsm::~CMassStorageFsm() sl@0: { sl@0: __MSFNLOG sl@0: sl@0: for (TInt i = 0; i < iStateTable.Count(); i++) sl@0: { sl@0: delete iStateTable[i]; sl@0: } sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent CMassStorageFsm::EntryL() sl@0: { sl@0: __MSFNLOG sl@0: sl@0: return iState->EntryL(*this); sl@0: } sl@0: sl@0: sl@0: /** sl@0: Run FSM to connect device. sl@0: sl@0: @return TInt KErrCompletion if successful otherwise KErrNotSupported sl@0: */ sl@0: TInt CMassStorageFsm::ConnectLogicalUnitL() sl@0: { sl@0: __MSFNLOG sl@0: TInt err = KErrNone; sl@0: for (;;) sl@0: { sl@0: err = ProcessStateL(); sl@0: if (err) sl@0: break; sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: sl@0: /** sl@0: Run FSM to disconnect the device. sl@0: sl@0: @return TInt KErrCompletion if successful otherwise KErrNotSupported sl@0: */ sl@0: TInt CMassStorageFsm::DisconnectLogicalUnitL() sl@0: { sl@0: __MSFNLOG sl@0: TInt err = KErrNone; sl@0: for (;;) sl@0: { sl@0: TInt err = ProcessStateL(); sl@0: if (err) sl@0: break; sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: sl@0: /** sl@0: Return current FSM state. sl@0: sl@0: @return TBool ETrue if FSM state is Connected State sl@0: */ sl@0: TBool CMassStorageFsm::IsConnected() const sl@0: { sl@0: __MSFNSLOG sl@0: return iState->iStateId == TMassStorageState::EConnectedState ? ETrue : EFalse; sl@0: } sl@0: sl@0: sl@0: TInt CMassStorageFsm::ProcessStateL() sl@0: { sl@0: __MSFNLOG sl@0: TMassStorage::TEvent event = TMassStorage::EEvCommandFailed; sl@0: TRAPD(err, event = EntryL()); sl@0: if (err == KErrNotSupported) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: User::LeaveIfError(err); sl@0: sl@0: __HOSTPRINT1(_L("FSM event=%d"), event); sl@0: switch (event) sl@0: { sl@0: case TMassStorage::EEvCommandPassed: sl@0: err = ScsiCommandPassed(); sl@0: break; sl@0: case TMassStorage::EEvCommandFailed: sl@0: err = ScsiCommandFailed(); sl@0: break; sl@0: case TMassStorage::EEvCommandError: sl@0: err = ScsiCommandError(); sl@0: break; sl@0: default: sl@0: User::Panic(KUsbMsHostPanicCat, EMsFsmEvent); sl@0: break; sl@0: } sl@0: sl@0: __HOSTPRINT1(_L("FSM ProcessState completed=%d"), err); sl@0: return err; sl@0: } sl@0: sl@0: sl@0: TInt CMassStorageFsm::ScsiCommandPassed() sl@0: { sl@0: __MSFNLOG sl@0: return iState->ScsiCommandPassed(*this); sl@0: } sl@0: sl@0: sl@0: TInt CMassStorageFsm::ScsiCommandFailed() sl@0: { sl@0: __MSFNLOG sl@0: return iState->ScsiCommandFailed(*this); sl@0: } sl@0: sl@0: sl@0: TInt CMassStorageFsm::ScsiCommandError() sl@0: { sl@0: __MSFNLOG sl@0: return iState->ScsiCommandError(*this); sl@0: } sl@0: sl@0: sl@0: /** sl@0: Constructor sl@0: sl@0: @param aStateId The state id of the state implementation sl@0: */ sl@0: TMassStorageState::TMassStorageState(TStateId aStateId) sl@0: : iStateId(aStateId) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: /** sl@0: Default state does nothing. Used by states where the stalled event is not sl@0: applicable sl@0: sl@0: @param aFsm sl@0: sl@0: @return TInt sl@0: */ sl@0: TInt TMassStorageState::ScsiCommandError(CMassStorageFsm& /* aFsm */) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt TMassStorageState::SenseError(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: TInt ret = KErrNone; sl@0: const TSenseInfo& senseInfo = aFsm.MsSenseInfo(); sl@0: sl@0: if (senseInfo.iSenseCode == TSenseInfo::EUnitAttention) sl@0: { sl@0: aFsm.SetState(TMassStorageState::EInquiryState); sl@0: } sl@0: else sl@0: { sl@0: aFsm.SetState(TMassStorageState::ENotReadyState); sl@0: ret = KErrCompletion; sl@0: } sl@0: return ret; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TInquiryState::TInquiryState() sl@0: : TMassStorageState(EInquiryState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TInquiryState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.InquiryL(); sl@0: }; sl@0: sl@0: sl@0: TInt TInquiryState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(ENotReadyState); sl@0: return KErrNone; sl@0: }; sl@0: sl@0: sl@0: TInt TInquiryState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(EInquirySenseState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TInquirySenseState::TInquirySenseState() sl@0: : TMassStorageState(EInquirySenseState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TInquirySenseState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.SenseL(); sl@0: }; sl@0: sl@0: sl@0: TInt TInquirySenseState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: // SENSE ERROR sl@0: aFsm.SetState(TMassStorageState::EInquiryState); sl@0: return KErrCompletion; sl@0: }; sl@0: sl@0: sl@0: TInt TInquirySenseState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::EInquiryState); sl@0: return KErrCompletion; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TNotReadyState::TNotReadyState() sl@0: : TMassStorageState(ENotReadyState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TNotReadyState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.TestUnitReadyL(); sl@0: } sl@0: sl@0: sl@0: TInt TNotReadyState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: if (aFsm.IsSbcSet()) sl@0: { sl@0: if (aFsm.IsRemovableMedia()) sl@0: aFsm.SetState(TMassStorageState::EPreventRemovalState); sl@0: else sl@0: aFsm.SetState(TMassStorageState::EReadCapacityState); sl@0: } sl@0: else sl@0: aFsm.SetState(TMassStorageState::EInquiryState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt TNotReadyState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::ENotReadySenseState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TNotReadySenseState::TNotReadySenseState() sl@0: : TMassStorageState(ENotReadySenseState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TNotReadySenseState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.SenseL(); sl@0: } sl@0: sl@0: sl@0: TInt TNotReadySenseState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: const TSenseInfo& senseInfo = aFsm.MsSenseInfo(); sl@0: TInt ret = KErrNone; sl@0: sl@0: if (senseInfo.iSenseCode == TSenseInfo::ENotReady && sl@0: senseInfo.iAdditional == TSenseInfo::EAscLogicalUnitNotReady && sl@0: senseInfo.iQualifier == TSenseInfo::EAscqInitializingCommandRequired) sl@0: { sl@0: aFsm.SetStartStopUnitRequired(ETrue); sl@0: aFsm.SetState(TMassStorageState::EStartUnitState); sl@0: } sl@0: else sl@0: { sl@0: ret = TMassStorageState::SenseError(aFsm); sl@0: } sl@0: sl@0: return ret; sl@0: } sl@0: sl@0: sl@0: TInt TNotReadySenseState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return TMassStorageState::SenseError(aFsm); sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TStartUnitState::TStartUnitState() sl@0: : TMassStorageState(EPreventRemovalState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TStartUnitState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.StartStopUnitL(ETrue); sl@0: } sl@0: sl@0: sl@0: TInt TStartUnitState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: if (aFsm.IsRemovableMedia()) sl@0: aFsm.SetState(TMassStorageState::EPreventRemovalState); sl@0: else sl@0: aFsm.SetState(TMassStorageState::EReadCapacityState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt TStartUnitState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::EPreventRemovalSenseState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TStartUnitSenseState::TStartUnitSenseState() sl@0: : TMassStorageState(EPreventRemovalSenseState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TStartUnitSenseState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.SenseL(); sl@0: } sl@0: sl@0: sl@0: TInt TStartUnitSenseState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: if (aFsm.IsRemovableMedia()) sl@0: aFsm.SetState(TMassStorageState::EPreventRemovalState); sl@0: else sl@0: aFsm.SetState(TMassStorageState::EReadCapacityState); sl@0: sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt TStartUnitSenseState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: TInt ret = KErrCompletion; sl@0: const TSenseInfo& senseInfo = aFsm.MsSenseInfo(); sl@0: sl@0: aFsm.SetState(TMassStorageState::EInquiryState); sl@0: if (senseInfo.iSenseCode == TSenseInfo::EIllegalRequest) sl@0: { sl@0: aFsm.SetState(TMassStorageState::EReadCapacityState); sl@0: ret = KErrNone; sl@0: } sl@0: else sl@0: { sl@0: ret = TMassStorageState::SenseError(aFsm); sl@0: } sl@0: sl@0: return ret; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TPreventMediumRemovalState::TPreventMediumRemovalState() sl@0: : TMassStorageState(EPreventRemovalState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TPreventMediumRemovalState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.PreventAllowMediumRemovalL(ETrue); sl@0: } sl@0: sl@0: sl@0: TInt TPreventMediumRemovalState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::EReadCapacityState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt TPreventMediumRemovalState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::EPreventRemovalSenseState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TPreventMediumRemovalSenseState::TPreventMediumRemovalSenseState() sl@0: : TMassStorageState(EPreventRemovalSenseState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TPreventMediumRemovalSenseState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.SenseL(); sl@0: } sl@0: sl@0: sl@0: TInt TPreventMediumRemovalSenseState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::EReadCapacityState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: sl@0: sl@0: TInt TPreventMediumRemovalSenseState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: TInt ret = KErrCompletion; sl@0: const TSenseInfo& senseInfo = aFsm.MsSenseInfo(); sl@0: sl@0: if (senseInfo.iSenseCode == TSenseInfo::EIllegalRequest) sl@0: { sl@0: aFsm.SetState(TMassStorageState::EReadCapacityState); sl@0: ret = KErrNone; sl@0: } sl@0: else sl@0: { sl@0: ret = TMassStorageState::SenseError(aFsm); sl@0: } sl@0: return ret; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TReadCapacity10State::TReadCapacity10State() sl@0: : TMassStorageState(EReadCapacityState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TReadCapacity10State::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.ReadCapacityL(); sl@0: }; sl@0: sl@0: sl@0: TInt TReadCapacity10State::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(EModeSense10State); sl@0: return KErrNone; sl@0: }; sl@0: sl@0: sl@0: TInt TReadCapacity10State::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::ESenseState); sl@0: return KErrCompletion; sl@0: } sl@0: sl@0: sl@0: TInt TReadCapacity10State::ScsiCommandError(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::ENotReadyState); sl@0: return KErrCompletion; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TModeSense10State::TModeSense10State() sl@0: : TMassStorageState(EModeSense10State) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TModeSense10State::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.ModeSense10L(); sl@0: }; sl@0: sl@0: sl@0: TInt TModeSense10State::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(EConnectedState); sl@0: return KErrCompletion; sl@0: }; sl@0: sl@0: sl@0: TInt TModeSense10State::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(EModeSense10SenseState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt TModeSense10State::ScsiCommandError(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(EModeSense6State); sl@0: return KErrNone; sl@0: } sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TModeSense10SenseState::TModeSense10SenseState() sl@0: : TMassStorageState(EModeSense10SenseState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TModeSense10SenseState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.SenseL(); sl@0: }; sl@0: sl@0: sl@0: TInt TModeSense10SenseState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: TInt ret = KErrCompletion; sl@0: const TSenseInfo& senseInfo = aFsm.MsSenseInfo(); sl@0: sl@0: aFsm.SetState(TMassStorageState::EInquiryState); sl@0: if (senseInfo.iSenseCode == TSenseInfo::EIllegalRequest) sl@0: { sl@0: aFsm.SetState(TMassStorageState::EModeSense6State); sl@0: ret = KErrNone; sl@0: } sl@0: else sl@0: { sl@0: ret = TMassStorageState::SenseError(aFsm); sl@0: } sl@0: return ret; sl@0: }; sl@0: sl@0: sl@0: TInt TModeSense10SenseState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(EInquirySenseState); sl@0: return KErrCompletion; sl@0: } sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TModeSense6State::TModeSense6State() sl@0: : TMassStorageState(EModeSense6State) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TModeSense6State::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.ModeSense6L(); sl@0: }; sl@0: sl@0: sl@0: TInt TModeSense6State::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(EConnectedState); sl@0: return KErrCompletion; sl@0: }; sl@0: sl@0: sl@0: TInt TModeSense6State::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(EModeSense6SenseState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt TModeSense6State::ScsiCommandError(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: // If device responds with protocol error, ignore the error and assume the sl@0: // device is not write protected sl@0: aFsm.SetState(EConnectedState); sl@0: return KErrCompletion; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TModeSense6SenseState::TModeSense6SenseState() sl@0: : TMassStorageState(EModeSense6SenseState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TModeSense6SenseState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.SenseL(); sl@0: }; sl@0: sl@0: sl@0: TInt TModeSense6SenseState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: TInt ret = KErrCompletion; sl@0: const TSenseInfo& senseInfo = aFsm.MsSenseInfo(); sl@0: sl@0: aFsm.SetState(TMassStorageState::EInquiryState); sl@0: if (senseInfo.iSenseCode == TSenseInfo::EIllegalRequest) sl@0: { sl@0: aFsm.SetState(TMassStorageState::EConnectedState); sl@0: } sl@0: else sl@0: { sl@0: ret = TMassStorageState::SenseError(aFsm); sl@0: } sl@0: return ret; sl@0: }; sl@0: sl@0: sl@0: TInt TModeSense6SenseState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(EInquirySenseState); sl@0: return KErrCompletion; sl@0: } sl@0: sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TConnectedState::TConnectedState() sl@0: : TMassStorageState(EConnectedState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TConnectedState::EntryL(CMassStorageFsm& /* aFsm */) sl@0: { sl@0: __MSFNLOG sl@0: return TMassStorage::EEvCommandPassed; sl@0: }; sl@0: sl@0: sl@0: TInt TConnectedState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: TInt ret = KErrNone; sl@0: sl@0: if (aFsm.IsRemovableMedia()) sl@0: { sl@0: if(aFsm.IsStatusCheck()) sl@0: { sl@0: aFsm.SetState(TMassStorageState::EStatusCheckState); sl@0: } sl@0: else sl@0: { sl@0: aFsm.SetState(TMassStorageState::EAllowRemovalState); sl@0: } sl@0: } sl@0: else if (aFsm.StartStopUnitRequired()) sl@0: { sl@0: aFsm.SetState(TMassStorageState::EStopUnitState); sl@0: } sl@0: else sl@0: { sl@0: aFsm.SetState(TMassStorageState::ENotReadyState); sl@0: ret = KErrCompletion; sl@0: } sl@0: return ret; sl@0: }; sl@0: sl@0: sl@0: TInt TConnectedState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::EInquiryState); sl@0: return KErrCompletion; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TStatusCheckState::TStatusCheckState() sl@0: : TMassStorageState(EStatusCheckState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TStatusCheckState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.TestUnitReadyL(); sl@0: }; sl@0: sl@0: sl@0: TInt TStatusCheckState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(EConnectedState); sl@0: return KErrCompletion; sl@0: }; sl@0: sl@0: sl@0: TInt TStatusCheckState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(ESenseState); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TAllowMediumRemovalState::TAllowMediumRemovalState() sl@0: : TMassStorageState(EAllowRemovalState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TAllowMediumRemovalState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.PreventAllowMediumRemovalL(EFalse); sl@0: } sl@0: sl@0: sl@0: TInt TAllowMediumRemovalState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: TInt ret = KErrNone; sl@0: if (aFsm.StartStopUnitRequired()) sl@0: { sl@0: aFsm.SetState(TMassStorageState::EStopUnitState); sl@0: } sl@0: else sl@0: { sl@0: aFsm.SetState(ENotReadyState); sl@0: ret = KErrCompletion; sl@0: } sl@0: return ret; sl@0: }; sl@0: sl@0: sl@0: TInt TAllowMediumRemovalState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::EInquiryState); sl@0: return KErrCompletion; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TStopUnitState::TStopUnitState() sl@0: : TMassStorageState(EStopUnitState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TStopUnitState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.StartStopUnitL(EFalse); sl@0: } sl@0: sl@0: sl@0: TInt TStopUnitState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(ENotReadyState); sl@0: return KErrCompletion; sl@0: }; sl@0: sl@0: sl@0: TInt TStopUnitState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(TMassStorageState::EInquiryState); sl@0: return KErrCompletion; sl@0: } sl@0: sl@0: sl@0: /** sl@0: sl@0: */ sl@0: TSenseState::TSenseState() sl@0: : TMassStorageState(EConnectedState) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: TMassStorage::TEvent TSenseState::EntryL(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: return aFsm.SenseL(); sl@0: }; sl@0: sl@0: sl@0: TInt TSenseState::ScsiCommandPassed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: aFsm.SetState(ENotReadyState); sl@0: return KErrCompletion; sl@0: }; sl@0: sl@0: sl@0: TInt TSenseState::ScsiCommandFailed(CMassStorageFsm& aFsm) sl@0: { sl@0: __MSFNLOG sl@0: // This event should not happen sl@0: aFsm.SetState(EInquiryState); sl@0: return KErrCompletion; sl@0: } sl@0: