usbdrv/peripheral/ldd/perildd/src/d_usbc.cpp
author hgs
Fri, 23 Jul 2010 15:54:47 +0800
changeset 33 089413cdde3c
child 48 21625e5de155
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
// Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
089413cdde3c 201028_02
hgs
parents:
diff changeset
     2
// All rights reserved.
089413cdde3c 201028_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
089413cdde3c 201028_02
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
089413cdde3c 201028_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
089413cdde3c 201028_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
089413cdde3c 201028_02
hgs
parents:
diff changeset
     7
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
089413cdde3c 201028_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    10
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
    11
// Contributors:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    12
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
    13
// Description:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    14
// e32/drivers/usbc/d_usbc.cpp
089413cdde3c 201028_02
hgs
parents:
diff changeset
    15
// LDD for USB Device driver stack:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    16
// The channel object.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    17
// 
089413cdde3c 201028_02
hgs
parents:
diff changeset
    18
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
    19
089413cdde3c 201028_02
hgs
parents:
diff changeset
    20
/**
089413cdde3c 201028_02
hgs
parents:
diff changeset
    21
 @file d_usbc.cpp
089413cdde3c 201028_02
hgs
parents:
diff changeset
    22
 @internalTechnology
089413cdde3c 201028_02
hgs
parents:
diff changeset
    23
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    24
089413cdde3c 201028_02
hgs
parents:
diff changeset
    25
#include <usb/usbc.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    26
089413cdde3c 201028_02
hgs
parents:
diff changeset
    27
089413cdde3c 201028_02
hgs
parents:
diff changeset
    28
_LIT(KUsbLddName, "Usbc");
089413cdde3c 201028_02
hgs
parents:
diff changeset
    29
089413cdde3c 201028_02
hgs
parents:
diff changeset
    30
static const TInt KUsbRequestCallbackPriority = 2;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    31
089413cdde3c 201028_02
hgs
parents:
diff changeset
    32
089413cdde3c 201028_02
hgs
parents:
diff changeset
    33
// Quick sanity check on endpoint properties
089413cdde3c 201028_02
hgs
parents:
diff changeset
    34
static TBool ValidateEndpoint(const TUsbcEndpointInfo* aEndpointInfo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    35
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    36
    const TUint dir = aEndpointInfo->iDir;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    37
    const TInt size = aEndpointInfo->iSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    38
    if (size <= 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    39
        return EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    40
089413cdde3c 201028_02
hgs
parents:
diff changeset
    41
    switch (aEndpointInfo->iType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    42
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    43
    case UsbShai::KUsbEpTypeControl:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    44
        if (dir != UsbShai::KUsbEpDirBidirect || size > 64)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    45
            return EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    46
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    47
    case UsbShai::KUsbEpTypeIsochronous:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    48
        if ((dir != UsbShai::KUsbEpDirIn && dir != UsbShai::KUsbEpDirOut) || size > 1024)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    49
            return EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    50
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    51
    case UsbShai::KUsbEpTypeBulk:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    52
        if ((dir != UsbShai::KUsbEpDirIn && dir != UsbShai::KUsbEpDirOut) || size > 512)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    53
            return EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    54
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    55
    case UsbShai::KUsbEpTypeInterrupt:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    56
        if ((dir != UsbShai::KUsbEpDirIn && dir != UsbShai::KUsbEpDirOut) || size > 1024)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    57
            return EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    58
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    59
    default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    60
        return EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    61
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    62
    return ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    63
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    64
089413cdde3c 201028_02
hgs
parents:
diff changeset
    65
089413cdde3c 201028_02
hgs
parents:
diff changeset
    66
/** Real entry point from the Kernel: return a new driver.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    67
 */
089413cdde3c 201028_02
hgs
parents:
diff changeset
    68
DECLARE_STANDARD_LDD()
089413cdde3c 201028_02
hgs
parents:
diff changeset
    69
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    70
    return new DUsbcLogDevice;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    71
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    72
089413cdde3c 201028_02
hgs
parents:
diff changeset
    73
089413cdde3c 201028_02
hgs
parents:
diff changeset
    74
/** Create a channel on the device.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    75
089413cdde3c 201028_02
hgs
parents:
diff changeset
    76
    @internalComponent
089413cdde3c 201028_02
hgs
parents:
diff changeset
    77
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    78
TInt DUsbcLogDevice::Create(DLogicalChannelBase*& aChannel)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    79
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    80
    aChannel = new DLddUsbcChannel;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    81
    return aChannel ? KErrNone : KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    82
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    83
089413cdde3c 201028_02
hgs
parents:
diff changeset
    84
089413cdde3c 201028_02
hgs
parents:
diff changeset
    85
DUsbcLogDevice::DUsbcLogDevice()
089413cdde3c 201028_02
hgs
parents:
diff changeset
    86
      {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    87
      iParseMask = KDeviceAllowUnit;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    88
      iUnitsMask = 0xffffffff;                                // Leave units decision to the Controller
089413cdde3c 201028_02
hgs
parents:
diff changeset
    89
      iVersion = TVersion(KUsbcMajorVersion, KUsbcMinorVersion, KUsbcBuildVersion);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    90
      }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    91
089413cdde3c 201028_02
hgs
parents:
diff changeset
    92
089413cdde3c 201028_02
hgs
parents:
diff changeset
    93
TInt DUsbcLogDevice::Install()
089413cdde3c 201028_02
hgs
parents:
diff changeset
    94
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    95
    // Only proceed if we have the Controller underneath us
089413cdde3c 201028_02
hgs
parents:
diff changeset
    96
    if (!DUsbClientController::UsbcControllerPointer())
089413cdde3c 201028_02
hgs
parents:
diff changeset
    97
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    98
        __KTRACE_OPT(KPANIC, Kern::Printf("LDD Install: USB Controller Not Present"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
    99
        return KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   100
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   101
    return SetName(&KUsbLddName);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   102
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   103
089413cdde3c 201028_02
hgs
parents:
diff changeset
   104
089413cdde3c 201028_02
hgs
parents:
diff changeset
   105
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   106
// Return the USB controller capabilities.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   107
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   108
void DUsbcLogDevice::GetCaps(TDes8& aDes) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
   109
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   110
    TPckgBuf<TCapsDevUsbc> b;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   111
    b().version = iVersion;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   112
    Kern::InfoCopy(aDes, b);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   113
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   114
089413cdde3c 201028_02
hgs
parents:
diff changeset
   115
089413cdde3c 201028_02
hgs
parents:
diff changeset
   116
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   117
// Constructor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   118
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   119
DLddUsbcChannel::DLddUsbcChannel()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   120
    : iValidInterface(EFalse),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   121
      iAlternateSettingList(NULL),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   122
      iCompleteAllCallbackInfo(this, DLddUsbcChannel::EmergencyCompleteDfc, KUsbRequestCallbackPriority),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   123
      iStatusChangePtr(NULL),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   124
      iStatusCallbackInfo(this, DLddUsbcChannel::StatusChangeCallback, KUsbRequestCallbackPriority),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   125
      iEndpointStatusChangePtr(NULL),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   126
      iEndpointStatusCallbackInfo(this, DLddUsbcChannel::EndpointStatusChangeCallback,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   127
                                  KUsbRequestCallbackPriority),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   128
      iOtgFeatureChangePtr(NULL),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   129
      iOtgFeatureCallbackInfo(this, DLddUsbcChannel::OtgFeatureChangeCallback, KUsbRequestCallbackPriority),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   130
      iNumberOfEndpoints(0),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   131
      iDeviceState(UsbShai::EUsbPeripheralStateUndefined),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   132
      iOwnsDeviceControl(EFalse),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   133
      iAlternateSetting(0),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   134
      iDeviceStatusNeeded(EFalse),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   135
      iChannelClosing(EFalse)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   136
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   137
    __KTRACE_OPT(KUSB, Kern::Printf("*** DLddUsbcChannel::DLddUsbcChannel CTOR"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   138
    iClient = &Kern::CurrentThread();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   139
    iClient->Open();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   140
    for (TInt i = 1; i <= KMaxEndpointsPerClient; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   141
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   142
        iEndpoint[i] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   143
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   144
    for (TInt i = 1; i < KUsbcMaxRequests; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   145
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   146
        iRequestStatus[i] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   147
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   148
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   149
089413cdde3c 201028_02
hgs
parents:
diff changeset
   150
089413cdde3c 201028_02
hgs
parents:
diff changeset
   151
DLddUsbcChannel::~DLddUsbcChannel()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   152
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   153
    __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcChannel::~DLddUsbcChannel()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   154
    if (iController)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   155
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   156
        iController->DeRegisterClient(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   157
        iStatusCallbackInfo.Cancel();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   158
        iEndpointStatusCallbackInfo.Cancel();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   159
        iOtgFeatureCallbackInfo.Cancel();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   160
        iCompleteAllCallbackInfo.Cancel();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   161
        AbortInterface();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   162
        DestroyAllInterfaces();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   163
        if (iOwnsDeviceControl)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   164
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   165
            iController->ReleaseDeviceControl(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   166
            iOwnsDeviceControl = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   167
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   168
        DestroyEp0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   169
        delete iStatusFifo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   170
        Kern::DestroyClientRequest(iStatusChangeReq);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   171
        Kern::DestroyClientRequest(iEndpointStatusChangeReq);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   172
        Kern::DestroyClientRequest(iOtgFeatureChangeReq);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   173
089413cdde3c 201028_02
hgs
parents:
diff changeset
   174
        Kern::DestroyVirtualPinObject(iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   175
        Kern::DestroyVirtualPinObject(iPinObj2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   176
        Kern::DestroyVirtualPinObject(iPinObj3);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   177
089413cdde3c 201028_02
hgs
parents:
diff changeset
   178
        for (TInt i = 0; i < KUsbcMaxRequests; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   179
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   180
            Kern::DestroyClientBufferRequest(iClientAsynchNotify[i]->iBufferRequest);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   181
            delete iClientAsynchNotify[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   182
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   183
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   184
    Kern::SafeClose((DObject*&)iClient, NULL);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   185
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   186
089413cdde3c 201028_02
hgs
parents:
diff changeset
   187
089413cdde3c 201028_02
hgs
parents:
diff changeset
   188
inline TBool DLddUsbcChannel::ValidEndpoint(TInt aEndpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   189
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   190
    return (aEndpoint <= iNumberOfEndpoints && aEndpoint >= 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   191
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   192
089413cdde3c 201028_02
hgs
parents:
diff changeset
   193
089413cdde3c 201028_02
hgs
parents:
diff changeset
   194
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   195
// Create channel
089413cdde3c 201028_02
hgs
parents:
diff changeset
   196
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   197
TInt DLddUsbcChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   198
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   199
    __KTRACE_OPT(KUSB, Kern::Printf("LDD DoCreateL 1 Ver = %02d %02d %02d",
089413cdde3c 201028_02
hgs
parents:
diff changeset
   200
                                    aVer.iMajor, aVer.iMinor, aVer.iBuild));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   201
    if (!Kern::CurrentThreadHasCapability(ECapabilityCommDD,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   202
                                          __PLATSEC_DIAGNOSTIC_STRING("Checked by USBC.LDD (USB Driver)")))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   203
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   204
        return KErrPermissionDenied;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   205
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   206
089413cdde3c 201028_02
hgs
parents:
diff changeset
   207
    iController = DUsbClientController::UsbcControllerPointer();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   208
089413cdde3c 201028_02
hgs
parents:
diff changeset
   209
    if (!iController)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   210
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   211
        return KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   212
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   213
089413cdde3c 201028_02
hgs
parents:
diff changeset
   214
    iStatusFifo = new TUsbcDeviceStatusQueue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   215
    if (iStatusFifo == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   216
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   217
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   218
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   219
089413cdde3c 201028_02
hgs
parents:
diff changeset
   220
      if (!Kern::QueryVersionSupported(TVersion(KUsbcMajorVersion, KUsbcMinorVersion, KUsbcBuildVersion), aVer))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   221
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   222
        return KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   223
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   224
089413cdde3c 201028_02
hgs
parents:
diff changeset
   225
    // set up the correct DFC queue
089413cdde3c 201028_02
hgs
parents:
diff changeset
   226
    SetDfcQ(iController->DfcQ(0));                            // sets the channel's dfc queue
089413cdde3c 201028_02
hgs
parents:
diff changeset
   227
    #ifdef DFC_REALTIME_STATE
089413cdde3c 201028_02
hgs
parents:
diff changeset
   228
        iDfcQ.SetRealtimeState(ERealtimeStateOn);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   229
    #endif
089413cdde3c 201028_02
hgs
parents:
diff changeset
   230
    iCompleteAllCallbackInfo.SetDfcQ(iDfcQ);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   231
    iStatusCallbackInfo.SetDfcQ(iDfcQ);                        // use the channel's dfcq for this dfc
089413cdde3c 201028_02
hgs
parents:
diff changeset
   232
    iEndpointStatusCallbackInfo.SetDfcQ(iDfcQ);                // use the channel's dfcq for this dfc
089413cdde3c 201028_02
hgs
parents:
diff changeset
   233
    iOtgFeatureCallbackInfo.SetDfcQ(iDfcQ);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   234
    iMsgQ.Receive();                                        //start up the message q
089413cdde3c 201028_02
hgs
parents:
diff changeset
   235
    TInt r = iController->RegisterClientCallback(iCompleteAllCallbackInfo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   236
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   237
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   238
    r = iController->RegisterForStatusChange(iStatusCallbackInfo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   239
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   240
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   241
    r = iController->RegisterForEndpointStatusChange(iEndpointStatusCallbackInfo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   242
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   243
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   244
    r = iController->RegisterForOtgFeatureChange(iOtgFeatureCallbackInfo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   245
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   246
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   247
089413cdde3c 201028_02
hgs
parents:
diff changeset
   248
    r = Kern::CreateClientDataRequest(iStatusChangeReq);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   249
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   250
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   251
    r = Kern::CreateClientDataRequest(iEndpointStatusChangeReq);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   252
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   253
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   254
    r = Kern::CreateClientDataRequest(iOtgFeatureChangeReq);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   255
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   256
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   257
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   258
    Kern::CreateVirtualPinObject(iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   259
    Kern::CreateVirtualPinObject(iPinObj2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   260
    Kern::CreateVirtualPinObject(iPinObj3);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   261
089413cdde3c 201028_02
hgs
parents:
diff changeset
   262
    for (TInt i = 0; i < KUsbcMaxRequests; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   263
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   264
            iClientAsynchNotify[i] = new TClientAsynchNotify;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   265
            if(iClientAsynchNotify[i] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   266
                return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   267
            r = Kern::CreateClientBufferRequest(iClientAsynchNotify[i]->iBufferRequest,1,TClientBufferRequest::EPinVirtual);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   268
            if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   269
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   270
                delete iClientAsynchNotify[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   271
                iClientAsynchNotify[i]=NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   272
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   273
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   274
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   275
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   276
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   277
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   278
089413cdde3c 201028_02
hgs
parents:
diff changeset
   279
089413cdde3c 201028_02
hgs
parents:
diff changeset
   280
089413cdde3c 201028_02
hgs
parents:
diff changeset
   281
void DLddUsbcChannel::CompleteBufferRequest(DThread* aThread, TInt aReqNo, TInt aReason)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   282
{
089413cdde3c 201028_02
hgs
parents:
diff changeset
   283
    iRequestStatus[aReqNo]=NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   284
    Kern::QueueBufferRequestComplete(aThread, iClientAsynchNotify[aReqNo]->iBufferRequest, aReason);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   285
}
089413cdde3c 201028_02
hgs
parents:
diff changeset
   286
089413cdde3c 201028_02
hgs
parents:
diff changeset
   287
089413cdde3c 201028_02
hgs
parents:
diff changeset
   288
TClientBuffer * DLddUsbcChannel::GetClientBuffer(TInt aEndpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   289
{
089413cdde3c 201028_02
hgs
parents:
diff changeset
   290
    return iClientAsynchNotify[aEndpoint]->iClientBuffer;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   291
}
089413cdde3c 201028_02
hgs
parents:
diff changeset
   292
089413cdde3c 201028_02
hgs
parents:
diff changeset
   293
//Runs in client thread
089413cdde3c 201028_02
hgs
parents:
diff changeset
   294
TInt DLddUsbcChannel::SendMsg(TMessageBase * aMsg)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   295
{
089413cdde3c 201028_02
hgs
parents:
diff changeset
   296
    TThreadMessage& m=* (TThreadMessage*)aMsg;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   297
    TInt id = m.iValue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   298
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   299
    TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   300
    //Cancel Request
089413cdde3c 201028_02
hgs
parents:
diff changeset
   301
    if (id == KMaxTInt)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   302
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   303
            r = DLogicalChannel::SendMsg(aMsg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   304
            return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   305
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   306
    if (id < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   307
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   308
        // DoRequest
089413cdde3c 201028_02
hgs
parents:
diff changeset
   309
        TRequestStatus* pS = (TRequestStatus*) m.Ptr0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   310
        r = PreSendRequest(aMsg,~id, pS, m.Ptr1(), m.Ptr2());
089413cdde3c 201028_02
hgs
parents:
diff changeset
   311
        if (r == KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   312
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   313
            r = DLogicalChannel::SendMsg(aMsg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   314
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   315
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   316
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   317
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   318
        //SendControl
089413cdde3c 201028_02
hgs
parents:
diff changeset
   319
        r = SendControl(aMsg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   320
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   321
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   322
}
089413cdde3c 201028_02
hgs
parents:
diff changeset
   323
089413cdde3c 201028_02
hgs
parents:
diff changeset
   324
089413cdde3c 201028_02
hgs
parents:
diff changeset
   325
TInt DLddUsbcChannel::PreSendRequest(TMessageBase * aMsg,TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   326
{
089413cdde3c 201028_02
hgs
parents:
diff changeset
   327
    TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   328
    if (aReqNo >= KUsbcMaxRequests)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   329
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   330
        Kern::RequestComplete(aStatus, KErrNotSupported);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   331
        return KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   332
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   333
    if (aReqNo > KUsbcMaxEpNumber)//DoOtherAsyncReq
089413cdde3c 201028_02
hgs
parents:
diff changeset
   334
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   335
        switch (aReqNo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   336
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   337
            case RDevUsbcClient::ERequestEndpointStatusNotify:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   338
                iEndpointStatusChangeReq->Reset();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   339
                iEndpointStatusChangeReq->SetStatus(aStatus);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   340
                iEndpointStatusChangeReq->SetDestPtr(a1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   341
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   342
            case RDevUsbcClient::ERequestOtgFeaturesNotify:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   343
                iOtgFeatureChangeReq->Reset();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   344
                iOtgFeatureChangeReq->SetStatus(aStatus);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   345
                iOtgFeatureChangeReq->SetDestPtr(a1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   346
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   347
            case RDevUsbcClient::ERequestAlternateDeviceStatusNotify:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   348
                iStatusChangeReq->Reset();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   349
                iStatusChangeReq->SetStatus(aStatus);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   350
                iStatusChangeReq->SetDestPtr(a1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   351
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   352
            case RDevUsbcClient::ERequestReEnumerate://WE use bufferrequest to complete even tho we dont add any buffers
089413cdde3c 201028_02
hgs
parents:
diff changeset
   353
                iClientAsynchNotify[aReqNo]->Reset();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   354
                r=iClientAsynchNotify[aReqNo]->iBufferRequest->StartSetup(aStatus);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   355
                if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   356
                    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   357
                iClientAsynchNotify[aReqNo]->iBufferRequest->EndSetup();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   358
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   359
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   360
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   361
    else //DoTransferAsyncReq
089413cdde3c 201028_02
hgs
parents:
diff changeset
   362
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   363
            if(a1 == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   364
                return KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   365
            iClientAsynchNotify[aReqNo]->Reset();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   366
            r=iClientAsynchNotify[aReqNo]->iBufferRequest->StartSetup(aStatus);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   367
            if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   368
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   369
            kumemget(&iTfrInfo,a1,sizeof(TEndpointTransferInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   370
            r=iClientAsynchNotify[aReqNo]->iBufferRequest->AddBuffer(iClientAsynchNotify[aReqNo]->iClientBuffer, iTfrInfo.iDes);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   371
            if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   372
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   373
            iClientAsynchNotify[aReqNo]->iBufferRequest->EndSetup();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   374
            TThreadMessage& m=*(TThreadMessage*)aMsg;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   375
            m.iArg[1] = (TAny*)&iTfrInfo; //Use Channel owned TransfereInfo structure 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   376
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   377
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   378
}
089413cdde3c 201028_02
hgs
parents:
diff changeset
   379
089413cdde3c 201028_02
hgs
parents:
diff changeset
   380
089413cdde3c 201028_02
hgs
parents:
diff changeset
   381
void DLddUsbcChannel::HandleMsg(TMessageBase* aMsg)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   382
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   383
    TThreadMessage& m = *(TThreadMessage*)aMsg;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   384
    TInt id = m.iValue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   385
    if (id == (TInt) ECloseMsg)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   386
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   387
        iChannelClosing = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   388
        m.Complete(KErrNone, EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   389
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   390
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   391
    else if (id == KMaxTInt)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   392
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   393
        // Cancel request
089413cdde3c 201028_02
hgs
parents:
diff changeset
   394
        TInt mask = m.Int0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   395
        TInt b = 1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   396
        for(TInt reqNo = 0; reqNo < KUsbcMaxRequests; reqNo++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   397
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   398
            TRequestStatus* pS = iRequestStatus[reqNo];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   399
            if ((mask & b) && (pS != NULL))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   400
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   401
                DoCancel(reqNo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   402
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   403
            b <<= 1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   404
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   405
        m.Complete(KErrNone, ETrue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   406
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   407
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   408
089413cdde3c 201028_02
hgs
parents:
diff changeset
   409
    if (id < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   410
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   411
        // DoRequest
089413cdde3c 201028_02
hgs
parents:
diff changeset
   412
        TRequestStatus* pS = (TRequestStatus*) m.Ptr0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   413
        DoRequest(~id, pS, m.Ptr1(), m.Ptr2());
089413cdde3c 201028_02
hgs
parents:
diff changeset
   414
        m.Complete(KErrNone, ETrue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   415
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   416
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   417
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   418
        // DoControl
089413cdde3c 201028_02
hgs
parents:
diff changeset
   419
        TInt r = DoControl(id, m.Ptr0(), m.Ptr1());
089413cdde3c 201028_02
hgs
parents:
diff changeset
   420
        m.Complete(r, ETrue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   421
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   422
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   423
089413cdde3c 201028_02
hgs
parents:
diff changeset
   424
089413cdde3c 201028_02
hgs
parents:
diff changeset
   425
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   426
// Overriding DObject virtual
089413cdde3c 201028_02
hgs
parents:
diff changeset
   427
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   428
TInt DLddUsbcChannel::RequestUserHandle(DThread* aThread, TOwnerType /*aType*/)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   429
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   430
    __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcChannel::RequestUserHandle"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   431
    // The USB client LDD is not designed for a channel to be shared between
089413cdde3c 201028_02
hgs
parents:
diff changeset
   432
    // threads. It saves a pointer to the current thread when it is opened, and
089413cdde3c 201028_02
hgs
parents:
diff changeset
   433
    // uses this to complete any asynchronous requests.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   434
    // It is therefore not acceptable for the handle to be duplicated and used
089413cdde3c 201028_02
hgs
parents:
diff changeset
   435
    // by another thread:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   436
    if (aThread == iClient)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   437
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   438
        return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   439
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   440
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   441
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   442
        return KErrAccessDenied;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   443
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   444
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   445
089413cdde3c 201028_02
hgs
parents:
diff changeset
   446
089413cdde3c 201028_02
hgs
parents:
diff changeset
   447
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   448
// Asynchronous requests - overriding pure virtual
089413cdde3c 201028_02
hgs
parents:
diff changeset
   449
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   450
void DLddUsbcChannel::DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   451
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   452
    // Check on request status
089413cdde3c 201028_02
hgs
parents:
diff changeset
   453
    __KTRACE_OPT(KUSB, Kern::Printf("DoRequest 0x%08x", aReqNo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   454
        TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   455
        if (iRequestStatus[aReqNo] != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   456
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   457
            DestroyAllInterfaces();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   458
            PanicClientThread(ERequestAlreadyPending);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   459
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   460
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   461
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   462
            TBool needsCompletion;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   463
            iRequestStatus[aReqNo] = aStatus;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   464
089413cdde3c 201028_02
hgs
parents:
diff changeset
   465
            if (aReqNo > KUsbcMaxEpNumber)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   466
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   467
                r = DoOtherAsyncReq(aReqNo, a1, a2, needsCompletion);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   468
                if (needsCompletion)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   469
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   470
                    switch (aReqNo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   471
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   472
                        case RDevUsbcClient::ERequestEndpointStatusNotify:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   473
                            iRequestStatus[aReqNo]=NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   474
                            Kern::QueueRequestComplete(iClient,iEndpointStatusChangeReq,r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   475
                        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   476
                        case RDevUsbcClient::ERequestOtgFeaturesNotify:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   477
                            iRequestStatus[aReqNo]=NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   478
                            Kern::QueueRequestComplete(iClient,iOtgFeatureChangeReq,r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   479
                        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   480
                        case RDevUsbcClient::ERequestAlternateDeviceStatusNotify:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   481
                            iRequestStatus[aReqNo]=NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   482
                            Kern::QueueRequestComplete(iClient,iStatusChangeReq,r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   483
                        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   484
                        case RDevUsbcClient::ERequestReEnumerate:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   485
                            iRequestStatus[aReqNo]=NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   486
                            Kern::QueueBufferRequestComplete(iClient, iClientAsynchNotify[aReqNo]->iBufferRequest, r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   487
                        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   488
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   489
                  }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   490
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   491
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   492
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   493
                r = DoTransferAsyncReq(aReqNo, a1, a2, needsCompletion);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   494
                if (needsCompletion)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   495
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   496
                    //Kern::RequestComplete(iClient, iRequestStatus[aReqNo], r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   497
                    CompleteBufferRequest(iClient, aReqNo, r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   498
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   499
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   500
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   501
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   502
089413cdde3c 201028_02
hgs
parents:
diff changeset
   503
089413cdde3c 201028_02
hgs
parents:
diff changeset
   504
089413cdde3c 201028_02
hgs
parents:
diff changeset
   505
TInt DLddUsbcChannel::DoOtherAsyncReq(TInt aReqNo, TAny* a1, TAny* a2, TBool& aNeedsCompletion)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   506
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   507
    // The general assumption is that none of these will complete now.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   508
    // However, those that make this function return something other than
089413cdde3c 201028_02
hgs
parents:
diff changeset
   509
    // KErrNone will get completed by the calling function.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   510
    // So, 1) If you are returning KErrNone but really need to complete because
089413cdde3c 201028_02
hgs
parents:
diff changeset
   511
    //        completion criteria can be met (for example, sufficient data is
089413cdde3c 201028_02
hgs
parents:
diff changeset
   512
    //        available in the buffer) and then set aNeedsCompletion = ETrue.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   513
    //     2) Do NOT complete here AT ALL.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   514
    //
089413cdde3c 201028_02
hgs
parents:
diff changeset
   515
    aNeedsCompletion = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   516
    TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   517
089413cdde3c 201028_02
hgs
parents:
diff changeset
   518
    switch (aReqNo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   519
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   520
    case RDevUsbcClient::ERequestAlternateDeviceStatusNotify:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   521
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   522
        __KTRACE_OPT(KUSB, Kern::Printf("EControlReqDeviceStatusNotify"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   523
        if (a1 != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   524
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   525
            iDeviceStatusNeeded = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   526
            iStatusChangePtr = a1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   527
            aNeedsCompletion = AlternateDeviceStateTestComplete();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   528
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   529
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   530
            r = KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   531
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   532
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   533
    case RDevUsbcClient::ERequestReEnumerate:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   534
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   535
        __KTRACE_OPT(KUSB, Kern::Printf("ERequestReEnumerate"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   536
        // If successful, this will complete via the status notification.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   537
        r = iController->ReEnumerate();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   538
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   539
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   540
    case RDevUsbcClient::ERequestEndpointStatusNotify:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   541
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   542
        __KTRACE_OPT(KUSB, Kern::Printf("ERequestEndpointStatusNotify"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   543
        if (a1 != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   544
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   545
            iEndpointStatusChangePtr = a1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   546
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   547
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   548
            r = KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   549
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   550
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   551
    case RDevUsbcClient::ERequestOtgFeaturesNotify:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   552
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   553
        __KTRACE_OPT(KUSB, Kern::Printf("ERequestOtgFeaturesNotify"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   554
        if (a1 != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   555
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   556
            iOtgFeatureChangePtr = a1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   557
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   558
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   559
            r = KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   560
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   561
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   562
    default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   563
        r = KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   564
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   565
089413cdde3c 201028_02
hgs
parents:
diff changeset
   566
    aNeedsCompletion = aNeedsCompletion || (r != KErrNone);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   567
089413cdde3c 201028_02
hgs
parents:
diff changeset
   568
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   569
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   570
089413cdde3c 201028_02
hgs
parents:
diff changeset
   571
089413cdde3c 201028_02
hgs
parents:
diff changeset
   572
TInt DLddUsbcChannel::DoTransferAsyncReq(TInt aEndpointNum, TAny* a1, TAny* a2, TBool& aNeedsCompletion)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   573
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   574
    // The general assumption is that none of these will complete now.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   575
    // however, those that are returning something other than KErrNone will get completed
089413cdde3c 201028_02
hgs
parents:
diff changeset
   576
    // by the calling function.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   577
    // So,    1) if you are returning KErrNone but really need to complete because completion criteria can be met
089413cdde3c 201028_02
hgs
parents:
diff changeset
   578
    //            (for example, sufficient data is available in the buffer) and then set aNeedsCompletion=ETrue..
089413cdde3c 201028_02
hgs
parents:
diff changeset
   579
    //        2) Do NOT complete here AT ALL.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   580
    //
089413cdde3c 201028_02
hgs
parents:
diff changeset
   581
    aNeedsCompletion = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   582
    TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   583
    TUsbcEndpoint* pEndpoint = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   584
    TUsbcEndpointInfo* pEndpointInfo = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   585
    TEndpointTransferInfo* pTfr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   586
089413cdde3c 201028_02
hgs
parents:
diff changeset
   587
    if (aEndpointNum == 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   588
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   589
        // ep0 requests
089413cdde3c 201028_02
hgs
parents:
diff changeset
   590
        if (!(iValidInterface || iOwnsDeviceControl))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   591
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   592
            __KTRACE_OPT(KUSB, Kern::Printf("DoRequest rejected: not configured (Ep0)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   593
            r = KErrUsbInterfaceNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   594
            goto exit;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   595
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   596
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   597
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   598
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   599
        // other eps
089413cdde3c 201028_02
hgs
parents:
diff changeset
   600
        if (!(iValidInterface && (iDeviceState == UsbShai::EUsbPeripheralStateConfigured ||
089413cdde3c 201028_02
hgs
parents:
diff changeset
   601
                                  iDeviceState == UsbShai::EUsbPeripheralStateSuspended))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   602
           )
089413cdde3c 201028_02
hgs
parents:
diff changeset
   603
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   604
            __KTRACE_OPT(KUSB, Kern::Printf("DoRequest rejected not configured (Ep %d)", aEndpointNum));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   605
            r = KErrUsbInterfaceNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   606
            goto exit;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   607
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   608
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   609
089413cdde3c 201028_02
hgs
parents:
diff changeset
   610
    if (!ValidEndpoint(aEndpointNum))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   611
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   612
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Read: in error complete"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   613
        r = KErrUsbEpNotInInterface;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   614
        goto exit;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   615
         }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   616
089413cdde3c 201028_02
hgs
parents:
diff changeset
   617
    if (a1 == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   618
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   619
        r = KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   620
        goto exit;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   621
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   622
    pTfr = (TEndpointTransferInfo *)a1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   623
089413cdde3c 201028_02
hgs
parents:
diff changeset
   624
    if (pTfr->iTransferSize < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   625
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   626
        r = KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   627
        goto exit;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   628
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   629
    pEndpoint = iEndpoint[aEndpointNum];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   630
    if (!pEndpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   631
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   632
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Read: in error complete"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   633
        r = KErrUsbEpNotInInterface;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   634
        goto exit;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   635
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   636
089413cdde3c 201028_02
hgs
parents:
diff changeset
   637
    pEndpointInfo = pEndpoint->EndpointInfo();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   638
    __KTRACE_OPT(KUSB, Kern::Printf("DoRequest %d", aEndpointNum));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   639
089413cdde3c 201028_02
hgs
parents:
diff changeset
   640
    switch (pTfr->iTransferType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   641
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   642
089413cdde3c 201028_02
hgs
parents:
diff changeset
   643
    case ETransferTypeReadData:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   644
    case ETransferTypeReadPacket:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   645
    case ETransferTypeReadUntilShort:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   646
    case ETransferTypeReadOneOrMore:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   647
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   648
        __KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   649
        if (pEndpoint->iDmaBuffers->RxIsActive())
089413cdde3c 201028_02
hgs
parents:
diff changeset
   650
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   651
            __KTRACE_OPT(KUSB, Kern::Printf("**** ReadReq ep%d RxActive", aEndpointNum));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   652
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   653
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   654
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   655
            __KTRACE_OPT(KUSB, Kern::Printf("**** ReadReq ep%d RxInActive", aEndpointNum));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   656
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   657
089413cdde3c 201028_02
hgs
parents:
diff changeset
   658
        if (pEndpointInfo->iDir != UsbShai::KUsbEpDirOut &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
   659
            pEndpointInfo->iDir != UsbShai::KUsbEpDirBidirect)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   660
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   661
            // Trying to do the wrong thing
089413cdde3c 201028_02
hgs
parents:
diff changeset
   662
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Read: in error complete"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   663
            r = KErrUsbEpBadDirection;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   664
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   665
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   666
        // Set the length of data to zero now to catch all cases
089413cdde3c 201028_02
hgs
parents:
diff changeset
   667
        TPtrC8 pZeroDesc(NULL, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   668
        r=Kern::ThreadBufWrite(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer, pZeroDesc, 0, 0,iClient);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   669
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   670
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   671
        pEndpoint->SetTransferInfo(pTfr);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   672
        if (pEndpoint->iDmaBuffers->IsReaderEmpty())
089413cdde3c 201028_02
hgs
parents:
diff changeset
   673
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   674
            pEndpoint->SetClientReadPending(ETrue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   675
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   676
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   677
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   678
            if (pTfr->iTransferType == ETransferTypeReadPacket)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   679
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   680
                __KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read packet: data available complete"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   681
                r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   682
                aNeedsCompletion = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   683
                break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   684
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   685
            else if (pTfr->iTransferType == ETransferTypeReadData)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   686
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   687
                if (pTfr->iTransferSize <= pEndpoint->RxBytesAvailable())
089413cdde3c 201028_02
hgs
parents:
diff changeset
   688
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   689
                    __KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read data: data available complete"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   690
                    r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   691
                    aNeedsCompletion = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   692
                    break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   693
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   694
                else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   695
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   696
                    pEndpoint->SetClientReadPending(ETrue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   697
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   698
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   699
            else if (pTfr->iTransferType == ETransferTypeReadOneOrMore)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   700
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   701
                if (pEndpoint->RxBytesAvailable() > 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   702
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   703
                    __KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read data: data available complete"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   704
                    r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   705
                    aNeedsCompletion = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   706
                    break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   707
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   708
                else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   709
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   710
                    pEndpoint->SetClientReadPending(ETrue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   711
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   712
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   713
            else if (pTfr->iTransferType == ETransferTypeReadUntilShort)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   714
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   715
                TInt nRx = pEndpoint->RxBytesAvailable();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   716
                TInt maxPacketSize = pEndpoint->EndpointInfo()->iSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   717
                if( (pTfr->iTransferSize <= nRx) ||
089413cdde3c 201028_02
hgs
parents:
diff changeset
   718
                    (nRx < maxPacketSize) ||
089413cdde3c 201028_02
hgs
parents:
diff changeset
   719
                    pEndpoint->iDmaBuffers->ShortPacketExists())
089413cdde3c 201028_02
hgs
parents:
diff changeset
   720
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   721
                    __KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read data: data available complete"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   722
                    r = pEndpoint->CopyToClient(iClient,iClientAsynchNotify[aEndpointNum]->iClientBuffer);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   723
                    aNeedsCompletion = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   724
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   725
                else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   726
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   727
                    pEndpoint->SetClientReadPending(ETrue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   728
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   729
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   730
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   731
        r = pEndpoint->TryToStartRead(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   732
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   733
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   734
            __KTRACE_OPT(KUSB, Kern::Printf("DoRequest Read: couldn't start read"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   735
            r = KErrNone;                                    // Reader full isn't a userside error;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   736
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   737
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   738
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   739
089413cdde3c 201028_02
hgs
parents:
diff changeset
   740
    case ETransferTypeWrite:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   741
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   742
        __KTRACE_OPT(KUSB, Kern::Printf("DoRequest Write 1"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   743
        if (pEndpointInfo->iDir != UsbShai::KUsbEpDirIn &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
   744
            pEndpointInfo->iDir != UsbShai::KUsbEpDirBidirect)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   745
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   746
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Write: wrong direction complete"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   747
            r = KErrUsbEpBadDirection;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   748
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   749
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   750
        __KTRACE_OPT(KUSB, Kern::Printf("DoRequest Write 2"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   751
089413cdde3c 201028_02
hgs
parents:
diff changeset
   752
089413cdde3c 201028_02
hgs
parents:
diff changeset
   753
        TInt desLength=iClientAsynchNotify[aEndpointNum]->iClientBuffer->Length();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   754
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   755
        if (desLength < pTfr->iTransferSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   756
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   757
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Write: user buffer too short"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   758
            r = KErrUsbTransferSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   759
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   760
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   761
089413cdde3c 201028_02
hgs
parents:
diff changeset
   762
        __KTRACE_OPT(KUSB, Kern::Printf("DoRequest Write 3 length=%d maxlength=%d",
089413cdde3c 201028_02
hgs
parents:
diff changeset
   763
                                        pTfr->iTransferSize, desLength));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   764
        // Zero length writes are acceptable
089413cdde3c 201028_02
hgs
parents:
diff changeset
   765
        pEndpoint->SetClientWritePending(ETrue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   766
        r = pEndpoint->TryToStartWrite(pTfr);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   767
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   768
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   769
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoRequest Write: couldn't start write"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   770
            pEndpoint->SetClientWritePending(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   771
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   772
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   773
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   774
089413cdde3c 201028_02
hgs
parents:
diff changeset
   775
    default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   776
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: DoTransferAsyncReq: pTfr->iTransferType = %d not supported",
089413cdde3c 201028_02
hgs
parents:
diff changeset
   777
                                          pTfr->iTransferType));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   778
        r = KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   779
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   780
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   781
 exit:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   782
    aNeedsCompletion = aNeedsCompletion || (r != KErrNone);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   783
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   784
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   785
089413cdde3c 201028_02
hgs
parents:
diff changeset
   786
089413cdde3c 201028_02
hgs
parents:
diff changeset
   787
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   788
// Cancel an outstanding request - overriding pure virtual
089413cdde3c 201028_02
hgs
parents:
diff changeset
   789
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   790
TInt DLddUsbcChannel::DoCancel(TInt aReqNo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   791
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   792
    TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   793
    __KTRACE_OPT(KUSB, Kern::Printf("DoCancel: 0x%x", aReqNo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   794
    if (aReqNo <= iNumberOfEndpoints)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   795
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   796
        __KTRACE_OPT(KUSB, Kern::Printf("DoCancel endpoint: 0x%x", aReqNo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   797
        iEndpoint[aReqNo]->CancelTransfer(iClient,iClientAsynchNotify[aReqNo]->iClientBuffer);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   798
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   799
    else if (aReqNo == RDevUsbcClient::ERequestAlternateDeviceStatusNotify)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   800
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   801
        __KTRACE_OPT(KUSB, Kern::Printf("DoCancel: ERequestAlternateDeviceStatusNotify 0x%x", aReqNo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   802
        iDeviceStatusNeeded = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   803
        iStatusFifo->FlushQueue();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   804
        if (iStatusChangePtr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   805
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   806
            iStatusChangeReq->Data()=iController->GetDeviceStatus();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   807
            iStatusChangePtr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   808
089413cdde3c 201028_02
hgs
parents:
diff changeset
   809
            if (iStatusChangeReq->IsReady())
089413cdde3c 201028_02
hgs
parents:
diff changeset
   810
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   811
                iRequestStatus[aReqNo] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   812
                Kern::QueueRequestComplete(iClient, iStatusChangeReq, KErrCancel);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   813
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   814
                return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   815
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   816
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   817
    else if (aReqNo == RDevUsbcClient::ERequestReEnumerate)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   818
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   819
        __KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestReEnumerate: 0x%x", aReqNo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   820
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   821
    else if (aReqNo == RDevUsbcClient::ERequestEndpointStatusNotify)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   822
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   823
        __KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestEndpointStatusNotify: 0x%x", aReqNo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   824
        CancelNotifyEndpointStatus();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   825
        if (iEndpointStatusChangeReq->IsReady())
089413cdde3c 201028_02
hgs
parents:
diff changeset
   826
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   827
            iRequestStatus[aReqNo] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   828
            Kern::QueueRequestComplete(iClient, iEndpointStatusChangeReq, KErrCancel);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   829
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   830
        return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   831
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   832
    else if (aReqNo == RDevUsbcClient::ERequestOtgFeaturesNotify)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   833
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   834
        __KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestOtgFeaturesNotify: 0x%x", aReqNo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   835
        CancelNotifyOtgFeatures();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   836
        if (iOtgFeatureChangeReq->IsReady())
089413cdde3c 201028_02
hgs
parents:
diff changeset
   837
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   838
            iRequestStatus[aReqNo] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   839
            Kern::QueueRequestComplete(iClient, iOtgFeatureChangeReq, KErrCancel);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   840
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   841
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   842
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   843
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   844
        __KTRACE_OPT(KUSB, Kern::Printf("DoCancel Unknown! 0x%x", aReqNo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   845
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   846
089413cdde3c 201028_02
hgs
parents:
diff changeset
   847
        if (r == KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   848
            r = KErrCancel;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   849
089413cdde3c 201028_02
hgs
parents:
diff changeset
   850
        CompleteBufferRequest(iClient, aReqNo, r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   851
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   852
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   853
089413cdde3c 201028_02
hgs
parents:
diff changeset
   854
089413cdde3c 201028_02
hgs
parents:
diff changeset
   855
void DLddUsbcChannel::CancelNotifyEndpointStatus()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   856
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   857
    if (iEndpointStatusChangePtr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   858
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   859
        TUint epBitmap = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   860
        for (TInt i = 0; i <= iNumberOfEndpoints; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   861
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   862
            TInt v = iController->GetEndpointStatus(this, iEndpoint[i]->RealEpNumber());
089413cdde3c 201028_02
hgs
parents:
diff changeset
   863
            TUint b;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   864
            (v == EEndpointStateStalled) ? b = 1 : b = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   865
            epBitmap |= b << i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   866
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   867
        iEndpointStatusChangeReq->Data()=epBitmap;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   868
        iEndpointStatusChangePtr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   869
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   870
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   871
089413cdde3c 201028_02
hgs
parents:
diff changeset
   872
089413cdde3c 201028_02
hgs
parents:
diff changeset
   873
void DLddUsbcChannel::CancelNotifyOtgFeatures()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   874
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   875
    if (iOtgFeatureChangePtr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   876
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   877
        TUint8 features;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   878
        iController->GetCurrentOtgFeatures(features);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   879
     iOtgFeatureChangeReq->Data()=features;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   880
        iOtgFeatureChangePtr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   881
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   882
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   883
089413cdde3c 201028_02
hgs
parents:
diff changeset
   884
TInt DLddUsbcChannel::PinMemory(TDesC8 *aDes, TVirtualPinObject *aPinObj)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   885
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   886
    TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   887
    TInt  len,mlen;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   888
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   889
    const TUint8*p = Kern::KUDesInfo(*aDes, len,mlen);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   890
    r=Kern::PinVirtualMemory(aPinObj, (TLinAddr) p, len);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   891
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   892
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   893
089413cdde3c 201028_02
hgs
parents:
diff changeset
   894
//Called in Client thread context
089413cdde3c 201028_02
hgs
parents:
diff changeset
   895
TInt DLddUsbcChannel::SendControl(TMessageBase* aMsg)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   896
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   897
    TThreadMessage& m=*(TThreadMessage*)aMsg;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   898
    const TInt fn=m.iValue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   899
    TAny *const a1=m.Ptr0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   900
    TAny *const a2=m.Ptr1();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   901
    TInt  kern_param;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   902
    TEndpointDescriptorInfo epi;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   903
    TUsbcIfcInfo ifc;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   904
    TCSDescriptorInfo desInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   905
    TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   906
089413cdde3c 201028_02
hgs
parents:
diff changeset
   907
    switch (fn)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   908
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   909
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
   910
    case RDevUsbcClient::EControlDeviceStatus:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   911
    case RDevUsbcClient::EControlGetAlternateSetting:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   912
        m.iArg[0] = &kern_param;              // update message to point to kernel-side buffer
089413cdde3c 201028_02
hgs
parents:
diff changeset
   913
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   914
089413cdde3c 201028_02
hgs
parents:
diff changeset
   915
    case RDevUsbcClient::EControlQueryReceiveBuffer:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   916
    case RDevUsbcClient::EControlEndpointStatus:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   917
        m.iArg[1] = &kern_param;              // update message to point to kernel-side buffer
089413cdde3c 201028_02
hgs
parents:
diff changeset
   918
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   919
089413cdde3c 201028_02
hgs
parents:
diff changeset
   920
    case RDevUsbcClient::EControlEndpointCaps:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   921
    case RDevUsbcClient::EControlDeviceCaps:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   922
    case RDevUsbcClient::EControlGetDeviceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   923
    case RDevUsbcClient::EControlSetDeviceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   924
    case RDevUsbcClient::EControlGetDeviceDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   925
    case RDevUsbcClient::EControlGetConfigurationDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   926
    case RDevUsbcClient::EControlGetConfigurationDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   927
    case RDevUsbcClient::EControlGetDeviceQualifierDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   928
    case RDevUsbcClient::EControlSetDeviceQualifierDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   929
    case RDevUsbcClient::EControlGetOtherSpeedConfigurationDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   930
    case RDevUsbcClient::EControlSetOtherSpeedConfigurationDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   931
    case RDevUsbcClient::EControlGetStringDescriptorLangId:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   932
    case RDevUsbcClient::EControlGetManufacturerStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   933
    case RDevUsbcClient::EControlSetManufacturerStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   934
    case RDevUsbcClient::EControlGetProductStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   935
    case RDevUsbcClient::EControlSetProductStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   936
    case RDevUsbcClient::EControlGetSerialNumberStringDescriptor:    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   937
    case RDevUsbcClient::EControlSetSerialNumberStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   938
    case RDevUsbcClient::EControlGetConfigurationStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   939
    case RDevUsbcClient::EControlSetConfigurationStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   940
    case RDevUsbcClient::EControlSetOtgDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   941
    case RDevUsbcClient::EControlGetOtgDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   942
    case RDevUsbcClient::EControlGetOtgFeatures:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   943
        r=PinMemory((TDesC8 *) a1, iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   944
        if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   945
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   946
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   947
            return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   948
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   949
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   950
089413cdde3c 201028_02
hgs
parents:
diff changeset
   951
    case RDevUsbcClient::EControlGetInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   952
    case RDevUsbcClient::EControlGetInterfaceDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   953
    case RDevUsbcClient::EControlSetInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   954
    case RDevUsbcClient::EControlGetCSInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   955
    case RDevUsbcClient::EControlGetCSInterfaceDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   956
    case RDevUsbcClient::EControlGetStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   957
    case RDevUsbcClient::EControlSetStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   958
        r=PinMemory((TDesC8 *) a2, iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   959
        if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   960
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   961
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   962
            return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   963
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   964
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   965
089413cdde3c 201028_02
hgs
parents:
diff changeset
   966
    case RDevUsbcClient::EControlGetEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   967
    case RDevUsbcClient::EControlGetEndpointDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   968
    case RDevUsbcClient::EControlSetEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   969
    case RDevUsbcClient::EControlGetCSEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   970
    case RDevUsbcClient::EControlGetCSEndpointDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   971
        if(a1!=NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   972
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   973
            r=Kern::PinVirtualMemory(iPinObj1, (TLinAddr)a1, sizeof(epi));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   974
            if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   975
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   976
                PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   977
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   978
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   979
            kumemget(&epi, a1, sizeof(epi));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   980
            r=PinMemory((TDesC8 *) epi.iArg, iPinObj2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   981
            if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   982
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   983
                Kern::UnpinVirtualMemory(iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   984
                PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   985
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   986
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   987
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   988
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   989
089413cdde3c 201028_02
hgs
parents:
diff changeset
   990
    case RDevUsbcClient::EControlSetInterface:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   991
        if(a2!=NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   992
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   993
            r=Kern::PinVirtualMemory(iPinObj1, (TLinAddr)a2, sizeof(ifc));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   994
            if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   995
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   996
                PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   997
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   998
                }    
089413cdde3c 201028_02
hgs
parents:
diff changeset
   999
            kumemget(&ifc, a2, sizeof(ifc));                
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1000
            r=PinMemory((TDesC8 *) ifc.iInterfaceData, iPinObj2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1001
            if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1002
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1003
                Kern::UnpinVirtualMemory(iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1004
                PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1005
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1006
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1007
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1008
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1009
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1010
    case RDevUsbcClient::EControlSetCSInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1011
    case RDevUsbcClient::EControlSetCSEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1012
        if(a1!=NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1013
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1014
            r=Kern::PinVirtualMemory(iPinObj1, (TLinAddr)a1, sizeof(desInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1015
            if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1016
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1017
                PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1018
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1019
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1020
            kumemget(&desInfo, a1, sizeof(desInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1021
            r=PinMemory((TDesC8 *) desInfo.iArg, iPinObj2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1022
            if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1023
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1024
                Kern::UnpinVirtualMemory(iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1025
                PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1026
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1027
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1028
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1029
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1030
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1031
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1032
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1033
    //Send Message and wait for synchronous complete    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1034
    r = DLogicalChannel::SendMsg(aMsg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1035
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1036
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1037
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1038
    switch (fn)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1039
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1040
    case RDevUsbcClient::EControlDeviceStatus:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1041
    case RDevUsbcClient::EControlGetAlternateSetting:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1042
        umemput32(a1, &kern_param, sizeof(kern_param));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1043
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1044
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1045
    case RDevUsbcClient::EControlQueryReceiveBuffer:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1046
    case RDevUsbcClient::EControlEndpointStatus:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1047
        umemput32(a2, &kern_param, sizeof(kern_param));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1048
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1049
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1050
    case RDevUsbcClient::EControlDeviceCaps:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1051
    case RDevUsbcClient::EControlEndpointCaps:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1052
    case RDevUsbcClient::EControlGetDeviceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1053
    case RDevUsbcClient::EControlSetDeviceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1054
    case RDevUsbcClient::EControlGetDeviceDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1055
    case RDevUsbcClient::EControlGetConfigurationDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1056
    case RDevUsbcClient::EControlGetConfigurationDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1057
    case RDevUsbcClient::EControlGetDeviceQualifierDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1058
    case RDevUsbcClient::EControlSetDeviceQualifierDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1059
    case RDevUsbcClient::EControlGetOtherSpeedConfigurationDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1060
    case RDevUsbcClient::EControlSetOtherSpeedConfigurationDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1061
    case RDevUsbcClient::EControlGetStringDescriptorLangId:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1062
    case RDevUsbcClient::EControlGetManufacturerStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1063
    case RDevUsbcClient::EControlSetManufacturerStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1064
    case RDevUsbcClient::EControlGetProductStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1065
    case RDevUsbcClient::EControlSetProductStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1066
    case RDevUsbcClient::EControlGetSerialNumberStringDescriptor:    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1067
    case RDevUsbcClient::EControlSetSerialNumberStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1068
    case RDevUsbcClient::EControlGetConfigurationStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1069
    case RDevUsbcClient::EControlSetConfigurationStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1070
    case RDevUsbcClient::EControlSetOtgDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1071
    case RDevUsbcClient::EControlGetOtgDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1072
    case RDevUsbcClient::EControlGetOtgFeatures:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1073
        if(a1!=NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1074
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1075
            Kern::UnpinVirtualMemory(iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1076
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1077
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1078
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1079
    case RDevUsbcClient::EControlGetInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1080
    case RDevUsbcClient::EControlGetInterfaceDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1081
    case RDevUsbcClient::EControlSetInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1082
    case RDevUsbcClient::EControlGetCSInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1083
    case RDevUsbcClient::EControlGetCSInterfaceDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1084
    case RDevUsbcClient::EControlGetStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1085
    case RDevUsbcClient::EControlSetStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1086
        if(a2!=NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1087
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1088
            Kern::UnpinVirtualMemory(iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1089
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1090
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1091
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1092
    case RDevUsbcClient::EControlGetEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1093
    case RDevUsbcClient::EControlGetEndpointDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1094
    case RDevUsbcClient::EControlSetEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1095
    case RDevUsbcClient::EControlGetCSEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1096
    case RDevUsbcClient::EControlGetCSEndpointDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1097
    case RDevUsbcClient::EControlSetCSInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1098
    case RDevUsbcClient::EControlSetCSEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1099
        if(a1!=NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1100
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1101
            Kern::UnpinVirtualMemory(iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1102
            Kern::UnpinVirtualMemory(iPinObj2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1103
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1104
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1105
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1106
    case RDevUsbcClient::EControlSetInterface:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1107
        if(a2!=NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1108
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1109
            Kern::UnpinVirtualMemory(iPinObj1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1110
            Kern::UnpinVirtualMemory(iPinObj2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1111
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1112
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1113
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1114
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1115
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1116
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1117
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1118
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1119
TInt DLddUsbcChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1120
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1121
    __KTRACE_OPT(KUSB, Kern::Printf("DoControl: %d", aFunction));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1122
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1123
    TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1124
    TInt ep;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1125
    TUsbcEndpoint* pEndpoint;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1126
    TPtrC8 pZeroDesc(NULL, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1127
    TEndpointDescriptorInfo epInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1128
    TUsbcIfcInfo ifcInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1129
    TCSDescriptorInfo desInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1130
    TUsbcEndpointResource epRes;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1131
    TInt bandwidthPriority;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1132
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1133
    switch (aFunction)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1134
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1135
    case RDevUsbcClient::EControlEndpointZeroRequestError:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1136
        __KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointZeroRequestError"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1137
        r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1138
        if (iOwnsDeviceControl || (iValidInterface && iDeviceState == UsbShai::EUsbPeripheralStateConfigured))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1139
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1140
            iController->Ep0Stall(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1141
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1142
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1143
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1144
            if (iDeviceState != UsbShai::EUsbPeripheralStateConfigured)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1145
                r = KErrUsbDeviceNotConfigured;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1146
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1147
                r = KErrUsbInterfaceNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1148
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1149
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1150
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1151
    case RDevUsbcClient::EControlGetAlternateSetting:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1152
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetAlternateSetting"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1153
        if (iValidInterface && iDeviceState == UsbShai::EUsbPeripheralStateConfigured)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1154
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1155
            r = iController->GetInterfaceNumber(this, *(TInt*)a1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1156
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1157
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1158
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1159
            if (iDeviceState != UsbShai::EUsbPeripheralStateConfigured)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1160
                r = KErrUsbDeviceNotConfigured;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1161
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1162
                r = KErrUsbInterfaceNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1163
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1164
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1165
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1166
    case RDevUsbcClient::EControlDeviceStatus:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1167
        __KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceStatus"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1168
        *(TInt*)a1 = iController->GetDeviceStatus();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1169
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1170
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1171
    case RDevUsbcClient::EControlEndpointStatus:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1172
        __KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointStatus"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1173
        if (iValidInterface && ValidEndpoint((TInt) a1))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1174
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1175
            pEndpoint = iEndpoint[(TInt)a1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1176
            if (pEndpoint == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1177
                r = KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1178
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1179
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1180
                *(TInt*)a2 = iController->GetEndpointStatus(this, iEndpoint[(TInt)a1]->RealEpNumber());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1181
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1182
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1183
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1184
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1185
            if (iDeviceState != UsbShai::EUsbPeripheralStateConfigured)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1186
                r = KErrUsbDeviceNotConfigured;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1187
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1188
                r = KErrUsbInterfaceNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1189
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1190
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1191
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1192
    case RDevUsbcClient::EControlQueryReceiveBuffer:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1193
        __KTRACE_OPT(KUSB, Kern::Printf("EControlQueryReceiveBuffer"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1194
        if (iValidInterface && ValidEndpoint((TInt) a1))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1195
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1196
            pEndpoint=iEndpoint[(TInt) a1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1197
            if (pEndpoint == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1198
                r = KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1199
            else if (pEndpoint->EndpointInfo()->iDir != UsbShai::KUsbEpDirIn)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1200
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1201
                __KTRACE_OPT(KUSB, Kern::Printf("  bytes = %d", pEndpoint->RxBytesAvailable()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1202
                *(TInt*)a2 = pEndpoint->RxBytesAvailable();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1203
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1204
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1205
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1206
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1207
            if (iDeviceState != UsbShai::EUsbPeripheralStateConfigured)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1208
                r = KErrUsbDeviceNotConfigured;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1209
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1210
                r = KErrUsbInterfaceNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1211
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1212
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1213
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1214
    case RDevUsbcClient::EControlEndpointCaps:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1215
        __KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointCaps"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1216
        r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1217
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1218
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1219
        iController->EndpointCaps(this, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1220
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1221
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1222
    case RDevUsbcClient::EControlDeviceCaps:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1223
        __KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceCaps"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1224
        r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1225
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1226
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1227
        iController->DeviceCaps(this, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1228
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1229
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1230
    case RDevUsbcClient::EControlSendEp0StatusPacket:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1231
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSendEp0StatusPacket"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1232
        iController->SendEp0StatusPacket(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1233
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1234
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1235
    case RDevUsbcClient::EControlHaltEndpoint:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1236
        __KTRACE_OPT(KUSB, Kern::Printf("EControlHaltEndpoint"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1237
        if (iValidInterface && ValidEndpoint((TInt) a1))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1238
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1239
            r = iController->HaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1240
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1241
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1242
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1243
            if (iDeviceState != UsbShai::EUsbPeripheralStateConfigured)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1244
                r = KErrUsbDeviceNotConfigured;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1245
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1246
                r = KErrUsbInterfaceNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1247
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1248
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1249
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1250
    case RDevUsbcClient::EControlClearHaltEndpoint:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1251
        __KTRACE_OPT(KUSB, Kern::Printf("EControlClearHaltEndpoint"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1252
        if (iValidInterface && ValidEndpoint((TInt) a1))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1253
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1254
            r = iController->ClearHaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1255
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1256
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1257
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1258
            if (iDeviceState != UsbShai::EUsbPeripheralStateConfigured)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1259
                r = KErrUsbDeviceNotConfigured;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1260
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1261
                r = KErrUsbInterfaceNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1262
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1263
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1264
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1265
    case RDevUsbcClient::EControlDumpRegisters:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1266
        __KTRACE_OPT(KUSB, Kern::Printf("EControlDumpRegisters"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1267
        iController->DumpRegisters();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1268
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1269
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1270
    case RDevUsbcClient::EControlReleaseDeviceControl:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1271
        __KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseDeviceControl"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1272
        iController->ReleaseDeviceControl(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1273
        iOwnsDeviceControl = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1274
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1275
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1276
    case RDevUsbcClient::EControlEndpointZeroMaxPacketSizes:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1277
        __KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointZeroMaxPacketSizes"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1278
        r = iController->EndpointZeroMaxPacketSizes();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1279
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1280
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1281
    case RDevUsbcClient::EControlSetEndpointZeroMaxPacketSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1282
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetEndpointZeroMaxPacketSize"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1283
        r = iController->SetEndpointZeroMaxPacketSize(reinterpret_cast<TInt>(a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1284
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1285
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1286
    case RDevUsbcClient::EControlGetEndpointZeroMaxPacketSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1287
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointZeroMaxPacketSize"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1288
        r = iController->Ep0PacketSize();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1289
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1290
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1291
    case RDevUsbcClient::EControlGetDeviceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1292
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1293
        r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1294
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1295
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1296
        r = iController->GetDeviceDescriptor(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1297
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1298
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1299
    case RDevUsbcClient::EControlSetDeviceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1300
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1301
        if (a1 != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1302
            r = iController->SetDeviceDescriptor(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1303
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1304
            r = KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1305
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1306
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1307
    case RDevUsbcClient::EControlGetDeviceDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1308
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceDescriptorSize"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1309
        if (a1 != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1310
            r = iController->GetDeviceDescriptorSize(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1311
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1312
            r = KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1313
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1314
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1315
    case RDevUsbcClient::EControlGetConfigurationDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1316
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1317
        r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1318
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1319
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1320
        r = iController->GetConfigurationDescriptor(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1321
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1322
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1323
    case RDevUsbcClient::EControlGetConfigurationDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1324
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationDescriptorSize"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1325
        if (a1 != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1326
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1327
            r = iController->GetConfigurationDescriptorSize(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1328
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1329
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1330
            r = KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1331
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1332
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1333
    case RDevUsbcClient::EControlSetConfigurationDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1334
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetConfigurationDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1335
        r = iController->SetConfigurationDescriptor(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1336
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1337
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1338
    case RDevUsbcClient::EControlGetInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1339
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetInterfaceDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1340
        r = iController->GetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1341
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1342
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1343
    case RDevUsbcClient::EControlGetInterfaceDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1344
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetInterfaceDescriptorSize"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1345
        r = iController->GetInterfaceDescriptorSize(iClient, this, (TInt) a1, *(TDes8*) a2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1346
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1347
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1348
    case RDevUsbcClient::EControlSetInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1349
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetInterfaceDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1350
        r = iController->SetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1351
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1352
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1353
    case RDevUsbcClient::EControlGetEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1354
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1355
        r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1356
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1357
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1358
        ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1359
        r = iController->GetEndpointDescriptor(iClient, this, epInfo.iSetting,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1360
                                               ep, *(TDes8*) epInfo.iArg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1361
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1362
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1363
    case RDevUsbcClient::EControlGetEndpointDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1364
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointDescriptorSize"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1365
        r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1366
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1367
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1368
        ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1369
        r = iController->GetEndpointDescriptorSize(iClient, this, epInfo.iSetting,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1370
                                                   ep, *(TDes8*) epInfo.iArg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1371
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1372
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1373
    case RDevUsbcClient::EControlSetEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1374
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetEndpointDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1375
        r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1376
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1377
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1378
        ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1379
        r = iController->SetEndpointDescriptor(iClient, this, epInfo.iSetting,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1380
                                               ep, *(TDes8*)epInfo.iArg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1381
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1382
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1383
    case RDevUsbcClient::EControlGetDeviceQualifierDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1384
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceQualifierDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1385
        r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1386
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1387
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1388
        r = iController->GetDeviceQualifierDescriptor(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1389
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1390
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1391
    case RDevUsbcClient::EControlSetDeviceQualifierDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1392
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceQualifierDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1393
        if (a1 != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1394
            r = iController->SetDeviceQualifierDescriptor(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1395
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1396
            r = KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1397
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1398
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1399
    case RDevUsbcClient::EControlGetOtherSpeedConfigurationDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1400
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetOtherSpeedConfigurationDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1401
        r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1402
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1403
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1404
        r = iController->GetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1405
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1406
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1407
    case RDevUsbcClient::EControlSetOtherSpeedConfigurationDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1408
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetOtherSpeedConfigurationDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1409
        r = iController->SetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1410
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1411
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1412
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1413
    case RDevUsbcClient::EControlGetCSInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1414
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSInterfaceDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1415
        r = iController->GetCSInterfaceDescriptorBlock(iClient, this, (TInt) a1, *((TDes8*) a2));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1416
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1417
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1418
    case RDevUsbcClient::EControlGetCSInterfaceDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1419
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSInterfaceDescriptorSize"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1420
        r = iController->GetCSInterfaceDescriptorBlockSize(iClient, this, (TInt) a1, *(TDes8*) a2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1421
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1422
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1423
    case RDevUsbcClient::EControlGetCSEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1424
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSEndpointDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1425
        r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1426
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1427
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1428
        ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1429
        r = iController->GetCSEndpointDescriptorBlock(iClient, this, epInfo.iSetting,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1430
                                                      ep, *(TDes8*) epInfo.iArg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1431
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1432
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1433
    case RDevUsbcClient::EControlGetCSEndpointDescriptorSize:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1434
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSEndpointDescriptorSize"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1435
        r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1436
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1437
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1438
        ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1439
        r = iController->GetCSEndpointDescriptorBlockSize(iClient, this, epInfo.iSetting,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1440
                                                          ep, *(TDes8*) epInfo.iArg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1441
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1442
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1443
    case RDevUsbcClient::EControlSignalRemoteWakeup:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1444
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSignalRemoteWakeup"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1445
        r = iController->SignalRemoteWakeup();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1446
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1447
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1448
    case RDevUsbcClient::EControlDeviceDisconnectFromHost:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1449
        __KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceDisconnectFromHost"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1450
        r = iController->UsbDisconnect();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1451
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1452
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1453
    case RDevUsbcClient::EControlDeviceConnectToHost:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1454
        __KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceConnectToHost"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1455
        r = iController->UsbConnect();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1456
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1457
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1458
    case RDevUsbcClient::EControlDevicePowerUpUdc:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1459
        __KTRACE_OPT(KUSB, Kern::Printf("EControlDevicePowerUpUdc"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1460
        r = iController->PowerUpUdc();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1461
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1462
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1463
    case RDevUsbcClient::EControlSetDeviceControl:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1464
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceControl"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1465
        r = iController->SetDeviceControl(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1466
        if (r == KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1467
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1468
            iOwnsDeviceControl = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1469
            if (iEndpoint[0] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1470
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1471
                __KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceControl 11"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1472
                r = SetupEp0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1473
                if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1474
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1475
                    __KTRACE_OPT(KPANIC, Kern::Printf("  Error: SetupEp0() failed"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1476
                    iController->ReleaseDeviceControl(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1477
                    DestroyEp0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1478
                    iOwnsDeviceControl = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1479
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1480
                iEndpoint[0]->TryToStartRead(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1481
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1482
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1483
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1484
            r = KErrInUse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1485
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1486
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1487
    case RDevUsbcClient::EControlCurrentlyUsingHighSpeed:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1488
        __KTRACE_OPT(KUSB, Kern::Printf("EControlCurrentlyUsingHighSpeed"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1489
        r = iController->CurrentlyUsingHighSpeed();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1490
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1491
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1492
    case RDevUsbcClient::EControlSetInterface:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1493
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetInterface"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1494
        r = Kern::ThreadRawRead(iClient, a2, &ifcInfo, sizeof(ifcInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1495
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1496
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1497
        if (iValidInterface && (iDeviceState == UsbShai::EUsbPeripheralStateConfigured))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1498
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1499
            r = KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1500
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1501
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1502
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1503
            bandwidthPriority = ifcInfo.iBandwidthPriority;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1504
            if ((bandwidthPriority & 0xffffff00) ||
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1505
                ((bandwidthPriority & 0x0f) >= KUsbcDmaBufMaxPriorities) ||
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1506
                (((bandwidthPriority >> 4) & 0x0f) >= KUsbcDmaBufMaxPriorities))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1507
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1508
                r = KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1509
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1510
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1511
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1512
                r = SetInterface((TInt) a1, &ifcInfo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1513
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1514
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1515
            
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1516
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1517
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1518
    case RDevUsbcClient::EControlReleaseInterface:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1519
        __KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseInterface"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1520
        r = iController->ReleaseInterface(this, (TInt) a1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1521
        if (r == KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1522
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1523
            DestroyInterface((TUint) a1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1524
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1525
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1526
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1527
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error in PIL: LDD interface won't be released."));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1528
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1529
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1530
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1531
    case RDevUsbcClient::EControlSetCSInterfaceDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1532
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetCSInterfaceDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1533
        r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1534
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1535
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1536
        r = iController->SetCSInterfaceDescriptorBlock(iClient, this, desInfo.iSetting,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1537
                                                       *reinterpret_cast<const TDes8*>(desInfo.iArg),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1538
                                                       desInfo.iSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1539
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1540
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1541
    case RDevUsbcClient::EControlSetCSEndpointDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1542
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetCSEndpointDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1543
        r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1544
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1545
            PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1546
        ep = EpFromAlternateSetting(desInfo.iSetting, desInfo.iEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1547
        r = iController->SetCSEndpointDescriptorBlock(iClient, this, desInfo.iSetting, ep,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1548
                                                      *reinterpret_cast<const TDes8*>(desInfo.iArg),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1549
                                                      desInfo.iSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1550
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1551
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1552
    case RDevUsbcClient::EControlGetStringDescriptorLangId:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1553
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetStringDescriptorLangId"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1554
        r = iController->GetStringDescriptorLangId(iClient, *((TDes8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1555
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1556
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1557
    case RDevUsbcClient::EControlSetStringDescriptorLangId:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1558
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetStringDescriptorLangId"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1559
        r = iController->SetStringDescriptorLangId(reinterpret_cast<TUint>(a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1560
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1561
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1562
    case RDevUsbcClient::EControlGetManufacturerStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1563
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetManufacturerStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1564
        r = iController->GetManufacturerStringDescriptor(iClient, *((TPtr8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1565
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1566
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1567
    case RDevUsbcClient::EControlSetManufacturerStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1568
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetManufacturerStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1569
        r = iController->SetManufacturerStringDescriptor(iClient, *((TPtr8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1570
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1571
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1572
    case RDevUsbcClient::EControlRemoveManufacturerStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1573
        __KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveManufacturerStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1574
        r = iController->RemoveManufacturerStringDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1575
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1576
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1577
    case RDevUsbcClient::EControlGetProductStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1578
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetProductStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1579
        r = iController->GetProductStringDescriptor(iClient, *((TPtr8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1580
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1581
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1582
    case RDevUsbcClient::EControlSetProductStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1583
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetProductStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1584
        r = iController->SetProductStringDescriptor(iClient, *((TPtr8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1585
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1586
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1587
    case RDevUsbcClient::EControlRemoveProductStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1588
        __KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveProductStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1589
        r = iController->RemoveProductStringDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1590
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1591
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1592
    case RDevUsbcClient::EControlGetSerialNumberStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1593
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetSerialNumberStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1594
        r = iController->GetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1595
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1596
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1597
    case RDevUsbcClient::EControlSetSerialNumberStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1598
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetSerialNumberStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1599
        r = iController->SetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1600
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1601
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1602
    case RDevUsbcClient::EControlRemoveSerialNumberStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1603
        __KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveSerialNumberStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1604
        r = iController->RemoveSerialNumberStringDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1605
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1606
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1607
    case RDevUsbcClient::EControlGetConfigurationStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1608
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1609
        r = iController->GetConfigurationStringDescriptor(iClient, *((TPtr8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1610
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1611
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1612
    case RDevUsbcClient::EControlSetConfigurationStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1613
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetConfigurationStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1614
        r = iController->SetConfigurationStringDescriptor(iClient, *((TPtr8*) a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1615
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1616
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1617
    case RDevUsbcClient::EControlRemoveConfigurationStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1618
        __KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveConfigurationStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1619
        r = iController->RemoveConfigurationStringDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1620
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1621
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1622
    case RDevUsbcClient::EControlGetStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1623
        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1624
        r = iController->GetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1625
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1626
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1627
    case RDevUsbcClient::EControlSetStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1628
        __KTRACE_OPT(KUSB, Kern::Printf("EControlSetStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1629
        r = iController->SetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1630
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1631
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1632
    case RDevUsbcClient::EControlRemoveStringDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1633
        __KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveStringDescriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1634
        r = iController->RemoveStringDescriptor((TUint8) (TInt) a1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1635
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1636
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1637
    case RDevUsbcClient::EControlQueryEndpointResourceUse:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1638
        epRes = (TUsbcEndpointResource)((TInt) a2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1639
        if (!ValidEndpoint((TInt)a1))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1640
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1641
            r = KErrUsbEpNotInInterface;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1642
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1643
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1644
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1645
            r = iController->QueryEndpointResource(this, iEndpoint[(TInt)a1]->RealEpNumber(), epRes);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1646
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1647
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1648
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1649
    case RDevUsbcClient::EControlSetOtgDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1650
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1651
        r = iController->SetOtgDescriptor(iClient, *((const TDesC8*)a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1652
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1653
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1654
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1655
    case RDevUsbcClient::EControlGetOtgDescriptor:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1656
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1657
        r = iController->GetOtgDescriptor(iClient, *((TDes8*)a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1658
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1659
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1660
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1661
    case RDevUsbcClient::EControlGetOtgFeatures:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1662
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1663
        r = iController->GetOtgFeatures(iClient, *((TDes8*)a1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1664
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1665
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1666
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1667
    default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1668
        __KTRACE_OPT(KUSB, Kern::Printf("Function code not supported"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1669
        r = KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1670
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1671
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1672
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1673
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1674
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1675
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1676
TInt DLddUsbcChannel::SetInterface(TInt aInterfaceNumber, TUsbcIfcInfo* aInfoBuf)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1677
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1678
    TUsbcInterfaceInfoBuf ifc_info_buf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1679
    TUsbcInterfaceInfoBuf* const ifc_info_buf_ptr = aInfoBuf->iInterfaceData;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1680
    const TInt srcLen = Kern::ThreadGetDesLength(iClient, ifc_info_buf_ptr);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1681
    if (srcLen < ifc_info_buf.Length())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1682
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1683
        __KTRACE_OPT(KUSB, Kern::Printf("SetInterface can't copy"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1684
        PanicClientThread(EDesOverflow);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1685
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1686
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1687
    TInt r = Kern::ThreadDesRead(iClient, ifc_info_buf_ptr, ifc_info_buf, 0, KChunkShiftBy0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1688
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1689
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1690
        __KTRACE_OPT(KUSB, Kern::Printf("SetInterface Copy failed reason=%d", r));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1691
        PanicClientThread(r);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1692
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1693
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1694
    TUsbcEndpointInfo* pEndpointData = ifc_info_buf().iEndpointData;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1695
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1696
    // If an alternate interface is being asked for then do nothing,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1697
    // just pass it down to the Controller.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1698
    const TInt num_endpoints = ifc_info_buf().iTotalEndpointsUsed;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1699
    __KTRACE_OPT(KUSB, Kern::Printf("SetInterface num_endpoints=%d", num_endpoints));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1700
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1701
    // [The next 4 variables have to be initialized here because of the goto's that follow.]
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1702
    // Both IN and OUT buffers will be fully cached:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1703
    const TUint32 cacheAttribs = EMapAttrSupRw | EMapAttrCachedMax;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1704
    const TUint32 bandwidthPriority = aInfoBuf->iBandwidthPriority;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1705
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1706
    // Supports ep0+5 endpoints
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1707
    TInt real_ep_numbers[6] = {-1, -1, -1, -1, -1, -1};
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1708
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1709
    // See if PIL will accept this interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1710
    __KTRACE_OPT(KUSB, Kern::Printf("SetInterface Calling controller"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1711
    r = iController->SetInterface(this,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1712
                                  iClient,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1713
                                  aInterfaceNumber,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1714
                                  ifc_info_buf().iClass,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1715
                                  aInfoBuf->iString,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1716
                                  ifc_info_buf().iTotalEndpointsUsed,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1717
                                  ifc_info_buf().iEndpointData,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1718
                                  &real_ep_numbers,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1719
                                  ifc_info_buf().iFeatureWord);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1720
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1721
    __KTRACE_OPT(KUSB, Kern::Printf("SetInterface controller returned %d", r));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1722
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1723
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1724
        __KTRACE_OPT(KPANIC, Kern::Printf("SetInterface failed reason=%d", r));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1725
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1726
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1727
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1728
    // [The next variable has to be initialized here because of the goto's that follow.]
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1729
    TUsbcAlternateSettingList* alternateSettingListRec;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1730
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1731
    // ep0
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1732
    if (iEndpoint[0] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1733
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1734
        __KTRACE_OPT(KUSB, Kern::Printf("SetInterface 11"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1735
        r = SetupEp0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1736
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1737
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1738
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: SetupEp0() failed"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1739
            DestroyEp0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1740
            goto F1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1741
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1742
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1743
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1744
    alternateSettingListRec = new TUsbcAlternateSettingList;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1745
    if (!alternateSettingListRec)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1746
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1747
        r = KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1748
        goto F1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1749
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1750
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1751
    __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcChannel::SetInterface num_endpoints=%d", num_endpoints));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1752
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1753
    // other endpoints
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1754
    // calculate the total buffer size
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1755
    for (TInt i = 1; i <= num_endpoints; i++, pEndpointData++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1756
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1757
        __KTRACE_OPT(KUSB, Kern::Printf("SetInterface for ep=%d", i));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1758
        if (!ValidateEndpoint(pEndpointData))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1759
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1760
            r = KErrUsbBadEndpoint;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1761
            goto F2;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1762
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1763
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1764
        TUsbcEndpoint* ep = new TUsbcEndpoint(this, iController, pEndpointData, i, bandwidthPriority);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1765
        alternateSettingListRec->iEndpoint[i] = ep;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1766
        if (!ep)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1767
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1768
            r = KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1769
            goto F2;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1770
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1771
        if (ep->Construct() != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1772
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1773
            r = KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1774
            goto F2;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1775
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1776
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1777
        __KTRACE_OPT(KUSB, Kern::Printf("SetInterface for ep=%d rec=0x%08x ep==0x%08x",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1778
                                        i, alternateSettingListRec, ep));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1779
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1780
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1781
    // buf size of each endpoint
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1782
    TInt bufSizes[KMaxEndpointsPerClient + 1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1783
    TInt epNum[KMaxEndpointsPerClient + 1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1784
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1785
    // init
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1786
    for( TInt i=0;i<KMaxEndpointsPerClient+1;i++ )
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1787
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1788
        bufSizes[i] = -1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1789
        epNum[i] = i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1790
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1791
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1792
    // Record the actual buf size of each endpoint
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1793
    for( TInt i=1;i<=num_endpoints;i++ )
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1794
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1795
        bufSizes[i] = alternateSettingListRec->iEndpoint[i]->BufferSize();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1796
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1797
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1798
    __KTRACE_OPT(KUSB, Kern::Printf("Sort the endpoints:"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1799
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1800
    // sort the endpoint number by the bufsize decreasely
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1801
    for( TInt i=1;i<num_endpoints;i++ )
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1802
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1803
        TInt epMaxBuf = i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1804
        for(TInt k=i+1;k<=num_endpoints;k++ )
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1805
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1806
            if( bufSizes[epMaxBuf]<bufSizes[k])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1807
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1808
                epMaxBuf = k;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1809
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1810
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1811
        TInt temp = bufSizes[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1812
        bufSizes[i] = bufSizes[epMaxBuf];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1813
        bufSizes[epMaxBuf] = temp;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1814
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1815
        temp = epNum[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1816
        epNum[i] = epNum[epMaxBuf];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1817
        epNum[epMaxBuf] = temp;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1818
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1819
        alternateSettingListRec->iEpNumDeOrderedByBufSize[i] = epNum[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1820
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1821
        __KTRACE_OPT(KUSB, Kern::Printf(" %d:%d", epNum[i], bufSizes[i]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1822
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1823
    alternateSettingListRec->iEpNumDeOrderedByBufSize[num_endpoints] = epNum[num_endpoints];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1824
    __KTRACE_OPT(KUSB, Kern::Printf(" %d:%d", epNum[num_endpoints], bufSizes[num_endpoints]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1825
    __KTRACE_OPT(KUSB, Kern::Printf("\n"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1826
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1827
    // chain in this alternate setting
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1828
    alternateSettingListRec->iNext = iAlternateSettingList;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1829
    iAlternateSettingList = alternateSettingListRec;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1830
    alternateSettingListRec->iSetting = aInterfaceNumber;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1831
    alternateSettingListRec->iNumberOfEndpoints = num_endpoints;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1832
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1833
    // Record the 'real' endpoint number used by the PDD in both the Ep and
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1834
    // the Req callback:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1835
    for (TInt i = 1; i <= num_endpoints; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1836
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1837
        alternateSettingListRec->iEndpoint[i]->SetRealEpNumber(real_ep_numbers[i]);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1838
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1839
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1840
    r = SetupInterfaceMemory(iHwChunks, cacheAttribs );
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1841
    if( r==KErrNone )
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1842
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1843
        __KTRACE_OPT(KUSB, Kern::Printf("SetInterface ready to exit"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1844
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1845
        if (aInterfaceNumber == 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1846
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1847
            // make sure we're ready to go with the main interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1848
            iValidInterface = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1849
            __KTRACE_OPT(KUSB, Kern::Printf("SetInterface SelectAlternateSetting"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1850
            SelectAlternateSetting(0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1851
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1852
        return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1853
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1854
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1855
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1856
        __KTRACE_OPT(KUSB, Kern::Printf("Destroying all interfaces"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1857
        DestroyAllInterfaces();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1858
        DestroyEp0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1859
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1860
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1861
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1862
 F2:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1863
    delete alternateSettingListRec;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1864
    //Fall through
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1865
 
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1866
 F1:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1867
#if _DEBUG
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1868
    TInt r1 = iController->ReleaseInterface(this, aInterfaceNumber);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1869
    __KTRACE_OPT(KUSB, Kern::Printf("Release Interface controller returned %d", r1));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1870
#else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1871
    (void)    iController->ReleaseInterface(this, aInterfaceNumber);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1872
#endif
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1873
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1874
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1875
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1876
// realloc the memory, and set the previous interfaces 
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1877
TInt DLddUsbcChannel::SetupInterfaceMemory(RArray<DPlatChunkHw*> &aHwChunks, 
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1878
        TUint32 aCacheAttribs )
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1879
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1880
    TUsbcAlternateSettingList* asRec = iAlternateSettingList;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1881
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1882
    // if buffers has been changed
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1883
    TBool chunkChanged = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1884
    TInt numOfEp = asRec->iNumberOfEndpoints;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1885
 
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1886
    // 1, collect all bufs' sizes for the current interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1887
    //    to realloc all the chunks
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1888
    __KTRACE_OPT(KUSB, Kern::Printf("Collect all buffer sizes:"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1889
    RArray<TInt> bufSizes;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1890
    for(TInt i=1;i<=numOfEp;i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1891
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1892
        TInt nextEp = asRec->iEpNumDeOrderedByBufSize[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1893
        TInt epBufCount = asRec->iEndpoint[nextEp]->BufferNumber();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1894
        __KTRACE_OPT(KUSB, Kern::Printf(" ep %d, buf count %d", nextEp, epBufCount ));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1895
        for(TInt k=0;k<epBufCount;k++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1896
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1897
            TInt epBufSize = asRec->iEndpoint[nextEp]->BufferSize();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1898
            TInt r = bufSizes.Append(epBufSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1899
            if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1900
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1901
                iController->DeRegisterClient(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1902
                bufSizes.Close();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1903
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1904
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1905
            __KTRACE_OPT(KUSB,Kern::Printf(" %d", epBufSize ));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1906
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1907
        __KTRACE_OPT(KUSB, Kern::Printf("\n"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1908
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1909
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1910
   
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1911
    // 2, alloc the buffer decreasely, biggest-->smallest
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1912
    //   2.1 check the existing chunks
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1913
    TInt bufCount = bufSizes.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1914
    __KTRACE_OPT(KUSB, Kern::Printf(" ep buf number needed %d", bufCount ));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1915
    __KTRACE_OPT(KUSB, Kern::Printf(" chunks available %d", aHwChunks.Count() ));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1916
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1917
    TInt chunkInd = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1918
    while( (chunkInd<aHwChunks.Count())&& (chunkInd<bufCount))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1919
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1920
        TUint8* oldAddr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1921
        oldAddr = reinterpret_cast<TUint8*>(aHwChunks[chunkInd]->LinearAddress());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1922
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1923
        DPlatChunkHw* chunk = ReAllocate(bufSizes[chunkInd], aHwChunks[chunkInd], aCacheAttribs);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1924
        if (chunk == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1925
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1926
            __KTRACE_OPT(KUSB, Kern::Printf("Failed to alloc chunks size %d!", bufSizes[chunkInd]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1927
            // lost all interfaces:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1928
            // Tell Controller to release Interface and h/w resources associated with this
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1929
            iController->DeRegisterClient(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1930
            bufSizes.Close();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1931
            return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1932
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1933
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1934
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1935
            // Parcel out the memory between endpoints
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1936
            TUint8* newAddr = reinterpret_cast<TUint8*>(chunk->LinearAddress());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1937
            __KTRACE_OPT(KUSB, Kern::Printf("SetupInterfaceMemory alloc new chunk=0x%x, size=%d", newAddr,bufSizes[chunkInd]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1938
            // The check is important to avoid chunkChanged to be corrupted.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1939
            // This code change is to fix the problem that one chunk is used by multiple interfaces.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1940
            if(!chunkChanged)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1941
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1942
                chunkChanged = (newAddr != oldAddr);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1943
                }            
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1944
            aHwChunks[chunkInd] = chunk;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1945
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1946
        chunkInd++;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1947
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1948
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1949
    //   2.2 in case available chunks are not enough
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1950
    while( chunkInd<bufCount)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1951
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1952
        DPlatChunkHw* chunk = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1953
        chunk = Allocate( bufSizes[chunkInd], aCacheAttribs);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1954
        if (chunk == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1955
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1956
            __KTRACE_OPT(KUSB, Kern::Printf("Failed to alloc chunk, size %d!", bufSizes[chunkInd]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1957
            // lost all interfaces:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1958
            // Tell Controller to release Interface and h/w resources associated with this
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1959
            iController->DeRegisterClient(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1960
            bufSizes.Close();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1961
            return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1962
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1963
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1964
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1965
            // Parcel out the memory between endpoints
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1966
            __KTRACE_OPT(KUSB, Kern::Printf("SetupInterfaceMemory alloc new chunk=0x%x, size=%d",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1967
                                    reinterpret_cast<TUint8*>(chunk->LinearAddress()), bufSizes[chunkInd]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1968
            TInt r = aHwChunks.Append(chunk);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1969
            if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1970
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1971
                ClosePhysicalChunk(chunk);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1972
                iController->DeRegisterClient(this);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1973
                bufSizes.Close();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1974
                return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1975
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1976
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1977
        chunkInd++;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1978
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1979
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1980
    // 3, Set the the bufs of the interfaces
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1981
    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1982
    ReSetInterfaceMemory(asRec, aHwChunks);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1983
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1984
    if(chunkChanged)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1985
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1986
        __KTRACE_OPT(KUSB, Kern::Printf("SetupInterfaceMemory readdressing."));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1987
        asRec = asRec->iNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1988
        while (asRec)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1989
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1990
            // Interfaces are not concurrent so they can all start at the same logical address
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1991
            __KTRACE_OPT(KUSB, Kern::Printf("SetupInterfaceMemory readdressing setting=%d", asRec->iSetting));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1992
            ReSetInterfaceMemory(asRec, aHwChunks);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1993
            asRec = asRec->iNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1994
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1995
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1996
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1997
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1998
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1999
TInt DLddUsbcChannel::SetupEp0()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2000
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2001
    __KTRACE_OPT(KUSB, Kern::Printf("SetupEp0 entry %x", this));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2002
    TInt ep0Size = iController->Ep0PacketSize();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2003
    TUsbcEndpointInfo ep0Info = TUsbcEndpointInfo(UsbShai::KUsbEpTypeControl, UsbShai::KUsbEpDirBidirect, ep0Size);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2004
    TUsbcEndpoint* ep0 = new TUsbcEndpoint(this, iController, &ep0Info, 0, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2005
    if (ep0 == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2006
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2007
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2008
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2009
    // In case we have to return early:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2010
    iEndpoint[0] = ep0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2011
    TInt r = ep0->Construct();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2012
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2013
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2014
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2015
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2016
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2017
    TInt bufferNum = ep0->BufferNumber();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2018
    TInt bufferSize = ep0->BufferSize();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2019
    TUint32 cacheAttribs = EMapAttrSupRw | EMapAttrCachedMax;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2020
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2021
    for(TInt i=0;i<bufferNum;i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2022
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2023
        DPlatChunkHw* chunk = Allocate(bufferSize, cacheAttribs );
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2024
        if(chunk==NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2025
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2026
            return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2027
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2028
        TInt r = iHwChunksEp0.Append(chunk);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2029
        if(r!=KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2030
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2031
            ClosePhysicalChunk(chunk);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2032
            return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2033
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2034
        TUint8 * buf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2035
        buf = (TUint8*) chunk->LinearAddress();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2036
        ep0->SetBufferAddr( i, buf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2037
        __KTRACE_OPT(KUSB, Kern::Printf("SetupEp0 60 buffer number %d", i));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2038
        __KTRACE_OPT(KUSB, Kern::Printf("SetupEp0 60 buffer size %d", bufferSize));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2039
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2040
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2041
    ep0->SetRealEpNumber(0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2042
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2043
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2044
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2045
// Set buffer address of the interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2046
// Precondition: Enough chunks available.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2047
void DLddUsbcChannel::ReSetInterfaceMemory(TUsbcAlternateSettingList* aAlternateSettingListRec,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2048
        RArray<DPlatChunkHw*> &aHwChunks)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2049
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2050
    TUsbcAlternateSettingList* asRec = aAlternateSettingListRec;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2051
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2052
    // set all the interfaces
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2053
    TInt chunkInd = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2054
    TInt numOfEp = asRec->iNumberOfEndpoints;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2055
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2056
    for (TInt i = 1; i <= numOfEp; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2057
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2058
        TInt nextEp = asRec->iEpNumDeOrderedByBufSize[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2059
        TInt epBufCount = asRec->iEndpoint[nextEp]->BufferNumber();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2060
        for(TInt k=0;k<epBufCount;k++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2061
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2062
            TUsbcEndpoint* ep = asRec->iEndpoint[nextEp];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2063
            if (ep != NULL )
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2064
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2065
                TUint8* pBuf = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2066
                pBuf = reinterpret_cast<TUint8*>(aHwChunks[chunkInd]->LinearAddress());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2067
                ep->SetBufferAddr( k, pBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2068
                __KTRACE_OPT(KUSB, Kern::Printf("  ep %d, buf %d, addr 0x%x", nextEp, k, pBuf ));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2069
                chunkInd++;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2070
                __ASSERT_DEBUG(chunkInd<=aHwChunks.Count(),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2071
                               Kern::Printf("  Error: available chunks %d, run out at epInd%d, bufInd%d",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2072
                                       aHwChunks.Count(), i, k));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2073
                __ASSERT_DEBUG(chunkInd<=aHwChunks.Count(),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2074
                                   Kern::Fault("usbc.ldd", __LINE__));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2075
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2076
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2077
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2078
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2079
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2080
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2081
void DLddUsbcChannel::DestroyAllInterfaces()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2082
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2083
    // Removes all interfaces
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2084
    TUsbcAlternateSettingList* alternateSettingListRec = iAlternateSettingList;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2085
    while (alternateSettingListRec)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2086
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2087
        iController->ReleaseInterface(this, alternateSettingListRec->iSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2088
        TUsbcAlternateSettingList* alternateSettingListRecNext = alternateSettingListRec->iNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2089
        delete alternateSettingListRec;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2090
        alternateSettingListRec = alternateSettingListRecNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2091
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2092
    iNumberOfEndpoints = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2093
    iAlternateSettingList = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2094
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2095
    for(TInt i=0;i<iHwChunks.Count();i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2096
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2097
        ClosePhysicalChunk( iHwChunks[i]);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2098
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2099
    iHwChunks.Close();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2100
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2101
    iValidInterface = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2102
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2103
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2104
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2105
void DLddUsbcChannel::DestroyInterface(TUint aInterfaceNumber)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2106
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2107
    if (iAlternateSetting == aInterfaceNumber)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2108
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2109
        ResetInterface(KErrUsbInterfaceNotReady);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2110
        iValidInterface = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2111
        iNumberOfEndpoints = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2112
        for (TInt i = 1; i <= KMaxEndpointsPerClient; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2113
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2114
            iEndpoint[i] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2115
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2116
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2117
    TUsbcAlternateSettingList* alternateSettingListRec = iAlternateSettingList;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2118
    TUsbcAlternateSettingList* alternateSettingListRecOld = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2119
    while (alternateSettingListRec)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2120
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2121
        TUsbcAlternateSettingList* alternateSettingListRecNext = alternateSettingListRec->iNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2122
        if (alternateSettingListRec->iSetting == aInterfaceNumber)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2123
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2124
            // This record is to be deleted
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2125
            if (alternateSettingListRecOld == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2126
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2127
                // The record to be deleted is at the list head
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2128
                iAlternateSettingList = alternateSettingListRecNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2129
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2130
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2131
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2132
                // The record to be deleted is NOT at the list head
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2133
                alternateSettingListRecOld->iNext = alternateSettingListRecNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2134
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2135
            delete alternateSettingListRec;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2136
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2137
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2138
        alternateSettingListRecOld = alternateSettingListRec;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2139
        alternateSettingListRec = alternateSettingListRecNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2140
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2141
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2142
    if (iAlternateSettingList == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2143
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2144
        // if no interfaces left destroy non-ep0 buffering
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2145
        for(TInt i=0;i<iHwChunks.Count();i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2146
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2147
            ClosePhysicalChunk( iHwChunks[i]);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2148
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2149
        iHwChunks.Close();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2150
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2151
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2152
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2153
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2154
void DLddUsbcChannel::DestroyEp0()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2155
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2156
    delete iEndpoint[0];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2157
    iEndpoint[0] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2158
    for(TInt i=0;i<iHwChunksEp0.Count();i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2159
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2160
        ClosePhysicalChunk( iHwChunksEp0[i] );
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2161
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2162
    iHwChunksEp0.Close();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2163
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2164
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2165
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2166
void DLddUsbcChannel::EndpointStatusChangeCallback(TAny* aDLddUsbcChannel)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2167
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2168
    __KTRACE_OPT(KUSB, Kern::Printf("EndpointStatusChangeCallback"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2169
    DLddUsbcChannel* dUsbc = (DLddUsbcChannel*) aDLddUsbcChannel;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2170
    if (dUsbc->iChannelClosing)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2171
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2172
    TUint endpointState = dUsbc->iEndpointStatusCallbackInfo.State();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2173
    const TInt reqNo = (TInt) RDevUsbcClient::ERequestEndpointStatusNotify;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2174
    if (dUsbc->iRequestStatus[reqNo])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2175
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2176
        __KTRACE_OPT(KUSB, Kern::Printf("EndpointStatusChangeCallback Notify status"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2177
        DThread* client = dUsbc->iClient;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2178
        
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2179
        dUsbc->iEndpointStatusChangeReq->Data() = endpointState;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2180
        dUsbc->iRequestStatus[reqNo] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2181
        Kern::QueueRequestComplete(client,dUsbc->iEndpointStatusChangeReq,KErrNone);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2182
        dUsbc->iEndpointStatusChangePtr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2183
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2184
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2185
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2186
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2187
void DLddUsbcChannel::StatusChangeCallback(TAny* aDLddUsbcChannel)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2188
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2189
    DLddUsbcChannel* dUsbc = (DLddUsbcChannel*) aDLddUsbcChannel;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2190
    if (dUsbc->iChannelClosing)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2191
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2192
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2193
    TUsbcDeviceState deviceState;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2194
    TInt i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2195
     for (i = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2196
          (i < KUsbcDeviceStateRequests) && ((deviceState = dUsbc->iStatusCallbackInfo.State(i)) != UsbShai::EUsbPeripheralNoState);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2197
          ++i)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2198
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2199
         __KTRACE_OPT(KUSB, Kern::Printf("StatusChangeCallBack status=%d", deviceState));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2200
        if (deviceState & KUsbAlternateSetting)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2201
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2202
            dUsbc->ProcessAlternateSetting(deviceState);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2203
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2204
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2205
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2206
            dUsbc->ProcessDeviceState(deviceState);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2207
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2208
        // Only queue if userside is interested
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2209
        if (dUsbc->iDeviceStatusNeeded)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2210
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2211
            dUsbc->iStatusFifo->AddStatusToQueue(deviceState);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2212
            const TInt reqNo = (TInt) RDevUsbcClient::ERequestAlternateDeviceStatusNotify;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2213
            if (dUsbc->AlternateDeviceStateTestComplete())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2214
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2215
                    dUsbc->iRequestStatus[reqNo]=NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2216
                    Kern::QueueRequestComplete(dUsbc->iClient,dUsbc->iStatusChangeReq,KErrNone);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2217
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2218
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2219
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2220
     // We don't want to be interrupted in the middle of this:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2221
    const TInt irqs = NKern::DisableInterrupts(2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2222
     dUsbc->iStatusCallbackInfo.ResetState();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2223
    NKern::RestoreInterrupts(irqs);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2224
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2225
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2226
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2227
void DLddUsbcChannel::OtgFeatureChangeCallback(TAny* aDLddUsbcChannel)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2228
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2229
    __KTRACE_OPT(KUSB, Kern::Printf("OtgFeatureChangeCallback"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2230
    DLddUsbcChannel* dUsbc = (DLddUsbcChannel*) aDLddUsbcChannel;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2231
    if (dUsbc->iChannelClosing)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2232
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2233
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2234
    TUint8 features;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2235
    // No return value check. Assume OTG always supported here
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2236
    dUsbc->iController->GetCurrentOtgFeatures(features);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2237
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2238
    const TInt reqNo = (TInt) RDevUsbcClient::ERequestOtgFeaturesNotify;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2239
    if (dUsbc->iRequestStatus[reqNo])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2240
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2241
        __KTRACE_OPT(KUSB, Kern::Printf("OtgFeatureChangeCallback Notify status"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2242
        dUsbc->iOtgFeatureChangeReq->Data()=features;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2243
        dUsbc->iRequestStatus[reqNo] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2244
        Kern::QueueRequestComplete(dUsbc->iClient,dUsbc->iOtgFeatureChangeReq,KErrNone);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2245
        dUsbc->iOtgFeatureChangePtr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2246
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2247
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2248
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2249
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2250
TInt DLddUsbcChannel::SelectAlternateSetting(TUint aAlternateSetting)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2251
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2252
    TInt r = KErrGeneral;                                    // error code doesn't go userside
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2253
    TUsbcAlternateSettingList* alternateSettingListRec = iAlternateSettingList;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2254
    while (alternateSettingListRec)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2255
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2256
        if (alternateSettingListRec->iSetting == aAlternateSetting)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2257
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2258
            // found the correct interface, now latch in new endpoint set
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2259
            for (TInt i = 1; i <= KMaxEndpointsPerClient; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2260
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2261
                iEndpoint[i] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2262
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2263
            iNumberOfEndpoints = alternateSettingListRec->iNumberOfEndpoints;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2264
            r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2265
            for (TInt i = 1; i <= KMaxEndpointsPerClient; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2266
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2267
                iEndpoint[i] = alternateSettingListRec->iEndpoint[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2268
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2269
            // Only after correct alternate setting has been chosen.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2270
            UpdateEndpointSizes();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2271
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2272
        alternateSettingListRec = alternateSettingListRec->iNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2273
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2274
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2275
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2276
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2277
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2278
TInt DLddUsbcChannel::EpFromAlternateSetting(TUint aAlternateSetting, TInt aEndpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2279
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2280
    TUsbcAlternateSettingList* alternateSettingListRec = iAlternateSettingList;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2281
    while (alternateSettingListRec)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2282
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2283
        if (alternateSettingListRec->iSetting == aAlternateSetting)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2284
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2285
            if ((aEndpoint <= alternateSettingListRec->iNumberOfEndpoints) &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2286
                (aEndpoint >= 0))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2287
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2288
                return alternateSettingListRec->iEndpoint[aEndpoint]->RealEpNumber();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2289
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2290
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2291
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2292
                __KTRACE_OPT(KPANIC, Kern::Printf("  Error: aEndpoint %d wrong for aAlternateSetting %d",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2293
                                                  aEndpoint, aAlternateSetting));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2294
                return -1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2295
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2296
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2297
        alternateSettingListRec = alternateSettingListRec->iNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2298
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2299
    __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no aAlternateSetting %d found", aAlternateSetting));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2300
    return -1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2301
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2302
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2303
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2304
TInt DLddUsbcChannel::ProcessAlternateSetting(TUint aAlternateSetting)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2305
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2306
    ResetInterface(KErrUsbInterfaceChange);                    // kill any outstanding transfers
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2307
    __KTRACE_OPT(KUSB, Kern::Printf("ProcessAlternateSetting 0x%08x", aAlternateSetting));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2308
    TUint newSetting = aAlternateSetting&(~KUsbAlternateSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2309
    __KTRACE_OPT(KUSB, Kern::Printf("ProcessAlternateSetting selecting alternate setting 0x%08x", newSetting));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2310
    TInt r = SelectAlternateSetting(newSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2311
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2312
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2313
    StartEpReads();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2314
    iAlternateSetting = newSetting;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2315
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2316
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2317
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2318
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2319
TInt DLddUsbcChannel::ProcessDeviceState(TUsbcDeviceState aDeviceState)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2320
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2321
    __KTRACE_OPT(KUSB, Kern::Printf("ProcessDeviceState(%d -> %d)", iDeviceState, aDeviceState));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2322
    if (iDeviceState == aDeviceState)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2323
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2324
        __KTRACE_OPT(KUSB, Kern::Printf("  No state change => nothing to be done."));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2325
        return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2326
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2327
    if (iDeviceState == UsbShai::EUsbPeripheralStateSuspended)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2328
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2329
        __KTRACE_OPT(KUSB, Kern::Printf("  Coming out of Suspend: old state = %d", iOldDeviceState));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2330
        iDeviceState = iOldDeviceState;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2331
        if (iDeviceState == aDeviceState)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2332
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2333
            __KTRACE_OPT(KUSB, Kern::Printf("  New state same as before Suspend => nothing to be done."));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2334
            return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2335
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2336
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2337
    TBool renumerateState = (aDeviceState == UsbShai::EUsbPeripheralStateConfigured);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2338
    TBool deconfigured = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2339
    TInt cancellationCode = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2340
    if (aDeviceState == UsbShai::EUsbPeripheralStateSuspended)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2341
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2342
        __KTRACE_OPT(KUSB, Kern::Printf("  Suspending..."));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2343
        iOldDeviceState = iDeviceState;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2344
        // Put PSL into low power mode here
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2345
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2346
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2347
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2348
        deconfigured = (iDeviceState == UsbShai::EUsbPeripheralStateConfigured &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2349
                        aDeviceState != UsbShai::EUsbPeripheralStateConfigured);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2350
        if (iDeviceState == UsbShai::EUsbPeripheralStateConfigured)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2351
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2352
            if (aDeviceState == UsbShai::EUsbPeripheralStateUndefined)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2353
                cancellationCode = KErrUsbCableDetached;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2354
            else if (aDeviceState == UsbShai::EUsbPeripheralStateAddress)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2355
                cancellationCode = KErrUsbDeviceNotConfigured;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2356
            else if (aDeviceState == UsbShai::EUsbPeripheralStateDefault)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2357
                cancellationCode = KErrUsbDeviceBusReset;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2358
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2359
                cancellationCode = KErrUsbDeviceNotConfigured;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2360
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2361
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2362
    __KTRACE_OPT(KUSB, Kern::Printf("  %d --> %d", iDeviceState, aDeviceState));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2363
    iDeviceState = aDeviceState;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2364
    if (iValidInterface || iOwnsDeviceControl)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2365
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2366
        // This LDD may not own an interface. It could be some manager reenumerating
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2367
        // after its subordinate LDDs have setup their interfaces.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2368
        if (deconfigured)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2369
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2370
            DeConfigure(cancellationCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2371
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2372
        else if (renumerateState)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2373
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2374
            // Update size of Ep0.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2375
            iEndpoint[0]->SetMaxPacketSize(iController->Ep0PacketSize());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2376
            // First cancel transfers on all endpoints
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2377
            ResetInterface(KErrUsbInterfaceChange);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2378
            // Select main interface & latch in new endpoint set
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2379
            SelectAlternateSetting(0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2380
            // Here we go
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2381
            StartEpReads();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2382
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2383
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2384
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2385
    const TInt reqNo = (TInt) RDevUsbcClient::ERequestReEnumerate;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2386
    if (renumerateState && iRequestStatus[reqNo])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2387
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2388
        // This lot must be done if we are reenumerated
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2389
        CompleteBufferRequest(iClient, reqNo, KErrNone);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2390
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2391
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2392
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2393
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2394
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2395
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2396
void DLddUsbcChannel::UpdateEndpointSizes()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2397
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2398
    // The regular ones.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2399
    TInt i = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2400
    while ((++i <= KMaxEndpointsPerClient) && iEndpoint[i])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2401
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2402
        const TInt size = iController->EndpointPacketSize(this, iEndpoint[i]->RealEpNumber());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2403
        if (size < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2404
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2405
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Packet size < 0 for ep %d", i));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2406
            continue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2407
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2408
        iEndpoint[i]->SetMaxPacketSize(size);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2409
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2410
    __ASSERT_DEBUG(i == iNumberOfEndpoints + 1,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2411
                   Kern::Printf("  Error: iNumberOfEndpoints wrong (%d)", iNumberOfEndpoints));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2412
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2413
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2414
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2415
DPlatChunkHw* DLddUsbcChannel::ReAllocate(TInt aBuffersize, DPlatChunkHw* aHwChunk, TUint32 aCacheAttribs)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2416
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2417
    DPlatChunkHw* chunk = aHwChunk;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2418
    if ((!chunk) || (chunk->iSize < aBuffersize))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2419
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2420
        if (chunk)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2421
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2422
            ClosePhysicalChunk(chunk);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2423
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2424
        __KTRACE_OPT(KUSB, Kern::Printf("ReAllocate need to get new chunk"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2425
        chunk = Allocate(aBuffersize, aCacheAttribs);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2426
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2427
    return chunk;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2428
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2429
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2430
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2431
DPlatChunkHw* DLddUsbcChannel::Allocate(TInt aBuffersize, TUint32 aCacheAttribs)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2432
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2433
    TUint32 physAddr = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2434
    TUint32 size = Kern::RoundToPageSize(aBuffersize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2435
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2436
    if (Epoc::AllocPhysicalRam(size, physAddr) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2437
        return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2438
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2439
    DPlatChunkHw* HwChunk;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2440
    if (DPlatChunkHw::New(HwChunk, physAddr, aBuffersize, aCacheAttribs) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2441
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2442
        Epoc::FreePhysicalRam(physAddr, size);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2443
        return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2444
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2445
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2446
    return HwChunk;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2447
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2448
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2449
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2450
TInt DLddUsbcChannel::DoRxComplete(TUsbcEndpoint* aTUsbcEndpoint, TInt aEndpoint, TBool aReEntrant)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2451
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2452
    TBool completeNow;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2453
    TInt err = aTUsbcEndpoint->CopyToClient(iClient, completeNow,iClientAsynchNotify[aEndpoint]->iClientBuffer);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2454
    if (completeNow)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2455
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2456
        aTUsbcEndpoint->SetClientReadPending(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2457
        CompleteBufferRequest(iClient, aEndpoint, err);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2458
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2459
    aTUsbcEndpoint->TryToStartRead(aReEntrant);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2460
    return err;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2461
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2462
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2463
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2464
void DLddUsbcChannel::DoRxCompleteNow(TUsbcEndpoint* aTUsbcEndpoint, TInt aEndpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2465
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2466
    aTUsbcEndpoint->SetClientReadPending(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2467
    CompleteBufferRequest(iClient, aEndpoint, KErrCancel);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2468
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2469
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2470
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2471
void DLddUsbcChannel::DoTxComplete(TUsbcEndpoint* aTUsbcEndpoint, TInt aEndpoint, TInt aError)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2472
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2473
    aTUsbcEndpoint->SetClientWritePending(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2474
    CompleteBufferRequest(iClient, aEndpoint, aError);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2475
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2476
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2477
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2478
TBool DLddUsbcChannel::AlternateDeviceStateTestComplete()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2479
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2480
    TBool completeNow = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2481
    const TInt reqNo = (TInt) RDevUsbcClient::ERequestAlternateDeviceStatusNotify;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2482
    if (iRequestStatus[reqNo])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2483
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2484
        // User req is outstanding
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2485
        TUint32 deviceState;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2486
        if (iStatusFifo->GetDeviceQueuedStatus(deviceState) == KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2487
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2488
            // Device state waiting to be sent userside
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2489
            completeNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2490
            __KTRACE_OPT(KUSB, Kern::Printf("StatusChangeCallback Notify status"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2491
            iStatusChangeReq->Data()=deviceState;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2492
            iStatusChangePtr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2493
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2494
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2495
    return completeNow;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2496
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2497
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2498
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2499
void DLddUsbcChannel::EmergencyCompleteDfc(TAny* aDLddUsbcChannel)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2500
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2501
    ((DLddUsbcChannel*) aDLddUsbcChannel)->DoEmergencyComplete();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2502
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2503
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2504
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2505
void DLddUsbcChannel::DeConfigure(TInt aErrorCode)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2506
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2507
    __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcChannel::DeConfigure()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2508
    // Called after deconfiguration. Cancels transfers on all endpoints.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2509
    ResetInterface(aErrorCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2510
    // Cancel the endpoint status notify request if it is outstanding.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2511
    const TInt KEpNotReq = RDevUsbcClient::ERequestEndpointStatusNotify;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2512
    if (iRequestStatus[KEpNotReq])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2513
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2514
        CancelNotifyEndpointStatus();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2515
        iRequestStatus[KEpNotReq]=NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2516
        Kern::QueueRequestComplete(iClient,iEndpointStatusChangeReq,aErrorCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2517
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2518
    // We have to reset the alternate setting number when the config goes away.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2519
     SelectAlternateSetting(0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2520
    iAlternateSetting = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2521
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2522
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2523
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2524
void DLddUsbcChannel::StartEpReads()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2525
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2526
    // Queued after enumeration. Starts reads on all endpoints.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2527
    // The endpoint itself decides if it can do a read
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2528
    TInt i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2529
    for (i = 0; i <= iNumberOfEndpoints; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2530
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2531
        // The endpoint itself will decide if it can read
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2532
        iEndpoint[i]->TryToStartRead(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2533
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2534
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2535
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2536
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2537
void DLddUsbcChannel::ResetInterface(TInt aErrorCode)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2538
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2539
    // Called after change in alternate setting.  Cancels transfers on all endpoints
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2540
    if (iValidInterface || iOwnsDeviceControl)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2541
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2542
        // Reset each endpoint except ep0
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2543
        for (TInt i = 1; i <= iNumberOfEndpoints; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2544
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2545
            __KTRACE_OPT(KUSB, Kern::Printf("Cancelling transfer ep=%d", i));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2546
            iEndpoint[i]->CancelTransfer(iClient,iClientAsynchNotify[i]->iClientBuffer);            // Copies data userside
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2547
            iEndpoint[i]->AbortTransfer();                    // kills any ldd->pil outstanding transfers
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2548
            iEndpoint[i]->iDmaBuffers->Flush();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2549
            if (iRequestStatus[i] != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2550
                CompleteBufferRequest(iClient, i, aErrorCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2551
            iEndpoint[i]->SetClientWritePending(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2552
            iEndpoint[i]->SetClientReadPending(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2553
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2554
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2555
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2556
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2557
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2558
void DLddUsbcChannel::AbortInterface()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2559
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2560
    // Called after when channel is closing
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2561
    if (iValidInterface || iOwnsDeviceControl)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2562
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2563
        for (TInt i = 0; i <= iNumberOfEndpoints; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2564
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2565
            if (iEndpoint[i])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2566
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2567
                // kills any LDD->PDD outstanding transfers
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2568
                iEndpoint[i]->AbortTransfer();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2569
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2570
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2571
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2572
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2573
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2574
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2575
void DLddUsbcChannel::ClosePhysicalChunk(DPlatChunkHw*& aHwChunk)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2576
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2577
    if (aHwChunk)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2578
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2579
         const TPhysAddr addr = aHwChunk->PhysicalAddress();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2580
         const TInt size = aHwChunk->iSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2581
        aHwChunk->Close(NULL);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2582
         Epoc::FreePhysicalRam(addr, size);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2583
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2584
    aHwChunk = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2585
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2586
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2587
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2588
TInt DLddUsbcChannel::DoEmergencyComplete()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2589
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2590
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::DoEmergencyComplete"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2591
    // cancel any pending DFCs
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2592
    // complete all client requests
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2593
    for (TInt i = 0; i < KUsbcMaxRequests; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2594
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2595
        if (iRequestStatus[i])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2596
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2597
            __KTRACE_OPT(KUSB, Kern::Printf("Complete request 0x%x", iRequestStatus[i]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2598
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2599
            if (i == RDevUsbcClient::ERequestAlternateDeviceStatusNotify)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2600
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2601
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2602
                iDeviceStatusNeeded = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2603
                iStatusFifo->FlushQueue();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2604
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2605
                if (iStatusChangePtr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2606
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2607
                    iStatusChangeReq->Data() = iController->GetDeviceStatus();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2608
                    iStatusChangePtr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2609
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2610
                    if (iStatusChangeReq->IsReady())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2611
                        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2612
                        iRequestStatus[i] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2613
                        Kern::QueueRequestComplete(iClient, iStatusChangeReq,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2614
                                KErrDisconnected);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2615
                        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2616
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2617
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2618
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2619
            else if (i == RDevUsbcClient::ERequestEndpointStatusNotify)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2620
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2621
                    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2622
                   if (iEndpointStatusChangePtr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2623
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2624
                    TUint epBitmap = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2625
                    for (TInt i = 0; i <= iNumberOfEndpoints; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2626
                        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2627
                        TInt v = iController->GetEndpointStatus(this, iEndpoint[i]->RealEpNumber());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2628
                        TUint b;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2629
                        (v == EEndpointStateStalled) ? b = 1 : b = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2630
                        epBitmap |= b << i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2631
                        }    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2632
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2633
                    iEndpointStatusChangeReq->Data() = epBitmap;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2634
                    iEndpointStatusChangePtr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2635
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2636
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2637
                if (iEndpointStatusChangeReq->IsReady())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2638
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2639
                    iRequestStatus[i] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2640
                    Kern::QueueRequestComplete(iClient,iEndpointStatusChangeReq,KErrDisconnected);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2641
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2642
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2643
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2644
            else if (i == RDevUsbcClient::ERequestOtgFeaturesNotify)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2645
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2646
                    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2647
                if (iOtgFeatureChangePtr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2648
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2649
                    TUint8 features;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2650
                    iController->GetCurrentOtgFeatures(features);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2651
                    iOtgFeatureChangeReq->Data()=features;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2652
                    iOtgFeatureChangePtr = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2653
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2654
                    
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2655
                if (iOtgFeatureChangeReq->IsReady())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2656
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2657
                    iRequestStatus[i] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2658
                    Kern::QueueRequestComplete(iClient, iOtgFeatureChangeReq,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2659
                            KErrDisconnected);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2660
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2661
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2662
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2663
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2664
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2665
                CompleteBufferRequest(iClient, i, KErrDisconnected);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2666
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2667
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2668
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2669
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2670
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2671
    iStatusCallbackInfo.Cancel();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2672
    iEndpointStatusCallbackInfo.Cancel();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2673
    iOtgFeatureCallbackInfo.Cancel();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2674
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2675
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2676
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2677
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2678
void DLddUsbcChannel::PanicClientThread(TInt aReason)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2679
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2680
    Kern::ThreadKill(iClient, EExitPanic, aReason, KUsbLDDKillCat);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2681
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2682
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2683
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2684
// ===============Endpoint====================
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2685
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2686
// Constructor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2687
TUsbcEndpoint::TUsbcEndpoint(DLddUsbcChannel* aLDD, DUsbClientController* aController,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2688
                             const TUsbcEndpointInfo* aEndpointInfo, TInt aEndpointNum,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2689
                             TInt aBandwidthPriority)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2690
    : iController(aController),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2691
      iEndpointInfo(aEndpointInfo->iType, aEndpointInfo->iDir, aEndpointInfo->iSize),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2692
      iClientReadPending(EFalse),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2693
      iClientWritePending(EFalse),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2694
      iEndpointNumber(aEndpointNum),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2695
      iRealEpNumber(-1),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2696
      iLdd(aLDD),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2697
      iError(KErrNone),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2698
      iRequestCallbackInfo(NULL),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2699
      iBytesTransferred(0),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2700
      iBandwidthPriority(aBandwidthPriority)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2701
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2702
     ResetTransferInfo();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2703
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::TUsbcEndpoint 2"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2704
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2705
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2706
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2707
TInt TUsbcEndpoint::Construct()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2708
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2709
    iDmaBuffers = new TDmaBuf(&iEndpointInfo, iBandwidthPriority);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2710
    if (iDmaBuffers == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2711
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2712
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2713
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2714
    const TInt r = iDmaBuffers->Construct(&iEndpointInfo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2715
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2716
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2717
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2718
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2719
    iRequestCallbackInfo = new TUsbcRequestCallback(iLdd,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2720
                                                    iEndpointNumber,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2721
                                                    TUsbcEndpoint::RequestCallback,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2722
                                                    this,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2723
                                                    iLdd->iDfcQ,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2724
                                                    KUsbRequestCallbackPriority);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2725
    if (iRequestCallbackInfo == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2726
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2727
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2728
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2729
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2730
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2731
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2732
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2733
TUsbcEndpoint::~TUsbcEndpoint()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2734
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2735
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::~TUsbcEndpoint(%d)", iEndpointNumber));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2736
    AbortTransfer();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2737
    delete iRequestCallbackInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2738
    delete iDmaBuffers;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2739
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2740
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2741
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2742
void TUsbcEndpoint::RequestCallback(TAny* aTUsbcEndpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2743
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2744
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::RequestCallback"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2745
    ((TUsbcEndpoint*) aTUsbcEndpoint)->EndpointComplete();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2746
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2747
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2748
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2749
void TUsbcEndpoint::SetMaxPacketSize(TInt aSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2750
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2751
    iEndpointInfo.iSize = aSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2752
    iDmaBuffers->SetMaxPacketSize(aSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2753
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2754
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2755
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2756
TInt TUsbcEndpoint::EndpointComplete()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2757
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2758
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::EndpointComplete ep=%d %d",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2759
                                    iEndpointNumber, iRequestCallbackInfo->iEndpointNum));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2760
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2761
    if (iLdd->ChannelClosing())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2762
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2763
        __KTRACE_OPT(KUSB, Kern::Printf("We're going home -> completions no longer accepted"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2764
        return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2765
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2766
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2767
    UsbShai::TTransferDirection transferDir = iRequestCallbackInfo->iTransferDir;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2768
    TInt error = iRequestCallbackInfo->iError;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2769
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2770
    switch (transferDir)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2771
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2772
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2773
    case UsbShai::EControllerWrite:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2774
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2775
        __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::EndpointComplete Write 2"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2776
        if (!iDmaBuffers->TxIsActive())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2777
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2778
            __KTRACE_OPT(KUSB, Kern::Printf("  TX completion but !iDmaBuffers->TxIsActive()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2779
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2780
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2781
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2782
        iDmaBuffers->TxSetInActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2783
        TBool completeNow = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2784
        iBytesTransferred += iRequestCallbackInfo->iTxBytes;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2785
        if (iClientWritePending)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2786
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2787
            //Complete Outstanding Write if necessary
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2788
            iError = error;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2789
            if (iError != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2790
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2791
                completeNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2792
                if (iError == KErrPrematureEnd)                // Previous write could not be completed
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2793
                    iError = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2794
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2795
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2796
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2797
                if (iBytesTransferred == (TUint32) iTransferInfo.iTransferSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2798
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2799
                    completeNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2800
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2801
                else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2802
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2803
                    iError = ContinueWrite();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2804
                    if (iError != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2805
                        completeNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2806
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2807
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2808
            if (completeNow)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2809
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2810
                TxComplete();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2811
                ResetTransferInfo();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2812
                if (iEndpointNumber == 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2813
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2814
                    iDmaBuffers->Flush();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2815
                    TryToStartRead(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2816
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2817
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2818
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2819
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2820
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2821
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2822
    case UsbShai::EControllerRead:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2823
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2824
        // The first packet always contains the total #of bytes
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2825
        const TInt byteCount = iRequestCallbackInfo->iPacketSize[0];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2826
        const TInt packetCount = iRequestCallbackInfo->iRxPackets;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2827
        iDmaBuffers->ReadXferComplete(byteCount, packetCount, error);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2828
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2829
        // We queue the dfc if we can complete the read, i.e. if we are reading a packet,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2830
        // or if we have enough data to satisfy a read data request.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2831
        if (iClientReadPending)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2832
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2833
            //Complete outstanding read
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2834
            __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpoint::EndpointComplete Read 3 (bytes "
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2835
                                            "available=%d)", iDmaBuffers->RxBytesAvailable()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2836
            TInt bytesReqd = iTransferInfo.iTransferSize - iBytesTransferred;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2837
            TBool completeNow = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2838
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2839
            if (iTransferInfo.iTransferType == ETransferTypeReadPacket ||
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2840
                iTransferInfo.iTransferType == ETransferTypeReadOneOrMore)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2841
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2842
                // Always complete on a packet read
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2843
                completeNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2844
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2845
            else if (iTransferInfo.iTransferType == ETransferTypeReadData)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2846
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2847
                // Complete only if enough data is present
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2848
                if (iDmaBuffers->RxBytesAvailable() >= bytesReqd)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2849
                    completeNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2850
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2851
            else if (iTransferInfo.iTransferType == ETransferTypeReadUntilShort)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2852
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2853
                // Complete if enough data is present or if a short packet has been delivered
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2854
                const TInt maxPacketSize = iEndpointInfo.iSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2855
                const TInt lastPacketSize = iRequestCallbackInfo->iPacketSize[packetCount - 1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2856
                if (lastPacketSize < maxPacketSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2857
                    completeNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2858
                else if (iDmaBuffers->RxBytesAvailable() >= bytesReqd)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2859
                    completeNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2860
                else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2861
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2862
                    const TUint type = iEndpointInfo.iType;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2863
                    if ((type == UsbShai::KUsbEpTypeBulk) && (lastPacketSize & (maxPacketSize - 1)))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2864
                        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2865
                        completeNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2866
                        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2867
                    else if ((type != UsbShai::KUsbEpTypeBulk) &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2868
                             (lastPacketSize > maxPacketSize) &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2869
                             (lastPacketSize % maxPacketSize))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2870
                        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2871
                        completeNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2872
                        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2873
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2874
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2875
            if (completeNow)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2876
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2877
                iError = error;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2878
                RxComplete(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2879
                iClientReadPending = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2880
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2881
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2882
        iDmaBuffers->RxSetInActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2883
        if (error != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2884
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2885
            return error;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2886
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2887
        if (TryToStartRead(EFalse) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2888
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2889
//            if (iEndpointNumber != 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2890
//                Kern::Printf("EndpointComplete couldn't start read on ep=%d", iEndpointNumber);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2891
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2892
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2893
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2894
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2895
    default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2896
        // shouldn't get here
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2897
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2898
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2899
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2900
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2901
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2902
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2903
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2904
void TUsbcEndpoint::TxComplete()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2905
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2906
    iLdd->DoTxComplete(this, iEndpointNumber, iError);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2907
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2908
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2909
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2910
TInt TUsbcEndpoint::RxComplete(TBool aReEntrant)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2911
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2912
    return iLdd->DoRxComplete(this, iEndpointNumber, aReEntrant);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2913
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2914
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2915
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2916
void TUsbcEndpoint::RxCompleteNow()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2917
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2918
    iLdd->DoRxCompleteNow(this, iEndpointNumber);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2919
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2920
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2921
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2922
TInt TUsbcEndpoint::CopyToClient(DThread* aClient, TClientBuffer *aTcb)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2923
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2924
    TBool completeNow;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2925
    return CopyToClient(aClient, completeNow,aTcb);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2926
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2927
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2928
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2929
TInt TUsbcEndpoint::CopyToClient(DThread* aClient, TBool& aCompleteNow, TClientBuffer *aTcb)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2930
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2931
    TInt err;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2932
    const TInt length = iTransferInfo.iTransferSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2933
    const TBool KReadData = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2934
    const TBool KReadUntilShort = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2935
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2936
    __KTRACE_OPT(KUSB, Kern::Printf("CopyToClient: length = %d", length));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2937
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2938
    if (iTransferInfo.iTransferType == ETransferTypeReadPacket)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2939
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2940
        err = iDmaBuffers->RxCopyPacketToClient(aClient, aTcb, length);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2941
        aCompleteNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2942
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2943
    else if (iTransferInfo.iTransferType == ETransferTypeReadOneOrMore)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2944
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2945
        err = iDmaBuffers->RxCopyDataToClient(aClient, aTcb, length, iBytesTransferred,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2946
                                              KReadData, aCompleteNow);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2947
        aCompleteNow = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2948
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2949
    else if (iTransferInfo.iTransferType == ETransferTypeReadUntilShort)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2950
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2951
        err = iDmaBuffers->RxCopyDataToClient(aClient, aTcb, length, iBytesTransferred,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2952
                                              KReadUntilShort, aCompleteNow);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2953
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2954
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2955
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2956
        err = iDmaBuffers->RxCopyDataToClient(aClient, aTcb, length, iBytesTransferred,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2957
                                              KReadData, aCompleteNow);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2958
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2959
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2960
    if (aCompleteNow)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2961
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2962
        ResetTransferInfo();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2963
        SetClientReadPending(EFalse);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2964
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2965
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2966
    return err;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2967
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2968
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2969
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2970
TInt TUsbcEndpoint::TryToStartRead(TBool aReEntrant)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2971
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2972
    __KTRACE_OPT(KUSB, Kern::Printf("TryToStartRead 1 ep=%d", iEndpointNumber));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2973
    TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2974
    if (iEndpointInfo.iDir != UsbShai::KUsbEpDirOut &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2975
        iEndpointInfo.iDir != UsbShai::KUsbEpDirBidirect)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2976
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2977
        // Verify ep direction
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2978
        __KTRACE_OPT(KUSB, Kern::Printf("TryToStartRead wrong direction ep=%d", iEndpointNumber));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2979
        return KErrUsbEpBadDirection;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2980
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2981
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2982
    if (iEndpointNumber == 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2983
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2984
        // Can't issue an Ep0 read if reader or writer is active
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2985
        if (iDmaBuffers->TxIsActive())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2986
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2987
            __KTRACE_OPT(KUSB, Kern::Printf("TryToStartRead ep0 Tx already active FATAL"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2988
            return KErrUsbEpNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2989
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2990
        if (iDmaBuffers->RxIsActive())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2991
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2992
            __KTRACE_OPT(KUSB, Kern::Printf("TryToStartRead ep0 Rx already active non-FATAL"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2993
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2994
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2995
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2996
    if (!(iDmaBuffers->RxIsActive()))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2997
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2998
        TUint8* bufferAddr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2999
        TPhysAddr physAddr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3000
        TUsbcPacketArray* indexArray;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3001
        TUsbcPacketArray* sizeArray;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3002
        TInt length;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3003
        r = iDmaBuffers->RxGetNextXfer(bufferAddr, indexArray, sizeArray, length, physAddr);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3004
        if (r == KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3005
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3006
            iDmaBuffers->RxSetActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3007
            iRequestCallbackInfo->SetRxBufferInfo(bufferAddr, physAddr, indexArray, sizeArray, length);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3008
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3009
            __KTRACE_OPT(KUSB, Kern::Printf("TryToStartRead 2 bufferAddr=0x%08x", bufferAddr));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3010
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3011
            r = iController->SetupReadBuffer(*iRequestCallbackInfo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3012
            if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3013
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3014
                iDmaBuffers->RxSetInActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3015
                __KTRACE_OPT(KPANIC, Kern::Printf("  Error: TryToStartRead controller rejects read"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3016
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3017
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3018
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3019
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3020
            if (iClientReadPending)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3021
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3022
                // Deadlock, try to resolve it by draining buffer into descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3023
                if (!aReEntrant)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3024
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3025
                    RxComplete(ETrue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3026
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3027
                else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3028
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3029
                    // we are stuck, better complete userside otherwise the userside request will hang
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3030
                    RxCompleteNow();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3031
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3032
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3033
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3034
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3035
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3036
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3037
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3038
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3039
TInt TUsbcEndpoint::TryToStartWrite(TEndpointTransferInfo* pTfr)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3040
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3041
    __KTRACE_OPT(KUSB, Kern::Printf("TryToStartWrite 1 ep=%d", iEndpointNumber));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3042
    if (iEndpointInfo.iDir != UsbShai::KUsbEpDirIn &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3043
        iEndpointInfo.iDir != UsbShai::KUsbEpDirBidirect)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3044
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3045
        // Verify ep direction
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3046
        return KErrUsbEpBadDirection;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3047
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3048
    if (iEndpointNumber == 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3049
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3050
        // Can't issue an Ep0 write if unread data is available or writer is active
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3051
        if (iDmaBuffers->TxIsActive() || !iDmaBuffers->IsReaderEmpty())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3052
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3053
            return KErrUsbEpNotReady;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3054
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3055
        if (iDmaBuffers->RxIsActive())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3056
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3057
            // if a reader is active then cancel the read
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3058
            iDmaBuffers->RxSetInActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3059
            iController->CancelReadBuffer(iLdd, iRealEpNumber);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3060
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3061
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3062
    SetTransferInfo(pTfr);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3063
    ContinueWrite();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3064
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3065
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3066
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3067
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3068
TInt TUsbcEndpoint::ContinueWrite()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3069
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3070
    __KTRACE_OPT(KUSB, Kern::Printf("ContinueWrite 2"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3071
    TUint8* bufferAddr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3072
    TPhysAddr physAddr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3073
    TInt bufferLength;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3074
    TInt r = iDmaBuffers->TxGetNextXfer(bufferAddr, bufferLength, physAddr);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3075
    if (r != KErrNone)                                            // probably already active
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3076
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3077
    __KTRACE_OPT(KUSB, Kern::Printf("ContinueWrite 3"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3078
    iDmaBuffers->TxSetActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3079
    TBool zlpReqd = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3080
    TUint32 transferSize = iTransferInfo.iTransferSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3081
    TInt length = Min(transferSize - iBytesTransferred, (TUint32) bufferLength);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3082
    if (iBytesTransferred+length>=transferSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3083
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3084
        // only send a zlp if this is the last buffer of the transfer
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3085
        zlpReqd = iTransferInfo.iZlpReqd;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3086
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3087
    r = iDmaBuffers->TxStoreData(iLdd->Client(), iLdd->GetClientBuffer(iEndpointNumber), length, iBytesTransferred);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3088
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3089
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3090
    iDmaBuffers->TxSetActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3091
    iRequestCallbackInfo->SetTxBufferInfo(bufferAddr, physAddr, length);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3092
    iRequestCallbackInfo->iZlpReqd = zlpReqd;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3093
#if 0
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3094
    for (TInt i = 0; i < iRequestCallbackInfo->iLength; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3095
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3096
        __KTRACE_OPT(KUSB, Kern::Printf("Buffer[%d] = 0x%02x", i, iRequestCallbackInfo->iBufferStart[i]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3097
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3098
#endif
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3099
    r = iController->SetupWriteBuffer(*iRequestCallbackInfo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3100
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3101
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3102
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3103
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3104
void TUsbcEndpoint::CancelTransfer(DThread* aThread, TClientBuffer *aTcb)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3105
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3106
    __KTRACE_OPT(KUSB, Kern::Printf("CancelTransfer"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3107
    if (iDmaBuffers != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3108
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3109
        if (iClientWritePending)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3110
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3111
            __KTRACE_OPT(KUSB, Kern::Printf("  (iClientWritePending)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3112
            iClientWritePending = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3113
            iController->CancelWriteBuffer(iLdd, iRealEpNumber);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3114
            iDmaBuffers->TxSetInActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3115
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3116
        if (iClientReadPending)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3117
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3118
            __KTRACE_OPT(KUSB, Kern::Printf("  (iClientReadPending)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3119
            iClientReadPending = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3120
            CopyToClient(aThread,aTcb);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3121
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3122
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3123
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3124
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3125
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3126
void TUsbcEndpoint::AbortTransfer()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3127
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3128
    __KTRACE_OPT(KUSB, Kern::Printf("Abort Transfer"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3129
    if (iDmaBuffers != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3130
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3131
        if (iDmaBuffers->TxIsActive())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3132
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3133
            __KTRACE_OPT(KUSB, Kern::Printf("  (iClientWritePending)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3134
            iController->CancelWriteBuffer(iLdd, iRealEpNumber);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3135
            iDmaBuffers->TxSetInActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3136
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3137
        if (iDmaBuffers->RxIsActive())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3138
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3139
            __KTRACE_OPT(KUSB, Kern::Printf("  (iClientReadPending)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3140
            iController->CancelReadBuffer(iLdd, iRealEpNumber);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3141
            iDmaBuffers->RxSetInActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3142
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3143
        iRequestCallbackInfo->iDfc.Cancel();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3144
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3145
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3146
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3147
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3148
TUsbcAlternateSettingList::TUsbcAlternateSettingList()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3149
    : iNext(NULL),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3150
      iNumberOfEndpoints(0),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3151
      iSetting(0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3152
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3153
    for (TInt i = 0; i <= KMaxEndpointsPerClient; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3154
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3155
        iEpNumDeOrderedByBufSize[i] = -1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3156
        iEndpoint[i] = NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3157
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3158
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3159
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3160
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3161
TUsbcAlternateSettingList::~TUsbcAlternateSettingList()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3162
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3163
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcAlternateSettingList::~TUsbcAlternateSettingList()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3164
    for (TInt i = 0; i <= KMaxEndpointsPerClient; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3165
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3166
        delete iEndpoint[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3167
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3168
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3169
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3170
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3171
TUsbcDeviceStatusQueue::TUsbcDeviceStatusQueue()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3172
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3173
    FlushQueue();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3174
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3175
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3176
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3177
void TUsbcDeviceStatusQueue::FlushQueue()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3178
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3179
    for (TInt i = 0; i < KUsbDeviceStatusQueueDepth; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3180
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3181
        iDeviceStatusQueue[i] = KUsbDeviceStatusNull;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3182
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3183
    iStatusQueueHead = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3184
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3185
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3186
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3187
void TUsbcDeviceStatusQueue::AddStatusToQueue(TUint32 aDeviceStatus)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3188
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3189
    // Only add a new status if it is not a duplicate of the one at the head of the queue
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3190
    if (!(iStatusQueueHead != 0 &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3191
          iDeviceStatusQueue[iStatusQueueHead - 1] == aDeviceStatus))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3192
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3193
        if (iStatusQueueHead == KUsbDeviceStatusQueueDepth)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3194
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3195
            // Discard item at tail of queue
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3196
            TUint32 status;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3197
            GetDeviceQueuedStatus(status);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3198
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3199
        iDeviceStatusQueue[iStatusQueueHead] = aDeviceStatus;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3200
        iStatusQueueHead++;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3201
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3202
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3203
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3204
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3205
TInt TUsbcDeviceStatusQueue::GetDeviceQueuedStatus(TUint32& aDeviceStatus)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3206
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3207
    TInt r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3208
    if (iStatusQueueHead <= 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3209
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3210
        r = KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3211
        aDeviceStatus = KUsbDeviceStatusNull;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3212
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3213
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3214
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3215
        aDeviceStatus = iDeviceStatusQueue[0];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3216
        for(TInt i = 1; i < KUsbDeviceStatusQueueDepth; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3217
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3218
            TUint32 s = iDeviceStatusQueue[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3219
            iDeviceStatusQueue[i - 1] = s;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3220
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3221
        iStatusQueueHead--;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3222
        iDeviceStatusQueue[KUsbDeviceStatusQueueDepth - 1] = KUsbDeviceStatusNull;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3223
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3224
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3225
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3226
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3227
void TClientAsynchNotify::Reset()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3228
{
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3229
    iBufferRequest->Reset();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3230
    iClientBuffer=NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3231
}
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3232
089413cdde3c 201028_02
hgs
parents:
diff changeset
  3233
//---