mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
mt76: add support for an extra wiphy in the rx path
This is preparation for supporting multiple wiphys per device to support the concurrent dual-band feature of MT7615D Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
+14
-6
@@ -563,8 +563,12 @@ void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid,
|
||||
}
|
||||
EXPORT_SYMBOL(mt76_wcid_key_setup);
|
||||
|
||||
static struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb)
|
||||
static void
|
||||
mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
struct ieee80211_hw **hw,
|
||||
struct ieee80211_sta **sta)
|
||||
{
|
||||
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
struct mt76_rx_status mstat;
|
||||
|
||||
@@ -589,7 +593,8 @@ static struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb)
|
||||
memcpy(status->chain_signal, mstat.chain_signal,
|
||||
sizeof(mstat.chain_signal));
|
||||
|
||||
return wcid_to_sta(mstat.wcid);
|
||||
*sta = wcid_to_sta(mstat.wcid);
|
||||
*hw = mt76_phy_hw(dev, mstat.ext_phy);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -715,12 +720,14 @@ mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb)
|
||||
struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
struct ieee80211_sta *sta;
|
||||
struct ieee80211_hw *hw;
|
||||
struct mt76_wcid *wcid = status->wcid;
|
||||
bool ps;
|
||||
int i;
|
||||
|
||||
hw = mt76_phy_hw(dev, status->ext_phy);
|
||||
if (ieee80211_is_pspoll(hdr->frame_control) && !wcid) {
|
||||
sta = ieee80211_find_sta_by_ifaddr(dev->hw, hdr->addr2, NULL);
|
||||
sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr2, NULL);
|
||||
if (sta)
|
||||
wcid = status->wcid = (struct mt76_wcid *)sta->drv_priv;
|
||||
}
|
||||
@@ -778,7 +785,7 @@ mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb)
|
||||
|
||||
mtxq = (struct mt76_txq *)sta->txq[i]->drv_priv;
|
||||
if (!skb_queue_empty(&mtxq->retry_q))
|
||||
ieee80211_schedule_txq(dev->hw, sta->txq[i]);
|
||||
ieee80211_schedule_txq(hw, sta->txq[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -786,6 +793,7 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
|
||||
struct napi_struct *napi)
|
||||
{
|
||||
struct ieee80211_sta *sta;
|
||||
struct ieee80211_hw *hw;
|
||||
struct sk_buff *skb;
|
||||
|
||||
spin_lock(&dev->rx_lock);
|
||||
@@ -795,8 +803,8 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
|
||||
continue;
|
||||
}
|
||||
|
||||
sta = mt76_rx_convert(skb);
|
||||
ieee80211_rx_napi(dev->hw, sta, skb, napi);
|
||||
mt76_rx_convert(dev, skb, &hw, &sta);
|
||||
ieee80211_rx_napi(hw, sta, skb, napi);
|
||||
}
|
||||
spin_unlock(&dev->rx_lock);
|
||||
}
|
||||
|
||||
@@ -433,6 +433,7 @@ struct mt76_rx_status {
|
||||
|
||||
u8 iv[6];
|
||||
|
||||
u8 ext_phy:1;
|
||||
u8 aggr:1;
|
||||
u8 tid;
|
||||
u16 seqno;
|
||||
@@ -457,6 +458,8 @@ struct mt76_phy {
|
||||
struct mt76_dev {
|
||||
struct mt76_phy phy; /* must be first */
|
||||
|
||||
struct mt76_phy *phy2;
|
||||
|
||||
struct ieee80211_hw *hw;
|
||||
struct cfg80211_chan_def chandef;
|
||||
struct ieee80211_channel *main_chan;
|
||||
@@ -640,6 +643,14 @@ void mt76_seq_puts_array(struct seq_file *file, const char *str,
|
||||
int mt76_eeprom_init(struct mt76_dev *dev, int len);
|
||||
void mt76_eeprom_override(struct mt76_dev *dev);
|
||||
|
||||
static inline struct ieee80211_hw *
|
||||
mt76_phy_hw(struct mt76_dev *dev, bool phy_ext)
|
||||
{
|
||||
if (phy_ext && dev->phy2)
|
||||
return dev->phy2->hw;
|
||||
return dev->phy.hw;
|
||||
}
|
||||
|
||||
static inline u8 *
|
||||
mt76_get_txwi_ptr(struct mt76_dev *dev, struct mt76_txwi_cache *t)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user