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