Commit bfc394dd authored by Felix Fietkau's avatar Felix Fietkau

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: default avatarFelix Fietkau <nbd@nbd.name>
parent ac24dd35
...@@ -564,8 +564,12 @@ void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid, ...@@ -564,8 +564,12 @@ void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid,
} }
EXPORT_SYMBOL(mt76_wcid_key_setup); 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 ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
struct mt76_rx_status mstat; struct mt76_rx_status mstat;
...@@ -590,7 +594,8 @@ static struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb) ...@@ -590,7 +594,8 @@ static struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb)
memcpy(status->chain_signal, mstat.chain_signal, memcpy(status->chain_signal, mstat.chain_signal,
sizeof(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 static int
...@@ -716,12 +721,14 @@ mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb) ...@@ -716,12 +721,14 @@ mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb)
struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
struct ieee80211_sta *sta; struct ieee80211_sta *sta;
struct ieee80211_hw *hw;
struct mt76_wcid *wcid = status->wcid; struct mt76_wcid *wcid = status->wcid;
bool ps; bool ps;
int i; int i;
hw = mt76_phy_hw(dev, status->ext_phy);
if (ieee80211_is_pspoll(hdr->frame_control) && !wcid) { 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) if (sta)
wcid = status->wcid = (struct mt76_wcid *)sta->drv_priv; wcid = status->wcid = (struct mt76_wcid *)sta->drv_priv;
} }
...@@ -779,7 +786,7 @@ mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb) ...@@ -779,7 +786,7 @@ mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb)
mtxq = (struct mt76_txq *)sta->txq[i]->drv_priv; mtxq = (struct mt76_txq *)sta->txq[i]->drv_priv;
if (!skb_queue_empty(&mtxq->retry_q)) if (!skb_queue_empty(&mtxq->retry_q))
ieee80211_schedule_txq(dev->hw, sta->txq[i]); ieee80211_schedule_txq(hw, sta->txq[i]);
} }
} }
...@@ -787,6 +794,7 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, ...@@ -787,6 +794,7 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
struct napi_struct *napi) struct napi_struct *napi)
{ {
struct ieee80211_sta *sta; struct ieee80211_sta *sta;
struct ieee80211_hw *hw;
struct sk_buff *skb; struct sk_buff *skb;
spin_lock(&dev->rx_lock); spin_lock(&dev->rx_lock);
...@@ -796,8 +804,8 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, ...@@ -796,8 +804,8 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
continue; continue;
} }
sta = mt76_rx_convert(skb); mt76_rx_convert(dev, skb, &hw, &sta);
ieee80211_rx_napi(dev->hw, sta, skb, napi); ieee80211_rx_napi(hw, sta, skb, napi);
} }
spin_unlock(&dev->rx_lock); spin_unlock(&dev->rx_lock);
} }
......
...@@ -433,6 +433,7 @@ struct mt76_rx_status { ...@@ -433,6 +433,7 @@ struct mt76_rx_status {
u8 iv[6]; u8 iv[6];
u8 ext_phy:1;
u8 aggr:1; u8 aggr:1;
u8 tid; u8 tid;
u16 seqno; u16 seqno;
...@@ -457,6 +458,8 @@ struct mt76_phy { ...@@ -457,6 +458,8 @@ struct mt76_phy {
struct mt76_dev { struct mt76_dev {
struct mt76_phy phy; /* must be first */ struct mt76_phy phy; /* must be first */
struct mt76_phy *phy2;
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
struct cfg80211_chan_def chandef; struct cfg80211_chan_def chandef;
struct ieee80211_channel *main_chan; struct ieee80211_channel *main_chan;
...@@ -640,6 +643,14 @@ void mt76_seq_puts_array(struct seq_file *file, const char *str, ...@@ -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); int mt76_eeprom_init(struct mt76_dev *dev, int len);
void mt76_eeprom_override(struct mt76_dev *dev); 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 * static inline u8 *
mt76_get_txwi_ptr(struct mt76_dev *dev, struct mt76_txwi_cache *t) mt76_get_txwi_ptr(struct mt76_dev *dev, struct mt76_txwi_cache *t)
{ {
......
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