wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/MgmtFrameMemMngr.cpp
branchRCL_3
changeset 43 d3d7683d16f5
parent 42 a828660c511c
--- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/MgmtFrameMemMngr.cpp	Tue Aug 31 17:02:06 2010 +0300
+++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/MgmtFrameMemMngr.cpp	Wed Sep 01 12:41:05 2010 +0100
@@ -16,7 +16,7 @@
 */
 
 /*
-* %version: 21 %
+* %version: 20 %
 */
 
 #include "WlLddWlanLddConfig.h"
@@ -226,8 +226,6 @@
                     + KMgmtSideTxBufferLength 
                     + KProtocolStackSideTxDataChunkSize );
 
-                iFrameXferBlockBase = iFrameXferBlock;
-                
                 TraceDump( INIT_LEVEL, 
                     (("WLANLDD: MgmtFrameMemMngr::DoOpenHandle: Engine RFrameXferBlock addr: 0x%08x"),
                     reinterpret_cast<TUint32>(iFrameXferBlock) ) );
@@ -277,6 +275,55 @@
     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<TUint32>(reinterpret_cast<TDataBuffer*>(
+                    iRxDataChunk 
+                    + rxHandledBuffersArray[i])->KeGetBufferStart()) ) );
+
+            iRxFrameMemoryPool->Free( 
+                reinterpret_cast<TDataBuffer*>(
+                    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<TUint32>( 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 );
@@ -319,34 +366,191 @@
 // ---------------------------------------------------------------------------
 //
 TBool MgmtFrameMemMngr::DoEthernetFrameRxComplete( 
-    TDataBuffer*& aBufferStart, 
+    const 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 );
-    TDataBuffer** metaHdrPtrArray(&aBufferStart);
 
-    if ( iFrameXferBlock )
+    if ( iReadStatus == EPending )
         {
-        for ( TUint i = 0; i < aNumOfBuffers; ++i )
+        // 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<TUint32*>(&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<TUint32>(iRxDataChunk);
+
+                TraceDump( RX_FRAME, 
+                    (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: Rx buf offset addr: 0x%08x"), 
+                    iCompletedBuffers[i]) );        
+                }
+
+            iCountCompleted = aNumOfBuffers;
+
+            iFrameXferBlock->KeRxComplete( iCompletedBuffers, iCountCompleted);
+            }
+        else
             {
-            if ( metaHdrPtrArray[i] )
+            // 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<TUint32*>(&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 )
                 {
-                iFrameXferBlock->AddRxFrame( metaHdrPtrArray[i] );
+                TraceDump( RX_FRAME, 
+                    (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: supplied Rx buf addr: 0x%08x"), 
+                    iTobeCompletedBuffers[iCountTobeCompleted + i]) );
+
+                iTobeCompletedBuffers[iCountTobeCompleted + i] 
+                    -= reinterpret_cast<TUint32>(iRxDataChunk);
+
+                TraceDump( RX_FRAME, 
+                    (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: Rx buf offset addr: 0x%08x"), 
+                    iTobeCompletedBuffers[iCountTobeCompleted + 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<TUint32*>(&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<TUint32>(iRxDataChunk);
+
+            TraceDump( RX_FRAME, 
+                (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: Rx buf offset addr: 0x%08x"), 
+                iTobeCompletedBuffers[iCountTobeCompleted + i]) );        
             }
         
-        if ( iReadStatus == EPending )
+        iCountTobeCompleted += aNumOfBuffers;
+        }
+
+    TraceDump( RX_FRAME, 
+        (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: end: iCountCompleted: %d"), 
+        iCountCompleted) );
+
+    TraceDump( RX_FRAME, 
+        (("WLANLDD: MgmtFrameMemMngr::DoEthernetFrameRxComplete: end: iCountTobeCompleted: %d"), 
+        iCountTobeCompleted) );
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TUint32* MgmtFrameMemMngr::DoGetTobeCompletedBuffersStart()
+    {
+    return iTobeCompletedBuffers;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TUint32* MgmtFrameMemMngr::DoGetCompletedBuffersStart()
+    {
+    return iCompletedBuffers;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void MgmtFrameMemMngr::DoFreeRxBuffers()
+    {
+    if ( IsMemInUse() )
+        {
+        for ( TUint i = 0; i < iCountCompleted; ++i )
             {
-            ret = ETrue;
+            TDataBuffer* metaHdr ( reinterpret_cast<TDataBuffer*>(
+                    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<TUint32>(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<TUint32>(metaHdr)) );
+    
+            iRxFrameMemoryPool->Free( metaHdr );        
             }
         }
-
-    return ret;
+    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") );        
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -359,7 +563,7 @@
         (("WLANLDD: MgmtFrameMemMngr::DoMarkRxBufFree: free Rx buf at addr: 0x%08x"),
         reinterpret_cast<TUint32>(aBufferToFree) ) );
 
-    if ( IsMemInUse() && iRxFrameMemoryPool )
+    if ( IsMemInUse() )
         {
         iRxFrameMemoryPool->Free( 
             aBufferToFree
@@ -371,117 +575,25 @@
         // 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
     {
-    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));
+    const TInt KMemMgrHdrLen = iRxFrameMemoryPool->HeaderSize();
+    const TInt KRemainder ( KMemMgrHdrLen % iRxFrameBufAllocationUnit );
+    TInt padding = KRemainder ? 
+        ( iRxFrameBufAllocationUnit - KRemainder ) : KRemainder;
         
-        return padding;
-        }
-    else
-        {
-        os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ );
-        return 0;
-        }
+    TraceDump(INIT_LEVEL, (("WLANLDD: MgmtFrameMemMngr::RxBufAlignmentPadding: %d"), 
+        padding));
+    
+    return padding;
     }
 
 // ---------------------------------------------------------------------------
@@ -522,5 +634,5 @@
         Kern::ChunkClose( iParent.SharedMemoryChunk() );
         iParent.SharedMemoryChunk() = NULL;
         MarkMemFree();
-        }
+        }    
     }