Hi Daniel, > /* Move the head of the ring to the next empty descriptor */ > - ch->head_blk_ctl = ctl->next; > + ch->head_blk_ctl = ctl_skb->next; > + > + /* Commit all previous writes and set descriptors to VALID */ > + wmb(); Is this first memory barrier really needed? from what I understand, we only need to ensure that the control descriptor is marked valid at the end of the procedure and we don't really care about the paylod one. > + desc_skb->ctrl = ch->ctrl_skb; > + wmb(); > + desc_bd->ctrl = ch->ctrl_bd; > > /* > * When connected and trying to send data frame chip can be in sleep Otherwise, patch makes sense. Regards, Loic