by support »
Wow. That was a rather tangled scenario. Does anyone really nullify packets? It looks like a theoretic feature to me.
Anyhow, the PCIe 1.0 spec 3.5.2.1 says that when a packet is nullified, it doesn't increment NEXT_TRANSMIT_SEQ, so from its perspective, it's as if the packet was never sent. And therefore, it's not expected to be in the retry buffer.
The same section also says, that when a replay is initiated, either due to reception of a Nak or due to REPLAY_TIMER expiration, the all unacknowledged packets should be transmitted. Since the packet isn't in the retry buffer, it's not even in the game. No retransmission is expected. Which makes sense. Why would one want to retransmit a packet that the receiver should ignore.
I'm not even sure that an Nak should be sent on a bad nullified packet. Not that it matter so much.
I can understand the concern that AckNak_Seq_Num will contain a sequence number to a packet that the sender doesn't remember. But the spec says "If the Sequence Number specified by the AckNak_Seq_Num does not correspond to an
unacknowledged TLP, or to the value in ACKD_SEQ, the DLLP is discarded". So this Nak will do nothing. At worst, it will Nak a packet that was just sent, accidentally had the same sequence number, and wasn't Ack'ed.
So this tangled case seems to work out pretty well anyhow.
Hope this helped,
Eli