Commit 75b10f0c authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau
Browse files

mt76: mt76u: add mt76_skb_adjust_pad utility routine



Introduce mt76_skb_adjust_pad to reuse the code adding sdio support to
mt7615 driver and remove code duplication. Move 4B header configuration
for usb devices out of mt76_skb_adjust_pad

Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent cdcba424
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1015,7 +1015,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 mt76_skb_adjust_pad(struct sk_buff *skb);
int mt76u_vendor_request(struct mt76_dev *dev, u8 req,
			 u8 req_type, u16 val, u16 offset,
			 void *buf, size_t len);
+5 −3
Original line number Diff line number Diff line
@@ -252,7 +252,8 @@ mt7663u_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
{
	struct mt7615_sta *msta = container_of(wcid, struct mt7615_sta, wcid);
	struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb);
	struct sk_buff *skb = tx_info->skb;
	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);

	if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) &&
	    !msta->rate_probe) {
@@ -262,9 +263,10 @@ mt7663u_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
				     msta->rates);
		spin_unlock_bh(&dev->mt76.lock);
	}
	mt7663u_mac_write_txwi(dev, wcid, qid, sta, tx_info->skb);
	mt7663u_mac_write_txwi(dev, wcid, qid, sta, skb);

	return mt76u_skb_dma_info(tx_info->skb, tx_info->skb->len);
	put_unaligned_le32(skb->len, skb_push(skb, sizeof(skb->len)));
	return mt76_skb_adjust_pad(skb);
}

static bool mt7663u_tx_status_data(struct mt76_dev *mdev, u8 *update)
+2 −1
Original line number Diff line number Diff line
@@ -28,7 +28,8 @@ mt7663u_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
	else
		ep = MT_EP_OUT_AC_BE;

	ret = mt76u_skb_dma_info(skb, skb->len);
	put_unaligned_le32(skb->len, skb_push(skb, sizeof(skb->len)));
	ret = mt76_skb_adjust_pad(skb);
	if (ret < 0)
		goto out;

+2 −1
Original line number Diff line number Diff line
@@ -56,8 +56,9 @@ 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)));

	return mt76u_skb_dma_info(skb, info);
	return mt76_skb_adjust_pad(skb);
}

int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,
+29 −0
Original line number Diff line number Diff line
@@ -677,3 +677,32 @@ u8 mt76_ac_to_hwq(u8 ac)
	return wmm_queue_map[ac];
}
EXPORT_SYMBOL_GPL(mt76_ac_to_hwq);

int mt76_skb_adjust_pad(struct sk_buff *skb)
{
	struct sk_buff *iter, *last = skb;
	u32 pad;

	/* 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(mt76_skb_adjust_pad);
Loading