mt76x02_write_beacon(struct mt76x02_dev *dev, int offset, struct sk_buff *skb)
 {
        int beacon_len = dev->beacon_ops->slot_size;
-       struct mt76x02_txwi txwi;
 
        if (WARN_ON_ONCE(beacon_len < skb->len + sizeof(struct mt76x02_txwi)))
                return -ENOSPC;
 
-       mt76x02_mac_write_txwi(dev, &txwi, skb, NULL, NULL, skb->len);
+       /* USB devices already reserve enough skb headroom for txwi's. This
+        * helps to save slow copies over USB.
+        */
+       if (mt76_is_usb(&dev->mt76)) {
+               struct mt76x02_txwi *txwi;
+
+               txwi = (struct mt76x02_txwi *)(skb->data - sizeof(*txwi));
+               mt76x02_mac_write_txwi(dev, txwi, skb, NULL, NULL, skb->len);
+               skb_push(skb, sizeof(*txwi));
+       } else {
+               struct mt76x02_txwi txwi;
 
-       mt76_wr_copy(dev, offset, &txwi, sizeof(txwi));
-       offset += sizeof(txwi);
+               mt76x02_mac_write_txwi(dev, &txwi, skb, NULL, NULL, skb->len);
+               mt76_wr_copy(dev, offset, &txwi, sizeof(txwi));
+               offset += sizeof(txwi);
+       }
 
        mt76_wr_copy(dev, offset, skb->data, skb->len);
        return 0;