@@ -242,9 +242,6 @@ bool CrorcDmaChannel::pushSuperpage(Superpage superpage)
242242 BOOST_THROW_EXCEPTION (Exception () << ErrorInfo::Message (" Could not push superpage, transfer queue was full" ));
243243 }
244244
245- auto busAddress = getBusOffsetAddress (superpage.getOffset ());
246- getBar ()->pushSuperpageAddressAndSize (busAddress, superpage.getSize ());
247-
248245 mTransferQueue .write (superpage);
249246
250247 return true ;
@@ -262,16 +259,15 @@ auto CrorcDmaChannel::popSuperpage() -> Superpage
262259
263260bool CrorcDmaChannel::isASuperpageAvailable ()
264261{
265- static uint32_t count = 0xff ;
266262 uint32_t newCount = getSuperpageInfoUser ()->count ;
267263 uint32_t diff;
268264
269- if (newCount < count ) { // handle overflow
265+ if (newCount < mSPAvailCount ) { // handle overflow
270266 diff = ((0xff + 1 ) - 0xff ) + newCount;
271267 } else {
272- diff = newCount - count ;
268+ diff = newCount - mSPAvailCount ;
273269 }
274- count = newCount;
270+ mSPAvailCount = newCount;
275271
276272 return diff > 0 ;
277273}
@@ -288,13 +284,24 @@ void CrorcDmaChannel::fillSuperpages()
288284 }
289285
290286 // Check for arrivals & handle them
291- if (!mTransferQueue .isEmpty () && isASuperpageAvailable ()) {
287+ if (!mIntermediateQueue .isEmpty () && isASuperpageAvailable ()) {
292288
293- auto superpage = mTransferQueue .frontPtr ();
289+ auto superpage = mIntermediateQueue .frontPtr ();
294290 superpage->setReceived (getSuperpageInfoUser ()->size ); // length in bytes
295291 superpage->setReady (true );
296292 mReadyQueue .write (*superpage);
293+ mIntermediateQueue .popFront ();
294+ }
295+
296+ // Push single Superpage to the firmware when available
297+ if (mIntermediateQueue .isEmpty () && !mTransferQueue .isEmpty ()) {
298+ auto inSuperpage = mTransferQueue .frontPtr ();
297299 mTransferQueue .popFront ();
300+
301+ auto busAddress = getBusOffsetAddress (inSuperpage->getOffset ());
302+ getBar ()->pushSuperpageAddressAndSize (busAddress, inSuperpage->getSize ());
303+
304+ mIntermediateQueue .write (*inSuperpage);
298305 }
299306}
300307
0 commit comments