usbdrv/peripheral/pdd/pil/src/controltransfersm.cpp
author hgs
Wed, 20 Oct 2010 12:04:53 +0800
changeset 59 bbdce6bffaad
parent 33 089413cdde3c
permissions -rw-r--r--
201041_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33
089413cdde3c 201028_02
hgs
parents:
diff changeset
     1
/*
59
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
     3
* All rights reserved.
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
     4
* This component and the accompanying materials are made available
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
     6
* which accompanies this distribution, and is available
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
     8
*
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
     9
* Initial Contributors:
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
    10
* Nokia Corporation - initial contribution.
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
    11
*
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
    12
* Contributors:
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
    13
*
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
    14
* Description:
bbdce6bffaad 201041_02
hgs
parents: 33
diff changeset
    15
*
33
089413cdde3c 201028_02
hgs
parents:
diff changeset
    16
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    17
089413cdde3c 201028_02
hgs
parents:
diff changeset
    18
#include "controltransfersm.h"
089413cdde3c 201028_02
hgs
parents:
diff changeset
    19
089413cdde3c 201028_02
hgs
parents:
diff changeset
    20
// Bitmap of setup packet
089413cdde3c 201028_02
hgs
parents:
diff changeset
    21
/*
089413cdde3c 201028_02
hgs
parents:
diff changeset
    22
Offset 0, bmRequestType, 1 bytes
089413cdde3c 201028_02
hgs
parents:
diff changeset
    23
    1 Bit-Map
089413cdde3c 201028_02
hgs
parents:
diff changeset
    24
        D7 Data Phase Transfer Direction
089413cdde3c 201028_02
hgs
parents:
diff changeset
    25
        0 = Host to Device
089413cdde3c 201028_02
hgs
parents:
diff changeset
    26
        1 = Device to Host
089413cdde3c 201028_02
hgs
parents:
diff changeset
    27
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
    28
        D6..5 Type
089413cdde3c 201028_02
hgs
parents:
diff changeset
    29
        0 = Standard
089413cdde3c 201028_02
hgs
parents:
diff changeset
    30
        1 = Class
089413cdde3c 201028_02
hgs
parents:
diff changeset
    31
        2 = Vendor
089413cdde3c 201028_02
hgs
parents:
diff changeset
    32
        3 = Reserved
089413cdde3c 201028_02
hgs
parents:
diff changeset
    33
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
    34
        D4..0 Recipient
089413cdde3c 201028_02
hgs
parents:
diff changeset
    35
        0 = Device
089413cdde3c 201028_02
hgs
parents:
diff changeset
    36
        1 = Interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
    37
        2 = Endpoint
089413cdde3c 201028_02
hgs
parents:
diff changeset
    38
        3 = Other
089413cdde3c 201028_02
hgs
parents:
diff changeset
    39
        4..31 = Reserved
089413cdde3c 201028_02
hgs
parents:
diff changeset
    40
089413cdde3c 201028_02
hgs
parents:
diff changeset
    41
Offset 1, bRequest
089413cdde3c 201028_02
hgs
parents:
diff changeset
    42
089413cdde3c 201028_02
hgs
parents:
diff changeset
    43
Offset 6, Count, 2 bytes
089413cdde3c 201028_02
hgs
parents:
diff changeset
    44
        Number of bytes to transfer if there is a data phase
089413cdde3c 201028_02
hgs
parents:
diff changeset
    45
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    46
089413cdde3c 201028_02
hgs
parents:
diff changeset
    47
#if defined(_DEBUG)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    48
089413cdde3c 201028_02
hgs
parents:
diff changeset
    49
#define CTSM_ID "ControlTransferSM "
089413cdde3c 201028_02
hgs
parents:
diff changeset
    50
089413cdde3c 201028_02
hgs
parents:
diff changeset
    51
char* DebugName[] = 
089413cdde3c 201028_02
hgs
parents:
diff changeset
    52
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    53
    "Setup",
089413cdde3c 201028_02
hgs
parents:
diff changeset
    54
    "Data Out",
089413cdde3c 201028_02
hgs
parents:
diff changeset
    55
    "Status In",
089413cdde3c 201028_02
hgs
parents:
diff changeset
    56
    "Data In",
089413cdde3c 201028_02
hgs
parents:
diff changeset
    57
    "Status Out"
089413cdde3c 201028_02
hgs
parents:
diff changeset
    58
    };
089413cdde3c 201028_02
hgs
parents:
diff changeset
    59
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
    60
#endif
089413cdde3c 201028_02
hgs
parents:
diff changeset
    61
089413cdde3c 201028_02
hgs
parents:
diff changeset
    62
// Static data instance
089413cdde3c 201028_02
hgs
parents:
diff changeset
    63
TUsbcSetup TSetupPkgParser::iSetupPkt;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    64
089413cdde3c 201028_02
hgs
parents:
diff changeset
    65
TSetupPkgParser::TSetupPkgParser()
089413cdde3c 201028_02
hgs
parents:
diff changeset
    66
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    67
    iSetupPkt.iRequestType = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    68
    iSetupPkt.iRequest = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    69
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
    70
    iSetupPkt.iValue  = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    71
    iSetupPkt.iIndex  = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    72
    iSetupPkt.iLength = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    73
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    74
089413cdde3c 201028_02
hgs
parents:
diff changeset
    75
// Code for TSetupPkgParser
089413cdde3c 201028_02
hgs
parents:
diff changeset
    76
// we do a bitwise copy here.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    77
void TSetupPkgParser::Set(const TUint8* aSetupBuf)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    78
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    79
    // TUint8 index
089413cdde3c 201028_02
hgs
parents:
diff changeset
    80
    iSetupPkt.iRequestType = static_cast<const TUint8*>(aSetupBuf)[0];
089413cdde3c 201028_02
hgs
parents:
diff changeset
    81
    iSetupPkt.iRequest = static_cast<const TUint8*>(aSetupBuf)[1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
    82
    // TUint16 index from here!
089413cdde3c 201028_02
hgs
parents:
diff changeset
    83
    iSetupPkt.iValue = SWAP_BYTES_16((reinterpret_cast<const TUint16*>(aSetupBuf))[1]);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    84
    iSetupPkt.iIndex = SWAP_BYTES_16((reinterpret_cast<const TUint16*>(aSetupBuf))[2]);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    85
    iSetupPkt.iLength = SWAP_BYTES_16((reinterpret_cast<const TUint16*>(aSetupBuf))[3]);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    86
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
    87
    __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "TSetupPkgParser::Set"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
    88
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    89
089413cdde3c 201028_02
hgs
parents:
diff changeset
    90
// return the next stage by decoding the setup packet 
089413cdde3c 201028_02
hgs
parents:
diff changeset
    91
// the possible stage followed by a setup packet are:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    92
//      StatusIn (no data stage)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    93
//      DataOut  (host sent to peripheral)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    94
//      DataIn   (peripheral to host)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    95
UsbShai::TControlStage TSetupPkgParser::NextStage()
089413cdde3c 201028_02
hgs
parents:
diff changeset
    96
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    97
    UsbShai::TControlStage ret = UsbShai::EControlTransferStageMax;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    98
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
    99
    // Take the data length out, 0 length means no data stage
089413cdde3c 201028_02
hgs
parents:
diff changeset
   100
    if (iSetupPkt.iLength == 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   101
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   102
        ret = UsbShai::EControlTransferStageStatusIn;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   103
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   104
    else if ((iSetupPkt.iRequestType & KUsbRequestType_DirMask) == KUsbRequestType_DirToDev)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   105
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   106
        // Dir to device means host will send data out
089413cdde3c 201028_02
hgs
parents:
diff changeset
   107
        ret = UsbShai::EControlTransferStageDataOut;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   108
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   109
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   110
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   111
        // Otherwise, there must be a datain stage follows
089413cdde3c 201028_02
hgs
parents:
diff changeset
   112
        ret = UsbShai::EControlTransferStageDataIn;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   113
        } 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   114
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   115
    __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "TSetupPkgParser::NextStage %d", ret));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   116
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   117
    return ret;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   118
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   119
089413cdde3c 201028_02
hgs
parents:
diff changeset
   120
// Base class of stage sm
089413cdde3c 201028_02
hgs
parents:
diff changeset
   121
TControlStageSm::TControlStageSm(DControlTransferManager& aTransferMgr):
089413cdde3c 201028_02
hgs
parents:
diff changeset
   122
    iTransferMgr(aTransferMgr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   123
    {    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   124
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   125
089413cdde3c 201028_02
hgs
parents:
diff changeset
   126
void TControlStageSm::ChangeToStage(UsbShai::TControlStage aToStage)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   127
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   128
    __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "<> TControlStageSm::ChangeToStage: %s",DebugName[aToStage]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   129
    iTransferMgr.iCurrentStage = aToStage;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   130
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   131
089413cdde3c 201028_02
hgs
parents:
diff changeset
   132
void TControlStageSm::ClearPendingRead()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   133
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   134
    iTransferMgr.iReadPending = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   135
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   136
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   137
// Code for DControlTransferManager
089413cdde3c 201028_02
hgs
parents:
diff changeset
   138
// 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   139
089413cdde3c 201028_02
hgs
parents:
diff changeset
   140
DControlTransferManager::DControlTransferManager(MControlTransferIf& aCtrTransIf):
089413cdde3c 201028_02
hgs
parents:
diff changeset
   141
    iCtrTransferIf(aCtrTransIf)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   142
    {    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   143
    for(int i=0; i<UsbShai::EControlTransferStageMax; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   144
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   145
        iState[i] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   146
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   147
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   148
    Reset();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   149
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   150
089413cdde3c 201028_02
hgs
parents:
diff changeset
   151
TInt DControlTransferManager::SetupEndpointZeroRead()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   152
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   153
    if(iState[iCurrentStage]->IsRequstAllowed(TControlTransferRequestRead))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   154
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   155
        if(!iReadPending)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   156
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   157
            iReadPending = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   158
            return CtrTransferIf().ProcessSetupEndpointZeroRead();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   159
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   160
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   161
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   162
            // A read operation already on going, ignore this request
089413cdde3c 201028_02
hgs
parents:
diff changeset
   163
            return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   164
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   165
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   166
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   167
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   168
        __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID " !! SetupEndpointZeroRead discard"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   169
        return KErrNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   170
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   171
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   172
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   173
TInt DControlTransferManager::SetupEndpointZeroWrite(const TUint8* aBuffer, TInt aLength, TBool aZlpReqd)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   174
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   175
    if(iState[iCurrentStage]->IsRequstAllowed(TControlTransferRequestWrite))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   176
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   177
        return CtrTransferIf().ProcessSetupEndpointZeroWrite(aBuffer,aLength,aZlpReqd);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   178
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   179
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   180
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   181
        __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID " !! SetupEndpointZeroWrite discard"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   182
        return KErrNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   183
        }    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   184
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   185
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   186
TInt DControlTransferManager::SendEp0ZeroByteStatusPacket()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   187
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   188
     if(iState[iCurrentStage]->IsRequstAllowed(TControlTransferRequestSendStatus))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   189
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   190
        iCurrentStage = UsbShai::EControlTransferStageSetup;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   191
        return CtrTransferIf().ProcessSendEp0ZeroByteStatusPacket();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   192
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   193
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   194
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   195
        __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID " !! SendEp0ZeroByteStatusPacket discard"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   196
        return KErrNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   197
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   198
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   199
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   200
TInt DControlTransferManager::StallEndpoint(TInt aRealEndpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   201
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   202
    // Endpoint is stalled, we need to reset our state machine.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   203
    Reset();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   204
    return CtrTransferIf().ProcessStallEndpoint(aRealEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   205
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   206
089413cdde3c 201028_02
hgs
parents:
diff changeset
   207
void DControlTransferManager::Ep0SetupPacketProceed()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   208
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   209
    __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID " !! Missed setup packet processed"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   210
    CtrTransferIf().ProcessEp0SetupPacketProceed();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   211
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   212
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   213
void DControlTransferManager::Ep0DataPacketProceed()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   214
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   215
    __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID " !! Missed data packet processed")); 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   216
    CtrTransferIf().ProcessEp0DataPacketProceed();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   217
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   218
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   219
void DControlTransferManager::Reset()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   220
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   221
    iCurrentStage = UsbShai::EControlTransferStageSetup;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   222
    iReadPending = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   223
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   224
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   225
void DControlTransferManager::Ep0RequestComplete(TUint8* aBuf, 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   226
                                             TInt aCount, 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   227
                                             TInt aError, 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   228
                                             UsbShai::TControlPacketType aPktType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   229
    {   
089413cdde3c 201028_02
hgs
parents:
diff changeset
   230
    __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "> DControlTransferManager::Ep0RequestComplete, packet type: %s", DebugName[aPktType])); 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   231
    // If a setup packet comes, update our local setup packet buffer first
089413cdde3c 201028_02
hgs
parents:
diff changeset
   232
    if(aPktType == UsbShai::EControlPacketTypeSetup)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   233
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   234
        iPacketParser.Set(aBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   235
        // This is the only place this variable to be reset.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   236
        iDataTransfered = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   237
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   238
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   239
    // RequestComplete will return ETrue if it can not handle a packet
089413cdde3c 201028_02
hgs
parents:
diff changeset
   240
    // And it knows that some other sm can handle it.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   241
    // It will update the state to the one which can hanlde that packet first.        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   242
    TBool furtherProcessNeeded = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   243
    while(furtherProcessNeeded)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   244
        {        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   245
        __KTRACE_OPT(KUSB, Kern::Printf("   We're at Stage:         %s", DebugName[iCurrentStage]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   246
        furtherProcessNeeded = iState[iCurrentStage]->RequestComplete(aCount,aError,aPktType);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   247
        __KTRACE_OPT(KUSB, Kern::Printf("   We're moved to stage:   %s", DebugName[iCurrentStage]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   248
        }    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   249
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   250
    __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "< DControlTransferManager::Ep0RequestComplete")); 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   251
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   252
089413cdde3c 201028_02
hgs
parents:
diff changeset
   253
// setup the state machine for a state
089413cdde3c 201028_02
hgs
parents:
diff changeset
   254
void DControlTransferManager::AddState(UsbShai::TControlStage aStage,TControlStageSm& aStageSm)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   255
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   256
    if( (aStage >= UsbShai::EControlTransferStageSetup) && (aStage < UsbShai::EControlTransferStageMax))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   257
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   258
        __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID " AddState(), Stage: %s", DebugName[aStage]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   259
        iState[aStage] = &aStageSm;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   260
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   261
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   262
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   263
// *************** Code for SETUP state machines **************************************
089413cdde3c 201028_02
hgs
parents:
diff changeset
   264
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   265
DSetupStageSm::DSetupStageSm(DControlTransferManager& aTransferMgr):
089413cdde3c 201028_02
hgs
parents:
diff changeset
   266
    TControlStageSm(aTransferMgr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   267
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   268
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   269
089413cdde3c 201028_02
hgs
parents:
diff changeset
   270
// WE are waiting a SETUP packet
089413cdde3c 201028_02
hgs
parents:
diff changeset
   271
TBool DSetupStageSm::RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   272
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   273
    TBool ret = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   274
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   275
    __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "DSetupStageSm::RequestComplete"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   276
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   277
    if(aPktType != UsbShai::EControlPacketTypeSetup)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   278
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   279
        // we just discard any non-setup packet
089413cdde3c 201028_02
hgs
parents:
diff changeset
   280
        __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "ALERT: DSetupStageSm - Non-Setup recieved"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   281
        return ret;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   282
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   283
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   284
    // change state to whatever returned from this call.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   285
    ChangeToStage(iTransferMgr.PktParser().NextStage());
089413cdde3c 201028_02
hgs
parents:
diff changeset
   286
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   287
    // We're going to complete User's read request, consume the previous
089413cdde3c 201028_02
hgs
parents:
diff changeset
   288
    // read operation
089413cdde3c 201028_02
hgs
parents:
diff changeset
   289
    ClearPendingRead();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   290
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   291
    // Setup packet are always need to be processed
089413cdde3c 201028_02
hgs
parents:
diff changeset
   292
    iTransferMgr.CtrTransferIf().ProcessSetupPacket(aPktSize,aError);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   293
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   294
    return EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   295
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   296
089413cdde3c 201028_02
hgs
parents:
diff changeset
   297
TBool DSetupStageSm::IsRequstAllowed(TControlTransferRequest aRequest)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   298
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   299
    // Allow user to read, No other operation is allowed
089413cdde3c 201028_02
hgs
parents:
diff changeset
   300
    TBool ret = (aRequest == TControlTransferRequestRead)?ETrue:EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   301
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   302
    if( ! ret)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   303
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   304
        __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "Warning: request %d was blocked at DSetupStageSm",aRequest));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   305
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   306
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   307
    return ret;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   308
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   309
089413cdde3c 201028_02
hgs
parents:
diff changeset
   310
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   311
// *************** Code for DATA IN state machines **************************************
089413cdde3c 201028_02
hgs
parents:
diff changeset
   312
089413cdde3c 201028_02
hgs
parents:
diff changeset
   313
DDataInStageSm::DDataInStageSm(DControlTransferManager& aTransferMgr):
089413cdde3c 201028_02
hgs
parents:
diff changeset
   314
    TControlStageSm(aTransferMgr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   315
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   316
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   317
089413cdde3c 201028_02
hgs
parents:
diff changeset
   318
// We are waiting for a competion of DATA IN packet
089413cdde3c 201028_02
hgs
parents:
diff changeset
   319
TBool DDataInStageSm::RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   320
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   321
    TInt completionCode = aError;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   322
    TBool furtherRequest = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   323
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   324
    switch(aPktType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   325
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   326
        case UsbShai::EControlPacketTypeSetup:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   327
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   328
            __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "ALERT: DDataInStageSm - Setup recieved"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   329
            // Something goes wrong, host is abandoning the unfinished control transfer
089413cdde3c 201028_02
hgs
parents:
diff changeset
   330
            completionCode = KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   331
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   332
            // Force SM restart at setup stage
089413cdde3c 201028_02
hgs
parents:
diff changeset
   333
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   334
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   335
            // this packet is partially processed here
089413cdde3c 201028_02
hgs
parents:
diff changeset
   336
            // need another SM to continue
089413cdde3c 201028_02
hgs
parents:
diff changeset
   337
            furtherRequest = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   338
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   339
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   340
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   341
        case UsbShai::EControlPacketTypeDataIn:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   342
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   343
            // PSL notifing us that the data had been sent to host
089413cdde3c 201028_02
hgs
parents:
diff changeset
   344
            // next step is to wait for the status from Host
089413cdde3c 201028_02
hgs
parents:
diff changeset
   345
            ChangeToStage(UsbShai::EControlTransferStageStatusOut);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   346
             
089413cdde3c 201028_02
hgs
parents:
diff changeset
   347
            // In USB spec, a compete control transfer must inclue a status stage
089413cdde3c 201028_02
hgs
parents:
diff changeset
   348
            // which is not case in reality,some PSL/Hardware will swallow the
089413cdde3c 201028_02
hgs
parents:
diff changeset
   349
            // Status out report, so, we just complete client normally.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   350
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   351
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   352
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   353
        default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   354
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   355
            __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "ALERT: DDataInStageSm -  %s recieved",DebugName[aPktType]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   356
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   357
            // Unexpected packet will be discard, and lead us reset state machine
089413cdde3c 201028_02
hgs
parents:
diff changeset
   358
            // so that we can wait for next SETUP packet.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   359
            // Of course error will be report to any client if any there.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   360
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   361
            completionCode = KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   362
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   363
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   364
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   365
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   366
    iTransferMgr.CtrTransferIf().ProcessDataInPacket(aPktSize,completionCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   367
089413cdde3c 201028_02
hgs
parents:
diff changeset
   368
    return furtherRequest;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   369
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   370
089413cdde3c 201028_02
hgs
parents:
diff changeset
   371
TBool DDataInStageSm::IsRequstAllowed(TControlTransferRequest aRequest)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   372
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   373
    // Only write is possible because host is waiting for data from us
089413cdde3c 201028_02
hgs
parents:
diff changeset
   374
    TBool ret = (aRequest == TControlTransferRequestWrite)?ETrue:EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   375
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   376
    if( ! ret)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   377
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   378
        __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "Warning: request %d was blocked at DDataInStageSm",aRequest));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   379
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   380
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   381
    return ret;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   382
    };
089413cdde3c 201028_02
hgs
parents:
diff changeset
   383
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   384
// *************** Code for STATUS OUT state machines **************************************
089413cdde3c 201028_02
hgs
parents:
diff changeset
   385
DStatusOutStageSm::DStatusOutStageSm(DControlTransferManager& aTransferMgr):
089413cdde3c 201028_02
hgs
parents:
diff changeset
   386
    TControlStageSm(aTransferMgr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   387
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   388
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   389
089413cdde3c 201028_02
hgs
parents:
diff changeset
   390
// We are waiting for a competion of STATUS OUT or a SETUP packet if PSL or hardware don't
089413cdde3c 201028_02
hgs
parents:
diff changeset
   391
// complete a status in packet
089413cdde3c 201028_02
hgs
parents:
diff changeset
   392
TBool DStatusOutStageSm::RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   393
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   394
    TBool furtherRequest = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   395
    TInt completionCode = aError;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   396
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   397
    switch(aPktType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   398
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   399
        case UsbShai::EControlPacketTypeSetup:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   400
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   401
            __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "ALERT: DStatusOutStageSm - Setup recieved"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   402
            // hw or PSL may not send back the status packet for a DATA OUT
089413cdde3c 201028_02
hgs
parents:
diff changeset
   403
            // and we're ok for this, just back to EControlTransferStageSetup stage           
089413cdde3c 201028_02
hgs
parents:
diff changeset
   404
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   405
            // Force SM restart at setup stage
089413cdde3c 201028_02
hgs
parents:
diff changeset
   406
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   407
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   408
            // this packet is partially processed here
089413cdde3c 201028_02
hgs
parents:
diff changeset
   409
            // need another SM to continue
089413cdde3c 201028_02
hgs
parents:
diff changeset
   410
            furtherRequest = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   411
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   412
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   413
089413cdde3c 201028_02
hgs
parents:
diff changeset
   414
        case UsbShai::EControlPacketTypeStatusOut:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   415
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   416
            // Force SM restart at setup stage
089413cdde3c 201028_02
hgs
parents:
diff changeset
   417
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   418
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   419
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   420
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   421
        default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   422
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   423
            __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "ALERT: DStatusOutStageSm -  %s recieved",DebugName[aPktType]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   424
089413cdde3c 201028_02
hgs
parents:
diff changeset
   425
            // Unexpected packet will be discard, and lead us reset state machine
089413cdde3c 201028_02
hgs
parents:
diff changeset
   426
            // so that we can wait for next SETUP packet.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   427
            // Of course error will be report to any client if any there.            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   428
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   429
            completionCode = KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   430
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   431
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   432
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   433
089413cdde3c 201028_02
hgs
parents:
diff changeset
   434
    iTransferMgr.CtrTransferIf().ProcessStatusOutPacket(completionCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   435
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   436
    return furtherRequest;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   437
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   438
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   439
089413cdde3c 201028_02
hgs
parents:
diff changeset
   440
TBool DStatusOutStageSm::IsRequstAllowed(TControlTransferRequest aRequest)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   441
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   442
    // Read is ok since client don't care the status out stage.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   443
    // and this lead no hurt to anybody.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   444
    TBool ret = (aRequest == TControlTransferRequestRead)?ETrue:EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   445
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   446
    if( ! ret)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   447
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   448
        __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "Warning: request %d was blocked at DStatusOutStageSm",aRequest));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   449
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   450
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   451
    return ret;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   452
    };
089413cdde3c 201028_02
hgs
parents:
diff changeset
   453
089413cdde3c 201028_02
hgs
parents:
diff changeset
   454
// *************** Code for DATA OUT state machines **************************************
089413cdde3c 201028_02
hgs
parents:
diff changeset
   455
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   456
DDataOutStageSm::DDataOutStageSm(DControlTransferManager& aTransferMgr):
089413cdde3c 201028_02
hgs
parents:
diff changeset
   457
    TControlStageSm(aTransferMgr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   458
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   459
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   460
089413cdde3c 201028_02
hgs
parents:
diff changeset
   461
TBool DDataOutStageSm::RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   462
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   463
    TBool furtherRequest = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   464
    TInt completionCode = aError;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   465
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   466
    switch(aPktType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   467
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   468
        case UsbShai::EControlPacketTypeSetup:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   469
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   470
            __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "ALERT: DDataOutStageSm - Setup recieved"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   471
            // Host is abandon the previous Transfer 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   472
            completionCode = KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   473
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   474
            // Force SM restart at setup stage
089413cdde3c 201028_02
hgs
parents:
diff changeset
   475
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   476
089413cdde3c 201028_02
hgs
parents:
diff changeset
   477
            // this packet is partially processed here
089413cdde3c 201028_02
hgs
parents:
diff changeset
   478
            // need another SM to continue
089413cdde3c 201028_02
hgs
parents:
diff changeset
   479
            furtherRequest = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   480
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   481
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   482
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   483
        case UsbShai::EControlPacketTypeDataOut:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   484
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   485
            iTransferMgr.DataReceived(aPktSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   486
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   487
            if(!iTransferMgr.IsMoreBytesNeeded())
089413cdde3c 201028_02
hgs
parents:
diff changeset
   488
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   489
                // We had recieved enough bytes as indicated by the setup
089413cdde3c 201028_02
hgs
parents:
diff changeset
   490
                // packet, Data stage is finished. enter STATUS IN state
089413cdde3c 201028_02
hgs
parents:
diff changeset
   491
                ChangeToStage(UsbShai::EControlTransferStageStatusIn);       
089413cdde3c 201028_02
hgs
parents:
diff changeset
   492
                }            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   493
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   494
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   495
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   496
        case UsbShai::EControlPacketTypeStatusIn:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   497
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   498
            // Status in had been sent to host
089413cdde3c 201028_02
hgs
parents:
diff changeset
   499
            // return and waiting for new SETUP
089413cdde3c 201028_02
hgs
parents:
diff changeset
   500
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   501
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   502
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   503
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   504
        default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   505
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   506
            __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "ALERT: DDataOutStageSm -  %s recieved",DebugName[aPktType]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   507
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   508
            // Unexpected packet will be discard, and lead us reset state machine
089413cdde3c 201028_02
hgs
parents:
diff changeset
   509
            // so that we can wait for next SETUP packet.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   510
            // Of course error will be report to any client if any there.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   511
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   512
            completionCode = KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   513
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   514
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   515
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   516
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   517
    ClearPendingRead();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   518
    iTransferMgr.CtrTransferIf().ProcessDataOutPacket(aPktSize,completionCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   519
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   520
    return furtherRequest;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   521
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   522
089413cdde3c 201028_02
hgs
parents:
diff changeset
   523
TBool DDataOutStageSm::IsRequstAllowed(TControlTransferRequest aRequest)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   524
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   525
    // only read operation is allowed in data out stage.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   526
    TBool ret = (aRequest == TControlTransferRequestRead)?ETrue:EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   527
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   528
    if( ! ret)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   529
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   530
        __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "Warning: request %d was blocked at DDataOutStageSm",aRequest));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   531
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   532
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   533
    return ret;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   534
    };
089413cdde3c 201028_02
hgs
parents:
diff changeset
   535
089413cdde3c 201028_02
hgs
parents:
diff changeset
   536
// *************** Code for DATA OUT state machines **************************************
089413cdde3c 201028_02
hgs
parents:
diff changeset
   537
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   538
DStatusInStageSm::DStatusInStageSm(DControlTransferManager& aTransferMgr):
089413cdde3c 201028_02
hgs
parents:
diff changeset
   539
    TControlStageSm(aTransferMgr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   540
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   541
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   542
089413cdde3c 201028_02
hgs
parents:
diff changeset
   543
TBool DStatusInStageSm::RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   544
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   545
    TBool furtherRequest = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   546
    TInt completionCode = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   547
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   548
    switch(aPktType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   549
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   550
        case UsbShai::EControlPacketTypeSetup:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   551
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   552
            __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "ALERT: DStatusInStageSm - Setup recieved"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   553
            // Status in is an optional for PSL
089413cdde3c 201028_02
hgs
parents:
diff changeset
   554
            // If we received a setup packet here, we assume the previous
089413cdde3c 201028_02
hgs
parents:
diff changeset
   555
            // status in packet had been successfully sent to host.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   556
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   557
            // Force SM restart at setup stage
089413cdde3c 201028_02
hgs
parents:
diff changeset
   558
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   559
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   560
            // this packet is partially processed here
089413cdde3c 201028_02
hgs
parents:
diff changeset
   561
            // need another SM to continue
089413cdde3c 201028_02
hgs
parents:
diff changeset
   562
            furtherRequest = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   563
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   564
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   565
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   566
        case UsbShai::EControlPacketTypeStatusIn:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   567
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   568
            // Status in had been recieved, monitor setup packet then.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   569
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   570
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   571
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   572
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
   573
        default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   574
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   575
            __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "ALERT: DStatusInStageSm -  %s recieved",DebugName[aPktType]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   576
089413cdde3c 201028_02
hgs
parents:
diff changeset
   577
            // Unexpected packet will be discard, and lead us reset state machine
089413cdde3c 201028_02
hgs
parents:
diff changeset
   578
            // so that we can wait for next SETUP packet.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   579
            // Of course error will be report to any client if any there.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   580
            ChangeToStage(UsbShai::EControlTransferStageSetup);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   581
            completionCode = KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   582
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   583
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   584
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   585
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   586
    iTransferMgr.CtrTransferIf().ProcessStatusInPacket(completionCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   587
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   588
    return furtherRequest;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   589
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   590
089413cdde3c 201028_02
hgs
parents:
diff changeset
   591
TBool DStatusInStageSm::IsRequstAllowed(TControlTransferRequest aRequest)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   592
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   593
    // Read is ok even we are wait for the client to send a zero status packet
089413cdde3c 201028_02
hgs
parents:
diff changeset
   594
    TBool ret = ((aRequest == TControlTransferRequestSendStatus) || 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   595
                (aRequest == TControlTransferRequestRead))?ETrue:EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   596
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   597
    if( ! ret)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   598
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   599
        __KTRACE_OPT(KUSB, Kern::Printf(CTSM_ID "Warning: request %d was blocked at DStatusInStageSm",aRequest));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   600
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   601
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   602
    return ret;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   603
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   604
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   605
// End of file
089413cdde3c 201028_02
hgs
parents:
diff changeset
   606