usbmgmt/usbmgr/device/classdrivers/ncm/classcontroller/src/ncmclientmanager.cpp
author hgs
Thu, 16 Sep 2010 12:03:29 +0800
changeset 49 93c0009bd947
parent 39 c4733e7476f1
permissions -rw-r--r--
201036_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     1
/*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     3
* All rights reserved.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     8
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
     9
* Initial Contributors:
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    11
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    12
* Contributors:
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    13
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    14
* Description: 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    15
*
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    16
*/
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    17
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    18
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    19
 * @file
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    20
 * @internalComponent
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    21
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    22
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    23
#include "ncmclientmanager.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    24
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    25
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    26
#ifdef OVERDUMMY_NCMCC
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    27
#include <usb/testncmcc/dummy_ncminternalsrv.h>
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    28
#else
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    29
#include "ncminternalsrv.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    30
#endif // OVERDUMMY_NCMCC
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    31
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    32
#include "ncmclassdescriptor.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    33
// For OST tracing
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    34
#include "OstTraceDefinitions.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    35
#ifdef OST_TRACE_COMPILER_IN_USE
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    36
#include "ncmclientmanagerTraces.h"
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    37
#endif
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    38
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    39
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    40
// NCM Interface MTU size
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    41
extern const TUint KEthernetFrameSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    42
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    43
// NCM MAC Address String descriptor buffer length
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    44
const TUint KMacAddrStringDescSize = 32;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    45
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    46
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    47
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    48
 * Construtor
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    49
 * @param aMacAddress the NCM ethernet interface MAC address
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    50
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    51
CNcmClientManager::CNcmClientManager(const TNcmMacAddress& aHostMacAddress):
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    52
        iHostMacAddress(aHostMacAddress)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    53
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    54
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    55
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    56
    // No implementation required
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    57
    OstTraceFunctionExit1( CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    58
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    59
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    60
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    61
 * Destructor
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    62
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    63
CNcmClientManager::~CNcmClientManager()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    64
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    65
    OstTraceFunctionEntry0( CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_ENTRY_DESTRUCTOR );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    66
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    67
    TInt err = KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    68
    if (iCommLddInitiated)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    69
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    70
        RChunk* commChunk = NULL;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    71
        OstTrace0(TRACE_NORMAL, CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_PRE_CLOSE_COMM_INTERFACE, "About to get chunk handle for communication interface!");        
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    72
        err = iCommLdd.GetDataTransferChunk(commChunk);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    73
        if (KErrNone == err)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    74
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    75
            OstTrace0(TRACE_NORMAL, CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_CLOSE_COMM_CHUNK, "About to close chunk handle for communication interface!");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    76
            commChunk->Close();    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    77
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    78
        else
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    79
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    80
            OstTrace1(TRACE_ERROR, CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_CLOSE_COMM_CHUNK_FAIL, "Can not get chunk handle for communication interface: err = %d", err);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    81
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    82
        
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    83
        OstTrace0(TRACE_NORMAL, CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_CLOSE_COMM_INTERFACE, "About to close device handle for communication interface!");        
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    84
        iCommLdd.Close();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    85
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    86
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    87
    if (iDataLddInitiated)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    88
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    89
        RChunk* dataChunk = NULL;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    90
        OstTrace0(TRACE_NORMAL, CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_PRE_CLOSE_DATA_INTERFACE, "About to get chunk handle for data interface!");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    91
        err = iDataLdd.GetDataTransferChunk(dataChunk);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    92
        if (KErrNone == err)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    93
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    94
            OstTrace0(TRACE_NORMAL, CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_CLOSE_DATA_CHUNK, "About to close chunk handle for communication interface!");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    95
            dataChunk->Close();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    96
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    97
        else
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    98
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
    99
            OstTrace1(TRACE_ERROR, CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_CLOSE_DATA_CHUNK_FAIL, "Can not get chunk handle for data interface: err = %d", err);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   100
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   101
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   102
        OstTrace0(TRACE_NORMAL, CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_CLOSE_DATA_INTERFACE, "About to close device handle for data interface!");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   103
        iDataLdd.Close();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   104
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   105
    OstTraceFunctionExit0( CNCMCLIENTMANAGER_CNCMCLIENTMANAGER_ENTRY_DESTRUCTOR_EXIT );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   106
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   107
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   108
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   109
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   110
 * Setup NCM interfaces
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   111
 * @param[out]   aDataEpBufferSize, NCM data interface EP buffer size
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   112
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   113
void CNcmClientManager::SetNcmInterfacesL(TUint& aDataEpBufferSize)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   114
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   115
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_SETNCMINTERFACESL_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   116
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   117
    // Setup NCM communication interface
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   118
    SetCommunicationInterfaceL();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   119
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   120
    // Setup NCM data interface
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   121
    SetDataInterfaceL(aDataEpBufferSize);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   122
    
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   123
    // Retrieve Control interface number(alter 0)
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   124
    TUint8 controlInterfaceNumber = 0;
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   125
    User::LeaveIfError(InterfaceNumber(iCommLdd,0,controlInterfaceNumber));
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   126
    
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   127
    // Retrieve data interface number(alter 0)
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   128
    TUint8 dataInterfaceNumber = 0;
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   129
    User::LeaveIfError(InterfaceNumber(iDataLdd,0,dataInterfaceNumber));
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   130
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   131
    // Setup NCM class descriptor with correct interface number
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   132
    User::LeaveIfError(SetupClassSpecificDescriptor(controlInterfaceNumber,dataInterfaceNumber));
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   133
    OstTraceFunctionExit1( CNCMCLIENTMANAGER_SETNCMINTERFACESL_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   134
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   135
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   136
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   137
 * Transfer NCM interface handlers from NCM class controller to NCM 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   138
 * packet driver through NCM internal server.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   139
 * @param aServer a reference to RNcmInternalSrv 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   140
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   141
void CNcmClientManager::TransferInterfacesL(RNcmInternalSrv& aServer)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   142
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   143
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_TRANSFERINTERFACESL_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   144
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   145
    RChunk* commChunk = NULL;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   146
    RChunk* dataChunk = NULL;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   147
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   148
    OstTrace0(TRACE_NORMAL, CNCMCLIENTMANAGER_TRANSFERINTERFACESL_PRE_TRANSFER_INTERFACES, "About to Transfer handles to NCM internal server!");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   149
    User::LeaveIfError(iCommLdd.GetDataTransferChunk(commChunk));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   150
    User::LeaveIfError(iDataLdd.GetDataTransferChunk(dataChunk));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   151
    User::LeaveIfError(aServer.TransferHandle(iCommLdd, *commChunk, 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   152
            iDataLdd, *dataChunk));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   153
    OstTrace0(TRACE_NORMAL, CNCMCLIENTMANAGER_TRANSFERINTERFACESL_INTERFACES_TRANSFERED, "Transfer handles to NCM internal server Done!");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   154
    OstTraceFunctionExit1( CNCMCLIENTMANAGER_TRANSFERINTERFACESL_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   155
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   156
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   157
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   158
 * Setup NCM communication inteface
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   159
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   160
void CNcmClientManager::SetCommunicationInterfaceL()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   161
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   162
    OstTraceFunctionEntry1( CNCMCLIENTMANAGER_SETCOMMUNICATIONINTERFACEL_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   163
        
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   164
    User::LeaveIfError(iCommLdd.Open(0));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   165
    iCommLddInitiated = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   166
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   167
    TInt err = KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   168
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   169
    TUsbcScInterfaceInfoBuf ifc0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   170
    TUsbcDeviceState deviceStatus;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   171
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   172
    User::LeaveIfError(iCommLdd.DeviceStatus(deviceStatus));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   173
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   174
    if (deviceStatus == EUsbcDeviceStateConfigured)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   175
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   176
        User::Leave( KErrInUse);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   177
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   178
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   179
    TUsbDeviceCaps dCaps;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   180
    User::LeaveIfError(iCommLdd.DeviceCaps(dCaps));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   181
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   182
    TInt epNum = dCaps().iTotalEndpoints;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   183
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   184
    TUsbcEndpointData data[KUsbcMaxEndpoints];
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   185
    TPtr8 dataptr(reinterpret_cast<TUint8*> (data), sizeof(data),
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   186
            sizeof(data));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   187
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   188
    User::LeaveIfError(iCommLdd.EndpointCaps(dataptr));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   189
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   190
    TBool foundIntIN = EFalse;
39
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   191
    const TUint KEndPointType = KUsbEpTypeInterrupt | KUsbEpDirIn;
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   192
    for (TInt i = 0; i < epNum; i++)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   193
        {
39
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   194
        const TUsbcEndpointData* epData = &data[i];
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   195
        if ((!epData->iInUse) && // Not in use
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   196
            ((epData->iCaps.iTypesAndDir & KEndPointType) == KEndPointType))
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   197
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   198
            // EEndpoint1 is going to be our INTERRUPT (IN, write) endpoint
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   199
            ifc0().iEndpointData[0].iType = KUsbEpTypeInterrupt;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   200
            ifc0().iEndpointData[0].iDir = KUsbEpDirIn;
39
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   201
            ifc0().iEndpointData[0].iSize = epData->iCaps.MinPacketSize();
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   202
            ifc0().iEndpointData[0].iInterval = 0x01;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   203
            ifc0().iEndpointData[0].iInterval_Hs = 0x01;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   204
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   205
            foundIntIN = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   206
            break;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   207
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   208
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   209
    if (EFalse == foundIntIN)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   210
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   211
        OstTrace0( TRACE_ERROR, CNCMCLIENTMANAGER_SETCOMMUNICATIONINTERFACEL, "Can not find proper endpint for NCM communication interface" );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   212
        User::Leave( KErrNotFound);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   213
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   214
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   215
    /*********************************************************************************************/
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   216
    //Communication Class Interface (0x00)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   217
    /*********************************************************************************************/
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   218
    _LIT16(KIfClassName0, "USB Networking (NCM)");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   219
    HBufC16* string0 = KIfClassName0().AllocLC();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   220
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   221
    ifc0().iString = string0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   222
    ifc0().iTotalEndpointsUsed = 1;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   223
    ifc0().iClass.iClassNum = 0x02;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   224
    ifc0().iClass.iSubClassNum = 0x0D;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   225
    ifc0().iClass.iProtocolNum = 0x00;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   226
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   227
    User::LeaveIfError(iCommLdd.SetInterface(0, ifc0));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   228
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   229
    err = iCommLdd.FinalizeInterface();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   230
    if (KErrNone != err)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   231
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   232
        OstTrace1(TRACE_ERROR, CNCMCLIENTMANAGER_SETCOMMUNICATIONINTERFACEL_FAIL_TO_INIT, "Failed to FinalizeInterface, err %d", err);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   233
        User::Leave(err);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   234
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   235
    CleanupStack::PopAndDestroy(string0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   236
    OstTraceFunctionExit1( CNCMCLIENTMANAGER_SETCOMMUNICATIONINTERFACEL_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   237
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   238
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   239
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   240
 * Setup NCM data interface
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   241
 * @param   aDataEpBufferSize, the determined data interface 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   242
 *          endpoint buffer size.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   243
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   244
void CNcmClientManager::SetDataInterfaceL(TUint& aDataEpBufferSize)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   245
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   246
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_SETDATAINTERFACEL_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   247
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   248
    const TUint KMaxScBufferSize = 1048576; // Up limit of end point buffer
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   249
    const TUint KMinScBufferSize = 262144;  // Lower limit of end point buffer
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   250
    const TUint KMaxScReadSize = 65536;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   251
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   252
    User::LeaveIfError(iDataLdd.Open(0));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   253
    iDataLddInitiated = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   254
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   255
    TUsbcScInterfaceInfoBuf ifc0, ifc1;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   256
    TUsbDeviceCaps dCaps;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   257
    User::LeaveIfError(iDataLdd.DeviceCaps(dCaps));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   258
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   259
    TBool isResourceAllocationV2 = ((dCaps().iFeatureWord1
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   260
            & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) != 0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   261
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   262
    TUsbcDeviceState deviceStatus;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   263
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   264
    User::LeaveIfError(iDataLdd.DeviceStatus(deviceStatus));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   265
    if (deviceStatus == EUsbcDeviceStateConfigured)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   266
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   267
        User::Leave(KErrInUse);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   268
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   269
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   270
    TInt epNum = dCaps().iTotalEndpoints;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   271
    TUsbcEndpointData data[KUsbcMaxEndpoints];
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   272
    TPtr8 dataptr(reinterpret_cast<TUint8*> (data), sizeof(data),
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   273
            sizeof(data));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   274
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   275
    User::LeaveIfError(iDataLdd.EndpointCaps(dataptr));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   276
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   277
    const TUint KNcmDataInterfaceEpNumber = 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   278
    TBool foundBulkIN = EFalse;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   279
    TBool foundBulkOUT = EFalse;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   280
    TInt maxPacketSize = 0;
39
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   281
    const TUint KEndPointBulkInType = KUsbEpTypeBulk | KUsbEpDirIn;
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   282
    const TUint KEndPointBulkOutType = KUsbEpTypeBulk | KUsbEpDirOut;
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   283
    for (TInt i = 0; i < epNum; i++)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   284
        {
39
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   285
        const TUsbcEndpointData* epData = &data[i];
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   286
        
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   287
        // Check if this endpoint is in use 
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   288
        if (epData->iInUse)
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   289
            {
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   290
            continue;
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   291
            }
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   292
        
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   293
        maxPacketSize = epData->iCaps.MaxPacketSize();
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   294
        if (!foundBulkIN && 
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   295
                ((epData->iCaps.iTypesAndDir & KEndPointBulkInType) == KEndPointBulkInType))
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   296
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   297
            // EEndpoint1 is going to be our TX (IN, write) endpoint
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   298
            ifc1().iEndpointData[0].iType = KUsbEpTypeBulk;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   299
            ifc1().iEndpointData[0].iDir = KUsbEpDirIn;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   300
            ifc1().iEndpointData[0].iSize = maxPacketSize;
39
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   301
            ifc1().iEndpointData[0].iInterval_Hs = 0x0;
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   302
            ifc1().iEndpointData[0].iBufferSize = KMaxScBufferSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   303
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   304
            if (isResourceAllocationV2)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   305
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   306
                ifc1().iEndpointData[0].iFeatureWord1 |= 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   307
                    (KUsbcEndpointInfoFeatureWord1_DMA | KUsbcEndpointInfoFeatureWord1_DoubleBuffering);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   308
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   309
            
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   310
            foundBulkIN = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   311
            if (foundBulkIN && foundBulkOUT)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   312
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   313
                break;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   314
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   315
            continue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   316
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   317
39
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   318
        if (!foundBulkOUT && 
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   319
                ((epData->iCaps.iTypesAndDir & KEndPointBulkOutType) == KEndPointBulkOutType))
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   320
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   321
            // EEndpoint2 is going to be our RX (OUT, read) endpoint
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   322
            ifc1().iEndpointData[1].iType = KUsbEpTypeBulk;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   323
            ifc1().iEndpointData[1].iDir = KUsbEpDirOut;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   324
            ifc1().iEndpointData[1].iSize = maxPacketSize;
39
c4733e7476f1 201032_02
hgs
parents: 28
diff changeset
   325
            ifc1().iEndpointData[1].iInterval_Hs = 0x1;
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   326
            ifc1().iEndpointData[1].iBufferSize = KMaxScBufferSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   327
            ifc1().iEndpointData[1].iReadSize = KMaxScReadSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   328
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   329
            if (isResourceAllocationV2)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   330
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   331
                ifc1().iEndpointData[1].iFeatureWord1 |= 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   332
                    (KUsbcEndpointInfoFeatureWord1_DMA | KUsbcEndpointInfoFeatureWord1_DoubleBuffering);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   333
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   334
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   335
            foundBulkOUT = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   336
            if (foundBulkIN && foundBulkOUT)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   337
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   338
                break;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   339
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   340
            continue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   341
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   342
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   343
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   344
    // Leave if no properly endpoint is found
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   345
    if (EFalse == foundBulkIN || EFalse == foundBulkOUT)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   346
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   347
        User::Leave(KErrNotFound);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   348
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   349
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   350
    _LIT16(KIfClassName0, "NCM Data Interface 0");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   351
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   352
    HBufC16* string0 = KIfClassName0().AllocL();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   353
    CleanupStack::PushL(string0);    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   354
    ifc0().iString = string0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   355
    ifc0().iTotalEndpointsUsed = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   356
    ifc0().iClass.iClassNum = 0x0A;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   357
    ifc0().iClass.iSubClassNum = 0x00;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   358
    ifc0().iClass.iProtocolNum = 0x01;    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   359
    User::LeaveIfError(iDataLdd.SetInterface(0, ifc0));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   360
        
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   361
    _LIT16(KIfClassName1, "NCM Data Interface 1");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   362
    HBufC16* string1 = KIfClassName1().AllocL();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   363
    CleanupStack::PushL(string1);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   364
    ifc1().iString = string1;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   365
    ifc1().iTotalEndpointsUsed = KNcmDataInterfaceEpNumber;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   366
    ifc1().iClass.iClassNum = 0x0A;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   367
    ifc1().iClass.iSubClassNum = 0x00;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   368
    ifc1().iClass.iProtocolNum = 0x01;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   369
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   370
    // Try to allocate expected memory for data interface endpoints
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   371
    aDataEpBufferSize = KMaxScBufferSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   372
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   373
    TInt err = KErrNone; 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   374
    FOREVER
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   375
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   376
        OstTrace1(TRACE_NORMAL, CNCMCLIENTMANAGER_SETDATAINTERFACEL_TRY_NEW_BUF_SIZE, "Try buffer size: %d", aDataEpBufferSize);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   377
        err = iDataLdd.SetInterface(1, ifc1);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   378
        if (KErrNoMemory == err)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   379
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   380
            // Reduce buffer size and retry
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   381
            aDataEpBufferSize = aDataEpBufferSize / 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   382
            if (aDataEpBufferSize < KMinScBufferSize)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   383
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   384
                User::Leave(KErrNoMemory);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   385
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   386
            ifc1().iEndpointData[0].iBufferSize = aDataEpBufferSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   387
            ifc1().iEndpointData[1].iBufferSize = aDataEpBufferSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   388
            continue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   389
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   390
        else
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   391
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   392
            OstTrace1(TRACE_ERROR, CNCMCLIENTMANAGER_SETDATAINTERFACEL_SET_INTERFACE_FAIL, "Set data interface and the returned err code is %d", err);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   393
            // Leave with error code
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   394
            User::LeaveIfError(err);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   395
            break;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   396
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   397
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   398
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   399
    CleanupStack::PopAndDestroy(2, string0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   400
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   401
    User::LeaveIfError(iDataLdd.FinalizeInterface());
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   402
    OstTraceFunctionExit1( CNCMCLIENTMANAGER_SETDATAINTERFACEL_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   403
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   404
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   405
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   406
 * Setup the Class Descriptors
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   407
 * @param aDataInterfaceNumber The interface number of the data class
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   408
 * @return Error.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   409
 */
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   410
TInt CNcmClientManager::SetupClassSpecificDescriptor(TUint8 aControlInterfaceNumber,TUint8 aDataInterfaceNumber)
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   411
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   412
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_SETUPCLASSSPECIFICDESCRIPTOR_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   413
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   414
    TInt res;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   415
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   416
    TNcmClassDescriptor descriptor;   
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   417
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   418
    // Header Functional Descriptor- CDC spec table 15
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   419
    descriptor.iHdrSize = 0x05;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   420
    descriptor.iHdrType = 0x24;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   421
    descriptor.iHdrSubType = 0x00;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   422
    descriptor.iHdrBcdCDC = 0x0120;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   423
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   424
    // Ethernet Networking Functional Descriptor-    ECM spec table 3
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   425
    descriptor.iEthFunLength = 0x0D;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   426
    descriptor.iEthFunType = 0x24;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   427
    descriptor.iEthFunSubtype = 0x0F;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   428
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   429
    // Generate the MAC address new NCM interface
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   430
    res = SetMacAddressString(descriptor.iMACAddress);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   431
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   432
    if (res != KErrNone)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   433
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   434
        OstTraceFunctionExitExt( CNCMCLIENTMANAGER_SETUPCLASSSPECIFICDESCRIPTOR_EXIT, this, res );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   435
        return res;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   436
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   437
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   438
    descriptor.iEthernetStatistics = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   439
    descriptor.iMaxSegmentSize = KEthernetFrameSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   440
    descriptor.iNumberMCFilters = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   441
    descriptor.iNumberPowerFilters = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   442
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   443
    // NCM Functional Descriptor-    NCM spec table 5-2
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   444
    descriptor.iNcmFunLength = 0x06;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   445
    descriptor.iNcmFunType = 0x24;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   446
    descriptor.iNcmFunSubtype = 0x1A;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   447
    descriptor.iNcmVersion = 0x0100;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   448
    descriptor.iNetworkCapabilities = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   449
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   450
    // Union functional descriptor- CDC spec table 16
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   451
    descriptor.iUnSize = 0x05;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   452
    descriptor.iUnType = 0x24;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   453
    descriptor.iUnSubType = 0x06;
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   454
    descriptor.iUnMasterInterface = aControlInterfaceNumber;
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   455
    descriptor.iUnSlaveInterface = aDataInterfaceNumber;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   456
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   457
    OstTrace0( TRACE_NORMAL, CNCMCLIENTMANAGER_SETUPCLASSSPECIFICDESCRIPTOR_PRE_SET_BLOCK, "About to call SetCSInterfaceDescriptorBlock" );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   458
    res = iCommLdd.SetCSInterfaceDescriptorBlock(0, descriptor.Des());
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   459
    if (res != KErrNone)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   460
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   461
        OstTraceFunctionExitExt( CNCMCLIENTMANAGER_SETUPCLASSSPECIFICDESCRIPTOR_EXIT_DUP1, this, res );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   462
        return res;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   463
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   464
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   465
    OstTraceFunctionExitExt( CNCMCLIENTMANAGER_SETUPCLASSSPECIFICDESCRIPTOR_EXIT_DUP2, this, KErrNone );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   466
    return KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   467
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   468
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   469
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   470
 * Set the MAC address string in descriptor
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   471
 * @param aStrIndex the MAC address string index
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   472
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   473
TInt CNcmClientManager::SetMacAddressString(TUint8& aStrIndex)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   474
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   475
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_SETMACADDRESSSTRING_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   476
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   477
    TBuf16<KMacAddrStringDescSize> str;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   478
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   479
    // Search for MAC address string from index 0x10
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   480
    aStrIndex = 0x10;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   481
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   482
    TInt ret = KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   483
#ifndef OVERDUMMY_NCMCC
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   484
    while (aStrIndex++ < 0xFF && ret != KErrNotFound)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   485
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   486
        ret = iDataLdd.GetStringDescriptor(aStrIndex, str);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   487
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   488
#endif // OVERDUMMY_NCMCC
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   489
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   490
    if (aStrIndex < 0xFF)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   491
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   492
        TBuf8<KEthernetAddressLength*2> macAddrStr;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   493
        _LIT8(KMacAddressFormat, "%02X%02X%02X%02X%02X%02X");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   494
        OstTraceExt1(TRACE_NORMAL, CNCMCLIENTMANAGER_SETMACADDRESSSTRING, "The MAC address is %s", iHostMacAddress);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   495
        macAddrStr.AppendFormat(KMacAddressFormat, iHostMacAddress[0],
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   496
                iHostMacAddress[1], iHostMacAddress[2], iHostMacAddress[3],
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   497
                iHostMacAddress[4], iHostMacAddress[5]);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   498
        str.Copy(macAddrStr);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   499
        ret = iDataLdd.SetStringDescriptor(aStrIndex, str);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   500
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   501
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   502
    OstTraceFunctionExitExt( CNCMCLIENTMANAGER_SETMACADDRESSSTRING_EXIT, this, ret );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   503
    return ret;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   504
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   505
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   506
/**
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   507
 * Get interface number
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   508
 * @param aLdd The logic device driver which can be used to query for.
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   509
 * @param aSettingsNumber The alter settings for the interface
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   510
 * @param [out] aInterfaceNumber Carry out the interface bumber back to caller.
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   511
 * @return KErrNone If interface number is return via aInterfaceNumber.
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   512
 *                  Other system wide error code if anything went wrong.
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   513
 */
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   514
TInt CNcmClientManager::InterfaceNumber(RDevUsbcScClient& aLdd,TInt aSettingsNumber,TUint8& aInterfaceNumber)
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   515
    {
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   516
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_INTERFACENUMBER_ENTRY, this );
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   517
    
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   518
    // Get descriptor size first
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   519
    TInt interfaceSize = 0;
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   520
    TInt res = aLdd.GetInterfaceDescriptorSize(aSettingsNumber, interfaceSize);
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   521
    if ( KErrNone == res )
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   522
        {
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   523
        OstTraceFunctionExitExt( CNCMCLIENTMANAGER_INTERFACENUMBER_EXIT, this, res );
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   524
        return res;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   525
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   526
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   527
    // Allocate enough buffer
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   528
    HBufC8* interfaceBuf = HBufC8::New(interfaceSize);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   529
    if ( !interfaceBuf )
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   530
        {
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   531
        OstTraceFunctionExitExt( CNCMCLIENTMANAGER_INTERFACENUMBER_EXIT_DUP1, this, KErrNoMemory);
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   532
        return KErrNoMemory;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   533
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   534
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   535
    // Get the buffer back
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   536
    TPtr8 interfacePtr = interfaceBuf->Des();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   537
    interfacePtr.SetLength(0);
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   538
    res = aLdd.GetInterfaceDescriptor(aSettingsNumber, interfacePtr); 
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   539
    if ( KErrNone == res )
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   540
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   541
        delete interfaceBuf;
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   542
        OstTraceFunctionExitExt( CNCMCLIENTMANAGER_INTERFACENUMBER_EXIT_DUP2, this, res );
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   543
        return res;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   544
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   545
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   546
    OstTrace1(TRACE_NORMAL, CNCMCLIENTMANAGER_INTERFACENUMBER_INTERFACE_INFO, "***Interface length =% d", interfacePtr.Length());
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   547
    
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   548
#ifdef OST_TRACE_COMPILER_IN_USE  // to depress a build warning incase no ost trace is used
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   549
    for ( TInt i = 0 ; i < interfacePtr.Length() ; i++ )
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   550
        {
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   551
        OstTrace1(TRACE_NORMAL, CNCMCLIENTMANAGER_INTERFACENUMBER_INTERFACE_INFO2, "***** %x", interfacePtr[i]);
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   552
        }
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   553
#endif
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   554
    
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   555
    const TUint8* buffer = reinterpret_cast<const TUint8*>(interfacePtr.Ptr());
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   556
    
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   557
    // 2 is where the interface number is, according to the LDD API
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   558
    aInterfaceNumber = buffer[2];
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   559
    
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   560
    OstTraceExt1(TRACE_NORMAL, CNCMCLIENTMANAGER_INTERFACENUMBER, "Interface number = %hhu", aInterfaceNumber);
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   561
    
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   562
    // Now it is safe to delete the buffer we allocated.
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   563
    delete interfaceBuf;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   564
49
93c0009bd947 201036_01
hgs
parents: 39
diff changeset
   565
    OstTraceFunctionExitExt( CNCMCLIENTMANAGER_INTERFACENUMBER_EXIT_DUP3, this, KErrNone );
28
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   566
    return KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   567
    }