wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/DataFrameMemMngr.cpp
branchRCL_3
changeset 18 d3d7683d16f5
parent 17 a828660c511c
--- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/DataFrameMemMngr.cpp	Tue Aug 31 17:02:06 2010 +0300
+++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/DataFrameMemMngr.cpp	Wed Sep 01 12:41:05 2010 +0100
@@ -16,7 +16,7 @@
 */
 
 /*
-* %version: 19 %
+* %version: 18 %
 */
 
 #include "WlLddWlanLddConfig.h"
@@ -120,23 +120,23 @@
                 TraceDump(MEMORY, (("WLANLDD: new WlanChunk: 0x%08x"), 
                     reinterpret_cast<TUint32>(iTxFrameMemoryPool)));
 
+                iFrameXferBlock = reinterpret_cast<RFrameXferBlock*>(
+                    start_of_mem  
+                    + KRxDataChunkSize 
+                    + sizeof( TDataBuffer ) 
+                    + KMgmtSideTxBufferLength
+                    + KProtocolStackSideTxDataChunkSize
+                    + sizeof( RFrameXferBlock ) );
+                
                 iFrameXferBlockProtoStack = 
-                    reinterpret_cast<RFrameXferBlockProtocolStack*>(
-                        start_of_mem  
-                        + KRxDataChunkSize 
-                        + sizeof( TDataBuffer ) 
-                        + KMgmtSideTxBufferLength
-                        + KProtocolStackSideTxDataChunkSize
-                        + sizeof( RFrameXferBlock ) );
-
-                iFrameXferBlockBase = iFrameXferBlockProtoStack;
+                    static_cast<RFrameXferBlockProtocolStack*>(iFrameXferBlock);
                 
                 TraceDump( INIT_LEVEL, 
                     (("WLANLDD: DataFrameMemMngr::DoOpenHandle: Nif RFrameXferBlock addr: 0x%08x"),
                     reinterpret_cast<TUint32>(iFrameXferBlockProtoStack) ) );
     
                 // initiliase xfer block
-                iFrameXferBlockProtoStack->Initialize();
+                iFrameXferBlockProtoStack->Initialise();
                 
                 iRxBufAlignmentPadding = iParent.RxBufAlignmentPadding();
                 
@@ -175,103 +175,197 @@
 // 
 // ---------------------------------------------------------------------------
 //
+void DataFrameMemMngr::DoFreeRxBuffers()
+    {
+    for ( TUint i = 0; i < iCountCompleted; ++i )
+        {
+        TDataBuffer* metaHdr ( reinterpret_cast<TDataBuffer*>(
+            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<TUint32>(metaHdr->KeGetBufferStart()) ) );            
+            }
+        else
+            {
+            TraceDump( RX_FRAME, 
+                (("WLANLDD: DataFrameMemMngr::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: DataFrameMemMngr::DoFreeRxBuffers: free Rx meta header at addr: 0x%08x"),
+            reinterpret_cast<TUint32>(metaHdr)) );
+
+        iRxFrameMemoryPool->Free( metaHdr );        
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
 TBool DataFrameMemMngr::DoEthernetFrameRxComplete( 
-    TDataBuffer*& aBufferStart, 
+    const 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 );
-    TDataBuffer** metaHdrPtrArray(&aBufferStart);
 
-    if ( iFrameXferBlockProtoStack )
+    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: DataFrameMemMngr::DoEthernetFrameRxComplete: supplied Rx buf addr: 0x%08x"), 
+                    iCompletedBuffers[i]) );        
+                
+                iCompletedBuffers[i] 
+                    -= reinterpret_cast<TUint32>(iRxDataChunk);
+
+                TraceDump( RX_FRAME, 
+                    (("WLANLDD: DataFrameMemMngr::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 )
                 {
-                iFrameXferBlockProtoStack->AddRxFrame( metaHdrPtrArray[i] );
+                TraceDump( RX_FRAME, 
+                    (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: supplied Rx buf addr: 0x%08x"), 
+                    iTobeCompletedBuffers[iCountTobeCompleted + i]) );
+
+                iTobeCompletedBuffers[iCountTobeCompleted + i] 
+                    -= reinterpret_cast<TUint32>(iRxDataChunk);
+
+                TraceDump( RX_FRAME, 
+                    (("WLANLDD: DataFrameMemMngr::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: DataFrameMemMngr::DoEthernetFrameRxComplete: supplied Rx buf addr: 0x%08x"), 
+                iTobeCompletedBuffers[iCountTobeCompleted + i]) );        
+                
+            iTobeCompletedBuffers[iCountTobeCompleted + i] 
+                -= reinterpret_cast<TUint32>(iRxDataChunk);
+
+            TraceDump( RX_FRAME, 
+                (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: Rx buf offset addr: 0x%08x"), 
+                iTobeCompletedBuffers[iCountTobeCompleted + i]) );        
             }
         
-        if ( iReadStatus == EPending )
-            {
-            ret = ETrue;
-            }
+        iCountTobeCompleted += aNumOfBuffers;
         }
+    
+    TraceDump( RX_FRAME, 
+        (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: end: iCountCompleted: %d"), 
+        iCountCompleted) );
+
+    TraceDump( RX_FRAME, 
+        (("WLANLDD: DataFrameMemMngr::DoEthernetFrameRxComplete: end: iCountTobeCompleted: %d"), 
+        iCountTobeCompleted) );
 
     return ret;
     }
 
 // ---------------------------------------------------------------------------
-//   
+// 
 // ---------------------------------------------------------------------------
 //
-TBool DataFrameMemMngr::OnReadRequest()
+TUint32* DataFrameMemMngr::DoGetTobeCompletedBuffersStart()
     {
-    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;
+    return iTobeCompletedBuffers;
     }
 
 // ---------------------------------------------------------------------------
-// Note! This method is executed in the context of the user mode client 
-// thread, but in supervisor mode
+// 
 // ---------------------------------------------------------------------------
 //
-TDataBuffer* DataFrameMemMngr::GetRxFrame( 
-    TDataBuffer* aFrameToFreeInUserSpace )
+TUint32* DataFrameMemMngr::DoGetCompletedBuffersStart()
     {
-    TDataBuffer* rxFrame( NULL );
-    
-    if ( IsMemInUse() && iFrameXferBlockProtoStack )
-        {
-        if ( aFrameToFreeInUserSpace )
-            {            
-            FreeRxPacket( aFrameToFreeInUserSpace );
-            }
-        
-        rxFrame = iFrameXferBlockProtoStack->GetRxFrame();
-        }
-        
-    return rxFrame;
+    return iCompletedBuffers;
     }
 
 // ---------------------------------------------------------------------------
-// Note! This method is executed in the context of the user mode client 
-// thread, but in supervisor mode
+// 
 // ---------------------------------------------------------------------------
 //
 TDataBuffer* DataFrameMemMngr::AllocTxBuffer( TUint aLength )
@@ -282,10 +376,7 @@
     
     TDataBuffer* metaHdr ( NULL );
 
-    if ( ( !IsMemInUse() ) ||
-         ( !iTxFrameMemoryPool ) ||
-         ( !iFrameXferBlockProtoStack ) ||
-         ( aLength > KMaxEthernetFrameLength ) )
+    if ( ( !IsMemInUse() ) || ( aLength > KMaxEthernetFrameLength ) )
         {
 #ifndef NDEBUG
         TraceDump( NWSA_TX_DETAILS, 
@@ -332,66 +423,17 @@
     }
 
 // ---------------------------------------------------------------------------
-// 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 ( aPacket )
+    if ( IsMemInUse() )
         {
-        if ( iTxFrameMemoryPool )
-            {
-            // free the actual Tx buffer
-            iTxFrameMemoryPool->Free( aPacket->KeGetBufferStart() );
-            }
-        
-        if ( iFrameXferBlockProtoStack )
-            {
-            // free the meta header
-            iFrameXferBlockProtoStack->FreeTxPacket( aPacket );
-            }
+        // free the actual Tx buffer
+        iTxFrameMemoryPool->Free( aPacket->KeGetBufferStart() );
+        // free the meta header
+        iFrameXferBlockProtoStack->FreeTxPacket( aPacket );
         }
     }
 
@@ -399,39 +441,6 @@
 // 
 // ---------------------------------------------------------------------------
 //
-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"));