diff -r a828660c511c -r d3d7683d16f5 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/DataFrameMemMngr.cpp --- 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(iTxFrameMemoryPool))); + iFrameXferBlock = reinterpret_cast( + start_of_mem + + KRxDataChunkSize + + sizeof( TDataBuffer ) + + KMgmtSideTxBufferLength + + KProtocolStackSideTxDataChunkSize + + sizeof( RFrameXferBlock ) ); + iFrameXferBlockProtoStack = - reinterpret_cast( - start_of_mem - + KRxDataChunkSize - + sizeof( TDataBuffer ) - + KMgmtSideTxBufferLength - + KProtocolStackSideTxDataChunkSize - + sizeof( RFrameXferBlock ) ); - - iFrameXferBlockBase = iFrameXferBlockProtoStack; + static_cast(iFrameXferBlock); TraceDump( INIT_LEVEL, (("WLANLDD: DataFrameMemMngr::DoOpenHandle: Nif RFrameXferBlock addr: 0x%08x"), reinterpret_cast(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( + 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( - 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(&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 { - 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(&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(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(&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]) ); } - 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"));