wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WLanLogicalDevice.cpp
changeset 0 c40eb8fe8501
child 17 a828660c511c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WLanLogicalDevice.cpp	Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,321 @@
+/*
+* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Implementation of the DWlanLogicalDevice class.
+*
+*/
+
+/*
+* %version: 18 %
+*/
+
+#include "WlLddWlanLddConfig.h"
+#include "WlanLogicalDevice.h"
+#include "WlanLogicalChannel.h"
+#include "wlanlddcommon.h"
+#include "osachunk.h"
+#include <kern_priv.h>
+
+const TUint KWlanParseMask = KDeviceAllowUnit | KDeviceAllowPhysicalDevice;
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+DECLARE_STANDARD_LDD()
+    {
+    TraceDump(INIT_LEVEL, ("WLANLDD: allocate logical device object"));    
+
+    // alloc the device
+
+#ifndef RD_WLAN_DDK
+    return new DWlanLogicalDevice;
+    
+#else        
+    DWlanLogicalDevice* logicalDevice( new DWlanLogicalDevice );
+
+    if ( !(logicalDevice->IsValid()) )
+        {
+        // something went wrong
+        delete logicalDevice;
+        logicalDevice = NULL;
+        }
+
+    return logicalDevice;
+#endif
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+DWlanLogicalDevice::DWlanLogicalDevice()
+    :
+    iDfcQ( NULL ),
+#ifndef RD_WLAN_DDK
+    iMutex( NULL ),
+#else
+    iOsa( NULL ),    
+#endif    
+    iUseCachedMemory( EFalse ),
+	iRxFrameMemoryPool( NULL ),
+	iRxBufAlignmentPadding( 0 )
+	{
+    TraceDump(INIT_LEVEL, (("WLANLDD: DWlanLogicalDevice Ctor: 0x%08x"), this));
+
+	iParseMask = KWlanParseMask;
+    iUnitsMask = KWlanUnitsAllowedMask;
+
+    TraceDump(INIT_LEVEL, (("iUnitsMask: 0x%08x"), iUnitsMask));
+    TraceDump(INIT_LEVEL, (("iParseMask: 0x%08x"), iParseMask));
+
+	iVersion = TVersion(KWlanDriverMajorVersion,KWlanDriverMinorVersion,KWlanDriverBuildVersion);
+	}
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+DWlanLogicalDevice::~DWlanLogicalDevice()
+	{
+    TraceDump(INIT_LEVEL, ("WLANLDD: DWlanLogicalDevice dtor"));
+
+    delete iRxFrameMemoryPool;
+    iRxFrameMemoryPool = NULL;
+
+#ifndef RD_WLAN_DDK
+
+    if ( iMutex )
+        {
+        TraceDump(MUTEX, ("WLANLDD: DWlanLogicalDevice dtor: close the mutex"));
+        iMutex->Close( NULL ); 
+        iMutex = NULL;       
+        }
+
+#else
+
+    if ( iOsa )
+        {
+        TraceDump(MEMORY, (("WLANLDD: delete WlanOsa: 0x%08x"), 
+            reinterpret_cast<TUint32>(iOsa)));
+            
+        delete iOsa;
+        iOsa = NULL;
+        }
+
+#endif // RD_WLAN_DDK      
+    
+    if( iDfcQ )
+        {
+        TraceDump(MEMORY, (("WLANLDD: delete DFC queue: 0x%08x"), 
+            reinterpret_cast<TUint32>(iDfcQ)));
+        
+        iDfcQ->Destroy();
+        }
+    
+	}
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt DWlanLogicalDevice::Create( DLogicalChannelBase *&aChannel )
+    {
+    TraceDump(INIT_LEVEL, ("WLANLDD: DWlanLogicalDevice::Create"));
+
+    TInt ret = KErrNoMemory;
+
+    // UMAC exists we may proceed
+
+    aChannel = 
+
+#ifndef RD_WLAN_DDK
+        new DWlanLogicalChannel( 
+            *this,
+            iUmac,
+            *iDfcQ,
+            *iMutex, 
+            iSharedMemoryChunk, 
+            iRxFrameMemoryPool );
+#else                
+        new DWlanLogicalChannel( 
+            *this,
+            iUmac,
+            *iDfcQ,
+            iOsa, 
+            iSharedMemoryChunk, 
+            iRxFrameMemoryPool );
+#endif        
+
+    if ( aChannel )
+        {
+        ret = KErrNone;
+        }
+    else
+        {
+        // allocation failed
+        TraceDump(WARNING_LEVEL, 
+            ("WLANLDD: DWlanLogicalDevice::Create: logical channel allocation failure"));
+        }
+
+    return ret;
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt DWlanLogicalDevice::Install()
+	{
+    TraceDump(INIT_LEVEL, ("WLANLDD: DWlanLogicalDevice::Install"));
+
+    _LIT(KWlanDdThreadName, "WlanDdThread");
+    const TInt KWlanDdThreadPriority = 27;
+    TInt ret( 0 );
+
+    // create our own DFC queue (and thread)
+    ret = Kern::DynamicDfcQCreate( 
+        iDfcQ, 
+        KWlanDdThreadPriority, 
+        KWlanDdThreadName );
+
+    if ( ret != KErrNone )
+        {
+        TraceDump(ERROR_LEVEL, 
+            ("WLANLDD: DWlanLogicalDevice::Install: DFC queue creation failed -> aborting"));
+        return ret;
+        }
+    else
+        {
+        TraceDump(MEMORY, (("WLANLDD: new DFC queue: 0x%08x"), 
+            reinterpret_cast<TUint32>(iDfcQ)));        
+        }
+
+#ifndef RD_WLAN_DDK
+    ret = Kern::MutexCreate( iMutex, KNullDesC, KMutexOrdGeneral7);
+    TraceDump(MUTEX, 
+        (("WLANLDD: DWlanLogicalDevice::Install: mutex create; status: %d"), 
+        ret));
+        
+    if ( ret )
+        {
+        // mutex creation failed
+        TraceDump(ERROR_LEVEL, 
+            ("WLANLDD: DWlanLogicalDevice::Install: mutex creation failed -> aborting"));
+        ret = KErrGeneral;                                
+        }
+        
+#else
+
+    // create OSA
+   
+    iOsa = new WlanOsa();
+    
+    if ( iOsa )
+        {
+        TraceDump(MEMORY, (("WLANLDD: new WlanOsa: 0x%08x"), 
+            reinterpret_cast<TUint32>(iOsa)));
+
+        if ( !( iOsa->IsValid() ) )
+            {
+            // OSA is not valid. That's fatal
+            // OSA object instance will be deallocated in the destructor
+
+            TraceDump(ERROR_LEVEL, 
+                ("WLANLDD: DWlanLogicalDevice::Install: osa not valid, abort"));
+
+            ret = KErrGeneral;
+            }                
+        }
+    else
+        {
+        // allocation failed
+
+        TraceDump(ERROR_LEVEL, 
+            ("WLANLDD: DWlanLogicalDevice::Install: osa alloc failed, abort"));
+        ret = KErrNoMemory;
+        }
+
+#endif
+
+    if ( !ret )
+        {        
+        // init the UMac
+        if ( iUmac.Init() )
+            {
+            const TPtrC name= LDD_NAME;
+            ret = SetName(&name);
+            
+            }
+        else
+            {
+            TraceDump(WARNING_LEVEL, 
+                ("WLANLDD: DWlanLogicalDevice::Install: UMAC init failed -> aborting "));
+
+            ret = KErrGeneral;
+            }
+        }
+
+    return ret;
+	}
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void DWlanLogicalDevice::GetCaps(TDes8& aDes) const
+	{
+    TraceDump(INIT_LEVEL, ("WLANLDD: DWlanLogicalDevice::GetCaps"));
+
+    DWlanLogicalDevice::TCaps caps;
+	caps.iVersion=iVersion;
+    // write back to user mode
+    Kern::InfoCopy( aDes, reinterpret_cast<TUint8*>(&caps), sizeof(caps) );
+	}
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool DWlanLogicalDevice::UseCachedMemory() const
+    {
+    return iUseCachedMemory;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void DWlanLogicalDevice::UseCachedMemory( TBool aValue )
+    {
+    iUseCachedMemory = aValue;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void DWlanLogicalDevice::SetRxBufAlignmentPadding( 
+    TInt aRxBufAlignmentPadding )
+    {
+    iRxBufAlignmentPadding = aRxBufAlignmentPadding;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt DWlanLogicalDevice::RxBufAlignmentPadding() const
+    {
+    return iRxBufAlignmentPadding;
+    }