wlan_bearer/wlanldd/wlan_common/umac_common/src/umacconfiguretxqueueparams.cpp
changeset 0 c40eb8fe8501
--- /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