userlibandfileserver/fileserver/smassstorage/cbulkonlytransportusbcscldd.cpp
author hgs
Mon, 11 Oct 2010 17:54:41 +0100
changeset 286 48e57fb1237e
parent 269 d57b86b1867a
permissions -rw-r--r--
201039_11
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     1
/*
269
d57b86b1867a 201035_03
hgs
parents: 39
diff changeset
     2
* 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
     3
* All rights reserved.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     4
* This component and the accompanying materials are made available
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     6
* which accompanies this distribution, and is available
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     8
*
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     9
* Initial Contributors:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    11
*
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    12
* Contributors:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    13
*
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    14
* Description:
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
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    18
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    19
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    20
 @file
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    21
 @internalTechnology
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    22
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    23
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    24
#include <e32std.h>
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    25
#include "mtransport.h"
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    26
#include "mprotocol.h"
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    27
#include "mldddevicestatenotification.h"
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    28
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    29
#include "drivemanager.h"
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    30
#include "cusbmassstoragecontroller.h"
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    31
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    32
#include "cbulkonlytransport.h"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    33
#include "cbulkonlytransportusbcscldd.h"
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    34
#include "smassstorage.h"
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    35
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    36
#include "OstTraceDefinitions.h"
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    37
#ifdef OST_TRACE_COMPILER_IN_USE
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    38
#include "cbulkonlytransportusbcsclddTraces.h"
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    39
#endif
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    40
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
//This value defined in USB Mass Storage Bulk Only Transrt spec and not supposed to be changed
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    44
static const TInt KRequiredNumberOfEndpoints = 2; // in addition to endpoint 0.
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    45
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    46
static const TInt KUsbNumInterfacesOffset = 4;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    47
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    48
#ifdef MSDC_MULTITHREADED
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    49
//Only used in DB. The first 2K of KMaxScBufferSize for sending CSW
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    50
static const TUint32 KCswBufferSize = 2 * 1024;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    51
#endif
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
////////////////////////////////////
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    54
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    55
Called by CBulkOnlyTransportUsbcScLdd to create an instance of CControlInterfaceUsbcScLdd
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    56
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    57
@param aParent reference to the CBulkOnlyTransportUsbcScLdd
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
CControlInterfaceUsbcScLdd* CControlInterfaceUsbcScLdd::NewL(CBulkOnlyTransportUsbcScLdd& aParent)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    62
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    63
    CControlInterfaceUsbcScLdd* self = new(ELeave) CControlInterfaceUsbcScLdd(aParent);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    64
    CleanupStack::PushL(self);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    65
    self->ConstructL();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    66
    CActiveScheduler::Add(self);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    67
    CleanupStack::Pop();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    68
    return self;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    69
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    70
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    71
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    72
void CControlInterfaceUsbcScLdd::ConstructL()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    73
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    74
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    75
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    76
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    77
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    78
c'tor
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    79
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    80
@param aParent reference to the CBulkOnlyTransportUsbcScLdd
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    81
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    82
CControlInterfaceUsbcScLdd::CControlInterfaceUsbcScLdd(CBulkOnlyTransportUsbcScLdd& aParent)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    83
    :CActive(EPriorityStandard),
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    84
     iParent(aParent),
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    85
     iCurrentState(ENone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    86
    {
48e57fb1237e 201039_11
hgs
parents: 269
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
d'tor
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    92
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    93
CControlInterfaceUsbcScLdd::~CControlInterfaceUsbcScLdd()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    94
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    95
    Cancel();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    96
    iEp0Buf.Close();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
    97
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    98
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    99
TInt CControlInterfaceUsbcScLdd::OpenEp0()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   100
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   101
    TInt res = iParent.Ldd().OpenEndpoint(iEp0Buf,0);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   102
    return res;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   103
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   104
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   105
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   106
Called by CBulkOnlyTransport HwStart to start control interface
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   107
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   108
TInt CControlInterfaceUsbcScLdd::Start()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   109
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   110
    TInt res = ReadEp0Data();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   111
    return (res);
48e57fb1237e 201039_11
hgs
parents: 269
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
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   115
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   116
Called by desctructor of CBulkOnlyTransportUsbcScLdd to stop control interface
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   117
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   118
void CControlInterfaceUsbcScLdd::Stop()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   119
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   120
    if (!IsActive())
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   121
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   122
        return;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   123
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   124
    iCurrentState = ENone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   125
    Cancel();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   126
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   127
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   128
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   129
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   130
Cancel outstanding request (if any)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   131
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   132
void CControlInterfaceUsbcScLdd::DoCancel()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   133
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   134
    switch(iCurrentState)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   135
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   136
        case EReadEp0Data:
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   137
            iParent.Ldd().ReadCancel(KUsbcScEndpointZero);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   138
            break;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   139
        case ESendMaxLun:
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   140
            iParent.Ldd().WriteCancel(KUsbcScEndpointZero);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   141
            break;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   142
        default:
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   143
            __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceBadState));
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   144
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   145
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   146
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   147
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   148
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   149
Implement CControlInterfaceUsbcScLdd state machine
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
void CControlInterfaceUsbcScLdd::RunL()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   152
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   153
    if (iStatus != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   154
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   155
        OstTrace1(TRACE_SMASSSTORAGE_BOT, CCONTROLINTERFACEUSBCSCLDD,
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   156
                  "ERROR %d in RunL", iStatus.Int());
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   157
        //read EP0  again
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   158
        ReadEp0Data();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   159
        return;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   160
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   161
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   162
    ReadEp0Data();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   163
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   164
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   165
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   166
Actual Read to RDevUsbcScClient BIL
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   167
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   168
TInt CControlInterfaceUsbcScLdd::ReadUsbEp0()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   169
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   170
    iCurrentState = EReadEp0Data;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   171
    iStatus = KRequestPending;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   172
    return iEp0Buf.GetBuffer (iEp0Packet,iEp0Size,iEp0Zlp,iStatus);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   173
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   174
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   175
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   176
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   177
Post a read request to EEndpoint0 to read request header
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   178
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   179
TInt CControlInterfaceUsbcScLdd::ReadEp0Data()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   180
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   181
    if (IsActive())
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   182
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   183
        OstTrace0(TRACE_SMASSSTORAGE_BOT, READEP0DATA_SC, "Still active");
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   184
        return KErrServerBusy;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   185
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   186
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   187
    TInt r = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   188
    do
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   189
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   190
        r = ReadUsbEp0();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   191
        if (r == KErrCompletion)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   192
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   193
            iStatus = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   194
            DecodeEp0Data();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   195
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   196
        else if (r == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   197
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   198
            SetActive();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   199
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   200
        } while (((r == KErrCompletion) || (r == TEndpointBuffer::KStateChange)) && (!IsActive()));
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   201
    return KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   202
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   203
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   204
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   205
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   206
Decode request header and do appropriate action - get max LUN info or post a reset request
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   207
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   208
void CControlInterfaceUsbcScLdd::DecodeEp0Data()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   209
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   210
    if (IsActive())
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   211
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   212
        __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsControlInterfaceStillActive));
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   213
        return;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   214
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   215
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   216
    TPtrC8 ep0ReadDataPtr((TUint8*)iEp0Packet, iEp0Size);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   217
    TInt err = iRequestHeader.Decode(ep0ReadDataPtr);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   218
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   219
    if(err != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   220
        return;
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
    switch(iRequestHeader.iRequest)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   223
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   224
        //
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   225
        // GET MAX LUN (0xFE)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   226
        //
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   227
        case TUsbRequestHdr::EReqGetMaxLun:
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   228
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   229
            OstTrace1(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA_SC, ">>> EP0 GetMaxLun = %d", iParent.MaxLun());
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   230
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   231
            if (   iRequestHeader.iRequestType != 0xA1 //value from USB MS BOT spec
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   232
                || iRequestHeader.iIndex > 15
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   233
                || iRequestHeader.iValue != 0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   234
                || iRequestHeader.iLength != 1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   235
                {
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   236
                OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA1_SC, "ERROR: GetMaxLun command packet check error");
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   237
                iParent.Ldd().EndpointZeroRequestError();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   238
                break;
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
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   241
            TPtr8* ep0WriteDataPtr = NULL;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   242
            TUint ep0Length;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   243
            iEp0Buf.GetInBufferRange(((TAny*&)ep0WriteDataPtr),ep0Length);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   244
            ep0WriteDataPtr->SetLength(1);  //Return only 1 byte to host
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   245
            ep0WriteDataPtr->Fill(0);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   246
            ep0WriteDataPtr->Fill(iParent.MaxLun());    // Supported Units
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   247
            TInt length = ep0WriteDataPtr->Length();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   248
            err = iEp0Buf.WriteBuffer((TPtr8*)(ep0WriteDataPtr->Ptr()),length,ETrue,iStatus);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   249
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   250
            iCurrentState = ESendMaxLun;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   251
            SetActive();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   252
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   253
            return;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   254
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   255
        //
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   256
        // RESET (0xFF)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   257
        //
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   258
        case TUsbRequestHdr::EReqReset:
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   259
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   260
            OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA2_SC, ">>> EP0 BulkOnlyMassStorageReset");
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   261
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   262
            if (   iRequestHeader.iRequestType != 0x21 //value from USB MS BOT spec
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   263
                || iRequestHeader.iIndex > 15
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   264
                || iRequestHeader.iValue != 0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   265
                || iRequestHeader.iLength != 0)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   266
                {
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   267
                OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA3_SC, "BulkOnlyMassStorageReset command packet check error");
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   268
                iParent.Ldd().EndpointZeroRequestError();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   269
                break;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   270
                }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   271
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   272
            iParent.HwStop();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   273
            iParent.Controller().Reset();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   274
            iParent.HwStart(ETrue);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   275
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   276
            err = iParent.Ldd().SendEp0StatusPacket();
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   277
            return;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   278
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   279
        //
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   280
        // Unknown?
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   281
        //
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   282
        default:
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   283
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   284
            OstTrace0(TRACE_SMASSSTORAGE_BOT, DECODEEP0DATA4_SC, ">>> EP0 DecodeEp0Data : Unknown Request");
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   285
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   286
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   287
        ReadEp0Data();  //try to get another request
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   288
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   289
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   290
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   291
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   292
// --- class CBulkOnlyTransportUsbcScLdd ---------------------------------------------------------
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   293
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   294
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   295
CBulkOnlyTransportUsbcScLdd::CBulkOnlyTransportUsbcScLdd(TInt aNumDrives,CUsbMassStorageController& aController)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   296
    :CBulkOnlyTransport(aNumDrives, aController)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   297
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   298
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   299
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   300
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   301
Constructs the CBulkOnlyTransportUsbcScLdd object
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   302
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   303
void CBulkOnlyTransportUsbcScLdd::ConstructL()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   304
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   305
    iControlInterface = CControlInterfaceUsbcScLdd::NewL(*this);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   306
    iDeviceStateNotifier = CActiveDeviceStateNotifierBase::NewL(*this, *this);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   307
    iChunk = new RChunk();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   308
    CActiveScheduler::Add(this);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   309
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   310
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   311
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   312
CBulkOnlyTransportUsbcScLdd::~CBulkOnlyTransportUsbcScLdd()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   313
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   314
    if (iInterfaceConfigured)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   315
        {
269
d57b86b1867a 201035_03
hgs
parents: 39
diff changeset
   316
        Stop();
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   317
        TInt err = iSCReadEndpointBuf.Close();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   318
        err = iSCWriteEndpointBuf.Close();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   319
        delete iControlInterface ;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   320
        delete iDeviceStateNotifier;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   321
        delete iChunk;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   322
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   323
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   324
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   325
RDevUsbcScClient& CBulkOnlyTransportUsbcScLdd::Ldd()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   326
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   327
    return iLdd;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   328
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   329
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   330
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   331
Set or unset configuration descriptor for USB MassStorage Bulk Only transport
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   332
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   333
@param aUnset indicate whether set or unset descriptor
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   334
@return KErrNone if operation was completed successfully, errorcode otherwise
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   335
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   336
TInt CBulkOnlyTransportUsbcScLdd::SetupConfigurationDescriptor(TBool aUnset)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   337
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   338
    TInt ret(KErrNone);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   339
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   340
    if ((ret = iLdd.Open(0)) != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   341
        return ret;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   342
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   343
    TInt configDescriptorSize(0);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   344
    iLdd.GetConfigurationDescriptorSize(configDescriptorSize);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   345
    if (static_cast<TUint>(configDescriptorSize) != KUsbDescSize_Config)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   346
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   347
        return KErrCorrupt;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   348
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   349
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   350
    TBuf8<KUsbDescSize_Config> configDescriptor;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   351
    ret = iLdd.GetConfigurationDescriptor(configDescriptor);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   352
    if (ret != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   353
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   354
        return ret;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   355
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   356
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   357
    // I beleive that other fields setted up during LDD initialisation
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   358
    if (aUnset)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   359
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   360
        --configDescriptor[KUsbNumInterfacesOffset];
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   361
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   362
    else
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   363
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   364
        ++configDescriptor[KUsbNumInterfacesOffset];
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   365
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   366
    ret = iLdd.SetConfigurationDescriptor(configDescriptor);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   367
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   368
    if (aUnset)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   369
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   370
        iLdd.Close();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   371
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   372
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   373
    return ret;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   374
    }
0
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
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   377
Set up interface descriptor
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   378
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   379
@return KErrNone if operation was completed successfully, errorcode otherwise
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   380
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   381
TInt CBulkOnlyTransportUsbcScLdd::SetupInterfaceDescriptors()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   382
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   383
    // Device caps
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   384
    TUsbDeviceCaps d_caps;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   385
    TInt ret = iLdd.DeviceCaps(d_caps);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   386
    if (ret != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   387
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   388
        return ret;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   389
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   390
    TInt totalEndpoints = d_caps().iTotalEndpoints;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   391
    if (totalEndpoints  < KRequiredNumberOfEndpoints)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   392
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   393
        return KErrHardwareNotAvailable;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   394
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   395
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   396
    // Endpoint caps
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   397
    TUsbcEndpointData data[KUsbcMaxEndpoints];
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   398
    TPtr8 dataptr(reinterpret_cast<TUint8*>(data), sizeof(data), sizeof(data));
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   399
    ret = iLdd.EndpointCaps(dataptr);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   400
    if (ret != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   401
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   402
        return ret;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   403
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   404
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   405
    // Set the active interface
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   406
    TUsbcScInterfaceInfoBuf ifc;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   407
    TInt ep_found = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   408
    TBool foundBulkIN = EFalse;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   409
    TBool foundBulkOUT = EFalse;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   410
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   411
    for (TInt i = 0; i < totalEndpoints ; i++)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   412
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   413
        const TUsbcEndpointCaps* caps = &data[i].iCaps;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   414
        const TInt maxPacketSize = caps->MaxPacketSize();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   415
        if (!foundBulkIN &&
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   416
            (caps->iTypesAndDir & (KUsbEpTypeBulk | KUsbEpDirIn)) == (KUsbEpTypeBulk | KUsbEpDirIn))
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   417
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   418
            // InEndpoint is going to be our TX (IN, write) endpoint
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   419
            ifc().iEndpointData[0].iType = KUsbEpTypeBulk;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   420
            if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   421
                ifc().iEndpointData[0].iFeatureWord1  = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   422
            ifc().iEndpointData[0].iDir  = KUsbEpDirIn;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   423
            ifc().iEndpointData[0].iSize = maxPacketSize;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   424
            ifc().iEndpointData[0].iInterval_Hs = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   425
            ifc().iEndpointData[0].iBufferSize = KMaxScBufferSize;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   426
            foundBulkIN = ETrue;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   427
            if (++ep_found == KRequiredNumberOfEndpoints)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   428
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   429
                break;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   430
                }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   431
            continue;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   432
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   433
        if (!foundBulkOUT &&
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   434
            (caps->iTypesAndDir & (KUsbEpTypeBulk | KUsbEpDirOut)) == (KUsbEpTypeBulk | KUsbEpDirOut))
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   435
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   436
            // OutEndpoint is going to be our RX (OUT, read) endpoint
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   437
            ifc().iEndpointData[1].iType = KUsbEpTypeBulk;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   438
            if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) == KUsbDevCapsFeatureWord1_EndpointResourceAllocV2)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   439
                ifc().iEndpointData[1].iFeatureWord1  = KUsbcEndpointInfoFeatureWord1_DMA|KUsbcEndpointInfoFeatureWord1_DoubleBuffering;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   440
            ifc().iEndpointData[1].iDir  = KUsbEpDirOut;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   441
            ifc().iEndpointData[1].iSize = maxPacketSize;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   442
            ifc().iEndpointData[1].iInterval_Hs = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   443
            ifc().iEndpointData[1].iBufferSize = KMaxScBufferSize;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   444
            ifc().iEndpointData[1].iReadSize = KMaxScReadSize;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   445
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   446
            foundBulkOUT = ETrue;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   447
            if (++ep_found == KRequiredNumberOfEndpoints)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   448
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   449
                break;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   450
                }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   451
            continue;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   452
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   453
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   454
    if (ep_found != KRequiredNumberOfEndpoints)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   455
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   456
        return KErrHardwareNotAvailable;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   457
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   458
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   459
    _LIT16(string, "USB Mass Storage Interface");
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   460
    ifc().iString = const_cast<TDesC16*>(&string);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   461
    ifc().iTotalEndpointsUsed = KRequiredNumberOfEndpoints;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   462
    ifc().iClass.iClassNum    = 0x08;   // Mass Storage
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   463
    ifc().iClass.iSubClassNum = 0x06;   // SCSI Transparent Command Set
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   464
    ifc().iClass.iProtocolNum = 0x50;   // Bulk Only Transport
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   465
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   466
    if (d_caps().iHighSpeed)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   467
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   468
        // Tell the Protocol about it, because it might want to do some
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   469
        // optimizing too.
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   470
        iProtocol->ReportHighSpeedDevice();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   471
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   472
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   473
    if ((ret = iLdd.SetInterface(0, ifc)) == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   474
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   475
        return (iLdd.FinalizeInterface(iChunk));
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   476
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   477
    return ret;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   478
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   479
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   480
void CBulkOnlyTransportUsbcScLdd::ReleaseInterface()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   481
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   482
    iLdd.ReleaseInterface(0);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   483
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   484
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   485
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   486
TInt CBulkOnlyTransportUsbcScLdd::StartControlInterface()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   487
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   488
    return iControlInterface->Start();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   489
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   490
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   491
void CBulkOnlyTransportUsbcScLdd::CancelControlInterface()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   492
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   493
    iControlInterface->Cancel();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   494
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   495
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   496
void CBulkOnlyTransportUsbcScLdd::ActivateDeviceStateNotifier()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   497
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   498
    iDeviceStateNotifier->Activate();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   499
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   500
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   501
void CBulkOnlyTransportUsbcScLdd::CancelDeviceStateNotifier()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   502
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   503
    iDeviceStateNotifier->Cancel();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   504
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   505
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   506
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   507
void CBulkOnlyTransportUsbcScLdd::CancelReadWriteRequests()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   508
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   509
    TUsbcScChunkHeader chunkHeader(*iChunk);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   510
    for (TInt i = 0; i < chunkHeader.iAltSettings->iNumOfAltSettings; i++)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   511
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   512
        TInt8* endpoint = (TInt8*) (chunkHeader.iAltSettings->iAltTableOffset[i] + (TInt) iChunk->Base());
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   513
        TInt numOfEps = chunkHeader.GetNumberOfEndpoints(i);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   514
        __ASSERT_DEBUG(numOfEps >= 0, User::Invariant());
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   515
        for (TInt j = 1; j <= numOfEps; j++)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   516
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   517
            TUsbcScHdrEndpointRecord* endpointInf = (TUsbcScHdrEndpointRecord*) &(endpoint[j * chunkHeader.iAltSettings->iEpRecordSize]);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   518
            if (endpointInf->Direction() == KUsbScHdrEpDirectionOut)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   519
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   520
                iLdd.ReadCancel(endpointInf->iBufferNo);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   521
                }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   522
            if (endpointInf->Direction() == KUsbScHdrEpDirectionIn)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   523
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   524
                iLdd.WriteCancel(endpointInf->iBufferNo);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   525
                }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   526
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   527
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   528
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   529
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   530
void CBulkOnlyTransportUsbcScLdd::AllocateEndpointResources()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   531
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   532
    TUsbcScChunkHeader chunkHeader(*iChunk);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   533
    for (TInt i = 0; i < chunkHeader.iAltSettings->iNumOfAltSettings; i++)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   534
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   535
        TInt8* endpoint = (TInt8*) (chunkHeader.iAltSettings->iAltTableOffset[i] + (TInt) iChunk->Base());
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   536
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   537
        for (TInt j = 1; j <= chunkHeader.GetNumberOfEndpoints(i); j++)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   538
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   539
            TUsbcScHdrEndpointRecord* endpointInf = (TUsbcScHdrEndpointRecord*) &(endpoint[j * chunkHeader.iAltSettings->iEpRecordSize]);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   540
            if (endpointInf->Direction() == KUsbScHdrEpDirectionOut)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   541
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   542
                iOutEndpoint = j;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   543
                }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   544
            if (endpointInf->Direction() == KUsbScHdrEpDirectionIn)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   545
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   546
                iInEndpoint = j;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   547
                }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   548
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   549
        }
39
5d2844f35677 Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   550
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   551
    TUsbDeviceCaps d_caps;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   552
    TInt err;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   553
    TInt ret = iLdd.DeviceCaps(d_caps);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   554
    if (ret == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   555
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   556
        if((d_caps().iFeatureWord1 & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) != KUsbDevCapsFeatureWord1_EndpointResourceAllocV2)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   557
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   558
            // Set up DMA if possible (errors are non-critical)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   559
            err = iLdd.AllocateEndpointResource(iOutEndpoint, EUsbcEndpointResourceDMA);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   560
            if (err != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   561
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   562
                OstTrace1(TRACE_SMASSSTORAGE_BOT, A1_SC, "Set DMA on OUT endpoint failed with error code: %d", err);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   563
                }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   564
            err = iLdd.AllocateEndpointResource(iInEndpoint, EUsbcEndpointResourceDMA);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   565
            if (err != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   566
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   567
                OstTrace1(TRACE_SMASSSTORAGE_BOT, A2_SC, "Set DMA on IN endpoint failed with error code: %d", err);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   568
                }
39
5d2844f35677 Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   569
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   570
                // Set up Double Buffering if possible (errors are non-critical)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   571
            err = iLdd.AllocateEndpointResource(iOutEndpoint, EUsbcEndpointResourceDoubleBuffering);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   572
            if (err != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   573
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   574
                OstTrace1(TRACE_SMASSSTORAGE_BOT, A3_SC, "Set Double Buffering on OUT endpoint failed with error code: %d", err);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   575
                }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   576
            err = iLdd.AllocateEndpointResource(iInEndpoint, EUsbcEndpointResourceDoubleBuffering);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   577
                if (err != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   578
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   579
                OstTrace1(TRACE_SMASSSTORAGE_BOT, A4_SC, "Set Double Buffering on IN endpoint failed with error code: %d", err);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   580
                }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   581
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   582
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   583
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   584
    err = OpenEndpoints();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   585
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   586
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   587
TInt CBulkOnlyTransportUsbcScLdd::OpenEndpoints()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   588
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   589
    TInt res = iLdd.OpenEndpoint(iSCReadEndpointBuf, iOutEndpoint);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   590
    if (res == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   591
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   592
        res = iLdd.OpenEndpoint(iSCWriteEndpointBuf, iInEndpoint);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   593
        if (res == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   594
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   595
            iSCWriteEndpointBuf.GetInBufferRange((TAny*&)iDataPtr, iInBufferLength);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   596
            res = iControlInterface->OpenEp0();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   597
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   598
        return res;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   599
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   600
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   601
    return res;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   602
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   603
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   604
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   605
TInt CBulkOnlyTransportUsbcScLdd::GetDeviceStatus(TUsbcDeviceState& deviceStatus)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   606
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   607
    return iLdd.DeviceStatus(deviceStatus);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   608
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   609
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   610
void CBulkOnlyTransportUsbcScLdd::FlushData()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   611
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   612
    // Intentionally Left Blank Do Nothing
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   613
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   614
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
 * Read out rest data from OutEndpoint and discard them
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   617
 */
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   618
void CBulkOnlyTransportUsbcScLdd::ReadAndDiscardData(TInt /*aBytes*/)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   619
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   620
    TRequestStatus status;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   621
    TInt r = KErrNone; // Lets assume there is no data
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   622
    do
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   623
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   624
        iSCReadSize = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   625
        status = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   626
        r = iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,status);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   627
        iSCReadEndpointBuf.Expire();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   628
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   629
    while (r == KErrCompletion);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   630
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   631
    if (r == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   632
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   633
        TRequestStatus* stat = &status;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   634
        User::RequestComplete(stat, KErrNone);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   635
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   636
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   637
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   638
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   639
Called by the protocol to determine how many bytes of data are available in the read buffer.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   640
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   641
@return The number of bytes available in the read buffer
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   642
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   643
TInt CBulkOnlyTransportUsbcScLdd::BytesAvailable()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   644
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   645
    // Intentionally Left Blank Do Nothing
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   646
    return 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   647
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   648
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   649
void CBulkOnlyTransportUsbcScLdd::StallEndpointAndWaitForClear()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   650
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   651
    // Now stall this endpoint
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   652
    OstTrace1(TRACE_SMASSSTORAGE_BOT, D1_SC, "Stalling endpoint %d", iInEndpoint);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   653
    TInt r = iLdd.HaltEndpoint(iInEndpoint);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   654
    if (r != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   655
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   656
        OstTraceExt2(TRACE_SMASSSTORAGE_BOT, D2_SC, "Error: stalling ep %d failed: %d", iInEndpoint, r);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   657
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   658
    TEndpointState ep_state;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   659
    TInt i = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   660
    do
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   661
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   662
        // Wait for 10ms before checking the ep status
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   663
        User::After(10000);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   664
        iLdd.EndpointStatus(iInEndpoint, ep_state);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   665
        if (++i >= 550)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   666
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   667
            // 5.5 secs should be enough (see 9.2.6.1 Request Processing Timing)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   668
            OstTrace1(TRACE_SMASSSTORAGE_BOT, D3_SC, "Error: Checked for ep %d de-stall for 5.5s - giving up now", iInEndpoint);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   669
            // We can now only hope for a Reset Recovery
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   670
            return;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   671
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   672
        } while ((ep_state == EEndpointStateStalled) && iStarted);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   673
    OstTraceExt2(TRACE_SMASSSTORAGE_BOT, D4_SC, "Checked for ep %d de-stall: %d time(s)", iInEndpoint, i);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   674
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   675
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   676
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   677
Read CBW data from the host and decode it.
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
void CBulkOnlyTransportUsbcScLdd::ReadCBW()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   680
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   681
    if (IsActive())
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   682
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   683
        __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive));
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   684
        return;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   685
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   686
    TInt r = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   687
    do
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   688
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   689
        r = ReadUsb();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   690
        if ((r == KErrCompletion) && (iSCReadSize == KCbwLength))
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   691
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   692
            iCurrentState = EWaitForCBW;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   693
            iStatus = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   694
            DecodeCBW();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   695
            iSCReadSize = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   696
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   697
        else if (r == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   698
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   699
            iCurrentState = EWaitForCBW;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   700
            SetActive();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   701
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   702
        else if ((r == KErrCompletion) && (iSCReadSize != KCbwLength))
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   703
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   704
            ExpireData(iSCReadData);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   705
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   706
        }while ((r == KErrCompletion) && (!IsActive()));
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   707
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   708
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   709
void CBulkOnlyTransportUsbcScLdd::ExpireData(TAny* aAddress)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   710
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   711
    if (aAddress)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   712
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   713
        iSCReadEndpointBuf.Expire(aAddress);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   714
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   715
    else
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   716
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   717
        iSCReadEndpointBuf.Expire();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   718
        }
48e57fb1237e 201039_11
hgs
parents: 269
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
void CBulkOnlyTransportUsbcScLdd::ProcessCbwEvent()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   722
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   723
    ReadCBW();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   724
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   725
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   726
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   727
Request data form the host for the protocol
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   728
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   729
@param aLength amount of data (in bytes) to be received from the host
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
void CBulkOnlyTransportUsbcScLdd::ReadData(TUint /*aLength*/)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   732
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   733
    if (IsActive())
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   734
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   735
        __ASSERT_DEBUG(EFalse, User::Panic(KUsbMsSvrPncCat, EMsBulkOnlyStillActive));
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   736
        return;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   737
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   738
    TInt r = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   739
    do
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   740
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   741
        r = ReadUsb();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   742
        iCurrentState = EReadingData;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   743
        if (r == KErrCompletion)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   744
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   745
            iReadBufPtr.Set((TUint8*) iSCReadData, iSCReadSize, iSCReadSize);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   746
            iStatus = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   747
            ProcessDataFromHost();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   748
            iSCReadSize = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   749
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   750
        else if (r == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   751
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   752
            iSCReadSize = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   753
            SetActive();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   754
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   755
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   756
        }while ((r == KErrCompletion) && (!IsActive()));
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   757
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   758
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   759
void CBulkOnlyTransportUsbcScLdd::ProcessDataFromHost()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   760
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   761
    TInt ret = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   762
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   763
        if (iReadSetUp)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   764
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   765
            ret = iProtocol->ReadComplete(KErrNone);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   766
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   767
#ifndef MSDC_MULTITHREADED
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   768
        ExpireData(iSCReadData);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   769
#endif
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   770
        TUint deviceDataLength = iSCReadSize; // What was written to the disk // static_cast<TUint>(iReadBuf.Length());
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   771
        if(ret == KErrCompletion)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   772
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   773
            // The protocol has indicated with KErrCompletion that sufficient
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   774
            // data is available in the buffer to process the transfer immediately.
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   775
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   776
            //iDataResidue is initially set to host data length as we do not know how much data is there in the 'LDD transfer'.
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   777
            //After a TakeBuffer call, iSCReadSize in updated and set to deviceDataLength
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   778
            iDataResidue -= deviceDataLength;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   779
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   780
        else
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   781
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   782
            iDataResidue -= deviceDataLength;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   783
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   784
            // The protocol has indicated that transfer is
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   785
            // complete, so send the CSW response to the host.
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   786
            iReadSetUp = EFalse;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   787
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   788
            if (ret != KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   789
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   790
                iCmdStatus = ECommandFailed;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   791
                }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   792
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   793
            if (iDataResidue)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   794
                {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   795
                OstTrace0(TRACE_SMASSSTORAGE_BOT, E2_SC, "Discarding residue");
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   796
                // we have to read as much data as available that host PC sends;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   797
                // otherwise, bulk-out endpoint will need to keep sending NAK back.
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   798
                ReadAndDiscardData(iDataResidue);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   799
                }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   800
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   801
            SendCSW(iCbwTag, iDataResidue, iCmdStatus);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   802
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   803
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   804
    }
0
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
void CBulkOnlyTransportUsbcScLdd::WriteUsb(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   807
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   808
    TUint aOffset = (TUint) aDes.Ptr() - (TUint) iChunk->Base();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   809
    iSCWriteEndpointBuf.WriteBuffer(aOffset, aLength, aZlpRequired, aStatus);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   810
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   811
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   812
void CBulkOnlyTransportUsbcScLdd::SetCbwPtr()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   813
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   814
    iCbwBufPtr.Set((TUint8*)iSCReadData, iSCReadSize);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   815
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   816
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   817
TPtr8& CBulkOnlyTransportUsbcScLdd::SetCommandBufPtr(TUint aLength)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   818
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   819
    TPtr8 writeBuf((TUint8*) iDataPtr, aLength);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   820
    iCommandBufPtr.Set(writeBuf);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   821
    return iCommandBufPtr;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   822
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   823
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   824
void CBulkOnlyTransportUsbcScLdd::SetReadDataBufPtr(TUint /*aLength*/)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   825
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   826
    // Do nothing for now
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   827
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   828
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   829
TPtr8& CBulkOnlyTransportUsbcScLdd::SetDataBufPtr()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   830
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   831
    TPtr8 writeBuf((TUint8*) iDataPtr, iInBufferLength);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   832
    iDataBufPtr.Set(writeBuf);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   833
    return iDataBufPtr;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   834
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   835
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   836
void CBulkOnlyTransportUsbcScLdd::SetPaddingBufPtr(TUint aLength)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   837
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   838
    TPtr8 writeBuf((TUint8*) iDataPtr, aLength, aLength);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   839
    iPaddingBufPtr.Set(writeBuf);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   840
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   841
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   842
void CBulkOnlyTransportUsbcScLdd::SetCswBufPtr(TUint aLength)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   843
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   844
    TPtr8 writeBuf((TUint8*) iDataPtr, aLength, aLength);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   845
    iCswBufPtr.Set(writeBuf);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   846
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   847
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   848
void CBulkOnlyTransportUsbcScLdd::ProcessReadingDataEvent()
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   849
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   850
    ReadData();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   851
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   852
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   853
TInt CBulkOnlyTransportUsbcScLdd::ReadUsb(TUint /*aLength*/)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   854
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   855
    return iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,iStatus);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   856
    }
0
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
void CBulkOnlyTransportUsbcScLdd::DiscardData(TUint aLength)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   859
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   860
    TUint c = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   861
    TRequestStatus status;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   862
    TInt r = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   863
    while (c < aLength)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   864
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   865
        iSCReadSize = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   866
        status = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   867
        r = iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,status);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   868
        c += iSCReadSize;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   869
        if (r == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   870
            User::WaitForRequest(status);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   871
        if (r == KErrCompletion)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   872
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   873
            iSCReadEndpointBuf.Expire();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   874
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   875
        iSCReadSize = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   876
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   877
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   878
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   879
void CBulkOnlyTransportUsbcScLdd::WriteToClient(TUint aLength)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   880
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   881
    TUint c = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   882
    TRequestStatus status;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   883
    TInt r = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   884
    while (c < aLength)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   885
        {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   886
        iSCReadSize = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   887
        status = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   888
        r = iSCReadEndpointBuf.TakeBuffer(iSCReadData,iSCReadSize,iReadZlp,status);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   889
        c += iSCReadSize;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   890
        iProtocol->ReadComplete(KErrGeneral);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   891
        if (r == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   892
            User::WaitForRequest(status);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   893
        if (r == KErrCompletion)
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   894
            {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   895
            iSCReadEndpointBuf.Expire();
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   896
            }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   897
        iSCReadSize = 0;
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   898
        }
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   899
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   900
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   901
#ifdef MSDC_MULTITHREADED
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   902
void CBulkOnlyTransportUsbcScLdd::GetBufferPointers(TPtr8& aDes1, TPtr8& aDes2)
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   903
    {
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   904
    //for DB
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   905
    TUint length = (TUint) (iInBufferLength - KCswBufferSize) / 2;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   906
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   907
    TUint8* start = (TUint8*) (iDataPtr) + KCswBufferSize ; // 'first' buffer
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   908
    aDes1.Set(start, length, length);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   909
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   910
    start = (TUint8*) (iDataPtr) + KCswBufferSize + length; // 'second' buffer
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   911
    aDes2.Set(start, length, length);
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   912
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   913
#endif
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
void CBulkOnlyTransportUsbcScLdd::Activate(TRequestStatus& aStatus, TUint& aDeviceState)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   916
    {
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   917
    iLdd.AlternateDeviceStatusNotify(aStatus, aDeviceState);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   918
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   919
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   920
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   921
void CBulkOnlyTransportUsbcScLdd::Cancel()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   922
    {
286
48e57fb1237e 201039_11
hgs
parents: 269
diff changeset
   923
    iLdd.AlternateDeviceStatusNotifyCancel();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   924
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   925
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   926
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   927
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   928