diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.inl Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,280 @@ +/* +* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implementation of RWlanLogicalChannel inline methods. +* +*/ + +/* +* %version: 16 % +*/ + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline TVersion RWlanLogicalChannel::VersionRequired() const + { + return TVersion( + KWlanDriverMajorVersion, + KWlanDriverMinorVersion, + KWlanDriverBuildVersion ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline TInt RWlanLogicalChannel::Open( + TWlanUnit aUnit, + TOpenParam& aOpenParam ) + { + iWlanSystemInitialized = EFalse; + + TInt err = DoCreate( + LDD_NAME, + VersionRequired(), + aUnit, + NULL, + NULL, + EOwnerProcess); + + if ( err == KErrNone ) + { + // driver load sequence success + // do system init + err = InitWlanSystem( aOpenParam ); + + if ( err == KErrNone ) + { + // WLAN system successfully initialized + iWlanSystemInitialized = ETrue; + } + } + + return err; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void RWlanLogicalChannel::CloseChannel() + { + // release WLAN system resources only if we have been able to do the + // initialization successfully. + // This check is done to prevent a release attempt in a case where the + // device driver framework has not been properly initialized to be able to + // handle requests + if ( iWlanSystemInitialized ) + { + TRequestStatus status; + DoRequest( EWlanFinitSystem, status ); + User::WaitForRequest(status); + + // not initialized any more. This is needed to handle the case + // that this method is called multiple times + iWlanSystemInitialized = EFalse; + } + // internally call close + Close(); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline TInt RWlanLogicalChannel::InitWlanSystem( + TOpenParam& aOpenParam ) + { + TRequestStatus status; + DoRequest( EWlanInitSystem, status, &aOpenParam ); + User::WaitForRequest(status); + return status.Int(); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline TInt RWlanLogicalChannel::ManagementCommand( + const TDesC8& aInBuffer, + TDes8* aOutBuffer, + TRequestStatus* aStatus) + { + TInt ret( KErrNoMemory ); + SOidMsgStorage* pdu( new SOidMsgStorage ); + + if ( pdu ) + { + TUint32 input_param_len( aInBuffer.Length() ); + os_memcpy( pdu, aInBuffer.Ptr(), input_param_len ); + + SOutputBuffer output = { NULL, 0 }; + if ( aOutBuffer ) + { + output.iData = const_cast(aOutBuffer->Ptr()); + output.iLen = aOutBuffer->Length(); + } + + if (aStatus == NULL) + { + // Execute command synchronously + TRequestStatus status; + + DoRequest( + EWlanCommand, + status, + pdu, + (output.iData ? &output : NULL) ); + + User::WaitForRequest(status); + + ret = status.Int(); + } + else + { + // Execute command asynchronously + + iAsyncOidCommandMsg = *pdu; + iAsyncOidCommandOutput = output; + DoRequest( + EWlanCommand, + *aStatus, + &iAsyncOidCommandMsg, + (output.iData ? &iAsyncOidCommandOutput : NULL) ); + + ret = KErrNone; + } + + // always remember to deallocate + delete pdu; + } + + return ret; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void RWlanLogicalChannel::RequestSignal( + TRequestStatus &aStatus, + TIndication &aBuffer) + { + DoRequest(EWlanRequestNotify, aStatus, &aBuffer); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void RWlanLogicalChannel::CancelRequestSignal() + { + // DoCancel uses mask instead of real values. + DoCancel(1<(&info) ); + + if ( status == KErrNone ) + { + // shared memory chunk initialization success + + // Set the handle for the shared memory chunk + iSharedMemoryChunk.SetHandle( info.iChunkHandle ); + + // Set the relevant user mode + // addresses as offsets from the chunk base address + + TUint8* baseAddress ( iSharedMemoryChunk.Base() ); + + const TUint KRxDataChunkSize( + info.iSize + - ( sizeof( TDataBuffer ) + + KMgmtSideTxBufferLength + + KProtocolStackSideTxDataChunkSize + + sizeof( RFrameXferBlock ) + + sizeof( RFrameXferBlockProtocolStack ) ) ); + + aFrameXferBlock = reinterpret_cast( + baseAddress + + KRxDataChunkSize + + sizeof( TDataBuffer ) + + KMgmtSideTxBufferLength + + KProtocolStackSideTxDataChunkSize ); + + aFrameXferBlock->SetRxDataChunkField( reinterpret_cast( + baseAddress) ); + + aFrameXferBlock->SetTxDataBufferField( reinterpret_cast( + baseAddress + + KRxDataChunkSize ) ); + } + + return status; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline TInt RWlanLogicalChannel::ReleaseBuffers() + { + // close the handle to the shared memory chunk + iSharedMemoryChunk.Close(); + + return DoSvControl( EWlanSvControlFreeBuffers ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void RWlanLogicalChannel::WriteFrame( + TRequestStatus &aStatus ) + { + DoRequest( EWlanRequestSend, aStatus ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void RWlanLogicalChannel::RequestFrame( + TRequestStatus &aStatus ) + { + DoRequest( EWlanRequestFrame, aStatus ); + }