int mt7601u_dma_enqueue_tx(struct mt7601u_dev *dev, struct sk_buff *skb, struct mt76_wcid *wcid, int hw_q) { u8 ep = q2ep(hw_q); u32 dma_flags; int ret; dma_flags = MT_TXD_PKT_INFO_80211; if (wcid->hw_key_idx == 0xff) dma_flags |= MT_TXD_PKT_INFO_WIV; ret = mt7601u_dma_skb_wrap_pkt(skb, ep2dmaq(ep), dma_flags); if (ret) return ret; ret = mt7601u_dma_submit_tx(dev, skb, ep); if (ret) { ieee80211_free_txskb(dev->hw, skb); return ret; } return 0; }
static int mt76u_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, struct sk_buff *skb, struct mt76_wcid *wcid, struct ieee80211_sta *sta) { struct usb_interface *intf = to_usb_interface(dev->dev); struct usb_device *udev = interface_to_usbdev(intf); u8 ep = q2ep(q->hw_idx); struct mt76u_buf *buf; u16 idx = q->tail; unsigned int pipe; int err; if (q->queued == q->ndesc) return -ENOSPC; err = dev->drv->tx_prepare_skb(dev, NULL, skb, q, wcid, sta, NULL); if (err < 0) return err; buf = &q->entry[idx].ubuf; buf->done = false; err = mt76u_tx_build_sg(skb, buf->urb); if (err < 0) return err; pipe = usb_sndbulkpipe(udev, dev->usb.out_ep[ep]); usb_fill_bulk_urb(buf->urb, udev, pipe, NULL, skb->len, mt76u_complete_tx, buf); q->tail = (q->tail + 1) % q->ndesc; q->entry[idx].skb = skb; q->queued++; return idx; }