# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1274960013 -10800 # Node ID c6a1762761b85c7271a7419ebf40718e5c718cfb # Parent 629e60dfa27917277472c952d4d1f1c5eae7b451 Revision: 201021 Kit: 2010121 diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_operation_unload_drivers.h --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_operation_unload_drivers.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_operation_unload_drivers.h Thu May 27 14:33:33 2010 +0300 @@ -21,7 +21,7 @@ #include "core_operation_base.h" -const u32_t DELAY_FOR_AGENT = 100000; // 0,1 seconds +const u32_t DELAY_FOR_AGENT = 500000; // 0,5 seconds class core_server_c; diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_delete_ts.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_delete_ts.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_delete_ts.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 8 % +* %version: 9 % */ #include "core_operation_delete_ts.h" @@ -121,6 +121,7 @@ * Delete the virtual traffic stream. */ virtual_ts_iter.remove(); + virtual_stream = NULL; /** * Locate the actual traffic stream based on the TID. @@ -279,6 +280,7 @@ * Delete the actual traffic stream. */ ts_iter.remove(); + stream = NULL; if( direction == core_traffic_stream_direction_uplink || direction == core_traffic_stream_direction_bidirectional ) diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_handle_delete_ts.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_handle_delete_ts.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_handle_delete_ts.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 9 % +* %version: 10 % */ #include "core_operation_handle_delete_ts.h" @@ -125,6 +125,7 @@ server_m->get_wpx_adaptation_instance().handle_ts_delete( tid_m, user_priority ); ts_iter.remove(); + stream = NULL; if( direction == core_traffic_stream_direction_uplink || direction == core_traffic_stream_direction_bidirectional ) diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_sub_operation_roam_update_ts.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_sub_operation_roam_update_ts.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_sub_operation_roam_update_ts.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 12 % +* %version: 13 % */ #include "core_sub_operation_roam_update_ts.h" @@ -154,14 +154,25 @@ core_virtual_traffic_stream_c* virtual_iter = virtual_ts_iter.first(); while( virtual_iter ) { - if( is_ac_required[virtual_iter->access_class()] && - virtual_iter->status() != core_traffic_stream_status_active ) + if( virtual_iter->status() != core_traffic_stream_status_active ) { - DEBUG1( "core_sub_operation_roam_update_ts_c::next_state() - virtual traffic stream with ID %u needs to created", - virtual_iter->id() ); + if( is_ac_required[virtual_iter->access_class()] ) + { + DEBUG1( "core_sub_operation_roam_update_ts_c::next_state() - virtual traffic stream with ID %u needs to created", + virtual_iter->id() ); - virtual_stream_list_m.add_traffic_stream( - *virtual_iter ); + virtual_stream_list_m.add_traffic_stream( + *virtual_iter ); + } + else + { + /** + * Send a status update to all affected virtual traffic streams. + */ + set_virtual_traffic_stream_inactive_by_id( + virtual_iter->id(), + core_traffic_stream_status_inactive_not_required ); + } } virtual_iter = virtual_ts_iter.next(); @@ -188,7 +199,7 @@ */ set_virtual_traffic_stream_inactive_by_tid( iter->tid(), - core_traffic_stream_status_inactive_not_required ); + core_traffic_stream_status_inactive_not_required ); /** * Delete the actual traffic stream. @@ -196,6 +207,7 @@ server_m->get_wpx_adaptation_instance().handle_ts_delete( iter->tid(), iter->user_priority() ); ts_iter.remove(); + iter = NULL; } else if( iter->status() == core_traffic_stream_status_undefined ) { @@ -222,6 +234,7 @@ server_m->get_wpx_adaptation_instance().handle_ts_delete( iter->tid(), iter->user_priority() ); ts_iter.remove(); + iter = NULL; } iter = ts_iter.next(); @@ -301,6 +314,7 @@ * Move to the next entry. */ stream_iter_m.remove(); + iter = NULL; (void)stream_iter_m.first(); return goto_state( core_state_recreate_next ); @@ -439,7 +453,9 @@ * Move to the next entry. */ stream_iter_m.remove(); + iter = NULL; virtual_stream_iter_m.remove(); + virtual_iter = NULL; (void)virtual_stream_iter_m.first(); return goto_state( core_state_recreate_virtual_next ); diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_traffic_stream_list_iter.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_traffic_stream_list_iter.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_traffic_stream_list_iter.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: % +* %version: 4 % */ #include "core_traffic_stream_list_iter.h" @@ -85,5 +85,15 @@ // core_error_e core_traffic_stream_list_iter_c::remove() { - return iter_m.remove(); + core_traffic_stream_list_c::entry_s* entry = iter_m.current(); + core_error_e ret = iter_m.remove(); + if( ret == core_error_ok && + entry ) + { + delete entry->traffic_stream; + delete entry; + entry = NULL; + } + + return ret; } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_virtual_traffic_stream_list_iter.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_virtual_traffic_stream_list_iter.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_virtual_traffic_stream_list_iter.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 1 % +* %version: 2 % */ #include "core_virtual_traffic_stream_list_iter.h" @@ -84,5 +84,15 @@ // core_error_e core_virtual_traffic_stream_list_iter_c::remove() { - return iter_m.remove(); + core_virtual_traffic_stream_list_c::entry_s* entry = iter_m.current(); + core_error_e ret = iter_m.remove(); + if( ret == core_error_ok && + entry ) + { + delete entry->traffic_stream; + delete entry; + entry = NULL; + } + + return ret; } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/group/wlmserversrv.mmh --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/group/wlmserversrv.mmh Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/group/wlmserversrv.mmh Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 10 % +* %version: 11 % */ TARGETTYPE dll @@ -144,6 +144,7 @@ SOURCE wlanbgscanstates.cpp SOURCE wlantimerservices.cpp SOURCE wlantimer.cpp +SOURCE wlanticktimer.cpp USERINCLUDE ../inc USERINCLUDE ../../../../inc @@ -163,5 +164,6 @@ LIBRARY wlandbif.lib LIBRARY featmgr.lib LIBRARY commsdat.lib +LIBRARY hal.lib STATICLIBRARY wlanscanlist.lib diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanbgscan.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanbgscan.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanbgscan.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 11 % +* %version: 12 % */ #ifndef WLANBGSCAN_H @@ -93,7 +93,7 @@ * * @param aState New WLAN state */ - void WlanSetBgScanState( const MWlanBgScanProvider::TWlanBgScanState &aState ); + void SetBgScanState( const MWlanBgScanProvider::TWlanBgScanState &aState ); /** * From MWlanBgScanProvider. @@ -114,20 +114,6 @@ void NotifyChangedSettings( MWlanBgScanProvider::TWlanBgScanSettings& aSettings ); /** - * From MAwsBgScanProvider. - * Set new background scan interval. - * Asynchronous method to set new background scan interval, executed in - * AWS thread context. - * - * @since S60 v5.2 - * @param aNewInterval new interval to be taken into use - * @param aStatus Status of the calling active object. On successful - * completion contains KErrNone, otherwise one of the - * system-wide error codes. - */ - void SetInterval( TUint32 aNewInterval, TRequestStatus& aReportStatus ); - - /** * From MWlanTimerServiceCallback. * OnTimeout. * Requested time has elapsed. diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlandevicesettings.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlandevicesettings.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlandevicesettings.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 23 % +* %version: 24 % */ #ifndef WLANDEVICESETTINGS_H @@ -88,7 +88,7 @@ const TUint32 KWlanDefaultBssLostRoamNextIntervalFactor = 1; const TUint32 KWlanDefaultBssLostRoamNextIntervalAddition = 500000; // 500 ms const TUint32 KWlanDefaultBssLostRoamMaxTriesToFindNw = 5; -const TUint32 KWlanDefaultTrafficStreamCreationTimeout = 1000000; // 1 minute +const TUint32 KWlanDefaultTrafficStreamCreationTimeout = 1000000; // 1 second const TUint32 KWlanDefaultBeaconLostThreshold = 15; const TUint32 KWlanDefaultBtBeaconLostThreshold = 20; const TUint32 KWlanDefaultTxFailThreshold = 4; diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanscanproviderinterface.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanscanproviderinterface.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanscanproviderinterface.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 9 % +* %version: 10 % */ @@ -137,7 +137,7 @@ * * @param aState New WLAN state */ - virtual void WlanSetBgScanState( const TWlanBgScanState &aState ) = 0; + virtual void SetBgScanState( const TWlanBgScanState &aState ) = 0; /** * Whether background scan is enabled. diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanticktimer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanticktimer.h Thu May 27 14:33:33 2010 +0300 @@ -0,0 +1,139 @@ +/* +* Copyright (c) 2009-2010 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: +* This class implements a system tick based timer service. +* +*/ + +/* +* %version: 1 % +*/ + +#ifndef WLANTICKTIMER_H +#define WLANTICKTIMER_H + +#include + +/** + * CWlanTickTimer class. + * + * Class providing timer services. The underlaying implementation relies + * on RTimer. Therefore this module has the same limitations as RTimer. + * + * @lib wlmserversrv.dll + * @since S60 v5.2 + */ + +NONSHARABLE_CLASS( CWlanTickTimer ) : public CActive + { + +public: // CWlanTickTimer public methods + + /** + * Static constructor. + * @param aTimerExpiredCB Callback for indicating timer expiry. + * @param aTimerCancelledCB Callback for indicating timer cancellation. + * @param aTimerErrorCB Callback for indicating timer error. + */ + static CWlanTickTimer* NewL( + const TCallBack& aTimerExpiredCB, + const TCallBack& aTimerCancelledCB, + const TCallBack& aTimerErrorCB ); + + /** + * Destructor. + */ + ~CWlanTickTimer(); + + /** + * Requests an event after the specified interval. + * @param The time interval in system ticks. + */ + void After( + TUint aTicks ); + +private: // CWlanTickTimer private methods + + /** + * C++ constructor. + * @param aTimerExpiredCB Callback for indicating timer expiry. + * @param aTimerCancelledCB Callback for indicating timer cancellation. + * @param aTimerErrorCB Callback for indicating timer error. + */ + CWlanTickTimer( + const TCallBack& aTimerExpiredCB, + const TCallBack& aTimerCancelledCB, + const TCallBack& aTimerErrorCB ); + + /** + * Symbian 2nd phase constructor. + */ + void ConstructL(); + +private: // From CActive + + /** + * From CActive. + * Called by the active object framework when the request has been completed. + */ + void RunL(); + + /** + * From CActive. + * Called by the framework if RunL leaves. + * + * @param aError The error code RunL leaved with. + * @return KErrNone if leave was handled, one of the system-wide error codes otherwise. + */ + TInt RunError( + TInt aError ); + + /** + * From CActive. + * Called by the framework when Cancel() has been called. + */ + void DoCancel(); + +private: // CWlanTickTimer private data + + /** + * Handle to RTimer. + */ + RTimer iTimer; + + /** + * TimerExpiredCB. + * Registered callback method that is called, when the timer + * expires. This is set when CWlanTickTimer instance is created. + */ + TCallBack iTimerExpiredCB; + + /** + * TimerCancelledCB. + * Registered callback method that is called, when the timer + * is cancelled by an external event (i.e. cancellation is + * not requested by the client). This is set when CWlanTickTimer + * instance is created. + */ + TCallBack iTimerCancelledCB; + + /** + * TimerErrorCB. + * Registered callback method that is called, when there is + * a timer error. This is set when CWlanTickTimer instance is created. + */ + TCallBack iTimerErrorCB; + }; + +#endif // WLANTICKTIMER_H diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmplatformdata.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmplatformdata.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmplatformdata.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 13 % +* %version: 14 % */ #ifndef WLMPLATFORMDATA_H @@ -127,11 +127,9 @@ /** * Method for publishing WLAN on/off state. - * @since S60^4 * @param aWlanState WLAN state to be published. - * @return Symbian error code. */ - TInt PublishWlanOnOff( TPSWlanOnOff aWlanState ); + void PublishWlanOnOff( TPSWlanOnOff aWlanState ); private: // Definitions diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmserver.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmserver.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmserver.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 56 % +* %version: 57 % */ #ifndef WLMSERVER_H @@ -43,6 +43,7 @@ class CWlmDriverIf; class CWlanSsidListDb; class CWlanTimerServices; +class CWlanTickTimer; /** * Command Ids to be used un the asynchronous core service requests @@ -62,6 +63,9 @@ /** UID for WLAN Power Save Test Notifier */ const TUid KUidWlanPowerSaveTestNote = { 0x101F6D4F }; +/** Multiplier for converting seconds into microseconds */ +const TUint KWlanSecsToMicrosecsMultiplier( 1000000 ); + /** * The server for WLAN services. Counterpart of RWLMServer. * @@ -90,7 +94,7 @@ TAny* iParam1; TAny* iParam2; TAny* iParam3; - TTime* iTime; + TUint* iTime; SRequestMapEntry() : iRequestId( 0 ), @@ -907,7 +911,21 @@ * @return error code */ static TInt ScanSchedulingTimerExpired( TAny* aThisPtr ); - + + /** + * Method called by the scan scheduling timer when it expires. + * @param aThisPtr Pointer to the server instance. + * @return error code + */ + static TInt ScanSchedulingTimerCanceled( TAny* aThisPtr ); + + /** + * A callback method that does absolutely nothing. + * @param aThisPtr Pointer to the server instance. + * @return error code + */ + static TInt EmptyCb( TAny* aThisPtr ); + /** * Handles the conversion of IAP data list. * @param aCoreIapDataList Converted IAP data list. @@ -949,11 +967,11 @@ /** * Updates the scan scheduling timer. - * @param aScanTime specifies when the scan should be started. + * @param aScanTime specifies when the scan should be started in system ticks. * @param aTriggeringRequestId the id of that request which updates the timer. */ void UpdateScanSchedulingTimer( - TTime aScantime, + TUint aScantime, TUint aTriggeringRequestId ); /** @@ -1091,7 +1109,7 @@ * @param aDelay Number of seconds to add to current moment in time. * @return Calculated time. */ - inline TTime CalculateScanStartTime( + inline TUint CalculateScanStartTime( const TInt aDelay ) const; /** @@ -1229,7 +1247,7 @@ * Timer creating periodic expirations. * Used for starting scheduled scans */ - CPeriodic* iScanSchedulingTimer; + CWlanTickTimer* iScanSchedulingTimer; /** * Cache for scanresults etc. @@ -1332,12 +1350,17 @@ * EAPOL callback handler in core. Not owned by this pointer. */ abs_wlan_eapol_callback_c* iEapolHandler; - + + /** + * The amount of microseconds per a system tick. + */ + TInt iSystemTickPeriod; + /** - * Time when the scan scheduling timer is set to expire. + * Time in system ticks when the scan scheduling timer is set to expire. */ - TTime iScanSchedulingTimerExpiration; - + TUint iScanSchedulingTimerExpiration; + /** * Request id to that request in the iRequestMap which has set the scan scheduling timer. */ diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmserver.inl --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmserver.inl Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmserver.inl Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -15,6 +15,9 @@ * */ +/* +* %version: 18 % +*/ #include "am_debug.h" @@ -129,15 +132,13 @@ // CWlmServer::CalculateScanStartTime // --------------------------------------------------------- // -inline TTime CWlmServer::CalculateScanStartTime( +inline TUint CWlmServer::CalculateScanStartTime( const TInt aDelay ) const { - TTime scanTime; - scanTime.UniversalTime(); - TTimeIntervalSeconds delay( aDelay ); - scanTime += delay; + TUint ticks( + aDelay * KWlanSecsToMicrosecsMultiplier / iSystemTickPeriod ); - return scanTime; + return User::TickCount() + ticks; } // --------------------------------------------------------- diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmsystemnotify.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmsystemnotify.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmsystemnotify.h Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanbgscan.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanbgscan.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanbgscan.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 17 % +* %version: 18 % */ #include @@ -159,9 +159,9 @@ // CWlanBgScan::WlanSetBgScanState // --------------------------------------------------------------------------- // -void CWlanBgScan::WlanSetBgScanState( const MWlanBgScanProvider::TWlanBgScanState &aState ) +void CWlanBgScan::SetBgScanState( const MWlanBgScanProvider::TWlanBgScanState &aState ) { - DEBUG2( "CWlanBgScan::WlanSetBgScanState() - old state: %u, new state: %u", iWlanBgScanState, aState ); + DEBUG2( "CWlanBgScan::SetBgScanState() - old state: %u, new state: %u", iWlanBgScanState, aState ); // store state iWlanBgScanState = aState; diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanmgmtframehandler.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanmgmtframehandler.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanmgmtframehandler.cpp Thu May 27 14:33:33 2010 +0300 @@ -15,6 +15,9 @@ * */ +/* +* %version: 11 % +*/ // INCLUDE FILES #include @@ -149,7 +152,8 @@ { DEBUG( "CWlanMgmtFrameHandler::RunL() iDataBlock is not NULL" ); TDataBuffer* buffer = NULL; - while( iDataBlock->GetNextRxDataBuffer( buffer ) ) + TDataBuffer* frameToFree = NULL; + while( ( buffer = iServiceProvider.GetRxFrame( frameToFree ) ) != NULL ) { DEBUG1( "EAPOL packet received, length=%d", buffer->GetLength() ); @@ -159,6 +163,8 @@ buffer->GetLength(), buffer->GetBuffer(), buffer->Rcpi() ); + + frameToFree = buffer; } } // Wait for next packets. diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanticktimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanticktimer.cpp Thu May 27 14:33:33 2010 +0300 @@ -0,0 +1,133 @@ +/* +* Copyright (c) 2009-2010 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: +* This class implements a system tick based timer service. +* +*/ + +/* +* %version: 1 % +*/ + +#include "wlanticktimer.h" +#include "am_debug.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CWlanTickTimer::CWlanTickTimer( + const TCallBack& aTimerExpiredCB, + const TCallBack& aTimerCancelledCB, + const TCallBack& aTimerErrorCB ) : + CActive( CActive::EPriorityStandard ), + iTimerExpiredCB( aTimerExpiredCB ), + iTimerCancelledCB( aTimerCancelledCB ), + iTimerErrorCB( aTimerErrorCB ) + { + // No implementation required + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanTickTimer::ConstructL() + { + User::LeaveIfError( iTimer.CreateLocal() ); + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CWlanTickTimer* CWlanTickTimer::NewL( + const TCallBack& aTimerExpiredCB, + const TCallBack& aTimerCancelledCB, + const TCallBack& aTimerErrorCB ) + { + CWlanTickTimer* self = new (ELeave) CWlanTickTimer( + aTimerExpiredCB, + aTimerCancelledCB, + aTimerErrorCB ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CWlanTickTimer::~CWlanTickTimer() + { + iTimer.Close(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanTickTimer::After( + TUint aTicks ) + { + DEBUG1( "CWlanTickTimer::After() - aTicks: %u", + aTicks ); + + iTimer.AfterTicks( + iStatus, + aTicks ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanTickTimer::RunL() + { + DEBUG1( "CWlanTickTimer::RunL() - iStatus: %d", + iStatus.Int() ); + + switch( iStatus.Int() ) + { + case KErrNone: // Timer expired + iTimerExpiredCB.CallBack(); + break; + case KErrCancel: // Timer cancelled + iTimerCancelledCB.CallBack(); + break; + default: // Timer error code + iTimerErrorCB.CallBack(); + } + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +TInt CWlanTickTimer::RunError( + TInt /* aError */ ) + { + DEBUG( "CWlanTickTimer::RunError()" ); + + return 0; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanTickTimer::DoCancel() + { + DEBUG( "CWlanTickTimer::DoCancel()" ); + + iTimer.Cancel(); + } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmplatformdata.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmplatformdata.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmplatformdata.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 13 % +* %version: 14 % */ // INCLUDE FILES @@ -131,6 +131,8 @@ User::LeaveIfError( iPsOnOffState.Attach( KPSUidWlan, KPSWlanOnOffState, EOwnerThread ) ); + // Publish initial value for WLAN on/off as WLAN OFF + PublishWlanOnOff( EPSWlanOff ); } // --------------------------------------------------------- @@ -160,6 +162,8 @@ RProperty::Delete( KPSUidWlan, KPSWlanMacAddress ); iPsBgScanInterval.Close(); RProperty::Delete( KPSUidWlan, KPSWlanBgScanInterval ); + iPsOnOffState.Close(); + RProperty::Delete( KPSUidWlan, KPSWlanOnOffState ); delete iPropertySystemState; delete iBtConnections; delete iEmergencyCall; @@ -491,31 +495,20 @@ // void CWlmPlatformData::NotifyWlanOnOffObserver() { - DEBUG( "CWlmPlatformData::NotifyWlanOnOffObserver()" ); - - // Read WLAN master switch - TInt wlanOn( EFalse ); - iWlanOnOff->Get( wlanOn ); - - // Read WLAN force disable switch - TInt wlanForceDisable( EFalse ); - iWlanForceDisable->Get( wlanForceDisable ); - - DEBUG3( " WlanOnOff: %d, WlanForceDisable: %d, NotifiedToObserver: %d", - wlanOn, wlanForceDisable, iNotifiedWlanState ); + DEBUG1( "CWlmPlatformData::NotifyWlanOnOffObserver() - last notified state=%d", + iNotifiedWlanState ); // Note that the observer is only notified if the // state really changes - // If WLAN is set ON and it is not forcibly disabled - if( wlanOn && // WLAN set ON - wlanForceDisable == EFalse && // WLAN force disable not set + // If WLAN is set ON + if( GetWlanOnOffState() == EWlanOn && // WLAN set ON iNotifiedWlanState != CWlmPlatformData::EWlanNotifiedOn ) // WLAN ON not notified yet { // Notify observer that WLAN is set ON iCallback.WlanOn(); iNotifiedWlanState = CWlmPlatformData::EWlanNotifiedOn; - (void)PublishWlanOnOff( EPSWlanOn ); + PublishWlanOnOff( EPSWlanOn ); // Note! P&S write operation return value is not checked DEBUG( "CWlmPlatformData::NotifyWlanOnOffObserver() - WLAN ON notified, P&S updated" ); } @@ -525,7 +518,7 @@ // Notify observer that WLAN is set OFF iCallback.WlanOff(); iNotifiedWlanState = CWlmPlatformData::EWlanNotifiedOff; - (void)PublishWlanOnOff( EPSWlanOff ); + PublishWlanOnOff( EPSWlanOff ); // Note! P&S write operation return value is not checked DEBUG( "CWlmPlatformData::NotifyWlanOnOffObserver() - WLAN OFF notified, P&S updated" ); } @@ -536,10 +529,17 @@ // Status : Draft // --------------------------------------------------------- // -TInt CWlmPlatformData::PublishWlanOnOff( TPSWlanOnOff aWlanState ) +void CWlmPlatformData::PublishWlanOnOff( TPSWlanOnOff aWlanState ) { DEBUG1( "CWlmPlatformData::PublishWlanOnOff( wlanState = %d )", aWlanState ); - return iPsOnOffState.Set( aWlanState ); + TInt err( KErrNone ); + err = iPsOnOffState.Set( aWlanState ); + + if( err != KErrNone ) + { + DEBUG1( "CWlmPlatformData::PublishWlanOnOff() - ERROR: update failed, err=%d", + err ); + } } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 106 % +* %version: 108 % */ #include @@ -24,6 +24,7 @@ #include #include #include // for feature definitions +#include #include "wlmserver.h" #include "wlmdriverif.h" @@ -38,6 +39,7 @@ #include "wlandevicesettingsinternalcrkeys.h" #include "wlanbgscan.h" #include "wlantimerservices.h" +#include "wlanticktimer.h" #include "am_debug.h" /** Panic codes for WlanEngine */ @@ -89,9 +91,6 @@ CWlmServer::EWlanStaticFeature802dot11k | CWlmServer::EWlanStaticFeature802dot11n; -/** Multiplier for converting seconds into microseconds */ -const TUint KWlanSecsToMicrosecsMultiplier( 1000000 ); - /** Minimum value for aggressive background scan interval, in seconds */ const TUint KWlanAggressiveBgScanMinInterval( 1 ); @@ -141,6 +140,7 @@ iIsStartupComplete( EFalse ), iEapolClient( NULL ), iEapolHandler( NULL ), + iSystemTickPeriod( 0 ), iScanSchedulingTimerExpiration( 0 ), iRequestTriggeringScanning( 0 ), iCoreHandlingScanRequest( EFalse ), @@ -164,6 +164,12 @@ User::LeaveIfError( User::RenameThread( KWLMDataServerName ) ); StartL( KWLMDataServerName ); + HAL::Get( HAL::ESystemTickPeriod, iSystemTickPeriod ); + DEBUG1( "CWlmServer::ConstructL() - system tick period is %d", + iSystemTickPeriod ); + DEBUG1( "CWlmServer::ConstructL() - current system tick count is %u", + User::TickCount( ) ); + // Consult FeatureManager whether startup is allowed FeatureManager::InitializeLibL(); if( !FeatureManager::FeatureSupported( KFeatureIdProtocolWlan ) ) @@ -220,7 +226,13 @@ // Create scan timer DEBUG( "CWlmServer::ConstructL() - create backgroundscan timer" ); - iScanSchedulingTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + TCallBack expiredCb( ScanSchedulingTimerExpired, this ); + TCallBack canceledCb( ScanSchedulingTimerCanceled, this ); + TCallBack emptyCb( EmptyCb, NULL ); + iScanSchedulingTimer = CWlanTickTimer::NewL( + expiredCb, + canceledCb, + emptyCb ); // Create scan cache iCache = CWlanScanResultCache::NewL(); @@ -469,7 +481,7 @@ if( wlanState != EWlanOn ) { // WLAN is OFF - DEBUG1( "CWlmServer::Connect() refused due to WLAN is OFF (%d)", + DEBUG1( "CWlmServer::Connect() - refused due to WLAN is OFF (%d)", wlanState ); // WLAN state enumerations map one to one to WLAN error code aMessage.Complete( wlanState ); @@ -1100,15 +1112,15 @@ return; } - TTime* scanTime( NULL ); + TUint* scanTime( NULL ); if( scanScheduling.maxDelay != KWlmInfiniteScanDelay ) { - scanTime = new TTime( - CalculateScanStartTime( scanScheduling.maxDelay ).Int64() ); + scanTime = new TUint( + CalculateScanStartTime( scanScheduling.maxDelay ) ); if( !scanTime ) { - DEBUG( "CWlmServer::GetScanResult() - unable to instantiate TTime" ); - + DEBUG( "CWlmServer::GetScanResult() - unable to instantiate TUint" ); + delete coreSsid; delete scanList; aMessage.Complete( KErrNoMemory ); @@ -1338,14 +1350,14 @@ return; } - TTime* scanTime( NULL ); + TUint* scanTime( NULL ); if( maxDelayPckg() != KWlmInfiniteScanDelay ) { - scanTime = new TTime( - CalculateScanStartTime( maxDelayPckg() ).Int64() ); + scanTime = new TUint( + CalculateScanStartTime( maxDelayPckg() ) ); if( !scanTime ) { - DEBUG( "CWlmServer::GetAvailableIaps() - unable to instantiate TTime" ); + DEBUG( "CWlmServer::GetAvailableIaps() - unable to instantiate TUint" ); aMessage.Complete( KErrNoMemory ); delete iapDataList; @@ -1555,7 +1567,7 @@ // --------------------------------------------------------- // void CWlmServer::UpdateScanSchedulingTimer( - TTime aScanTime, + TUint aScanTime, TUint aTriggeringRequestId ) { DEBUG1( "CWlmServer::UpdateScanSchedulingTimer() - aTriggeringRequestId = %u ", aTriggeringRequestId ); @@ -1568,32 +1580,22 @@ return; } - TTime timeNow; - timeNow.UniversalTime(); - - TTimeIntervalMicroSeconds difference( aScanTime.MicroSecondsFrom( timeNow ) ); - if( difference.Int64() < 0 ) + TUint currentTickCount( + User::TickCount() ); + TUint difference( 0 ); + if( aScanTime > currentTickCount ) { - difference = TTimeIntervalMicroSeconds( 0 ); + difference = aScanTime - currentTickCount; } - TTimeIntervalMicroSeconds32 differenceMicroseconds( - difference.Int64() ); iScanSchedulingTimer->Cancel(); iScanSchedulingTimerExpiration = aScanTime; iRequestTriggeringScanning = aTriggeringRequestId; - TCallBack callback( ScanSchedulingTimerExpired, this ); - - DEBUG1( "CWlmServer::UpdateScanSchedulingTimer() - scheduling the timer to %u second(s)", - differenceMicroseconds.Int() / SECONDS_FROM_MICROSECONDS ); - - TTimeIntervalMicroSeconds32 intervalMicroseconds( KWlmMaxScanDelay * SECONDS_FROM_MICROSECONDS ); - - iScanSchedulingTimer->Start( - differenceMicroseconds, - intervalMicroseconds, - callback ); + DEBUG2( "CWlmServer::UpdateScanSchedulingTimer() - scheduling the timer to %u system ticks(s) [%u s]", + difference, difference * iSystemTickPeriod / KWlanSecsToMicrosecsMultiplier ); + + iScanSchedulingTimer->After( difference ); } // --------------------------------------------------------- @@ -1606,14 +1608,14 @@ DEBUG( "CWlmServer::FindNextTimedScanSchedulingRequest()" ); TBool pendingScanRequestsFound( EFalse ); - TTime closestTime = TTime( 0 ); + TUint closestTime( 0 ); aTriggeringRequestIndex = 0; for(TInt i=0; i < iRequestMap.Count(); i++) { if( IsPendingTimedScanRequest( i ) ) { - TTime* checkedTime = reinterpret_cast( iRequestMap[i].iTime ); + TUint* checkedTime = reinterpret_cast( iRequestMap[i].iTime ); if( pendingScanRequestsFound == EFalse || closestTime > *checkedTime ) { closestTime = *checkedTime; @@ -1627,7 +1629,7 @@ { // clear the scan scheduling related variables iRequestTriggeringScanning = KWlanIntCmdNull; - iScanSchedulingTimerExpiration = TTime( 0 ); + iScanSchedulingTimerExpiration = 0; } else { @@ -1830,7 +1832,7 @@ // If WLAN is ON, enable background scanning if( iPlatform->GetWlanOnOffState() == EWlanOn ) { - iBgScanProvider->WlanSetBgScanState( MWlanBgScanProvider::EWlanBgScanOn ); + iBgScanProvider->SetBgScanState( MWlanBgScanProvider::EWlanBgScanOn ); } break; @@ -2340,7 +2342,7 @@ // If background scan is currently on, background scan // will be disabled and it's request will be removed // from the request map. - iBgScanProvider->WlanSetBgScanState( MWlanBgScanProvider::EWlanBgScanOff ); + iBgScanProvider->SetBgScanState( MWlanBgScanProvider::EWlanBgScanOff ); } } @@ -2458,7 +2460,7 @@ if( FindNextTimedScanSchedulingRequest( indexNextScan ) ) { - TTime* nextScanTime = reinterpret_cast( iRequestMap[indexNextScan].iTime ); + TUint* nextScanTime = reinterpret_cast( iRequestMap[indexNextScan].iTime ); UpdateScanSchedulingTimer( *nextScanTime, iRequestMap[indexNextScan].iRequestId ); } } @@ -2628,7 +2630,7 @@ delete iapDataList; iapDataList = NULL; - TTime* completedScanTime = reinterpret_cast( aRequest.iTime ); + TUint* completedScanTime = reinterpret_cast( aRequest.iTime ); delete completedScanTime; completedScanTime = NULL; @@ -2693,7 +2695,7 @@ { ScanList* tmp( NULL ); core_ssid_s* ssid = reinterpret_cast( aRequest.iParam1 ); - TTime* completedScanTime = reinterpret_cast( aRequest.iTime ); + TUint* completedScanTime = reinterpret_cast( aRequest.iTime ); ScanList* completedScanList = reinterpret_cast( aRequest.iParam0 ); if( aTriggerRequest == NULL ) @@ -2793,7 +2795,7 @@ iapSsidList = reinterpret_cast*>( aRequest.iParam3 ); iapDataList = reinterpret_cast*>( aRequest.iParam0 ); - TTime* completedScanTime = reinterpret_cast( aRequest.iTime ); + TUint* completedScanTime = reinterpret_cast( aRequest.iTime ); ScanList* completedScanList = reinterpret_cast( aRequest.iParam2); core_type_list_c* completedIdList = reinterpret_cast*>( aRequest.iParam1 ); @@ -3451,11 +3453,11 @@ return KErrNoMemory; } - TTime* scanTime = new TTime( - CalculateScanStartTime( aScanStartInterval ).Int64() ); + TUint* scanTime = new TUint( + CalculateScanStartTime( aScanStartInterval ) ); if( !scanTime ) { - DEBUG( "CWlmServer::BackgroundScanRequest() - unable to instantiate TTime" ); + DEBUG( "CWlmServer::BackgroundScanRequest() - unable to instantiate TUint" ); delete iapDataList; delete iapSsidList; @@ -3532,7 +3534,7 @@ ScanList* completedScanList = reinterpret_cast( self->iRequestMap[index].iParam0 ); core_ssid_s* completedSsid = reinterpret_cast( self->iRequestMap[index].iParam1 ); - TTime* completedScanTime = reinterpret_cast( self->iRequestMap[index].iTime ); + TUint* completedScanTime = reinterpret_cast( self->iRequestMap[index].iTime ); // Only the triggering request is completed and then scan scheduling timer is set again TPckgBuf pckgCount( 0 ); @@ -3559,7 +3561,7 @@ if( self->FindNextTimedScanSchedulingRequest( indexNextScan ) ) { - TTime* nextScanTime = reinterpret_cast( self->iRequestMap[indexNextScan].iTime ); + TUint* nextScanTime = reinterpret_cast( self->iRequestMap[indexNextScan].iTime ); self->UpdateScanSchedulingTimer( *nextScanTime, self->iRequestMap[indexNextScan].iRequestId ); } @@ -3577,7 +3579,7 @@ core_type_list_c* iapIdList = reinterpret_cast*>( self->iRequestMap[index].iParam1 ); ScanList* scanList = reinterpret_cast( self->iRequestMap[index].iParam2 ); core_type_list_c* iapSsidList = reinterpret_cast*>( self->iRequestMap[index].iParam3 ); - TTime* scanTime = reinterpret_cast( self->iRequestMap[index].iTime ); + TUint* scanTime = reinterpret_cast( self->iRequestMap[index].iTime ); // If the device is roaming OR // there are not WLAN IAPs defined in the device OR @@ -3616,7 +3618,7 @@ if( self->FindNextTimedScanSchedulingRequest( indexNextScan ) ) { - TTime* nextScanTime = reinterpret_cast( self->iRequestMap[indexNextScan].iTime ); + TUint* nextScanTime = reinterpret_cast( self->iRequestMap[indexNextScan].iTime ); self->UpdateScanSchedulingTimer( *nextScanTime, self->iRequestMap[indexNextScan].iRequestId ); } @@ -3707,7 +3709,43 @@ } self->iCoreHandlingScanRequest = ETrue; return KErrNone; + } + +// --------------------------------------------------------- +// CWlmServer::ScanSchedulingTimerCanceled() +// --------------------------------------------------------- +// +TInt CWlmServer::ScanSchedulingTimerCanceled( + TAny* aThisPtr ) + { + DEBUG( "CWlmServer::ScanSchedulingTimerCanceled()" ); + + CWlmServer* self = reinterpret_cast( aThisPtr ); + + /** + * Scan scheduling timer was canceled, re-arm the timer. + */ + TUint indexNextScan( 0 ); + if( self->FindNextTimedScanSchedulingRequest( indexNextScan ) ) + { + self->UpdateScanSchedulingTimer( + *(self->iRequestMap[indexNextScan].iTime), + self->iRequestMap[indexNextScan].iRequestId ); + } + + return 0; } + +// --------------------------------------------------------- +// CWlmServer::EmptyCb() +// --------------------------------------------------------- +// +TInt CWlmServer::EmptyCb( + TAny* /* aThisPtr */ ) + { + return 0; + } + // --------------------------------------------------------- // CWlmServer::GetIapDataList() @@ -3923,38 +3961,6 @@ iTimerServices->HandleTimeout(); DEBUG("CWlmServer::SystemTimeChanged() - refreshing settings to BgScan provider"); iBgScanProvider->NotifyChangedSettings( iBgScanProviderSettings ); - - // Pending scan requests should be handled because after the system time change all the - // timestamps are invalid. Change the scan start times to start immediately - - DEBUG("CWlmServer::SystemTimeChanged() - set all pending requests to expire immediately"); - - TInt i( 0 ); - for( i = 0; i < iRequestMap.Count(); i++ ) - { - if( IsPendingTimedScanRequest(i) ) - { - DEBUG1( "CWlmServer::SystemTimeChanged() - setting iTime to current time for request %i", - iRequestMap[i].iRequestId ); - - TTime* requestedScanTime = reinterpret_cast( iRequestMap[i].iTime ); - requestedScanTime->UniversalTime(); - } - } - if( !iCoreHandlingScanRequest ) - { - // Core is not handling any scan request so update the timer - DEBUG("CWlmServer::SystemTimeChanged() - Core is not currently handling any scan requests"); - DEBUG("CWlmServer::SystemTimeChanged() - Cancel timer and set it again to new value"); - - iScanSchedulingTimer->Cancel(); - TUint indexNextScan; - if( FindNextTimedScanSchedulingRequest( indexNextScan ) ) - { - TTime* nextScanTime = reinterpret_cast( iRequestMap[indexNextScan].iTime ); - UpdateScanSchedulingTimer( *nextScanTime, iRequestMap[indexNextScan].iRequestId ); - } - } } } @@ -4100,7 +4106,7 @@ delete reinterpret_cast*>( entry.iParam1 ); delete reinterpret_cast( entry.iParam2); delete reinterpret_cast*>( entry.iParam3 ); - delete reinterpret_cast( entry.iTime ); + delete reinterpret_cast( entry.iTime ); iRequestMap.Remove( index ); DEBUG( "CWlmServer::CancelScan() - find next possible timed scan scheduling request" ); @@ -4137,7 +4143,7 @@ delete reinterpret_cast*>( entry.iParam1 ); delete reinterpret_cast( entry.iParam2); delete reinterpret_cast*>( entry.iParam3 ); - delete reinterpret_cast( entry.iTime ); + delete reinterpret_cast( entry.iTime ); iRequestMap.Remove( index ); } } @@ -4382,7 +4388,7 @@ if( wlanState != EWlanOn ) { // WLAN is OFF and therefore request is not served. - DEBUG1( "CWlmServer::RunProtectedSetup() rejected due to WLAN is OFF (%d)", + DEBUG1( "CWlmServer::RunProtectedSetup() - rejected due to WLAN is OFF (%d)", wlanState ); // WLAN states map one to one to WLAN error codes. aMessage.Complete( wlanState ); @@ -5013,7 +5019,7 @@ // If WLAN is set ON, enable background scanning if( iPlatform->GetWlanOnOffState() == EWlanOn ) { - iBgScanProvider->WlanSetBgScanState( MWlanBgScanProvider::EWlanBgScanOn ); + iBgScanProvider->SetBgScanState( MWlanBgScanProvider::EWlanBgScanOn ); } iPlatform->InitializeSystemTimeHandler(); @@ -5232,7 +5238,7 @@ if( iIsStartupComplete ) { // Enable background scanning - iBgScanProvider->WlanSetBgScanState( MWlanBgScanProvider::EWlanBgScanOn ); + iBgScanProvider->SetBgScanState( MWlanBgScanProvider::EWlanBgScanOn ); } } @@ -5242,10 +5248,11 @@ // void CWlmServer::WlanOff() { - DEBUG( "CWlmServer::WlanOff()" ); + DEBUG1( "CWlmServer::WlanOff() - ConnectionState=%d", + iConnectionState ); // Disable background scanning - iBgScanProvider->WlanSetBgScanState( MWlanBgScanProvider::EWlanBgScanOff ); + iBgScanProvider->SetBgScanState( MWlanBgScanProvider::EWlanBgScanOff ); // Cancel all running operations that are forbidden in WLAN OFF CancelExternalRequestsByType( ERunProtectedSetup ); diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 105 % +* %version: 106 % */ #ifndef WLANCONTEXTIMPL_H @@ -945,7 +945,7 @@ * @since S60 3.2 * @return length of the frame body */ - inline const TUint16 ScanResponseFrameBodyLength() const; + inline TUint16 ScanResponseFrameBodyLength() const; /** * Stores the IE(s) to be included into the (re-)association request. diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.inl --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.inl Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.inl Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 77 % +* %version: 78 % */ #include "umacconnectcontext.h" @@ -420,7 +420,7 @@ // // --------------------------------------------------------------------------- // -inline const TUint16 WlanContextImpl::ScanResponseFrameBodyLength() const +inline TUint16 WlanContextImpl::ScanResponseFrameBodyLength() const { return iConnectContext.iScanResponseFrameBodyLength; } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacManagementSideUmacCb.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacManagementSideUmacCb.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacManagementSideUmacCb.h Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 17 % +* %version: 18 % */ #ifndef WLANMANAGEMENTSIDEUMACB_H @@ -112,7 +112,7 @@ * @param aNumOfBuffers number of meta header pointers in the array */ virtual void MgmtDataReceiveComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ); /** diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacProtocolStackSideUmacCb.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacProtocolStackSideUmacCb.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacProtocolStackSideUmacCb.h Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 14 % +* %version: 15 % */ #ifndef WLANPROTOCOLSTACKSIDEUMACCB_H @@ -101,7 +101,7 @@ * EFalse otherwise */ virtual TBool ProtocolStackDataReceiveComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ); /** diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Associated.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Associated.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Associated.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 96 % +* %version: 97 % */ #include "config.h" @@ -658,8 +658,8 @@ TUint nbrOfpacketsForMgmtClient ( 0 ); const TUint KMaxNbrOfPacketsForUsr ( 30 ); const TUint KMaxNbrOfPacketsForMgmtClient ( 10 ); - const TDataBuffer* packetsForUsr[KMaxNbrOfPacketsForUsr]; - const TDataBuffer* packetsForMgmtClient[KMaxNbrOfPacketsForMgmtClient]; + TDataBuffer* packetsForUsr[KMaxNbrOfPacketsForUsr]; + TDataBuffer* packetsForMgmtClient[KMaxNbrOfPacketsForMgmtClient]; // one byte past the last actual payload byte (so excluding the potentially // present security trailer) of the MPDU const TUint8* const KMpduPayloadEnd ( @@ -1006,8 +1006,7 @@ - aBuffer ); // buffer beginning // complete - const TDataBuffer* KMetaHdr ( metaHdr ); - aCtxImpl.iUmac.MgmtDataReceiveComplete( KMetaHdr, 1 ); + aCtxImpl.iUmac.MgmtDataReceiveComplete( metaHdr, 1 ); } else { @@ -1369,7 +1368,7 @@ if ( // our client has instructed us not the encrypt this frame under // any circumstances OR ( aDataBuffer.KeFlags() & TDataBuffer::KTxFrameMustNotBeEncrypted ) || - // no space is reserved for security header on this sw layer. It is + // no space is reserved for security trailer on this sw layer. It is // done on lower layers; when necessary. ( aCtxImpl.WHASettings().iCapability & WHA::SSettings::KNoSecHdrAndTrailer ) ) diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11State.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11State.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11State.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 86 % +* %version: 87 % */ #include "config.h" @@ -2684,8 +2684,7 @@ - aBuffer ); // buffer beginning // complete - const TDataBuffer* KMetaHdr ( metaHdr ); - aCtxImpl.iUmac.MgmtDataReceiveComplete( KMetaHdr, 1 ); + aCtxImpl.iUmac.MgmtDataReceiveComplete( metaHdr, 1 ); } else { diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacManagementSideUmacCb.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacManagementSideUmacCb.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacManagementSideUmacCb.cpp Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 19 % +* %version: 20 % */ #include "config.h" @@ -121,7 +121,7 @@ // --------------------------------------------------------------------------- // void WlanManagementSideUmacCb::MgmtDataReceiveComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ) { if ( iSelf ) diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacProtocolStackSideUmacCb.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacProtocolStackSideUmacCb.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacProtocolStackSideUmacCb.cpp Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 12 % +* %version: 13 % */ #include "config.h" @@ -87,7 +87,7 @@ // ----------------------------------------------------------------------------- // TBool WlanProtocolStackSideUmacCb::ProtocolStackDataReceiveComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ) { TBool status ( EFalse ); diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/DataFrameMemMngr.h --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/DataFrameMemMngr.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/DataFrameMemMngr.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 12 % +* %version: 13 % */ #ifndef DATAFRAMEMMNGR_H @@ -42,6 +42,7 @@ TInt aTxFrameBufAllocationUnit ) : DEthernetFrameMemMngr( aParent, aRxFrameMemoryPool ), iFrameXferBlockProtoStack( NULL ), + iUserToKernAddrOffset( 0 ), iTxDataChunk( NULL ), iTxFrameMemoryPool( NULL ), iTxFrameBufAllocationUnit ( aTxFrameBufAllocationUnit ) @@ -85,52 +86,87 @@ * EFalse otherwise */ virtual TBool DoEthernetFrameRxComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ); /** * From DEthernetFrameMemMngr - * Gets start address of Rx buffers (their offset addresses) - * that are waiting for completion to user mode - * - * @since S60 3.1 - * @return see above - */ - virtual TUint32* DoGetTobeCompletedBuffersStart(); - - /** - * From DEthernetFrameMemMngr - * Gets start address of Rx buffers (their offset addresses) - * that have been completed to user mode + * To be called when user mode client issues a frame Rx request * - * @since S60 3.1 - * @return see above + * @return ETrue if callee should complete the request immediately + * as there exists Rx frame(s) which can be retrieved by the user + * mode client. + * EFalse otherwise */ - virtual TUint32* DoGetCompletedBuffersStart(); - + virtual TBool OnReadRequest(); + /** - * From DEthernetFrameMemMngr - * Gets called when user mode client issues a frame receive request - * and Rx buffers have been completed to it. The completed Rx frame - * buffers are freed. - * - * @since S60 3.1 - */ - virtual void DoFreeRxBuffers(); - + * From DEthernetFrameMemMngr + * Gets the highest priority frame (contained in a buffer allocated from + * the shared memory) from the Rx queues. + * Optionally frees the memory associated to a previously received frame. + * + * @param aFrameToFreeInUserSpace User space pointer to previously + * received frame which can now be freed. + * NULL if nothing to free. + * @return User space pointer to the Rx frame to be handled next. + * NULL, if there are no frames available. + */ + virtual TDataBuffer* GetRxFrame( TDataBuffer* aFrameToFreeInUserSpace ); + /** * From DEthernetFrameMemMngr * Allocates a Tx packet from the shared memory. * * @param aLength Length of the requested Tx buffer in bytes - * @return Pointer to the meta header attached to the allocated packet, on - * success. + * @return User space pointer to the meta header attached to the + * allocated packet, on success. * NULL, in case of failure. */ virtual TDataBuffer* AllocTxBuffer( TUint aLength ); /** * From DEthernetFrameMemMngr + * Adds the specified Tx frame (contained in the buffer allocated from the + * shared memory) to the relevant Tx queue according to its AC (i.e. + * priority). + * + * @param aPacketInUserSpace Meta header attached to the frame; as a user + * space pointer. + * @param aPacketInKernSpace If not NULL on return, the frame needs to be + * discarded and this is the kernel space pointer to its meta header. + * If NULL on return, the frame must not be discarded. + * @param aUserDataTxEnabled ETrue if user data Tx is enabled + * EFalse otherwise + * @return ETrue if the client is allowed to continue calling this method + * (i.e. Tx flow is not stopped). + * EFalse if the client is not allowed to call this method again + * (i.e. Tx flow is stopped) until it is re-allowed. + */ + virtual TBool AddTxFrame( + TDataBuffer* aPacketInUserSpace, + TDataBuffer*& aPacketInKernSpace, + TBool aUserDataTxEnabled ); + + /** + * From DEthernetFrameMemMngr + * Gets the frame to be transmitted next from the Tx queues. + * + * @param aWhaTxQueueState State (full / not full) of every WHA transmit + * queue + * @param aMore On return is ETrue if another frame is also ready to be + * transmitted, EFalse otherwise + * @return Pointer to the meta header of the frame to be transmitted, on + * success + * NULL, if there's no frame that could be transmitted, given the + * current status of the WHA Tx queues + */ + virtual TDataBuffer* GetTxFrame( + const TWhaTxQueueState& aTxQueueState, + TBool& aMore ); + + /** + * From DEthernetFrameMemMngr * Deallocates a Tx packet. * * All Tx packets allocated with AllocTxBuffer() must be deallocated using @@ -138,7 +174,27 @@ * * @param aPacket Meta header of the packet to the deallocated */ - virtual void FreeTxPacket( TDataBuffer*& aPacket ); + virtual void FreeTxPacket( TDataBuffer*& aPacket ); + + /** + * From DEthernetFrameMemMngr + * Determines if Tx from protocol stack side client should be resumed + * + * @param aUserDataTxEnabled ETrue if user data Tx is enabled + * EFalse otherwise + * @return ETrue if Tx should be resumed + * EFalse otherwise + */ + virtual TBool ResumeClientTx( TBool aUserDataTxEnabled ) const; + + /** + * From DEthernetFrameMemMngr + * Determines if all protocol stack side client's Tx queues are empty + * + * @return ETrue if all Tx queues are empty + * EFalse otherwise + */ + virtual TBool AllTxQueuesEmpty() const; private: @@ -157,20 +213,14 @@ private: // Data + /** kernel address of frame xfer block */ + RFrameXferBlockProtocolStack* iFrameXferBlockProtoStack; + /** - * array of TDataBuffer offset addresses, denoting Rx buffers, - * which are waiting here in kernel mode to be completed - * to user mode, when the next frame receive request arrives + * the offset from a User space address to the corresponding address + * in the Kernel space in the shared memory chunk. May also be negative */ - TUint32 iTobeCompletedBuffers[KMaxToBeCompletedRxBufs]; - - /** - * array of TDataBuffer offset addresses, denoting Rx buffers, that are - * currently under processing in user mode - */ - TUint32 iCompletedBuffers[KMaxCompletedRxBufs]; - - RFrameXferBlockProtocolStack* iFrameXferBlockProtoStack; + TInt32 iUserToKernAddrOffset; /** * pointer to protocol stack side Tx area start in the kernel address diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/EtherCardApi.h --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/EtherCardApi.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/EtherCardApi.h Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 12 % +* %version: 13 % */ #if !defined(__ETHERAPI_H__) @@ -69,6 +69,7 @@ { EControlFastAllocTxBuffer = 0x0F000000, EControlFastAddTxFrame, + EControlFastGetRxFrame }; public: @@ -119,12 +120,9 @@ * is able to access the memory. * * @since S60 3.1 - * @param aFrameXferBlock FrameXferBlock to be initialized by - * the device driver * @return KErrNone on success, any other on failure */ - inline TInt InitialiseBuffers( - RFrameXferBlockProtocolStack*& aFrameXferBlock ); + inline TInt InitialiseBuffers(); /** * Unmap memory mapped by InitiliazeBuffers method from the client @@ -183,6 +181,21 @@ */ inline TBool AddTxFrame( TDataBuffer* aPacket ); + /** + * Gets the highest priority frame (contained in a buffer allocated from + * the shared memory) from the Rx queues. + * Optionally frees the memory associated to a previously received frame. + * + * @param aFrameToFree Previously received frame which can now be freed. + * NULL if nothing to free. + * @return Pointer to the Rx frame to be handled next. + * NULL, if there are no frames available. If NULL is returned + * the client should re-issue the asynchronous frame Rx request + * (i.e. RequestFrame()) + */ + inline TDataBuffer* GetRxFrame( TDataBuffer* aFrameToFree ); + + #ifndef __KERNEL_MODE__ private: /** handle to kernel side shared memory chunk */ diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/EtherCardApi.inl --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/EtherCardApi.inl Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/EtherCardApi.inl Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 9 % +* %version: 10 % */ // --------------------------------------------------------------------------- @@ -78,11 +78,9 @@ // // --------------------------------------------------------------------------- // -inline TInt RPcmNetCardIf::InitialiseBuffers( - RFrameXferBlockProtocolStack*& aFrameXferBlock ) +inline TInt RPcmNetCardIf::InitialiseBuffers() { TInt status ( KErrNone ); - TSharedChunkInfo info; status = DoSvControl( @@ -109,25 +107,17 @@ + sizeof( RFrameXferBlock ) + sizeof( RFrameXferBlockProtocolStack ) ) ); - aFrameXferBlock = reinterpret_cast( - baseAddress - + KRxDataChunkSize - + sizeof( TDataBuffer ) - + KMgmtSideTxBufferLength - + KProtocolStackSideTxDataChunkSize - + sizeof( RFrameXferBlock ) ); + RFrameXferBlockProtocolStack* frameXferBlock = + reinterpret_cast( + baseAddress + + KRxDataChunkSize + + sizeof( TDataBuffer ) + + KMgmtSideTxBufferLength + + KProtocolStackSideTxDataChunkSize + + sizeof( RFrameXferBlock ) ); - aFrameXferBlock->SetRxDataChunkField( reinterpret_cast( - baseAddress) ); - - aFrameXferBlock->SetTxDataBufferField( reinterpret_cast( - baseAddress - + KRxDataChunkSize - + sizeof( TDataBuffer ) - + KMgmtSideTxBufferLength) ); - - aFrameXferBlock->UserInitialize( - reinterpret_cast(aFrameXferBlock) ); + frameXferBlock->UserInitialize( + reinterpret_cast(frameXferBlock) ); } return status; @@ -184,3 +174,14 @@ EControlFastAddTxFrame, reinterpret_cast(aPacket) )); } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +inline TDataBuffer* RPcmNetCardIf::GetRxFrame( TDataBuffer* aFrameToFree ) + { + return reinterpret_cast(DoControl( + EControlFastGetRxFrame, + reinterpret_cast(aFrameToFree) )); + } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/EthernetFrameMemMngr.h --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/EthernetFrameMemMngr.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/EthernetFrameMemMngr.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 18 % +* %version: 19 % */ #ifndef DETHERNETFRAMEMEMMNGR_H @@ -35,11 +35,6 @@ /** * Manager object for frame Tx and Rx memory * -* Consumed count of Rx-buffers = -* nbr of Rx buffers currently under processing in user mode -* + nbr of Rx buffers given to wlanpdd -* + nbr of Rx buffers waiting for completion to user mode -* * @since S60 v3.1 */ class DEthernetFrameMemMngr @@ -94,9 +89,9 @@ * * @since S60 3.1 * @return memory block that can be used for tx frame write, - * NULL upon failure + * NULL upon failure */ - TDataBuffer* OnWriteEthernetFrame() const; + virtual TDataBuffer* OnWriteEthernetFrame() const; /** * Gets a memory block that can be used as rx frame buffer @@ -123,6 +118,14 @@ void FreeRxFrameMetaHeader( TDataBuffer* aMetaHeader ); /** + * Frees the memory associated to a frame. + * + * @param aFrameToFreeInUserSpace User space pointer to the meta header + * of the frame to be freed. + */ + void FreeRxPacket( TDataBuffer* aFrameToFreeInUserSpace ); + + /** * To be called when rx frame read cycle has ended. * * @since S60 3.1 @@ -134,19 +137,35 @@ * EFalse otherwise */ TBool OnEthernetFrameRxComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ); /** - * To be called when user mode issues a rx frame read request + * To be called when user mode client issues a frame Rx request * * @since S60 3.1 - * @return ETrue if callee should complete the request immediadly - * as their exist data to be completed, EFalse otherwise + * @return ETrue if callee should complete the request immediately + * as there exists Rx frame(s) which can be retrieved by the user + * mode client. + * EFalse otherwise */ - TBool OnReadRequest(); + virtual TBool OnReadRequest() = 0; /** + * Gets the highest priority frame (contained in a buffer allocated from + * the shared memory) from the Rx queues. + * Optionally frees the memory associated to a previously received frame. + * + * @param aFrameToFree Previously received frame which can now be freed. + * NULL if nothing to free. + * @return Pointer to the Rx frame to be handled next. + * NULL, if there are no frames available. If NULL is returned + * the client should re-issue the asynchronous frame Rx request + * (i.e. RequestFrame()) + */ + virtual TDataBuffer* GetRxFrame( TDataBuffer* aFrameToFree ) = 0; + + /** * Frees the specified Rx frame buffer * * @since S60 3.1 @@ -158,8 +177,8 @@ * Allocates a Tx packet from the shared memory. * * @param aLength Length of the requested Tx buffer in bytes - * @return Pointer to the meta header attached to the allocated packet, on - * success. + * @return User space pointer to the meta header attached to the + * allocated packet, on success. * NULL, in case of failure. */ virtual TDataBuffer* AllocTxBuffer( TUint aLength ); @@ -181,7 +200,7 @@ * EFalse if the client is not allowed to call this method again * (i.e. Tx flow is stopped) until it is re-allowed. */ - TBool AddTxFrame( + virtual TBool AddTxFrame( TDataBuffer* aPacketInUserSpace, TDataBuffer*& aPacketInKernSpace, TBool aUserDataTxEnabled ); @@ -198,7 +217,7 @@ * NULL, if there's no frame that could be transmitted, given the * current status of the WHA Tx queues */ - TDataBuffer* GetTxFrame( + virtual TDataBuffer* GetTxFrame( const TWhaTxQueueState& aTxQueueState, TBool& aMore ); @@ -220,7 +239,7 @@ * @return ETrue if Tx should be resumed * EFalse otherwise */ - TBool ResumeClientTx( TBool aUserDataTxEnabled ) const; + virtual TBool ResumeClientTx( TBool aUserDataTxEnabled ) const; /** * Determines if all protocol stack side client's Tx queues are empty @@ -228,7 +247,7 @@ * @return ETrue if all Tx queues are empty * EFalse otherwise */ - TBool AllTxQueuesEmpty() const; + virtual TBool AllTxQueuesEmpty() const; /** * Static creator of the class instance @@ -272,10 +291,7 @@ DWlanLogicalChannel& aParent, WlanChunk*& aRxFrameMemoryPool ) : iReadStatus( ENotPending ), - iFrameXferBlock( NULL ), - iCountCompleted( 0 ), - iCountTobeCompleted( 0 ), - iTxDataBuffer( NULL ), + iFrameXferBlockBase( NULL ), iRxDataChunk( NULL ), iParent( aParent ), iRxFrameMemoryPool( aRxFrameMemoryPool ), @@ -334,37 +350,10 @@ * EFalse otherwise */ virtual TBool DoEthernetFrameRxComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ) = 0; /** - * Gets start address of Rx buffers (their offset addresses) - * that are waiting for completion to user mode - * - * @since S60 3.1 - * @return see above statement - */ - virtual TUint32* DoGetTobeCompletedBuffersStart() = 0; - - /** - * Gets start address of Rx buffers (their offset addresses) - * that have been completed to user mode - * - * @since S60 3.1 - * @return see above statement - */ - virtual TUint32* DoGetCompletedBuffersStart() = 0; - - /** - * Gets called when user mode client issues a frame receive request - * and Rx buffers have been completed to it. The completed Rx frame - * buffers are freed. - * - * @since S60 3.1 - */ - virtual void DoFreeRxBuffers() = 0; - - /** * Marks memory as not in use, meaning that it is not allocated * and attached to calling process'es address space */ @@ -399,22 +388,8 @@ /** state of the rx frame read request */ TFrameReadState iReadStatus; - /** kernel address of xfer block */ - RFrameXferBlock* iFrameXferBlock; - - /** - * amount of rx frame buffers that are - * currently under processing in user mode - */ - TUint32 iCountCompleted; - - /** - * amount of rx frame buffers waiting completion to user mode - */ - TUint32 iCountTobeCompleted; - - /** kernel address of Tx-data buffer */ - TDataBuffer* iTxDataBuffer; + /** kernel address of xfer block; as base class pointer */ + RFrameXferBlockBase* iFrameXferBlockBase; /** pointer to Rx area start in the kernel address space */ TUint8* iRxDataChunk; diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/FrameXferBlock.h --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/FrameXferBlock.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/FrameXferBlock.h Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 25 % +* %version: 26 % */ #ifndef FRAMEXFERBLOCK_H @@ -27,11 +27,6 @@ #include "pack.h" #include "wllddcircularbuffer.h" -/** Max number of completed Rx buffers */ -static const TUint KMaxCompletedRxBufs = 300; - -/** Max number of to be completed Rx buffers */ -static const TUint KMaxToBeCompletedRxBufs = KMaxCompletedRxBufs; /** * This value (bytes) should be at least as large as the Tx offset required @@ -132,7 +127,7 @@ public: - typedef TUint32 TFrameType; + typedef TUint16 TFrameType; /** ethernet II frame */ static const TFrameType KEthernetFrame = 0; @@ -229,7 +224,7 @@ inline TUint8 UserPriority() const; /** - * Gets the RCPI value of a received frame + * Gets the RCPI value of the Rx frame * * @since S60 3.2 * @return RCPI value @@ -338,14 +333,15 @@ /** Default Ctor */ TDataBuffer() : iFrameType( KEthernetFrame ), - iLength( 0 ), iUp( 0 ), iRcpi( 0 ), + iLength( 0 ), iDestinationAddress( KZeroMacAddr ), iBufLength( 0 ), iOffsetToFrameBeginning( 0 ), iBufferOffsetAddr( sizeof( TDataBuffer ) ), - iFlags( 0 ) + iFlags( 0 ), + iNext( NULL ) {}; /** @@ -395,24 +391,20 @@ /** type of the frame in buffer */ TFrameType iFrameType; + /** + * 802.1D User Priority of the frame + */ + TUint8 iUp; + + /** + * RCPI of the received frame; range: [0..250] + */ + TUint8 iRcpi; + /** length of the data in buffer */ TUint32 iLength; /** - * 802.1D User Priority of the frame - * stored as a 32-bit value to keep the length of this object 32-bit - * aligned - */ - TUint32 iUp; - - /** - * RCPI of the received frame; range: [0..250] - * stored as a 32-bit value to keep the length of this object 32-bit - * aligned - */ - TUint32 iRcpi; - - /** * Destination address of the frame to be transmitted. Used only when * the address cannot be determined from the frame content */ @@ -436,6 +428,9 @@ /** may contain a combination of the flags defined for this class */ TFlag iFlags; + /** pointer to the meta header of the next frame in the same Rx queue */ + TDataBuffer* iNext; + /** * Note! The total length of this object needs to be divisible by four * to enable the items following it to be correctly aligned. @@ -690,68 +685,22 @@ #ifndef __KERNEL_MODE__ /* User mode */ - /** - * Gets next Rx-data buffer that has data to be read - * - * @since S60 3.1 - * @param aBuf OUT parameter where Rx-data buffers address that is to - * be read is copied - * @return ETrue Rx-data exists after this call still to read, - * otherwise EFalse - */ - inline TBool GetNextRxDataBuffer( TDataBuffer*& aBuf ); - ////////////////////////////////////////////////////////////////////////// // Rest of the methods are meant to be used only in the device driver code ////////////////////////////////////////////////////////////////////////// - /** - * Set data chunk address - * - * Note! This method is executed in user mode context by the user mode - * client interface, i.e. not the client itself! - * @since S60 3.1 - * @param aUserAddr user address of the buffer - */ - inline void SetRxDataChunkField( TLinAddr aUserAddr ); - + /** + * Initializes the object instance, with the address of this in user space. + * + * @param aThisAddrUserSpace Address of this object in user space. + */ + inline void UserInitialize( TUint32 aThisAddrUserSpace ); + #endif /* User mode end */ #ifdef __KERNEL_MODE__ /* Kernel mode */ /** - * Completes Rx buffers to user space - * - * @since S60 3.1 - * @param aRxCompletionBuffersArray Rx buffer addresses as offsets from - * Rx memory pool beginning - * @param aNumOfCompleted number of buffers - */ - void KeRxComplete( - const TUint32* aRxCompletionBuffersArray, - TUint32 aNumOfCompleted ); - - /** - * Gets the array of Rx buffers (their offset addresses) which have already - * been handled by the user space client - * - * @since S60 5.0 - * @param aRxHandledBuffersArray Pointer to the beginning of the array - * @param aNumOfHandled Number of buffers (offset addresses) on the array - */ - void KeGetHandledRxBuffers( - const TUint32*& aRxHandledBuffersArray, - TUint32& aNumOfHandled ); - - /** - * Notes, that all Rx buffers, which were completed to user space - * the previous time, are now free. - * - * @since S60 5.0 - */ - void KeAllUserSideRxBuffersFreed(); - - /** * Sets the Tx offset for every frame type which can be transmitted * * @since S60 5.0 @@ -763,8 +712,17 @@ void KeSetTxOffsets( TUint32 aEthernetFrameTxOffset, TUint32 aDot11FrameTxOffset, - TUint32 aSnapFrameTxOffset ); + TUint32 aSnapFrameTxOffset ); + /** + * Returns the offset from a User space address to the corresponding address + * in the Kernel space in the shared memory chunk. + * May also be negative. + * + * @return The offset + */ + inline TInt32 UserToKernAddrOffset() const; + protected: /** @@ -788,39 +746,20 @@ protected: // Data - /** the beginning of the Rx data area in user address space */ - TUint8* iRxDataChunk; - - /** - * number of Rx-data buffers that were completed by the device driver + /** Address of this object instance in the kernel mode address space */ + TUint32 iThisAddrKernelSpace; + + /** + * the offset from a User space address to the corresponding address + * in the Kernel space in the shared memory chunk. May also be negative */ - TUint32 iNumOfCompleted; + TInt32 iUserToKernAddrOffset; - /** - * index to iRxCompletedBuffers denoting the Rx buffer that is to be - * extracted next by the user application - */ - TUint32 iCurrentRxBuffer; - - /** - * index of the first Rx buffer in iRxCompletedBuffers array - * - which the user side client has already handled and - * which can therefore be freed & re-used AND - * - which hasn't been freed yet - */ - TUint32 iFirstRxBufferToFree; - /** * defines a Tx offset for every frame type which can be transmitted */ - TUint32 iTxOffset[TDataBuffer::KFrameTypeMax]; + TUint32 iTxOffset[TDataBuffer::KFrameTypeMax]; - /** - * array of TDataBuffer offset addresses from the memory pool start address, - * denoting Rx buffers which are ready to be read - */ - TUint32 iRxCompletedBuffers[KMaxCompletedRxBufs]; - /** * Note! The length of this object needs to be divisible by 4 to make * the objects following it to be aligned correctly @@ -829,41 +768,32 @@ #ifndef __KERNEL_MODE__ /* User mode */ -// --------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // -// --------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // -inline TBool RFrameXferBlockBase::GetNextRxDataBuffer( TDataBuffer*& aBuf ) +inline void RFrameXferBlockBase::UserInitialize( + TUint32 aThisAddrUserSpace) { - TBool ret( EFalse ); - - if ( iNumOfCompleted ) - { - --iNumOfCompleted; - aBuf = reinterpret_cast( - // Rx memory pool user mode start address - iRxDataChunk + - // offset from the memory pool start address - iRxCompletedBuffers[iCurrentRxBuffer]); - - ++iCurrentRxBuffer; - ret = ETrue; - } - - return ret; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -inline void RFrameXferBlockBase::SetRxDataChunkField( TLinAddr aUserAddr ) - { - iRxDataChunk = reinterpret_cast(aUserAddr); + iUserToKernAddrOffset = iThisAddrKernelSpace - aThisAddrUserSpace; } #endif /* User mode end */ +#ifdef __KERNEL_MODE__ /* Kernel mode */ + +// ----------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// ----------------------------------------------------------------------------- +// +inline TInt32 RFrameXferBlockBase::UserToKernAddrOffset() const + { + return iUserToKernAddrOffset; + } + +#endif /* Kernel mode end */ + /** * Ethernet frame transfer context block between user and kernel space @@ -893,6 +823,7 @@ * @return KErrNone on success, * KErrOverflow if aLength is greater than the available space in * the Tx buffer + * KErrNoMemory if frame transfer memory hasn't been allocated */ inline TInt AppendTxDataBuffer( const TUint8* aData, @@ -924,12 +855,40 @@ #ifdef __KERNEL_MODE__ /* Kernel mode */ /** - * Initialises the buffer. + * Initializes Kernel side memory interface to shared memory between User + * and Kernel Space. * * @param aTxBufLength */ - inline void Initialize( TUint32 aTxBufLength ); + void Initialize( TUint32 aTxBufLength ); + + /** + * Adds the specified Rx frame (contained in a buffer allocated from the + * shared memory) to the Rx queue + * + * @param aFrame Meta header attached to the frame; as a kernel + * space pointer. + */ + void AddRxFrame( TDataBuffer* aFrame ); + /** + * Gets the next frame from the Rx queue for passing it to + * the WLAN Mgmt client. + * + * @return User space pointer to the meta header of the Rx frame to be + * passed to the user mode client. + * NULL, if there's no frame available. + */ + TDataBuffer* GetRxFrame(); + + /** + * Finds out if there is an Rx frame ready for user mode client retrieval + * + * @return ETrue if an Rx frame is ready for retrival + * EFalse otherwise + */ + TBool RxFrameAvailable() const; + #endif /* Kernel mode end */ private: @@ -944,14 +903,20 @@ private: // data - /** Tx-data buffer */ - TDataBuffer* iTxDataBuffer; + /** Tx data buffer */ + TDataBuffer* iTxDataBuffer; /** * stores the total capacity (length) of the Tx buffer (iTxDataBuffer) * associated with this object instance */ - TUint32 iTxBufLength; + TUint32 iTxBufLength; + + /** pointer to the meta header of the 1st frame in the Rx queue */ + TDataBuffer* iRxQueueFront; + + /** pointer to the meta header of the last frame in the Rx queue */ + TDataBuffer* iRxQueueRear; }; #ifndef __KERNEL_MODE__ /* User mode */ @@ -968,39 +933,46 @@ TBool aMustNotBeEncrypted, const TMacAddress* aDestinationAddress ) { - if ( aLength <= - iTxBufLength - - iTxOffset[aFrameType] - - iTxDataBuffer->GetLength() ) + if ( iTxDataBuffer ) { - // provided data fits into buffer - - iTxDataBuffer->FrameType( aFrameType ); - iTxDataBuffer->AppendBuffer( aData, aLength, iTxOffset[aFrameType] ); - iTxDataBuffer->SetUserPriority( aUserPriority ); - - if ( aMustNotBeEncrypted ) + if ( aLength <= + iTxBufLength - + iTxOffset[aFrameType] - + iTxDataBuffer->GetLength() ) { - iTxDataBuffer->KeSetFlags( - TDataBuffer::KTxFrameMustNotBeEncrypted ); + // provided data fits into buffer + + iTxDataBuffer->FrameType( aFrameType ); + iTxDataBuffer->AppendBuffer( aData, aLength, iTxOffset[aFrameType] ); + iTxDataBuffer->SetUserPriority( aUserPriority ); + + if ( aMustNotBeEncrypted ) + { + iTxDataBuffer->KeSetFlags( + TDataBuffer::KTxFrameMustNotBeEncrypted ); + } + else + { + iTxDataBuffer->KeClearFlags( + TDataBuffer::KTxFrameMustNotBeEncrypted ); + } + + if ( aDestinationAddress ) + { + iTxDataBuffer->SetDestinationAddress( *aDestinationAddress ); + } + + return KErrNone; } else { - iTxDataBuffer->KeClearFlags( - TDataBuffer::KTxFrameMustNotBeEncrypted ); + return KErrOverflow; } - - if ( aDestinationAddress ) - { - iTxDataBuffer->SetDestinationAddress( *aDestinationAddress ); - } - - return KErrNone; } else { - return KErrOverflow; - } + return KErrNoMemory; + } } // --------------------------------------------------------------------------- @@ -1009,7 +981,10 @@ // inline void RFrameXferBlock::ClearTxDataBuffer() { - iTxDataBuffer->SetLength( 0 ); + if ( iTxDataBuffer ) + { + iTxDataBuffer->SetLength( 0 ); + } } // --------------------------------------------------------------------------- @@ -1023,59 +998,32 @@ #endif /* User mode end */ -#ifdef __KERNEL_MODE__ /* Kernel mode */ - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -inline void RFrameXferBlock::Initialize( TUint32 aTxBufLength ) - { - // perform base class initialization first - KeInitialize(); - - iTxDataBuffer = NULL; - iTxBufLength = aTxBufLength; - } - -#endif /* Kernel mode end */ /** * Ethernet frame transfer context block between user and kernel space * for the protocol stack side client * */ -class RFrameXferBlockProtocolStack : public RFrameXferBlock +class RFrameXferBlockProtocolStack : public RFrameXferBlockBase { public: -#ifndef __KERNEL_MODE__ /* User mode */ - - /** - * Initializes TX Data pool, with the address of this in user space. - * - * @param aThisAddrUserSpace Address of this object in user space. - */ - inline void UserInitialize( TUint32 aThisAddrUserSpace ); - -#endif /* User mode end */ - #ifdef __KERNEL_MODE__ /* Kernel mode */ /** - * Initialises Kernel's memory interface to shared memory between User + * Initializes Kernel side memory interface to shared memory between User * and Kernel Space. */ - void Initialise(); + void Initialize(); /** * Allocates a Tx buffer from the shared memory. * - * @param aTxBuf Pointer to the pre-allocated actual Tx buffer. + * @param aTxBuf Kernel space pointer to the pre-allocated actual Tx buffer * @param aBufLength Length of the Tx buffer. - * @return Pointer to the meta header attached to the allocated buffer, on - * success. + * @return User space pointer to the meta header attached to the + * allocated buffer, on success. * NULL, in case of allocation failure. */ TDataBuffer* AllocTxBuffer( const TUint8* aTxBuf, TUint16 aBufLength ); @@ -1145,7 +1093,35 @@ * EFalse otherwise */ inline TBool AllTxQueuesEmpty() const; + + /** + * Adds the specified Rx frame (contained in a buffer allocated from the + * shared memory) to the relevant Rx queue according to its AC (i.e. + * priority). + * + * @param aFrame Meta header attached to the frame; as a kernel + * space pointer. + */ + void AddRxFrame( TDataBuffer* aFrame ); + /** + * Gets the highest priority frame from the Rx queues for passing it to + * the protocol stack side client. + * + * @return User space pointer to the meta header of the Rx frame to be + * passed to the user mode client. + * NULL, if there's no frame available. + */ + TDataBuffer* GetRxFrame(); + + /** + * Finds out if there is an Rx frame ready for user mode client retrieval + * + * @return ETrue if an Rx frame is ready for retrival + * EFalse otherwise + */ + inline TBool RxFrameAvailable() const; + #endif /* Kernel mode end */ private: @@ -1203,18 +1179,30 @@ /** Tx frame meta header objects */ TDataBuffer iDataBuffers[KTxPoolSizeInPackets]; - /** Address of this object instance in the user mode address space */ - TUint32 iThisAddrUserSpace; + /** pointer to the meta header of the 1st frame in the VO Rx queue */ + TDataBuffer* iVoiceRxQueueFront; + + /** pointer to the meta header of the last frame in the VO Rx queue */ + TDataBuffer* iVoiceRxQueueRear; - /** Address of this object instance in the kernel mode address space */ - TUint32 iThisAddrKernelSpace; + /** pointer to the meta header of the 1st frame in the VI Rx queue */ + TDataBuffer* iVideoRxQueueFront; + + /** pointer to the meta header of the last frame in the VI Rx queue */ + TDataBuffer* iVideoRxQueueRear; - /** - * the offset from a User space address to the corresponding address - * in the Kernel space in the shared memory chunk. May also be negative - */ - TInt32 iUserToKernAddrOffset; - + /** pointer to the meta header of the 1st frame in the BE Rx queue */ + TDataBuffer* iBestEffortRxQueueFront; + + /** pointer to the meta header of the last frame in the BE Rx queue */ + TDataBuffer* iBestEffortRxQueueRear; + + /** pointer to the meta header of the 1st frame in the BG Rx queue */ + TDataBuffer* iBackgroundRxQueueFront; + + /** pointer to the meta header of the last frame in the BG Rx queue */ + TDataBuffer* iBackgroundRxQueueRear; + /** * Note! The length of this object needs to be divisible by 4 to make * the objects following it to be aligned correctly @@ -1222,38 +1210,28 @@ }; -#ifndef __KERNEL_MODE__ /* User mode */ -#include - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -inline void RFrameXferBlockProtocolStack::UserInitialize( - TUint32 aThisAddrUserSpace) - { - iThisAddrUserSpace = aThisAddrUserSpace; - iUserToKernAddrOffset = iThisAddrKernelSpace - iThisAddrUserSpace; - } -#endif /* User mode end */ - #ifdef __KERNEL_MODE__ /* Kernel mode */ // ----------------------------------------------------------------------------- -// +// Note! This method is executed also in the context of the user mode client +// thread, but in supervisor mode // ----------------------------------------------------------------------------- // inline void RFrameXferBlockProtocolStack::FreeTxPacket( TDataBuffer*& aPacket ) { - aPacket->SetLength( 0 ); - aPacket->SetUserPriority( 0 ); - // put the packet to the Free Queue - iFreeQueue.PutPacket( aPacket ); - aPacket = NULL; + if ( aPacket ) + { + aPacket->SetLength( 0 ); + aPacket->SetUserPriority( 0 ); + // put the packet to the Free Queue + iFreeQueue.PutPacket( aPacket ); + aPacket = NULL; + } } // ----------------------------------------------------------------------------- -// +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode // ----------------------------------------------------------------------------- // inline TBool RFrameXferBlockProtocolStack::AllTxQueuesEmpty() const @@ -1264,6 +1242,25 @@ iBackgroundTxQueue.IsEmpty() ) ? ETrue : EFalse; } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline TBool RFrameXferBlockProtocolStack::RxFrameAvailable() const + { + if ( reinterpret_cast(iVoiceRxQueueFront) || + reinterpret_cast(iVideoRxQueueFront) || + reinterpret_cast(iBestEffortRxQueueFront) || + reinterpret_cast(iBackgroundRxQueueFront ) ) + { + return ETrue; + } + else + { + return EFalse; + } + } + #endif /* Kernel mode end */ #endif // FRAMEXFERBLOCK_H diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/MgmtFrameMemMngr.h --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/MgmtFrameMemMngr.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/MgmtFrameMemMngr.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 15 % +* %version: 16 % */ #ifndef MGMTFRAMEMMNGR_H @@ -44,6 +44,9 @@ TBool aUseCachedMemory, TInt aRxFrameBufAllocationUnit ) : DEthernetFrameMemMngr( aParent, aRxFrameMemoryPool ), + iFrameXferBlock( NULL ), + iChunkKernelAddr( 0 ), + iTxDataBuffer( NULL ), iUseCachedMemory( aUseCachedMemory ), iRxFrameBufAllocationUnit ( aRxFrameBufAllocationUnit ), iChunkSize( @@ -52,7 +55,11 @@ {}; /** Dtor */ - virtual ~MgmtFrameMemMngr() {}; + virtual ~MgmtFrameMemMngr() + { + iFrameXferBlock = NULL; + iTxDataBuffer = NULL; + }; protected: @@ -107,51 +114,55 @@ * EFalse otherwise */ virtual TBool DoEthernetFrameRxComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ); /** * From DEthernetFrameMemMngr - * Gets start address of Rx buffers (their offset addresses) - * that are waiting for completion to user mode - * - * @since S60 3.1 - * @return see above statement - */ - virtual TUint32* DoGetTobeCompletedBuffersStart(); - - /** - * From DEthernetFrameMemMngr - * Gets start address of Rx buffers (their offset addresses) - * that have been completed to user mode - * - * @since S60 3.1 - * @return see above statement - */ - virtual TUint32* DoGetCompletedBuffersStart(); - - /** - * From DEthernetFrameMemMngr - * Gets called when user mode client issues a frame receive request - * and Rx buffers have been completed to it. The completed Rx frame - * buffers are freed. - * - * @since S60 3.1 - */ - virtual void DoFreeRxBuffers(); - - /** - * From DEthernetFrameMemMngr * Frees the specified Rx frame buffer * * @since S60 3.1 * @param aBufferToFree The buffer to free */ virtual void DoMarkRxBufFree( TUint8* aBufferToFree ); + + /** + * From DEthernetFrameMemMngr + * To be called when user mode client issues a frame Rx request + * + * @return ETrue if callee should complete the request immediately + * as there exists Rx frame(s) which can be retrieved by the user + * mode client. + * EFalse otherwise + */ + virtual TBool OnReadRequest(); + + /** + * From DEthernetFrameMemMngr + * Gets the next frame (contained in a buffer allocated from + * the shared memory) from the Rx queue. + * Optionally frees the memory associated to a previously received frame. + * + * @param aFrameToFree User space pointer to previously received frame + * which can now be freed. + * NULL if nothing to free. + * @return User space pointer to the Rx frame to be handled next. + * NULL, if there are no frames available. + */ + virtual TDataBuffer* GetRxFrame( TDataBuffer* aFrameToFreeInUserSpace ); private: /** + * Gets a memory block that can be used for tx frame write + * + * @since S60 3.1 + * @return memory block that can be used for tx frame write, + * NULL upon failure + */ + virtual TDataBuffer* OnWriteEthernetFrame() const; + + /** * Returns the number of extra bytes required to align Rx buffer start * address, to be returned to WHA layer, to allocation unit boundary * @return See above @@ -171,27 +182,20 @@ // Prohibit copy constructor. MgmtFrameMemMngr( const MgmtFrameMemMngr& ); // Prohibit assigment operator. - MgmtFrameMemMngr& operator= ( const MgmtFrameMemMngr & ); + MgmtFrameMemMngr& operator= ( const MgmtFrameMemMngr& ); private: // Data + /** kernel address of frame xfer block */ + RFrameXferBlock* iFrameXferBlock; + /** * kernel address of the shared memory chunk */ TLinAddr iChunkKernelAddr; - /** - * array of TDataBuffer offset addresses, denoting Rx buffers, - * which are waiting here in kernel mode to be completed - * to user mode, when the next frame receive request arrives - */ - TUint32 iTobeCompletedBuffers[KMaxToBeCompletedRxBufs]; - - /** - * array of TDataBuffer offset addresses, denoting Rx buffers, that are - * currently under processing in user mode - */ - TUint32 iCompletedBuffers[KMaxCompletedRxBufs]; + /** kernel address of Tx data buffer */ + TDataBuffer* iTxDataBuffer; /** * ETrue if cached frame transfer memory shall be used, diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.h --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 18 % +* %version: 19 % */ #ifndef RWLAN_LOGICAL_CHANNEL_H_ @@ -29,15 +29,6 @@ #include // for RChunk #endif -// Enumeration values for control messages -enum TWlanControl - { - EWlanSvControlInitBuffers, // Allocate frame transfer memory for WLAN Mgmt - // client - EWlanSvControlFreeBuffers // Deallocate memory allocated by - // EWlanSvControlInitBuffers - }; - // Open parameters struct TOpenParam { @@ -55,23 +46,42 @@ TUint32 iFirmWareLength; // length of firmware in bytes }; -// Enumeration values for asynchronous requests. Do not exceed KMaxRequests! -enum TWlanRequest - { - EWlanRequestNotify, // request a notification - EWlanRequestFrame, // frame Rx request - EWlanRequestSend, // frame Tx request - EWlanCommand, // WLAN management command - EWlanInitSystem, // internal init - EWlanFinitSystem, // internal finit - EWlanMaxRequest - }; - class RWlanLogicalChannel : public RBusLogicalChannel { - public: + // Enumeration values for control messages + enum TWlanControl + { + EWlanSvControlInitBuffers, // Allocate frame transfer memory for WLAN Mgmt + // client + EWlanSvControlFreeBuffers // Deallocate memory allocated by + // EWlanSvControlInitBuffers + }; + + // Enumeration values for asynchronous requests. Do not exceed KMaxRequests! + enum TWlanRequest + { + EWlanRequestNotify, // request a notification + EWlanRequestFrame, // frame Rx request + EWlanRequestSend, // frame Tx request + EWlanCommand, // WLAN management command + EWlanInitSystem, // internal init + EWlanFinitSystem, // internal finit + EWlanMaxRequest + }; + + /** + * Calls executed in the context of the client's thread, but in + * supervisor mode + */ + enum TControlFast + { + EWlanControlFastGetRxFrame = 0x0E000000 + }; + +public: + /** * Opens a channel to the WLAN device driver. * @@ -153,7 +163,7 @@ * * @since S60 3.1 * @param aFrameXferBlock FrameXferBlock to be initialised by - * the device driver. + * the device driver. * @return KErrNone on success, any other on failure */ inline TInt InitialiseBuffers( RFrameXferBlock*& aFrameXferBlock ); @@ -194,6 +204,20 @@ */ inline void CancelRxRequests(); + /** + * Gets the next frame (contained in a buffer allocated from + * the shared memory) from the Rx queue. + * Optionally frees the memory associated to a previously received frame. + * + * @param aFrameToFree Previously received frame which can now be freed. + * NULL if nothing to free. + * @return Pointer to the Rx frame to be handled next. + * NULL, if there are no frames available. If NULL is returned + * the client should re-issue the asynchronous frame Rx request + * (i.e. RequestFrame()) + */ + inline TDataBuffer* GetRxFrame( TDataBuffer* aFrameToFree ); + private: inline TInt InitWlanSystem( TOpenParam& aOpenParam ); @@ -201,11 +225,6 @@ private: // data /** - * has the WLAN system been initialized - */ - TBool iWlanSystemInitialized; - - /** * If a WLAN Management Command is executed asynchronously, this data * member is used to store the Management Command message - thus keeping * it valid until the asynchronous request is actually scheduled. diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.inl --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.inl Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.inl Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 17 % +* %version: 18 % */ // ----------------------------------------------------------------------------- @@ -39,9 +39,7 @@ TWlanUnit aUnit, TOpenParam& aOpenParam ) { - iWlanSystemInitialized = EFalse; - - TInt err = DoCreate( + TInt err = DoCreate( LDD_NAME, VersionRequired(), aUnit, @@ -54,12 +52,6 @@ // driver load sequence success // do system init err = InitWlanSystem( aOpenParam ); - - if ( err == KErrNone ) - { - // WLAN system successfully initialized - iWlanSystemInitialized = ETrue; - } } return err; @@ -71,21 +63,12 @@ // 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; - } + // request WLAN system resources to be released + // + TRequestStatus status; + DoRequest( EWlanFinitSystem, status ); + User::WaitForRequest(status); + // internally call close Close(); } @@ -237,12 +220,12 @@ + KMgmtSideTxBufferLength + KProtocolStackSideTxDataChunkSize ); - aFrameXferBlock->SetRxDataChunkField( reinterpret_cast( - baseAddress) ); - aFrameXferBlock->SetTxDataBufferField( reinterpret_cast( baseAddress + KRxDataChunkSize ) ); + + aFrameXferBlock->UserInitialize( + reinterpret_cast(aFrameXferBlock) ); } return status; @@ -279,3 +262,15 @@ { DoRequest( EWlanRequestFrame, aStatus ); } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +inline TDataBuffer* RWlanLogicalChannel::GetRxFrame( + TDataBuffer* aFrameToFree ) + { + return reinterpret_cast(DoControl( + EWlanControlFastGetRxFrame, + reinterpret_cast(aFrameToFree) )); + } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/WlanLogicalChannel.h --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/WlanLogicalChannel.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/WlanLogicalChannel.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 32 % +* %version: 33 % */ #ifndef DWLANLOGICALCHANNEL_H @@ -139,18 +139,38 @@ /** * Process a function for this logical channel. - * This function is executed in the context of client's thread in - * supervisor mode. All code executed in this mode MUST NOT - * take a lot of time and MUST NOT access the WHA layer. * @param aFunction Defines the operation/function to be performed. * @param param Function specific parameter * @return function specific return value. */ - virtual TAny* DoControlFast( TInt aFunction, TAny* param ); + virtual TAny* DoControlFast( TInt aFunction, TAny* aParam ); private: /** + * Process a function for this logical channel. + * + * @param aFunction Defines the operation/function to be performed. + * @param aParam Function specific parameter + * @return Function specific return value. + */ + TAny* OnMgmtSideControlFast( TInt aFunction, TAny* aParam ); + + /** + * Process a function for this logical channel. + * + * @param aFunction Defines the operation/function to be performed. + * @param aParam Function specific parameter + * @param aTriggerTx ETrue if Tx operation should be triggered + * EFalse otherwise + * @return Function specific return value. + */ + TAny* OnEthernetSideControlFast( + TInt aFunction, + TAny* aParam, + TBool& aTriggerTx ); + + /** * Called from statemachine when oid has been completed. * Triggers handling of a new oid * @param aOid OID handled @@ -190,7 +210,7 @@ * @param aNumOfBuffers number of meta header pointers in the array */ virtual void MgmtDataReceiveComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ); /** @@ -256,7 +276,7 @@ * EFalse otherwise */ virtual TBool ProtocolStackDataReceiveComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ); /** diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/wllddlogicalchannelbase.h --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/wllddlogicalchannelbase.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/wllddlogicalchannelbase.h Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 2 % +* %version: 3 % */ #ifndef D_WLANLOGICALCHANNELBASE_H @@ -26,8 +26,9 @@ /** * An abstract base class for a logical channel that provides a framework in -* which user-side client requests are executed in the context of a single -* kernel-side thread. +* which user side client requests are executed in the context of a single +* kernel side thread or in the context of the client thread in supervisor +* mode * * @since S60 v5.1 */ @@ -73,9 +74,9 @@ /** * Process a function for this logical channel. - * This function is executed in the context of client's thread in - * supervisor mode. All code executed in this mode MUST not - * take a lot of time and MUST NOT access the WHA layer. + * This method is executed in the context of the user mode client + * thread, but in supervisor mode. Code executed in this mode + * MUST NOT take a lot of time. * @param aFunction Defines the operation/function to be performed. * @param param Function specific parameter * @return function specific return value. @@ -97,7 +98,7 @@ * The smallest Fast Control Function ID that DoControlFast() * accepts. */ - EMinControlFast = static_cast(0x0F000000), + EMinControlFast = static_cast(0x0E000000), /** * The largest Fast Control Function ID that DoControlFast() diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/DataFrameMemMngr.cpp --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/DataFrameMemMngr.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/DataFrameMemMngr.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 18 % +* %version: 19 % */ #include "WlLddWlanLddConfig.h" @@ -120,23 +120,23 @@ TraceDump(MEMORY, (("WLANLDD: new WlanChunk: 0x%08x"), reinterpret_cast(iTxFrameMemoryPool))); - iFrameXferBlock = reinterpret_cast( - start_of_mem - + KRxDataChunkSize - + sizeof( TDataBuffer ) - + KMgmtSideTxBufferLength - + KProtocolStackSideTxDataChunkSize - + sizeof( RFrameXferBlock ) ); - iFrameXferBlockProtoStack = - static_cast(iFrameXferBlock); + reinterpret_cast( + start_of_mem + + KRxDataChunkSize + + sizeof( TDataBuffer ) + + KMgmtSideTxBufferLength + + KProtocolStackSideTxDataChunkSize + + sizeof( RFrameXferBlock ) ); + + iFrameXferBlockBase = iFrameXferBlockProtoStack; TraceDump( INIT_LEVEL, (("WLANLDD: DataFrameMemMngr::DoOpenHandle: Nif RFrameXferBlock addr: 0x%08x"), reinterpret_cast(iFrameXferBlockProtoStack) ) ); // initiliase xfer block - iFrameXferBlockProtoStack->Initialise(); + iFrameXferBlockProtoStack->Initialize(); iRxBufAlignmentPadding = iParent.RxBufAlignmentPadding(); @@ -175,197 +175,103 @@ // // --------------------------------------------------------------------------- // -void DataFrameMemMngr::DoFreeRxBuffers() - { - for ( TUint i = 0; i < iCountCompleted; ++i ) - { - TDataBuffer* metaHdr ( reinterpret_cast( - iRxDataChunk + iCompletedBuffers[i]) ); - - // first free the actual Rx frame buffer if relevant - if ( metaHdr->KeFlags() & TDataBuffer::KDontReleaseBuffer ) - { - // this buffer shall not be freed yet, so no action here - - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoFreeRxBuffers: don't free yet Rx buf at addr: 0x%08x"), - reinterpret_cast(metaHdr->KeGetBufferStart()) ) ); - } - else - { - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoFreeRxBuffers: free Rx buf at addr: 0x%08x"), - reinterpret_cast(metaHdr->KeGetBufferStart()) ) ); - - iRxFrameMemoryPool->Free( - metaHdr->KeGetBufferStart() - // take into account the alignment padding - - iRxBufAlignmentPadding ); - } - - // free the Rx frame meta header - - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoFreeRxBuffers: free Rx meta header at addr: 0x%08x"), - reinterpret_cast(metaHdr)) ); - - iRxFrameMemoryPool->Free( metaHdr ); - } - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// TBool DataFrameMemMngr::DoEthernetFrameRxComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ) { TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: aNumOfBuffers: %d"), + (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: " + "aNumOfBuffers: %d"), aNumOfBuffers) ); - if ( aNumOfBuffers + iCountTobeCompleted > KMaxToBeCompletedRxBufs ) - { - // too little space reserved for Rx buffer handles - os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - } - TBool ret( EFalse ); - - if ( iReadStatus == EPending ) - { - // read pending - if ( !iCountTobeCompleted ) - { - // no existing Rx buffers to complete in queue - // we may complete these ones on the fly - - // note the completed Rx buffers first so that we can change - // their addresses to offsets - assign( - reinterpret_cast(&aBufferStart), - iCompletedBuffers, - aNumOfBuffers ); - - // update the new Rx buffer start addresses added above to be - // offsets from the Rx memory pool beginning - for( TUint i = 0; i < aNumOfBuffers; ++i ) - { - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: supplied Rx buf addr: 0x%08x"), - iCompletedBuffers[i]) ); - - iCompletedBuffers[i] - -= reinterpret_cast(iRxDataChunk); - - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: Rx buf offset addr: 0x%08x"), - iCompletedBuffers[i]) ); - } - - iCountCompleted = aNumOfBuffers; - - iFrameXferBlock->KeRxComplete( iCompletedBuffers, iCountCompleted); - } - else - { - // existing rx buffers to complete in queue. - // We must append these at the rear and after that - // complete the existing read request - assign( - reinterpret_cast(&aBufferStart), - iTobeCompletedBuffers + iCountTobeCompleted, - aNumOfBuffers ); + TDataBuffer** metaHdrPtrArray(&aBufferStart); - // update the new Rx buffer start addresses added above to be - // offsets from the Rx memory pool beginning - for( TUint i = 0; i < aNumOfBuffers; ++i ) + if ( iFrameXferBlockProtoStack ) + { + for ( TUint i = 0; i < aNumOfBuffers; ++i ) + { + if ( metaHdrPtrArray[i] ) { - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: supplied Rx buf addr: 0x%08x"), - iTobeCompletedBuffers[iCountTobeCompleted + i]) ); - - iTobeCompletedBuffers[iCountTobeCompleted + i] - -= reinterpret_cast(iRxDataChunk); - - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: Rx buf offset addr: 0x%08x"), - iTobeCompletedBuffers[iCountTobeCompleted + i]) ); + iFrameXferBlockProtoStack->AddRxFrame( metaHdrPtrArray[i] ); } - - iCountCompleted = iCountTobeCompleted + aNumOfBuffers; - - iFrameXferBlock->KeRxComplete( - iTobeCompletedBuffers, - iCountCompleted ); - - // note the completed Rx buffers - assign( iTobeCompletedBuffers, iCompletedBuffers, iCountCompleted ); - iCountTobeCompleted = 0; - } - - ret = ETrue; - } - else - { - // no read pending - // append at the rear - assign( - reinterpret_cast(&aBufferStart), - iTobeCompletedBuffers + iCountTobeCompleted, - aNumOfBuffers ); - - // update the new Rx buffer start addresses added above to be - // offsets from the Rx memory pool beginning - for( TUint i = 0; i < aNumOfBuffers; ++i ) - { - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: supplied Rx buf addr: 0x%08x"), - iTobeCompletedBuffers[iCountTobeCompleted + i]) ); - - iTobeCompletedBuffers[iCountTobeCompleted + i] - -= reinterpret_cast(iRxDataChunk); - - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: Rx buf offset addr: 0x%08x"), - iTobeCompletedBuffers[iCountTobeCompleted + i]) ); } - iCountTobeCompleted += aNumOfBuffers; + if ( iReadStatus == EPending ) + { + ret = ETrue; + } } - - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: end: iCountCompleted: %d"), - iCountCompleted) ); - - TraceDump( RX_FRAME, - (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: end: iCountTobeCompleted: %d"), - iCountTobeCompleted) ); return ret; } // --------------------------------------------------------------------------- -// +// // --------------------------------------------------------------------------- // -TUint32* DataFrameMemMngr::DoGetTobeCompletedBuffersStart() +TBool DataFrameMemMngr::OnReadRequest() { - return iTobeCompletedBuffers; + TBool ret( EFalse ); + + if ( IsMemInUse() && iFrameXferBlockProtoStack ) + { + if ( iFrameXferBlockProtoStack->RxFrameAvailable() ) + { + // there are Rx frames ready for the user mode client retrieval + ret = ETrue; + + // the frame Rx request won't be left pending as the callee will + // complete it + iReadStatus = ENotPending; + } + else + { + // there are no Rx frames ready for the user mode client retrieval + // the Rx request is left pending + iReadStatus = EPending; + } + } +#ifndef NDEBUG + else + { + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } +#endif + + TraceDump( RX_FRAME, + (("WLANLDD: DataFrameMemMngr::OnReadRequest: ret (bool): %d"), + ret) ); + + return ret; } // --------------------------------------------------------------------------- -// +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode // --------------------------------------------------------------------------- // -TUint32* DataFrameMemMngr::DoGetCompletedBuffersStart() +TDataBuffer* DataFrameMemMngr::GetRxFrame( + TDataBuffer* aFrameToFreeInUserSpace ) { - return iCompletedBuffers; + TDataBuffer* rxFrame( NULL ); + + if ( IsMemInUse() && iFrameXferBlockProtoStack ) + { + if ( aFrameToFreeInUserSpace ) + { + FreeRxPacket( aFrameToFreeInUserSpace ); + } + + rxFrame = iFrameXferBlockProtoStack->GetRxFrame(); + } + + return rxFrame; } // --------------------------------------------------------------------------- -// +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode // --------------------------------------------------------------------------- // TDataBuffer* DataFrameMemMngr::AllocTxBuffer( TUint aLength ) @@ -376,7 +282,10 @@ TDataBuffer* metaHdr ( NULL ); - if ( ( !IsMemInUse() ) || ( aLength > KMaxEthernetFrameLength ) ) + if ( ( !IsMemInUse() ) || + ( !iTxFrameMemoryPool ) || + ( !iFrameXferBlockProtoStack ) || + ( aLength > KMaxEthernetFrameLength ) ) { #ifndef NDEBUG TraceDump( NWSA_TX_DETAILS, @@ -423,17 +332,66 @@ } // --------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// --------------------------------------------------------------------------- +// +TBool DataFrameMemMngr::AddTxFrame( + TDataBuffer* aPacketInUserSpace, + TDataBuffer*& aPacketInKernSpace, + TBool aUserDataTxEnabled ) + { + if ( IsMemInUse() && iFrameXferBlockProtoStack ) + { + return iFrameXferBlockProtoStack->AddTxFrame( + aPacketInUserSpace, + aPacketInKernSpace, + aUserDataTxEnabled ); + } + else + { + return EFalse; + } + } + +// --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- // +TDataBuffer* DataFrameMemMngr::GetTxFrame( + const TWhaTxQueueState& aTxQueueState, + TBool& aMore ) + { + if ( IsMemInUse() && iFrameXferBlockProtoStack ) + { + return iFrameXferBlockProtoStack->GetTxFrame( aTxQueueState, aMore ); + } + else + { + return NULL; + } + } + +// --------------------------------------------------------------------------- +// Note! This method is executed also in the context of the user mode client +// thread, but in supervisor mode +// --------------------------------------------------------------------------- +// void DataFrameMemMngr::FreeTxPacket( TDataBuffer*& aPacket ) { - if ( IsMemInUse() ) + if ( aPacket ) { - // free the actual Tx buffer - iTxFrameMemoryPool->Free( aPacket->KeGetBufferStart() ); - // free the meta header - iFrameXferBlockProtoStack->FreeTxPacket( aPacket ); + if ( iTxFrameMemoryPool ) + { + // free the actual Tx buffer + iTxFrameMemoryPool->Free( aPacket->KeGetBufferStart() ); + } + + if ( iFrameXferBlockProtoStack ) + { + // free the meta header + iFrameXferBlockProtoStack->FreeTxPacket( aPacket ); + } } } @@ -441,6 +399,39 @@ // // --------------------------------------------------------------------------- // +TBool DataFrameMemMngr::ResumeClientTx( TBool aUserDataTxEnabled ) const + { + TBool ret( EFalse ); + + if ( iFrameXferBlockProtoStack ) + { + ret = iFrameXferBlockProtoStack->ResumeClientTx( aUserDataTxEnabled ); + } + + return ret; + } + +// --------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// --------------------------------------------------------------------------- +// +TBool DataFrameMemMngr::AllTxQueuesEmpty() const + { + TBool ret( EFalse ); + + if ( iFrameXferBlockProtoStack ) + { + ret = iFrameXferBlockProtoStack->AllTxQueuesEmpty(); + } + + return ret; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// void DataFrameMemMngr::OnReleaseMemory( DThread& aThread ) { TraceDump(INIT_LEVEL, ("WLANLDD: DataFrameMemMngr::OnReleaseMemory")); diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/EthernetFrameMemMngr.cpp --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/EthernetFrameMemMngr.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/EthernetFrameMemMngr.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 24 % +* %version: 25 % */ #include "WlLddWlanLddConfig.h" @@ -170,8 +170,7 @@ { MarkMemFree(); - iFrameXferBlock = NULL; - iTxDataBuffer = NULL; + iFrameXferBlockBase = NULL; iRxDataChunk = NULL; } @@ -181,79 +180,11 @@ // TDataBuffer* DEthernetFrameMemMngr::OnWriteEthernetFrame() const { - if ( iTxDataBuffer->GetLength() >= sizeof( SEthernetHeader ) ) - { - return iTxDataBuffer; - } - else - { - os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - return NULL; - } - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -TBool DEthernetFrameMemMngr::OnReadRequest() - { - TBool ret( EFalse ); - - if ( IsMemInUse() ) - { - if ( iCountCompleted ) - { - // free relevant buffers - DoFreeRxBuffers(); - iCountCompleted = 0; // no buffers anymore in process in user mode - - // make sure that the same buffers are not tried to be - // freed again thru the incremental freeing method - iFrameXferBlock->KeAllUserSideRxBuffersFreed(); - } - - if ( iCountTobeCompleted ) - { - // there are Rx buffers to be completed - - iFrameXferBlock->KeRxComplete( DoGetTobeCompletedBuffersStart(), - iCountTobeCompleted ); - // mark the completed buffers - assign( DoGetTobeCompletedBuffersStart(), - DoGetCompletedBuffersStart(), - iCountTobeCompleted ); - iCountCompleted = iCountTobeCompleted; - iCountTobeCompleted = 0; - - ret = ETrue; - // the frame Rx request won't be pending as the callee shall - // complete it - iReadStatus = ENotPending; - } - else - { - // there are no Rx buffers to be completed. The Rx request is - // left pending - iReadStatus = EPending; - } - } - else - { - os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - } - - return ret; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void DEthernetFrameMemMngr::DoMarkRxBufFree( TUint8* /*aBufferToFree*/ ) - { // not supported in default handler +#ifndef NDEBUG os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + return NULL; } // --------------------------------------------------------------------------- @@ -265,9 +196,9 @@ TUint32 aDot11FrameTxOffset, TUint32 aSnapFrameTxOffset ) { - if ( IsMemInUse() ) + if ( IsMemInUse() && iFrameXferBlockBase ) { - iFrameXferBlock->KeSetTxOffsets( + iFrameXferBlockBase->KeSetTxOffsets( aEthernetFrameTxOffset, aDot11FrameTxOffset, aSnapFrameTxOffset ); @@ -290,7 +221,7 @@ else { // we are trying to acquire an Rx buffer but our user mode client - // has not asked for the memorybuffer pool to be initialized. In this + // has not asked for the memory buffer pool to be initialized. In this // case NULL is returned, as no buffers are available TraceDump(RX_FRAME, ("WLANLDD: DEthernetFrameMemMngr::OnGetEthernetFrameRxBuffer: not initialized => failed")); @@ -307,7 +238,7 @@ { TDataBuffer* buffer ( NULL ); - if ( IsMemInUse() ) + if ( IsMemInUse() && iRxFrameMemoryPool ) { buffer = reinterpret_cast( iRxFrameMemoryPool->Alloc( sizeof( TDataBuffer ), ETrue ) ); @@ -335,8 +266,13 @@ // void DEthernetFrameMemMngr::FreeRxFrameMetaHeader( TDataBuffer* aMetaHeader ) { - if ( IsMemInUse() ) + if ( IsMemInUse() && iRxFrameMemoryPool ) { + TraceDump( RX_FRAME, + (("WLANLDD: DEthernetFrameMemMngr::FreeRxFrameMetaHeader: " + "at addr: 0x%08x"), + reinterpret_cast(aMetaHeader)) ); + iRxFrameMemoryPool->Free( aMetaHeader ); } else @@ -344,16 +280,74 @@ // the whole Rx memory pool - including aMetaHeader - has already // been deallocated, so nothing is done in this case TraceDump( RX_FRAME, - ("WLANLDD: MgmtFrameMemMngr::FreeRxFrameMetaHeader: Rx memory pool already deallocated; no action needed") ); + ("WLANLDD: MgmtFrameMemMngr::FreeRxFrameMetaHeader: Rx memory " + "pool already deallocated; no action needed") ); } } // --------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// --------------------------------------------------------------------------- +// +void DEthernetFrameMemMngr::FreeRxPacket( + TDataBuffer* aFrameToFreeInUserSpace ) + { + if ( IsMemInUse() && + aFrameToFreeInUserSpace && + iFrameXferBlockBase && + iRxFrameMemoryPool ) + { + TDataBuffer* frameToFreeInKernSpace ( + reinterpret_cast( + reinterpret_cast( + aFrameToFreeInUserSpace) + + iFrameXferBlockBase->UserToKernAddrOffset()) ); + + // first free the actual Rx frame buffer if relevant + if ( frameToFreeInKernSpace->KeFlags() & + TDataBuffer::KDontReleaseBuffer ) + { + // this buffer shall not be freed yet, so no action here + + TraceDump( RX_FRAME, + (("WLANLDD: DEthernetFrameMemMngr::FreeRxPacket: don't free " + "yet Rx buf at addr: 0x%08x"), + reinterpret_cast( + frameToFreeInKernSpace->KeGetBufferStart()) ) ); + } + else + { + TraceDump( RX_FRAME, + (("WLANLDD: DEthernetFrameMemMngr::FreeRxPacket: free Rx buf " + "at addr: 0x%08x"), + reinterpret_cast( + frameToFreeInKernSpace->KeGetBufferStart()) ) ); + + iRxFrameMemoryPool->Free( + frameToFreeInKernSpace->KeGetBufferStart() + // take into account the alignment padding + - iRxBufAlignmentPadding ); + } + + // free the Rx frame meta header + + TraceDump( RX_FRAME, + (("WLANLDD: DEthernetFrameMemMngr::FreeRxPacket: " + "free metahdr at addr: 0x%08x"), + reinterpret_cast(frameToFreeInKernSpace)) ); + + iRxFrameMemoryPool->Free( frameToFreeInKernSpace ); + aFrameToFreeInUserSpace = NULL; + } + } + +// --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- // TBool DEthernetFrameMemMngr::OnEthernetFrameRxComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ) { TBool ret( EFalse ); @@ -394,10 +388,22 @@ } // --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void DEthernetFrameMemMngr::DoMarkRxBufFree( TUint8* /*aBufferToFree*/ ) + { + // not suported in this default implementation +#ifndef NDEBUG + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + } + +// --------------------------------------------------------------------------- // This default implementation always returns NULL // --------------------------------------------------------------------------- // -TDataBuffer* DEthernetFrameMemMngr::AllocTxBuffer( TUint aLength ) +TDataBuffer* DEthernetFrameMemMngr::AllocTxBuffer( TUint /*aLength*/ ) { return NULL; } @@ -407,22 +413,16 @@ // --------------------------------------------------------------------------- // TBool DEthernetFrameMemMngr::AddTxFrame( - TDataBuffer* aPacketInUserSpace, - TDataBuffer*& aPacketInKernSpace, - TBool aUserDataTxEnabled ) + TDataBuffer* /*aPacketInUserSpace*/, + TDataBuffer*& /*aPacketInKernSpace*/, + TBool /*aUserDataTxEnabled*/ ) { - if ( IsMemInUse() ) - { - return (static_cast( - iFrameXferBlock))->AddTxFrame( - aPacketInUserSpace, - aPacketInKernSpace, - aUserDataTxEnabled ); - } - else - { - return EFalse; - } + // not suported in this default implementation +#ifndef NDEBUG + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + + return EFalse; } // --------------------------------------------------------------------------- @@ -430,18 +430,15 @@ // --------------------------------------------------------------------------- // TDataBuffer* DEthernetFrameMemMngr::GetTxFrame( - const TWhaTxQueueState& aTxQueueState, - TBool& aMore ) + const TWhaTxQueueState& /*aTxQueueState*/, + TBool& /*aMore*/ ) { - if ( IsMemInUse() && iFrameXferBlock ) - { - return (static_cast( - iFrameXferBlock))->GetTxFrame( aTxQueueState, aMore ); - } - else - { - return NULL; - } + // not suported in this default implementation +#ifndef NDEBUG + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + + return NULL; } // --------------------------------------------------------------------------- @@ -451,17 +448,24 @@ void DEthernetFrameMemMngr::FreeTxPacket( TDataBuffer*& /*aPacket*/ ) { // not suported in this default implementation +#ifndef NDEBUG os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif } // --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- // -TBool DEthernetFrameMemMngr::ResumeClientTx( TBool aUserDataTxEnabled ) const +TBool DEthernetFrameMemMngr::ResumeClientTx( + TBool /*aUserDataTxEnabled*/ ) const { - return (static_cast( - iFrameXferBlock))->ResumeClientTx( aUserDataTxEnabled ); + // not suported in this default implementation +#ifndef NDEBUG + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + + return EFalse; } // --------------------------------------------------------------------------- @@ -470,6 +474,10 @@ // TBool DEthernetFrameMemMngr::AllTxQueuesEmpty() const { - return (static_cast( - iFrameXferBlock))->AllTxQueuesEmpty(); + // not suported in this default implementation +#ifndef NDEBUG + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + + return EFalse; } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/FrameXferBlock.cpp --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/FrameXferBlock.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/FrameXferBlock.cpp Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 16 % +* %version: 17 % */ #include "WlLddWlanLddConfig.h" @@ -32,83 +32,12 @@ // void RFrameXferBlockBase::KeInitialize() { - iRxDataChunk = NULL; - - for ( TUint32 i = 0; i < KMaxCompletedRxBufs; ++i ) - { - iRxCompletedBuffers[i] = 0; - } + iThisAddrKernelSpace = reinterpret_cast(this); for ( TUint j = 0; j < TDataBuffer::KFrameTypeMax; ++j ) { iTxOffset[j] = 0; } - - iNumOfCompleted = 0; - iCurrentRxBuffer = 0; - iFirstRxBufferToFree = 0; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void RFrameXferBlockBase::KeRxComplete( - const TUint32* aRxCompletionBuffersArray, - TUint32 aNumOfCompleted ) - { - if ( aNumOfCompleted > KMaxCompletedRxBufs ) - { - os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - } - - assign( aRxCompletionBuffersArray, iRxCompletedBuffers, aNumOfCompleted ); - iNumOfCompleted = aNumOfCompleted; - iCurrentRxBuffer = 0; - iFirstRxBufferToFree = 0; - - for ( TUint i = 0; i < iNumOfCompleted; ++i ) - { - TraceDump( RX_FRAME, - (("WLANLDD: RFrameXferBlockBase::KeRxComplete: completed offset addr: 0x%08x"), - iRxCompletedBuffers[i]) ); - } - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void RFrameXferBlockBase::KeGetHandledRxBuffers( - const TUint32*& aRxHandledBuffersArray, - TUint32& aNumOfHandled ) - { - TUint32 numHandled ( iCurrentRxBuffer - iFirstRxBufferToFree ); - - // make sure that if an Rx buffer is currently being processed by the user - // side client, that buffer is not regarded as being already handled - numHandled = numHandled ? numHandled - 1 : numHandled; - - if ( numHandled ) - { - aRxHandledBuffersArray = &(iRxCompletedBuffers[iFirstRxBufferToFree]); - aNumOfHandled = numHandled; - - iFirstRxBufferToFree += numHandled; - } - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void RFrameXferBlockBase::KeAllUserSideRxBuffersFreed() - { - iFirstRxBufferToFree = 0; - // need to reset also the current index, so that the difference of these - // two indexes is zero, and it then correctly indicates, that there are no - // Rx buffers which could be freed incrementally - iCurrentRxBuffer = 0; } // --------------------------------------------------------------------------- @@ -133,17 +62,110 @@ } } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void RFrameXferBlock::Initialize( TUint32 aTxBufLength ) + { + // perform base class initialization first + KeInitialize(); + + iTxDataBuffer = NULL; + iTxBufLength = aTxBufLength; + + iRxQueueFront = NULL; + iRxQueueRear = NULL; + } + // ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- // -void RFrameXferBlockProtocolStack::Initialise() +void RFrameXferBlock::AddRxFrame( TDataBuffer* aFrame ) + { + if ( aFrame ) + { + aFrame->iNext = NULL; + + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlock::AddRxFrame: " + "add to queue metahdr addr: 0x%08x"), + aFrame)); + + if ( iRxQueueRear ) + { + iRxQueueRear->iNext = aFrame; + iRxQueueRear = aFrame; + } + else + { + iRxQueueFront = aFrame; + iRxQueueRear = aFrame; + } + } + } + +// ----------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// ----------------------------------------------------------------------------- +// +TDataBuffer* RFrameXferBlock::GetRxFrame() + { + TDataBuffer* aPacketInKernSpace( NULL ); + + if ( iRxQueueFront ) + { + aPacketInKernSpace = iRxQueueFront; + + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlock::GetRxFrame: " + "krn metahdr addr: 0x%08x"), + reinterpret_cast(aPacketInKernSpace))); + + iRxQueueFront = iRxQueueFront->iNext; + + if ( !iRxQueueFront ) + { + // the queue became empty + iRxQueueRear = NULL; + } + + return reinterpret_cast( + reinterpret_cast(aPacketInKernSpace) + - iUserToKernAddrOffset); + } + else + { + // the Rx queue is empty + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlock::GetRxFrame: " + "no frames available"))); + + // return NULL + return aPacketInKernSpace; + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool RFrameXferBlock::RxFrameAvailable() const + { + return reinterpret_cast( iRxQueueFront ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void RFrameXferBlockProtocolStack::Initialize() { // perform base class initialization KeInitialize(); - iThisAddrKernelSpace = reinterpret_cast(this); - iVoiceTxQueue.DoInit(); iVideoTxQueue.DoInit(); iBestEffortTxQueue.DoInit(); @@ -161,10 +183,23 @@ iFreeQueue.PutPacket( &iDataBuffers[i] ); } + + iVoiceRxQueueFront = NULL; + iVoiceRxQueueRear = NULL; + + iVideoRxQueueFront = NULL; + iVideoRxQueueRear = NULL; + + iBestEffortRxQueueFront = NULL; + iBestEffortRxQueueRear = NULL; + + iBackgroundRxQueueFront = NULL; + iBackgroundRxQueueRear = NULL; } // ----------------------------------------------------------------------------- -// +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode // ----------------------------------------------------------------------------- // TDataBuffer* RFrameXferBlockProtocolStack::AllocTxBuffer( @@ -209,7 +244,8 @@ } // ----------------------------------------------------------------------------- -// +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode // ----------------------------------------------------------------------------- // TBool RFrameXferBlockProtocolStack::AddTxFrame( @@ -219,6 +255,15 @@ { TBool ret( ETrue ); aPacketInKernSpace = NULL; + + if ( !aPacketInUserSpace ) + { +#ifndef NDEBUG + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + return ETrue; + } + TDataBuffer* metaHdrInKernSpace ( reinterpret_cast( reinterpret_cast(aPacketInUserSpace) + iUserToKernAddrOffset) ); @@ -455,6 +500,197 @@ // // ----------------------------------------------------------------------------- // +void RFrameXferBlockProtocolStack::AddRxFrame( TDataBuffer* aFrame ) + { + if ( !aFrame ) + { +#ifndef NDEBUG + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + return; + } + + aFrame->iNext = NULL; + + if ( aFrame->UserPriority() == 7 || aFrame->UserPriority() == 6 ) + { + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlockProtocolStack::AddRxFrame: " + "add to VO queue metahdr addr: 0x%08x"), + aFrame)); + + if ( iVoiceRxQueueRear ) + { + iVoiceRxQueueRear->iNext = aFrame; + iVoiceRxQueueRear = aFrame; + } + else + { + iVoiceRxQueueFront = aFrame; + iVoiceRxQueueRear = aFrame; + } + } + else if ( aFrame->UserPriority() == 5 || aFrame->UserPriority() == 4 ) + { + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlockProtocolStack::AddRxFrame: " + "add to VI queue metahdr addr: 0x%08x"), + aFrame)); + + if ( iVideoRxQueueRear ) + { + iVideoRxQueueRear->iNext = aFrame; + iVideoRxQueueRear = aFrame; + } + else + { + iVideoRxQueueFront = aFrame; + iVideoRxQueueRear = aFrame; + } + } + else if ( aFrame->UserPriority() == 2 || aFrame->UserPriority() == 1 ) + { + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlockProtocolStack::AddRxFrame: " + "add to BG queue metahdr addr: 0x%08x"), + aFrame)); + + if ( iBackgroundRxQueueRear ) + { + iBackgroundRxQueueRear->iNext = aFrame; + iBackgroundRxQueueRear = aFrame; + } + else + { + iBackgroundRxQueueFront = aFrame; + iBackgroundRxQueueRear = aFrame; + } + } + else + { + // user priority is 3 or 0 or invalid + + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlockProtocolStack::AddRxFrame: " + "add to BE queue metahdr addr: 0x%08x"), + aFrame)); + + if ( iBestEffortRxQueueRear ) + { + iBestEffortRxQueueRear->iNext = aFrame; + iBestEffortRxQueueRear = aFrame; + } + else + { + iBestEffortRxQueueFront = aFrame; + iBestEffortRxQueueRear = aFrame; + } + } + } + +// ----------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// ----------------------------------------------------------------------------- +// +TDataBuffer* RFrameXferBlockProtocolStack::GetRxFrame() + { + TDataBuffer* aPacketInKernSpace( NULL ); + + if ( iVoiceRxQueueFront ) + { + aPacketInKernSpace = iVoiceRxQueueFront; + + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlockProtocolStack::GetRxFrame: from VO " + "queue; krn metahdr addr: 0x%08x"), + reinterpret_cast(aPacketInKernSpace))); + + iVoiceRxQueueFront = iVoiceRxQueueFront->iNext; + + if ( !iVoiceRxQueueFront ) + { + // the queue became empty + iVoiceRxQueueRear = NULL; + } + } + else if ( iVideoRxQueueFront ) + { + aPacketInKernSpace = iVideoRxQueueFront; + + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlockProtocolStack::GetRxFrame: from VI " + "queue; krn metahdr addr: 0x%08x"), + reinterpret_cast(aPacketInKernSpace))); + + iVideoRxQueueFront = iVideoRxQueueFront->iNext; + + if ( !iVideoRxQueueFront ) + { + // the queue became empty + iVideoRxQueueRear = NULL; + } + } + else if ( iBestEffortRxQueueFront ) + { + aPacketInKernSpace = iBestEffortRxQueueFront; + + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlockProtocolStack::GetRxFrame: from BE " + "queue; krn metahdr addr: 0x%08x"), + reinterpret_cast(aPacketInKernSpace))); + + iBestEffortRxQueueFront = iBestEffortRxQueueFront->iNext; + + if ( !iBestEffortRxQueueFront ) + { + // the queue became empty + iBestEffortRxQueueRear = NULL; + } + } + else if ( iBackgroundRxQueueFront ) + { + aPacketInKernSpace = iBackgroundRxQueueFront; + + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlockProtocolStack::GetRxFrame: from BG " + "queue; krn metahdr addr: 0x%08x"), + reinterpret_cast(aPacketInKernSpace))); + + iBackgroundRxQueueFront = iBackgroundRxQueueFront->iNext; + + if ( !iBackgroundRxQueueFront ) + { + // the queue became empty + iBackgroundRxQueueRear = NULL; + } + } + else + { + // all Rx queues are empty; no action + } + + if ( aPacketInKernSpace ) + { + return reinterpret_cast( + reinterpret_cast(aPacketInKernSpace) + - iUserToKernAddrOffset); + } + else + { + TraceDump( RX_FRAME, + (("WLANLDD: RFrameXferBlockProtocolStack::GetRxFrame: " + "no frames available"))); + + // return NULL + return aPacketInKernSpace; + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// TBool RFrameXferBlockProtocolStack::TxPossible( const TWhaTxQueueState& aWhaTxQueueState, TQueueId& aQueueId ) diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/MgmtFrameMemMngr.cpp --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/MgmtFrameMemMngr.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/MgmtFrameMemMngr.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 20 % +* %version: 21 % */ #include "WlLddWlanLddConfig.h" @@ -226,6 +226,8 @@ + KMgmtSideTxBufferLength + KProtocolStackSideTxDataChunkSize ); + iFrameXferBlockBase = iFrameXferBlock; + TraceDump( INIT_LEVEL, (("WLANLDD: MgmtFrameMemMngr::DoOpenHandle: Engine RFrameXferBlock addr: 0x%08x"), reinterpret_cast(iFrameXferBlock) ) ); @@ -275,55 +277,6 @@ TraceDump( RX_FRAME, ("WLANLDD: MgmtFrameMemMngr::DoGetNextFreeRxBuffer") ); - // if there are any Rx buffers which have been handled and - // can already be re-used, free them first - - const TUint32* rxHandledBuffersArray ( NULL ); - TUint32 numOfHandled ( 0 ); - - iFrameXferBlock->KeGetHandledRxBuffers( - rxHandledBuffersArray, - numOfHandled ); - - if ( numOfHandled ) - { - // there are buffers which can be freed, so free them - for ( TUint i = 0; i < numOfHandled; ++i ) - { - // first free the actual Rx frame buffer - - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoGetNextFreeRxBuffer: free Rx buf at addr: 0x%08x"), - reinterpret_cast(reinterpret_cast( - iRxDataChunk - + rxHandledBuffersArray[i])->KeGetBufferStart()) ) ); - - iRxFrameMemoryPool->Free( - reinterpret_cast( - iRxDataChunk + rxHandledBuffersArray[i])->KeGetBufferStart() - // take into account the alignment padding - - iRxBufAlignmentPadding ); - - // then free the Rx frame meta header - - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoGetNextFreeRxBuffer: free Rx meta header at addr: 0x%08x"), - reinterpret_cast( iRxDataChunk + rxHandledBuffersArray[i])) ); - - iRxFrameMemoryPool->Free( iRxDataChunk + rxHandledBuffersArray[i] ); - } - - // remove the buffers we freed above from the completed buffers of this - // object so that they are not tried to be freed again once the Mgmt - // Client issues the next Rx request - - iCountCompleted -= numOfHandled; - assign( - iCompletedBuffers + numOfHandled, - iCompletedBuffers, - iCountCompleted ); - } - // reserve a new Rx buffer. TUint8* buffer ( NULL ); @@ -366,131 +319,33 @@ // --------------------------------------------------------------------------- // TBool MgmtFrameMemMngr::DoEthernetFrameRxComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ) { TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: aNumOfBuffers: %d"), + (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: " + "aNumOfBuffers: %d"), aNumOfBuffers) ); - if ( aNumOfBuffers + iCountTobeCompleted > KMaxToBeCompletedRxBufs ) - { - // too little space reserved for Rx buffer handles - os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - } - TBool ret( EFalse ); - - if ( iReadStatus == EPending ) - { - // read pending - if ( !iCountTobeCompleted ) - { - // no existing Rx buffers to complete in queue - // we may complete these ones on the fly - - // note the completed Rx buffers first so that we can change - // their addresses to offsets - assign( - reinterpret_cast(&aBufferStart), - iCompletedBuffers, - aNumOfBuffers ); - - // update the new Rx buffer start addresses added above to be - // offsets from the Rx memory pool beginning - for( TUint i = 0; i < aNumOfBuffers; ++i ) - { - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: supplied Rx buf addr: 0x%08x"), - iCompletedBuffers[i]) ); - - iCompletedBuffers[i] - -= reinterpret_cast(iRxDataChunk); - - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: Rx buf offset addr: 0x%08x"), - iCompletedBuffers[i]) ); - } - - iCountCompleted = aNumOfBuffers; - - iFrameXferBlock->KeRxComplete( iCompletedBuffers, iCountCompleted); - } - else - { - // existing rx buffers to complete in queue. - // We must append these at the rear and after that - // complete the existing read request - assign( - reinterpret_cast(&aBufferStart), - iTobeCompletedBuffers + iCountTobeCompleted, - aNumOfBuffers ); + TDataBuffer** metaHdrPtrArray(&aBufferStart); - // update the new Rx buffer start addresses added above to be - // offsets from the Rx memory pool beginning - for( TUint i = 0; i < aNumOfBuffers; ++i ) + if ( iFrameXferBlock ) + { + for ( TUint i = 0; i < aNumOfBuffers; ++i ) + { + if ( metaHdrPtrArray[i] ) { - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: supplied Rx buf addr: 0x%08x"), - iTobeCompletedBuffers[iCountTobeCompleted + i]) ); - - iTobeCompletedBuffers[iCountTobeCompleted + i] - -= reinterpret_cast(iRxDataChunk); - - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: Rx buf offset addr: 0x%08x"), - iTobeCompletedBuffers[iCountTobeCompleted + i]) ); + iFrameXferBlock->AddRxFrame( metaHdrPtrArray[i] ); } - - iCountCompleted = iCountTobeCompleted + aNumOfBuffers; - - iFrameXferBlock->KeRxComplete( - iTobeCompletedBuffers, - iCountCompleted ); - - // note the completed Rx buffers - assign( iTobeCompletedBuffers, iCompletedBuffers, iCountCompleted ); - iCountTobeCompleted = 0; - } - - ret = ETrue; - } - else - { - // no read pending - // append at the rear - assign( - reinterpret_cast(&aBufferStart), - iTobeCompletedBuffers + iCountTobeCompleted, - aNumOfBuffers ); - - // update the new Rx buffer start addresses added above to be - // offsets from the Rx memory pool beginning - for( TUint i = 0; i < aNumOfBuffers; ++i ) - { - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: supplied Rx buf addr: 0x%08x"), - iTobeCompletedBuffers[iCountTobeCompleted + i]) ); - - iTobeCompletedBuffers[iCountTobeCompleted + i] - -= reinterpret_cast(iRxDataChunk); - - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: Rx buf offset addr: 0x%08x"), - iTobeCompletedBuffers[iCountTobeCompleted + i]) ); } - iCountTobeCompleted += aNumOfBuffers; + if ( iReadStatus == EPending ) + { + ret = ETrue; + } } - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: end: iCountCompleted: %d"), - iCountCompleted) ); - - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: end: iCountTobeCompleted: %d"), - iCountTobeCompleted) ); - return ret; } @@ -498,72 +353,13 @@ // // --------------------------------------------------------------------------- // -TUint32* MgmtFrameMemMngr::DoGetTobeCompletedBuffersStart() - { - return iTobeCompletedBuffers; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -TUint32* MgmtFrameMemMngr::DoGetCompletedBuffersStart() - { - return iCompletedBuffers; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void MgmtFrameMemMngr::DoFreeRxBuffers() - { - if ( IsMemInUse() ) - { - for ( TUint i = 0; i < iCountCompleted; ++i ) - { - TDataBuffer* metaHdr ( reinterpret_cast( - iRxDataChunk + iCompletedBuffers[i]) ); - - // first free the actual Rx frame buffer - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoFreeRxBuffers: free Rx buf at addr: 0x%08x"), - reinterpret_cast(metaHdr->KeGetBufferStart()) ) ); - - iRxFrameMemoryPool->Free( - metaHdr->KeGetBufferStart() - // take into account the alignment padding - - iRxBufAlignmentPadding ); - - // free the Rx frame meta header - - TraceDump( RX_FRAME, - (("WLANLDD: MgmtFrameMemMngr::DoFreeRxBuffers: free Rx meta header at addr: 0x%08x"), - reinterpret_cast(metaHdr)) ); - - iRxFrameMemoryPool->Free( metaHdr ); - } - } - else - { - // the whole Rx memory pool has already been deallocated, so nothing - // is done in this case - TraceDump( RX_FRAME, - ("WLANLDD: MgmtFrameMemMngr::DoFreeRxBuffers: Rx memory pool already deallocated; no action needed") ); - } - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// void MgmtFrameMemMngr::DoMarkRxBufFree( TUint8* aBufferToFree ) { TraceDump( RX_FRAME, (("WLANLDD: MgmtFrameMemMngr::DoMarkRxBufFree: free Rx buf at addr: 0x%08x"), reinterpret_cast(aBufferToFree) ) ); - if ( IsMemInUse() ) + if ( IsMemInUse() && iRxFrameMemoryPool ) { iRxFrameMemoryPool->Free( aBufferToFree @@ -575,25 +371,117 @@ // the whole Rx memory pool - including aBufferToFree - has already // been deallocated, so nothing is done in this case TraceDump( RX_FRAME, - ("WLANLDD: MgmtFrameMemMngr::DoMarkRxBufFree: Rx memory pool already deallocated; no action needed") ); + ("WLANLDD: MgmtFrameMemMngr::DoMarkRxBufFree: Rx memory pool already " + "deallocated; no action needed") ); } } // --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool MgmtFrameMemMngr::OnReadRequest() + { + TBool ret( EFalse ); + + if ( IsMemInUse() && iFrameXferBlock ) + { + if ( iFrameXferBlock->RxFrameAvailable() ) + { + // there are Rx frames ready for the user mode client retrieval + ret = ETrue; + + // the frame Rx request won't be left pending as the callee will + // complete it + iReadStatus = ENotPending; + } + else + { + // there are no Rx frames ready for the user mode client retrieval + // the Rx request is left pending + iReadStatus = EPending; + } + } +#ifndef NDEBUG + else + { + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } +#endif + + TraceDump( RX_FRAME, + (("WLANLDD: MgmtFrameMemMngr::OnReadRequest: ret (bool): %d"), + ret) ); + + return ret; + } + +// --------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// --------------------------------------------------------------------------- +// +TDataBuffer* MgmtFrameMemMngr::GetRxFrame( + TDataBuffer* aFrameToFreeInUserSpace ) + { + TDataBuffer* rxFrame( NULL ); + + if ( IsMemInUse() && iFrameXferBlock ) + { + if ( aFrameToFreeInUserSpace ) + { + FreeRxPacket( aFrameToFreeInUserSpace ); + } + + rxFrame = iFrameXferBlock->GetRxFrame(); + } + + return rxFrame; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TDataBuffer* MgmtFrameMemMngr::OnWriteEthernetFrame() const + { + if ( iTxDataBuffer && + ( iTxDataBuffer->GetLength() >= sizeof( SEthernetHeader ) ) ) + { + return iTxDataBuffer; + } + else + { +#ifndef NDEBUG + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + return NULL; + } + } + +// --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- // TInt MgmtFrameMemMngr::RxBufAlignmentPadding() const { - const TInt KMemMgrHdrLen = iRxFrameMemoryPool->HeaderSize(); - const TInt KRemainder ( KMemMgrHdrLen % iRxFrameBufAllocationUnit ); - TInt padding = KRemainder ? - ( iRxFrameBufAllocationUnit - KRemainder ) : KRemainder; + if ( iRxFrameMemoryPool ) + { + const TInt KMemMgrHdrLen = iRxFrameMemoryPool->HeaderSize(); + const TInt KRemainder ( KMemMgrHdrLen % iRxFrameBufAllocationUnit ); + TInt padding = KRemainder ? + ( iRxFrameBufAllocationUnit - KRemainder ) : KRemainder; + + TraceDump(INIT_LEVEL, (("WLANLDD: MgmtFrameMemMngr::RxBufAlignmentPadding: %d"), + padding)); - TraceDump(INIT_LEVEL, (("WLANLDD: MgmtFrameMemMngr::RxBufAlignmentPadding: %d"), - padding)); - - return padding; + return padding; + } + else + { + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + return 0; + } } // --------------------------------------------------------------------------- @@ -634,5 +522,5 @@ Kern::ChunkClose( iParent.SharedMemoryChunk() ); iParent.SharedMemoryChunk() = NULL; MarkMemFree(); - } + } } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WLanLogicalDevice.cpp --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WLanLogicalDevice.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WLanLogicalDevice.cpp Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 18 % +* %version: 19 % */ #include "WlLddWlanLddConfig.h" @@ -44,7 +44,7 @@ #else DWlanLogicalDevice* logicalDevice( new DWlanLogicalDevice ); - if ( !(logicalDevice->IsValid()) ) + if ( logicalDevice && !(logicalDevice->IsValid()) ) { // something went wrong delete logicalDevice; diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WlanLogicalChannel.cpp --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WlanLogicalChannel.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WlanLogicalChannel.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 59 % +* %version: 60 % */ #include "WlLddWlanLddConfig.h" @@ -41,7 +41,8 @@ const TUint32 KDmaTxMemSize = 4096; // equals to 1 MMU page on most systems // --------------------------------------------------------------------------- -// +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode // --------------------------------------------------------------------------- // #ifndef RD_WLAN_DDK @@ -271,6 +272,9 @@ } // --------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// // If an error occurs in this method, we set iPdd to NULL to prevent // PDD object destruction in base class (DLogicalChannelBase) destructor. // DLogicalChannelBase destructor gets called as this logical channel instance @@ -606,10 +610,11 @@ // --------------------------------------------------------------------------- -// +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode // --------------------------------------------------------------------------- // -TAny* DWlanLogicalChannel::DoControlFast( TInt aFunction, TAny* param ) +TAny* DWlanLogicalChannel::DoControlFast( TInt aFunction, TAny* aParam ) { TAny* ret( NULL ); TBool triggerTx ( EFalse ); @@ -621,9 +626,6 @@ iClient)); TraceDump(WLM_CMD_DETAILS, (("WLANLDD: function: 0x%x"), aFunction)); - // Note! We are executing in the context of the client's thread, but - // in supervisor mode - // acquire mutex // Enter critical section before requesting the mutex as // we are executing in the context of a user mode thread @@ -638,70 +640,24 @@ TraceDump(MUTEX, (("WLANLDD: DWlanLogicalChannel::DoControlFast: mutex acquired"))); - switch ( aFunction ) + if ( iUnit == KUnitWlan ) + { + ret = OnMgmtSideControlFast( aFunction, aParam ); + } + else if ( iUnit == KUnitEthernet ) { - case RPcmNetCardIf::EControlFastAllocTxBuffer: - ret = iEthernetFrameMemMngr->AllocTxBuffer( - reinterpret_cast(param) ); - - if ( !ret && iAddTxFrameAllowed ) - { - iAddTxFrameAllowed = EFalse; - - TraceDump( NWSA_TX, - ("WLANLDD: DWlanLogicalChannel::DoControlFast: stop flow from protocol stack") ); - } - break; - - case RPcmNetCardIf::EControlFastAddTxFrame: - { -#ifndef NDEBUG - if ( !iAddTxFrameAllowed ) - { - TraceDump(ERROR_LEVEL, - ("WLANLDD: DWlanLogicalChannel::DoControlFast: WARNING: AddTxFrame req. when flow ctrl is on")); - } + ret = OnEthernetSideControlFast( aFunction, aParam, triggerTx ); + } + else + { + // unknown unit +#ifndef NDEBUG + TraceDump(ERROR_LEVEL, + ("WLANLDD: DWlanLogicalChannel::DoControlFast: unknown unit")); + TraceDump(ERROR_LEVEL, (("WLANLDD: aFunction: %d"), aFunction)); + TraceDump(ERROR_LEVEL, (("WLANLDD: unit: %d"), iUnit)); + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); #endif - if ( iEthernetFrameMemMngr->AllTxQueuesEmpty() ) - { - triggerTx = ETrue; - } - - TDataBuffer* discardFrame ( NULL ); - - ret = reinterpret_cast(iEthernetFrameMemMngr->AddTxFrame( - reinterpret_cast(param), - discardFrame, - iUmac.UserDataTxEnabled() )); - - if ( discardFrame ) - { - TraceDump( NWSA_TX_DETAILS, - (("WLANLDD: DWlanLogicalChannel::DoControlFast: have to drop tx frame of UP: %d"), - reinterpret_cast(param)->UserPriority()) ); - - iEthernetFrameMemMngr->FreeTxPacket( discardFrame ); - } - - if ( !ret ) - { - iAddTxFrameAllowed = EFalse; - - TraceDump( NWSA_TX, - ("WLANLDD: DWlanLogicalChannel::DoControlFast: stop flow from protocol stack") ); - } - break; - } - default: -#ifndef NDEBUG - TraceDump(ERROR_LEVEL, (("WLANLDD: unknown request: %d"), - aFunction)); - os_assert( - (TUint8*)("WLANLDD: panic"), - (TUint8*)(WLAN_FILE), - __LINE__ ); -#endif - break; } // release mutex @@ -728,7 +684,7 @@ // the lower priority thread will get paused and the higher priority // thread will get scheduled (to execute the DFC), we don't want the // higher priority thread to need to wait for the mutex. So we - // released the mutex first in this code block and after that enque + // released the mutex first in this code block and after that enqueue // the DFC request. if ( !( iFlags & KTxTriggerArmed ) ) { @@ -741,6 +697,162 @@ } // --------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// --------------------------------------------------------------------------- +// +TAny* DWlanLogicalChannel::OnMgmtSideControlFast( + TInt aFunction, + TAny* aParam ) + { + TAny* ret( NULL ); + + switch ( aFunction ) + { + // ========================================================== + // Get Rx frame + // ========================================================== + case RWlanLogicalChannel::EWlanControlFastGetRxFrame: + if ( iEthernetFrameMemMngr ) + { + ret = iEthernetFrameMemMngr->GetRxFrame( + reinterpret_cast(aParam) ); + } + break; + // ========================================================== + // Unknown request + // ========================================================== + default: +#ifndef NDEBUG + TraceDump(ERROR_LEVEL, (("WLANLDD: unknown request: %d"), + aFunction)); + os_assert( + (TUint8*)("WLANLDD: panic"), + (TUint8*)(WLAN_FILE), + __LINE__ ); +#endif + break; + } + + return ret; + } + +// --------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// --------------------------------------------------------------------------- +// +TAny* DWlanLogicalChannel::OnEthernetSideControlFast( + TInt aFunction, + TAny* aParam, + TBool& aTriggerTx ) + { + TAny* ret( NULL ); + aTriggerTx = EFalse; + + switch ( aFunction ) + { + // ========================================================== + // Alloc Tx buffer + // ========================================================== + case RPcmNetCardIf::EControlFastAllocTxBuffer: + if ( iEthernetFrameMemMngr ) + { + ret = iEthernetFrameMemMngr->AllocTxBuffer( + reinterpret_cast(aParam) ); + } + + if ( !ret && iAddTxFrameAllowed ) + { + iAddTxFrameAllowed = EFalse; + + TraceDump( NWSA_TX, + ("WLANLDD: DWlanLogicalChannel::OnEthernetSideControlFast: " + "stop flow from protocol stack") ); + } + break; + // ========================================================== + // Add Tx frame + // ========================================================== + case RPcmNetCardIf::EControlFastAddTxFrame: + { +#ifndef NDEBUG + if ( !iAddTxFrameAllowed ) + { + TraceDump(ERROR_LEVEL, + ("WLANLDD: DWlanLogicalChannel::OnEthernetSideControlFast: " + "WARNING: AddTxFrame req. when flow ctrl is on")); + } +#endif + if ( iEthernetFrameMemMngr && aParam ) + { + if ( iEthernetFrameMemMngr->AllTxQueuesEmpty() ) + { + aTriggerTx = ETrue; + } + + TDataBuffer* discardFrame ( NULL ); + + ret = reinterpret_cast( + iEthernetFrameMemMngr->AddTxFrame( + reinterpret_cast(aParam), + discardFrame, + iUmac.UserDataTxEnabled() )); + + if ( discardFrame ) + { + TraceDump( NWSA_TX_DETAILS, + (("WLANLDD: DWlanLogicalChannel::OnEthernetSideControlFast: " + "have to drop tx frame of UP: %d"), + reinterpret_cast( + aParam)->UserPriority()) ); + + iEthernetFrameMemMngr->FreeTxPacket( discardFrame ); + aTriggerTx = EFalse; + } + } + + if ( !ret ) + { + iAddTxFrameAllowed = EFalse; + + TraceDump( NWSA_TX, + ("WLANLDD: DWlanLogicalChannel::OnEthernetSideControlFast: " + "stop flow from protocol stack") ); + } + break; + } + // ========================================================== + // Get Rx frame + // ========================================================== + case RPcmNetCardIf::EControlFastGetRxFrame: + { + if ( iEthernetFrameMemMngr ) + { + ret = iEthernetFrameMemMngr->GetRxFrame( + reinterpret_cast(aParam) ); + } + } + break; + // ========================================================== + // Unknown request + // ========================================================== + default: +#ifndef NDEBUG + TraceDump(ERROR_LEVEL, (("WLANLDD: unknown request: %d"), + aFunction)); + os_assert( + (TUint8*)("WLANLDD: panic"), + (TUint8*)(WLAN_FILE), + __LINE__ ); +#endif + break; + } // switch + + return ret; + } + +// --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- // @@ -748,7 +860,7 @@ { if ( iUnit == KUnitWlan ) { - if ( aMask & ( 1 << EWlanRequestNotify ) ) + if ( aMask & ( 1 << RWlanLogicalChannel::EWlanRequestNotify ) ) { TraceDump(INFO_LEVEL, ("WLANLDD: DWlanLogicalChannel::DoCancel: mgmt side notify cancel")); @@ -758,7 +870,7 @@ iClient, iWlanRequestNotifyStatus, KErrServerTerminated ); iWlanRequestNotifyStatus = NULL; } - else if ( aMask & ( 1 << EWlanRequestFrame ) ) + else if ( aMask & ( 1 << RWlanLogicalChannel::EWlanRequestFrame ) ) { TraceDump(INFO_LEVEL, ("WLANLDD: DWlanLogicalChannel::DoCancel: mgmt side frame read cancel")); @@ -770,7 +882,8 @@ else { TraceDump(ERROR_LEVEL, - (("WLANLDD: DWlanLogicalChannel::DoCancel: mgmt side unhandled mask panic: 0x%08x"), + (("WLANLDD: DWlanLogicalChannel::DoCancel: mgmt side " + "unhandled mask panic: 0x%08x"), aMask)); os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); } @@ -798,7 +911,8 @@ else { TraceDump(ERROR_LEVEL, - (("WLANLDD: DWlanLogicalChannel::DoCancel: user side unhandled mask panic: 0x%08x"), + (("WLANLDD: DWlanLogicalChannel::DoCancel: user side " + "unhandled mask panic: 0x%08x"), aMask)); os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); } @@ -816,11 +930,13 @@ // --------------------------------------------------------------------------- // TBool DWlanLogicalChannel::ProtocolStackDataReceiveComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ) { - if ( iEthernetFrameMemMngr->OnEthernetFrameRxComplete( aBufferStart, - aNumOfBuffers ) ) + if ( iEthernetFrameMemMngr && + iEthernetFrameMemMngr->OnEthernetFrameRxComplete( + aBufferStart, + aNumOfBuffers ) ) { Kern::RequestComplete( iClient, iEthernetReceiveFrameStatus, KErrNone ); iEthernetReceiveFrameStatus = NULL; @@ -903,13 +1019,17 @@ TraceDump(UMAC_PROTO_CALLBACK, (("WLANLDD: aCompletionCode: %d"), aCompletionCode)); - iEthernetFrameMemMngr->FreeTxPacket( aMetaHeader ); + if ( iEthernetFrameMemMngr ) + { + iEthernetFrameMemMngr->FreeTxPacket( aMetaHeader ); + } TxProtocolStackData(); if ( !iAddTxFrameAllowed ) { - if ( iResumeTxStatus && + if ( iResumeTxStatus && + iEthernetFrameMemMngr && iEthernetFrameMemMngr->ResumeClientTx( iUmac.UserDataTxEnabled() ) ) { @@ -980,18 +1100,24 @@ // void DWlanLogicalChannel::TxManagementData() { - TDataBuffer* buffer = iEthernetFrameMemMngr->OnWriteEthernetFrame(); - - if ( !buffer ) + TDataBuffer* buffer( NULL ); + + if ( iEthernetFrameMemMngr ) { - TraceDump(ERROR_LEVEL, - ("WLANLDD: DWlanLogicalChannel::TxManagementData: " - "panic, no buffer")); - os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + buffer = iEthernetFrameMemMngr->OnWriteEthernetFrame(); + } + + if ( buffer ) + { + iUmac.WriteMgmtFrame( *buffer ); } else { - iUmac.WriteMgmtFrame( *buffer ); +#ifndef NDEBUG + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + Kern::RequestComplete( + iClient, iWlanSendFrameStatus, KErrGeneral ); } } @@ -1001,7 +1127,7 @@ // void DWlanLogicalChannel::TxProtocolStackData() { -#ifndef NDEBUG +#ifndef NDEBUG TUint packetsSubmitted ( 0 ); #endif @@ -1049,7 +1175,13 @@ // TBool DWlanLogicalChannel::OnReadEthernetFrameRequest() { - const TBool ret = iEthernetFrameMemMngr->OnReadRequest(); + TBool ret( EFalse ); + + if ( iEthernetFrameMemMngr ) + { + ret = iEthernetFrameMemMngr->OnReadRequest(); + } + return ret; } @@ -1451,17 +1583,17 @@ switch ( aReqNo ) { - case EWlanInitSystem: + case RWlanLogicalChannel::EWlanInitSystem: // bootup the chip and the system iWlanGeneralRequestStatus = aStatus; InitSystem( a1, sizeof(TOpenParam) ); break; - case EWlanFinitSystem: + case RWlanLogicalChannel::EWlanFinitSystem: // power down the chip and the system iWlanGeneralRequestStatus = aStatus; FinitSystem(); break; - case EWlanCommand: + case RWlanLogicalChannel::EWlanCommand: // management command iWlanGeneralRequestStatus = aStatus; @@ -1502,13 +1634,13 @@ output_buffer.iData, output_buffer.iLen ); break; - case EWlanRequestNotify: + case RWlanLogicalChannel::EWlanRequestNotify: // store the USER mode indication address; iIndicationBuffer = static_cast(a1); iWlanRequestNotifyStatus = aStatus; IndicationRequest( static_cast(a1) ); break; - case EWlanRequestFrame: + case RWlanLogicalChannel::EWlanRequestFrame: if ( OnReadEthernetFrameRequest() ) { // rx data to be completed exists @@ -1525,7 +1657,7 @@ iWlanReceiveFrameStatus = aStatus; } break; - case EWlanRequestSend: + case RWlanLogicalChannel::EWlanRequestSend: iWlanSendFrameStatus = aStatus; TxManagementData(); @@ -1728,7 +1860,7 @@ TAny* /*a2*/ ) { TInt ret( KErrNone ); - if ( aFunction == EWlanSvControlInitBuffers ) + if ( aFunction == RWlanLogicalChannel::EWlanSvControlInitBuffers ) { // initiliaze buffers for wlan mgmt client data xfer if ( a1 ) @@ -1749,7 +1881,7 @@ os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); } } - else if ( aFunction == EWlanSvControlFreeBuffers ) + else if ( aFunction == RWlanLogicalChannel::EWlanSvControlFreeBuffers ) { // free wlan mgmt client data xfer buffers OnReleaseEthernetFrameBuffers(); @@ -1891,13 +2023,16 @@ if ( iEthernetFrameMemMngr ) { TraceDump(NWSA_TX_DETAILS, - (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: aEthernetFrameTxOffset: %d"), + (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: " + "aEthernetFrameTxOffset: %d"), aEthernetFrameTxOffset )); TraceDump(NWSA_TX_DETAILS, - (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: aDot11FrameTxOffset: %d"), + (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: " + "aDot11FrameTxOffset: %d"), aDot11FrameTxOffset )); TraceDump(NWSA_TX_DETAILS, - (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: aSnapFrameTxOffset: %d"), + (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: " + "aSnapFrameTxOffset: %d"), aSnapFrameTxOffset )); iEthernetFrameMemMngr->SetTxOffsets( @@ -1934,12 +2069,13 @@ // --------------------------------------------------------------------------- // void DWlanLogicalChannel::MgmtDataReceiveComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ) { - if ( iEthernetFrameMemMngr->OnEthernetFrameRxComplete( - aBufferStart, - aNumOfBuffers ) ) + if ( iEthernetFrameMemMngr && + ( iEthernetFrameMemMngr->OnEthernetFrameRxComplete( + aBufferStart, + aNumOfBuffers ) ) ) { Kern::RequestComplete( iClient, iWlanReceiveFrameStatus, KErrNone ); iWlanReceiveFrameStatus = NULL; @@ -2174,23 +2310,32 @@ void DWlanLogicalChannel::ReleaseIndicationListEntry( TIndicationListEntry* aEntry ) { - aEntry->next = NULL; - - if ( !iFreeIndicationListHead ) + if ( aEntry ) { - iFreeIndicationListHead = aEntry; + aEntry->next = NULL; + + if ( !iFreeIndicationListHead ) + { + iFreeIndicationListHead = aEntry; + } + else + { + TIndicationListEntry* tmp = iFreeIndicationListHead; + + while ( tmp->next ) + { + tmp = tmp->next; + } + + tmp->next = aEntry; + } } +#ifndef NDEBUG else { - TIndicationListEntry* tmp = iFreeIndicationListHead; - - while ( tmp->next ) - { - tmp = tmp->next; - } - - tmp->next = aEntry; + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); } +#endif } // --------------------------------------------------------------------------- diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/wllddlogicalchannelbase.cpp --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/wllddlogicalchannelbase.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/wllddlogicalchannelbase.cpp Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 2 % +* %version: 3 % */ #include "WlLddWlanLddConfig.h" @@ -41,7 +41,8 @@ } // --------------------------------------------------------------------------- -// +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode // --------------------------------------------------------------------------- // TInt DWlanLogicalChannelBase::Request( TInt aReqNo, TAny* a1, TAny* a2 ) diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlannwif/etherpkt/CardDll.cpp --- a/wlan_bearer/wlannwif/etherpkt/CardDll.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlannwif/etherpkt/CardDll.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 12 % +* %version: 13 % */ #include @@ -82,7 +82,7 @@ User::LeaveIfError( iCard.Open() ); - User::LeaveIfError( iCard.InitialiseBuffers( iFrameXferBlock ) ); + User::LeaveIfError( iCard.InitialiseBuffers() ); } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlannwif/etherpkt/receiver_hw.cpp --- a/wlan_bearer/wlannwif/etherpkt/receiver_hw.cpp Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlannwif/etherpkt/receiver_hw.cpp Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 12 % +* %version: 13 % */ #include @@ -31,7 +31,8 @@ // CReceiver::CReceiver( CPcCardPktDrv* aParent ) : CActive(EPriorityStandard), - iParent(aParent) + iParent(aParent), + iFrameToFree( NULL ) { } @@ -67,6 +68,7 @@ { DEBUG("CReceiver::~CReceiver()"); Cancel(); + iFrameToFree = NULL; } // --------------------------------------------------------- @@ -98,7 +100,11 @@ { DEBUG("CReceiver::RunL()" ); - while( iParent->iFrameXferBlock->GetNextRxDataBuffer( iDataBuffer ) ) + TUint rxCount( 0 ); + const TUint KMaxRxCount( 4 ); + + while( ( rxCount < KMaxRxCount ) && + ( iDataBuffer = iParent->iCard.GetRxFrame( iFrameToFree ) ) != NULL ) { TUint8* buf = iDataBuffer->GetBuffer(); TUint32 len = iDataBuffer->GetLength(); @@ -126,10 +132,27 @@ iParent->iParent->Process( pFrame, bufOrig, iDataBuffer->UserPriority() ); } } + + iFrameToFree = iDataBuffer; + ++rxCount; + DEBUG1("CReceiver::RunL() - %u packet(s) processed", rxCount ); } - if( iParent->CardOpen() ) + if ( rxCount == KMaxRxCount ) { - QueueRead(); + DEBUG("CReceiver::RunL() - yield"); + + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + } + else + { + iFrameToFree = NULL; + + if( iParent->CardOpen() ) + { + QueueRead(); + } } } diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlannwif/inc/carddrv.h --- a/wlan_bearer/wlannwif/inc/carddrv.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlannwif/inc/carddrv.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 9 % +* %version: 10 % */ #ifndef __CARDDRV_H__ @@ -139,9 +139,6 @@ CReceiver* iReceiver; /** */ RPcmNetCardIf iCard; - - /** */ - RFrameXferBlockProtocolStack* iFrameXferBlock; }; diff -r 629e60dfa279 -r c6a1762761b8 wlan_bearer/wlannwif/inc/receiver_hw.h --- a/wlan_bearer/wlannwif/inc/receiver_hw.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_bearer/wlannwif/inc/receiver_hw.h Thu May 27 14:33:33 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 7 % +* %version: 8 % */ #ifndef _RECEIVER_HW_H_ @@ -82,6 +82,9 @@ /** */ TDataBuffer* iDataBuffer; + /** Rx frame to free */ + TDataBuffer* iFrameToFree; + }; #endif //_RECEIVER_HW_H_ diff -r 629e60dfa279 -r c6a1762761b8 wlan_plat/wlan_info_api/inc/wlaninternalpskeys.h --- a/wlan_plat/wlan_info_api/inc/wlaninternalpskeys.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_plat/wlan_info_api/inc/wlaninternalpskeys.h Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -18,7 +18,7 @@ */ /* -* %version: 7 % +* %version: 8 % */ #ifndef WLANINTERNALPSKEYS_H diff -r 629e60dfa279 -r c6a1762761b8 wlan_plat/wlan_management_api/inc/wlanerrorcodes.h --- a/wlan_plat/wlan_management_api/inc/wlanerrorcodes.h Fri May 14 17:41:09 2010 +0300 +++ b/wlan_plat/wlan_management_api/inc/wlanerrorcodes.h Thu May 27 14:33:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -16,7 +16,7 @@ */ /* -* %version: 6 % +* %version: 7 % */ #ifndef WLANERRORCODES_H