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