diff -r 000000000000 -r a41df078684a userlibandfileserver/fileserver/shostmassstorage/server/protocol/tscsiblockcmds.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/shostmassstorage/server/protocol/tscsiblockcmds.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,249 @@ +// Copyright (c) 2008-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 +*/ + +#include +#include "debug.h" +#include "msdebug.h" +#include "msctypes.h" +#include "mscutils.h" + +#include "mtransport.h" +#include "mprotocol.h" +#include "tscsiclientreq.h" +#include "tscsiblockcmds.h" + + +// **** MODE SENSE (6) **** +void TScsiClientModeSense6Resp::DecodeL(const TDesC8& aPtr) + { + __MSFNSLOG + __SCSIPRINT(_L("--> SCSI MODE SENSE (6)")); + __SCSIPRINT1(_L("len=%d"), aPtr.Length()); + // Mode Parameter List + // SPC-3 7.4.2 + // - Mode Parameter Header + // - Block Descriptor(s) + // - Mode Page(s) + + // Mode Parameter Header + // SPC-3 7.4.3 + // [0] Mode Data Length + // [1] Medium Type + // [2] Device-Specific Paramater + // [3] Block Descriptor Length + + + // validate length + if (aPtr.Length() < KResponseLength) + { + User::Leave(KErrGeneral); + } + + TInt modeDataLength = aPtr[0]; + if (aPtr.Length() - 1 < modeDataLength) + { + User::Leave(KErrGeneral); + } + + TInt mediumType = aPtr[1]; + TUint8 deviceSpecificParameter = aPtr[2]; + // TInt blockDescriptorLength = aPtr[3]; + + __SCSIPRINT2(_L("Medium Type=%d DSP=0x%x"), mediumType, deviceSpecificParameter); + // [1] Medium Type + // 0x00 for SBC + if (mediumType == 0) + { + // [2] Device specific parameter + // SBC-3 6.3.1 + // get the WP bit from the Device Specific parameters + iWriteProtected = (deviceSpecificParameter & 0x80) ? ETrue : EFalse; + } + else + { + // unsupported medium type + iWriteProtected = EFalse; + } + + // [3] Block Descriptor Length + // 0x00 for no descriptors + + // No Block Descriptors + + // No Mode Pages + + } + + +// **** MODE SENSE (10) **** +void TScsiClientModeSense10Resp::DecodeL(const TDesC8& aPtr) + { + __MSFNSLOG + __SCSIPRINT(_L("--> SCSI MODE SENSE (10)")); + __SCSIPRINT1(_L("len=%d"), aPtr.Length()); + // Mode Parameter List + // SPC-3 7.4.2 + // - Mode Parameter Header + // - Block Descriptor(s) + // - Mode Page(s) + + // Mode Parameter Header + // SPC-3 7.4.3 + // [0] Mode Data Length + // [1] Mode Data Length + // [2] Medium Type + // [3] Device-Specific Paramater + // [4] Reserved + // [5] Reserved + // [6] Block Descriptor Length + // [7] Block Descriptor Length + + // validate length + if (aPtr.Length() < KResponseLength) + { + User::Leave(KErrGeneral); + } + + TInt modeDataLength = BigEndian::Get32(&aPtr[0]); + if (aPtr.Length() - 2 < modeDataLength) + { + User::Leave(KErrGeneral); + } + + TInt mediumType = aPtr[2]; + TUint8 deviceSpecificParameter = aPtr[3]; + // TInt blockDescriptorLength = BigEndian::Get32(&aPtr[6]);; + + __SCSIPRINT2(_L("Medium Type=%d DSP=0x%x"), mediumType, deviceSpecificParameter); + // [1] Medium Type + // 0x00 for SBC + if (mediumType == 0) + { + // [2] Device specific parameter + // SBC-3 6.3.1 + // get the WP bit from the Device Specific parameters + iWriteProtected = (deviceSpecificParameter & 0x80) ? ETrue : EFalse; + } + else + { + // unsupported medium type + iWriteProtected = EFalse; + } + + // [3] Block Descriptor Length + // 0x00 for no descriptors + + // No Block Descriptors + + // No Mode Pages + + } + + + +// **** READ CAPACITY (10) *** +TInt TScsiClientReadCapacity10Req::EncodeRequestL(TDes8& aBuffer) const + { + __MSFNSLOG + __SCSIPRINT(_L("<-- READ CAPACITY 10")); + TInt length = TScsiClientReq::EncodeRequestL(aBuffer); + + if (iLba) + { + // PMI bit + aBuffer[8] = 0x01; + // LBA + BigEndian::Put32(&aBuffer[2], iLba); + } + return length; + } + + +void TScsiClientReadCapacity10Resp::DecodeL(const TDesC8& aPtr) + { + __MSFNSLOG + __SCSIPRINT(_L("--> SCSI READ CAPACITY (10)")); + iLba = BigEndian::Get32(&aPtr[0]); + iBlockSize = BigEndian::Get32(&aPtr[4]); + } + + +// **** RdWr10 **** +TInt TScsiClientRdWr10Req::EncodeRequestL(TDes8& aBuffer) const + { + __MSFNSLOG + TInt length = TScsiClientReq::EncodeRequestL(aBuffer); + + // PROTECT + if (iProtect) + aBuffer[1] = iProtect << 5; + + __SCSIPRINT2(_L("LBA=%08x LEN=%08x"), iLogicalBlockAddress, iBlockTransferLength); + // LOGICAL BLOCK ADDRESS + BigEndian::Put32(&aBuffer[2], iLogicalBlockAddress); + // TRANSFER LENGTH + BigEndian::Put16(&aBuffer[7], iBlockTransferLength); + return length; + } + +// **** READ (10) **** +TInt TScsiClientRead10Req::EncodeRequestL(TDes8& aBuffer) const + { + __MSFNSLOG + __SCSIPRINT(_L("<-- SCSI READ (10)")); + TInt length = TScsiClientRdWr10Req::EncodeRequestL(aBuffer); + return length; + } + + +// **** START STOP UNIT **** +TInt TScsiClientStartStopUnitReq::EncodeRequestL(TDes8& aBuffer) const + { + __MSFNSLOG + __SCSIPRINT(_L("--> SCSI START STOP UNIT")); + TInt length = TScsiClientReq::EncodeRequestL(aBuffer); + + // byte 1 mask + const TUint8 KImmedMask = 0x01; + + // byte 4 mask + const TUint8 KStartMask = 0x01; + const TUint8 KLoejMask = 0x02; + + if (iImmed) + aBuffer[1] |= KImmedMask; + if (iStart) + aBuffer[4] |= KStartMask; + if (iLoej) + aBuffer[4] |= KLoejMask; + return length; + } + + +// **** WRITE (10) **** +TInt TScsiClientWrite10Req::EncodeRequestL(TDes8& aBuffer) const + { + __MSFNSLOG + __SCSIPRINT(_L("<-- SCSI WRITE 10")); + + TInt length = TScsiClientRdWr10Req::EncodeRequestL(aBuffer); + return length; + } +