Hi, On Wed, 12 Jan 2022 at 12:34, Miquel Raynal <miquel.raynal@xxxxxxxxxxx> wrote: ... > +static int mac802154_scan_send_beacon_req_locked(struct ieee802154_local *local) > +{ > + struct sk_buff *skb; > + int ret; > + > + lockdep_assert_held(&local->scan_lock); > + > + skb = alloc_skb(IEEE802154_BEACON_REQ_SKB_SZ, GFP_KERNEL); > + if (!skb) > + return -ENOBUFS; > + > + ret = ieee802154_beacon_req_push(skb, &local->beacon_req); > + if (ret) { > + kfree_skb(skb); > + return ret; > + } > + > + return drv_xmit_async(local, skb); I think you need to implement a sync transmit handling here. And what I mean is not using dryv_xmit_sync() (It is a long story and should not be used, it's just that the driver is allowed to call bus api functions which can sleep). We don't have such a function yet (but I think it can be implemented), you should wait until the transmission is done. If we don't wait we fill framebuffers on the hardware while the hardware is transmitting the framebuffer which is... bad. Please implement it so that we have a synchronous api above the asynchronous transmit api. - Alex