@@ -173,8 +173,13 @@ void CruDmaChannel::deviceStopDma()
173173 if (mReadyQueue .size () >= READY_QUEUE_CAPACITY) {
174174 break ;
175175 }
176- if (!link.queue .empty ()) { // care for the extra filled superpage
177- transferSuperpageFromLinkToReady (link, true );
176+
177+ if (!link.queue .empty ()) { // care for the extra filled superpage
178+ if (i == amountAvailable) { // Propagate that it is the last popped to set the size only to the RDH (eox)
179+ transferSuperpageFromLinkToReady (link, true );
180+ } else {
181+ transferSuperpageFromLinkToReady (link);
182+ }
178183 moved++;
179184 }
180185 }
@@ -278,14 +283,18 @@ void CruDmaChannel::transferSuperpageFromLinkToReady(Link& link, bool isPopped)
278283 }
279284
280285 link.queue .front ().setReady (true );
281- uint32_t superpageSize = getBar ()->getSuperpageSize (link.id );
282- if (isPopped) { // Only RDH in case it is popped
283- link.queue .front ().setReceived (0x40 );
284- } else if (superpageSize == 0 ) { // backwards compatible in case the superpage size register is empty
285- link.queue .front ().setReceived (link.queue .front ().getSize ()); // force the full superpage size
286+
287+ if (isPopped) {
288+ link.queue .front ().setReceived (0x40 ); // Only RDH in case it's popped
286289 } else {
287- link.queue .front ().setReceived (superpageSize);
290+ uint32_t superpageSize = getBar ()->getSuperpageSize (link.id );
291+ if (superpageSize == 0 ) {
292+ link.queue .front ().setReceived (link.queue .front ().getSize ()); // force the full superpage size for backwards compatibility
293+ } else {
294+ link.queue .front ().setReceived (superpageSize);
295+ }
288296 }
297+
289298 mReadyQueue .push_back (link.queue .front ());
290299 link.queue .pop_front ();
291300 link.superpageCounter ++;
0 commit comments