Commit 9c68a57b authored by Felix Fietkau's avatar Felix Fietkau Committed by Kalle Valo

mt76: get station pointer by wcid and pass it to mac80211

Avoids the rhashtable lookup based on the MAC address inside mac80211
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 4e34249e
...@@ -392,12 +392,16 @@ mt76_dma_rx_poll(struct napi_struct *napi, int budget) ...@@ -392,12 +392,16 @@ mt76_dma_rx_poll(struct napi_struct *napi, int budget)
dev = container_of(napi->dev, struct mt76_dev, napi_dev); dev = container_of(napi->dev, struct mt76_dev, napi_dev);
qid = napi - dev->napi; qid = napi - dev->napi;
rcu_read_lock();
do { do {
cur = mt76_dma_rx_process(dev, &dev->q_rx[qid], budget - done); cur = mt76_dma_rx_process(dev, &dev->q_rx[qid], budget - done);
mt76_rx_complete(dev, qid); mt76_rx_complete(dev, qid);
done += cur; done += cur;
} while (cur && done < budget); } while (cur && done < budget);
rcu_read_unlock();
if (done < budget) { if (done < budget) {
napi_complete(napi); napi_complete(napi);
dev->drv->rx_poll_complete(dev, qid); dev->drv->rx_poll_complete(dev, qid);
......
...@@ -384,7 +384,7 @@ int mt76_get_survey(struct ieee80211_hw *hw, int idx, ...@@ -384,7 +384,7 @@ int mt76_get_survey(struct ieee80211_hw *hw, int idx,
} }
EXPORT_SYMBOL_GPL(mt76_get_survey); EXPORT_SYMBOL_GPL(mt76_get_survey);
static void static struct ieee80211_sta *
mt76_rx_convert(struct sk_buff *skb) mt76_rx_convert(struct sk_buff *skb)
{ {
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
...@@ -407,14 +407,17 @@ mt76_rx_convert(struct sk_buff *skb) ...@@ -407,14 +407,17 @@ mt76_rx_convert(struct sk_buff *skb)
BUILD_BUG_ON(sizeof(mstat) > sizeof(skb->cb)); BUILD_BUG_ON(sizeof(mstat) > sizeof(skb->cb));
BUILD_BUG_ON(sizeof(status->chain_signal) != sizeof(mstat.chain_signal)); BUILD_BUG_ON(sizeof(status->chain_signal) != sizeof(mstat.chain_signal));
memcpy(status->chain_signal, mstat.chain_signal, sizeof(mstat.chain_signal)); memcpy(status->chain_signal, mstat.chain_signal, sizeof(mstat.chain_signal));
return wcid_to_sta(mstat.wcid);
} }
void mt76_rx_complete(struct mt76_dev *dev, enum mt76_rxq_id q) void mt76_rx_complete(struct mt76_dev *dev, enum mt76_rxq_id q)
{ {
struct ieee80211_sta *sta;
struct sk_buff *skb; struct sk_buff *skb;
while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) { while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) {
mt76_rx_convert(skb); sta = mt76_rx_convert(skb);
ieee80211_rx_napi(dev->hw, NULL, skb, &dev->napi[q]); ieee80211_rx_napi(dev->hw, sta, skb, &dev->napi[q]);
} }
} }
...@@ -125,6 +125,8 @@ struct mt76_wcid { ...@@ -125,6 +125,8 @@ struct mt76_wcid {
u8 idx; u8 idx;
u8 hw_key_idx; u8 hw_key_idx;
u8 sta:1;
__le16 tx_rate; __le16 tx_rate;
bool tx_rate_set; bool tx_rate_set;
u8 tx_rate_nss; u8 tx_rate_nss;
...@@ -251,6 +253,7 @@ struct mt76_rate_power { ...@@ -251,6 +253,7 @@ struct mt76_rate_power {
}; };
struct mt76_rx_status { struct mt76_rx_status {
struct mt76_wcid *wcid;
u32 flag; u32 flag;
u16 freq; u16 freq;
u8 enc_flags; u8 enc_flags;
...@@ -343,6 +346,17 @@ mtxq_to_txq(struct mt76_txq *mtxq) ...@@ -343,6 +346,17 @@ mtxq_to_txq(struct mt76_txq *mtxq)
return container_of(ptr, struct ieee80211_txq, drv_priv); return container_of(ptr, struct ieee80211_txq, drv_priv);
} }
static inline struct ieee80211_sta *
wcid_to_sta(struct mt76_wcid *wcid)
{
void *ptr = wcid;
if (!wcid || !wcid->sta)
return NULL;
return container_of(ptr, struct ieee80211_sta, drv_priv);
}
int mt76_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, int mt76_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
struct sk_buff *skb, struct mt76_wcid *wcid, struct sk_buff *skb, struct mt76_wcid *wcid,
struct ieee80211_sta *sta); struct ieee80211_sta *sta);
......
...@@ -265,6 +265,15 @@ static void mt76x2_remove_hdr_pad(struct sk_buff *skb) ...@@ -265,6 +265,15 @@ static void mt76x2_remove_hdr_pad(struct sk_buff *skb)
skb_pull(skb, 2); skb_pull(skb, 2);
} }
static struct mt76_wcid *
mt76x2_rx_get_wcid(struct mt76x2_dev *dev, u8 idx)
{
if (idx >= ARRAY_SIZE(dev->wcid))
return NULL;
return rcu_dereference(dev->wcid[idx]);
}
int mt76x2_mac_process_rx(struct mt76x2_dev *dev, struct sk_buff *skb, int mt76x2_mac_process_rx(struct mt76x2_dev *dev, struct sk_buff *skb,
void *rxi) void *rxi)
{ {
...@@ -272,8 +281,12 @@ int mt76x2_mac_process_rx(struct mt76x2_dev *dev, struct sk_buff *skb, ...@@ -272,8 +281,12 @@ int mt76x2_mac_process_rx(struct mt76x2_dev *dev, struct sk_buff *skb,
struct mt76x2_rxwi *rxwi = rxi; struct mt76x2_rxwi *rxwi = rxi;
u32 ctl = le32_to_cpu(rxwi->ctl); u32 ctl = le32_to_cpu(rxwi->ctl);
u16 rate = le16_to_cpu(rxwi->rate); u16 rate = le16_to_cpu(rxwi->rate);
u8 wcid;
int len; int len;
wcid = FIELD_GET(MT_RXWI_CTL_WCID, ctl);
status->wcid = mt76x2_rx_get_wcid(dev, wcid);
if (rxwi->rxinfo & cpu_to_le32(MT_RXINFO_L2PAD)) if (rxwi->rxinfo & cpu_to_le32(MT_RXINFO_L2PAD))
mt76x2_remove_hdr_pad(skb); mt76x2_remove_hdr_pad(skb);
......
...@@ -273,6 +273,7 @@ mt76x2_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -273,6 +273,7 @@ mt76x2_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
goto out; goto out;
} }
msta->wcid.sta = 1;
msta->wcid.idx = idx; msta->wcid.idx = idx;
msta->wcid.hw_key_idx = -1; msta->wcid.hw_key_idx = -1;
mt76x2_mac_wcid_setup(dev, idx, mvif->idx, sta->addr); mt76x2_mac_wcid_setup(dev, idx, mvif->idx, sta->addr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment