diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacconfiguretxqueueparams.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacconfiguretxqueueparams.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,327 @@ +/* +* Copyright (c) 2006-2007 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 WlanConfigureTxQueueParams class +* +*/ + +/* +* %version: 12 % +*/ + +#include "config.h" +#include "umacconfiguretxqueueparams.h" +#include "UmacContextImpl.h" +#include "umacwhaconfigurequeue.h" +#include "umacwhaconfigureac.h" + +#ifndef NDEBUG +const TInt8 WlanConfigureTxQueueParams::iName[] + = "wsacomplex-configuretxqueueparams"; + +const TUint8 WlanConfigureTxQueueParams::iStateName + [ESTATEMAX][KMaxStateStringLength] = + { + {"EINIT"}, + {"ECONFIGUREBESTEFFORTQUEUE"}, + {"ECONFIGUREVOICEQUEUE"}, + {"ECONFIGUREVIDEOQUEUE"}, + {"ECONFIGUREBACKGROUNDQUEUE"}, + {"ECONFIGUREAC"}, + {"EFINIT"} + }; + +const TUint8 WlanConfigureTxQueueParams::iEventName + [EEVENTMAX][KMaxEventStringLength] = + { + {"ESTATEENTRY"}, + {"ETXCOMPLETE"} + }; +#endif // !NDEBUG + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanConfigureTxQueueParams::Fsm( + WlanContextImpl& aCtxImpl, + TEvent aEvent ) + { + OsTracePrint( KUmacDetails, + (TUint8*)("UMAC: WlanConfigureTxQueueParams::Fsm(): FSM EVENT") ); +#ifndef NDEBUG + OsTracePrint( + KUmacDetails, + (TUint8*)("UMAC: WlanConfigureTxQueueParams::Fsm(): event:")); + OsTracePrint( KUmacDetails, iEventName[aEvent] ); + OsTracePrint( + KUmacDetails, + (TUint8*)("UMAC: WlanConfigureTxQueueParams::Fsm(): state:")); + OsTracePrint( KUmacDetails, iStateName[iState] ); +#endif + + switch ( aEvent ) + { + case ESTATEENTRY: + OnStateEntryEvent( aCtxImpl ); + break; + case ETXCOMPLETE: + OnTxCompleteEvent( aCtxImpl ); + break; + default: + // catch internal FSM programming error +#ifndef NDEBUG + OsTracePrint( KErrorLevel, (TUint8*)("UMAC: event:")); + OsTracePrint( KErrorLevel, iEventName[aEvent] ); +#endif + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanConfigureTxQueueParams::OnStateEntryEvent( + WlanContextImpl& aCtxImpl ) + { + switch ( iState ) + { + case EINIT: + ChangeInternalState( aCtxImpl, ECONFIGUREBESTEFFORTQUEUE ); + break; + case ECONFIGUREBESTEFFORTQUEUE: + ConfigureQueue( aCtxImpl, WHA::ELegacy ); + break; + case ECONFIGUREVOICEQUEUE: + ConfigureQueue( aCtxImpl, WHA::EVoice ); + break; + case ECONFIGUREVIDEOQUEUE: + ConfigureQueue( aCtxImpl, WHA::EVideo ); + break; + case ECONFIGUREBACKGROUNDQUEUE: + ConfigureQueue( aCtxImpl, WHA::EBackGround ); + break; + case ECONFIGUREAC: + ConfigureAc( aCtxImpl ); + break; + case EFINIT: + // fsm execution complete traverse back to history state + TraverseToHistoryState( aCtxImpl ); + break; + default: + // cath internal FSM programming error +#ifndef NDEBUG + OsTracePrint( KErrorLevel, (TUint8*)("UMAC: state:")); + OsTracePrint( KErrorLevel, iStateName[iState] ); +#endif + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanConfigureTxQueueParams::OnTxCompleteEvent( + WlanContextImpl& aCtxImpl ) + { + switch ( iState ) + { + case ECONFIGUREBESTEFFORTQUEUE: + // continue state traversal + ChangeInternalState( aCtxImpl, ECONFIGUREVOICEQUEUE ); + break; + case ECONFIGUREVOICEQUEUE: + // continue state traversal + ChangeInternalState( aCtxImpl, ECONFIGUREVIDEOQUEUE ); + break; + case ECONFIGUREVIDEOQUEUE: + // continue state traversal + ChangeInternalState( aCtxImpl, ECONFIGUREBACKGROUNDQUEUE ); + break; + case ECONFIGUREBACKGROUNDQUEUE: + // continue state traversal + ChangeInternalState( aCtxImpl, ECONFIGUREAC ); + break; + case ECONFIGUREAC: + // continue state traversal + ChangeInternalState( aCtxImpl, EFINIT ); + break; + default: + // cath internal FSM programming error +#ifndef NDEBUG + OsTracePrint( KErrorLevel, (TUint8*)("UMAC: state:")); + OsTracePrint( KErrorLevel, iStateName[iState] ); +#endif + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanConfigureTxQueueParams::ChangeInternalState( + WlanContextImpl& aCtxImpl, + TState aNewState ) + { + iState = aNewState; + Fsm( aCtxImpl, ESTATEENTRY ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanConfigureTxQueueParams::ConfigureQueue( + WlanContextImpl& aCtxImpl, + WHA::TQueueId aQueueId ) + { + OsTracePrint( + KUmacDetails, + (TUint8*)("UMAC: WlanConfigureTxQueueParams::ConfigureQueue") ); + + WHA::TPsScheme psScheme( WHA::ERegularPs ); + + // enable U-APSD for the AC/Queue in question if necessary. + // Otherwise stick to regular PS + switch ( aQueueId ) + { + case WHA::ELegacy: + if ( aCtxImpl.UapsdUsedForBestEffort() ) + { + psScheme = WHA::EUapsd; + } + break; + case WHA::EBackGround: + if ( aCtxImpl.UapsdUsedForBackground() ) + { + psScheme = WHA::EUapsd; + } + break; + case WHA::EVideo: + if ( aCtxImpl.UapsdUsedForVideo() ) + { + psScheme = WHA::EUapsd; + } + break; + case WHA::EVoice: + if ( aCtxImpl.UapsdUsedForVoice() ) + { + psScheme = WHA::EUapsd; + } + break; + default: + // catch programming error + OsTracePrint( KErrorLevel, (TUint8*) + ("UMAC: ERROR: non-supported queue, aQueueId: %d"), aQueueId ); + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + + WlanWhaConfigureQueue& wha_command = aCtxImpl.WhaConfigureQueue(); + + wha_command.Set( + aQueueId, + aCtxImpl.iWlanMib.dot11MaxTransmitMSDULifetime[aQueueId], + psScheme, + WHA::ENormal, + aCtxImpl.iWlanMib.iMediumTime[aQueueId] ); + + // change global state: entry procedure triggers action + ChangeState( aCtxImpl, + *this, // prev state + wha_command // next state + ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanConfigureTxQueueParams::ConfigureAc( + WlanContextImpl& aCtxImpl ) + { + OsTracePrint( + KUmacDetails, + (TUint8*)("UMAC: WlanConfigureTxQueueParams::ConfigureAc()") ); + + WlanWhaConfigureAc& wha_command = aCtxImpl.WhaConfigureAc(); + + wha_command.Set( + aCtxImpl.CwMinVector(), + aCtxImpl.CwMaxVector(), + aCtxImpl.AifsVector(), + aCtxImpl.TxOplimitVector() ); + + // change global state: entry procedure triggers action + ChangeState( aCtxImpl, + *this, // prev state + wha_command // next state + ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanConfigureTxQueueParams::Entry( + WlanContextImpl& aCtxImpl ) + { + if ( aCtxImpl.WsaCmdActive() ) + { + // sanity checking code + OsAssert( (TUint8*)("UMAC * panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + + if ( iState != EINIT ) + { + // this is NOT the start of the the FSM actions + // note that we send the ETXCOMPLETE event as the states + // that wait for it are the only ones that can be interrupted + // as they are asynchronous operations by nature + // and wait for corresponding WHA completion method + Fsm( aCtxImpl, ETXCOMPLETE ); + } + else + { + // this is the start of the the FSM actions + Fsm( aCtxImpl, ESTATEENTRY ); + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanConfigureTxQueueParams::Exit( + WlanContextImpl& /*aCtxImpl*/ ) + { + iState = EINIT; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +#ifndef NDEBUG +const TInt8* WlanConfigureTxQueueParams::GetStateName( + TUint8& aLength ) const + { + aLength = sizeof( iName ); + return iName; + } +#endif