dcd/samx7x: always send deferred ZLPs from the TXINI handler

The immediate path raced the hardware: the last busy bank could free between the TXINI acknowledge and
the NBUSYBK read, and the fresh TXINI then reported the ZLP complete while it still sat in the bank.
NBUSYBK also could not tell a free current bank from a busy one on dual-bank endpoints.
The ZLP is now always validated from the TXINI handler, where the bank is guaranteed free. If a bank
is writable already, TXINI is raised by software the way the ASF driver does, so there is one path
and the completion always follows the transmission
diff --git a/src/portable/microchip/samx7x/dcd_samx7x.c b/src/portable/microchip/samx7x/dcd_samx7x.c
index 93e68c9..446abd9 100644
--- a/src/portable/microchip/samx7x/dcd_samx7x.c
+++ b/src/portable/microchip/samx7x/dcd_samx7x.c
@@ -532,17 +532,16 @@
     if (dir == TUSB_DIR_OUT) {
       USB_REG->DEVEPTIER[epnum] = DEVEPTIER_RXOUTES;
     } else if (total_bytes == 0 && epnum != 0) {
-      // TXINI is sticky: every bank freed while it was masked (DMA transfers run with it masked) leaves it
-      // set, so acknowledge it first. Only then does NBUSYBK say whether the empty bank can be validated
-      // right away or whether that has to wait for the next TXINI, because clearing FIFOCON on a busy bank
-      // is a no-op that swallows the ZLP
+      // Clearing FIFOCON on a busy bank is a no-op that swallows the ZLP, so the empty bank is validated
+      // from the TXINI handler, where it is guaranteed free. TXINI is sticky and every bank freed while it
+      // was masked (DMA transfers run with it masked) leaves it set, so acknowledge it first; if a bank is
+      // writable already, raise the interrupt by hand like the ASF driver does
+      xfer->zlp_pending         = true;
       USB_REG->DEVEPTICR[epnum] = DEVEPTICR_TXINIC;
-      if (USB_REG->DEVEPTISR[epnum] & DEVEPTISR_NBUSYBK) {
-        xfer->zlp_pending         = true;
-        USB_REG->DEVEPTIER[epnum] = DEVEPTIER_TXINES;
-      } else {
-        dcd_transmit_packet(xfer, epnum);
+      if (USB_REG->DEVEPTISR[epnum] & DEVEPTISR_RWALL) {
+        USB_REG->DEVEPTIFR[epnum] = DEVEPTIFR_TXINIS;
       }
+      USB_REG->DEVEPTIER[epnum] = DEVEPTIER_TXINES;
     } else {
       dcd_transmit_packet(xfer, epnum);
     }