os/kernelhwsrv/kerneltest/f32test/shostmassstorage/testclient/usbtestmsclient/protocol/tscsiservercmds.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
sl@0
    17
#include <e32def.h>
sl@0
    18
#include <e32cmn.h>
sl@0
    19
#include <e32des8.h>
sl@0
    20
#include <e32std.h>
sl@0
    21
sl@0
    22
#include "mstypes.h"
sl@0
    23
#include "msctypes.h"
sl@0
    24
#include "mscutils.h"
sl@0
    25
#include "scsimsctypes.h"
sl@0
    26
sl@0
    27
#include "tscsiserverreq.h"
sl@0
    28
#include "tscsiservercmds.h"
sl@0
    29
#include "debug.h"
sl@0
    30
#include "msdebug.h"
sl@0
    31
sl@0
    32
/**
sl@0
    33
Default constructor for TSenseInfo
sl@0
    34
*/
sl@0
    35
TSrvSenseInfo::TSrvSenseInfo()
sl@0
    36
    {
sl@0
    37
    __MSFNLOG
sl@0
    38
    iSenseCode = ENoSense;
sl@0
    39
    iAdditional = 0;
sl@0
    40
	iQualifier = 0;
sl@0
    41
    }
sl@0
    42
sl@0
    43
/**
sl@0
    44
Set sense with no additional info.
sl@0
    45
sl@0
    46
@param aSenseCode sense key
sl@0
    47
*/
sl@0
    48
void TSrvSenseInfo::SetSense(TSenseCode aSenseCode)
sl@0
    49
	{
sl@0
    50
    __MSFNLOG
sl@0
    51
	iSenseCode	= static_cast<TUint8>(aSenseCode);
sl@0
    52
	iAdditional = 0;
sl@0
    53
	iQualifier  = 0;
sl@0
    54
	}
sl@0
    55
sl@0
    56
sl@0
    57
/**
sl@0
    58
Set sense with additional info.
sl@0
    59
sl@0
    60
@param aSenseCode sense key
sl@0
    61
@param aAdditional additional sense code (ASC)
sl@0
    62
*/
sl@0
    63
void TSrvSenseInfo::SetSense(TSenseCode aSenseCode,
sl@0
    64
                          TAdditionalCode aAdditional)
sl@0
    65
sl@0
    66
	{
sl@0
    67
    __MSFNLOG
sl@0
    68
	iSenseCode = static_cast<TUint8>(aSenseCode);
sl@0
    69
	iAdditional = static_cast<TUint8>(aAdditional);
sl@0
    70
	iQualifier = 0;
sl@0
    71
	}
sl@0
    72
sl@0
    73
sl@0
    74
/**
sl@0
    75
Set sense with additional info and qualifier.
sl@0
    76
sl@0
    77
@param aSenseCode sense key
sl@0
    78
@param aAdditional additional sense code (ASC)
sl@0
    79
@param aQualifier additional sense code qualifier (ASCQ)
sl@0
    80
*/
sl@0
    81
void TSrvSenseInfo::SetSense(TSenseCode aSenseCode,
sl@0
    82
                          TAdditionalCode aAdditional,
sl@0
    83
                          TUint8 aQualifier)
sl@0
    84
	{
sl@0
    85
    __MSFNLOG
sl@0
    86
	iSenseCode = static_cast<TUint8>(aSenseCode);
sl@0
    87
	iAdditional = static_cast<TUint8>(aAdditional);
sl@0
    88
	iQualifier = aQualifier;
sl@0
    89
	}
sl@0
    90
sl@0
    91
sl@0
    92
// **** TEST UNIT READY ****
sl@0
    93
// **** REQUEST SENSE ****
sl@0
    94
void TScsiServerRequestSenseResp::Encode(TDes8& aBuffer) const
sl@0
    95
    {
sl@0
    96
    __MSFNSLOG
sl@0
    97
    aBuffer.FillZ(KCommandLength);
sl@0
    98
    __PRINT(_L("->PROTOCOL(SCSI) REQUEST SENSE\n"));
sl@0
    99
    //additional sense length
sl@0
   100
	aBuffer[07] = static_cast<TUint8>(KCommandLength - 8);
sl@0
   101
sl@0
   102
    aBuffer[0] = iResponseCode;
sl@0
   103
	aBuffer[02] = static_cast<TUint8>(iSensePtr->iSenseCode);
sl@0
   104
	aBuffer[12] = iSensePtr->iAdditional;
sl@0
   105
	aBuffer[13] = iSensePtr->iQualifier;
sl@0
   106
sl@0
   107
    //truncate to Allocation Length of the Request
sl@0
   108
    TUint length = iAllocationLength < KCommandLength ?
sl@0
   109
                    iAllocationLength : KCommandLength;
sl@0
   110
    aBuffer.SetLength(length);
sl@0
   111
    }
sl@0
   112
sl@0
   113
// **** INQUIRY ****
sl@0
   114
void TScsiServerInquiryReq::DecodeL(const TDesC8& aPtr)
sl@0
   115
    {
sl@0
   116
    __MSFNLOG
sl@0
   117
	TScsiServerReq::DecodeL(aPtr);
sl@0
   118
    iCmdDt = aPtr[1] & 0x2;
sl@0
   119
    iEvpd = aPtr[1] & 0x1;
sl@0
   120
    iPage = aPtr[2];
sl@0
   121
    iAllocationLength = aPtr[4];
sl@0
   122
    __PRINT(_L("<-PROTOCOL(SCSI) INQUIRY\n"));
sl@0
   123
    }
sl@0
   124
sl@0
   125
sl@0
   126
void TScsiServerInquiryResp::Encode(TDes8& aBuffer) const
sl@0
   127
    {
sl@0
   128
    __MSFNSLOG
sl@0
   129
    __PRINT(_L("->PROTOCOL(SCSI) INQUIRY\n"));
sl@0
   130
sl@0
   131
	aBuffer.FillZ(KResponseLength);
sl@0
   132
sl@0
   133
    // MSB: RMB : Removable
sl@0
   134
    if (iRemovable)
sl@0
   135
        {
sl@0
   136
        aBuffer[1] |= 0x80;
sl@0
   137
        }
sl@0
   138
sl@0
   139
    // AERC, TrmTsk, NormACA, Response Data Format
sl@0
   140
    aBuffer[3] |= (iResponseDataFormat & 0x0F);
sl@0
   141
sl@0
   142
    // Additional Length
sl@0
   143
	aBuffer[4] = 0x1F;
sl@0
   144
sl@0
   145
    // Vendor ID (Vendor Specific/Logged by T10)
sl@0
   146
	TPtr8 vendorId(&aBuffer[8], 8, 8);
sl@0
   147
	vendorId.Fill(' ', 8);
sl@0
   148
	vendorId.Copy(iConfig.iVendorId);
sl@0
   149
sl@0
   150
    // Product ID (Vendor Specific)
sl@0
   151
    TPtr8 productId(&aBuffer[16], 16, 16);
sl@0
   152
    productId.Fill(' ', 16);
sl@0
   153
    productId.Copy(iConfig.iProductId);
sl@0
   154
sl@0
   155
    // Product Revision Level (Vendor Specific)
sl@0
   156
    TPtr8 productRev(&aBuffer[32], 4, 4);
sl@0
   157
    productRev.Fill(' ', 4);
sl@0
   158
    productRev.Copy(iConfig.iProductRev);
sl@0
   159
sl@0
   160
    // Truncate to Allocation Length of the Request
sl@0
   161
    TUint length = iAllocationLength < KResponseLength ?
sl@0
   162
                    iAllocationLength : KResponseLength;
sl@0
   163
    aBuffer.SetLength(length);
sl@0
   164
    }
sl@0
   165
sl@0
   166
sl@0
   167
// ****	MODE SENSE (6) ****
sl@0
   168
void TScsiServerModeSense6Req::DecodeL(const TDesC8& aPtr)
sl@0
   169
    {
sl@0
   170
    __MSFNLOG
sl@0
   171
	TScsiServerReq::DecodeL(aPtr);
sl@0
   172
    iPageCode = aPtr[2] & 0x3F;
sl@0
   173
    iPageControl = static_cast<TPageControl>(aPtr[2] >> 6);
sl@0
   174
    iAllocationLength = aPtr[4];
sl@0
   175
    __PRINT(_L("<-PROTOCOL(SCSI) MODE SENSE (6)\n"));
sl@0
   176
    }
sl@0
   177
sl@0
   178
sl@0
   179
void TScsiServerModeSense6Resp::Encode(TDes8& aBuffer) const
sl@0
   180
    {
sl@0
   181
    __MSFNSLOG
sl@0
   182
    __PRINT(_L("->PROTOCOL(SCSI) MODE SENSE (6)\n"));
sl@0
   183
    // reserve 4 bytes for Length, Media type, Device-specific parameter and
sl@0
   184
    // Block descriptor length
sl@0
   185
    aBuffer.FillZ(KCommandLength);
sl@0
   186
sl@0
   187
    // Mode Parameter List
sl@0
   188
    // SPC-3 7.4.2
sl@0
   189
    // - Mode Parameter Header
sl@0
   190
    // - Block Descriptor(s)
sl@0
   191
    // - Mode Page(s)
sl@0
   192
sl@0
   193
    // Mode Parameter Header
sl@0
   194
    // SPC-3 7.4.3
sl@0
   195
    // [0] Mode Data Length
sl@0
   196
    // [1] Medium Type
sl@0
   197
    // [2] Device-Specific Paramater
sl@0
   198
    // [3] Block Descriptor Length
sl@0
   199
sl@0
   200
    // [0] Mode Date Length
sl@0
   201
    // Sending only Mode parameter header
sl@0
   202
    aBuffer[0] = 3;
sl@0
   203
sl@0
   204
    // [1] Medium Type
sl@0
   205
    // 0x00 for SBC
sl@0
   206
sl@0
   207
    // [2] Device specific parameter
sl@0
   208
    // SBC-3 6.3.1
sl@0
   209
    // set SWP bit at the Device Specific parameters
sl@0
   210
    if (iWp)
sl@0
   211
        {
sl@0
   212
        aBuffer[2] |= 0x80;
sl@0
   213
        }
sl@0
   214
sl@0
   215
    // [3] Block Descriptor Length
sl@0
   216
    // 0x00 for no descriptors
sl@0
   217
sl@0
   218
    // No Block Descriptors
sl@0
   219
sl@0
   220
    // No Mode Pages
sl@0
   221
sl@0
   222
    // Truncate to Allocation Length of the Request
sl@0
   223
    TUint length = iAllocationLength < KCommandLength ?
sl@0
   224
                    iAllocationLength : KCommandLength;
sl@0
   225
    aBuffer.SetLength(length);
sl@0
   226
    }
sl@0
   227
sl@0
   228
// ****	START STOP UNIT ****
sl@0
   229
void TScsiServerStartStopUnitReq::DecodeL(const TDesC8& aPtr)
sl@0
   230
    {
sl@0
   231
    __MSFNLOG
sl@0
   232
	TScsiServerReq::DecodeL(aPtr);
sl@0
   233
sl@0
   234
    const TUint8 KStartMask = 0x01;
sl@0
   235
    const TUint8 KImmedMask = 0x01;
sl@0
   236
    const TUint8 KLoejMask = 0x02;
sl@0
   237
sl@0
   238
    iImmed = aPtr[1] & KImmedMask ? ETrue : EFalse;
sl@0
   239
    iStart = aPtr[4] & KStartMask ? ETrue : EFalse;
sl@0
   240
    iLoej = aPtr[4] & KLoejMask ? ETrue : EFalse;
sl@0
   241
sl@0
   242
    __PRINT2(_L("<-PROTOCOL(SCSI) START STOP UNIT Data %X %X\n"), aPtr[1], aPtr[4]);
sl@0
   243
    __PRINT1(_L("IMMED = %d\n"), iImmed);
sl@0
   244
    __PRINT1(_L("START = %d\n"), iStart);
sl@0
   245
    __PRINT1(_L("LOEJ = %d\n"), iLoej);
sl@0
   246
    }
sl@0
   247
sl@0
   248
sl@0
   249
// ****	PREVENT MEDIA REMOVAL ****
sl@0
   250
void TScsiServerPreventMediaRemovalReq::DecodeL(const TDesC8& aPtr)
sl@0
   251
    {
sl@0
   252
    __MSFNLOG
sl@0
   253
	TScsiServerReq::DecodeL(aPtr);
sl@0
   254
	iPrevent = aPtr[4] & 0x01;
sl@0
   255
	__PRINT1(_L("<-PROTOCOL(SCSI) PREVENT MEDIA REMOVAL prevent = %d\n"), iPrevent);
sl@0
   256
    }
sl@0
   257
sl@0
   258
sl@0
   259
// ****	READ FORMAT CAPACITIES ****
sl@0
   260
void TScsiServerReadFormatCapacitiesReq::DecodeL(const TDesC8& aPtr)
sl@0
   261
    {
sl@0
   262
    __MSFNLOG
sl@0
   263
	TScsiServerReq::DecodeL(aPtr);
sl@0
   264
    const TUint8* ptr = aPtr.Ptr();
sl@0
   265
    iAllocationLength = BigEndian::Get32(ptr+7);
sl@0
   266
	__PRINT(_L("<-PROTOCOL(SCSI) READ FORMAT CAPACITIES\n"));
sl@0
   267
    }
sl@0
   268
sl@0
   269
sl@0
   270
void TScsiServerReadFormatCapacitiesResp::Encode(TDes8& aBuffer) const
sl@0
   271
    {
sl@0
   272
    __MSFNSLOG
sl@0
   273
	__PRINT(_L("->PROTOCOL(SCSI) READ FORMAT CAPACITIES\n"));
sl@0
   274
	aBuffer.FillZ(KResponseLength);
sl@0
   275
	aBuffer[3] = 0x08;	// Capacity List Length
sl@0
   276
sl@0
   277
	aBuffer[4] = static_cast<TUint8>(iNumberBlocks >> 24);	// Number of blocks
sl@0
   278
	aBuffer[5] = static_cast<TUint8>(iNumberBlocks >> 16);	//
sl@0
   279
	aBuffer[6] = static_cast<TUint8>(iNumberBlocks >> 8);	//
sl@0
   280
	aBuffer[7] = static_cast<TUint8>(iNumberBlocks);		//
sl@0
   281
sl@0
   282
	aBuffer[8] = 0x02;	// Formatted size
sl@0
   283
sl@0
   284
	aBuffer[9]  = 0x00;	// 512 Byte Blocks
sl@0
   285
	aBuffer[10] = 0x02;	//
sl@0
   286
	aBuffer[11] = 0x00;	//
sl@0
   287
sl@0
   288
    // Truncate to Allocation Length of the Request
sl@0
   289
    // Truncate to Allocation Length of the Request
sl@0
   290
    TUint length = iAllocationLength < KResponseLength ?
sl@0
   291
                    iAllocationLength : KResponseLength;
sl@0
   292
    aBuffer.SetLength(length);
sl@0
   293
    }
sl@0
   294
sl@0
   295
sl@0
   296
// ****	READ CAPACITY (10) ****
sl@0
   297
void TScsiServerReadCapacity10Req::DecodeL(const TDesC8& aPtr)
sl@0
   298
    {
sl@0
   299
    __MSFNLOG
sl@0
   300
	TScsiServerReq::DecodeL(aPtr);
sl@0
   301
    iPmi = aPtr[8] & 0x01;
sl@0
   302
    const TUint8* ptr = aPtr.Ptr();
sl@0
   303
	iLogicalBlockAddress = BigEndian::Get32(ptr+2);
sl@0
   304
    __PRINT(_L("<-PROTOCOL(SCSI) READ CAPACITY (10)\n"));
sl@0
   305
    }
sl@0
   306
sl@0
   307
sl@0
   308
void TScsiServerReadCapacity10Resp::Encode(TDes8& aBuffer) const
sl@0
   309
    {
sl@0
   310
    __MSFNSLOG
sl@0
   311
    aBuffer.FillZ(KCommandLength);
sl@0
   312
sl@0
   313
    __PRINT3(_L("->PROTOCOL(SCSI) READ CAPACITY (10) Block size=0x%X, NumBlocks=0x%08X%08X\n"),
sl@0
   314
             iBlockSize,
sl@0
   315
             I64HIGH(iNumberBlocks),
sl@0
   316
             I64LOW(iNumberBlocks));
sl@0
   317
sl@0
   318
    if (I64HIGH(iNumberBlocks) == 0)
sl@0
   319
        {
sl@0
   320
        TUint32 numBlocks = I64LOW(iNumberBlocks);
sl@0
   321
sl@0
   322
        // Number of blocks
sl@0
   323
        aBuffer[0] = static_cast<TUint8>(numBlocks >> 24);
sl@0
   324
        aBuffer[1] = static_cast<TUint8>(numBlocks >> 16);
sl@0
   325
        aBuffer[2] = static_cast<TUint8>(numBlocks >> 8);
sl@0
   326
        aBuffer[3] = static_cast<TUint8>(numBlocks);
sl@0
   327
        }
sl@0
   328
    else
sl@0
   329
        {
sl@0
   330
        // indicate that size more then )0xFFFFFFFF
sl@0
   331
        aBuffer[0] = aBuffer[1] = aBuffer[2] = aBuffer[3] = 0xFF;
sl@0
   332
        }
sl@0
   333
sl@0
   334
	// Block Size
sl@0
   335
    aBuffer[4] = static_cast<TUint8>(iBlockSize >> 24);
sl@0
   336
    aBuffer[5] = static_cast<TUint8>(iBlockSize >> 16);
sl@0
   337
    aBuffer[6] = static_cast<TUint8>(iBlockSize >> 8);
sl@0
   338
    aBuffer[7] = static_cast<TUint8>(iBlockSize);
sl@0
   339
    }
sl@0
   340
sl@0
   341
sl@0
   342
// ****	RdWr10 ****
sl@0
   343
void TScsiServerRdWr10Req::DecodeL(const TDesC8& aDes)
sl@0
   344
{
sl@0
   345
    __MSFNLOG
sl@0
   346
	TScsiServerReq::DecodeL(aDes);
sl@0
   347
sl@0
   348
    // PROTECT
sl@0
   349
	iProtect = aDes[1] >> 5;
sl@0
   350
sl@0
   351
    const TUint8* ptr = aDes.Ptr();
sl@0
   352
    // LOGICAL BLOCK ADDRESS
sl@0
   353
	iLogicalBlockAddress = BigEndian::Get32(ptr+2);
sl@0
   354
    // TRANSFER LENGTH
sl@0
   355
	iTransferLength = BigEndian::Get16(ptr+7);
sl@0
   356
sl@0
   357
	__PRINT2(_L("<-PROTOCOL(SCSI) RD/WR (10) : LBA = %x, Length = %x  (blocks)\n"),
sl@0
   358
             iLogicalBlockAddress, iTransferLength);
sl@0
   359
}
sl@0
   360
sl@0
   361
sl@0
   362
// ****	READ (10) ****
sl@0
   363
// ****	WRITE (10) ****
sl@0
   364
// ****	VERIFY (10) ****
sl@0
   365
void TScsiServerVerify10Req::DecodeL(const TDesC8& aPtr)
sl@0
   366
    {
sl@0
   367
    __MSFNLOG
sl@0
   368
	TScsiServerRdWr10Req::DecodeL(aPtr);
sl@0
   369
	iBytchk = aPtr[1] & 0x02 ? ETrue : EFalse;
sl@0
   370
    }