userlibandfileserver/fileserver/smassstorage/cbulkonlytransport.cpp
author hgs
Mon, 11 Oct 2010 17:54:41 +0100
changeset 286 48e57fb1237e
parent 271 dc268b18d709
permissions -rw-r--r--
201039_11
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
269
d57b86b1867a 201035_03
hgs
parents: 0
diff changeset
     1
// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     2
// All rights reserved.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     3
// This component and the accompanying materials are made available
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     5
// which accompanies this distribution, and is available
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     7
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     8
// Initial Contributors:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    10
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    11
// Contributors:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    12
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    13
// Description:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    14
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    15
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    16
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    17
 @file
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    18
 @internalTechnology
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    19
*/
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    20
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    21
#include <e32std.h>
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    22
#include "mtransport.h"
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    23
#include "mprotocol.h"
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    24
#include "mldddevicestatenotification.h"
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    25
#include "tbulkmm.h"
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    26
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    27
#include "drivemanager.h"
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    28
#include "cusbmassstoragecontroller.h"
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    29
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    30
#include "cbulkonlytransport.h"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    31
#include "cbulkonlytransportusbcldd.h"
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
    32
#if !defined(__WINS__) && !defined(__X86__)
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    33
#include "cbulkonlytransportusbcscldd.h"
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
    34
#endif
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    35
#include "smassstorage.h"
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    36
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    37
#include "OstTraceDefinitions.h"
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    38
#ifdef OST_TRACE_COMPILER_IN_USE
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    39
#include "cbulkonlytransportTraces.h"
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    40
#endif
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    41
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    42
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    43
//CBW offsets
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    44
static const TInt KCbwSignatureOffset          = 0;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    45
static const TInt KCbwTagOffset                = 4;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    46
static const TInt KCbwDataTransferLengthOffset = 8;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    47
static const TInt KCbwFlagOffset               = 12;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    48
static const TInt KCbwLunOffset                = 13;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    49
static const TInt KCbwCbLengthOffset           = 14;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    50
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    51
static const TInt KMaxCbwcbLength              = 16;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    52
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    53
// CSW offsets
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    54
static const TInt KCswSingnatureOffset         = 0;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    55
static const TInt KCswTagOffset                = 4;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    56
static const TInt KCswDataResidueOffset        = 8;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    57
static const TInt KCswStatusOffset             = 12;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    58
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    59
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    60
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    61
 This function unpacks into the TUsbRequestHdr class from a descriptor with
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    62
 the alignment that would be introduced on the USB bus.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    63
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    64
 @param aBuffer Input buffer
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    65
 @param aTarget Unpacked header.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    66
 @return Error.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    67
 */
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    68
TInt TUsbRequestHdr::Decode(const TDesC8& aBuffer)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    69
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    70
    if (aBuffer.Length() < static_cast<TInt>(KRequestHdrSize))
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    71
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    72
        OstTrace1(TRACE_SMASSSTORAGE_USB, TUSBREQUESTHDR_DECODE_ERR,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    73
                 "ERROR: USB DEVICE REQUEST invalid length 0x%x", aBuffer.Length());
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    74
        return KErrGeneral;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    75
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    76
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    77
    iRequestType = aBuffer[0];
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    78
    iRequest = static_cast<TEp0Request>(aBuffer[1]);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    79
    iValue   = static_cast<TUint16>(aBuffer[2] + (aBuffer[3] << 8));
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    80
    iIndex   = static_cast<TUint16>(aBuffer[4] + (aBuffer[5] << 8));
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    81
    iLength  = static_cast<TUint16>(aBuffer[6] + (aBuffer[7] << 8));
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    82
    OstTraceExt5(TRACE_SMASSSTORAGE_USB, TUSBREQUESTHDR_DECODE,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    83
              "USB DEVICE REQUEST type=0x%x request=0x%x value=%d index=%d length=%d",
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    84
              iRequestType, iRequest, iValue, iIndex, iLength);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    85
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    86
    return KErrNone;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    87
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    88
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    89
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    90
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    91
This function determines whether data is required by the host in response
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    92
to a message header.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    93
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    94
@return TBool   Flag indicating whether a data response required.
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    95
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    96
TBool TUsbRequestHdr::IsDataResponseRequired() const
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    97
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    98
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
    99
    return (iRequestType & 0x80) ? (TBool)ETrue : (TBool)EFalse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   100
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   101
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   102
//-------------------------------------
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   103
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   104
Create an object of a class derived from CBulkOnlyTransport (default to CBulkOnlyTransportUsbcLdd object)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   105
@param aNumDrives - The number of drives available for MS
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   106
@param aController - reference to the parent
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   107
@return pointer to newly created derived class object
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   108
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   109
CBulkOnlyTransport* CBulkOnlyTransport::NewL(TInt aNumDrives,CUsbMassStorageController& aController)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   110
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   111
    return NewL(aNumDrives,aController, (CUsbMassStorageController::TTransportldd) 1);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   112
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   113
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   114
/**
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   115
Create an object of a class derived from CBulkOnlyTransport
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   116
@param aNumDrives - The number of drives available for MS
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   117
@param aController - reference to the parent
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   118
@param aTransportLddFlag - Type of usb client ldd
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   119
@return pointer to newly created derived class object
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   120
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   121
CBulkOnlyTransport* CBulkOnlyTransport::NewL(TInt aNumDrives,CUsbMassStorageController& aController, CUsbMassStorageController::TTransportldd aTransportLddFlag)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   122
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   123
    if (aNumDrives <=0 || static_cast<TUint>(aNumDrives) > KUsbMsMaxDrives)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   124
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   125
        User::Leave(KErrArgument);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   126
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   127
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   128
#if !defined(__WINS__) && !defined(__X86__)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   129
    CBulkOnlyTransportUsbcScLdd* scTransport;
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   130
#endif
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   131
    CBulkOnlyTransportUsbcLdd* nonscTransport;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   132
    switch (aTransportLddFlag)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   133
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   134
        case 1:
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   135
            nonscTransport = new(ELeave) CBulkOnlyTransportUsbcLdd(aNumDrives, aController);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   136
            OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_NEWL1, "CBulkOnlyTransportUsbcLdd created.");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   137
            return nonscTransport;
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   138
#if !defined(__WINS__) && !defined(__X86__)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   139
        case 2:
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   140
            scTransport = new(ELeave) CBulkOnlyTransportUsbcScLdd(aNumDrives, aController);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   141
            OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_NEWL2, "CBulkOnlyTransportUsbcScLdd created.");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   142
            return scTransport;
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   143
#endif
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   144
        default:
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   145
            __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsCBulkOnlyTransportNull));
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   146
            return NULL;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   147
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   148
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   149
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   150
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   151
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   152
TInt CBulkOnlyTransport::InitialiseTransportL(TInt aTransportLddFlag)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   153
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   154
    TInt ret = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   155
    MTransportBase* transport;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   156
    iController.GetTransport(transport);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   157
    switch (aTransportLddFlag)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   158
        {
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   159
#if !defined(__WINS__) && !defined(__X86__)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   160
        case 2:
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   161
                ret = ((CBulkOnlyTransportUsbcScLdd*) transport)->Ldd().Open(0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   162
                if (ret != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   163
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   164
                    return ret;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   165
                    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   166
                else
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   167
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   168
                    ((CBulkOnlyTransportUsbcScLdd*) transport)->Ldd().Close();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   169
                    CleanupStack::PushL(transport);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   170
                    ((CBulkOnlyTransportUsbcScLdd*) transport)->ConstructL();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   171
                    CleanupStack::Pop(transport);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   172
                    return ret;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   173
                    }
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   174
#endif
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   175
        case 1:
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   176
                ret = ((CBulkOnlyTransportUsbcLdd*) transport)->Ldd().Open(0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   177
                if (ret != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   178
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   179
                    return ret;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   180
                    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   181
                else
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   182
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   183
                    ((CBulkOnlyTransportUsbcLdd*) transport)->Ldd().Close();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   184
                    CleanupStack::PushL(transport);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   185
                    ((CBulkOnlyTransportUsbcLdd*) transport)->ConstructL();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   186
                    CleanupStack::Pop(transport);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   187
                    return ret;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   188
                    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   189
        default:
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   190
                return KErrNotFound;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   191
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   192
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   193
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   194
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   195
c'tor
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   196
@param aNumDrives - The number of drives available for MS
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   197
@param aController - reference to the parent
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   198
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   199
CBulkOnlyTransport::CBulkOnlyTransport(TInt aNumDrives,CUsbMassStorageController& aController):
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   200
    CActive(EPriorityStandard),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   201
    iMaxLun(aNumDrives-1),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   202
    iController(aController),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   203
    iStallAllowed(ETrue),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   204
    iInterfaceConfigured(EFalse),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   205
    iCommandBufPtr(NULL,0),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   206
    iDataBufPtr(NULL,0),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   207
    iCswBufPtr(NULL,0),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   208
    iPaddingBufPtr(NULL,0),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   209
    iWriteBufPtr(NULL,0),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   210
    iReadBufPtr(NULL, 0),
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   211
    iCbwBufPtr(NULL,0)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   212
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   213
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   214
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   215
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   216
Destructor
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   217
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   218
CBulkOnlyTransport::~CBulkOnlyTransport()
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   219
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   220
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   221
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   222
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   223
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   224
Called by the protocol after processing the packet to indicate that more data is required.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   225
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   226
@param aData reference to the data buffer.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   227
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   228
void CBulkOnlyTransport::SetupReadData(TUint aLength)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   229
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   230
    OstTrace1(TRACE_SMASSSTORAGE_BOTDATA, CBULKONLYTRANSPORT_SETUPREADDATA,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   231
              "BOT SetupReadData Length = 0x%x bytes", aLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   232
    iBufSize = aLength;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   233
    iReadSetUp = ETrue;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   234
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   235
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   236
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   237
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   238
Called by the protocol after processing the packet to indicate that data should be written to the host.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   239
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   240
@param aData reference to the data buffer.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   241
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   242
void CBulkOnlyTransport::SetupWriteData(TPtrC8& aData)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   243
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   244
    OstTrace1(TRACE_SMASSSTORAGE_BOTDATA, CBULKONLYTRANSPORT_SETUPWRITEDATA,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   245
              "BOT SetupWriteData Length = 0x%x bytes", aData.Length());
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   246
    iWriteBufPtr.Set(aData);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   247
    iWriteSetUp = ETrue;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   248
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   249
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   250
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   251
TInt CBulkOnlyTransport::Start()
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   252
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   253
    OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_START, "Start...");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   254
    if (!iProtocol)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   255
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   256
        return KErrBadHandle;   //protocol should be set up before start
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   257
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   258
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   259
    if (IsActive())
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   260
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   261
        OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_START1, "Error: active before start!");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   262
        return KErrInUse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   263
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   264
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   265
    TInt err = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   266
    if ((err = SetupConfigurationDescriptor())  != KErrNone ||
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   267
        (err = SetupInterfaceDescriptors())     != KErrNone )
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   268
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   269
        OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_START2, "Error: descriptors setup failed %d", err);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   270
        return err;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   271
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   272
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   273
    AllocateEndpointResources();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   274
    ActivateDeviceStateNotifier();  // activate notifier wich will wait until USB became configured
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   275
    TUsbcDeviceState deviceStatus = EUsbcDeviceStateDefault;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   276
    err = GetDeviceStatus(deviceStatus);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   277
    if (err == KErrNone && deviceStatus == EUsbcDeviceStateConfigured)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   278
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   279
        err = HwStart();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   280
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   281
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   282
#ifdef MSDC_MULTITHREADED
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   283
    TPtr8 aDes1(NULL,0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   284
    TPtr8 aDes2(NULL,0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   285
    GetBufferPointers(aDes1, aDes2);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   286
    iProtocol->InitializeBufferPointers(aDes1, aDes2); // have to pass pointer to memory not offsets to initialise TPtr, and lengths
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   287
#endif
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   288
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   289
    iInterfaceConfigured = ETrue;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   290
    return err;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   291
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   292
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   293
TInt CBulkOnlyTransport::HwStart(TBool aDiscard)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   294
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   295
    TInt lun = MaxLun();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   296
    OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_HWSTART, "HwStart MAX LUN=%d", lun);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   297
    do
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   298
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   299
        Controller().DriveManager().Connect(lun);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   300
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   301
    while(--lun >= 0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   302
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   303
    TInt res = StartControlInterface();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   304
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   305
    iCurrentState = ENone;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   306
    iWriteSetUp=EFalse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   307
    iReadSetUp=EFalse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   308
    iStarted = ETrue;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   309
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   310
    if (aDiscard)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   311
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   312
        FlushData();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   313
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   314
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   315
    ReadCBW();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   316
    return res;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   317
    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   318
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   319
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   320
TInt CBulkOnlyTransport::HwStop()
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   321
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   322
    OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_HWSTOP, "HwStop");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   323
    if (iStarted)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   324
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   325
        StopBulkOnlyEndpoint();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   326
        CancelControlInterface();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   327
        iStarted = EFalse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   328
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   329
    return KErrNone;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   330
    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   331
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   332
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   333
void CBulkOnlyTransport::StopBulkOnlyEndpoint()
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   334
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   335
    TInt lun = MaxLun();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   336
    do
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   337
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   338
        Controller().DriveManager().Disconnect(lun);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   339
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   340
    while(--lun >= 0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   341
    Cancel();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   342
    iProtocol->Cancel();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   343
    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   344
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   345
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   346
TInt CBulkOnlyTransport::HwSuspend()
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   347
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   348
    OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_HWSUSPEND, "HwSuspend");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   349
    TInt lun = MaxLun();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   350
    do
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   351
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   352
        Controller().DriveManager().Disconnect(lun);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   353
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   354
    while(--lun >= 0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   355
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   356
    return KErrNone;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   357
    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   358
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   359
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   360
TInt CBulkOnlyTransport::HwResume()
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   361
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   362
    OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_HWRESUME, "HwResume");
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   363
    TInt lun = MaxLun();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   364
    do
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   365
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   366
        Controller().DriveManager().Connect(lun);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   367
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   368
    while(--lun >= 0);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   369
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   370
    return KErrNone;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   371
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   372
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   373
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   374
Stops the Bulk Only Transport
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   375
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   376
TInt CBulkOnlyTransport::Stop()
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   377
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   378
    OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_STOP, "Stop");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   379
    CancelControlInterface();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   380
    CancelDeviceStateNotifier();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   381
    Cancel();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   382
    if  (iInterfaceConfigured)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   383
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   384
        ReleaseInterface();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   385
        SetupConfigurationDescriptor(ETrue);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   386
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   387
    iCurrentState = ENone;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   388
    iInterfaceConfigured = EFalse;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   389
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   390
    return KErrNone;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   391
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   392
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   393
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   394
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   395
void CBulkOnlyTransport::DoCancel()
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   396
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   397
    CancelReadWriteRequests();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   398
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   399
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   400
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   401
void CBulkOnlyTransport::Activate(TInt aReason)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   402
    {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   403
    SetActive();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   404
    TRequestStatus* r = &iStatus;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   405
    User::RequestComplete(r, aReason);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   406
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   407
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   408
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   409
void CBulkOnlyTransport::RunL()
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   410
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   411
    if (iStatus != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   412
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   413
        OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_RUNL, "Error %d in RunL, halt endpoints", iStatus.Int());
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   414
        SetPermError(); //halt endpoints for reset recovery
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   415
        return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   416
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   417
    switch (iCurrentState)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   418
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   419
        case EWaitForCBW:
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   420
            OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_RUNL1, "EWaitForCBW");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   421
            ProcessCbwEvent();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   422
            break;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   423
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   424
        case EWritingData:
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   425
            OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_RUNL2, "EWritingData");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   426
            iWriteSetUp = EFalse;  //the buffer was used
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   427
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   428
            if (iDataResidue && iStallAllowed)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   429
                {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   430
                StallEndpointAndWaitForClear();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   431
                }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   432
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   433
            SendCSW(iCbwTag, iDataResidue, iCmdStatus);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   434
            break;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   435
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   436
        case EReadingData:
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   437
            {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   438
            OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_RUNL3, "EReadingData");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   439
            ProcessReadingDataEvent();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   440
            }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   441
            break;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   442
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   443
        case ESendingCSW:
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   444
            OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_RUNL4, "ESendingCSW");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   445
            ReadCBW();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   446
            break;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   447
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   448
        case EPermErr:
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   449
            OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_RUNL5, "EPermErr");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   450
            StallEndpointAndWaitForClear();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   451
            break;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   452
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   453
        default:
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   454
            SetPermError();     // unexpected state
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   455
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   456
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   457
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   458
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   459
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   460
Decode the CBW received from the host via OutEndpoint
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   461
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   462
- If the header is valid, the data content is passed to the parser.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   463
- Depending on the command, more data may be transmitted/received.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   464
- ...or the CSW is sent (if not a data command).
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   465
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   466
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   467
void CBulkOnlyTransport::DecodeCBW()
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   468
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   469
    SetCbwPtr();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   470
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   471
    if (!CheckCBW())  //check if CBW valid and meaningful
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   472
        {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   473
        // CBW not valid or meaningful
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   474
        // Specification says: "If the CBW is not valid, the device shall STALL
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   475
        // the Bulk-In pipe. Also, the device shall either STALL the Bulk-Out pipe,
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   476
        // or the device shall accept and discard any Bulk-Out data. The device
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   477
        // shall maintain this state until a Reset Recovery."
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   478
        // Here we keep bulk-in ep stalled and ignore bulk-out ep.
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   479
        SetPermError();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   480
        ExpireData((TAny*) (iCbwBufPtr.Ptr()));
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   481
        return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   482
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   483
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   484
    TPtrC8 aData;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   485
    aData.Set(&iCbwBufPtr[KCbwCbLengthOffset], KMaxCbwcbLength+1);    //prepare data for protocol starting form Length
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   486
    TUint lun = static_cast<TUint8>(iCbwBufPtr[13] & 0x0f);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   487
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   488
    iCbwTag  =  static_cast<TUint32>(iCbwBufPtr[KCbwTagOffset])     |
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   489
                static_cast<TUint32>(iCbwBufPtr[KCbwTagOffset+1])   <<8 |
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   490
                static_cast<TUint32>(iCbwBufPtr[KCbwTagOffset+2])   <<16|
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   491
                static_cast<TUint32>(iCbwBufPtr[KCbwTagOffset+3])   <<24;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   492
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   493
    TInt i = KCbwDataTransferLengthOffset;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   494
    TUint32 hostDataLength =  static_cast<TUint32>(iCbwBufPtr[i  ])       |
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   495
                            static_cast<TUint32>(iCbwBufPtr[i+1]) <<8   |
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   496
                            static_cast<TUint32>(iCbwBufPtr[i+2]) <<16  |
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   497
                            static_cast<TUint32>(iCbwBufPtr[i+3]) <<24;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   498
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   499
    TBool dataToHost = iCbwBufPtr[KCbwFlagOffset] & 0x80;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   500
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   501
    OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_DECODECBW,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   502
              "CBW LUN=%d", lun);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   503
    OstTraceExt3(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_DECODECBW0,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   504
              "CBW hostDataLength=0x%x, CBWtag = 0x%x, dataToHost=%d",
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   505
              hostDataLength, iCbwTag, (TUint32)dataToHost);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   506
    //////////////////////////////////////////////
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   507
    TBool ret = iProtocol->DecodePacket(aData, lun);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   508
    //////////////////////////////////////////////
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   509
    ExpireData((TAny*) (iCbwBufPtr.Ptr()));
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   510
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   511
    iStallAllowed = ETrue;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   512
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   513
    if (!ret)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   514
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   515
        OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_DECODECBW1, "ERROR: DecodePacket err=%d", ret);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   516
        iCmdStatus = ECommandFailed;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   517
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   518
    else
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   519
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   520
        OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW2, "ERROR: DecodePacket OK");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   521
        iCmdStatus = ECommandPassed;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   522
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   523
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   524
    if (hostDataLength)    // Host  expected data transfer
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   525
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   526
        if (dataToHost)  // send data to host
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   527
            {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   528
            if (!iWriteSetUp) //write buffer was not set up
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   529
                {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   530
                OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW3, "Write buffer was not setup");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   531
                iDataResidue =hostDataLength;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   532
                OstTrace1(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW4, "DataResidue (write to host)=%d", iDataResidue);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   533
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   534
//------------------------------------
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   535
                if (hostDataLength <= KBOTMaxBufSize)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   536
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   537
                    OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW5, "Case 4 or 8");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   538
                    SetPaddingBufPtr(hostDataLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   539
                    iPaddingBufPtr.FillZ(hostDataLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   540
                    TPtrC8 ptr(NULL, 0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   541
                    ptr.Set((TUint8*)iPaddingBufPtr.Ptr(), hostDataLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   542
                    WriteData(iStatus, ptr, hostDataLength, EFalse);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   543
                    iStallAllowed = EFalse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   544
                    if (iReadSetUp)  //read buffer WAS set up - case (8)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   545
                        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   546
                        OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW6, "It is Case 8");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   547
                        iCmdStatus = EPhaseError;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   548
                        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   549
                    return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   550
                    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   551
                else
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   552
//------------------------------------
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   553
//                  Use next block instead of StallEndpointAndWaitForClear(InEndpoint);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   554
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   555
                    SetPaddingBufPtr(hostDataLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   556
                    iPaddingBufPtr.FillZ(KBOTMaxBufSize);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   557
                    TUint c =0;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   558
                    TRequestStatus status;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   559
                    while (c<hostDataLength)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   560
                        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   561
                        TInt len;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   562
                        if (hostDataLength - c >  KBOTMaxBufSize)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   563
                            {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   564
                            len = KBOTMaxBufSize;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   565
                            }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   566
                        else
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   567
                            {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   568
                            len = hostDataLength - c;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   569
                            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   570
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   571
                            TPtrC8 ptr(NULL, 0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   572
                            ptr.Set((TUint8*)iPaddingBufPtr.Ptr(), len);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   573
                            WriteUsb(status, ptr, len);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   574
                            User::WaitForRequest(status);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   575
                            c +=  KBOTMaxBufSize;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   576
                        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   577
                    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   578
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   579
                if (iReadSetUp)  //read buffer WAS set up - case (8)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   580
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   581
                    OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW7, "Case 8");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   582
                    SendCSW(iCbwTag, hostDataLength, EPhaseError);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   583
                      //don't care to reset any flag - should get reset recovery
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   584
                    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   585
                else   // case (4)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   586
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   587
                    OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW8, "Case 4");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   588
                    SendCSW(iCbwTag, hostDataLength, iCmdStatus);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   589
                    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   590
                return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   591
                }   // if (!iWriteSetUp)
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   592
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   593
//==================
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   594
            TUint32 deviceDataLength = iWriteBufPtr.Length();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   595
            iDataResidue =hostDataLength - deviceDataLength ;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   596
            OstTraceExt2(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW9,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   597
                         "Device data length = 0x%x, DataResidue (write to host)=0x%x", deviceDataLength, iDataResidue);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   598
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   599
            if (deviceDataLength < hostDataLength  &&
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   600
                hostDataLength < KBOTMaxBufSize )
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   601
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   602
                    OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW10, "Case 5 (padding)");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   603
                    SetPaddingBufPtr(hostDataLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   604
                    iPaddingBufPtr.Zero();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   605
                    iPaddingBufPtr.Append(iWriteBufPtr);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   606
                    iStallAllowed = EFalse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   607
                    OstTrace1(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW11,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   608
                              "iPaddingBufPtr.Length = 0x%x",
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   609
                              iPaddingBufPtr.Length());
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   610
                    TPtrC8 ptr(NULL, 0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   611
                    ptr.Set((TUint8*)iPaddingBufPtr.Ptr(), hostDataLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   612
                    WriteData(iStatus, ptr, hostDataLength, EFalse);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   613
                    return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   614
                    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   615
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   616
//===================
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   617
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   618
            if (deviceDataLength == hostDataLength)     //case (6)[==]
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   619
                {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   620
                OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW12, "Case 6");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   621
                WriteData(iStatus, iWriteBufPtr, deviceDataLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   622
                return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   623
                }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   624
            else if (deviceDataLength < hostDataLength) //case (5)[<]
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   625
                {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   626
                OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW13, "Case 5");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   627
                WriteData(iStatus, iWriteBufPtr, deviceDataLength, ETrue);      // Send ZLP
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   628
                return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   629
                }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   630
            else                                        // deviceDataLength > hostDataLength - case (7)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   631
                {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   632
                OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW14, "Case 7");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   633
                iCmdStatus = EPhaseError;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   634
                iDataResidue = 0;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   635
                WriteData(iStatus, iWriteBufPtr, hostDataLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   636
                return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   637
                }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   638
            }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   639
        else  //read data from host
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   640
            {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   641
            if (!iReadSetUp)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   642
                {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   643
                iDataResidue = hostDataLength;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   644
                OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_DECODECBW15, "Read buffer was not setup");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   645
//              Use next block instead of StallEndpointAndWaitForClear(OutEndpoint);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   646
                DiscardData(hostDataLength);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   647
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   648
                if (iWriteSetUp) //case (10)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   649
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   650
                    OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW16, "case 10");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   651
                    SendCSW(iCbwTag, hostDataLength, EPhaseError);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   652
                    }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   653
                else // case (9)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   654
                    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   655
                    OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW17, "Case 9");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   656
                    SendCSW(iCbwTag, hostDataLength, iCmdStatus);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   657
                    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   658
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   659
                return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   660
                }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   661
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   662
            TUint32 deviceDataLength = iBufSize;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   663
            iDataResidue = hostDataLength;  // calculate residue later
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   664
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   665
            OstTraceExt2(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW18,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   666
                      "deviceDataLength = iBufSize = 0x%x, DataResidue = HDL for now (read from host) =0x%x",
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   667
                      deviceDataLength, iDataResidue);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   668
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   669
            if (deviceDataLength <= hostDataLength)  // case (11) and (12)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   670
                {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   671
                OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW19, "Case 11 or 12");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   672
                ReadData(deviceDataLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   673
                return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   674
                }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   675
            if (deviceDataLength > hostDataLength) // case  (13)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   676
                {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   677
                OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW20, "Case 13");
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   678
                /**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   679
                 * Comment following line in order to pass compliant test.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   680
                 * As spec said in case 13:"The device may receive data up to a
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   681
                 * total of dCBWDataTransferLength."
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   682
                 * Here we choose to ignore incoming data.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   683
                 */
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   684
                //StallEndpointAndWaitForClear(OutEndpoint); //Stall Out endpoint
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   685
                if (iReadSetUp)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   686
                    {
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   687
                    WriteToClient(hostDataLength);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   688
                    iReadSetUp = EFalse;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   689
                    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   690
                SendCSW(iCbwTag, hostDataLength, EPhaseError);
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   691
                return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   692
                }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   693
            }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   694
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   695
    else  // Host expected no data transfer
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   696
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   697
        OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW21, "No data transfer expected");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   698
        iDataResidue = 0;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   699
        if (iWriteSetUp || iReadSetUp)   // case (2) and (3)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   700
            {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   701
            OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW22, "Case 2 or 3");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   702
            SendCSW(iCbwTag, 0, EPhaseError);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   703
            }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   704
        else
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   705
            {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   706
            OstTrace0(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_DECODECBW23, "Case 1");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   707
            SendCSW(iCbwTag, 0, iCmdStatus);  //case (1)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   708
            }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   709
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   710
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   711
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   712
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   713
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   714
Check if CBW Valid and Meaningful.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   715
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   716
@return ETrue if CBW is Valid and Meaningful, EFalse otherwise
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   717
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   718
TBool CBulkOnlyTransport::CheckCBW()
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   719
    {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   720
    //
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   721
    // Check valid
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   722
    //
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   723
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   724
    // Check length
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   725
    if ((TUint) (iCbwBufPtr.Length()) != KCbwLength)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   726
        {
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   727
        OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_CHECKCBW, "ERROR Bad length: 0x%x != KCbwLength", iCbwBufPtr.Length());
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   728
        return EFalse;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   729
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   730
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   731
    // Check signature
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   732
    TInt i = KCbwSignatureOffset;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   733
    if (iCbwBufPtr[i  ] != 0x55 ||         // CBW Singature from USB Bulk-Only Transport spec
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   734
        iCbwBufPtr[i+1] != 0x53 ||
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   735
        iCbwBufPtr[i+2] != 0x42 ||
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   736
        iCbwBufPtr[i+3] != 0x43)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   737
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   738
        OstTraceData(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_CHECKCBW1,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   739
                     "CBW ERROR: Bad signature %s", &iCbwBufPtr[i], 4);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   740
        return EFalse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   741
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   742
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   743
    //
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   744
    // Check meaningful
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   745
    //
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   746
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   747
    // Check reserved bits ( must be zero )
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   748
    if ((iCbwBufPtr[KCbwLunOffset] & 0xF0) || (iCbwBufPtr[KCbwCbLengthOffset] & 0xE0))
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   749
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   750
        OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_CHECKCBW2, "CBW ERROR: Reserved bits not zero");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   751
        return EFalse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   752
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   753
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   754
    // check command block length
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   755
    TInt cbwcbLength = iCbwBufPtr[KCbwCbLengthOffset] & 0x1F;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   756
    if (cbwcbLength >KMaxCbwcbLength)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   757
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   758
        OstTrace0(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_CHECKCBW3, "CBW ERROR: Incorrect block length");
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   759
        return EFalse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   760
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   761
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   762
    //check LUN
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   763
    TInt8 lun = static_cast<TUint8>(iCbwBufPtr[KCbwLunOffset] & 0x0f);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   764
    if (iMaxLun < lun)
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   765
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   766
        OstTrace1(TRACE_SMASSSTORAGE_BOT, CBULKONLYTRANSPORT_CHECKCBW4, "CBW ERROR: bad lun: %d", lun);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   767
        return EFalse;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   768
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   769
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   770
    return ETrue;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   771
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   772
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   773
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   774
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   775
Initiate stalling of bulk IN endpoint.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   776
Used when protocol wants to force host to initiate a reset recovery.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   777
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   778
void CBulkOnlyTransport::SetPermError()
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   779
    {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   780
    iCurrentState = EPermErr;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   781
    Activate(KErrNone);
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   782
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   783
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   784
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   785
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   786
Send data provided by protocol to the host
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   787
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   788
@param aLength amount of data (in bytes) to be send to host
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   789
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   790
void CBulkOnlyTransport::WriteData(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   791
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   792
    if (IsActive())
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   793
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   794
        __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive));
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   795
        return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   796
        }
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   797
    WriteUsb(aStatus, aDes, aLength, aZlpRequired);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   798
    iCurrentState = EWritingData;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   799
    SetActive();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   800
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   801
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   802
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   803
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   804
Send Command Status Wrapper to the host
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   805
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   806
@param aTag Echo of Command Block Tag sent by the host.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   807
@param aDataResidue the difference between the amount of data expected by the
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   808
       host, and the actual amount of data processed by the device.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   809
@param aStatus indicates the success or failure of the command.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   810
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   811
void CBulkOnlyTransport::SendCSW(TUint aTag, TUint aDataResidue, TCswStatus aStatus)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   812
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   813
    OstTraceExt2(TRACE_SMASSSTORAGE_BOT1, CBULKONLYTRANSPORT_SENDCSW,
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   814
              "CSW DataResidue = 0x%x, Status = %d", aDataResidue, aStatus);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   815
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   816
    if (IsActive())
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   817
        {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   818
        __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive));
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   819
        return;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   820
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   821
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   822
    SetCswBufPtr(KCswLength);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   823
    TInt i = KCswSingnatureOffset;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   824
    iCswBufPtr[i  ] = 0x55;   // CSW Singature from USB Bulk-Only Transport spec
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   825
    iCswBufPtr[i+1] = 0x53;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   826
    iCswBufPtr[i+2] = 0x42;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   827
    iCswBufPtr[i+3] = 0x53;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   828
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   829
    i = KCswTagOffset;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   830
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   831
    iCswBufPtr[i  ] = static_cast<TUint8>((aTag & 0x000000FF));
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   832
    iCswBufPtr[i+1] = static_cast<TUint8>((aTag & 0x0000FF00) >> 8);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   833
    iCswBufPtr[i+2] = static_cast<TUint8>((aTag & 0x00FF0000) >> 16);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   834
    iCswBufPtr[i+3] = static_cast<TUint8>((aTag & 0xFF000000) >> 24);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   835
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   836
    i = KCswDataResidueOffset;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   837
    iCswBufPtr[i  ] = static_cast<TUint8>((aDataResidue & 0x000000FF));
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   838
    iCswBufPtr[i+1] = static_cast<TUint8>((aDataResidue & 0x0000FF00) >> 8);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   839
    iCswBufPtr[i+2] = static_cast<TUint8>((aDataResidue & 0x00FF0000) >> 16);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   840
    iCswBufPtr[i+3] = static_cast<TUint8>((aDataResidue & 0xFF000000) >> 24);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   841
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   842
    iCswBufPtr[KCswStatusOffset] = static_cast<TUint8>(aStatus);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   843
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   844
    TPtrC8 ptr(NULL, 0);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   845
    ptr.Set((const TUint8*)iCswBufPtr.Ptr(), KCswLength);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   846
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   847
    WriteUsb(iStatus, ptr, KCswLength);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   848
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   849
    iCurrentState = ESendingCSW;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   850
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   851
    SetActive();
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   852
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   853
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   854
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   855
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   856
Associates the transport with the protocol.  Called during initialization of the controller.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   857
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   858
@param aProtocol reference to the protocol
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   859
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   860
void CBulkOnlyTransport::RegisterProtocol(MProtocolBase& aProtocol)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   861
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   862
    iProtocol = &aProtocol;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   863
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   864
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   865
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   866
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   867
Used by CControlInterface
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   868
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   869
@return reference to the controller which instantiate the CBulkOnlyTransport
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   870
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   871
CUsbMassStorageController& CBulkOnlyTransport::Controller()
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   872
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   873
    return iController;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   874
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   875
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   876
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   877
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   878
@return the number of logical units supported by the device.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   879
Logical Unit Numbers on the device shall be numbered contiguously starting from LUN
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   880
0 to a maximum LUN of 15 (Fh).
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   881
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   882
TInt CBulkOnlyTransport::MaxLun()
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   883
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   884
    return iMaxLun;
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   885
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   886
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   887
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   888
void CBulkOnlyTransport::GetCommandBufPtr(TPtr8& aDes, TUint aLength) // Set pointer to buffer of specified aLength for command
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   889
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   890
    aDes.Set(SetCommandBufPtr(aLength));
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   891
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   892
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   893
void CBulkOnlyTransport::GetReadDataBufPtr(TPtr8& aDes) // Set pointer to buffer into which data is to be read from drive (Read10)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   894
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   895
    aDes.Set(SetDataBufPtr());
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   896
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   897
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   898
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   899
void CBulkOnlyTransport::GetWriteDataBufPtr(TPtrC8& aDes) // Set pointer to buffer from which data is to be written to drive (Write10)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   900
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   901
    aDes.Set(iReadBufPtr);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   902
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   903
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   904
#ifdef MSDC_MULTITHREADED
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   905
void CBulkOnlyTransport::ProcessReadData(TAny* aAddress)
286
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   906
    {
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   907
    ExpireData(aAddress);
48e57fb1237e 201039_11
hgs
parents: 271
diff changeset
   908
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   909
#endif
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   910
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   911
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   912
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   913
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   914
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   915
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   916
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   917