OSDN Git Service

mt76: mt76u: introduce mt76u_skb_dma_info routine
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 15 Jan 2020 10:58:56 +0000 (11:58 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 14 Feb 2020 09:06:06 +0000 (10:06 +0100)
Introduce mt76u_skb_dma_info utility routine in mt76-usb module in order
to be reused adding mt7663u support

Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
drivers/net/wireless/mediatek/mt76/usb.c

index 4968b59..d906e0f 100644 (file)
@@ -881,6 +881,7 @@ mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len,
        return usb_bulk_msg(udev, pipe, data, len, actual_len, timeout);
 }
 
+int mt76u_skb_dma_info(struct sk_buff *skb, u32 info);
 int mt76u_vendor_request(struct mt76_dev *dev, u8 req,
                         u8 req_type, u16 val, u16 offset,
                         void *buf, size_t len);
index bf3198e..0180b62 100644 (file)
@@ -46,8 +46,7 @@ EXPORT_SYMBOL_GPL(mt76x02u_mac_start);
 
 int mt76x02u_skb_dma_info(struct sk_buff *skb, int port, u32 flags)
 {
-       struct sk_buff *iter, *last = skb;
-       u32 info, pad;
+       u32 info;
 
        /* Buffer layout:
         *      |   4B   | xfer len |      pad       |  4B  |
@@ -57,28 +56,8 @@ int mt76x02u_skb_dma_info(struct sk_buff *skb, int port, u32 flags)
         */
        info = FIELD_PREP(MT_TXD_INFO_LEN, round_up(skb->len, 4)) |
               FIELD_PREP(MT_TXD_INFO_DPORT, port) | flags;
-       put_unaligned_le32(info, skb_push(skb, sizeof(info)));
 
-       /* Add zero pad of 4 - 7 bytes */
-       pad = round_up(skb->len, 4) + 4 - skb->len;
-
-       /* First packet of a A-MSDU burst keeps track of the whole burst
-        * length, need to update length of it and the last packet.
-        */
-       skb_walk_frags(skb, iter) {
-               last = iter;
-               if (!iter->next) {
-                       skb->data_len += pad;
-                       skb->len += pad;
-                       break;
-               }
-       }
-
-       if (skb_pad(last, pad))
-               return -ENOMEM;
-       __skb_put(last, pad);
-
-       return 0;
+       return mt76u_skb_dma_info(skb, info);
 }
 
 int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,
index 1f29cd9..57d2590 100644 (file)
@@ -907,6 +907,35 @@ mt76u_tx_setup_buffers(struct mt76_dev *dev, struct sk_buff *skb,
        return urb->num_sgs;
 }
 
+int mt76u_skb_dma_info(struct sk_buff *skb, u32 info)
+{
+       struct sk_buff *iter, *last = skb;
+       u32 pad;
+
+       put_unaligned_le32(info, skb_push(skb, sizeof(info)));
+       /* Add zero pad of 4 - 7 bytes */
+       pad = round_up(skb->len, 4) + 4 - skb->len;
+
+       /* First packet of a A-MSDU burst keeps track of the whole burst
+        * length, need to update length of it and the last packet.
+        */
+       skb_walk_frags(skb, iter) {
+               last = iter;
+               if (!iter->next) {
+                       skb->data_len += pad;
+                       skb->len += pad;
+                       break;
+               }
+       }
+
+       if (skb_pad(last, pad))
+               return -ENOMEM;
+       __skb_put(last, pad);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(mt76u_skb_dma_info);
+
 static int
 mt76u_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,
                   struct sk_buff *skb, struct mt76_wcid *wcid,