--- /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