Привет всем!
уже довольно долго мучаюсь с попыткой поднять стек MSD на unicore-mx. портит все дело внезапные остановы отправки пакетов в bulkIN точке. (почемуто на точке0 никаких проблем нету)
вот последний анамнез ставящий меня в тупик:

Код
        cm_disable_interrupts();
        REBASE(DWC_OTG_DIEPxTSIZ, ep_num) =     mc_from_flags(transfer->flags) |     DWC_OTG_DIEPTSIZ_PKTCNT(pktcnt) |DWC_OTG_DIEPTSIZ_XFRSIZ(transfer->length);
//* вот тут вот установлен NACK - чтобы точка не вела активность пока в ее ФИФО чтото кидается
        REBASE(DWC_OTG_DIEPxCTL, ep_num) = DWC_OTG_DIEPCTL_EPENA |    DWC_OTG_DIEPCTL_MPSIZ(transfer->ep_size) |    DWC_OTG_DIEPCTL_SNAK | DWC_OTG_DIEPCTL_TXFNUM(ep_num) | ptyp_map[transfer->ep_type] | DWC_OTG_DIEPCTL_USBAEP;

        USBD_LOGF_LN(USB_VIO, "USBD:submit urb%"PRIurb" on ep8%"PRIx8" DIEPxTSIZ=%x"
                , view_urbid(urb->id), ep_num, REBASE(DWC_OTG_DIEPxTSIZ, ep_num) );

        /* Push first packet to memory! */
        if (transfer->length) {
            /* Enable empty interrupt mask */
            REBASE(DWC_OTG_DIEPEMPMSK) |= DWC_OTG_DIEPEMPMSK_INEPTXFEM(ep_num);

            urb_to_fifo_1pkt(dev, urb);
        }
//* вот тут вот установлен ACK - чтобы точка начала отправку
        REBASE(DWC_OTG_DIEPxCTL, ep_num) |= DWC_OTG_DIEPCTL_CNAK;
        cm_enable_interrupts();

        /* Enable Interrupt */
        REBASE(DWC_OTG_DAINTMSK) |= DWC_OTG_DAINTMSK_IEPM(ep_num);

останов на последнем операторе - включение прерываний, показывает изумительную картину:
флаг XFRC - установлен, что и понятно, вссь пакет ушел в фифо.
флаг TXFE - чист, а DTXFSTSx - показывает что в фифо завис мой пакет, и никуда не отправляется. при этом DIEPCTL показывает флаг NACKSTS = 0

на этом месте обмен с хостом останавливается, и спустя таймаут хоста требует ресета.

Кто боролся с ФИФО в стмах - расскажите что я нетак курю? как правильно работать с отправкой балк-пакетов?