userlibandfileserver/fileserver/shostmassstorage/server/protocol/tscsiblockcmds.cpp
changeset 300 1d28c8722707
parent 90 947f0dc9f7a8
equal deleted inserted replaced
293:0659d0e1a03c 300:1d28c8722707
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
     1 // Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "Eclipse Public License v1.0"
     4 // under the terms of the License "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
    17  @file
    17  @file
    18  @internalTechnology
    18  @internalTechnology
    19 */
    19 */
    20 
    20 
    21 #include <e32base.h>
    21 #include <e32base.h>
    22 #include "debug.h"
    22 
    23 #include "msdebug.h"
    23 #include "OstTraceDefinitions.h"
       
    24 #ifdef OST_TRACE_COMPILER_IN_USE
       
    25 #include "tscsiblockcmdsTraces.h"
       
    26 #endif
       
    27 
    24 #include "msctypes.h"
    28 #include "msctypes.h"
    25 #include "mscutils.h"
    29 #include "mscutils.h"
    26 
    30 
    27 #include "mtransport.h"
    31 #include "mtransport.h"
    28 #include "mprotocol.h"
    32 #include "mprotocol.h"
    29 #include "tscsiclientreq.h"
    33 #include "tscsiclientreq.h"
    30 #include "tscsiblockcmds.h"
    34 #include "tscsiblockcmds.h"
    31 
    35 
    32 
    36 
    33 // ****	MODE SENSE (6) ****
    37 // **** MODE SENSE (6) ****
    34 void TScsiClientModeSense6Resp::DecodeL(const TDesC8& aPtr)
    38 void TScsiClientModeSense6Resp::DecodeL(const TDesC8& aPtr)
    35 	{
    39     {
    36     __MSFNSLOG
    40     OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_10,
    37     __SCSIPRINT(_L("--> SCSI MODE SENSE (6)"));
    41               "--> SCSI MODE SENSE (6)");
    38     __SCSIPRINT1(_L("len=%d"), aPtr.Length());
    42     OstTrace1(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_11,
       
    43               "len=%d", aPtr.Length());
    39     // Mode Parameter List
    44     // Mode Parameter List
    40     // SPC-3 7.4.2
    45     // SPC-3 7.4.2
    41     // - Mode Parameter Header
    46     // - Mode Parameter Header
    42     // - Block Descriptor(s)
    47     // - Block Descriptor(s)
    43     // - Mode Page(s)
    48     // - Mode Page(s)
    59     TInt modeDataLength = aPtr[0];
    64     TInt modeDataLength = aPtr[0];
    60     if (aPtr.Length() - 1 > modeDataLength)
    65     if (aPtr.Length() - 1 > modeDataLength)
    61         {
    66         {
    62         User::Leave(KErrGeneral);
    67         User::Leave(KErrGeneral);
    63         }
    68         }
    64    
    69 
    65     TInt mediumType = aPtr[1];
    70     TInt mediumType = aPtr[1];
    66     TUint8 deviceSpecificParameter = aPtr[2];
    71     TUint8 deviceSpecificParameter = aPtr[2];
    67     // TInt blockDescriptorLength = aPtr[3];
    72     // TInt blockDescriptorLength = aPtr[3];
    68 
    73 
    69     __SCSIPRINT2(_L("Medium Type=%d DSP=0x%x"), mediumType, deviceSpecificParameter);
    74     OstTraceExt2(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_20,
       
    75                  "Medium Type=%d DSP=0x%x", mediumType, deviceSpecificParameter);
    70     // [1] Medium Type
    76     // [1] Medium Type
    71     // 0x00 for SBC
    77     // 0x00 for SBC
    72     if (mediumType == 0)
    78     if (mediumType == 0)
    73         {
    79         {
    74         // [2] Device specific parameter
    80         // [2] Device specific parameter
    87 
    93 
    88     // No Block Descriptors
    94     // No Block Descriptors
    89 
    95 
    90     // No Mode Pages
    96     // No Mode Pages
    91 
    97 
    92 	}
    98     }
    93 
    99 
    94 
   100 
    95 // ****	MODE SENSE (10) ****
   101 // **** MODE SENSE (10) ****
    96 void TScsiClientModeSense10Resp::DecodeL(const TDesC8& aPtr)
   102 void TScsiClientModeSense10Resp::DecodeL(const TDesC8& aPtr)
    97 	{
   103     {
    98     __MSFNSLOG
   104     OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_30,
    99     __SCSIPRINT(_L("--> SCSI MODE SENSE (10)"));
   105               "--> SCSI MODE SENSE (10)");
   100     __SCSIPRINT1(_L("len=%d"), aPtr.Length());
   106     OstTrace1(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_31,
       
   107               "len=%d", aPtr.Length());
   101     // Mode Parameter List
   108     // Mode Parameter List
   102     // SPC-3 7.4.2
   109     // SPC-3 7.4.2
   103     // - Mode Parameter Header
   110     // - Mode Parameter Header
   104     // - Block Descriptor(s)
   111     // - Block Descriptor(s)
   105     // - Mode Page(s)
   112     // - Mode Page(s)
   118     // validate length
   125     // validate length
   119     if (aPtr.Length() < KResponseLength)
   126     if (aPtr.Length() < KResponseLength)
   120         {
   127         {
   121         User::Leave(KErrGeneral);
   128         User::Leave(KErrGeneral);
   122         }
   129         }
   123     
   130 
   124     TInt modeDataLength = BigEndian::Get16(&aPtr[0]);
   131     TInt modeDataLength = BigEndian::Get16(&aPtr[0]);
   125     if (aPtr.Length() - 2 > modeDataLength)
   132     if (aPtr.Length() - 2 > modeDataLength)
   126         {
   133         {
   127         User::Leave(KErrGeneral);
   134         User::Leave(KErrGeneral);
   128         }
   135         }
   129 
   136 
   130     TInt mediumType = aPtr[2];
   137     TInt mediumType = aPtr[2];
   131     TUint8 deviceSpecificParameter = aPtr[3];
   138     TUint8 deviceSpecificParameter = aPtr[3];
   132     // TInt blockDescriptorLength = BigEndian::Get32(&aPtr[6]);;
   139     // TInt blockDescriptorLength = BigEndian::Get32(&aPtr[6]);;
   133 
   140 
   134     __SCSIPRINT2(_L("Medium Type=%d DSP=0x%x"), mediumType, deviceSpecificParameter);
   141     OstTraceExt2(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_40,
       
   142                  "Medium Type=%d DSP=0x%x", mediumType, deviceSpecificParameter);
   135     // [1] Medium Type
   143     // [1] Medium Type
   136     // 0x00 for SBC
   144     // 0x00 for SBC
   137     if (mediumType == 0)
   145     if (mediumType == 0)
   138         {
   146         {
   139         // [2] Device specific parameter
   147         // [2] Device specific parameter
   152 
   160 
   153     // No Block Descriptors
   161     // No Block Descriptors
   154 
   162 
   155     // No Mode Pages
   163     // No Mode Pages
   156 
   164 
   157 	}
   165     }
   158 
   166 
   159 
   167 
   160 
   168 
   161 // ****	READ CAPACITY (10) ***
   169 // **** READ CAPACITY (10) ***
   162 TInt TScsiClientReadCapacity10Req::EncodeRequestL(TDes8& aBuffer) const
   170 TInt TScsiClientReadCapacity10Req::EncodeRequestL(TDes8& aBuffer) const
   163     {
   171     {
   164     __MSFNSLOG
   172     OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_50,
   165     __SCSIPRINT(_L("<-- READ CAPACITY 10"));
   173               "<-- READ CAPACITY 10");
   166     TInt length = TScsiClientReq::EncodeRequestL(aBuffer);
   174     TInt length = TScsiClientReq::EncodeRequestL(aBuffer);
   167 
   175 
   168     if (iLba)
   176     if (iLba)
   169         {
   177         {
   170         // PMI bit
   178         // PMI bit
   175     return length;
   183     return length;
   176     }
   184     }
   177 
   185 
   178 
   186 
   179 void TScsiClientReadCapacity10Resp::DecodeL(const TDesC8& aPtr)
   187 void TScsiClientReadCapacity10Resp::DecodeL(const TDesC8& aPtr)
   180 	{
   188     {
   181     __MSFNSLOG
   189     OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_60,
   182     __SCSIPRINT(_L("--> SCSI READ CAPACITY (10)"));
   190               "--> SCSI READ CAPACITY (10)");
   183     iLba = BigEndian::Get32(&aPtr[0]);
   191     iLba = BigEndian::Get32(&aPtr[0]);
   184     iBlockSize = BigEndian::Get32(&aPtr[4]);
   192     iBlockSize = BigEndian::Get32(&aPtr[4]);
   185 	}
   193     }
   186 
   194 
   187 
   195 
   188 // ****	RdWr10 ****
   196 // **** RdWr10 ****
   189 TInt TScsiClientRdWr10Req::EncodeRequestL(TDes8& aBuffer) const
   197 TInt TScsiClientRdWr10Req::EncodeRequestL(TDes8& aBuffer) const
   190     {
   198     {
   191     __MSFNSLOG
       
   192     TInt length = TScsiClientReq::EncodeRequestL(aBuffer);
   199     TInt length = TScsiClientReq::EncodeRequestL(aBuffer);
   193 
   200 
   194     // PROTECT
   201     // PROTECT
   195     if (iProtect)
   202     if (iProtect)
   196         aBuffer[1] = iProtect << 5;
   203         aBuffer[1] = iProtect << 5;
   197 
   204 
   198     __SCSIPRINT2(_L("LBA=%08x LEN=%08x"), iLogicalBlockAddress, iBlockTransferLength);
   205     OstTraceExt2(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_70,
       
   206                  "LBA=%08x LEN=%08x", iLogicalBlockAddress, iBlockTransferLength);
   199     // LOGICAL BLOCK ADDRESS
   207     // LOGICAL BLOCK ADDRESS
   200     BigEndian::Put32(&aBuffer[2], iLogicalBlockAddress);
   208     BigEndian::Put32(&aBuffer[2], iLogicalBlockAddress);
   201     // TRANSFER LENGTH
   209     // TRANSFER LENGTH
   202     BigEndian::Put16(&aBuffer[7], iBlockTransferLength);
   210     BigEndian::Put16(&aBuffer[7], iBlockTransferLength);
   203     return length;
   211     return length;
   204     }
   212     }
   205 
   213 
   206 // ****	READ (10) ****
   214 // **** READ (10) ****
   207 TInt TScsiClientRead10Req::EncodeRequestL(TDes8& aBuffer) const
   215 TInt TScsiClientRead10Req::EncodeRequestL(TDes8& aBuffer) const
   208     {
   216     {
   209     __MSFNSLOG
   217     OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_80,
   210     __SCSIPRINT(_L("<-- SCSI READ (10)"));
   218               "<-- SCSI READ (10)");
   211 	TInt length = TScsiClientRdWr10Req::EncodeRequestL(aBuffer);
   219     TInt length = TScsiClientRdWr10Req::EncodeRequestL(aBuffer);
   212     return length;
   220     return length;
   213     }
   221     }
   214 
   222 
   215 
   223 
   216 // ****	START STOP UNIT ****
   224 // **** START STOP UNIT ****
   217 TInt TScsiClientStartStopUnitReq::EncodeRequestL(TDes8& aBuffer) const
   225 TInt TScsiClientStartStopUnitReq::EncodeRequestL(TDes8& aBuffer) const
   218     {
   226     {
   219     __MSFNSLOG
   227     OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_90,
   220     __SCSIPRINT(_L("--> SCSI START STOP UNIT"));
   228               "--> SCSI START STOP UNIT");
   221     TInt length = TScsiClientReq::EncodeRequestL(aBuffer);
   229     TInt length = TScsiClientReq::EncodeRequestL(aBuffer);
   222 
   230 
   223     // byte 1 mask
   231     // byte 1 mask
   224     const TUint8 KImmedMask = 0x01;
   232     const TUint8 KImmedMask = 0x01;
   225 
   233 
   235         aBuffer[4] |= KLoejMask;
   243         aBuffer[4] |= KLoejMask;
   236     return length;
   244     return length;
   237     }
   245     }
   238 
   246 
   239 
   247 
   240 // ****	WRITE (10) ****
   248 // **** WRITE (10) ****
   241 TInt TScsiClientWrite10Req::EncodeRequestL(TDes8& aBuffer) const
   249 TInt TScsiClientWrite10Req::EncodeRequestL(TDes8& aBuffer) const
   242     {
   250     {
   243     __MSFNSLOG
   251     OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_91,
   244     __SCSIPRINT(_L("<-- SCSI WRITE 10"));
   252               "<-- SCSI WRITE 10");
   245 
   253 
   246     TInt length = TScsiClientRdWr10Req::EncodeRequestL(aBuffer);
   254     TInt length = TScsiClientRdWr10Req::EncodeRequestL(aBuffer);
   247     return length;
   255     return length;
   248     }
   256     }
   249 
   257