+ txd ++;
+ if(txd == NUM_TX_DESC)
+ txd = 0;
+ }
+ if( nReleasedAtLastDD )
+ {
+ // Unlock buffers
+ txd = Card->LastFreeTXD;
+ LOG("TX unlocking range %i-%i", txd, idxOfLastDD);
+ while( txd != (idxOfLastDD+1)%NUM_TX_DESC )
+ {
+ if( Card->TXSrcBuffers[txd] ) {
+ LOG("- Unlocking %i:%p", txd, Card->TXSrcBuffers[txd]);
+ IPStack_Buffer_UnlockBuffer( Card->TXSrcBuffers[txd] );
+ Card->TXSrcBuffers[txd] = NULL;
+ }
+ txd ++;
+ if(txd == NUM_TX_DESC)
+ txd = 0;
+ }
+ // Update last free
+ Card->LastFreeTXD = txd;
+ Semaphore_Signal(&Card->FreeTxDescs, nReleasedAtLastDD);
+ LOG("nReleased = %i", nReleasedAtLastDD);
+ }
+ else
+ {
+ LOG("No completed TXDs");