usbmgmt/usbmgr/device/classdrivers/ncm/classcontroller/src/ncmclientmanager.cpp
author hgs
Wed, 07 Jul 2010 14:16:40 +0800
changeset 28 f1fd07aa74c9
child 39 c4733e7476f1
permissions -rw-r--r--
201025_08
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
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   123
    // Retrieve data interface number
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   124
    TUint8 dataInterfaceNumber = 1;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   125
    User::LeaveIfError(DataInterfaceNumber(dataInterfaceNumber));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   126
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   127
    // Setup NCM class descriptor with correct interface number
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   128
    User::LeaveIfError(SetupClassSpecificDescriptor(dataInterfaceNumber));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   129
    OstTraceFunctionExit1( CNCMCLIENTMANAGER_SETNCMINTERFACESL_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   130
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   131
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   132
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   133
 * Transfer NCM interface handlers from NCM class controller to NCM 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   134
 * packet driver through NCM internal server.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   135
 * @param aServer a reference to RNcmInternalSrv 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   136
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   137
void CNcmClientManager::TransferInterfacesL(RNcmInternalSrv& aServer)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   138
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   139
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_TRANSFERINTERFACESL_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   140
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   141
    RChunk* commChunk = NULL;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   142
    RChunk* dataChunk = NULL;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   143
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   144
    OstTrace0(TRACE_NORMAL, CNCMCLIENTMANAGER_TRANSFERINTERFACESL_PRE_TRANSFER_INTERFACES, "About to Transfer handles to NCM internal server!");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   145
    User::LeaveIfError(iCommLdd.GetDataTransferChunk(commChunk));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   146
    User::LeaveIfError(iDataLdd.GetDataTransferChunk(dataChunk));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   147
    User::LeaveIfError(aServer.TransferHandle(iCommLdd, *commChunk, 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   148
            iDataLdd, *dataChunk));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   149
    OstTrace0(TRACE_NORMAL, CNCMCLIENTMANAGER_TRANSFERINTERFACESL_INTERFACES_TRANSFERED, "Transfer handles to NCM internal server Done!");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   150
    OstTraceFunctionExit1( CNCMCLIENTMANAGER_TRANSFERINTERFACESL_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   151
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   152
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   153
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   154
 * Setup NCM communication inteface
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   155
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   156
void CNcmClientManager::SetCommunicationInterfaceL()
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   157
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   158
    OstTraceFunctionEntry1( CNCMCLIENTMANAGER_SETCOMMUNICATIONINTERFACEL_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   159
        
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   160
    User::LeaveIfError(iCommLdd.Open(0));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   161
    iCommLddInitiated = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   162
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   163
    TInt err = KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   164
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   165
    TUsbcScInterfaceInfoBuf ifc0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   166
    TUsbcDeviceState deviceStatus;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   167
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   168
    User::LeaveIfError(iCommLdd.DeviceStatus(deviceStatus));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   169
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   170
    if (deviceStatus == EUsbcDeviceStateConfigured)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   171
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   172
        User::Leave( KErrInUse);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   173
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   174
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   175
    TUsbDeviceCaps dCaps;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   176
    User::LeaveIfError(iCommLdd.DeviceCaps(dCaps));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   177
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   178
    TInt epNum = dCaps().iTotalEndpoints;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   179
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   180
    TUsbcEndpointData data[KUsbcMaxEndpoints];
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   181
    TPtr8 dataptr(reinterpret_cast<TUint8*> (data), sizeof(data),
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   182
            sizeof(data));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   183
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   184
    User::LeaveIfError(iCommLdd.EndpointCaps(dataptr));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   185
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   186
    TBool foundIntIN = EFalse;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   187
    for (TInt i = 0; i < epNum; i++)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   188
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   189
        const TUsbcEndpointCaps* caps = &data[i].iCaps;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   190
        if ((caps->iTypesAndDir & (KUsbEpTypeInterrupt | KUsbEpDirIn))
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   191
                == (KUsbEpTypeInterrupt | KUsbEpDirIn))
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   192
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   193
            // EEndpoint1 is going to be our INTERRUPT (IN, write) endpoint
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   194
            ifc0().iEndpointData[0].iType = KUsbEpTypeInterrupt;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   195
            ifc0().iEndpointData[0].iDir = KUsbEpDirIn;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   196
            ifc0().iEndpointData[0].iSize = caps->MinPacketSize();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   197
            ifc0().iEndpointData[0].iInterval = 0x01;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   198
            ifc0().iEndpointData[0].iInterval_Hs = 0x01;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   199
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   200
            foundIntIN = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   201
            break;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   202
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   203
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   204
    if (EFalse == foundIntIN)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   205
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   206
        OstTrace0( TRACE_ERROR, CNCMCLIENTMANAGER_SETCOMMUNICATIONINTERFACEL, "Can not find proper endpint for NCM communication interface" );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   207
        User::Leave( KErrNotFound);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   208
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   209
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   210
    /*********************************************************************************************/
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   211
    //Communication Class Interface (0x00)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   212
    /*********************************************************************************************/
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   213
    _LIT16(KIfClassName0, "USB Networking (NCM)");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   214
    HBufC16* string0 = KIfClassName0().AllocLC();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   215
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   216
    ifc0().iString = string0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   217
    ifc0().iTotalEndpointsUsed = 1;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   218
    ifc0().iClass.iClassNum = 0x02;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   219
    ifc0().iClass.iSubClassNum = 0x0D;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   220
    ifc0().iClass.iProtocolNum = 0x00;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   221
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   222
    User::LeaveIfError(iCommLdd.SetInterface(0, ifc0));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   223
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   224
    err = iCommLdd.FinalizeInterface();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   225
    if (KErrNone != err)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   226
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   227
        OstTrace1(TRACE_ERROR, CNCMCLIENTMANAGER_SETCOMMUNICATIONINTERFACEL_FAIL_TO_INIT, "Failed to FinalizeInterface, err %d", err);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   228
        User::Leave(err);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   229
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   230
    CleanupStack::PopAndDestroy(string0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   231
    OstTraceFunctionExit1( CNCMCLIENTMANAGER_SETCOMMUNICATIONINTERFACEL_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   232
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   233
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   234
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   235
 * Setup NCM data interface
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   236
 * @param   aDataEpBufferSize, the determined data interface 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   237
 *          endpoint buffer size.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   238
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   239
void CNcmClientManager::SetDataInterfaceL(TUint& aDataEpBufferSize)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   240
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   241
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_SETDATAINTERFACEL_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   242
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   243
    const TUint KMaxScBufferSize = 1048576; // Up limit of end point buffer
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   244
    const TUint KMinScBufferSize = 262144;  // Lower limit of end point buffer
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   245
    const TUint KMaxScReadSize = 65536;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   246
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   247
    User::LeaveIfError(iDataLdd.Open(0));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   248
    iDataLddInitiated = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   249
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   250
    TUsbcScInterfaceInfoBuf ifc0, ifc1;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   251
    TUsbDeviceCaps dCaps;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   252
    User::LeaveIfError(iDataLdd.DeviceCaps(dCaps));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   253
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   254
    TBool isResourceAllocationV2 = ((dCaps().iFeatureWord1
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   255
            & KUsbDevCapsFeatureWord1_EndpointResourceAllocV2) != 0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   256
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   257
    TUsbcDeviceState deviceStatus;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   258
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   259
    User::LeaveIfError(iDataLdd.DeviceStatus(deviceStatus));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   260
    if (deviceStatus == EUsbcDeviceStateConfigured)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   261
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   262
        User::Leave(KErrInUse);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   263
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   264
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   265
    TInt epNum = dCaps().iTotalEndpoints;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   266
    TUsbcEndpointData data[KUsbcMaxEndpoints];
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   267
    TPtr8 dataptr(reinterpret_cast<TUint8*> (data), sizeof(data),
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   268
            sizeof(data));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   269
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   270
    User::LeaveIfError(iDataLdd.EndpointCaps(dataptr));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   271
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   272
    const TUint KNcmDataInterfaceEpNumber = 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   273
    TBool foundBulkIN = EFalse;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   274
    TBool foundBulkOUT = EFalse;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   275
    TInt maxPacketSize = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   276
    for (TInt i = 0; i < epNum; i++)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   277
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   278
        const TUsbcEndpointCaps* caps = &data[i].iCaps;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   279
        maxPacketSize = caps->MaxPacketSize();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   280
        if (!foundBulkIN && (caps->iTypesAndDir & (KUsbEpTypeBulk
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   281
                | KUsbEpDirIn)) == (KUsbEpTypeBulk | KUsbEpDirIn))
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   282
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   283
            // EEndpoint1 is going to be our TX (IN, write) endpoint
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   284
            ifc1().iEndpointData[0].iType = KUsbEpTypeBulk;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   285
            ifc1().iEndpointData[0].iDir = KUsbEpDirIn;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   286
            ifc1().iEndpointData[0].iSize = maxPacketSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   287
            ifc1().iEndpointData[0].iInterval_Hs = 0x01;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   288
            ifc1().iEndpointData[0].iBufferSize = KMaxScBufferSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   289
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   290
            if (isResourceAllocationV2)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   291
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   292
                ifc1().iEndpointData[0].iFeatureWord1 |= 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   293
                    (KUsbcEndpointInfoFeatureWord1_DMA | KUsbcEndpointInfoFeatureWord1_DoubleBuffering);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   294
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   295
            
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   296
            foundBulkIN = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   297
            if (foundBulkIN && foundBulkOUT)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   298
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   299
                break;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   300
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   301
            continue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   302
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   303
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   304
        if (!foundBulkOUT && (caps->iTypesAndDir & (KUsbEpTypeBulk
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   305
                | KUsbEpDirOut)) == (KUsbEpTypeBulk | KUsbEpDirOut))
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   306
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   307
            // EEndpoint2 is going to be our RX (OUT, read) endpoint
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   308
            ifc1().iEndpointData[1].iType = KUsbEpTypeBulk;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   309
            ifc1().iEndpointData[1].iDir = KUsbEpDirOut;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   310
            ifc1().iEndpointData[1].iSize = maxPacketSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   311
            ifc1().iEndpointData[1].iInterval_Hs = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   312
            ifc1().iEndpointData[1].iBufferSize = KMaxScBufferSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   313
            ifc1().iEndpointData[1].iReadSize = KMaxScReadSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   314
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   315
            if (isResourceAllocationV2)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   316
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   317
                ifc1().iEndpointData[1].iFeatureWord1 |= 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   318
                    (KUsbcEndpointInfoFeatureWord1_DMA | KUsbcEndpointInfoFeatureWord1_DoubleBuffering);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   319
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   320
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   321
            foundBulkOUT = ETrue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   322
            if (foundBulkIN && foundBulkOUT)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   323
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   324
                break;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   325
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   326
            continue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   327
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   328
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   329
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   330
    // Leave if no properly endpoint is found
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   331
    if (EFalse == foundBulkIN || EFalse == foundBulkOUT)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   332
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   333
        User::Leave(KErrNotFound);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   334
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   335
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   336
    _LIT16(KIfClassName0, "NCM Data Interface 0");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   337
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   338
    HBufC16* string0 = KIfClassName0().AllocL();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   339
    CleanupStack::PushL(string0);    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   340
    ifc0().iString = string0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   341
    ifc0().iTotalEndpointsUsed = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   342
    ifc0().iClass.iClassNum = 0x0A;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   343
    ifc0().iClass.iSubClassNum = 0x00;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   344
    ifc0().iClass.iProtocolNum = 0x01;    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   345
    User::LeaveIfError(iDataLdd.SetInterface(0, ifc0));
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   346
        
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   347
    _LIT16(KIfClassName1, "NCM Data Interface 1");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   348
    HBufC16* string1 = KIfClassName1().AllocL();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   349
    CleanupStack::PushL(string1);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   350
    ifc1().iString = string1;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   351
    ifc1().iTotalEndpointsUsed = KNcmDataInterfaceEpNumber;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   352
    ifc1().iClass.iClassNum = 0x0A;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   353
    ifc1().iClass.iSubClassNum = 0x00;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   354
    ifc1().iClass.iProtocolNum = 0x01;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   355
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   356
    // Try to allocate expected memory for data interface endpoints
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   357
    aDataEpBufferSize = KMaxScBufferSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   358
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   359
    TInt err = KErrNone; 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   360
    FOREVER
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   361
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   362
        OstTrace1(TRACE_NORMAL, CNCMCLIENTMANAGER_SETDATAINTERFACEL_TRY_NEW_BUF_SIZE, "Try buffer size: %d", aDataEpBufferSize);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   363
        err = iDataLdd.SetInterface(1, ifc1);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   364
        if (KErrNoMemory == err)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   365
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   366
            // Reduce buffer size and retry
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   367
            aDataEpBufferSize = aDataEpBufferSize / 2;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   368
            if (aDataEpBufferSize < KMinScBufferSize)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   369
                {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   370
                User::Leave(KErrNoMemory);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   371
                }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   372
            ifc1().iEndpointData[0].iBufferSize = aDataEpBufferSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   373
            ifc1().iEndpointData[1].iBufferSize = aDataEpBufferSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   374
            continue;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   375
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   376
        else
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   377
            {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   378
            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
   379
            // Leave with error code
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   380
            User::LeaveIfError(err);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   381
            break;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   382
            }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   383
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   384
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   385
    CleanupStack::PopAndDestroy(2, string0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   386
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   387
    User::LeaveIfError(iDataLdd.FinalizeInterface());
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   388
    OstTraceFunctionExit1( CNCMCLIENTMANAGER_SETDATAINTERFACEL_EXIT, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   389
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   390
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   391
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   392
 * Setup the Class Descriptors
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   393
 * @param aDataInterfaceNumber The interface number of the data class
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   394
 * @return Error.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   395
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   396
TInt CNcmClientManager::SetupClassSpecificDescriptor(TUint8 aDataInterfaceNumber)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   397
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   398
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_SETUPCLASSSPECIFICDESCRIPTOR_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   399
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   400
    TInt res;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   401
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   402
    TNcmClassDescriptor descriptor;   
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   403
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   404
    // Header Functional Descriptor- CDC spec table 15
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   405
    descriptor.iHdrSize = 0x05;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   406
    descriptor.iHdrType = 0x24;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   407
    descriptor.iHdrSubType = 0x00;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   408
    descriptor.iHdrBcdCDC = 0x0120;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   409
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   410
    // Ethernet Networking Functional Descriptor-    ECM spec table 3
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   411
    descriptor.iEthFunLength = 0x0D;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   412
    descriptor.iEthFunType = 0x24;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   413
    descriptor.iEthFunSubtype = 0x0F;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   414
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   415
    // Generate the MAC address new NCM interface
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   416
    res = SetMacAddressString(descriptor.iMACAddress);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   417
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   418
    if (res != KErrNone)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   419
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   420
        OstTraceFunctionExitExt( CNCMCLIENTMANAGER_SETUPCLASSSPECIFICDESCRIPTOR_EXIT, this, res );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   421
        return res;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   422
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   423
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   424
    descriptor.iEthernetStatistics = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   425
    descriptor.iMaxSegmentSize = KEthernetFrameSize;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   426
    descriptor.iNumberMCFilters = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   427
    descriptor.iNumberPowerFilters = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   428
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   429
    // NCM Functional Descriptor-    NCM spec table 5-2
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   430
    descriptor.iNcmFunLength = 0x06;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   431
    descriptor.iNcmFunType = 0x24;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   432
    descriptor.iNcmFunSubtype = 0x1A;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   433
    descriptor.iNcmVersion = 0x0100;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   434
    descriptor.iNetworkCapabilities = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   435
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   436
    // Union functional descriptor- CDC spec table 16
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   437
    descriptor.iUnSize = 0x05;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   438
    descriptor.iUnType = 0x24;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   439
    descriptor.iUnSubType = 0x06;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   440
    descriptor.iUnMasterInterface = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   441
    descriptor.iUnSlaveInterface = aDataInterfaceNumber;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   442
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   443
    OstTrace0( TRACE_NORMAL, CNCMCLIENTMANAGER_SETUPCLASSSPECIFICDESCRIPTOR_PRE_SET_BLOCK, "About to call SetCSInterfaceDescriptorBlock" );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   444
    res = iCommLdd.SetCSInterfaceDescriptorBlock(0, descriptor.Des());
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   445
    if (res != KErrNone)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   446
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   447
        OstTraceFunctionExitExt( CNCMCLIENTMANAGER_SETUPCLASSSPECIFICDESCRIPTOR_EXIT_DUP1, this, res );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   448
        return res;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   449
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   450
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   451
    OstTraceFunctionExitExt( CNCMCLIENTMANAGER_SETUPCLASSSPECIFICDESCRIPTOR_EXIT_DUP2, this, KErrNone );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   452
    return KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   453
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   454
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   455
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   456
 * Set the MAC address string in descriptor
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   457
 * @param aStrIndex the MAC address string index
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   458
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   459
TInt CNcmClientManager::SetMacAddressString(TUint8& aStrIndex)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   460
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   461
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_SETMACADDRESSSTRING_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   462
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   463
    TBuf16<KMacAddrStringDescSize> str;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   464
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   465
    // Search for MAC address string from index 0x10
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   466
    aStrIndex = 0x10;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   467
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   468
    TInt ret = KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   469
#ifndef OVERDUMMY_NCMCC
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   470
    while (aStrIndex++ < 0xFF && ret != KErrNotFound)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   471
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   472
        ret = iDataLdd.GetStringDescriptor(aStrIndex, str);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   473
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   474
#endif // OVERDUMMY_NCMCC
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   475
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   476
    if (aStrIndex < 0xFF)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   477
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   478
        TBuf8<KEthernetAddressLength*2> macAddrStr;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   479
        _LIT8(KMacAddressFormat, "%02X%02X%02X%02X%02X%02X");
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   480
        OstTraceExt1(TRACE_NORMAL, CNCMCLIENTMANAGER_SETMACADDRESSSTRING, "The MAC address is %s", iHostMacAddress);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   481
        macAddrStr.AppendFormat(KMacAddressFormat, iHostMacAddress[0],
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   482
                iHostMacAddress[1], iHostMacAddress[2], iHostMacAddress[3],
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   483
                iHostMacAddress[4], iHostMacAddress[5]);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   484
        str.Copy(macAddrStr);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   485
        ret = iDataLdd.SetStringDescriptor(aStrIndex, str);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   486
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   487
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   488
    OstTraceFunctionExitExt( CNCMCLIENTMANAGER_SETMACADDRESSSTRING_EXIT, this, ret );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   489
    return ret;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   490
    }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   491
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   492
/**
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   493
 * Get NCM data interface number
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   494
 * @param aInterfaceNumber NCM data interface number
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   495
 * @return Error.
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   496
 */
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   497
TInt CNcmClientManager::DataInterfaceNumber(TUint8& aInterfaceNumber)
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   498
    {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   499
    OstTraceFunctionEntryExt( CNCMCLIENTMANAGER_DATAINTERFACENUMBER_ENTRY, this );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   500
    
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   501
    TInt interfaceSize = 0;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   502
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   503
    // 0 means the main interface in the LDD API
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   504
    TInt res = iDataLdd.GetInterfaceDescriptorSize(0, interfaceSize);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   505
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   506
    if ( KErrNone == res )
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   507
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   508
        OstTraceFunctionExitExt( CNCMCLIENTMANAGER_DATAINTERFACENUMBER_EXIT, this, res );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   509
        return res;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   510
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   511
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   512
    HBufC8* interfaceBuf = HBufC8::New(interfaceSize);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   513
    if ( !interfaceBuf )
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   514
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   515
        OstTraceFunctionExitExt( CNCMCLIENTMANAGER_DATAINTERFACENUMBER_EXIT_DUP1, this, KErrNoMemory);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   516
        return KErrNoMemory;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   517
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   518
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   519
    TPtr8 interfacePtr = interfaceBuf->Des();
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   520
    interfacePtr.SetLength(0);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   521
    // 0 means the main interface in the LDD API
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   522
    res = iDataLdd.GetInterfaceDescriptor(0, interfacePtr); 
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   523
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   524
    if ( KErrNone == res )
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   525
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   526
        delete interfaceBuf;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   527
        OstTraceFunctionExitExt( CNCMCLIENTMANAGER_DATAINTERFACENUMBER_EXIT_DUP2, this, res );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   528
        return res;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   529
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   530
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   531
    OstTrace1(TRACE_NORMAL, CNCMCLIENTMANAGER_DATAINTERFACENUMBER_INTERFACE_INFO, "***Interface length =% d", interfacePtr.Length());
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   532
    for ( TInt i = 0 ; i < interfacePtr.Length() ; i++ )
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   533
        {
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   534
        OstTrace1(TRACE_NORMAL, CNCMCLIENTMANAGER_DATAINTERFACENUMBER_INTERFACE_INFO2, "***** %x", interfacePtr[i]);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   535
        }
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   536
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   537
    const TUint8* buffer = reinterpret_cast<const TUint8*>(interfacePtr.Ptr());
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   538
    // 2 is where the interface number is, according to the LDD API
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   539
    aInterfaceNumber = buffer[2];
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   540
    OstTraceExt1(TRACE_NORMAL, CNCMCLIENTMANAGER_DATAINTERFACENUMBER, "Interface number = %hhu", aInterfaceNumber);
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   541
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   542
    delete interfaceBuf;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   543
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   544
    OstTraceFunctionExitExt( CNCMCLIENTMANAGER_DATAINTERFACENUMBER_EXIT_DUP3, this, KErrNone );
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   545
    return KErrNone;
f1fd07aa74c9 201025_08
hgs
parents:
diff changeset
   546
    }