diff -r 5fb7af913dfd -r a828660c511c wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/DataFrameMemMngr.cpp --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/DataFrameMemMngr.cpp Thu Aug 19 11:40:48 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/DataFrameMemMngr.cpp Tue Aug 31 17:02:06 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"));