how to timestamp packets with CC2420 and MSP430F1611
The method you described certainly seems like it won't suffer from the first problem you've described. Except in extreme circumstances or some kind of polling implementation. Are you not using an interrupt to place the time stamp into the queue? It would take maybe 15 cycles to complete the copy, how fast do packets come in?

// Timer B0 interrupt service routine
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B (void)
{
 *Timestamp_RX_Write++ = TBR;   // Copy TBR value into timestamp buffer
 if(Timestamp_RX_Write &gt;= Timestamp_RX_Buffer + Timestamp_Buffer_Size)
    Timestamp_RX_Write -= Timestamp_Buffer_Size;
}


This would be assuming you've created your FIFO like this:

unsigned int Timestamp_RX_Buffer[Timestamp_Buffer_Size];    // Timestamp buffer
volatile unsigned int *Timestamp_RX_Read = Timestamp_RX_Buffer;// Read pointer
volatile unsigned int *Timestamp_RX_Write = Timestamp_RX_Buffer;// Write pointer


For the second problem, just always pop the time stamps from the queue when you're servicing/verifying the packets, if the addressing fails then that time stamp is thrown away.

Timestamp = *Timestamp_RX_Read++;  // Load the time stamp value from the queue
if(Timestamp_RX_Read &gt;= Timestamp_RX_Buffer + Timestamp_Buffer_Size)
   Timestamp_RX_Read -= Timestamp_Buffer_Size;

if(Packet_Address!=Correct_Address)
   return;


Now you'll obviously need to be checking for overflows in your counter, or at least keep a running index with RXed packets so you can order them correctly later. But that's going to depend on how you're using the time stamps, maybe all you need is the difference between two time stamps. I could give more help if you further describe your application.