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

mt7615: mcu: use proper msg size in mt7615_mcu_add_wtbl



Use proper mcu message size in mt7615_mcu_add_wtbl and do not
allocate a huge buffer. Moreover use stack memory instead of heap one

Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 77eaa281
Loading
Loading
Loading
Loading
+24 −30
Original line number Diff line number Diff line
@@ -1029,37 +1029,31 @@ int mt7615_mcu_add_wtbl(struct mt7615_dev *dev, struct ieee80211_vif *vif,
{
	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
	struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
	struct wtbl_generic *wtbl_generic;
	struct wtbl_rx *wtbl_rx;
	int buf_len, ret;
	u8 *buf;

	buf = kzalloc(MT7615_WTBL_UPDATE_MAX_SIZE, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

	wtbl_generic = (struct wtbl_generic *)buf;
	buf_len = sizeof(*wtbl_generic);
	wtbl_generic->tag = cpu_to_le16(WTBL_GENERIC);
	wtbl_generic->len = cpu_to_le16(buf_len);
	memcpy(wtbl_generic->peer_addr, sta->addr, ETH_ALEN);
	wtbl_generic->muar_idx = mvif->omac_idx;
	wtbl_generic->qos = sta->wme;
	wtbl_generic->partial_aid = cpu_to_le16(sta->aid);

	wtbl_rx = (struct wtbl_rx *)(buf + buf_len);
	buf_len += sizeof(*wtbl_rx);
	wtbl_rx->tag = cpu_to_le16(WTBL_RX);
	wtbl_rx->len = cpu_to_le16(sizeof(*wtbl_rx));
	wtbl_rx->rca1 = (vif->type == NL80211_IFTYPE_AP) ? 0 : 1;
	wtbl_rx->rca2 = 1;
	wtbl_rx->rv = 1;

	ret = __mt7615_mcu_set_wtbl(dev, msta->wcid.idx, WTBL_RESET_AND_SET,
				    2, buf, buf_len);
	struct {
		struct wtbl_generic g_wtbl;
		struct wtbl_rx rx_wtbl;
	} data = {
		.g_wtbl = {
			.tag = cpu_to_le16(WTBL_GENERIC),
			.len = cpu_to_le16(sizeof(struct wtbl_generic)),
			.muar_idx = mvif->omac_idx,
			.qos = sta->wme,
			.partial_aid = cpu_to_le16(sta->aid),
		},
		.rx_wtbl = {
			.tag = cpu_to_le16(WTBL_RX),
			.len = cpu_to_le16(sizeof(struct wtbl_rx)),
			.rca1 = vif->type != NL80211_IFTYPE_AP,
			.rca2 = 1,
			.rv = 1,
		},
	};
	memcpy(data.g_wtbl.peer_addr, sta->addr, ETH_ALEN);

	kfree(buf);
	return ret;
	return __mt7615_mcu_set_wtbl(dev, msta->wcid.idx,
				     WTBL_RESET_AND_SET, 2, &data,
				     sizeof(struct wtbl_generic) +
				     sizeof(struct wtbl_rx));
}

int mt7615_mcu_del_wtbl(struct mt7615_dev *dev, struct ieee80211_vif *vif,